Я не уверен, когда нужны открытые сущности для чтения, и когда это может быть опущено. Например, я знаю, что мне не нужно открывать сущность, когда я хочу использовать objectId()
, но есть некоторые методы, для которых требуется открыть объект раньше. Я не знаю, нужно ли открывать AcDbPolyline
до getArcSegAt()
. Во многих случаях я могу просто попытаться использовать метод до того, как он будет открыт. Я получу то, что хочу, или нет. Но, может быть, для этого есть легкое правило?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();
теперь я хочу, например, использование:
AcGePoint3d Px = initializedSomehow();
double distAtPx = 0;
_pPoly->getDistAtPoint(Px , distAtPx);
мне нужно:
es = acdbOpenObject(_pPoly, id, AcDb::kForRead);
до:
_pPoly->getDistAtPoint(Px , distAtPx);
Непонятно, что вы подразумеваете под «использование перед открытием» ... вам нужно вызвать open с идентификатором, чтобы создать экземпляр указателя C++, поэтому вы открываете объект. Я бы предложил избегать открытых для записи, если это действительно необходимо (поскольку это потребляет больше ресурсов). –
Пожалуйста, укажите пример, где вы получили AcDbPolyline *, не открывая соответствующий резидентный объект DB? –