2016-10-25 4 views
2

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

Непонятно, что вы подразумеваете под «использование перед открытием» ... вам нужно вызвать open с идентификатором, чтобы создать экземпляр указателя C++, поэтому вы открываете объект. Я бы предложил избегать открытых для записи, если это действительно необходимо (поскольку это потребляет больше ресурсов). –

+0

Пожалуйста, укажите пример, где вы получили AcDbPolyline *, не открывая соответствующий резидентный объект DB? –

ответ

1

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

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

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

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

Первый способ - это то, как я использую. Но есть некоторые методы, которые не нужно открывать сущность, например objectId или isKindof, поэтому я задаюсь вопросом, что еще не нужно открывать. –

+0

Ваш пример выше закрывается, а затем использует объект позже. В моем первом примере показано выполнение работы перед закрытием объекта. Мой второй пример работает как ваш пример, но сохраняет объект открытым до тех пор, пока он не будет использован позже.Я не знаю, показывает ли какая-либо документация, но я думаю, вам нужно, чтобы объект был открыт для большинства операций. – crashmstr

 Смежные вопросы

  • Нет связанных вопросов^_^