2016-10-25 3 views
2

오픈 엔티티를 읽을 때 필요하고 생략 할 수 있는지 확실하지 않습니다. 예를 들어 objectId()을 사용하려고 할 때 엔티티를 열 필요가 없다는 것을 알고 있지만 엔티티를 열기 전에 필요한 몇 가지 방법이 있습니다. getArcSegAt() 전에 AcDbPolyline을 열어야할지 모르겠습니다. 많은 경우에 나는 그것이 열려 있기 전에 나는 원하는 것을 얻을 수있는 방법을 사용하기 위해 간단하게해볼 수 있습니다. 하지만 어쩌면 쉬운 규칙이 있을까요?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(); 을 폐쇄 :

es = acdbOpenObject(_pPoly, id, AcDb::kForRead); 
:

AcGePoint3d Px = initializedSomehow(); 
double distAtPx = 0; 
_pPoly->getDistAtPoint(Px , distAtPx); 

내가해야합니까

이전 :

_pPoly->getDistAtPoint(Px , distAtPx); 
+0

"열기 전에 사용"이 무슨 뜻인지 확실하지 않습니다 ... C++ 포인터를 인스턴스화하기 위해 ID로 open을 호출해야합니다. 그러면 엔티티를 여는 것입니다. 나는 정말로 필요하지 않는 한 (더 많은 자원을 소비하므로) 쓰기를 위해 공개하지 않기를 제안합니다. –

+0

해당 DB 상주 개체를 열지 않고 어디에서 AcDbPolyline *을 얻었습니까? –

답변

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

관련 문제