明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5822|回复: 51

[源码] 超级动态调整

[复制链接]
发表于 2022-4-30 16:27:36 | 显示全部楼层 |阅读模式
本帖最后由 20060510412 于 2022-5-7 20:28 编辑

在既有源代码基础上进行了改进,源代码里面有原作者信息,在此表示感激。






1.支持对文字高度、标注比例、线型比例、填充比例、块缩放比例进行动态调整。
2.支持先选择对象后执行。
3.可以批量选择多个同类型图元(例如单行文本),然后同时动态调整这些文本的高度。ps:执行批量操作,需要首先选择所有的目标对象,然后再执行命令。








本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
start4444 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-5-1 20:19:25 | 显示全部楼层
  1. ;;;duotu007 ver1.0 2012/9/6(原著)
  2. ;;;1028695446   ver2.0 2019/4/4(修改)
  3. (defun c:tt (/ bl_update bl_update_time_batch boolean_typeofss ent error_do main_process main_process_batch ss text_update color text textent)
  4.   ;启用错误处理之后,导致无法先选择后执行,具体原因还不得而知。
  5.   ;(error_init 'error_do 1)
  6.   (defun error_do ()
  7.     (redraw)
  8.     (if text (entdel text));删除临时文字
  9.     (princ)
  10.   )
  11.   ;;-------------------
  12.   (defun bl_update (tp bl);;子函数,更新比例为绝对值bl
  13.     (cond
  14.       ((member tp '("REGION" "LWPOLYLINE" "LINE" "CIRCLE" "ARC"))
  15.         (vla-put-LinetypeScale obj bl);;设定线型比例
  16.       )
  17.       ((= tp "HATCH")
  18.         (vla-put-PatternScale obj bl);;设定填充比例
  19.       )
  20.       ((= tp "INSERT")
  21.         (vla-put-xscalefactor obj bl);;设定图块比例x
  22.         (vla-put-yscalefactor obj bl);;设定图块比例y
  23.         (vla-put-zscalefactor obj bl);;设定图块比例z
  24.       )
  25.       ((member tp '("TEXT" "MTEXT"))
  26.         (vla-put-Height obj bl)
  27.       )
  28.       ((wcmatch tp "*DIMENSION")
  29.         (vla-put-ScaleFactor obj bl)
  30.       )
  31.     )
  32.   )
  33.   ;;---------------------------------
  34.   (defun bl_update_time_batch (list_ent list_bl bl / tp);;子函数,对选择集内的图元,批量更新比例为原始比例的bl倍
  35.     (setq tp (dxf1 (entget (nth 0 list_ent)) 0))
  36.     (cond
  37.       ((member tp '("REGION" "LWPOLYLINE" "LINE" "CIRCLE" "ARC"))
  38.         (mapcar '(lambda (x y) (vla-put-LinetypeScale (en2obj x) (* y bl))) list_ent list_bl)
  39.       )
  40.       ((= tp "HATCH")
  41.         (mapcar '(lambda (x y) (vla-put-PatternScale (en2obj x) (* y bl))) list_ent list_bl)
  42.       )
  43.       ((= tp "INSERT")
  44.         (mapcar '(lambda (x y) (vla-put-xscalefactor (en2obj x) (* y bl))) list_ent (nth 0 list_bl))
  45.         (mapcar '(lambda (x y) (vla-put-yscalefactor (en2obj x) (* y bl))) list_ent (nth 1 list_bl))
  46.         (mapcar '(lambda (x y) (vla-put-zscalefactor (en2obj x) (* y bl))) list_ent (nth 2 list_bl))
  47.       )
  48.       ((member tp '("TEXT" "MTEXT"))
  49.         (mapcar '(lambda (x y) (vla-put-Height (en2obj x) (* y bl))) list_ent list_bl)
  50.       )
  51.       ((wcmatch tp "*DIMENSION")
  52.         ;(vla-put-ScaleFactor obj bl)
  53.         (mapcar '(lambda (x y) (vla-put-ScaleFactor (en2obj x) (* y bl))) list_ent list_bl)
  54.       )
  55.     )
  56.   )
  57.   ;;-------------------
  58.   (defun text_update (str / );;子函数,更新临时文字
  59.     (if color (princ) (setq color 1))
  60.     ;(setq str (rtos bl))
  61.     (if text;文字显示
  62.       (progn
  63.         (setq textent (subst (cons 1 str)   (assoc 1  textent) textent))
  64.         (setq textent (subst (cons 62 color) (assoc 62 textent) textent))
  65.         (setq textent (subst (cons 40 (/ (getvar "viewsize") 30)) (assoc 40 textent) textent))
  66.         ;鼠标移动的时候,更新坐标,使其跟随鼠标移动;敲击键盘的时候,不更新坐标
  67.         (if (= a 5) (setq textent (subst (cons 10 aa) (assoc 10 textent) textent)))
  68.         ;(if flag_dynamic (setq textent (subst (cons 10 aa)(assoc 10 textent) textent)));启用动态比例
  69.         (entmod textent)
  70.       );第二遍已有,修改内容
  71.       (progn
  72.         (entmake
  73.           (list
  74.             '(0 . "TEXT")
  75.             (cons 1 str)
  76.             ;鼠标移动的时候,更新坐标,使其跟随鼠标移动;其他情况,坐标为图元的坐标
  77.             (if (= a 5) (cons 10 aa) (cons 10 pt0))
  78.             ;(if flag_dynamic (cons 10 aa)(cons 10 pt0))
  79.             (cons 40 (/ (getvar "viewsize") 30));;字体大小,同视图比例相关
  80.             (cons 41 0.7) ;;字高
  81.             (cons 50 0);;字旋转角度
  82.             (cons 62 color)
  83.           )
  84.         )
  85.         (setq text (entlast) textent (entget text))
  86.       );第一遍文字不存在先生成
  87.     )
  88.   )
  89.   ;判断选择集是否均为同一图元类型----------
  90.   (defun boolean_typeOfSs (ss str_type / ent flag index tp)
  91.     (setq flag T)
  92.     (setq index 0)
  93.     (while (and flag (setq ent (ssname ss index)))
  94.       (setq tp (dxf1 (entget ent) 0))
  95.       (if
  96.         (not
  97.           (if (= str_type "*DIMENSION")
  98.             (wcmatch tp "*DIMENSION")
  99.             (= tp str_type)
  100.           )
  101.         )
  102.         (setq flag nil)
  103.       )
  104.       (setq index (1+ index))
  105.     )
  106.     flag
  107.   )
  108.   ;针对单一图元的处理流程-----------
  109.   (defun main_process (ent pt0 / a aa bl color elist flag_circulate flag_dynamic flag_secondclick mouse tp obj point_base)
  110.     (setq elist (entget ent))
  111.     (setq tp (dxf1 elist 0))
  112.     (setq obj (en2obj ent))
  113.     (setq flag_dynamic nil);;默认启用动态比例
  114.     (setq flag_secondClick nil) ;第二次鼠标左键,结束程序
  115.     (cond
  116.       ;获得标注的全局比例
  117.       ((wcmatch tp "*DIMENSION")
  118.         (if (= (setq bl (vla-get-ScaleFactor (en2obj ent))) nil) (setq bl 1))
  119.       )
  120.       ((member tp '("TEXT" "MTEXT")) ;取文字高度值作为实际比例
  121.         (if (= (setq bl (dxf1 elist 40)) nil)
  122.           (setq bl 1)
  123.         )
  124.       )  
  125.       ((member tp '("REGION" "LWPOLYLINE" "LINE" "CIRCLE" "ARC"))
  126.         (if (= (setq bl (dxf1 elist 48)) nil)
  127.           (setq bl 1)
  128.         )
  129.       )
  130.       
  131.       ((member tp '("HATCH" "INSERT"))
  132.         (setq bl (dxf1 elist 41) flag_dynamic nil)
  133.       );;注意,这要关闭,因为初始不能为0
  134.       (t (alert "\n 选择错误..."))
  135.     )
  136.     (if bl
  137.       (progn
  138.         (setq flag_circulate T)
  139.         (while flag_circulate
  140.           (setq mouse (grread T 12 0))
  141.           (setq a (car mouse) aa (cadr mouse))
  142.           (cond
  143.             ;按键d或者D字高增加一倍
  144.             ((and (= 2 a) (or (= 100 aa) (= 68 aa)))  ;2表示键盘输入,'(2 100)表示d键,'(2 68)表示D键
  145.               (setq flag_dynamic nil);;关闭动态比例
  146.               (setq bl (* bl 2))
  147.               (bl_update tp bl)
  148.               (text_update (rtos bl));;更新文字
  149.             )
  150.             ;按键w或者W字高缩小一倍
  151.             ((and (= 2 a) (or (= 120 aa) (= 88 aa)))  ;2表示键盘输入,'(2 120)表示x键,'(2 88)表示X键
  152.               (setq flag_dynamic nil);;关闭动态比例
  153.               (setq bl (/ bl 2))
  154.               ;(if(= tp "INSERT")(if (< 0 (1- bl))(setq bl (1- bl)))(setq bl (/ bl 2)));;块单独区分,加减更适用
  155.               ;(if (< bL 0.01)(setq bL 0.01));;防止比例为太杂****************************************
  156.               (bl_update tp bl)
  157.               (text_update (rtos bl));;更新文字
  158.             )
  159.             ;按键e或者E指定比例
  160.             ((and (= 2 a) (or (= 101 aa) (= 69 aa)))
  161.               (setq flag_dynamic nil);;关闭动态比例
  162.               (setq bl (getreal "\n 指定缩放比例:"))
  163.               (bl_update tp bl)
  164.               (text_update (rtos bl));;更新文字
  165.             )
  166.             ((and (= a 5) flag_dynamic);鼠标移动和启用动态比例
  167.               (redraw)
  168.               (grdraw point_base aa 1);画向量
  169.               (setq bl (distance point_base aa))
  170.               (cond
  171.                 ((and (< 0 bl) (< bl 0.1))
  172.                   (setq bl (* (fix (/ bl 0.01)) 0.01) color 1);规范0~1之间取值,模数=0.1
  173.                 )
  174.                 ((and (<= 0.1 bl) (< bl 1))
  175.                   (setq bl (* (fix (/ bl 0.1)) 0.1) color 2);规范0~1之间取值,模数=0.1
  176.                 )
  177.                 ((and(<= 1 bl) (< bl 10))
  178.                   (setq bl (* (fix (/ bl 0.5)) 0.5) color 3);规范1~10之间取值,模数=0.5
  179.                 )
  180.                 ((and(<= 10 bl) (< bl 20))
  181.                   (setq bl (fix bl) color 4);规范10~20之间取值,模数=1
  182.                 )
  183.                 ((and(<= 20 bl) (< bl 100))
  184.                   (setq bl (* (fix (/ bl 5)) 5) color 4);规范20~100之间取值,模数=5
  185.                 )
  186.                 ((<= 100 bl)
  187.                   (setq bl (* (fix (/ bl 10)) 10) color 6);规范20~100之间取值,模数=10
  188.                 )
  189.                 ((= 0 bl) (setq bl 1 color 6))
  190.               )
  191.               (bl_update tp bl);;更新比例
  192.               (text_update (rtos bl));;更新文字
  193.             )
  194.             ((and (= a 5) (not flag_dynamic));鼠标移动,不启用动态比例
  195.               (text_update (strcat "当前比例:" (rtos bl 2 2) "\n【放大(D)/缩小(X)/指定(E)/动态(左键)/退出(空格)】"));;更新文字
  196.             )
  197.             ((= a 3)  ;鼠标左键,启用动态比例
  198.               (setq flag_dynamic T)
  199.               (setq point_base aa)
  200.               (if (= flag_secondClick nil)  ;识别第二次点击鼠标左键
  201.                 (setq flag_secondClick T)
  202.                 (setq flag_circulate nil)
  203.               )
  204.             )
  205.             ((or
  206.                (= 25 a) (= 11 a) ;右键
  207.                (and (= a 2) (= aa 13));回车
  208.                (and (= a 2) (= aa 32));或空格
  209.              )
  210.               (setq flag_circulate nil)
  211.             )
  212.           )
  213.         )
  214.       )
  215.       (alert "\n 比例不能为0")
  216.     )
  217.     (redraw)
  218.     (if text (entdel text));删除临时文字
  219.     (princ)
  220.   )
  221.   ;对选择集的批量处理,以相对的缩放倍数为基准
  222.   (defun main_process_batch (ss pt0 / a aa bl color flag_circulate flag_dynamic flag_secondclick list_bl list_ent mouse tp point_base)
  223.     (setq list_ent (ss-enlst ss))
  224.     (setq tp (dxf1 (entget (nth 0 list_ent)) 0))
  225.     (cond
  226.       ((member tp '("REGION" "LWPOLYLINE" "LINE" "CIRCLE" "ARC"))
  227.         (setq list_bl (mapcar '(lambda (x) (vla-get-LinetypeScale (en2obj x))) list_ent))
  228.       )
  229.       ((= tp "HATCH")
  230.         (setq list_bl (mapcar '(lambda (x) (vla-get-PatternScale (en2obj x))) list_ent))
  231.       )
  232.       ((= tp "INSERT")
  233.         (setq list_bl
  234.           (list
  235.             (mapcar '(lambda (x) (vla-get-xscalefactor (en2obj x))) list_ent)
  236.             (mapcar '(lambda (x) (vla-get-yscalefactor (en2obj x))) list_ent)
  237.             (mapcar '(lambda (x) (vla-get-zscalefactor (en2obj x))) list_ent)
  238.           )
  239.         )
  240.       )
  241.       ((member tp '("HATCH" "INSERT"))
  242.         (setq list_bl (mapcar '(lambda (x) (vla-get-Height (en2obj x))) list_ent))
  243.       )
  244.       ((wcmatch tp "*DIMENSION")
  245.         ;(vla-put-ScaleFactor obj bl)        
  246.         (setq list_bl (mapcar '(lambda (x) (vla-get-ScaleFactor (en2obj x))) list_ent))
  247.       )
  248.     )
  249.     (setq flag_dynamic nil);;默认启用动态比例
  250.     (setq flag_secondClick nil) ;第二次鼠标左键,结束程序
  251.     (setq bl 1)
  252.     (setq flag_circulate T)
  253.     (while flag_circulate
  254.       (setq mouse (grread T 12 0))
  255.       (setq a (car mouse) aa (cadr mouse))
  256.       (cond
  257.         ;按键q或者Q字高增加一倍
  258.         ((and (= 2 a) (or (= 100 aa) (= 68 aa)))  ;2表示键盘输入,'(2 100)表示d键,'(2 68)表示D键
  259.           (setq flag_dynamic nil);;关闭动态比例
  260.           (setq bl (* bl 2))
  261.           (bl_update_time_batch list_ent list_bl bl)
  262.           (text_update (rtos bl));;更新文字
  263.         )
  264.         ;按键w或者W字高缩小一倍
  265.         ((and (= 2 a) (or (= 120 aa) (= 88 aa)))  ;2表示键盘输入,'(2 120)表示x键,'(2 88)表示X键
  266.           (setq flag_dynamic nil);;关闭动态比例
  267.           (setq bl (/ bl 2))
  268.           ;(if(= tp "INSERT")(if (< 0 (1- bl))(setq bl (1- bl)))(setq bl (/ bl 2)));;块单独区分,加减更适用
  269.           ;(if (< bL 0.01)(setq bL 0.01));;防止比例为太杂****************************************
  270.           (bl_update_time_batch list_ent list_bl bl)
  271.           (text_update (rtos bl));;更新文字
  272.         )
  273.         ;按键e或者E指定比例
  274.         ((and (= 2 a) (or (= 101 aa) (= 69 aa)))
  275.           (setq flag_dynamic nil);;关闭动态比例
  276.           (setq bl (getreal "\n 指定缩放比例:"))
  277.           (bl_update_time_batch list_ent list_bl bl)
  278.           (text_update (rtos bl));;更新文字
  279.         )
  280.         ((and(= a 5) flag_dynamic);鼠标移动和启用动态比例
  281.           (redraw)
  282.           (grdraw point_base aa 1);画向量
  283.           (setq bl (distance point_base aa))
  284.           (cond
  285.             ((and (< 0 bl) (< bl 0.1))
  286.               (setq bl (* (fix (/ bl 0.01)) 0.01) color 1);规范0~1之间取值,模数=0.1
  287.             )
  288.             ((and (<= 0.1 bl) (< bl 1))
  289.               (setq bl (* (fix (/ bl 0.1)) 0.1) color 2);规范0~1之间取值,模数=0.1
  290.             )
  291.             ((and (<= 1 bl) (< bl 10))
  292.               (setq bl (* (fix (/ bl 0.5)) 0.5) color 3);规范1~10之间取值,模数=0.5
  293.             )
  294.             ((and (<= 10 bl) (< bl 20))
  295.               (setq bl (fix bl) color 4);规范10~20之间取值,模数=1
  296.             )
  297.             ((and (<= 20 bl) (< bl 100))
  298.               (setq bl (* (fix (/ bl 5)) 5) color 4);规范20~100之间取值,模数=5
  299.             )
  300.             ((<= 100 bl)
  301.               (setq bl (* (fix (/ bl 10)) 10) color 6);规范20~100之间取值,模数=10
  302.             )
  303.             ((= 0 bl) (setq bl 1 color 6))
  304.           )
  305.           (bl_update_time_batch list_ent list_bl bl);;更新比例
  306.           (text_update (rtos bl));;更新文字
  307.         )
  308.         ((and (= a 5) (not flag_dynamic));鼠标移动,不启用动态比例
  309.           (text_update (strcat "当前变化倍数:" (rtos bl 2 2) "\n【放大(D)/缩小(X)/指定(E)/动态(左键)/退出(空格)】"));;更新文字
  310.         )
  311.         ((= a 3)  ;鼠标左键,启用动态比例
  312.           (setq flag_dynamic T)
  313.           (setq point_base aa)
  314.           (if (= flag_secondClick nil)  ;识别第二次点击鼠标左键
  315.             (setq flag_secondClick T)
  316.             (setq flag_circulate nil)
  317.           )
  318.         )
  319.         ((or
  320.            (= 25 a) (= 11 a) ;右键
  321.            (and (= a 2) (= aa 13));回车
  322.            (and (= a 2) (= aa 32));或空格
  323.          )
  324.           (setq flag_circulate nil)
  325.         )
  326.       )
  327.     )
  328.     (redraw)
  329.     (if text (entdel text));删除临时文字
  330.     (princ)
  331.   )
  332.   ;;!!!!!!!!!!!主程序------------------
  333.   (princ (slmsg "\n 选择修改比例的实体" "\n 選擇修改比例的實體"))
  334.   (setq ss (ssget ":S"))
  335.   (cond
  336.     ((= (sslength ss) 1)
  337.       (setq nam (ssname ss 0))
  338.       (main_process nam (e-mid nam))
  339.     )
  340.     ((> (sslength ss) 1)
  341.       (if
  342.         (or
  343.           (boolean_typeOfSs ss "*DIMENSION")
  344.           (boolean_typeOfSs ss "TEXT")
  345.           (boolean_typeOfSs ss "MTEXT")
  346.           (boolean_typeOfSs ss "REGION")
  347.           (boolean_typeOfSs ss "LWPOLYLINE")
  348.           (boolean_typeOfSs ss "LINE")
  349.           (boolean_typeOfSs ss "CIRCLE")
  350.           (boolean_typeOfSs ss "ARC")
  351.           (boolean_typeOfSs ss "HATCH")
  352.           (boolean_typeOfSs ss "INSERT")
  353.         )
  354.         (main_process_batch ss '(0 0 0))
  355.         (main_process (ssname ss 0) '(0 0 0))
  356.       )
  357.     )
  358.   )
  359. )
选择集处理部分,测试不成功,还有,实体类型支持过少点,剩余不支持类型可以整合
  • (command "scale" ss "" "non" pt0 pause)  思路处理如何?



发表于 2022-5-4 13:08:02 | 显示全部楼层
额。。。。。。。。。。
(setq list_ent (pickset_2list ss))缺函数 pickset_2list


;选择集与对象名表互转
(defun pickset_2list (ss / enlst)
        (cond
                ((= (type ss) 'PICKSET)
                        (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex SS)))
                )
                ((= (type ss) 'LIST)
                        (setq enlst (ssadd))
                        (last (mapcar '(lambda (x) (ssadd x enlst)) ss))
                )
        )
)
发表于 2022-5-8 11:50:37 | 显示全部楼层
本帖最后由 andyzha 于 2022-5-8 11:54 编辑
20060510412 发表于 2022-5-7 20:24
在源代码中搜索这个文本所在的行,把那一行注释掉就行了

我已经删掉了,但是选择对象后还会间断一下,不是马上就进入缩放状态,如何修改中间的停顿呢?应该是为了显示这段临时文字做的停顿。

个人觉得第一个临时文字有些赘余,显示缩放比例的临时文字应该保留,本来这个程序就是为了集多种对象缩放为一个命令的超级调整,应该保持简洁高效的风格,一针见血,直达操作的目的本源,期待你的后期优化。
发表于 2022-4-30 18:06:55 | 显示全部楼层
谢谢,挺好用的,我CAD调整图案填充的时候不动态显示
发表于 2022-5-1 08:31:25 | 显示全部楼层
已下载 用用看
发表于 2022-5-1 09:33:58 | 显示全部楼层
很不錯,謝謝你的分享!
发表于 2022-5-1 17:18:29 | 显示全部楼层
本帖最后由 ynhh 于 2022-5-1 17:21 编辑

单行文字也只能处理一个
不能如你动画中的可框选啊
不能多选就意义不大了
你说的第3条无法做到,请你再看看
 楼主| 发表于 2022-5-1 17:24:14 | 显示全部楼层
本帖最后由 20060510412 于 2022-5-1 17:28 编辑
ynhh 发表于 2022-5-1 17:18
单行文字也只能处理一个
不能如你动画中的可框选啊
不能多选就意义不大了

批量处理,需要先选择,再执行命令。

主要是考虑到选择同类型的图元,手工不容易做到。
将选择动作放在执行命令之前,也可以方便使用小菜选择易之类的插件,进行批量选取。
发表于 2022-5-1 22:08:18 | 显示全部楼层
66666666666666666
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 15:23 , Processed in 0.189014 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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