转载:https://blog.csdn.net/mary288267/article/details/118903501
最近遇到一个任务:提示用户选择一个动态块参照,然后复制这个块参照后提示用户插入到令一个地方。最开始,我将动态块参照复制到内存,然后插入到CAD图形数据库,发现动态属性都丢失了;后来,将块参照的blockTableRecord的ID找到,利用这个ID将块参照插入图形中,动态属性依然丢失。
后经反复验证,发现:
方法AcDbBlockReference::blockTableRecord返回的ID并不是动态块参照块定义的ID,只是图形中显示实体的块定义的ID;
方法AcDbDynBlockReference::dynamicBlockTableRecord()返回的才是动态块定义的ID。
最终效果如下:
代码实现
以下代码仅仅是插入了一个自定义属性为初始状态的动态块参照,如果需要修改动态块参照的自定义属性,可以通过AcDbDynBlockReference 类中的AcDbDynBlockReference::getBlockProperties获取相关属性,然后再利用自定义属性的方法对属性进行设置。
————————————————
void CopyDynBlockRef() { //提示用户选择一个动态块 struct resbuf * rb = acutBuildList(RTDXF0, _T("INSERT"), RTNONE); ads_name ss; CString arPrompt[2] = { _T("\n请选择一个块参照对象"),_T("\n删除了一个块参照对象") }; if (RTNORM == acedSSGet(_T(":S:$-M"), &arPrompt, NULL, rb, ss)) { //查看此块参照是否是动态块参照 ads_name ent; acedSSName(ss, 0, ent); AcDbObjectId idBlk; acdbGetObjectId(idBlk, ent); //查看是否为动态块参照 AcDbDynBlockReference cDynBlkRef(idBlk); if (cDynBlkRef.isDynamicBlock()) { //打开块参照对象 AcGeMatrix3d mat; AcGePoint3d ptInset; AcDbEntity* pEnt = NULL; if (Acad::eOk != acdbOpenObject(pEnt, idBlk, AcDb::kForRead)) { acedSSFree(ss); acutRelRb(rb); return; } AcDbBlockReference* pRef = AcDbBlockReference::cast(pEnt); if (pRef) { mat = pRef->blockTransform(); ptInset = pRef->position(); } pEnt->close(); //取出动态块定义的ID AcDbObjectId idBlkDef = AcDbObjectId::kNull; idBlkDef = cDynBlkRef.dynamicBlockTableRecord(); if (idBlkDef) { //插入新的动态块 AcDbBlockReference* pBlkRef = new AcDbBlockReference(AcGePoint3d(0, 0, 0), idBlkDef); pBlkRef->transformBy(mat); pBlkRef->setPosition(ptInset); if (AcDbObjectId::kNull == AddToModelSpace(pBlkRef)) { delete pBlkRef; acedSSFree(ss); acutRelRb(rb); return; } //此处省略拖动代码 //..... } } acedSSFree(ss); } acutRelRb(rb); }
————————————————
版权声明:本文为CSDN博主「mary288267」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mary288267/article/details/118903501
版权声明:本文为CSDN博主「mary288267」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mary288267/article/details/118903501