1506822004 发表于 2023-2-5 19:28:16

下划线加反应器自动更新(功能实现但是有点bug)



下划线的代码是@zj20190405在http://bbs.mjtd.com/forum.php?mod=viewthread&tid=172505&highlight=%CF%C2%BB%AE%CF%DF
帖子里发布的,不知道是不是他的原创,取用了就感谢一下!

这两天刚学到反应器,就想着能不能加一个,然后就有了下面这个代码


刚学autolisp不久,写的乱七八糟的,好歹功能是实现了,但是有以下问题
1:源代码是可以批量下划线的,我的反应器没有写循环,所有只能实现最后一下文字划线自动更新
2:没有写单行文字的,只写了多行文字的,自定义变量太多了,脑子昏,以后有机会完善吧
3:!一个神奇的bug:有时候会自动更新,有时候最后还需要编辑一次文本,或者移动它才会更新图元,我明明加了(entmod)啊!

1506822004 发表于 2023-2-5 19:29:28

;下划线程序
(vl-load-com)
(defun c:xxx ( / i n pt_bc pt_bl pt_br pt_mc pt_tc pttl pttr roundspace ss1 tbox txtentdata txtentname txtenttype xangle xheight xwidth)
(setq ss1 (ssget '((0 . "*TEXT"))))
(setq text (entlast))
(if (null ss1)
    (progn
      (princ "\n没有文本实体被选择!")
      (exit)
    )                                        ; end progn
)                                        ; end if
(setq n (sslength ss1))
(if (not (= nil n))                        ; no select objects
    (progn
      (setq i 0)
      (while (< i n)
      (setq txtentname (ssname ss1 i))
      (setq txtentdata (entget txtentname))
      (setq i (+ i 1))
      (setq txtenttype (cdr (assoc 0 txtentdata)))
                                        ; get entity's name:
                                        ; "text" or "mtext"
      (if (= txtenttype "TEXT")      ; this object is simple line text
          (progn
            (vl-cmdf "ucs" "Object" txtentname)
                                        ; 定义用户坐标系到文本的方?
            (setq tbox      (textbox (list (car txtentdata)))
                                        ; must change to a list
                  pt_bl      (car tbox)      ; left bottom point coords
                  pttr      (cadr tbox)      ; right top point coords
                  pttl      (list (car pt_bl) (cadr pttr))
                  pt_br      (list (car pttr) (cadr pt_bl))
            )                              ; end setq
            (setq roundspace (* 0.2 (distance pt_bl pttl)))
            (setq pt_bl (polar pt_bl pi (* roundspace 2)))
            (setq pt_bl (polar pt_bl (* pi 1.5) roundspace))
            (setq pt_br (polar pt_br 0.0 (* roundspace 2)))
            (setq pt_br (polar pt_br (* pi 1.5) roundspace)) ;
            (vl-cmdf "pline"
                     pt_bl
                     "w"
                     (* roundspace 0.25)
                     ""
                     pt_br
                     ""
            )
            (vl-cmdf "CHPROP" (entlast) "" "C" "BYBlock" "")
            (vl-cmdf "pline"
                     (polar pt_bl (* pi 1.5) (* roundspace 0.6))
                     "w"
                     0
                     ""
                     (polar pt_br (* pi 1.5) (* roundspace 0.6))
                     ""
            )
            (vl-cmdf "CHPROP" (entlast) "" "C" "BYBlock" "")
            (vl-cmdf "ucs" "p")
          )                              ; end progn
          (progn
            (vl-cmdf "_.JustifyText" txtentname "" "TL")
                                        ; 处理为对对齐模式.
            (setq txtentdata (entget txtentname))
            (setq pttl          (cdr (assoc 10 txtentdata));文字第一对其点y坐标
                  xwidth(cdr (assoc 42 txtentdata));文字水平宽度
                  xheight (cdr (assoc 43 txtentdata));文字水平高度
                  xangle(cdr (assoc 50 txtentdata));文字旋转角度
                  pt_tc          (polar pttl xangle (* xwidth 0.5))
                  pttr          (polar pttl xangle xwidth)
                  pt_bl          (polar pttl (- xangle (/ pi 2.0)) xheight)
                  pt_bc          (polar pt_bl xangle (* xwidth 0.5))
                  pt_br          (polar pt_bl xangle xwidth)
                  pt_mc          (polar pt_bl (angle pt_bl pttr) (/ (distance pt_bl pttr ) 2.0 ))                ; end polar
            )
      ; end setq
            (setq roundspace (* 0.2 (distance pt_bl pttl)));字的基准点到第一条直线的垂直距离
            (setq xangle (cdr (assoc 50 txtentdata)))
            (setq pt_bl (polar pt_bl xangle (- roundspace)))
            (setq
            pt_bl (polar pt_bl (+ xangle (/ pi 2.0)) (- roundspace))
            );第一条直线的左端点
            (setq pt_br (polar pt_br xangle roundspace))
            (setq pt_br (polar pt_br (+ xangle (/ pi 2.0)) (- roundspace)));第一条直线的右端点
            (setq pttl (polar pttl xangle (- roundspace)))
            (setq pttl (polar pttl (+ xangle (/ pi 2.0)) roundspace))
            (setq pttr (polar pttr xangle roundspace))
            (setq pttr (polar pttr (+ xangle (/ pi 2.0)) roundspace)) ;
            (vl-cmdf "pline" pt_bl "w" (* roundspace 0.25) "" pt_br "");画第一条直线
      (setq eh1(cdr(assoc 5(entget(entlast)))));第一条直线的句柄
      (setq pt_bl1 (polar pt_bl (* pi 1.5) (* roundspace 0.6)))
      (setq pt_br1 (polar pt_br (* pi 1.5) (* roundspace 0.6)))
            (vl-cmdf "CHPROP" (entlast) "" "C" "BYBlock" "")
      (vl-cmdf "pline" pt_bl1"w" 0 "" pt_br1 "");画第二条直线
      (setq eh2(cdr(assoc 5(entget(entlast)))));第二条直线的句柄
            (vl-cmdf "CHPROP" (entlast) "" "C" "BYBlock" "")
                                        ; end command
          )                              ; end progn
      )                              ; end if
      )                                        ; end while
    )                                        ; end progn
); end if
(vl-cmdf "ucs" "W")
    (setq l1-l2(list eh1 eh2));两条直线的句柄表
(setq rlt(list(vlax-ename->vla-object text)));字的图元名转换为VLA对象
(setq vrl(vlr-pers(vlr-object-reactor rlt l1-l2 '((:vlr-modified . c-2l)))));反应器链接到圆上,两条直线的句柄表为关联数据,当发生修改该圆
(princ)
)

;反应器
;         
(defun c-2l(notifier-object reactor-object parameter-list /)
(setq text(vlax-vla-object->ename notifier-object);VLA对象转换
    ec_l (entget text);新字的图元表
      pttl_1          (cdr (assoc 10 ec_l));文字第一对其点y坐标
                  xwidth_1(cdr (assoc 42 ec_l));文字水平宽度
                  xheight_1 (cdr (assoc 43 ec_l));文字水平高度
                  xangle_1(cdr (assoc 50 ec_l));文字旋转角度
                  pt_tc_1          (polar pttl_1 xangle_1 (* xwidth_1 0.5))
                  pttr_1          (polar pttl_1 xangle_1 xwidth_1)
                  pt_bl_1          (polar pttl_1 (- xangle_1 (/ pi 2.0)) xheight_1)
                  pt_bc_1          (polar pt_bl_1 xangle_1 (* xwidth_1 0.5))
                  pt_br_1          (polar pt_bl_1 xangle_1 xwidth_1)
                  pt_mc_1          (polar pt_bl_1 (angle pt_bl_1 pttr_1) (/ (distance pt_bl_1 pttr_1 ) 2.0 ))                ; end polar
            )
(setq el1(handent(car(vlr-data reactor-object))));第一条直线的图元名
(setq el2(handent(cadr(vlr-data reactor-object))));第二条直线的图元名

    (setq roundspace_1 (* 0.2 (distance pt_bl_1 pttl_1)));字的基准点到第一条直线的垂直距离
            

(setq pt_bl_1 (polar pt_bl_1 xangle_1 (- roundspace_1)))
(setq pt_bl_1 (polar pt_bl_1 (+ xangle_1 (/ pi 2.0)) (- roundspace_1)));更改第一条直线的左端点
      (setq pt_br_1 (polar pt_br_1 xangle_1 roundspace_1))
      (setq pt_br_1 (polar pt_br_1 (+ xangle_1 (/ pi 2.0)) (- roundspace_1)));第一条直线的右端点
(setq ell_1(entget el1));第一条直线的图元表
(setq ell_1(subst(vl-list* 10 pt_bl_1)(assoc 10 ell_1)ell_1));直线的新端点
(setq ell_1(reverse ell_1))
(setq ell_1(subst(vl-list* 10 pt_br_1)(assoc 10 ell_1)ell_1))
(setq ell_1(reverse ell_1))
(entmod ell_1);更新第一条直线
(setq ell_2(entget el2));第二条直线的图元表
    (setq pt_bl1_1 (polar pt_bl_1 (* pi 1.5) (* roundspace_1 0.6)))
(setq pt_br1_1 (polar pt_br_1 (* pi 1.5) (* roundspace_1 0.6)))
(setq ell_2(subst(vl-list* 10 pt_bl1_1)(assoc 10 ell_2)ell_2));直线的新端点替换直线
(setq ell_2(reverse ell_2))
(setq ell_2(subst(vl-list* 10 pt_br1_1)(assoc 10 ell_2)ell_2))
(setq ell_2(reverse ell_2))
(entmod ell_2);更新第二条直线
)

lxl217114 发表于 2023-2-5 19:39:26

谢谢分享,这个功能好

sunny_8848 发表于 2023-2-5 19:43:52

实用的功能,多谢分享

中国梦 发表于 2023-2-5 21:51:30

谢谢楼主分享

sandyvs 发表于 2023-2-5 21:58:18

这个不错,不过还有个问题,整体移动会有问题

sandyvs 发表于 2023-2-5 22:09:02

这个也是整体移动有问题,但是是间歇的,第一次移动有问题,第二次就好了,第三次有问题,第四次又好了。。http://bbs.mjtd.com/forum.php?mod=viewthread&tid=109731&highlight=%B7%B4%D3%A6%C6%F7

hzyhzjjzh 发表于 2023-2-6 13:11:12

谢谢楼主分享{:1_1:}

paulpipi 发表于 2023-2-6 13:52:36

谢谢高人分享

ferious 发表于 2023-10-26 16:58:06

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=90348&highlight=%B7%B4%D3%A6%C6%F7&_dsign=64771105
求助反应器entmod无法更新图元(已解决)
页: [1] 2
查看完整版本: 下划线加反应器自动更新(功能实现但是有点bug)