明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 359|回复: 7

改进版,增量刷,支持原程序不支持框选首部增量!并增加提示功能!

  [复制链接]
发表于 昨天 07:35 | 显示全部楼层 |阅读模式
本帖最后由 小毛草 于 2025-10-30 19:11 编辑
  1. ;;****************************************************************递增刷
  2. ;;; 名称:递增刷(可框选)
  3. ;;; 功能:刷文本末尾或首部的数字递增指定值
  4. ;;; ______________________________________
  5. (defun c:QF (/ a b bb box c co col cv dbak dcl_re dclname e e1 e2 en ent ent1 errsub filen fun i key kk l l1 len lst lst1 lst2 lst3
  6.          msg name newlist orerr pix pt pt1 pt2 s sbak si ss ss1 ssparm st2 st3 st4 stream tempname txt1 txt2 txt3 txtlong vvs
  7.          wbak x y zz current-kk temp-text-obj
  8.       )
  9.     (vl-load-com)
  10.     (setvar 'cecolor "BYLAYER")
  11.     (setvar "shortcutmenu" 0);;;;自定义右键单击(2.选定对象,单击右键为菜单)
  12.     (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  13.      ; ,caoyin老大明经"拜新年"帖子提供,langjs修改
  14.     (defun d_brush (col x y len / a b c)
  15.       (grvecs (list col (list (- x (setq a (* len 1.5))) (- y len)) (list (- x a) (setq b (- y (* len 7.5)))) col (list (- x
  16.                                  (setq c
  17.                                  (* len 0.5)
  18.                                  )
  19.                               ) y
  20.                               ) (list (- x c) b)
  21.         col (list (+ x c) y) (list (+ x c) b) col (list (+ x a) (- y len)) (list (+ x a) b) col (list (- x (setq a
  22.                                    (* len
  23.                                 4.5
  24.                                    )
  25.                                    )
  26.                               ) b
  27.                               ) (list (+ x a) b) col
  28.         (list (- x a) b) (list (- x (setq c (* len 6.5))) (- y (* len 9))) col (list (+ x a) b) (list (+ x c)
  29.                               (setq a (- y
  30.                                    (* len 9)
  31.                                 )
  32.                               )
  33.                               ) col (list (- x c) a)
  34.         (list (- x c) (setq b (- y (* len 17)))) col (list (+ x c) a) (list (+ x c) b) col (list (- x c) (setq a
  35.                                  (- y
  36.                                     (* len
  37.                                  10
  38.                                     )
  39.                                  )
  40.                                  )
  41.                                ) (list (+ x c) a) col
  42.         (list (- x c) (setq a (- y (* len 11)))) (list (+ x c) a) col (list (- x c) (setq a (- y (* len 13))))
  43.         (list (+ x c) a) col (list (- x c) (setq a (- y (* len 14)))) (list (+ x c) a) col (list (- x c) b)
  44.         (list (+ x c) b) col (list (- x c) b) (list (- x (* len 11)) (setq a (- y (* len 21.5)))) col (list (- x
  45.                                  (* len 2)
  46.                               ) b
  47.                               ) (list (- x
  48.                                    (* len
  49.                                 6.5
  50.                                    )
  51.                                 ) a
  52.                                 ) col
  53.         (list (+ x (* len 2)) b) (list (- x (* len 2.5)) a) col (list (+ x c) b) (list (+ x (* len 2)) a) col
  54.         (list (- x (* len 11)) a) (list (+ x (* len 3)) a)
  55.         ) (list (list 1 0 0 (* len 14)) (list 0 1 0 (* len -4)) '(0 0 1 0) '(0 0 0 1))
  56.       )
  57.     )
  58.    
  59.     ;; 创建红色大字体提示(根据屏幕比例)
  60.     (defun create-status-text (position text-content / text-height view-size screen-size)
  61.       ;; 根据屏幕比例计算文字高度
  62.       (setq view-size (getvar "viewsize"))
  63.       (setq screen-size (cadr (getvar "screensize")))
  64.       (setq text-height (* view-size 0.03)) ; 根据视图大小动态调整文字高度
  65.       
  66.       ;; 使用多行文字(MTEXT)来实现更好的多行对齐控制
  67.       (command "_.MTEXT"
  68.                position
  69.                "J" "TL"     ; 对正方式:左上对齐
  70.                "H" text-height ; 文字高度
  71.                "W" "0"      ; 宽度为0(自动换行)
  72.                text-content
  73.                "")
  74.       (setq temp-text-obj (entlast))
  75.       (if temp-text-obj
  76.         (progn
  77.           (entmod (append (entget temp-text-obj) '((62 . 1))))  ; 设置为红色
  78.           temp-text-obj
  79.         )
  80.       )
  81.     )
  82.    
  83.     ;; 删除临时文本
  84.     (defun delete-status-text ()
  85.       (if (and temp-text-obj (entget temp-text-obj))
  86.         (entdel temp-text-obj)
  87.       )
  88.       (setq temp-text-obj nil)
  89.       (redraw)  ; 刷新显示
  90.     )
  91.    
  92.     ;; 更新状态显示
  93.     (defun update-status-display (mode-type position-type step base-point)
  94.       (delete-status-text) ; 先删除旧的提示
  95.       (setq status-text (strcat "模式: " mode-type
  96.                                "\n类型: " position-type
  97.                                "\n步长: " (itoa step)))
  98.       ;; 计算提示文字位置(在基准点的左下方)
  99.       (setq text-position (list
  100.         (- (car base-point) (* (getvar "viewsize") 0.05)) ; 向左偏移
  101.         (- (cadr base-point) (* (getvar "viewsize") 0.1)) ; 向下偏移
  102.         (caddr base-point)))
  103.       (create-status-text text-position status-text)
  104.     )
  105.   
  106.   (defun pickbox (pt / si cv)
  107.       (setq si (* (/ (getvar "pickbox") (cadr (getvar "screensize"))) (getvar "viewsize") 0.5)
  108.       cv (list si si 0)
  109.       )
  110.       (list (mapcar
  111.         '+
  112.         pt
  113.         cv
  114.       ) (mapcar
  115.     '-
  116.     pt
  117.     cv
  118.         )
  119.       )
  120.     )
  121.       (defun p2u (pix)
  122.       (* pix (/ (getvar "viewsize") (cadr (getvar "screensize"))))
  123.     )
  124.   (defun llt:match (pt col ssparm fun / a b c co cv e e1 e2 ent i len lst msg pix pt1 pt2 si ss ss1 x y) ; 带有刷子的ssget功能子程序
  125.     (or
  126.       (setq co (cadr col))
  127.       (setq co 7)
  128.     )
  129.     (or
  130.       (setq col (car col))
  131.       (setq col 7)
  132.     )
  133.     (or
  134.       (setq msg (car ssparm))
  135.       (setq msg "\n选择目标对象: ")
  136.     )
  137.     (setq ssparm (cadr ssparm)
  138.     len (p2u 1)
  139.     x (car pt)
  140.     y (cadr pt)
  141.     )
  142.     (princ msg)
  143.     (while (/= (car pt1) 11)
  144.       (redraw)
  145.       (d_brush col x y len)
  146.       (while (not (member (car (setq pt1 (grread t 12 2))) '(3 11)))
  147.   (setq pt1 (cadr pt1))
  148.   (if (vl-consp pt1)
  149.     (progn
  150.       (if (> (distance pt1 pt) (p2u (* 0.0001 (car (getvar "screensize")))))
  151.         (progn
  152.     (redraw)
  153.     (setq len (p2u 1)
  154.           x (car pt)
  155.           y (cadr pt)
  156.     )
  157.     (d_brush col x y len)
  158.     (setq pt pt1)
  159.         )
  160.       )
  161.     )
  162.   )
  163.       )
  164.       (redraw)
  165.       (if (and
  166.       (= (car pt1) 3)
  167.       (princ msg)
  168.       (not (setq ss1 (apply
  169.            'ssget
  170.            (append
  171.              '("_c")
  172.              (pickbox (cadr pt1))
  173.              (list ssparm)
  174.            )
  175.          )
  176.      )
  177.       )
  178.     )
  179.   (progn
  180.     (princ "指定对角点: ")
  181.     (setq pt1 (list (caadr pt1) (cadadr pt1)))
  182.     (while (not (member (car (setq pt2 (grread t 12 1))) '(3 11)))
  183.       (setq pt2 (list (caadr pt2) (cadadr pt2)))
  184.       (if (vl-consp pt1)
  185.         (progn
  186.     (if (> (distance pt2 pt) (p2u (* 0.0001 (car (getvar "screensize")))))
  187.       (progn
  188.         (redraw)
  189.         (setq len (p2u 1)
  190.         x (car pt)
  191.         y (cadr pt)
  192.         co (abs co)
  193.         )
  194.         (if (> (car pt1) (car pt2))
  195.           (setq co (- co))
  196.         )
  197.         (d_brush col x y len)
  198.         (grvecs (list co pt1 (list (car pt1) (cadr pt2)) co pt2 (list (car pt1) (cadr pt2)) co pt2 (list (car pt2)
  199.                                  (cadr pt1)
  200.                                  ) co pt1
  201.           (list (car pt2) (cadr pt1))
  202.           )
  203.         )
  204.         (setq pt pt2
  205.         ss1 (ssget (if (minusp co)
  206.                "_c"
  207.                "_w"
  208.              ) pt1 pt2 ssparm
  209.             )
  210.         )
  211.       )
  212.     )
  213.         )
  214.       )
  215.     )
  216.   )
  217.       )
  218.       (or
  219.   ss
  220.   (setq ss (ssadd))
  221.       )
  222.       (if ss1
  223.   (progn
  224.     (setq lst '())
  225.     (repeat (setq i (sslength ss1))
  226.       (setq e (ssname ss1 (setq i (1- i))))
  227.       (setq ent (entget e))
  228.       (setq pt1 (cdr (assoc 10 ent)))
  229.       (setq lst (cons (list pt1 e) lst))
  230.     )
  231.     (setq lst (vl-sort lst (function (lambda (e1 e2) ; 框选文本先由上到下排序(其它情况自己修改)
  232.                (> (cadr (car e1)) (cadr (car e2)))
  233.              )
  234.          )
  235.         )
  236.     )
  237.     (setq lst (vl-sort lst (function (lambda (e1 e2) ; 框选文本后由左到右排序(其它情况自己修改)
  238.                (< (car (car e1)) (if (and
  239.                      (>= (car (car e2)) (- (car (car e1)) txtlong))
  240.                      (<= (car (car e2)) (+ (car (car e1)) txtlong))
  241.                    )
  242.                  (car (car e1))
  243.                  (car (car e2))
  244.                      )
  245.                )
  246.              )
  247.          )
  248.         )
  249.     )
  250.     (setq lst (reverse lst))
  251.     (repeat (setq i (length lst))
  252.       (setq e (cadr (nth (setq i (1- i))
  253.              lst
  254.         )
  255.         )
  256.       )
  257.       (ssadd e ss)
  258.       (redraw e 3)
  259.       (apply
  260.         fun
  261.         (list e)
  262.       )
  263.     )
  264.   )
  265.       )
  266.       (setq ss1 nil)
  267.     )
  268.     (redraw)
  269.     ss
  270.   )
  271.   (defun llt:entsel (pt col / a b c col en ent len pix pt x y) ; 带有刷子的entsel功能子程序,caoyin老大提供
  272.     (redraw)
  273.     (setq len (p2u 1)
  274.     x (car pt)
  275.     y (cadr pt)
  276.     )
  277.     (d_brush col x y len)
  278.     (while (not (member (car (setq pt1 (grread t 12 2))) '(3 11)))
  279.       (setq pt1 (cadr pt1))
  280.       (if (vl-consp pt1)
  281.   (progn
  282.     (or
  283.       pt
  284.       (setq pt pt1)
  285.     )
  286.     (setq x (car pt)
  287.     y (cadr pt)
  288.     )
  289.     (if (> (distance pt1 pt) (p2u (* 0.0001 (car (getvar "screensize")))))
  290.       (progn
  291.         (redraw)
  292.         (setq len (p2u 1)
  293.         x (car pt)
  294.         y (cadr pt)
  295.         )
  296.         (d_brush col x y len)
  297.         (setq pt pt1)
  298.       )
  299.     )
  300.   )
  301.       )
  302.     )
  303.     (redraw)
  304.     (and
  305.       (= (car pt1) 3)
  306.       (vl-consp (cadr pt1))
  307.       (setq en (nentselp (cadr pt1)))
  308.     )
  309.     (setq ent (car en))
  310.     (setq pt1 (cadr pt1))
  311.     (if (cadddr en)
  312.       (setq name (cadddr en))
  313.     )
  314.     ent
  315.   )
  316.   (defun errsub (msg)
  317.     (if (not (member msg '("程序中断" "功能撤销"
  318.           "退出 / 中断" ""
  319.          )
  320.        )
  321.   )
  322.       (princ (strcat "\n" msg))
  323.     ); if
  324.     (delete-status-text) ; 错误时也删除提示文本
  325. (vla-EndUndoMark      
  326.     (vla-get-ActiveDocument (vlax-get-acad-object))
  327.   )  
  328.     (setvar "shortcutmenu" 2)
  329.     (redraw)
  330.     (setq *error* orerr)
  331.     (prin1)
  332.   )
  333.   (defun show_list (key newlist)
  334.     (start_list key)
  335.     (mapcar
  336.       'add_list
  337.       newlist
  338.     )
  339.     (end_list)
  340.   )
  341.   (defun jys001 (x kk / ent txt1 txt3 zz) ; 首部框
  342.     (setq ent (entget x))
  343.     (setq txt1 (cdr (assoc 1 ent)))
  344.     (setq zz 1)
  345.     (while (or
  346.        (> (atoi (substr txt1 zz 1)) 0)
  347.        (= (substr txt1 zz 1) "0")
  348.      )
  349.       (setq zz (+ zz 1))
  350.     )
  351.     (if (> zz (strlen txt1))
  352.       (setq txt3 kk)
  353.       (setq txt3 (strcat kk (substr txt1 zz)))
  354.     )
  355.     (entmod (subst
  356.         (cons 1 txt3)
  357.         (assoc 1 ent)
  358.         ent
  359.       )
  360.     )
  361.   )
  362.   (defun jys002 (x / ent txt3)         ; 尾部框
  363.     (if (and
  364.     (setq ent (entget x))
  365.     (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT"))
  366.   )
  367.       (progn
  368.   (setq kk (jys003 kk sbak))
  369.   (if (= zz 0)
  370.     (setq txt3 kk)
  371.     (setq txt3 (strcat txt2 kk))
  372.   )
  373.   (entmod (subst
  374.       (cons 1 txt3)
  375.       (assoc 1 ent)
  376.       ent
  377.     )
  378.   )
  379.       )
  380.     )
  381.   )
  382.   (defun jys003 (st2 sbak / l l1 s st3 st4) ; 处理尾部数字
  383.     (setq st3 st2
  384.     s "0"
  385.     st4 ""
  386.     l (strlen st2)
  387.     )
  388.     (while (eq s "0")
  389.       (setq s (substr st3 1 1)
  390.       st3 (substr st3 2)
  391.       st4 (if (eq s "0")
  392.       (strcat st4 s)
  393.       st4
  394.     )
  395.       )
  396.     )               ; 将首位是0的数字分离出来
  397.     (setq st2 (atoi st2)
  398.     st2 (+ st2 sbak)
  399.     st2 (itoa st2)
  400.     st2 (strcat st4 st2)
  401.     l1 (strlen st2)
  402.     s (substr st2 1 1)
  403.     )
  404.     (if (and
  405.     (= s "0")
  406.     (> l1 l)
  407.   )
  408.       (setq st2 (substr st2 2))
  409.     )               ; 处理了形如A09变为A10的问题
  410.     st2
  411.   )
  412.   
  413.   ;; 修改后的函数:处理首部框选的递增
  414.   (defun jys001-incremental (x / ent txt1 txt3 zz)
  415.     (setq ent (entget x))
  416.     (setq txt1 (cdr (assoc 1 ent)))
  417.     (setq zz 1)
  418.     (while (or
  419.        (> (atoi (substr txt1 zz 1)) 0)
  420.        (= (substr txt1 zz 1) "0")
  421.      )
  422.       (setq zz (+ zz 1))
  423.     )
  424.     ;; 使用当前递增的值
  425.     (if (> zz (strlen txt1))
  426.       (setq txt3 current-kk)
  427.       (setq txt3 (strcat current-kk (substr txt1 zz)))
  428.     )
  429.     (entmod (subst
  430.         (cons 1 txt3)
  431.         (assoc 1 ent)
  432.         ent
  433.       )
  434.     )
  435.     ;; 递增当前值,为下一个对象准备
  436.     (setq current-kk (jys003 current-kk sbak))
  437.   )
  438.   
  439.   (defun dzs001 (lst vvs / e)
  440.     (setq e (nth (atoi vvs) lst))
  441.     (cons e (vl-remove e lst))
  442.   )
  443.   (defun dzs002 ()
  444.     (show_list "e01" lst1)
  445.     (show_list "e02" lst2)
  446.     (show_list "e03" lst3)
  447.   )
  448.   (setvar "cmdecho" 0)
  449.   (vl-load-com)
  450.   (setq orerr *error*)
  451.   (setq *error* errsub)
  452.   (while (progn
  453.      (if (setq wbak (vl-registry-read "HKEY_CURRENT_USER\\software\\TH++" "wbak"))
  454.        (setq lst1 (cons wbak (vl-remove wbak '("尾部" "首部"))))
  455.        (setq lst1 '("尾部" "首部"))
  456.      )
  457.      (if (setq sbak (vl-registry-read "HKEY_CURRENT_USER\\software\\TH++" "sbak"))
  458.        (setq lst2 (cons sbak (vl-remove sbak '("1" "2"
  459.                  "3" "4"
  460.                  "5" "6"
  461.                  "7" "8"
  462.                  "9" "10"
  463.                  "15" "20"
  464.                  "30" "40"
  465.                  "50"
  466.                 )
  467.            )
  468.       )
  469.        )
  470.        (setq lst2 '("1" "2"
  471.         "3" "4"
  472.         "5" "6"
  473.         "7" "8"
  474.         "9" "10"
  475.         "15" "20"
  476.         "30" "40"
  477.         "50"
  478.        )
  479.        )
  480.      )
  481.      (if (setq dbak (vl-registry-read "HKEY_CURRENT_USER\\software\\TH++" "dbak"))
  482.        (setq lst3 (cons dbak (vl-remove dbak '("单选" "窗选"))))
  483.        (setq lst3 '("单选" "窗选"))
  484.      )
  485.      (initget "S ")
  486.      (if (= (setq ent (nentsel (strcat "\n选择起始文字[设置(S)]:<" (car lst1) "加" (setq sbak (car lst2))
  487.                ">"
  488.              )
  489.           )
  490.       )
  491.       "S"
  492.          )
  493.        (progn
  494.          (setq dclname (cond
  495.              ((setq tempname (vl-filename-mktemp "dzs.dcl")
  496.               filen (open tempname "w")
  497.         )
  498.          (foreach stream '("\n" "dzs1:dialog {\n"
  499.             "     label = "递增刷" ;\n" "     :boxed_column {\n"
  500.             "         label = "设置" ;\n" "         :row {\n"
  501.             "             :text {label = " 递增位置" ; }\n"
  502.             "             :text {label = "递增步长" ;  }\n"
  503.             "             :text {label = "目标文字" ;  }\n" "         }\n"
  504.             "         :row {\n" "             :popup_list { key = "e01" ;  edit_width = 7 ; }\n"
  505.             "             :popup_list { key = "e02" ;  edit_width = 7 ; }\n"
  506.             "             :popup_list { key = "e03" ;  edit_width = 7 ; }\n"
  507.             "         }\n" "     }\n"
  508.             "     ok_cancel;\n" " }\n"
  509.            )
  510.            (princ stream filen)
  511.          )
  512.          (close filen)
  513.          tempname
  514.              )
  515.            )
  516.          )
  517.          (setq dcl_re (load_dialog dclname))
  518.          (if (not (new_dialog "dzs1" dcl_re))
  519.      (exit)
  520.          )
  521.          (show_list "e01" lst1)
  522.          (show_list "e02" lst2)
  523.          (show_list "e03" lst3)
  524.          (action_tile "e01" "(setq lst1 (dzs001 lst1  $value))(dzs002) ")  ; 位置
  525.          (action_tile "e02" "(setq lst2 (dzs001 lst2  $value))(dzs002)") ; 步长
  526.          (action_tile "e03" "(setq lst3 (dzs001 lst3  $value))(dzs002)") ; 对象
  527.          (action_tile "accept" "(setq dcl_pt (done_dialog 1)) ") ; 确定
  528.          (setq bb (start_dialog))
  529.          (if (= bb 1)
  530.      (progn
  531.        (vl-registry-write "HKEY_CURRENT_USER\\software\\TH++" "wbak" (car lst1))
  532.        (vl-registry-write "HKEY_CURRENT_USER\\software\\TH++" "sbak" (car lst2))
  533.        (vl-registry-write "HKEY_CURRENT_USER\\software\\TH++" "dbak" (car lst3))
  534.      )
  535.          )
  536.          (unload_dialog dcl_re)
  537.          (vl-file-delete dclname)
  538.        )
  539.      )
  540.      (or
  541.        (= ent "S")
  542.        (null ent)
  543.        (not (member (cdr (assoc 0 (entget (car ent)))) '("TEXT" "MTEXT"
  544.          "ATTRIB"
  545.         )
  546.       )
  547.        )
  548.      )
  549.    )
  550.     (if (= 52 (getvar "errno"))
  551.       (vl-exit-with-error "")
  552.     )
  553.   )
  554.   (setq pt1 (cadr ent))
  555.   (setq txt1 (entget (car ent)))
  556.   (setq box (textbox (list (assoc 1 txt1) (assoc 40 txt1) (assoc 7 txt1)))) ; 文本框坐标
  557.   (setq txtlong (/ (- (car (cadr box)) (car (car box))) 2))
  558.   (setq txt1 (cdr (assoc 1 txt1)))
  559.   (setq sbak (car lst2))
  560.   (setq sbak (atoi sbak))
  561.   (if (= (car lst1) "尾部")
  562.     (progn
  563.       (setq zz (strlen txt1))
  564.       (while (and
  565.          (>= zz 1)
  566.          (or
  567.      (> (atoi (substr txt1 zz 1)) 0)
  568.      (= (substr txt1 zz 1) "0")
  569.          )
  570.        )
  571.   (setq zz (- zz 1))
  572.       )
  573.       (setq kk (substr txt1 (+ zz 1)))
  574.       (if (/= zz 0)
  575.   (setq txt2 (substr txt1 1 zz))
  576.       )
  577.       ;;(command ".UNDO" "BE")
  578.       (if (= (car lst3) "窗选")
  579.         (progn
  580.           ;; 显示状态提示
  581.           (update-status-display "框选模式" "尾部递增" sbak pt1)
  582.     (llt:match pt1 '(2 7) (list (strcat "\n选择目标文字:<尾部加" (itoa sbak) ">") '((0 . "*TEXT"))) '(lambda (x /)
  583.                              (jys002 x)
  584.                            )
  585.     )
  586.           (delete-status-text) ; 完成后删除提示
  587.   )
  588.   (progn
  589.           ;; 显示状态提示
  590.           (update-status-display "单选模式" "尾部递增" sbak pt1)
  591.     (while t
  592.       (princ (strcat "\n选择目标文字:<尾部加" (itoa sbak) ">"))
  593.       (setq name nil)
  594.       (if (and
  595.       (setq ent (llt:entsel pt1 2))
  596.       (setq ent (entget ent))
  597.       (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT"
  598.          "ATTRIB"
  599.         )
  600.       )
  601.     )
  602.         (progn
  603.     (setq kk (jys003 kk sbak))
  604.     (if (= zz 0)
  605.       (setq txt3 kk)
  606.       (setq txt3 (strcat txt2 kk))
  607.     )
  608.     (if name
  609.       (if (and
  610.       (setq ent1 (entget (car name)))
  611.       (= (cdr (assoc 0 ent1)) "DIMENSION")
  612.           )
  613.         (entmod (subst
  614.             (cons 1 txt3)
  615.             (assoc 1 ent1)
  616.             ent1
  617.           )
  618.         )
  619.         (progn
  620.           (entmod (subst
  621.         (cons 1 txt3)
  622.         (assoc 1 ent)
  623.         ent
  624.             )
  625.           )
  626.           (entupd (car name))
  627.         )
  628.       )
  629.       (entmod (subst
  630.           (cons 1 txt3)
  631.           (assoc 1 ent)
  632.           ent
  633.         )
  634.       )
  635.     )
  636.         )
  637.         (vl-exit-with-error "")
  638.       )
  639.     )
  640.           (delete-status-text) ; 完成后删除提示
  641.   )
  642.       )
  643.      (command ".UNDO" "E")
  644.     )
  645.   )
  646.   (if (= (car lst1) "首部")
  647.     (progn
  648.       (setq zz 1)
  649.       (while (or
  650.          (> (atoi (substr txt1 zz 1)) 0)
  651.          (= (substr txt1 zz 1) "0")
  652.        )
  653.   (setq zz (+ zz 1))
  654.       )
  655.       (if (= zz 1)
  656.   (setq kk "0")
  657.   (setq kk (substr txt1 1 (- zz 1)))
  658.       )
  659.       ;;(command ".UNDO" "BE")
  660.       (if (= (car lst3) "窗选")
  661.   (progn
  662.     ;; 显示状态提示
  663.           (update-status-display "框选模式" "首部递增" sbak pt1)
  664.     ;; 修复:首部框选时使用递增逻辑
  665.     (setq current-kk (jys003 kk sbak)) ; 初始化当前值
  666.     ;; 使用局部函数包装,确保能访问到current-kk
  667.     (defun local-jys001-incremental (x)
  668.       (setq ent (entget x))
  669.       (setq txt1 (cdr (assoc 1 ent)))
  670.       (setq zz 1)
  671.       (while (or
  672.          (> (atoi (substr txt1 zz 1)) 0)
  673.          (= (substr txt1 zz 1) "0")
  674.        )
  675.         (setq zz (+ zz 1))
  676.       )
  677.       (if (> zz (strlen txt1))
  678.         (setq txt3 current-kk)
  679.         (setq txt3 (strcat current-kk (substr txt1 zz)))
  680.       )
  681.       (entmod (subst
  682.           (cons 1 txt3)
  683.           (assoc 1 ent)
  684.           ent
  685.         )
  686.       )
  687.       ;; 递增当前值,为下一个对象准备
  688.       (setq current-kk (jys003 current-kk sbak))
  689.     )
  690.     (llt:match pt1 '(2 7) (list (strcat "\n选择目标文字:<首部加" (itoa sbak) ">") '((0 . "*TEXT")))
  691.       'local-jys001-incremental
  692.     )
  693.           (delete-status-text) ; 完成后删除提示
  694.   )
  695.   (progn
  696.           ;; 显示状态提示
  697.           (update-status-display "单选模式" "首部递增" sbak pt1)
  698.     (while t
  699.       (setq kk (jys003 kk sbak))
  700.       (princ (strcat "\n选择目标文字:<首部加" (itoa sbak) ">"))
  701.       (setq name nil)
  702.       (if (and
  703.       (setq ent (llt:entsel pt1 2))
  704.       (setq ent (entget ent))
  705.       (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT"
  706.          "ATTRIB"
  707.         )
  708.       )
  709.     )
  710.         (progn
  711.     (setq txt1 (cdr (assoc 1 ent)))
  712.     (setq zz 1)
  713.     (while (or
  714.        (> (atoi (substr txt1 zz 1)) 0)
  715.        (= (substr txt1 zz 1) "0")
  716.            )
  717.       (setq zz (+ zz 1))
  718.     )
  719.     (if (> zz (strlen txt1))
  720.       (setq txt3 kk)
  721.       (setq txt3 (strcat kk (substr txt1 zz)))
  722.     )
  723.     (if name
  724.       (if (and
  725.       (setq ent1 (entget (car name)))
  726.       (= (cdr (assoc 0 ent1)) "DIMENSION")
  727.           )
  728.         (entmod (subst
  729.             (cons 1 txt3)
  730.             (assoc 1 ent1)
  731.             ent1
  732.           )
  733.         )
  734.         (progn
  735.           (entmod (subst
  736.         (cons 1 txt3)
  737.         (assoc 1 ent)
  738.         ent
  739.             )
  740.           )
  741.           (entupd (car name))
  742.         )
  743.       )
  744.       (entmod (subst
  745.           (cons 1 txt3)
  746.           (assoc 1 ent)
  747.           ent
  748.         )
  749.       )
  750.     )
  751.         )
  752.         (vl-exit-with-error "")
  753.       )
  754.     )
  755.           (delete-status-text) ; 完成后删除提示
  756.   )
  757.       )
  758.     )
  759.   )
  760.   (setq *error* orerr)
  761.   (command ".UNDO" "E")
  762.   (princ)
  763. )
改进版,增量刷,支持原程序不支持首部增量!感谢原作者的代码!

本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 收起 理由
ptime + 1 很给力!
lucas_3333 + 1 神马都是浮云

查看全部评分

回复

使用道具 举报

发表于 昨天 11:19 | 显示全部楼层
经测试,S后无选项

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 11:22 | 显示全部楼层
是不是你的CAD问题,我这边没有问题!
回复 支持 反对

使用道具 举报

发表于 昨天 13:08 | 显示全部楼层
红字提示时,右键退出,会把提示字留在屏幕上,需改进
回复 支持 反对

使用道具 举报

发表于 昨天 14:08 | 显示全部楼层
zxw2735 发表于 2025-10-30 11:19
经测试,S后无选项

一样的问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 15:12 | 显示全部楼层
本帖最后由 小毛草 于 2025-10-30 15:14 编辑
  1. <div class="blockcode"><blockquote>;;****************************************************************递增刷
  2. ;;; 2016.05.21,QHT修改:增加及去除几处undo设置
  3. ;;; 名称:递增刷(可框选)
  4. ;;; 功能:刷文本末尾或首部的数字递增指定值
  5. ;;; ______________________________________
  6. (defun c:QF (/ a b bb box c co col cv dbak dcl_re dclname e e1 e2 en ent ent1 errsub filen fun i key kk l l1 len lst lst1 lst2 lst3
  7.          msg name newlist orerr pix pt pt1 pt2 s sbak si ss ss1 ssparm st2 st3 st4 stream tempname txt1 txt2 txt3 txtlong vvs
  8.          wbak x y zz current-kk
  9.       )
  10.     (vl-load-com)
  11.     (setvar 'cecolor "BYLAYER")
  12.     (setvar "shortcutmenu" 0);;;;自定义右键单击(2.选定对象,单击右键为菜单)
  13.     (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
  14.      ; ,caoyin老大明经"拜新年"帖子提供,langjs修改
  15.     (defun d_brush (col x y len / a b c)
  16.       (grvecs (list col (list (- x (setq a (* len 1.5))) (- y len)) (list (- x a) (setq b (- y (* len 7.5)))) col (list (- x
  17.                                  (setq c
  18.                                  (* len 0.5)
  19.                                  )
  20.                               ) y
  21.                               ) (list (- x c) b)
  22.         col (list (+ x c) y) (list (+ x c) b) col (list (+ x a) (- y len)) (list (+ x a) b) col (list (- x (setq a
  23.                                    (* len
  24.                                 4.5
  25.                                    )
  26.                                    )
  27.                               ) b
  28.                               ) (list (+ x a) b) col
  29.         (list (- x a) b) (list (- x (setq c (* len 6.5))) (- y (* len 9))) col (list (+ x a) b) (list (+ x c)
  30.                               (setq a (- y
  31.                                    (* len 9)
  32.                                 )
  33.                               )
  34.                               ) col (list (- x c) a)
  35.         (list (- x c) (setq b (- y (* len 17)))) col (list (+ x c) a) (list (+ x c) b) col (list (- x c) (setq a
  36.                                  (- y
  37.                                     (* len
  38.                                  10
  39.                                     )
  40.                                  )
  41.                                  )
  42.                                ) (list (+ x c) a) col
  43.         (list (- x c) (setq a (- y (* len 11)))) (list (+ x c) a) col (list (- x c) (setq a (- y (* len 13))))
  44.         (list (+ x c) a) col (list (- x c) (setq a (- y (* len 14)))) (list (+ x c) a) col (list (- x c) b)
  45.         (list (+ x c) b) col (list (- x c) b) (list (- x (* len 11)) (setq a (- y (* len 21.5)))) col (list (- x
  46.                                  (* len 2)
  47.                               ) b
  48.                               ) (list (- x
  49.                                    (* len
  50.                                 6.5
  51.                                    )
  52.                                 ) a
  53.                                 ) col
  54.         (list (+ x (* len 2)) b) (list (- x (* len 2.5)) a) col (list (+ x c) b) (list (+ x (* len 2)) a) col
  55.         (list (- x (* len 11)) a) (list (+ x (* len 3)) a)
  56.         ) (list (list 1 0 0 (* len 14)) (list 0 1 0 (* len -4)) '(0 0 1 0) '(0 0 0 1))
  57.       )
  58.     )
  59.   (defun pickbox (pt / si cv)
  60.       (setq si (* (/ (getvar "pickbox") (cadr (getvar "screensize"))) (getvar "viewsize") 0.5)
  61.       cv (list si si 0)
  62.       )
  63.       (list (mapcar
  64.         '+
  65.         pt
  66.         cv
  67.       ) (mapcar
  68.     '-
  69.     pt
  70.     cv
  71.         )
  72.       )
  73.     )
  74.       (defun p2u (pix)
  75.       (* pix (/ (getvar "viewsize") (cadr (getvar "screensize"))))
  76.     )
  77.   (defun llt:match (pt col ssparm fun / a b c co cv e e1 e2 ent i len lst msg pix pt1 pt2 si ss ss1 x y) ; 带有刷子的ssget功能子程序
  78.     (or
  79.       (setq co (cadr col))
  80.       (setq co 7)
  81.     )
  82.     (or
  83.       (setq col (car col))
  84.       (setq col 7)
  85.     )
  86.     (or
  87.       (setq msg (car ssparm))
  88.       (setq msg "\n选择目标对象: ")
  89.     )
  90.     (setq ssparm (cadr ssparm)
  91.     len (p2u 1)
  92.     x (car pt)
  93.     y (cadr pt)
  94.     )
  95.     (princ msg)
  96.     (while (/= (car pt1) 11)
  97.       (redraw)
  98.       (d_brush col x y len)
  99.       (while (not (member (car (setq pt1 (grread t 12 2))) '(3 11)))
  100.   (setq pt1 (cadr pt1))
  101.   (if (vl-consp pt1)
  102.     (progn
  103.       (if (> (distance pt1 pt) (p2u (* 0.0001 (car (getvar "screensize")))))
  104.         (progn
  105.     (redraw)
  106.     (setq len (p2u 1)
  107.           x (car pt)
  108.           y (cadr pt)
  109.     )
  110.     (d_brush col x y len)
  111.     (setq pt pt1)
  112.         )
  113.       )
  114.     )
  115.   )
  116.       )
  117.       (redraw)
  118.       (if (and
  119.       (= (car pt1) 3)
  120.       (princ msg)
  121.       (not (setq ss1 (apply
  122.            'ssget
  123.            (append
  124.              '("_c")
  125.              (pickbox (cadr pt1))
  126.              (list ssparm)
  127.            )
  128.          )
  129.      )
  130.       )
  131.     )
  132.   (progn
  133.     (princ "指定对角点: ")
  134.     (setq pt1 (list (caadr pt1) (cadadr pt1)))
  135.     (while (not (member (car (setq pt2 (grread t 12 1))) '(3 11)))
  136.       (setq pt2 (list (caadr pt2) (cadadr pt2)))
  137.       (if (vl-consp pt1)
  138.         (progn
  139.     (if (> (distance pt2 pt) (p2u (* 0.0001 (car (getvar "screensize")))))
  140.       (progn
  141.         (redraw)
  142.         (setq len (p2u 1)
  143.         x (car pt)
  144.         y (cadr pt)
  145.         co (abs co)
  146.         )
  147.         (if (> (car pt1) (car pt2))
  148.           (setq co (- co))
  149.         )
  150.         (d_brush col x y len)
  151.         (grvecs (list co pt1 (list (car pt1) (cadr pt2)) co pt2 (list (car pt1) (cadr pt2)) co pt2 (list (car pt2)
  152.                                  (cadr pt1)
  153.                                  ) co pt1
  154.           (list (car pt2) (cadr pt1))
  155.           )
  156.         )
  157.         (setq pt pt2
  158.         ss1 (ssget (if (minusp co)
  159.                "_c"
  160.                "_w"
  161.              ) pt1 pt2 ssparm
  162.             )
  163.         )
  164.       )
  165.     )
  166.         )
  167.       )
  168.     )
  169.   )
  170.       )
  171.       (or
  172.   ss
  173.   (setq ss (ssadd))
  174.       )
  175.       (if ss1
  176.   (progn
  177.     (setq lst '())
  178.     (repeat (setq i (sslength ss1))
  179.       (setq e (ssname ss1 (setq i (1- i))))
  180.       (setq ent (entget e))
  181.       (setq pt1 (cdr (assoc 10 ent)))
  182.       (setq lst (cons (list pt1 e) lst))
  183.     )
  184.     (setq lst (vl-sort lst (function (lambda (e1 e2) ; 框选文本先由上到下排序(其它情况自己修改)
  185.                (> (cadr (car e1)) (cadr (car e2)))
  186.              )
  187.          )
  188.         )
  189.     )
  190.     (setq lst (vl-sort lst (function (lambda (e1 e2) ; 框选文本后由左到右排序(其它情况自己修改)
  191.                (< (car (car e1)) (if (and
  192.                      (>= (car (car e2)) (- (car (car e1)) txtlong))
  193.                      (<= (car (car e2)) (+ (car (car e1)) txtlong))
  194.                    )
  195.                  (car (car e1))
  196.                  (car (car e2))
  197.                      )
  198.                )
  199.              )
  200.          )
  201.         )
  202.     )
  203.     (setq lst (reverse lst))
  204.     (repeat (setq i (length lst))
  205.       (setq e (cadr (nth (setq i (1- i))
  206.              lst
  207.         )
  208.         )
  209.       )
  210.       (ssadd e ss)
  211.       (redraw e 3)
  212.       (apply
  213.         fun
  214.         (list e)
  215.       )
  216.     )
  217.   )
  218.       )
  219.       (setq ss1 nil)
  220.     )
  221.     (redraw)
  222.     ss
  223.   )
  224.   (defun llt:entsel (pt col / a b c col en ent len pix pt x y) ; 带有刷子的entsel功能子程序,caoyin老大提供
  225.     (redraw)
  226.     (setq len (p2u 1)
  227.     x (car pt)
  228.     y (cadr pt)
  229.     )
  230.     (d_brush col x y len)
  231.     (while (not (member (car (setq pt1 (grread t 12 2))) '(3 11)))
  232.       (setq pt1 (cadr pt1))
  233.       (if (vl-consp pt1)
  234.   (progn
  235.     (or
  236.       pt
  237.       (setq pt pt1)
  238.     )
  239.     (setq x (car pt)
  240.     y (cadr pt)
  241.     )
  242.     (if (> (distance pt1 pt) (p2u (* 0.0001 (car (getvar "screensize")))))
  243.       (progn
  244.         (redraw)
  245.         (setq len (p2u 1)
  246.         x (car pt)
  247.         y (cadr pt)
  248.         )
  249.         (d_brush col x y len)
  250.         (setq pt pt1)
  251.       )
  252.     )
  253.   )
  254.       )
  255.     )
  256.     (redraw)
  257.     (and
  258.       (= (car pt1) 3)
  259.       (vl-consp (cadr pt1))
  260.       (setq en (nentselp (cadr pt1)))
  261.     )
  262.     (setq ent (car en))
  263.     (setq pt1 (cadr pt1))
  264.     (if (cadddr en)
  265.       (setq name (cadddr en))
  266.     )
  267.     ent
  268.   )
  269.   (defun errsub (msg)
  270.     (if (not (member msg '("程序中断" "功能撤销"
  271.           "退出 / 中断" ""
  272.          )
  273.        )
  274.   )
  275.       (princ (strcat "\n" msg))
  276.     ); if
  277. (vla-EndUndoMark      
  278.     (vla-get-ActiveDocument (vlax-get-acad-object))
  279.   )  
  280.     (setvar "shortcutmenu" 2)
  281.     (redraw)
  282.     (setq *error* orerr)
  283.     (prin1)
  284.   )
  285.   (defun show_list (key newlist)
  286.     (start_list key)
  287.     (mapcar
  288.       'add_list
  289.       newlist
  290.     )
  291.     (end_list)
  292.   )
  293.   (defun jys001 (x kk / ent txt1 txt3 zz) ; 首部框
  294.     (setq ent (entget x))
  295.     (setq txt1 (cdr (assoc 1 ent)))
  296.     (setq zz 1)
  297.     (while (or
  298.        (> (atoi (substr txt1 zz 1)) 0)
  299.        (= (substr txt1 zz 1) "0")
  300.      )
  301.       (setq zz (+ zz 1))
  302.     )
  303.     (if (> zz (strlen txt1))
  304.       (setq txt3 kk)
  305.       (setq txt3 (strcat kk (substr txt1 zz)))
  306.     )
  307.     (entmod (subst
  308.         (cons 1 txt3)
  309.         (assoc 1 ent)
  310.         ent
  311.       )
  312.     )
  313.   )
  314.   (defun jys002 (x / ent txt3)         ; 尾部框
  315.     (if (and
  316.     (setq ent (entget x))
  317.     (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT"))
  318.   )
  319.       (progn
  320.   (setq kk (jys003 kk sbak))
  321.   (if (= zz 0)
  322.     (setq txt3 kk)
  323.     (setq txt3 (strcat txt2 kk))
  324.   )
  325.   (entmod (subst
  326.       (cons 1 txt3)
  327.       (assoc 1 ent)
  328.       ent
  329.     )
  330.   )
  331.       )
  332.     )
  333.   )
  334.   (defun jys003 (st2 sbak / l l1 s st3 st4) ; 处理尾部数字
  335.     (setq st3 st2
  336.     s "0"
  337.     st4 ""
  338.     l (strlen st2)
  339.     )
  340.     (while (eq s "0")
  341.       (setq s (substr st3 1 1)
  342.       st3 (substr st3 2)
  343.       st4 (if (eq s "0")
  344.       (strcat st4 s)
  345.       st4
  346.     )
  347.       )
  348.     )               ; 将首位是0的数字分离出来
  349.     (setq st2 (atoi st2)
  350.     st2 (+ st2 sbak)
  351.     st2 (itoa st2)
  352.     st2 (strcat st4 st2)
  353.     l1 (strlen st2)
  354.     s (substr st2 1 1)
  355.     )
  356.     (if (and
  357.     (= s "0")
  358.     (> l1 l)
  359.   )
  360.       (setq st2 (substr st2 2))
  361.     )               ; 处理了形如A09变为A10的问题
  362.     st2
  363.   )
  364.   
  365.   ;; 修改后的函数:处理首部框选的递增
  366.   (defun jys001-incremental (x / ent txt1 txt3 zz)
  367.     (setq ent (entget x))
  368.     (setq txt1 (cdr (assoc 1 ent)))
  369.     (setq zz 1)
  370.     (while (or
  371.        (> (atoi (substr txt1 zz 1)) 0)
  372.        (= (substr txt1 zz 1) "0")
  373.      )
  374.       (setq zz (+ zz 1))
  375.     )
  376.     ;; 使用当前递增的值
  377.     (if (> zz (strlen txt1))
  378.       (setq txt3 current-kk)
  379.       (setq txt3 (strcat current-kk (substr txt1 zz)))
  380.     )
  381.     (entmod (subst
  382.         (cons 1 txt3)
  383.         (assoc 1 ent)
  384.         ent
  385.       )
  386.     )
  387.     ;; 递增当前值,为下一个对象准备
  388.     (setq current-kk (jys003 current-kk sbak))
  389.   )
  390.   
  391.   (defun dzs001 (lst vvs / e)
  392.     (setq e (nth (atoi vvs) lst))
  393.     (cons e (vl-remove e lst))
  394.   )
  395.   (defun dzs002 ()
  396.     (show_list "e01" lst1)
  397.     (show_list "e02" lst2)
  398.     (show_list "e03" lst3)
  399.   )
  400.   (setvar "cmdecho" 0)
  401.   (vl-load-com)
  402.   (setq orerr *error*)
  403.   (setq *error* errsub)
  404.   (while (progn
  405.      (if (setq wbak (vl-registry-read "HKEY_CURRENT_USER\\software\\TH++" "wbak"))
  406.        (setq lst1 (cons wbak (vl-remove wbak '("尾部" "首部"))))
  407.        (setq lst1 '("尾部" "首部"))
  408.      )
  409.      (if (setq sbak (vl-registry-read "HKEY_CURRENT_USER\\software\\TH++" "sbak"))
  410.        (setq lst2 (cons sbak (vl-remove sbak '("1" "2"
  411.                  "3" "4"
  412.                  "5" "6"
  413.                  "7" "8"
  414.                  "9" "10"
  415.                  "15" "20"
  416.                  "30" "40"
  417.                  "50"
  418.                 )
  419.            )
  420.       )
  421.        )
  422.        (setq lst2 '("1" "2"
  423.         "3" "4"
  424.         "5" "6"
  425.         "7" "8"
  426.         "9" "10"
  427.         "15" "20"
  428.         "30" "40"
  429.         "50"
  430.        )
  431.        )
  432.      )
  433.      (if (setq dbak (vl-registry-read "HKEY_CURRENT_USER\\software\\TH++" "dbak"))
  434.        (setq lst3 (cons dbak (vl-remove dbak '("单选" "窗选"))))
  435.        (setq lst3 '("单选" "窗选"))
  436.      )
  437.      (initget "S ")
  438.      (if (= (setq ent (nentsel (strcat "\n选择起始文字[设置(S)]:<" (car lst1) "加" (setq sbak (car lst2))
  439.                ">"
  440.              )
  441.           )
  442.       )
  443.       "S"
  444.          )
  445.        (progn
  446.          (setq dclname (cond
  447.              ((setq tempname (vl-filename-mktemp "dzs.dcl")
  448.               filen (open tempname "w")
  449.         )
  450.          (foreach stream '("\n" "dzs1:dialog {\n"
  451.             "     label = "递增刷" ;\n" "     :boxed_column {\n"
  452.             "         label = "设置" ;\n" "         :row {\n"
  453.             "             :text {label = " 递增位置" ; }\n"
  454.             "             :text {label = "递增步长" ;  }\n"
  455.             "             :text {label = "目标文字" ;  }\n" "         }\n"
  456.             "         :row {\n" "             :popup_list { key = "e01" ;  edit_width = 7 ; }\n"
  457.             "             :popup_list { key = "e02" ;  edit_width = 7 ; }\n"
  458.             "             :popup_list { key = "e03" ;  edit_width = 7 ; }\n"
  459.             "         }\n" "     }\n"
  460.             "     ok_cancel;\n" " }\n"
  461.            )
  462.            (princ stream filen)
  463.          )
  464.          (close filen)
  465.          tempname
  466.              )
  467.            )
  468.          )
  469.          (setq dcl_re (load_dialog dclname))
  470.          (if (not (new_dialog "dzs1" dcl_re))
  471.      (exit)
  472.          )
  473.          (show_list "e01" lst1)
  474.          (show_list "e02" lst2)
  475.          (show_list "e03" lst3)
  476.          (action_tile "e01" "(setq lst1 (dzs001 lst1  $value))(dzs002) ")  ; 位置
  477.          (action_tile "e02" "(setq lst2 (dzs001 lst2  $value))(dzs002)") ; 步长
  478.          (action_tile "e03" "(setq lst3 (dzs001 lst3  $value))(dzs002)") ; 对象
  479.          (action_tile "accept" "(setq dcl_pt (done_dialog 1)) ") ; 确定
  480.          (setq bb (start_dialog))
  481.          (if (= bb 1)
  482.      (progn
  483.        (vl-registry-write "HKEY_CURRENT_USER\\software\\TH++" "wbak" (car lst1))
  484.        (vl-registry-write "HKEY_CURRENT_USER\\software\\TH++" "sbak" (car lst2))
  485.        (vl-registry-write "HKEY_CURRENT_USER\\software\\TH++" "dbak" (car lst3))
  486.      )
  487.          )
  488.          (unload_dialog dcl_re)
  489.          (vl-file-delete dclname)
  490.        )
  491.      )
  492.      (or
  493.        (= ent "S")
  494.        (null ent)
  495.        (not (member (cdr (assoc 0 (entget (car ent)))) '("TEXT" "MTEXT"
  496.          "ATTRIB"
  497.         )
  498.       )
  499.        )
  500.      )
  501.    )
  502.     (if (= 52 (getvar "errno"))
  503.       (vl-exit-with-error "")
  504.     )
  505.   )
  506.   (setq pt1 (cadr ent))
  507.   (setq txt1 (entget (car ent)))
  508.   (setq box (textbox (list (assoc 1 txt1) (assoc 40 txt1) (assoc 7 txt1)))) ; 文本框坐标
  509.   (setq txtlong (/ (- (car (cadr box)) (car (car box))) 2))
  510.   (setq txt1 (cdr (assoc 1 txt1)))
  511.   (setq sbak (car lst2))
  512.   (setq sbak (atoi sbak))
  513.   (if (= (car lst1) "尾部")
  514.     (progn
  515.       (setq zz (strlen txt1))
  516.       (while (and
  517.          (>= zz 1)
  518.          (or
  519.      (> (atoi (substr txt1 zz 1)) 0)
  520.      (= (substr txt1 zz 1) "0")
  521.          )
  522.        )
  523.   (setq zz (- zz 1))
  524.       )
  525.       (setq kk (substr txt1 (+ zz 1)))
  526.       (if (/= zz 0)
  527.   (setq txt2 (substr txt1 1 zz))
  528.       )
  529.       ;;(command ".UNDO" "BE")
  530.       (if (= (car lst3) "窗选")
  531.   (llt:match pt1 '(2 7) (list (strcat "\n选择目标文字:<尾部加" (itoa sbak) ">") '((0 . "*TEXT"))) '(lambda (x /)
  532.                              (jys002 x)
  533.                            )
  534.   )
  535.   (while t
  536.     (princ (strcat "\n选择目标文字:<尾部加" (itoa sbak) ">"))
  537.     (setq name nil)
  538.     (if (and
  539.     (setq ent (llt:entsel pt1 2))
  540.     (setq ent (entget ent))
  541.     (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT"
  542.        "ATTRIB"
  543.       )
  544.     )
  545.         )
  546.       (progn
  547.         (setq kk (jys003 kk sbak))
  548.         (if (= zz 0)
  549.     (setq txt3 kk)
  550.     (setq txt3 (strcat txt2 kk))
  551.         )
  552.         (if name
  553.     (if (and
  554.           (setq ent1 (entget (car name)))
  555.           (= (cdr (assoc 0 ent1)) "DIMENSION")
  556.         )
  557.       (entmod (subst
  558.           (cons 1 txt3)
  559.           (assoc 1 ent1)
  560.           ent1
  561.         )
  562.       )
  563.       (progn
  564.         (entmod (subst
  565.             (cons 1 txt3)
  566.             (assoc 1 ent)
  567.             ent
  568.           )
  569.         )
  570.         (entupd (car name))
  571.       )
  572.     )
  573.     (entmod (subst
  574.         (cons 1 txt3)
  575.         (assoc 1 ent)
  576.         ent
  577.       )
  578.     )
  579.         )
  580.       )
  581.       (vl-exit-with-error "")
  582.     )
  583.   )
  584.       )
  585.      (command ".UNDO" "E")
  586.     )
  587.   )
  588.   (if (= (car lst1) "首部")
  589.     (progn
  590.       (setq zz 1)
  591.       (while (or
  592.          (> (atoi (substr txt1 zz 1)) 0)
  593.          (= (substr txt1 zz 1) "0")
  594.        )
  595.   (setq zz (+ zz 1))
  596.       )
  597.       (if (= zz 1)
  598.   (setq kk "0")
  599.   (setq kk (substr txt1 1 (- zz 1)))
  600.       )
  601.       ;;(command ".UNDO" "BE")
  602.       (if (= (car lst3) "窗选")
  603.   (progn
  604.     ;; 修复:首部框选时使用递增逻辑
  605.     (setq current-kk (jys003 kk sbak)) ; 初始化当前值
  606.     ;; 使用局部函数包装,确保能访问到current-kk
  607.     (defun local-jys001-incremental (x)
  608.       (setq ent (entget x))
  609.       (setq txt1 (cdr (assoc 1 ent)))
  610.       (setq zz 1)
  611.       (while (or
  612.          (> (atoi (substr txt1 zz 1)) 0)
  613.          (= (substr txt1 zz 1) "0")
  614.        )
  615.         (setq zz (+ zz 1))
  616.       )
  617.       (if (> zz (strlen txt1))
  618.         (setq txt3 current-kk)
  619.         (setq txt3 (strcat current-kk (substr txt1 zz)))
  620.       )
  621.       (entmod (subst
  622.           (cons 1 txt3)
  623.           (assoc 1 ent)
  624.           ent
  625.         )
  626.       )
  627.       ;; 递增当前值,为下一个对象准备
  628.       (setq current-kk (jys003 current-kk sbak))
  629.     )
  630.     (llt:match pt1 '(2 7) (list (strcat "\n选择目标文字:<首部加" (itoa sbak) ">") '((0 . "*TEXT")))
  631.       'local-jys001-incremental
  632.     )
  633.   )
  634.   (while t
  635.     (setq kk (jys003 kk sbak))
  636.     (princ (strcat "\n选择目标文字:<首部加" (itoa sbak) ">"))
  637.     (setq name nil)
  638.     (if (and
  639.     (setq ent (llt:entsel pt1 2))
  640.     (setq ent (entget ent))
  641.     (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT"
  642.        "ATTRIB"
  643.       )
  644.     )
  645.         )
  646.       (progn
  647.         (setq txt1 (cdr (assoc 1 ent)))
  648.         (setq zz 1)
  649.         (while (or
  650.            (> (atoi (substr txt1 zz 1)) 0)
  651.            (= (substr txt1 zz 1) "0")
  652.          )
  653.     (setq zz (+ zz 1))
  654.         )
  655.         (if (> zz (strlen txt1))
  656.     (setq txt3 kk)
  657.     (setq txt3 (strcat kk (substr txt1 zz)))
  658.         )
  659.         (if name
  660.     (if (and
  661.           (setq ent1 (entget (car name)))
  662.           (= (cdr (assoc 0 ent1)) "DIMENSION")
  663.         )
  664.       (entmod (subst
  665.           (cons 1 txt3)
  666.           (assoc 1 ent1)
  667.           ent1
  668.         )
  669.       )
  670.       (progn
  671.         (entmod (subst
  672.             (cons 1 txt3)
  673.             (assoc 1 ent)
  674.             ent
  675.           )
  676.         )
  677.         (entupd (car name))
  678.       )
  679.     )
  680.     (entmod (subst
  681.         (cons 1 txt3)
  682.         (assoc 1 ent)
  683.         ent
  684.       )
  685.     )
  686.         )
  687.       )
  688.       (vl-exit-with-error "")
  689.     )
  690.   )
  691.       )
  692.     )
  693.   )
  694.   (setq *error* orerr)
  695.   (command ".UNDO" "E")
  696.   (princ)
  697. )
提供这版没有提示文字的,看你们喜欢那个版本!
回复 支持 反对

使用道具 举报

发表于 昨天 18:45 | 显示全部楼层
设置里是空的。CAD2023
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 19:11 | 显示全部楼层
那不知什么原因了,我这边一点事都没有,2016~2018

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-10-31 04:16 , Processed in 0.197174 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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