AutoCAD c++时需要打开AcDbEntity进行读取
AutoCAD C++ When AcDbEntity need to open for read?
我不确定什么时候需要打开实体进行读取,什么时候可以省略。例如,当我想使用objectId()
时,我知道我不需要打开实体,但是之前有一些方法需要打开实体。我不知道是否有必要在getArcSegAt()
之前打开AcDbPolyline
。在很多情况下,我可以简单地尝试使用方法之前,我将得到我想要的或不。但也许有一些简单的规则?
的例子:
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);
我认为首先在对象上使用适当的读访问是很好的做法。这样,您就可以保证知道您是只能读取实体还是也可以写入实体。
这样你就可以控制了。如果你只是继续使用实体,你没有办法知道底层库改变了它的默认行为。
对不起,如果这没有回答你的问题。
我已经查看了文档,我没有看到任何关于能够在封闭对象上使用方法的指示。我期望的假设是,要处理任何真实的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();
}
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 独立读取-修改-写入顺序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- AutoCAD c++时需要打开AcDbEntity进行读取