2

我不确定何时需要打开实体进行读取,何时可以省略。例如,我知道我在想使用时不需要打开实体,objectId()但是之前有一些方法需要打开实体。不知道有没有必要先AcDbPolylinegetArcSegAt()。在许多情况下,我可以简单地尝试在方法打开之前使用它,我会得到我想要的或不想要的。但也许有一些简单的规则?

例子:

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

now_pPoly已初始化,但由于pEnt->close(); 现在我想关闭它,例如使用:

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

我需要:

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

前:

_pPoly->getDistAtPoint(Px , distAtPx);
4

2 回答 2

1

我认为首先对您的对象使用适当的读取访问权限是一种好习惯。这样你就可以保证知道你是只能读取实体还是写入实体。

这样你就可以控制了。如果您继续使用实体,您无法在底层库中更改它的默认行为。

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

于 2016-11-02T15:59:40.257 回答
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();
}
于 2016-11-02T17:43:04.537 回答