2016-10-25 7 views
2

オープンエンティティがいつ読み込みが必要なのか、省略可能なのか分かりません。 たとえば、objectId()を使用したいときにエンティティを開く必要はありませんが、以前にエンティティを開く必要があるいくつかの方法があります。 getArcSegAt()の前にAcDbPolylineを開く必要があるかどうかわかりません。多くの場合、私はそれが開かれる前に簡単にメソッドを使用しようとすることができます私は私が欲しいものを得るかどうかを取得します。しかし、おそらくそれのためのいくつかの簡単なルールがありますか?AutoCAD C++ AcDbEntityを読み込み用に開く必要がある場合は、

例:

AcDbObjectId id = somethingNotImportant(); 
AcDbPolyline* _pPoly = NULL; 
if (id.isValid()) 
{ 
    AcDbEntity* pEnt = NULL; 
    Acad::ErrorStatus es; 
    es = acdbOpenObject(pEnt, id, AcDb::kForRead); 
    if(es == Acad::eOk) 
    { 
     if(pEnt->isKindOf(AcDbPolyline::desc())) 
     { 
      this->_pPoly = AcDbPolyline::cast(pEnt); 
     } 
     es = pEnt->close(); 
    } 
} 

は今_pPolyがinitiallizedされるが、それは私が例で使用するために必要になりましたので、のpEnt->close(); を閉じている:

es = acdbOpenObject(_pPoly, id, AcDb::kForRead); 

AcGePoint3d Px = initializedSomehow(); 
double distAtPx = 0; 
_pPoly->getDistAtPoint(Px , distAtPx); 

は私がする必要がありますか

前:

_pPoly->getDistAtPoint(Px , distAtPx); 
+0

"開封前に使用する"という意味ははっきりしていません... C++ポインタをインスタンス化するためにIDでopenを呼び出す必要があるため、エンティティを開きます。私は本当に必要な場合を除いて(これはより多くのリソースを消費するので)書き込みを避けることを提案します。 –

+0

対応するDB常駐エンティティを開かずにAcDbPolyline *を取得した例を挙げてください。 –

答えて

1

まず、オブジェクトに対して適切な読み取りアクセスを使用することをお勧めします。そうすれば、エンティティだけを読むことができるのか、エンティティに書き込むことができるのかを確実に知ることができます。

あなたがコントロールするこの方法。基本ライブラリの変更が分からないエンティティを使用するだけであれば、デフォルトの動作になります。

ご質問にはお答えできません。

1

私はドキュメントを調べましたが、閉じたオブジェクトでメソッドを使用できることを示すものは何も表示されません。実際のAutoCADデータを使用するには、オブジェクトを少なくとも読書用に開いておく必要があるという前提があります。

この場合、あなたの例を改善する2つの方法があります。

最初のオプション:オブジェクトを閉じる前に作業を行います。これにより、開いている/閉じているコードが、作業が途中で完了した状態に保たれます。これは、オブジェクトが開いていて作業が可能で、オブジェクトが開いたままになっていないことが明らかなはずです。これは、必要以上にオブジェクトを開いたままにしないようにドキュメントの推奨事項にも合致しています。

AcGePoint3d Px = initializedSomehow(); 
double distAtPx = 0; 
AcDbObjectId id = somethingNotImportant(); 
if (id.isValid()) 
{ 
    AcDbEntity* pEnt = NULL; 
    Acad::ErrorStatus es; 
    es = acdbOpenObject(pEnt, id, AcDb::kForRead); 
    if(es == Acad::eOk) 
    { 
     if(pEnt->isKindOf(AcDbPolyline::desc())) 
     { 
      AcDbPolyline*_pPoly = AcDbPolyline::cast(pEnt); 
      //Do work with poly here 
      _pPoly->getDistAtPoint(Px , distAtPx); 
     } 
     es = pEnt->close(); 
    } 
} 

第2のオプション:作業を行った後でのみ、オブジェクトが正しいタイプである場合のみ、オブジェクトを閉じます。これにより、開かれたオブジェクトのローカルでない使用が可能になりますが、後で閉じてください。

AcDbObjectId id = somethingNotImportant(); 
AcDbPolyline* _pPoly = NULL; 
if (id.isValid()) 
{ 
    AcDbEntity* pEnt = NULL; 
    Acad::ErrorStatus es; 
    es = acdbOpenObject(pEnt, id, AcDb::kForRead); 
    if(es == Acad::eOk) 
    { 
     if(pEnt->isKindOf(AcDbPolyline::desc())) 
     { 
      _pPoly = AcDbPolyline::cast(pEnt); 
     } 
     else 
      es = pEnt->close(); //not polyline, close now 
    } 
} 
AcGePoint3d Px = initializedSomehow(); 
double distAtPx = 0; 
if (_pPoly) 
{ 
    //Do work with poly here 
    _pPoly->getDistAtPoint(Px , distAtPx); 
    _pPoly->close(); 
} 
+0

最初の方法は、私が使用する方法です。しかし、objectIdやisKindofのようなエンティティを開く必要のないメソッドがいくつかありますので、開く必要のないものがありますか? –

+0

上記のあなたの例では、後でオブジェクトを使用します。私の最初の例は、オブジェクトを閉じる前に作業をしていることを示しています。私の2番目の例はあなたの例のように動作しますが、後で使用されるまでオブジェクトを開いたままにします。私はドキュメントがそれを示しているかどうかは分かりませんが、ほとんどの操作でオブジェクトを開く必要があると思います。 – crashmstr

関連する問題