找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 742|回复: 8

[VBA程序]:层的删除问题

[复制链接]
发表于 2002-10-15 22:06:24 | 显示全部楼层 |阅读模式

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

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

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

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-15 22:15:12 | 显示全部楼层

Re: [VBA程序]:层的删除问题

最初由 indal 发布
[B]层上有块,而块又被其它层用,能不能通过改块的属性来删该层呢?又是怎样改属性的呢? [/B]


一个层只有在没有被其他对象引用的前提下,才可以删除掉。

即使一个层上没有任何实体了,但是如果其他层上的比如块,XREF等内的子实体引用了该层,也不能删除,删除会引起ACAD崩溃。

所以,第一步要做的是判断是否有对象引用该层,确保没有后,再有层对象的删除方法,安全删除掉。

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

使用道具 举报

 楼主| 发表于 2002-10-15 22:25:20 | 显示全部楼层
怎样判断是否有对象引用该层?(VBA中是怎样实现的?)
而修改块中对象的层属性又是怎样修改的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-15 22:32:43 | 显示全部楼层
最初由 indal 发布
[B]怎样判断是否有对象引用该层?(VBA中是怎样实现的?)
而修改块中对象的层属性又是怎样修改的? [/B]


VBA中可以使用PURGEALL方法删除所有的没有使用的匿名块和层。


  1. [FONT=courier new]
  2. Removes unused named references such as unused blocks or layers from the document.

  3. See Also | Example

  4. Signature

  5. object.PurgeAll

  6. Object

  7. Document
  8. The object or objects this method applies to.

  9. Remarks

  10. This method is the equivalent of enteringPURGE on the command line, selecting the All option and choosing Yes to the Purge Everything? prompt.

  11. Deleted objects remain in the document until they are purged using this method.
  12. [/FONT]


例子:

  1. [FONT=courier new]
  2. Sub Example_PurgeAll()
  3.     ' This example removes all unused named references from the database
  4.    
  5.     ThisDrawing.PurgeAll
  6.    
  7. End Sub
  8. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-15 22:53:10 | 显示全部楼层
你可以遍历块表,查询块里面的每个对象的层名是否等于你需要删除的层名,如果等,用修改属性方法,修改对象的层名到其他层。


  1. [FONT=courier new]
  2. Sub del_layer()
  3. Dim a_app As AcadApplication
  4. Dim a_blks As AcadBlocks
  5. Dim obj As Object
  6. On Error Resume Next

  7. Set a_app = GetObject(, "AutoCAD.Application.15")
  8. Set a_blks = a_app.ActiveDocument.Blocks //获得块表

  9. For Each obj In a_blks  //遍历循环
  10.      If (obj.Layer=="YOUR LAYER NAME" Then
  11.           .............//加入修改对象层名代码
  12.      End If
  13. Next obj
  14. End Sub
  15. [/FONT]


我不用VBA,所以只能努力给你找资料,借用ARX和LISP的知识做回复,你可以参考下,方法应该是相通的。

如果你解决了,希望把代码贴到论坛来,和大家共享。

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

使用道具 举报

 楼主| 发表于 2002-10-16 08:44:40 | 显示全部楼层
学CAD二次开发的人不来晓东CAD空间,那可以说是一种损失,很大的损失!
我也不太懂VBA,我只是用VC里的acad.tlb,他们好象也基本一样,我参考的是VBA。
我会尽快把代码贴出来的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-17 00:49:32 | 显示全部楼层

  1. [FONT=courier new]
  2. CString oldlayername;
  3.         CString newlayername;
  4.         oldlayername="oldlayer";
  5.         newlayername="newlayer";
  6.         for(int i=0;i< m_acadblocks.GetCount();i++)
  7.         {
  8.                 m_acadblock.AttachDispatch(m_acadblocks.Item(COleVariant((short)i)),true);
  9.                 for(int j=0;j< m_acadblock.GetCount();j++)
  10.                 {       
  11.                         m_acadentity=m_acadblock.Item(COleVariant((short)j));
  12.                         if(!strcmp(oldlayername,m_acadentity.GetLayer()))
  13.                                 m_acadentity.SetLayer(newlayername);

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

使用道具 举报

 楼主| 发表于 2002-10-17 01:04:30 | 显示全部楼层
多谢XD帮助修改
IAcadLayer.delete()可把oldlayer层删除!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-10-25 16:21:14 | 显示全部楼层
检查层引用的函数如下:

  1.   [FONT=courier new]
  2. '检查层引用是否存在
  3. '输入:Name-层名
  4. 输出:LayerRefExist,TRUE表示层引用存在
  5. Public Function LayerRefExist(ByVal Name As String) As Boolean
  6.     Dim EntObj As AcadEntity
  7.    
  8.     On Error GoTo ErrTrap
  9.     If Name = "" Then Exit Function
  10.     For Each EntObj In ThisDrawing.ModelSpace
  11.         If StrComp(EntObj.Layer, Name, vbTextCompare) = 0 Then
  12.            LayerRefExist = True
  13.            Exit For
  14.         End If
  15.     Next
  16.     Set EntObj = Nothing
  17.     Exit Function
  18.    
  19. ErrTrap:
  20.     If Not (EntObj Is Nothing) Then Set EntObj = Nothing
  21.     On Error GoTo 0
  22. End Function
  23.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-6 16:16 , Processed in 0.183454 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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