明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3148|回复: 6

[原创]锁定dim标注数值VBA版(支持公差等格式)

[复制链接]
发表于 2004-10-14 21:17:00 | 显示全部楼层 |阅读模式
  1. '锁定标注文字
  2. '作者:明经通道 mccad
  3. Function FixDimText(Dimension As AcadDimension) As String
  4.        Dim BlockCount As Long
  5.        BlockCount = ThisDrawing.Blocks.Count
  6.       
  7.        Dim CopyDimension As AcadDimension
  8.        Set CopyDimension = Dimension.Copy
  9.        Dim NewBlockCount As Long
  10.        NewBlockCount = ThisDrawing.Blocks.Count
  11.        If NewBlockCount = BlockCount + 1 And Left(ThisDrawing.Blocks(BlockCount).Name, 2) = "*D" Then
  12.                Dim EntityInBlock As AcadEntity
  13.                For Each EntityInBlock In ThisDrawing.Blocks(BlockCount)
  14.                        If EntityInBlock.ObjectName = "AcDbMText" Then
  15.                                Dimension.TextOverride = EntityInBlock.TextString
  16.                                Exit For
  17.                        End If
  18.                Next
  19.        End If
  20.        CopyDimension.Delete
  21.        FixDimText = Dimension.TextOverride
  22. End Function'解锁标注文字
  23. Function UnFixDimText(Dimension As AcadDimension) As String
  24.        Dimension.TextOverride = ""
  25.        UnFixDimText = Dimension.TextOverride
  26. End Function
程序原理:
标注对象其实就是由系统控制的匿名块,块名均以“*D”开头。
对于LISP,可以通过取DXF代码中的组码2来取得其块名,再通过块来取得文字。
而对于VBA,没有直接的方法可以取得标注对象所属的块的名称。
本程序通过对复制标注对象,然后查看系统中增加了的以"*D"开头的匿名块,该块就是生成所复制标注对象的块了,通过块就可以取得文字内容。
发表于 2004-10-14 22:27:00 | 显示全部楼层
不错,这倒是个好办法
发表于 2004-10-15 09:41:00 | 显示全部楼层

回复

很少用过dim标注,学习一下.
发表于 2004-10-22 09:38:00 | 显示全部楼层
  1. ;;不要忘了ownerid,下列是点选的实现(全用ActiveX___应可转为vba)
  2. (defun C:TTT (/             BLKS         CONTEXTDATA
  3.              DOC           ENTOBJ         ENTOBJ_OWNER
  4.              ENTOBJ_OWNER_NAME           TEXTSTRING
  5.              UTILITY           PICKEDPOINT       TRANSMATRIX
  6.            )
  7.    (setq DOC (vla-get-activedocument (vlax-get-acad-object)))
  8.    (setq BLKS (vla-get-blocks DOC))
  9.    (setq UTILITY (vla-get-utility DOC))
  10.    (setq  ERR (vl-catch-all-apply
  11.              'vla-getsubentity
  12.              (list UTILITY       'ENTOBJ     'PICKEDPOINT
  13.            'TRANSMATRIX     'CONTEXTDATA     "\n选取标註: "
  14.          )
  15.          )
  16.    )
  17.    (if (not (vl-catch-all-error-p ERR))
  18.        (progn
  19.            (setq ENTOBJ_OWNER (vla-get-ownerid ENTOBJ))
  20.            (setq ENTOBJ_OWNER_NAME
  21.            (vla-get-name
  22.                (vla-objectidtoobject
  23.      DOC
  24.      ENTOBJ_OWNER
  25.                )
  26.            )
  27.            )
  28.            (if (= "*D" (substr ENTOBJ_OWNER_NAME 1 2))
  29.   (progn
  30.      (vlax-for OBJ  (vla-item BLKS ENTOBJ_OWNER_NAME)
  31.          (if  (= (vla-get-objectname OBJ) "AcDbMText")
  32.              (setq TEXTSTRING (vla-get-textstring OBJ))
  33.          )
  34.      )
  35.      (vla-put-textoverride
  36.          (vla-objectidtoobject
  37.              DOC
  38.              (nth 0 (vlax-safearray->list CONTEXTDATA))
  39.          )
  40.          TEXTSTRING
  41.      )
  42.   )
  43.            )
  44.        )
  45.    )
  46.    (vlax-release-object DOC)
  47.    (vlax-release-object BLKS)
  48.    (vlax-release-object UTILITY)
  49.    (princ)
  50. );;当然用vlisp+lisp会更简单
  51. (defun C:TT1 (/ ENT ENTT OBJ)
  52.    (setq ENT (nentselp "\n选取标註: "))
  53.    (if (and ENT
  54.        (= "DIMENSION"
  55.              (cdr (assoc 0 (entget (setq ENTT (last (last ENT))))))
  56.        )
  57.            )
  58.        (progn
  59.            (vlax-for  OBJ
  60.            (vla-item
  61.                (vla-get-blocks
  62.       (vla-get-activedocument (vlax-get-acad-object))
  63.                )
  64.                (cdr (assoc 2 (entget ENTT)))
  65.            )
  66.   (if (equal (vla-get-objectname OBJ) "AcDbMText")
  67.      (setq TXT (vla-get-textstring OBJ))
  68.   )
  69.            )
  70.            (vla-put-textoverride
  71.   (vlax-ename->vla-object ENTT)
  72.   TXT
  73.            )
  74.        )
  75.    )
  76.    (princ)
  77. )
 楼主| 发表于 2004-10-22 21:08:00 | 显示全部楼层
不错的思路,但这样的程序只能使用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.                Dim EntityInBlock As AcadEntity
  12.                For Each EntityInBlock In ThisDrawing.ObjectIdToObject(BlkId)
  13.                        If EntityInBlock.ObjectName = "AcDbMText" Then
  14.                                TextString = EntityInBlock.TextString
  15.                                Exit For
  16.                        End If
  17.                Next
  18.                'Debug.Print TextString
  19.                If TextString <> "" Then ThisDrawing.ObjectIdToObject(contextdata(0)).TextOverride = TextString
  20.        End If
  21.       
  22. End Sub
发表于 2021-1-20 12:08:06 来自手机 | 显示全部楼层
2004年,标注的ownerID是modelspace
发表于 2021-1-20 12:11:40 来自手机 | 显示全部楼层
所以用getsubentity
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-30 06:28 , Processed in 0.192769 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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