从C在AutoCAD中绘制圆

从C在AutoCAD中绘制圆,c,autocad,C,Autocad,我试图在已经运行的AutoCAD实例中绘制圆环,将其附加到现有图形中 可能吗?最简单的方法是什么 Thx在C中找不到任何东西,但下面是一个C的示例: 在纯C语言中,它可能很复杂,所以祝你好运。 但是如果你使用C++和ARX试试这个: Acad::ErrorStatus AddCircle(AcGePoint3d center , double r , AcDbObjectId& id , AcDbBlockTableRecord* pBlock) { AcDbCircle* pC

我试图在已经运行的AutoCAD实例中绘制圆环,将其附加到现有图形中

可能吗?最简单的方法是什么


Thx在C中找不到任何东西,但下面是一个C的示例:


在纯C语言中,它可能很复杂,所以祝你好运。 但是如果你使用C++和ARX试试这个:

Acad::ErrorStatus AddCircle(AcGePoint3d center , double r , AcDbObjectId& id , AcDbBlockTableRecord* pBlock)
{
    AcDbCircle* pCirEnt = NULL;
    pCirEnt  = new AcDbCircle();
    pCirEnt->setCenter(center);
    pCirEnt->setRadius(r);
    Acad::ErrorStatus es = Add(pCirEnt , pBlock);
    es = pCirEnt->close();
    id = pCirEnt->objectId();
    return es ;
}


Acad::ErrorStatus Add( AcDbEntity * pEnt, AcDbBlockTableRecord* Blok)
{
    if ( !pEnt )    {       
        return Acad::eNullEntityPointer  ;
    }

    Acad::ErrorStatus es;
    if (!Blok)
    {
        Blok = getModelSpace(AcDb::kForWrite);
        if (!Blok) return Acad::eInvalidOwnerObject;
    }
    if (Blok->isWriteEnabled() == Adesk::kFalse )
    {
        AcDbObject* pObj = NULL;    
        es = acdbOpenObject(pObj,Blok->objectId (),AcDb::kForWrite) ;
        Blok = AcDbBlockTableRecord::cast(pObj);
    }
    if ((es = Blok->appendAcDbEntity(pEnt)) != Acad::eOk )  // eAlreadyInDb = wcześniej wstawione do innego bloku.
    {
        Blok->close();
        return es;
    }
    Blok->close();
    return Acad::eOk;
}

AcDbBlockTableRecord* getModelSpace(AcDb::OpenMode mode)
{
    AcDbBlockTableRecord* Blok = NULL;
    Acad::ErrorStatus es;
    AcDbDatabase * pDb = acdbHostApplicationServices()->workingDatabase();
    if (!pDb) return NULL;
    AcDbBlockTable* pTbl = NULL;
    if ((es= pDb->getBlockTable(pTbl, AcDb::kForRead) ) != Acad::eOk  )
        return NULL;
    if ((es = pTbl->getAt(ACDB_MODEL_SPACE, Blok, mode)) !=  Acad::eOk )
    {
        pTbl->close();
        return NULL;
    }
    pTbl->close();

    return Blok;
}
正如您提到的“一个已经运行的AutoCAD实例”,我假设您希望自动化AutoCAD,通常是通过ActiveX COM自动化。您应该使用AcadApplication接口(并且不能使用AcDb或.NET Mgd引用)

这里是ActiveX C++通用代码示例。请注意acac19enu.tlb参考,其中19表示AutoCAD版本。当前版本为AutoCAD 2017(库版本:21)

#导入“acax19ENU.tlb”无命名空间
#包括
#包括
void fAddAttribute()
{
尝试
{
//从AutoCAD,inc ref count获取ActiveX应用程序对象
IAcadApplicationPtr pAcadApp=acedGetAcadWinApp()->GetIDispatch(TRUE);
//现在获取活动文档
iacadocumentptr pActiveDoc=pAcadApp->ActiveDocument;
IACADBLOCKTR pBlock=NULL;
TCHAR*pBlkName=_T(“某些块名称”);
//创建与activex兼容的插入点3D
AcAxPoint3d-axInsPnt(0,0,0);
//现在添加块名
pBlock=pActiveDoc->Blocks->Add(axInsPnt.asVariantPtr(),_bstr_t(pBlkName));
//现在将属性添加到块中
IAcadAttributePtr-pAttDef;
pAttDef=pBlock->AddAttribute(1.0,(AcAttributeMode)0,
_bstr_t(“键入员工姓名”),axInsPnt.asVariantPtr(),
_bstr_t(“empname”),bstr_t(“empname”);
//添加属性
}
捕获(_com_error&es)
{
acutPrintf(L“\n错误:%s”,es.ErrorMessage());
}
}
Acad::ErrorStatus AddCircle(AcGePoint3d center , double r , AcDbObjectId& id , AcDbBlockTableRecord* pBlock)
{
    AcDbCircle* pCirEnt = NULL;
    pCirEnt  = new AcDbCircle();
    pCirEnt->setCenter(center);
    pCirEnt->setRadius(r);
    Acad::ErrorStatus es = Add(pCirEnt , pBlock);
    es = pCirEnt->close();
    id = pCirEnt->objectId();
    return es ;
}


Acad::ErrorStatus Add( AcDbEntity * pEnt, AcDbBlockTableRecord* Blok)
{
    if ( !pEnt )    {       
        return Acad::eNullEntityPointer  ;
    }

    Acad::ErrorStatus es;
    if (!Blok)
    {
        Blok = getModelSpace(AcDb::kForWrite);
        if (!Blok) return Acad::eInvalidOwnerObject;
    }
    if (Blok->isWriteEnabled() == Adesk::kFalse )
    {
        AcDbObject* pObj = NULL;    
        es = acdbOpenObject(pObj,Blok->objectId (),AcDb::kForWrite) ;
        Blok = AcDbBlockTableRecord::cast(pObj);
    }
    if ((es = Blok->appendAcDbEntity(pEnt)) != Acad::eOk )  // eAlreadyInDb = wcześniej wstawione do innego bloku.
    {
        Blok->close();
        return es;
    }
    Blok->close();
    return Acad::eOk;
}

AcDbBlockTableRecord* getModelSpace(AcDb::OpenMode mode)
{
    AcDbBlockTableRecord* Blok = NULL;
    Acad::ErrorStatus es;
    AcDbDatabase * pDb = acdbHostApplicationServices()->workingDatabase();
    if (!pDb) return NULL;
    AcDbBlockTable* pTbl = NULL;
    if ((es= pDb->getBlockTable(pTbl, AcDb::kForRead) ) != Acad::eOk  )
        return NULL;
    if ((es = pTbl->getAt(ACDB_MODEL_SPACE, Blok, mode)) !=  Acad::eOk )
    {
        pTbl->close();
        return NULL;
    }
    pTbl->close();

    return Blok;
}
#import "acax19ENU.tlb" no_namespace
#include <rxmfcapi.h>
#include <axpnt3d.h>
void fAddAttribute()
{
  try
  {
    // get the ActiveX application object from AutoCAD, inc ref count
    IAcadApplicationPtr pAcadApp = acedGetAcadWinApp()->GetIDispatch(TRUE);
    // now get the active doc
    IAcadDocumentPtr pActiveDoc = pAcadApp->ActiveDocument;
    IAcadBlockPtr pBlock = NULL;
    TCHAR *pBlkName = _T("some_block_name");
    // create an activex compatible insertion point3d
    AcAxPoint3d axInsPnt(0,0,0);
    // now add the block name
    pBlock = pActiveDoc->Blocks->Add(axInsPnt.asVariantPtr(),_bstr_t(pBlkName));
    // now add an Attribute to the block
    IAcadAttributePtr pAttDef;
    pAttDef = pBlock->AddAttribute(1.0, (AcAttributeMode)0 ,
      _bstr_t("Type the employee name"), axInsPnt.asVariantPtr(),
      _bstr_t("empname"),_bstr_t(""));
    //attribute added
  }
  catch(_com_error &es)
  {
    acutPrintf(L"\nError : %s", es.ErrorMessage());
  }
}