天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 59|回复: 0

objectARX中如何插入动态块

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
最近遇到一个任务:提示用户选择一个动态块参照,然后复制这个块参照后提示用户插入到令一个地方。最开始,我将动态块参照复制到内存,然后插入到CAD图形数据库,发现动态属性都丢失了;后来,将块参照的blockTableRecord的ID找到,利用这个ID将块参照插入图形中,动态属性依然丢失。
后经反复验证,发现:
方法AcDbBlockReference::blockTableRecord返回的ID并不是动态块参照块定义的ID,只是图形中显示实体的块定义的ID;
方法AcDbDynBlockReference::dynamicBlockTableRecord()返回的才是动态块定义的ID。
最终效果如下:


代码实现
以下代码仅仅是插入了一个自定义属性为初始状态的动态块参照,如果需要修改动态块参照的自定义属性,可以通过AcDbDynBlockReference 类中的AcDbDynBlockReference::getBlockProperties获取相关属性,然后再利用自定义属性的方法对属性进行设置。

[code]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);
}
https://blog.csdn.net/mary288267/article/details/118903501[/code]

 

 

 

 

objectARX中如何插入动态块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:40 , Processed in 0.108078 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表