Ich bin mir nicht sicher, ob offene Entitäten zum Lesen notwendig sind, und wann es weggelassen werden kann. Zum Beispiel weiß ich, dass ich Entity nicht öffnen muss, wenn ich objectId()
verwenden möchte, aber es gibt einige Methoden, die Entität vorher öffnen müssen. Ich weiß nicht, ob es notwendig ist, AcDbPolyline
vor getArcSegAt()
zu öffnen. In vielen Fällen kann ich einfach versuchen, die Methode zu benutzen, bevor sie geöffnet ist. Ich werde bekommen, was ich will oder nicht. Aber vielleicht gibt es dafür eine einfache Regel?AutoCAD C++ Wenn AcDbEntity zum Lesen geöffnet werden muss?
Beispiel:
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();
}
}
jetzt _pPoly
ist initiallized, aber es ist geschlossen wegen pEnt->close();
jetzt will ich zum Beispiel Verwendung:
AcGePoint3d Px = initializedSomehow();
double distAtPx = 0;
_pPoly->getDistAtPoint(Px , distAtPx);
muss ich:
es = acdbOpenObject(_pPoly, id, AcDb::kForRead);
vorher:
_pPoly->getDistAtPoint(Px , distAtPx);
Es ist nicht klar, was Sie mit "vor dem Öffnen verwenden" meinen ... Sie müssen öffnen mit der ID öffnen, um den C++ - Zeiger zu instanziieren, so dass Sie die Entität öffnen. Ich würde vorschlagen, zu vermeiden, offen zu schreiben, es sei denn, wirklich benötigt (da dies mehr Ressourcen verbrauchen). –
Bitte geben Sie ein Beispiel, woher Sie AcDbPolyline * erhalten haben, ohne die entsprechende DB-residente Entität zu öffnen? –