明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9397|回复: 15

如何通过vba删除块中的某些对象?

  [复制链接]
发表于 2007-8-19 12:32:00 | 显示全部楼层 |阅读模式

我想通过vba,在不炸开块的前提下,直接删除块定义中的某些对象,以达到修改块的目的。

另外,能否在不炸开块的前提下获得块中各个对象的相关参数?比如,块中某个圆的半径等。

发表于 2018-3-7 10:35:33 | 显示全部楼层
mccad 发表于 2007-8-20 12:15
图纸除了模型空间、图纸空间外,还有一个是块空间,也就是一个块定义有一个块空间。你可以和操作模型空间一 ...

请问怎么用VBA把选择集中的对象添加到已经建好的块中?请高手赐教!!!
 楼主| 发表于 2007-8-19 15:52:00 | 显示全部楼层
麻烦各位大侠们指点一二!
发表于 2007-8-20 09:33:00 | 显示全部楼层

我也想知道,但也许不可能。

在块中增加一个图元很容易,但删除...我没有找到简单的方法,

但在CAD的LSP说明中有一句,可以将想要去掉的实体去掉后,再重新定义这个块,以达到删除图元的目的。

在LISP中,用Nentsel取得块中的图元名,再将块中的所有图元名与之比例,如果相同则过滤之。再重新定义这个块。

在VBA中我却也不知道怎么做。

发表于 2007-8-20 10:03:00 | 显示全部楼层

刚刚找了找VBA的帮助,找到了个方法GETSUBENTY,我就知道,可以做到了,以下是源程序。

Sub delsubent()
    ' This example prompts the user to select on object on the screen with a mouse click,
    ' and returns some information about the selected object.
   
    Dim Object As AcadEntity
    Dim PickedPoint As Variant, TransMatrix As Variant, ContextData As Variant
    Dim HasContextData As String
   
    On Error GoTo NOT_ENTITY
        Err.Clear
TRYAGAIN:
       
   ' MsgBox "Use the mouse to click on an object in the current drawing after dismissing this dialog box."
       
    ' Get information about selected object
    ThisDrawing.Utility.GetSubEntity Object, PickedPoint, TransMatrix, ContextData
   
    ' Process and display selected object properties
If VarType(ContextData) <> vbEmpty Then
      
   Object.Delete
   ThisDrawing.Regen acActiveViewport
End If
GoTo TRYAGAIN

   
NOT_ENTITY:
 
End Sub

 楼主| 发表于 2007-8-20 11:05:00 | 显示全部楼层

非常感谢英雄无敌!不过GetSubEntity好像只能通过鼠标选择,如果我想让程序后台操作,该如何实现呢?

比如,我想把一个块中的直线全部替换成以各直线为直径的圆。

发表于 2007-8-20 11:49:00 | 显示全部楼层

用VBA我也不知道,但可以结合VLISP,用(ssget'((0 . "insert")))取得所有的块,但分别取得每个块中的子图元名,如果图元类型是直线,则调用VBA将其删除,然后用ADD方法增加。

发表于 2007-8-20 12:15:00 | 显示全部楼层

图纸除了模型空间、图纸空间外,还有一个是块空间,也就是一个块定义有一个块空间。你可以和操作模型空间一样来操作块空间,但选择就没有那么自由了,只能使用GetSubEntity方法来选择。

我们在图上所见到的是块参照,通过块参照的块名能够找到其块定义的块空间,再通过块空间来操作块。操作后,记住图纸要重新生成一下就可以了。

发表于 2007-8-20 16:15:00 | 显示全部楼层
用VBA不知道怎么做,主要是不知道怎么取得块内的子图元,我用VLISP编写了一个,不知对你是否有帮助。

本帖子中包含更多资源

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

x
 楼主| 发表于 2007-8-21 14:46:00 | 显示全部楼层

非常感谢英雄无敌和管理员同志!

看来用VBA,还是无法提取块中的各个对象(子图元)的相关参数。

我对lisp不太懂,而且cad的vba开发也是刚开始摸索,所以看来只能把块参照删除(保存块

参照位置),然后炸开原块,获得各个参数,修改完(包括删除)炸开对象后,再用与原块相同的块参数(如块名、插

入点等)重新定义块,并在原来各个块参照的位置插入新块。这样是可以实现的,只是觉得绕的路是否太多,所以想

知道是否能够得到块中各个对象的参数,比如是否存在某些数据库中;既然连管理员都说不行,看来是真的不行了。

不过还是【衷心】的感谢英雄无敌,和你的lisp程序,等我研究研究lisp和ARX,我想也许能找到更好的办法。

当然也非常感谢管理员同志权威的回答!

发表于 2007-8-21 18:24:00 | 显示全部楼层
本帖最后由 作者 于 2007-8-21 18:46:47 编辑

VBA是能做的,怎么会无法提取块中的各个对象呢?在图形中选择块,就可以得到块名,通过块名就可以查到块定义,你可以通过遍历的方法来查看块定义中的所有图元。
如果使用GetSubEntity方法,可以参考以下程序:
  1. Sub FixDimText()
  2.      Dim Ent As AcadEntity
  3.      Dim Pnt As Variant
  4.      ThisDrawing.Utility.GetSubEntity Ent, Pnt, transMatrix, contextdata, "选择标注对象:"
  5.      Dim BlkId As Long
  6.      BlkId = Ent.OwnerID
  7.      Dim BlkName As String
  8.      Dim TextString As String
  9.      BlkName = ThisDrawing.ObjectIdToObject(BlkId).Name
  10.      If Left(BlkName, 2) = "*D" Then
  11.          If Ent.ObjectName = "AcDbMText" Then
  12.             TextString = Ent.TextString
  13.             If TextString <> "" Then ThisDrawing.ObjectIdToObject(contextdata(0)).TextOverride = TextString
  14.          End If
  15.      End If
  16. End Sub
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 07:25 , Processed in 0.177429 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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