AutoCAD C ++当AcDbEntity需要打开才能读取?

时间:2016-10-25 10:21:14

标签: c++ autocad autocad-plugin objectarx

我不确定何时需要打开实体进行读取,何时可以省略。 例如,我知道当我想使用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 个答案:

答案 0 :(得分:1)

我认为首先在对象上使用适当的读访问权是一种好习惯。这样您就可以确定您是否只能读取实体或写入实体。

这样你就掌握了。如果你只是继续使用你在底层库中无法知道的实体,就会改变它的默认行为。

很抱歉,如果这不能回答你的问题。

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