【问题标题】:What is the Best way to creat multiple object Autocad?创建多对象 Autocad 的最佳方法是什么?
【发布时间】:2020-05-28 17:04:13
【问题描述】:

我正在学习 ObjectArx,据我所知,在 Arx 中创建对象的常用方法有 3 种:

  • 使用 acdbEntMake
  • 使用record.append(实体)
  • 结合使用 record.append 和 transaction

所以,我的问题是: 当我应该在每种情况下使用它们时,有人可以帮助我吗? 它们之间的性能差异很大吗?

与以下两种方法相比,当对象数量较多时,我会犹豫使用 acdbentmake,因为我看到很少有提到它的示例。

【问题讨论】:

    标签: visual-c++ autocad objectarx


    【解决方案1】:

    我不知道您正在创建什么样的实体,但是:

    在大多数情况下,您不需要使用 acdbEntMake。我使用 ObjectARX 大约有 8 年了,从未使用过它;)

    在 .Net 版本的 ObjectARX 中使用了事务,但您标记了 visual-c++,所以我想不是这种情况。

    如果您担心绘制大量实体,只需对其进行测试。以你知道和衡量所需时间的方式画图。只要您和您的客户接受绘图时间,您使用的方式就可以了。将来,如果需要,您始终可以重构代码以获得更好的性能。

    创建示例行您可以使用此示例:

    Acad::ErrorStatus AddLine(const AcGePoint3d SP , const AcGePoint3d EP , AcDbObjectId& id , AcDbObjectId Block )
    {
        AcDbLine* Line = new AcDbLine();
        Line->setStartPoint(SP);
        Line->setEndPoint(EP);
        Acad::ErrorStatus es = Add( Line , Block ); 
        if (es  != Acad::eOk)   {   return es ;}
    
        es = Line->close();
        id = Line->objectId();
    
        return es ;
    }
    
    
    Acad::ErrorStatus Add( AcDbEntity * pEnt, AcDbObjectId parent)
    {
        if ( !pEnt ) {
            return  Acad::eNullEntityPointer ;
        }
        Acad::ErrorStatus es;
        if (parent.isNull())    {
            parent = getActiveSpace()->objectId();
        }
        AcDbObject* pObj = NULL;    
        es = acdbOpenObject(pObj, parent , AcDb::kForWrite) ;
        if (es != Acad::eOk) {
            return es;
        }
    
        if (!pObj->isKindOf(AcDbBlockTableRecord::desc())) {
            pObj->close();
            return Acad::eWrongObjectType;
        }
    
        AcDbBlockTableRecord* Blok = AcDbBlockTableRecord::cast(pObj);
        if ((es = Blok->appendAcDbEntity(pEnt)) != Acad::eOk )  
        {
            Blok->close();
            return es;
        }
        Blok->close();
        return Acad::eOk;
    
    }
    
    AcDbBlockTableRecord* getActiveSpace()
    {
        AcDbBlockTableRecord* pOutVal = NULL;
        AcDbDatabase * pDb = acdbHostApplicationServices()->workingDatabase();
    
        if (!pDb) return NULL;
        AcDbObjectId ActiveStpaceId = pDb->currentSpaceId();
        AcDbObject* pObj = NULL;
        Acad::ErrorStatus es;
    
        es = acdbOpenObject(pObj, ActiveStpaceId , AcDb::kForRead);
        if( es == Acad::eOk)
        {
            pOutVal = AcDbBlockTableRecord::cast(pObj);
            es = pObj->close();
        }
    
        return pOutVal;
    }
    

    【讨论】:

    • 嗨,因为最近我看到一些使用事务 (c++) 编写 dwg 的案例,从 Autodesk 论坛的一些帖子中创建对象(圆、块等),这对于像这样的新手来说很困惑我。谢谢回复!我会进一步了解它
    • 事实上我正在使用 ZWCAD,它可能与 AutoCAD 有点不同,所以也许在 AutoCAD C++ 中你也有交易。顺便问一下,你为什么选择 C++?
    • 是的,我之前研究过lisp和vba,最近研究了.net,对它着迷。但我是一个速度爱好者,所以我想尝试 c++ 并切换到 arx。 lisp 和 arx 有很多相似之处,我真的很喜欢。尽管与其 cad 版本的兼容性很弱。无论如何,我不是开发人员,我只是想将工作自动化一点。 ;))
    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多