cad二次开发 db的架构

db的层架:
AcDbDatabase(获得块表pOutDatabase->getBlockTable(pBlockTable, AcDb::kForRead);)
AcDbBlockTable(块表下可能有块记录或者其他的实体 通过这个遍历块表:AcDbBlockTableIterator *pIterator = NULL;)
AcDbBlockTableRecord(块记录可以是内部块或者外部块(pRecord->isFromExternalReference()) 块记录下面可能有块引用(外部块引用、内部块引用)或者其它的实体 通过这个遍历 AcDbBlockTableRecordIterator *pIterator = NULL;)

 


    // 生成内部块引用
    AcadEntityTool::BuildBlockReference(crossSectionSymbol, strBlockFile, L"剖切符号", pDb);

// 生成外部块引用

AcadEntityTool::BuildXRefDefBlockReference(this, strFilePath, strBlockName, pDb);


// db下有块表=》块表(AcDbBlockTable)下有多张块表记录=》遍历块表记录(AcDbBlockTableRecord)可以拿到所有的实体(pIter->getEntity(pEntity, AcDb::kForWrite);)
// 块表记录可以是内部块也可以是外部块
    AcDbObjectId tableId = NULL;
    AcDbBlockTable *pTable = NULL;
    Acad::ErrorStatus es = pDb->getBlockTable(pTable, AcDb::kForRead);
    if (Acad::eOk != es || pTable == NULL)
        return NULL;

    AcDbBlockTableRecord* pBlock = NULL;
    pTable->getAt(_arrTablesInfo[flag].strBlockName, pBlock, kForWrite);
    tableId = AcDbObjectId(pBlock->id());
    pBlock->close();
    pTable->close();;
    return tableId;


// 删除dwg图纸快表记录的所有内容
    AcDbBlockTableRecordIterator* pIter = NULL;
    pBlock->newIterator(pIter);
    while (!pIter->done())
    {
        AcDbEntity* pEntity = NULL;
        pIter->getEntity(pEntity, AcDb::kForWrite);
        if (NULL == pEntity)
        {
            pIter->step();
            continue;
        }

        pEntity->erase();
        pEntity->close();
        pIter->step();
    }
    delete pIter;
    pBlock->close();

 


    AcStringArray attachBlks;            // 需要Bind的外部块参照
    AcStringArray detachBlks;            // 需要拆离的外部参照数组
    AcDbBlockTable *pBlockTable = NULL;

    // 获得图例目录
    CString strDbFileDir = pInDatabase->originalFileName();
    strDbFileDir = CFileToolkit::GetFileDirectory(strDbFileDir);

    // 获得块表
    Acad::ErrorStatus es = pOutDatabase->getBlockTable(pBlockTable, AcDb::kForRead);
    if (Acad::eOk != es || pBlockTable == NULL)
        return;

    AcDbBlockTableIterator *pIterator = NULL;
    pBlockTable->newIterator(pIterator);
    pBlockTable->close();

    for (pIterator->start(); !pIterator->done(); pIterator->step())
    {
        AcDbBlockTableRecord *pRecord = NULL;
        es = pIterator->getRecord(pRecord, AcDb::kForWrite);

        if (Acad::eOk != es || pRecord == NULL)
            continue;

        // 处理外部块参照的块定义
        if (pRecord->isFromExternalReference())
        {
            // 则把相对路径转成绝对路径
            const ACHAR *pPath = NULL;
            pRecord->pathName(pPath);
            CString strFullFile;
            LPTSTR lpXrefFile = strFullFile.GetBuffer(MAX_PATH * 2);
            PathCombine(lpXrefFile, strDbFileDir, pPath);
            strFullFile.ReleaseBuffer();
            pRecord->setPathName(strFullFile);

            // 块定义名称
            AcString blockName;
            pRecord->getName(blockName);

            // 应用该块定义的外部块参照id
            AcDbObjectIdArray objectArray;
            pRecord->getBlockReferenceIds(objectArray);

            // 有外部块参照的块定义需要重新加载图纸文件,否则从db中分离丢弃
            if (!objectArray.isEmpty())
                attachBlks.append(blockName);
            else
                detachBlks.append(blockName);
        }

        pRecord->close();
    }

    delete pIterator;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python是一种功能强大的编程语言,可以用于AutoCAD二次开发。以下是一些可用的Python库和示例代码: 1. pyautocad:这是一个Python库,可用于与AutoCAD进行交互。以下是一个简单的示例代码,用于在AutoCAD中创建一个新的直线: ```python import win32com.client acad = win32com.client.Dispatch("AutoCAD.Application") doc = acad.ActiveDocument ms = doc.ModelSpace line1 = ms.AddLine((0, 0), (10, 10)) ``` 2. comtypes:这是一个Python库,可用于与COM对象进行交互。以下是一个示例代码,用于在AutoCAD中创建一个新的直线: ```python import comtypes.client acad = comtypes.client.GetActiveObject("AutoCAD.Application") doc = acad.ActiveDocument ms = doc.ModelSpace line1 = ms.AddLine((0, 0), (10, 10)) ``` 3. IronPython:这是一个Python实现,可用于与.NET框架进行交互。以下是一个示例代码,用于在AutoCAD中创建一个新的直线: ```python import clr clr.AddReference("acmgd") clr.AddReference("acdbmgd") import Autodesk.AutoCAD.ApplicationServices as appSvc import Autodesk.AutoCAD.DatabaseServices as dbSvc import Autodesk.AutoCAD.Geometry as geo doc = appSvc.Application.DocumentManager.MdiActiveDocument db = doc.Database tr = doc.TransactionManager.StartTransaction() ms = dbSvc.SymbolUtilityServices.GetBlockModelSpace(db) line1 = dbSvc.Entity("Line")(geo.Point3d(0, 0, 0), geo.Point3d(10, 10, 0)) ms.AppendEntity(line1) tr.AddNewlyCreatedDBObject(line1, True) tr.Commit() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚坏叔叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值