andyzha 发表于 2022-8-24 13:50:03

根据图框比例调整标注,支持标注-线型-填充-文字,对弧长标注无效,已解决

本帖最后由 andyzha 于 2022-8-27 09:28 编辑

源码是SunSpring的原创,根据图框比例调整标注,支持标注、线型比例、填充、文字大小,原理是抓取图框比例,缩放标注的全局比例,文字大小是读取textsize参数,如果觉得调整后的文字太小,可调整参数textsize,默认2.5,可以设置成3.5即可
但是原程序对弧长标注dar无效,无法随之调整,求大神修复解决。

(setq *en2obj* vlax-ename->vla-object)
;;;图框位置
(defun titleplace (titlename p0 / entdata entgrp entname i n pb pc ptlist titlescale txdata)
(if (setq entgrp (ssget "x" (list '(0 . "insert") (cons 2 titlename))))
    (repeat (setq n (sslength entgrp))
      (setq entname (ssname entgrp (setq n (1- n))))
      (setq titlescale (vla-get-XScaleFactor (*en2obj* entname)))
      (setq ptlist (append (ax:getboundingbox entname) (list titlescale)))
      (setq txdata (append (list ptlist) txdata))
    )
)
(setq i 0)
(if (and p0 txdata)
    (while (< i (length txdata))
      (setq pb (nth 0 (nth i txdata)))
      (setq pc (nth 1 (nth i txdata)))
      (if (and
      (> (nth 0 p0) (nth 0 pb))
      (< (nth 0 p0) (nth 0 pc))
      (> (nth 1 p0) (nth 1 pb))
      (< (nth 1 p0) (nth 1 pc))
    )
(progn
    (setvar "dimscale" (nth 2 (nth i txdata)))
    (setq i (length txdata))
)
(setvar "dimscale" 1.0)
      )
      (setq i (+ i 1))
    )
)
)
;;;返回图元对象边框的最大和最小点
(defun ax:getboundingbox (entname / entpl entpr ptlist)
(vla-getboundingbox (vlax-ename->vla-object entname) 'entpl 'entpr)
(setq ptlist (mapcar 'vlax-safearray->list (list entpl entpr)))
(mapcar '(lambda (x) (trans x 0 1)) ptlist)
)
(defun getentdxf (ent dxf)
(cond
    ((= (type ent) 'ename)
      (cdr (assoc dxf (entget ent '("*"))))
    )
    ((= (type ent) 'vla-object)
      (cdr (assoc dxf (entget (vlax-vla-object->ename ent) '("*"))))
    )
)
)

;;;出错退出
(defun errexit (s)
(restore)
(princ)
)
;;;出错处理
(defun saverror ()
(setq olderr *error*)
(setq *error* errexit)
(setvar "cmdecho" 0)
(setq clayer (getvar "clayer"))
(setq lastent (entlast))
)
;;;出错恢复
(defun restore ()
(redraw)
(setq *error* olderr)
(setvar "clayer" clayer)
(princ)
)
;;;根据图框比例自动改变图框内所有对象全局比例
(defun c:ds ( / entdata entgrp entname n ptlist scale)
(prompt "根据图框比例自动改变图框内所有标注全局比例")
(saverror)
(if (setq entname (entsel))
    (if (= "INSERT" (cdr (assoc 0 (entget (car entname)))))
      (progn
(setq ptlist (ax:getboundingbox (car entname)))
(command "zoom" (car ptlist) (cadr ptlist))
(setq entgrp (ssget "W" (car ptlist) (cadr ptlist) '((0 . "DIMENSION,ARC_DIMENSION,*TEXT,*LINE,HATCH,LEADER,ACMSURFSYM,ACMWELDSYM"))))
(setq scale (vla-get-XScaleFactor (*en2obj* (car entname))))
(repeat (setq n (sslength entgrp))
    (setq entname (ssname entgrp (setq n (1- n))))
    (cond
      ((= "HATCH" (getentdxf entname 0))
      (vla-put-PatternScale (*en2obj* entname) scale)
      )
      ((= "DIMENSION" (getentdxf entname 0))
      (vla-put-ScaleFactor (*en2obj* entname) scale)
      )
      ((= "ARC_DIMENSION" (getentdxf entname 0))
      (vla-put-ScaleFactor (*en2obj* entname) scale)
      )
      ((wcmatch (getentdxf entname 0) "*TEXT")
      (vla-put-Height (*en2obj* entname) (* (getvar "textsize") scale))
      )
      ((wcmatch (getentdxf entname 0) "*LINE")
      (vla-put-LinetypeScale (*en2obj* entname) scale)
      )
      ((wcmatch (getentdxf entname 0) "LEADER")
      (vla-put-ScaleFactor (*en2obj* entname) scale)
      )
      ((wcmatch (getentdxf entname 0) "ACMSURFSYM,ACMWELDSYM")
      (setq entdata (entget entname))
      (setq entdata (subst (cons 40 scale) (assoc 40 entdata) entdata))
            (entmod entdata)
      )
    )
)
      )
    )
)
(restore)
(princ)
)


感谢lostbalance的点拨,顿时豁然开朗。已修改,支持调整弧长标注了。

lostbalance 发表于 2022-8-25 10:13:13

弧长的0码是ARC_DIMENSION,你的程序里都没加

andyzha 发表于 2022-8-25 08:28:44

个人理解,是不是弧长标注需要特殊参数控制所以没被调整过来?

bai2000 发表于 2022-8-25 10:24:11

能不能把特定的块也加进去?比如‘索引号’

andyzha 发表于 2022-8-26 08:46:25

lostbalance 发表于 2022-8-25 10:13
弧长的0码是ARC_DIMENSION,你的程序里都没加

感谢提醒,按你的提示成功修改完善了,ps:一激动,给你点上反对了:lol

Noangler 发表于 2023-3-24 13:10:11

感谢分享,给个赞。

兰同学 发表于 2023-12-11 06:54:30

谢谢分享。能用到,支持

zhangrunze 发表于 2024-4-16 16:41:03

感谢分享~已经用上了~
请教下楼主
文字太小,可调整参数textsize,默认2.5

      ((wcmatch (getentdxf entname 0) "*TEXT")
      (vla-put-Height (*en2obj* entname) (* (getvar "textsize") scale))

是不是改第一行的数字0....

zhangrunze 发表于 2024-4-16 16:45:29

适合一个文件有多张图纸的标注调整~
赞一下~
台湾网站找到一个:
https://www.autocad-tw.com/t17999-topic

huxu823 发表于 2024-4-17 22:19:36

本帖最后由 huxu823 于 2024-4-17 22:24 编辑

这程序怎么使用啊?加载后,选择图框没反应,选择标注也没反应,全选还是没反应。
图框比例这个数据是怎么读取的,对图框有什么要求?
页: [1] 2
查看完整版本: 根据图框比例调整标注,支持标注-线型-填充-文字,对弧长标注无效,已解决