2016-10-25 4 views
2

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); 
+0

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). –

+0

Bitte geben Sie ein Beispiel, woher Sie AcDbPolyline * erhalten haben, ohne die entsprechende DB-residente Entität zu öffnen? –

Antwort

1

Ich würde es empfehlen, den entsprechenden Lesezugriff auf Ihr Objekt zuerst zu verwenden. So wissen Sie garantiert, ob Sie nur die Entity lesen oder auch an die Entity schreiben können.

Auf diese Weise haben Sie die Kontrolle. Wenn Sie einfach die Entität verwenden, die Sie in der zugrunde liegenden Bibliothek nicht kennen, ändert sich das Standardverhalten.

Entschuldigung, wenn dies Ihre Frage nicht beantwortet.

1

Ich habe in der Dokumentation nachgeschaut und sehe nichts, was darauf hindeutet, Methoden für ein geschlossenes Objekt verwenden zu können. Ich gehe davon aus, dass die Annahme, dass für das Arbeiten mit echten AutoCAD-Daten das Objekt mindestens zum Lesen geöffnet sein muss.

In diesem Fall gibt es zwei Möglichkeiten, um Ihr Beispiel zu verbessern.

Erste Option: Machen Sie die Arbeit vor dem Schließen des Objekts. Dies hält den Öffnungs-/Schließungscode zusammen mit der Arbeit, die in der Mitte ausgeführt wird. Das ist schön, dass es klar sein sollte, wenn das Objekt geöffnet ist und damit gearbeitet werden kann und das Objekt nicht offen gelassen wird. Dies entspricht auch der Empfehlung in der Dokumentation, das Objekt nicht länger als nötig offen zu halten.

Zweite Option: Schließen Sie das Objekt erst nach der Arbeit und nur dann, wenn das Objekt der richtige Typ ist. Dies ermöglicht eine nicht-lokale Verwendung des geöffneten Objekts, aber Sie müssen sicherstellen, dass Sie es später schließen!

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

Der erste Weg ist die Art, wie ich benutze. Aber es gibt einige Methoden, die keine Entity öffnen müssen, wie objectId oder isKindof, also frage ich mich, was nicht noch zu öffnen ist –

+0

Ihr Beispiel oben schließt dann das Objekt später. Mein erstes Beispiel zeigt, wie man vor dem Schließen des Objekts arbeitet. Mein zweites Beispiel funktioniert wie Ihr Beispiel, aber das Objekt bleibt offen, bis es später verwendet wird.Ich weiß nicht, ob irgendeine Dokumentation es zeigt, aber ich würde denken, dass Sie das Objekt für die meisten Operationen öffnen müssen. – crashmstr

Verwandte Themen