엔터티의 속성을 변경하고자 할 경우,
엔터티를 AcDb::kForWrite로 열어서 속성을 변경시킵니다.
하지만 막상 도큐먼터를 락걸지 않고 여는 바람에 autocad가 에러를 내며 튕겨버립니다.
이런 현상을 프로그램을 실행시켜보아야만 락을 걸지 않고 열었다는 것을 알게 됩니다.
자주 이런 실수를 되풀이 해서 겪다보니 조그마한 클래스를 하나 만들었습니다.
생성자 인자로 열기 모드를 받아 쓰기모드이면 도큐먼트를 락겁니다.
소멸자에서는 쓰기모드로 연 엔터티일 경우에 락을 해제하고, 엔터티를 닫아 줍니다.
엔터티를 AcDb::kForWrite로 열어서 속성을 변경시킵니다.
하지만 막상 도큐먼터를 락걸지 않고 여는 바람에 autocad가 에러를 내며 튕겨버립니다.
이런 현상을 프로그램을 실행시켜보아야만 락을 걸지 않고 열었다는 것을 알게 됩니다.
자주 이런 실수를 되풀이 해서 겪다보니 조그마한 클래스를 하나 만들었습니다.
생성자 인자로 열기 모드를 받아 쓰기모드이면 도큐먼트를 락겁니다.
소멸자에서는 쓰기모드로 연 엔터티일 경우에 락을 해제하고, 엔터티를 닫아 줍니다.
#ifndef __ACDB_SMART_OBJECT_H__
#define __ACDB_SMART_OBJECT_H__
//////////////////////////////////////////////////////////////////////////
#define USES_OKEYS Acad::ErrorStatus __es
#define ARXOK(what) if ( (__es =(what)) != Acad::eOk ) throw acadErrorStatusText (__es)
#define ARXNULL(what) if ( (what) == NULL ) throw ""
#define ARXCLOSE(what) if ( what != NULL && what->objectId () != AcDbObjectId::kNull ) { what->close () ; }\
else if ( what != NULL ) { delete what ; what =NULL ; }
#define ARXERROR(msg) acutPrintf("%s/%d : %s\n",__FILE__,__LINE__,msg);
template<class T>
class AcDbSmartObject
{
public:
explicit AcDbSmartObject(const AcDbObjectId& id , const AcDb::OpenMode& mode) : m_mode(mode)
{
try
{
USES_OKEYS;
if(AcDb::kForWrite == mode) acDocManager->lockDocument(curDoc());
ARXOK(acdbOpenObject(pointee , id , mode));
}
catch(const char* es)
{
ARXERROR(es);
}
catch(...)
{
ARXERROR("unknown error");
}
}
~AcDbSmartObject()
{
try
{
Close();
}
catch(const char* es)
{
ARXERROR(es);
}
catch(...)
{
}
}
T& operator*() const {return *pointee;}
T* operator->() const{return pointee;}
T* get() const {return pointee;}
void Close()
{
try
{
ARXCLOSE(pointee);
if(AcDb::kForWrite == m_mode) acDocManager->unlockDocument(curDoc());
}
catch(const char* es)
{
ARXERROR(es);
}
catch(...)
{
}
}
private:
template<class U>
AcDbSmartObject(AcDbSmartObject<U> &rhs){} /// prevent to copy!!!
private:
AcDb::OpenMode m_mode;
T* pointee;
};
#endif
댓글
댓글 쓰기