|
最近遇到一个任务:提示用户选择一个动态块参照,然后复制这个块参照后提示用户插入到令一个地方。最开始,我将动态块参照复制到内存,然后插入到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);
}
[code]原文链接:https://blog.csdn.net/mary288267/article/details/118903501[/code] |
|