本帖最后由 蒹葭_Keirll 于 2012-12-10 20:05 编辑
bdboy 发表于 2012-12-10 19:34
代码应该反过来用,已有梁线实现自动断开还算有用处,虽然网上有几个但识别率不高 - (defun c:trimall(/ os ss ssline n index index1 l_p1 l_p2 l_int len ent p1 p2 p3 p4 pselect a b )
- (command "undo" "be")
- (command "ucs" "w")
- (setq os (getvar "osmode"))
- (setvar "osmode" 0)
- (setq ss (ssget))
- (setq index 0
- l_p1 '()
- l_p2 '()
- l_int '()
- len (sslength ss)
- );end set
-
- (repeat len ;把直线端点存入表中
- (setq ent (entget (ssname ss index))
- index (+ 1 index)
- p1 (cdr (assoc 10 ent))
- p2 (cdr (assoc 11 ent))
- l_p1 (cons p1 l_p1)
- l_p2 (cons p2 l_p2)
- );end set
- );end repeat
-
- (setq index 0
- n (length l_p1)
- );end set
- (repeat n
- (setq p1 (nth index l_p1)
- p2 (nth index l_p2)
- index1 0
- );end set
- (repeat n ;计算某线与其他所有线的交点
- (if (/= index1 index)
- (setq p3 (nth index1 l_p1)
- p4 (nth index1 l_p2)
- index1 (+ 1 index1)
- pt (inters p1 p2 p3 p4)
- l_int (if pt (cons pt l_int) l_int)
- );end set
- (setq index1 (+ 1 index1))
- );end if
- );end repeat
- (if (= (car p1) (car p2)) ;排序
- (setq l_int (vl-sort l_int (function (lambda (e1 e2)(< (cadr e1) (cadr e2)))) ))
- (setq l_int (vl-sort l_int (function (lambda (e1 e2)(< (car e1) (car e2)))) ))
- );end if
- (setq
- pselect p1
- b pselect
- );end set
- (setq i 0
- len (length l_int)
- );end set
- (while (< i len) ;打断
- (setq
- pselect b
- a (nth i l_int);a<b
- b (nth (+ i 1) l_int)
- pselect (list (/ (+ (car pselect) (car a)) 2.0) (/ (+ (cadr pselect) (cadr a)) 2.0))
- );end set
- (setq ssline (nentselp pselect))
- (command "break" ssline "f" a b);break之后已经不是ssline了
- (setq i (+ i 2))
- );end while
- (setq l_int '()
- index (+ 1 index)
- );end set
- );end repeat
- (setvar "osmode" os)
- (command "ucs" "p")
- (command "undo" "e")
- );end fun
其实这个代码是在 已有梁线自动断开的代码 基础上做出来的,程序前半段是画梁线并把画出来的梁线作为一个选择集,后半段是实现梁线的自动断开。 梁线自动断开的单独程序可以是这个样子的,识别率可能也不会太高,若有高手看到,请指正。 |