Visual c++ 创建多对象Autocad的最佳方法是什么?

Visual c++ 创建多对象Autocad的最佳方法是什么?,visual-c++,autocad,objectarx,Visual C++,Autocad,Objectarx,我正在学习ObjectArx,据我所知,在Arx中创建对象有3种常见方法: 使用acdbEntMake 使用record.append(实体) 使用record.append和transaction的组合 因此,我的问题是: 有人能帮我在每种情况下使用它们吗? 他们之间的表现有很大差异吗 与以下两种方法相比,当对象数量较大时,我不太愿意使用acdbentmake,因为我很少看到提及它的示例。我不知道您正在创建什么类型的实体,但是: 在大多数情况下,您不需要使用acdbEntMake。我从8年

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

  • 使用acdbEntMake
  • 使用record.append(实体)
  • 使用record.append和transaction的组合
因此,我的问题是: 有人能帮我在每种情况下使用它们吗? 他们之间的表现有很大差异吗


与以下两种方法相比,当对象数量较大时,我不太愿意使用acdbentmake,因为我很少看到提及它的示例。

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

在大多数情况下,您不需要使用
acdbEntMake
。我从8年前开始使用ObjectARX,但从未使用过;)

事务在.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;
}

您好,因为最近我看到一些案例使用transaction(c++)从autodesk论坛的某篇文章中编写dwg、创建对象(圆、块等),这让像我这样的新手感到困惑。谢谢你的回复!我将了解更多关于它实际上我正在与ZWCAD工作,可能有点不同,然后AutoCAD,所以也许在AutoCAD C++中你也有事务。顺便问一下,为什么选择C++?是的,我以前学习过LISP和VBA,最近我研究了.NET并被它迷住了。但我是一个速度爱好者,所以我想尝试C++和切换到ARX。lisp和arx有很多相似之处,我非常喜欢。尽管与cad版本的兼容性相当弱。无论如何,我不是一个开发人员,我只是想自动化一点工作。;)