本帖最后由 柱哥 于 2018-6-6 15:48 编辑
请问如何修以下代码,让框选修剪后保留框选内的曲线!
下图是想要得到的效果:
 - (defun c:tf (/)
- (command "undo" "be")
- (prompt "\n 选择修剪的图形:")
- (setq ss (ssget '((-4 . "<NOT")
- (0 . "LINE")
- (-4 . "NOT>")
- )
- )
- )
- (setq svd_os (getvar "osmode")
- svd_cmd (getvar "cmdecho")
- )
- (setvar "cmdecho" 0)
- (setvar "osmode" 0)
- (setq xq (last (ssnamex ss 0))
- p1 (last (cadr xq))
- p3 (last (cadddr xq))
- )
- (setq s1 (ssget "w" p1 p3 '((0 . "CIRCLE"))))
- (if s1
- (progn
- (setq s1i 0)
- (repeat (sslength s1)
- (setq sn (ssname s1 s1i))
- (setq pl (circ_pts sn))
- (command "trim" sn "" "f")
- (foreach x pl (command x))
- (command "" "")
- (setq s1i (1+ s1i))
- )
- )
- )
- (setq s2 (ssget "w" p1 p3 '((0 . "LWPOLYLINE"))))
- (if s2
- (progn
- (setq s2i 0)
- (repeat (sslength s2)
- (setq sn (ssname s2 s2i))
- (setq pl (massoc 10 (entget sn)))
- (setq pm (mapcar '(lambda (x y) (/ (+ x y) 2.0)) (car pl) (caddr pl))) ;中点
- (command "offset" "0.001" sn pm "")
- (setq enl (entlast))
- (setq pl (massoc 10 (entget enl))
- pl (append pl (list (car pl)))
- )
- (entdel enl)
- (command ".trim" sn "" "f")
- (foreach x pl (command x))
- (command "" "")
- (setq s2i (1+ s2i))
- )
- )
- )
- (setvar "cmdecho" svd_cmd)
- (setvar "osmode" svd_os)
- (command "undo" "e")
- (princ)
- )
- (defun circ_pts (enm) ;选区为圆点表
- (setq lst (entget enm)
- ang (* pi 2)
- inc (/ ang 64)
- tmp '()
- seg 65
- )
- (repeat seg
- (setq pt (polar (cdr (assoc 10 lst)) ang (- (cdr (assoc 40 lst)) 0.01))
- ang (+ inc ang)
- )
- (setq tmp (cons pt tmp))
- )
- tmp
- )
- ;(massoc 10 (entget (car (entsel))))
- (defun massoc (key alist / x nlist) ;选区为多段线各顶点表
- (foreach x alist
- (if (eq key (car x))
- (setq nlist (cons (cdr x) nlist))
- )
- )
- (reverse nlist)
- )
|