2

読み取り用にエンティティを開く必要がある場合と、省略できる場合があるかどうかはわかりません。たとえば、使用したいときにエンティティを開く必要がないことはわかっていますobjectId()が、前にエンティティを開く必要があるメソッドがいくつかあります。AcDbPolyline前に開く必要があるかどうかはわかりませんgetArcSegAt()。多くの場合、メソッドを開く前に簡単に使用してみることができます。必要なものを取得するかどうかはわかりません。しかし、おそらくそれには簡単なルールがありますか?

例:

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は初期化されていますがpEnt->close(); 、たとえば次のように使用したいため、閉じられています。

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

する必要がありますか :

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

前:

_pPoly->getDistAtPoint(Px , distAtPx);
4

2 に答える 2

1

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

このようにして、あなたはコントロールしています。先に進んで、基礎となるライブラリの変更を知る方法がないエンティティを使用すると、それがデフォルトの動作になります。

これがあなたの質問に答えていない場合は申し訳ありません。

于 2016-11-02T15:59:40.257 に答える
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();
}
于 2016-11-02T17:43:04.537 に答える