找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 797|回复: 5

[ARX程序]:怎样删除当前数据库中的块参照?

[复制链接]
发表于 2004-8-18 20:56:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
//删除当前数据库中的块参照
        AcDbBlockTable *pBlockTable;
        acdbHostApplicationServices()->workingDatabase()
                 ->getSymbolTable(pBlockTable, AcDb::kForRead);   //打开 块表 准备读

        AcDbBlockTableIterator *pIter;
        pBlockTable->newIterator(pIter);    //建立 块表 遍历器
        for (pIter->start(); !pIter->done(); pIter->step())
        {
char *pBTName;
                AcDbBlockTableRecord *pBlockTableRecord;
                pIter->getRecord(pBlockTableRecord,AcDb::kForRead);//得到块表记录!       
               
                pBlockTableRecord->getName(pBTName);
                acutPrintf("\n块表名为:%s",pBTName);
                CString name = pBTName;
                free(pBTName);
                if(name.Find("*", 0) == -1)  //如果块记录的名字中不含有"*",即不是*model_space和*paper_space
                {       
                        AcDbBlockTableRecordIterator *pnewIter;
                        pBlockTableRecord->newIterator(pnewIter); //建立 块表记录 编历器
                       
                        AcDbObjectId objId;
                        AcDbObjectIdArray  objList; //列表
                        for (; !pnewIter->done(); pnewIter->step())
                        {
                                pnewIter->getEntityId(objId);  //得到 块表记录中的实体Id
                                acutPrintf("对象Id%lx\n",objId);
                                objList.append(objId);         //写进列表
                        }
                        delete pnewIter;
                        /////////////////////////////////////////////////////////////////
                        //克隆该块参照中的实体到当前模型空间
                        AcDbBlockTable *pBTable;
                        acdbHostApplicationServices()->workingDatabase()
                                ->getSymbolTable(pBTable, AcDb::kForRead);
               
                        AcDbObjectId  modelSpaceId;
                        pBTable->getAt(ACDB_MODEL_SPACE, modelSpaceId); //模型空间id
                    
AcDbIdMapping idMap;        // 创建一个新的 ID 映射关系
                        acdbHostApplicationServices()->workingDatabase()
                                ->deepCloneObjects(objList, modelSpaceId, idMap);  //执行深层克隆
                        pBTable->close();
            //该块表记录中的实体已克隆到当前模型空间,怎样删除它???????
                    pBlockTableRecord->?????????
                }
        pBlockTableRecord->close();               
        }
        delete pIter;
    pBlockTable->close();
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-8-18 22:39:00 | 显示全部楼层
代码见下图,比较清楚,不用解释了吧!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-8-19 22:29:10 | 显示全部楼层
上面的代码不错。我已调试通过,成功地删除了图形中的块参照。
我的本意是先把块参照中的实体拷贝(我用了深层克隆)出来,再删除它。
程序运行结果是确实删掉了块参照,但我拷贝的实体却不知在哪里?
以下是代码,哪儿错了么?
void EraseBlockRef()
{   Acad::ErrorStatus es;
        AcDbBlockTable *pBlockTable;
        AcDbBlockTableRecord *pBlockTableRecord;       
        AcDbBlockTableIterator *pIter;
        char *pBTName;
       
        acdbHostApplicationServices()->workingDatabase()
                ->getSymbolTable(pBlockTable, AcDb::kForRead);   //打开 块表 准备读
       
        pBlockTable->newIterator(pIter);    //建立 块表 遍历器
        for (pIter->start(); !pIter->done(); pIter->step())
        {
                pIter->getRecord(pBlockTableRecord,AcDb::kForRead);//得到块表记录!       
                pBlockTableRecord->getName(pBTName);
                acutPrintf("\n块表名为:%s",pBTName);
                CString name = pBTName;
                free(pBTName);
                if(name.Find("*", 0) == -1)  //如果块记录的名字中不含有"*"
                {       
                        AcDbBlockTableRecordIterator *pnewIter;
                        pBlockTableRecord->newIterator(pnewIter); //建立 块表记录 编历器
                       
                        AcDbObjectId objId;
                        AcDbObjectIdArray  arrobj,objList; //列表
                        for (; !pnewIter->done(); pnewIter->step())
                        {
                                pnewIter->getEntityId(objId);  //得到 块表记录 中的实体Id
                                acutPrintf("\n块中实体Id%lx",objId);

                                objList.append(objId);         //写进列表
                        }
            delete pnewIter;
                       
                        //克隆该块参照中的实体到当前模型空间
                        //
                        AcDbBlockTable *pBTable;
                        AcDbObjectId  modelSpaceId;
                        acdbHostApplicationServices()->workingDatabase()
                                ->getSymbolTable(pBTable, AcDb::kForRead);
                        pBTable->getAt(ACDB_MODEL_SPACE, modelSpaceId); //模型空间id
                        pBTable->close();
                       
                        AcDbIdMapping idMap;        // 创建一个新的 ID 映射关系
                        acdbHostApplicationServices()->workingDatabase()
                                ->deepCloneObjects(objList, modelSpaceId, idMap);
                        acutPrintf("\nok2");
                       
                        //删除块参照中的实体
                        //////////////////////////////////////////////////////////
                        pBlockTableRecord->getBlockReferenceIds(arrobj);
                        acutPrintf("\n块参照的Id%lx",arrobj);
                        if(arrobj.logicalLength()<1)
                                continue;
                        for(int i=0;i<arrobj.logicalLength();i++)
                        {
                                AcDbEntity *pEnt;
                                es = acdbOpenAcDbEntity(pEnt,arrobj,AcDb::kForWrite);
                                acutPrintf("\n块参照中对象的Id%lx",arrobj);
                                if(es!=Acad::eOk)
                                        continue;
                                pEnt->erase();
                                pEnt->close();
                        }                               
                        arrobj.setLogicalLength(0); //!!
            //////////////////////////////////////////////////////////                       
                        pBlockTableRecord->close();
                }
        }
        delete pIter;
pBlockTable->close();
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-28 21:09:34 | 显示全部楼层
那更简单了,这样做:
对所有检索到的目标块参照进行如下操作:
1、炸开块参照,得到其内部实体数组;
2、将得到的实体数组中所有实体追加到数据库中;
3、删除块参照。

这个操作序列实际上就是CAD的炸开命令的效果。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-2 17:34:05 | 显示全部楼层
能不能判断出块参照参照的是哪个层吗?我不想把所有的块参照都删除掉。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-12-5 00:36:08 | 显示全部楼层
AcDbBlockReference的基类为AcDbEntity,层是任何AcDbEntity的基本属性。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-22 05:38 , Processed in 0.344803 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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