找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1631|回复: 6

[求助]:如何删除块表记录??

[复制链接]
发表于 2003-5-26 20:32:04 | 显示全部楼层 |阅读模式

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

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

×
erase()函数不好用?
还有什么方法能从块表中删除某个块表记录?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-5-26 20:36:02 | 显示全部楼层

Re: [求助]:如何删除块表记录??

最初由 yongly 发布
[B]erase()函数不好用?
还有什么方法能从块表中删除某个块表记录? [/B]


怎么不好用?

erase 是AcDbObject类的方法,所有从AcDbObject派生的对象都适用.

你把删除块表记录的代码贴到论坛来吧,大家讨论下,一定是代码有问题.

发贴时候说明下你的代码的作用(你的想法)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-27 09:43:35 | 显示全部楼层
//列表框中是从一个图库文件中读出的所有块表记录的blockname
//得到列表框中待删除的块名的index
     int index = m_ctrlBlockList.GetCurSel();       
     int i = 0;
     AcDbDatabase *extDb = new AcDbDatabase(Adesk::kFalse);//定义一个空数据库
  extDb->readDwgFile(m_strFileName);//读入图库文件
  //以写方式得到块表指针
  AcDbBlockTable *pBTable = NULL;
   extDb->getBlockTable(pBTable,AcDb::kForWrite);
//定义块表记录指针pBTableRec
AcDbBlockTableRecord *pBTableRec;
//定义遍历块表的浏览器,获得指向块表浏览器指针
AcDbBlockTableIterator *pBIterator = NULL;
pBTable->newIterator(pBIterator);
//利用循环结构和块表浏览器遍历块表
for(pBIterator->start();!pBIterator->done();pBIterator->step())
{//调用块表浏览器的成员函数getRecord获得指向块表记录的指针
  pBIterator->getRecord(pBTableRec,AcDb::kForWrite,Adesk::kFalse);
     pBTableRec->getName(blockname);//得到块名
    char block_name[2];
          block_name[0] = *blockname;
        if(block_name[0]!='*')
        {
              if(i == index)
              {
                 //将列表框中选中的块表记录从块表中删除       
                pBTableRec->erase(true);
                break;
              }
             i++;
        }
}
pBTable->close();
pBTableRec->close();
//保存图块文件
extDb->saveAs(m_strFileName);
delete extDb;

或者直接删除指定名字的块表记录??
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-5-27 11:58:58 | 显示全部楼层
最初由 yongly 发布
[B]//列表框中是从一个图库文件中读出的所有块表记录的blockname
//得到列表框中待删除的块名的index
     int index = m_ctrlBlockList.GetCurSel();       
     int i = 0;
     AcDbDatabase *extDb = new AcDbDataba... [/B]


说下上面的代码,哪里不符合你的实际要求, 什么现象? 如果有返回值,到哪里得到的结果和你希望的不同?

在删除块定义前,你要测试下图中模型空间或者图纸空间是否有INSERT实体引用了块定义,如果有引用,是erase不了的.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-5-29 10:25:30 | 显示全部楼层
我先用下面的程序将当前图形中的某个实体定义为一个图块,并保存在图库文件中
        //用交互方式选择目标
        ads_name ss,ent;//定义选择集
        ads_ssget(NULL,NULL,NULL,NULL,ss);
        AcDbObjectId id;
        AcDbObjectIdArray ArrayID;//定义存储对象的ID号的数组
        long length;
        if(RTNORM != acedSSLength(ss,&length) || 0 == length)
        {
                acutPrintf("\n没有选中任何目标!");
                acedSSFree(ss);
                return;
        }
        //将所选对象的ID号依次存入数组中
        for(long i = 0 ; i < length ; i++)
        {
                if(RTNORM != acedSSName(ss,i,ent)) continue;
                if(Acad::eOk != acdbGetObjectId(id,ent)) continue;
                ArrayID.append(id);
        }
        ads_ssfree(ss);//释放选择集
        //定义块表记录指针pBTableRec
        AcDbBlockTableRecord *pBTableRec = new AcDbBlockTableRecord();
        //设置块表记录名(块名)
        char newblockName[20];
        if(acedGetString(NULL,"请输入块名:",newblockName) != RTNORM)
                return;
        pBTableRec->setName(newblockName);
        //定义块的插入基点
        AcGePoint3d basepoint(0,0,0);
        if(acedGetPoint(NULL,"\n请输入插入基点:",asDblArray(basepoint)) != RTNORM)
                return;
        pBTableRec->setOrigin(basepoint);
       
        AcDbDatabase *extDb = new AcDbDatabase(Adesk::kFalse);//定义一个空数据库
    extDb->readDwgFile(m_strFileName);//读入图库文件
    //以写方式得到块表指针
        AcDbBlockTable *pBTable = NULL;
        extDb->getBlockTable(pBTable,AcDb::kForWrite);
        //将新块表记录加入块表中
        pBTable->add(pBTableRec);
        pBTable->close();
        pBTableRec->close();
        //将图块定义保存于图块文件中
        extDb->saveAs(m_strFileName);
        delete extDb;
        //将刚加入的块名添加到列表框中
        m_ctrlBlockList.InsertString(-1,newblockName);

我还有一段程序用来从图库文件中读出块表中的所有块名记录的块名,放入列表框中
我的目的是要从列表框中选取某个块名,然后点删除按钮,就将这个块表记录从图库文件中删除,但是erase()函数没有作用,当我运行删除图块的函数后,再次从该图库文件中检索,发现我要删除的图块依然出现在列表框中,我也没有引用该块的定义。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-6-18 00:01:37 | 显示全部楼层
最初由 yongly 发布
[B]我先用下面的程序将当前图形中的某个实体定义为一个图块,并保存在图库文件中
        //用交互方式选择目标
        ads_name ss,ent;//定义选择集
        ads_ssget(NULL,NULL,NULL,NULL,ss);
        AcDbObjectId id;
        AcDbObjectIdArr... [/B]


你上面的 pBTableRec 块表记录里面没有内容啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-18 13:26:32 | 显示全部楼层
不是吧这么繁
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 00:48 , Processed in 0.489681 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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