好梦压星河啊 发表于 2021-3-17 19:16:26

一个特别强大的修剪程序(可框选和划线修剪)

小弟我偶然发现了发现了一个特别强大的修剪程序,可以框选修剪也可以划线修剪,十分方便。但是存在两个问题,第一个问题:外伸距离小于0.2的无法被修剪,第二个问题:只能在世界坐标系中使用,如果在其他坐标系中使用就出错,

希望大佬能帮忙完善一下,把插件附在下面,需要使用的可以自己拿走使用!
;;可点可框的修剪
(defun c:tt(/ PO SS I J S1 P1 P2 )
(vl-load-com)
(setq osvalue (getvar "osmode"))
(SETVAR "CMDECHO" 0)
(setvar "osmode" 0)
(setqplist NIL ssnil pt0 nil len NIL)
(if(setq s1 (ssget))(setq len (sslength s1)))
(command "undo" "be")
(cond((= len 1);;;;;;;;;;;;;;;;;;;;如果是单选
   (setq po(getpoint "\n请点选要被剪的一侧:") e1(ssname s1 0))
   (command ".offset" 0.2 e1 po "") ;0.2是偏移值,小于0.2会导致修剪不准确
   (setq en(entlast) dx0(dxf 0 e1))
   (if po
       (setq plist(dd en))
   )
   (command "trim" S1 "")
   (repeat 5
   (command "f")
   (apply 'command plist)
   (COMMAND "")
   )
   
   (COMMAND "")
)
((> len 1);;;;;;;;;;如果是多选
   (prompt"\n请选择修剪方式<左击移动/右击框选>:")
   (setq code_12 (grread (setq code (grread))));将类型代码 12 的数据从缓冲区中清除
   (initget 128)
   (if (= (car (setq g (grread nil 4 0))) 3)
      (setq fs 3)
      (setq fs nil)
   )
   (cond ((= fs 3);;;;;如果是左击
    (setq z t)
    (command "trim" s1 "")
    (while z
      (prompt"\n点击鼠标后开始修剪")
      (if g (setq pt(cadr g) g nil)(setq pt (getpoint)))
      (if pt
      (progn (command "f")
               (mapcar'(lambda(x)(command "NON" x))(getpts))
         (command "")
            )
      (setq z nil)
      )
   )
    (command "")
    )
    ((not fs);;;如果是右击
      (setqp1 (getpoint "\n请框选被修剪对象:")
      p3 (getcorner p1)
      ss (ssget "c" p1 p3)
      )
      (setq z t)
      (while z;
      (SETq LEN2 (SSLENGTH SS))
      (setq p2 (list (car p1) (cadr p3))
      p4 (list (car p3) (cadr p1))
      )
      (command "trim" s1 "")
      (REPEAT LEN2
          (COMMAND "NON" "f" p1 p2 p3 p4 p1 "")
      )
      (COMMAND "")
      (setq ss nil)
      (initget 128)
      (if(setq p1 (getpoint "\n请框选被修剪对象:"))
          (setq p3 (getcorner p1)
          ss (ssget "c" p1 p3)
          )
      )
      (if(not ss)
          (setq z nil)
      )
      );
    );;;
         );;;;;
   );;;;;;;;;;
((not len);;如果没有选择
   (command ".trim" "")
   )
);;;;;;;;;;;;;;;;;;;;
   (command "undo" "e")
   (setvar 'cmdecho 1)
   (setvar 'osmode 1)
   (PRINC)
)
;;;
(defun dxf(n ename)
(cdr(assoc n (entget ename)))
)
;;;
(defun getpts(/ gr pt0 pt dis)
(setq pts nil)
(setq dis (* 0.001 (getvar "viewsize")))
(while (= 5 (car (setq gr (grread t 4 0))))
    (setq pt (cadr gr))
    (if(not pt0)
      (setq pt0pt
      pts(cons pt0 pts)
      )
    )
    (if(> (distance pt pt0) dis)
      (progn
(grdraw pt pt0 1 1)
(setq pts (cons pt pts)
      pt0 pt
)
      )
    )
)
(redraw)
(reverse pts)
)
;;;;
(defun dd (x)
(setq obj x obj(vlax-ename->vla-object obj))
(setq zc (vlax-curve-getdistatparam
      obj
      (vlax-curve-getendparam obj)
          )
       )
(setq et(vlax-curve-getEndPoint obj)
st(vlax-curve-getStartPoint obj)
)
(cond ((= dx0 "LINE")
(setq plist(append(list st et))))
((= dx0 "LWPOLYLINE")
          (mapcar '(lambda (x)
      (if (= (car x) 10)
      (setq plist (cons (cdr x) plist))
      )
          )
         (entget en)
       )
   (if(= 1 (dxf 70 x))(setq p0(car plist) plist(append plist (list p0))))
         )
   ((OR(= dx0 "SPLINE")(= dx0 "CIRCLE")(= dx0 "ELLIPSE"))
            (setq zc(fix zc) k 0)
            (command "_.divide" x zc)
            (setq snew(ssget "p"))
            (repeat (sslength snew)
             (setq s(ssname snew k))
             (setq dx(dxf 10 s))
             (setq plist(cons dx plist))
             (setq k(1+ k))
            )
            (command "erase" snew "")
      (setq plist(reverse plist))
      (IF(/= dx0 "SPLINE")
      (setq plist(appendplist (list et)))
      (setq plist(append (list st) plist (list et)))
      )
    )
   )
(entdel x)
plist
)
(setvar "osmode" osvalue )
(setvar "ORTHOMODE" 1)

xk15c 发表于 2021-3-18 06:56:11

做一个快乐学习的人

coverne 发表于 2021-3-18 08:00:23

工具箱不香么

yuren008 发表于 2021-3-18 09:12:55

做个对论坛有益的人。

hbwr123 发表于 2021-3-18 10:12:33

学习一下~~~~~~~~~~

hh_lj007 发表于 2021-3-18 10:24:48

谢谢分享!

hbwr123 发表于 2021-3-18 11:01:39

看了下这代码,局部变量很多没有定义,还有各种缩进、语法问题,看着简直折磨人

好梦压星河啊 发表于 2021-3-18 13:49:47

hbwr123 发表于 2021-3-18 11:01
看了下这代码,局部变量很多没有定义,还有各种缩进、语法问题,看着简直折磨人

大佬能帮忙完善一下吗?{:1_9:}

weizx2000 发表于 2021-3-19 00:09:54

谢谢分享!~~~~~~~

weizx2000 发表于 2021-3-19 00:10:55

谢谢分享谢谢分享谢谢分享谢谢分享谢谢分享

hbwr123 发表于 2021-3-19 09:11:58

好梦压星河啊 发表于 2021-3-18 13:49
大佬能帮忙完善一下吗?


楼主平时绘图的单位是0.1以下的吗?注释上说了小于0.2会导致修剪不准确,不要随意修改。除非你的绘图单位很小
(defun dd (x / zc obj et st snew k dx)
      (setq obj (vlax-ename->vla-object x))
      (setq zc (vlax-curve-getdistatparam ;;长度
          obj
          (vlax-curve-getendparam obj)
            )
         )
      (setq et (trans (vlax-curve-getEndPoint obj) 0 1)
          st (trans (vlax-curve-getStartPoint obj) 0 1)
      )
      (cond
      ((= dx0 "LINE")
            (setq plist (append (list st et)))
          )
      ((= dx0 "LWPOLYLINE")
             (mapcar '(lambda (x)
                  (if (= (car x) 10)
                      (setq plist (cons (trans (cdr x) 0 1) plist))
                  )
                  )
            (entget en)
         )
            (if(= 1 (dxf 70 x))(setq plist (append plist (list (car plist)))))
      )
      ((or (= dx0 "SPLINE")(= dx0 "CIRCLE")(= dx0 "ELLIPSE"))
                  (setq zc (fix zc) k 0)
                  (command "_.divide" x zc)
                  (setq snew (ssget "p"))
                  (repeat (sslength snew)
                   (setq s (ssname snew k))
                   (setq dx (dxf 10 s))
                   (setq plist (cons (trans (cdr dx) 0 1) plist))
                   (setq k (1+ k))
                  )
                  (command "erase" snew "")
            (setq plist(reverse plist))
            (if (/= dx0 "SPLINE")
            (setq plist (appendplist (list et)))
            (setq plist (append (list st) plist (list et)))
            )
      )
      )
      (entdel x)
      plist
)把函数dd用以上替换一下,解决用户坐标系不能用的问题

(command ".offset" (* 0.001 (getvar "viewsize")) e1 po "")用以上代码替换下面一行,解决小于0.2会无法裁剪问题
(command ".offset" 0.2 e1 po "")

xd_黄工 发表于 2021-3-19 10:22:03

希望多多参与回帖,对帖主鼓励的同时自己还能获得币

moonwalkers 发表于 2021-3-19 11:32:37

做一个快乐学习的人

好梦压星河啊 发表于 2021-3-19 14:00:03

本帖最后由 好梦压星河啊 于 2021-3-19 14:40 编辑

hbwr123 发表于 2021-3-19 09:11
楼主平时绘图的单位是0.1以下的吗?注释上说了小于0.2会导致修剪不准确,不要随意修改。除非你的绘图单 ...
非常感谢大佬帮助,我刚刚试了一下,两个问题都已经解决,但是我发现了一个新的问题,就是如果使用该插件期间,按esc退出的话,会导致捕捉设置失效,原插件最后有(setvar "osmode" 487) ,但中途退出不生效,有什么好的解决办法吗?

hbwr123 发表于 2021-3-20 15:29:27

本帖最后由 hbwr123 于 2021-3-20 15:31 编辑

好梦压星河啊 发表于 2021-3-19 14:00
非常感谢大佬帮助,我刚刚试了一下,两个问题都已经解决,但是我发现了一个新的问题,就是如果使用该插件 ...
在(defun c:tt(/ PO SS I J S1 P1 P2 )下一行插入以下代码:(defun tt:error(msg)
                (setq *error* olderror olderror nil)
                (command "undo" "e")
         (setvar 'cmdecho 1)
         (setvar 'osmode osvalue)
                (princ msg)
      )
      (setq olderror *error* *error* tt:error)

并且把函数c:tt最后的
(setvar 'osmode 1)
改为
(setvar 'osmode osvalue)



页: [1] 2
查看完整版本: 一个特别强大的修剪程序(可框选和划线修剪)