明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 928|回复: 7

[提问] 请帮忙把递增刷增加图层过滤功能

[复制链接]
发表于 2018-10-12 18:47 | 显示全部楼层 |阅读模式
3明经币
请帮忙把递增刷增加图层过滤功能首先非常感谢原作者 langjs大师 以其各位论坛上分享源码的大师


此递增刷很好用,只是没有图层过滤功能,
想增加一个图层过滤功能如下:
在程序选取起始文字时,把起始文字的图层记录下来,在刷目标文字时,只刷与起始文字同一图层的文字


恳请大师帮忙优化一下,谢谢了



;;****************************************************************递增刷
;;; ________________;;2016.05.21,QHT修改:增加及去除几处undo设置
;;; 名称:递增刷(可框选)
;;; 功能:刷文本末尾或首部的数字递增指定值
;;; 命令:dz        langjs    2012.2.27
;;; ______________________________________
(defun c:dzs(/ 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
               msg name newlist orerr pix pt pt1 pt2 s sbak si ss ss1 ssparm st2 st3 st4 stream tempname txt1 txt2 txt3 txtlong vvs
               wbak x y zz
            )
                (vl-load-com)
                (setvar 'cecolor "BYLAYER")
                (setvar "shortcutmenu" 0);;;;自定义右键单击(2.选定对象,单击右键为菜单)
                (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
                 ; ,caoyin老大明经“拜新年“帖子提供,langjs修改
    (defun d_brush (col x y len / a b c)
      (grvecs (list col (list (- x (setq a (* len 1.5))) (- y len)) (list (- x a) (setq b (- y (* len 7.5)))) col (list (- x
                                                                                                                           (setq c
                                                                                                                                 (* len 0.5)
                                                                                                                           )
                                                                                                                        ) y
                                                                                                                  ) (list (- x c) b)
                    col (list (+ x c) y) (list (+ x c) b) col (list (+ x a) (- y len)) (list (+ x a) b) col (list (- x (setq a
                                                                                                                             (* len
                                                                                                                                4.5
                                                                                                                             )
                                                                                                                       )
                                                                                                                  ) b
                                                                                                            ) (list (+ x a) b) col
                    (list (- x a) b) (list (- x (setq c (* len 6.5))) (- y (* len 9))) col (list (+ x a) b) (list (+ x c)
                                                                                                                  (setq a (- y
                                                                                                                             (* len 9)
                                                                                                                          )
                                                                                                                  )
                                                                                                            ) col (list (- x c) a)
                    (list (- x c) (setq b (- y (* len 17)))) col (list (+ x c) a) (list (+ x c) b) col (list (- x c) (setq a
                                                                                                                           (- y
                                                                                                                              (* len
                                                                                                                                 10
                                                                                                                              )
                                                                                                                           )
                                                                                                                     )
                                                                                                       ) (list (+ x c) a) col
                    (list (- x c) (setq a (- y (* len 11)))) (list (+ x c) a) col (list (- x c) (setq a (- y (* len 13))))
                    (list (+ x c) a) col (list (- x c) (setq a (- y (* len 14)))) (list (+ x c) a) col (list (- x c) b)
                    (list (+ x c) b) col (list (- x c) b) (list (- x (* len 11)) (setq a (- y (* len 21.5)))) col (list (- x
                                                                                                                           (* len 2)
                                                                                                                        ) b
                                                                                                                  ) (list (- x
                                                                                                                             (* len
                                                                                                                                6.5
                                                                                                                             )
                                                                                                                          ) a
                                                                                                                    ) col
                    (list (+ x (* len 2)) b) (list (- x (* len 2.5)) a) col (list (+ x c) b) (list (+ x (* len 2)) a) col
                    (list (- x (* len 11)) a) (list (+ x (* len 3)) a)
              ) (list (list 1 0 0 (* len 14)) (list 0 1 0 (* len -4)) '(0 0 1 0) '(0 0 0 1))
      )
    )
        (defun pickbox (pt / si cv)
      (setq si (* (/ (getvar "pickbox") (cadr (getvar "screensize"))) (getvar "viewsize") 0.5)
            cv (list si si 0)
      )
      (list (mapcar
              '+
              pt
              cv
            ) (mapcar
                '-
                pt
                cv
              )
      )
    )
            (defun p2u (pix)
      (* pix (/ (getvar "viewsize") (cadr (getvar "screensize"))))
    )
  (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功能子程序
    (or
      (setq co (cadr col))
      (setq co 7)
    )
    (or
      (setq col (car col))
      (setq col 7)
    )
    (or
      (setq msg (car ssparm))
      (setq msg "\n选择目标对象: ")
    )
    (setq ssparm (cadr ssparm)
          len (p2u 1)
          x (car pt)
          y (cadr pt)
    )
    (princ msg)
    (while (/= (car pt1) 11)
      (redraw)
      (d_brush col x y len)
      (while (not (member (car (setq pt1 (grread t 12 2))) '(3 11)))
        (setq pt1 (cadr pt1))
        (if (vl-consp pt1)
          (progn
            (if (> (distance pt1 pt) (p2u (* 0.0001 (car (getvar "screensize")))))
              (progn
                (redraw)
                (setq len (p2u 1)
                      x (car pt)
                      y (cadr pt)
                )
                (d_brush col x y len)
                (setq pt pt1)
              )
            )
          )
        )
      )
      (redraw)
      (if (and
            (= (car pt1) 3)
            (princ msg)
            (not (setq ss1 (apply
                             'ssget
                             (append
                               '("_c")
                               (pickbox (cadr pt1))
                               (list ssparm)
                             )
                           )
                 )
            )
          )
        (progn
          (princ "指定对角点: ")
          (setq pt1 (list (caadr pt1) (cadadr pt1)))
          (while (not (member (car (setq pt2 (grread t 12 1))) '(3 11)))
            (setq pt2 (list (caadr pt2) (cadadr pt2)))
            (if (vl-consp pt1)
              (progn
                (if (> (distance pt2 pt) (p2u (* 0.0001 (car (getvar "screensize")))))
                  (progn
                    (redraw)
                    (setq len (p2u 1)
                          x (car pt)
                          y (cadr pt)
                          co (abs co)
                    )
                    (if (> (car pt1) (car pt2))
                      (setq co (- co))
                    )
                    (d_brush col x y len)
                    (grvecs (list co pt1 (list (car pt1) (cadr pt2)) co pt2 (list (car pt1) (cadr pt2)) co pt2 (list (car pt2)
                                                                                                                     (cadr pt1)
                                                                                                               ) co pt1
                                  (list (car pt2) (cadr pt1))
                            )
                    )
                    (setq pt pt2
                          ss1 (ssget (if (minusp co)
                                       "_c"
                                       "_w"
                                     ) pt1 pt2 ssparm
                              )
                    )
                  )
                )
              )
            )
          )
        )
      )
      (or
        ss
        (setq ss (ssadd))
      )
      (if ss1
        (progn
          (setq lst '())
          (repeat (setq i (sslength ss1))
            (setq e (ssname ss1 (setq i (1- i))))
            (setq ent (entget e))
            (setq pt1 (cdr (assoc 10 ent)))
            (setq lst (cons (list pt1 e) lst))
          )
          (setq lst (vl-sort lst (function (lambda (e1 e2) ; 框选文本先由上到下排序(其它情况自己修改)
                                             (> (cadr (car e1)) (cadr (car e2)))
                                           )
                                 )
                    )
          )
          (setq lst (vl-sort lst (function (lambda (e1 e2) ; 框选文本后由左到右排序(其它情况自己修改)
                                             (< (car (car e1)) (if (and
                                                                     (>= (car (car e2)) (- (car (car e1)) txtlong))
                                                                     (<= (car (car e2)) (+ (car (car e1)) txtlong))
                                                                   )
                                                                 (car (car e1))
                                                                 (car (car e2))
                                                               )
                                             )
                                           )
                                 )
                    )
          )
          (setq lst (reverse lst))
          (repeat (setq i (length lst))
            (setq e (cadr (nth (setq i (1- i))
                               lst
                          )
                    )
            )
            (ssadd e ss)
            (redraw e 3)
            (apply
              fun
              (list e)
            )
          )
        )
      )
      (setq ss1 nil)
    )
    (redraw)
    ss
  )
  (defun llt:entsel (pt col / a b c col en ent len pix pt x y) ; 带有刷子的entsel功能子程序,caoyin老大提供
    (redraw)
    (setq len (p2u 1)
          x (car pt)
          y (cadr pt)
    )
    (d_brush col x y len)
    (while (not (member (car (setq pt1 (grread t 12 2))) '(3 11)))
      (setq pt1 (cadr pt1))
      (if (vl-consp pt1)
        (progn
          (or
            pt
            (setq pt pt1)
          )
          (setq x (car pt)
                y (cadr pt)
          )
          (if (> (distance pt1 pt) (p2u (* 0.0001 (car (getvar "screensize")))))
            (progn
              (redraw)
              (setq len (p2u 1)
                    x (car pt)
                    y (cadr pt)
              )
              (d_brush col x y len)
              (setq pt pt1)
            )
          )
        )
      )
    )
    (redraw)
    (and
      (= (car pt1) 3)
      (vl-consp (cadr pt1))
      (setq en (nentselp (cadr pt1)))
    )
    (setq ent (car en))
    (setq pt1 (cadr pt1))
    (if (cadddr en)
      (setq name (cadddr en))
    )
    ent
  )
  (defun errsub (msg)
    (if (not (member msg '("console break" "Function cancelled"
                      "quit / exit abort" ""
                     )
             )
        )
      (princ (strcat "\n" msg))
    ); if
(vla-EndUndoMark      
    (vla-get-ActiveDocument (vlax-get-acad-object))
  )       
    (setvar "shortcutmenu" 2)
    (redraw)
    (setq *error* orerr)
    (prin1)
  )
  (defun show_list (key newlist)
    (start_list key)
    (mapcar
      'add_list
      newlist
    )
    (end_list)
  )
  (defun jys001 (x kk / ent txt1 txt3 zz) ; 首部框
    (setq ent (entget x))
    (setq txt1 (cdr (assoc 1 ent)))
    (setq zz 1)
    (while (or
             (> (atoi (substr txt1 zz 1)) 0)
             (= (substr txt1 zz 1) "0")
           )
      (setq zz (+ zz 1))
    )
    (if (> zz (strlen txt1))
      (setq txt3 kk)
      (setq txt3 (strcat kk (substr txt1 zz)))
    )
    (entmod (subst
              (cons 1 txt3)
              (assoc 1 ent)
              ent
            )
    )
  )
  (defun jys002 (x / ent txt3)               ; 尾部框
    (if (and
          (setq ent (entget x))
          (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT"))
        )
      (progn
        (setq kk (jys003 kk sbak))
        (if (= zz 0)
          (setq txt3 kk)
          (setq txt3 (strcat txt2 kk))
        )
        (entmod (subst
                  (cons 1 txt3)
                  (assoc 1 ent)
                  ent
                )
        )
      )
    )
  )
  (defun jys003 (st2 sbak / l l1 s st3 st4) ; 处理尾部数字
    (setq st3 st2
          s "0"
          st4 ""
          l (strlen st2)
    )
    (while (eq s "0")
      (setq s (substr st3 1 1)
            st3 (substr st3 2)
            st4 (if (eq s "0")
                  (strcat st4 s)
                  st4
                )
      )
    )                                       ; 将首位是0的数字分离出来
    (setq st2 (atoi st2)
          st2 (+ st2 sbak)
          st2 (itoa st2)
          st2 (strcat st4 st2)
          l1 (strlen st2)
          s (substr st2 1 1)
    )
    (if (and
          (= s "0")
          (> l1 l)
        )
      (setq st2 (substr st2 2))
    )                                       ; 处理了形如A09变为A10的问题
    st2
  )
  (defun dzs001 (lst vvs / e)
    (setq e (nth (atoi vvs) lst))
    (cons e (vl-remove e lst))
  )
  (defun dzs002 ()
    (show_list "e01" lst1)
    (show_list "e02" lst2)
    (show_list "e03" lst3)
  )
  (setvar "cmdecho" 0)
  (vl-load-com)
  (setq orerr *error*)
  (setq *error* errsub)
  (while (progn
           (if (setq wbak (vl-registry-read "HKEY_CURRENT_USER\\software\\TH++" "wbak"))
             (setq lst1 (cons wbak (vl-remove wbak '("尾部" "首部"))))
             (setq lst1 '("尾部" "首部"))
           )
           (if (setq sbak (vl-registry-read "HKEY_CURRENT_USER\\software\\TH++" "sbak"))
             (setq lst2 (cons sbak (vl-remove sbak '("1" "2"
                                               "3" "4"
                                               "5" "6"
                                               "7" "8"
                                               "9" "10"
                                               "15" "20"
                                               "30" "40"
                                               "50"
                                              )
                                   )
                        )
             )
             (setq lst2 '("1" "2"
                    "3" "4"
                    "5" "6"
                    "7" "8"
                    "9" "10"
                    "15" "20"
                    "30" "40"
                    "50"
                   )
             )
           )
           (if (setq dbak (vl-registry-read "HKEY_CURRENT_USER\\software\\TH++" "dbak"))
             (setq lst3 (cons dbak (vl-remove dbak '("单选" "窗选"))))
             (setq lst3 '("单选" "窗选"))
           )
           (initget "S ")
           (if (= (setq ent (nentsel (strcat "\n选择起始文字[设置(S)]:<" (car lst1) "加" (setq sbak (car lst2))
                                             ">"
                                     )
                            )
                  )
                  "S"
               )
             (progn
               (setq dclname (cond
                               ((setq tempname (vl-filename-mktemp "dzs.dcl")
                                      filen (open tempname "w")
                                )
                                 (foreach stream '("\n" "dzs1:dialog {\n"
                                    "     label = \"递增刷v3.0\" ;\n" "     :boxed_column {\n"
                                    "         label = \"设置\" ;\n" "         :row {\n"
                                    "             :text {label = \" 递增位置\" ; }\n"
                                    "             :text {label = \"递增步长\" ;  }\n"
                                    "             :text {label = \"目标文字\" ;  }\n" "         }\n"
                                    "         :row {\n" "             :popup_list { key = \"e01\" ;  edit_width = 7 ; }\n"
                                    "             :popup_list { key = \"e02\" ;  edit_width = 7 ; }\n"
                                    "             :popup_list { key = \"e03\" ;  edit_width = 7 ; }\n"
                                    "         }\n" "     }\n"
                                    "     ok_cancel;\n" " }\n"
                                   )
                                   (princ stream filen)
                                 )
                                 (close filen)
                                 tempname
                               )
                             )
               )
               (setq dcl_re (load_dialog dclname))
               (if (not (new_dialog "dzs1" dcl_re))
                 (exit)
               )
               (show_list "e01" lst1)
               (show_list "e02" lst2)
               (show_list "e03" lst3)
               (action_tile "e01" "(setq lst1 (dzs001 lst1  $value))(dzs002) ")        ; 位置
               (action_tile "e02" "(setq lst2 (dzs001 lst2  $value))(dzs002)") ; 步长
               (action_tile "e03" "(setq lst3 (dzs001 lst3  $value))(dzs002)") ; 对象
               (action_tile "accept" "(setq dcl_pt (done_dialog 1)) ") ; 确定
               (setq bb (start_dialog))
               (if (= bb 1)
                 (progn
                   (vl-registry-write "HKEY_CURRENT_USER\\software\\TH++" "wbak" (car lst1))
                   (vl-registry-write "HKEY_CURRENT_USER\\software\\TH++" "sbak" (car lst2))
                   (vl-registry-write "HKEY_CURRENT_USER\\software\\TH++" "dbak" (car lst3))
                 )
               )
               (unload_dialog dcl_re)
               (vl-file-delete dclname)
             )
           )
           (or
             (= ent "S")
             (null ent)
             (not (member (cdr (assoc 0 (entget (car ent)))) '("TEXT" "MTEXT"
                           "ATTRIB"
                          )
                  )
             )
           )
         )
    (if (= 52 (getvar "errno"))
      (vl-exit-with-error "")
    )
  )
  (setq pt1 (cadr ent))
  (setq txt1 (entget (car ent)))
  (setq box (textbox (list (assoc 1 txt1) (assoc 40 txt1) (assoc 7 txt1)))) ; 文本框坐标
  (setq txtlong (/ (- (car (cadr box)) (car (car box))) 2))
  (setq txt1 (cdr (assoc 1 txt1)))
  (setq sbak (car lst2))
  (setq sbak (atoi sbak))
  (if (= (car lst1) "尾部")
    (progn
      (setq zz (strlen txt1))
      (while (and
               (>= zz 1)
               (or
                 (> (atoi (substr txt1 zz 1)) 0)
                 (= (substr txt1 zz 1) "0")
               )
             )
        (setq zz (- zz 1))
      )
      (setq kk (substr txt1 (+ zz 1)))
      (if (/= zz 0)
        (setq txt2 (substr txt1 1 zz))
      )
      ;;(command ".UNDO" "BE")
      (if (= (car lst3) "窗选")
        (llt:match pt1 '(2 7) (list (strcat "\n选择目标文字:<尾部加" (itoa sbak) ">") '((0 . "*TEXT"))) '(lambda (x /)
                                                                                                           (jys002 x)
                                                                                                         )
        )
        (while t
          (princ (strcat "\n选择目标文字:<尾部加" (itoa sbak) ">"))
          (setq name nil)
          (if (and
                (setq ent (llt:entsel pt1 2))
                (setq ent (entget ent))
                (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT"
                         "ATTRIB"
                        )
                )
              )
            (progn
              (setq kk (jys003 kk sbak))
              (if (= zz 0)
                (setq txt3 kk)
                (setq txt3 (strcat txt2 kk))
              )
              (if name
                (if (and
                      (setq ent1 (entget (car name)))
                      (= (cdr (assoc 0 ent1)) "DIMENSION")
                    )
                  (entmod (subst
                            (cons 1 txt3)
                            (assoc 1 ent1)
                            ent1
                          )
                  )
                  (progn
                    (entmod (subst
                              (cons 1 txt3)
                              (assoc 1 ent)
                              ent
                            )
                    )
                    (entupd (car name))
                  )
                )
                (entmod (subst
                          (cons 1 txt3)
                          (assoc 1 ent)
                          ent
                        )
                )
              )
            )
            (vl-exit-with-error "")
          )
        )
      )
     (command ".UNDO" "E")
    )
  )
  (if (= (car lst1) "首部")
    (progn
      (setq zz 1)
      (while (or
               (> (atoi (substr txt1 zz 1)) 0)
               (= (substr txt1 zz 1) "0")
             )
        (setq zz (+ zz 1))
      )
      (if (= zz 1)
        (setq kk "0")
        (setq kk (substr txt1 1 (- zz 1)))
      )
      ;;(command ".UNDO" "BE")
      (if (= (car lst3) "窗选")
        (progn
          (setq kk (jys003 kk sbak))
          (llt:match pt1 '(2 7) (list (strcat "\n选择目标文字:<首部加" (itoa sbak) ">") '((0 . "*TEXT"))) '(lambda (x /)
                                                                                                             (jys001 x kk)
                                                                                                           )
          )
        )
        (while t
          (setq kk (jys003 kk sbak))
          (princ (strcat "\n选择目标文字:<首部加" (itoa sbak) ">"))
          (setq name nil)
          (if (and
                (setq ent (llt:entsel pt1 2))
                (setq ent (entget ent))
                (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT"
                         "ATTRIB"
                        )
                )
              )
            (progn
              (setq txt1 (cdr (assoc 1 ent)))
              (setq zz 1)
              (while (or
                       (> (atoi (substr txt1 zz 1)) 0)
                       (= (substr txt1 zz 1) "0")
                     )
                (setq zz (+ zz 1))
              )
              (if (> zz (strlen txt1))
                (setq txt3 kk)
                (setq txt3 (strcat kk (substr txt1 zz)))
              )
              (if name
                (if (and
                      (setq ent1 (entget (car name)))
                      (= (cdr (assoc 0 ent1)) "DIMENSION")
                    )
                  (entmod (subst
                            (cons 1 txt3)
                            (assoc 1 ent1)
                            ent1
                          )
                  )
                  (progn
                    (entmod (subst
                              (cons 1 txt3)
                              (assoc 1 ent)
                              ent
                            )
                    )
                    (entupd (car name))
                  )
                )
                (entmod (subst
                          (cons 1 txt3)
                          (assoc 1 ent)
                          ent
                        )
                )
              )
            )
            (vl-exit-with-error "")
          )
        )
      )
(command ".UNDO" "E")
    )
  )
  (setq *error* orerr)
  (command ".UNDO" "E")
  (princ)
)


最佳答案

查看完整内容

再试试这样。。之前是ssget的过滤条件没写好。改成这样就行了。 我也是初学的,并不是大师,哈
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2018-10-12 18:47 | 显示全部楼层
669423907 发表于 2018-10-13 12:07
非常感谢evayleung大师的回复,
程序提示:
ssget 列表错误

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

再试试这样。。之前是ssget的过滤条件没写好。改成这样就行了。
  1. (LIST '(0 . "*TEXT")(CONS 8 TXT1_LYR))

我也是初学的,并不是大师,哈
回复

使用道具 举报

发表于 2018-10-12 21:09 | 显示全部楼层
本帖最后由 evayleung 于 2018-10-12 21:10 编辑

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

使用道具 举报

 楼主| 发表于 2018-10-13 12:07 | 显示全部楼层
evayleung 发表于 2018-10-12 21:09
试试是这样子么?

非常感谢evayleung大师的回复,
程序提示:
ssget 列表错误

麻烦在帮看看是哪里问题,谢谢
回复

使用道具 举报

发表于 2020-5-29 11:20 | 显示全部楼层
不能框选啊
回复

使用道具 举报

发表于 2021-10-22 11:59 | 显示全部楼层
楼主,你的能刷属性块内文字吗?我下载的刷不了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 06:20 , Processed in 0.440198 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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