AutoCAD C ++ Когда AcDbEntity нужно открыть для чтения?

Я не уверен, когда открытые объекты для чтения необходимы, и когда это может быть опущено.
Например, я знаю, что мне не нужно открывать сущность, когда я хочу использовать 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);

2

Решение

Я бы посоветовал сначала использовать соответствующий доступ на чтение для вашего объекта. Таким образом, вы гарантированно узнаете, можете ли вы только прочитать объект или также написать объекту.

Таким образом, вы контролируете. Если вы просто продолжите и используете сущность, которую вы не можете знать в базовой библиотеке, это изменит поведение по умолчанию.

Извините, если это не ответит на ваш вопрос.

1

Другие решения

Я посмотрел в документации, и я не вижу ничего, что указывает на возможность использовать методы для закрытого объекта. Я предполагаю, что предполагается, что для работы с любыми реальными данными AutoCAD требуется, чтобы объект был открыт, по крайней мере, для чтения.

В этом случае есть два способа улучшить ваш пример.

Первый вариант: сделать работу до закрытия объекта. Это сохраняет код открытия / закрытия вместе с работой, выполняемой в середине. Это хорошо, что должно быть ясно, когда объект открыт и с ним можно работать, и что объект не остается открытым. Это также соответствует рекомендации в документации не держать объект открытым дольше, чем необходимо.

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();
}
}

Второй вариант: закрывать объект только после выполнения работы и только в том случае, если объект имеет правильный тип. Это позволяет нелокально использовать открытый объект, но вы должны убедиться, что закрыли его позже!

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();
}
1

По вопросам рекламы [email protected]