找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2686|回复: 9

[求助]:请问怎样 删除 图块

[复制链接]
发表于 2002-12-18 13:52:59 | 显示全部楼层 |阅读模式

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

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

×
已知用命令:
ads_command( RTSTR, "BLOCK",  RTSTR, "TextBlock", RTSTR, "0,0", RTPICKS, bss, RTSTR, "", RTNONE );  

请问怎么删除 TextBlock 这个图块

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-12-18 20:42:43 | 显示全部楼层

Re: [求助]:请问怎样 删除 图块

最初由 lvqingli 发布
[B]已知用命令:
ads_command( RTSTR, "BLOCK",  RTSTR, "TextBlock", RTSTR, "0,0", RTPICKS, bss, RTSTR, "", RTNONE );  

请问怎么删除 TextBlock 这个图块

谢谢! [/B]


1、用 purge 命令,对于符号表层、线型、字型、块等等,只能用ACAD的命令PURGE删除掉没有被当前数据库引用的对象。

2、使用ARX,判断是否被引用,如没有,可以用AcDbObject::erase(..)删除掉。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-16 18:40:45 | 显示全部楼层

Re: Re: [求助]:请问怎样 删除 图块

[B]已知用命令:
ads_command( RTSTR, "BLOCK",  RTSTR, "TextBlock", RTSTR, "0,0", RTPICKS, bss, RTSTR, "", RTNONE );  

请问,如果用 acedCommand(RTSTR, "Purge",RTSTR, "Blocks", RTSTR, "*", RTSTR, "No",RTNONE) 命令删除了无用图块,在AutoCAD的文本窗口返回有 “deleting block XXXXXXX”等等信息,
请教,如何使这些信息不显示?能用某个系统变量实现吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-6-16 18:58:14 | 显示全部楼层

Re: Re: Re: [求助]:请问怎样 删除 图块

最初由 yousuika 发布
[B][B]已知用命令:
ads_command( RTSTR, "BLOCK",  RTSTR, "TextBlock", RTSTR, "0,0", RTPICKS, bss, RTSTR, "", RTNONE );  

请问,如果用 acedCommand(RTSTR, "Purge",RTSTR, "Blocks", RTSTR, "*", RTSTR, "N... [/B]


既然用ARX, 那么就直接用ARX的方法去删除无用的块, ACAD的命令也是通过ARX方法做的.

你可以先用:

  1. [font=courier]
  2. AcDbDatabase::purge Function Acad::ErrorStatus

  3. purge(

  4. AcDbObjectIdArray& ids);

  5. ids Input array of object ID entities of objects

  6. This function searches through the database to see
  7. if there are any hard references to objects with object ID entities in the
  8. ids array. If any such objects are found, their object ID entities are
  9. removed from the ids array. So, when this function returns, the ids array
  10. will contain only object ID entities of objects that are not currently hard-
  11. referenced and thus can safely be erased.


  12. Returns Acad::eOk if the operation is successful.

  13. [/font]


你可以把你的块的ID加入一个AcDbObjectIdArray数组里面, 调用上面的方法, 如果有INSERT实体引用这个块,那么ID回从数组中移出.
执行后, 判断数组的长度,如果大于0, 那么说明这个块没有被INSERT引用, 那么你就可以用AcDbObject::erase(..) 安全的删除这个块定义了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-6-16 19:02:03 | 显示全部楼层
下面是删除一个层定义的函数,你可以参考下,在ACAD里面,删除一个无用的层,必须通过PURGE命令做. 下面是ARX代码的实现.

下面的函数DelLayer你可以定义成一个命令, 删除输入的层名指定的层定义(如果没有实体引用输入的层名的层记录)

  1. [font=courier]
  2. #include "StdAfx.h"
  3. #include "StdArx.h"
  4. #include <dbsymtb.h>// This is command 'DELLAYER'
  5. void DelLayer()
  6. {
  7.     char pcBuffer [133] ;   
  8.     if (acedGetString (0, "\nLayer name to delete: ", pcBuffer) == RTNORM) {
  9.         if (strcmp (pcBuffer, "0") == 0 ) {
  10.             acutPrintf ("\nCannot erase layer (0) !") ;
  11.             return ;
  12.         }
  13.         struct resbuf result ;
  14.         acedGetVar ("CLAYER", &result) ;
  15.         if (stricmp (pcBuffer, result.resval.rstring) == 0 ) {
  16.             free (result.resval.rstring) ;
  17.             acutPrintf ("\nCannot erase current layer !") ;
  18.             return ;        
  19.         }
  20.         free (result.resval.rstring) ;
  21.         AcDbLayerTable *pLayerTable =NULL ;
  22.         if (acdbHostApplicationServices()->workingDatabase()->
  23.               getSymbolTable (pLayerTable, AcDb::kForRead)== Acad::eOk ) {
  24.             if (pLayerTable->has (pcBuffer)) {
  25.                 AcDbObjectId id ;
  26.                 pLayerTable->getAt (pcBuffer, id) ;
  27.                 AcDbObjectIdArray idArray ;
  28.                 idArray.append (id) ;
  29.                 if (acdbHostApplicationServices()->
  30.                       workingDatabase()->purge (idArray) == Acad::eOk) {
  31.                     if (idArray.contains (id) ) {
  32.                         AcDbLayerTableRecord *pLayer ;
  33.                         pLayerTable->getAt (pcBuffer,pLayer, AcDb::kForWrite) ;
  34.                         pLayer->erase (Adesk::kTrue) ;
  35.                         pLayer->close () ;
  36.                         acutPrintf ("\nLayer (%s)deleted !", pcBuffer) ;
  37.                     }
  38.                     else {
  39.                         acutPrintf ("\nLayer (%s) is referenced !", pcBuffer) ;
  40.                     }
  41.                 }
  42.                 else {
  43.                     acutPrintf ("\nLayer (%s) cannot be deleted !", pcBuffer) ;
  44.                 }
  45.             }
  46.             else {
  47.                 acutPrintf ("\nLayer (%s) does not exist !",pcBuffer) ;
  48.             }
  49.             pLayerTable->close () ;
  50.         }
  51.     }
  52. }
  53. [/font]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-16 19:22:11 | 显示全部楼层
谢谢晓东。对这个块也用了AcDbObject::erase,但是在CAD中发现还有块名残留,所以才加上的purge,我不知道这是什么原因,请赐教。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-6-16 19:28:11 | 显示全部楼层
最初由 yousuika 发布
[B]谢谢晓东。这个程序的目的是在做一个块之前,先Preview这个块,所以先做了一个块,Preview后把他删除,我看程序也对这个块用了AcDbObject::erase,但是在CAD中发现还有每次Preview产生的块名,所以才加上的purge,我... [/B]


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

使用道具 举报

发表于 2003-6-16 20:00:16 | 显示全部楼层
最初由 XDSoft 发布
[B][QUOTE]最初由 yousuika 发布
[B]谢谢晓东。这个程序的目的是在做一个块之前,先Preview这个块,所以先做了一个块,Preview后把他删除,我看程序也对这个块用了AcDbObject::erase,但是在CAD中发现还有每次P... [/B]


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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-6-16 20:08:33 | 显示全部楼层
最初由 yousuika 发布
[B][QUOTE]最初由 XDSoft 发布
[B][QUOTE]最初由 yousuika 发布
[B]谢谢晓东。这个程序的目的是在做一个块之前,先Preview这个块,所以先做了一个块,Preview后把他删除,我看程序也对这个块用了AcDbOb... [/B]


你把你的 删除图块的代码完整贴论坛来吧. 大家看看.

另外你说的 删除后, 还能查看到, 是什么意思? 删除一个图块的前提是没有INSERT实体引用这个图块. 如果有INSERT实体引用这个块, 你必须先删除掉所有引用这个块定义的INSERT实体后,在删除这个块定义.

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

使用道具 举报

发表于 2003-6-17 08:35:14 | 显示全部楼层

Re: Re: Re: [求助]:请问怎样 删除 图块

最初由 yousuika 发布
[B][B]已知用命令:
ads_command( RTSTR, "BLOCK",  RTSTR, "TextBlock", RTSTR, "0,0", RTPICKS, bss, RTSTR, "", RTNONE );  
请问,如果用 acedCommand(RTSTR, "Purge",RTSTR, "Blocks", RTSTR, "*", RTSTR, "N... [/B]



acedCommand (RTSTR,"CMDECHO",RTSTR,"0",0);
CMDECHO变量是命令回显控制。
关闭命令回显可以提高命令执行速度。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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