trim和extend函数选择实体时使用的是entsel,可以使用 (list 实体名 点表) 来构成,这在早期编辑Mtrim之类的函数时会用到,圆角命令fillet也类似(估计切角命令也同),但在对复杂实体(包括块、重多段线POLYLINE等,这里主要指重多段线)等情况有所不同,圆角命令不允许对自身进行圆角操作,所以使用entsel得到的表不可用,所以,圆角命令的选择实际上是nentsel操作,即选取的是子实体。
在早期的版本中,多段线就是现在的重多段线,节点是采用实体跟随的形式,都是子实体,但从acadr14以后,引进了轻多段线的概念,轻多段线不再是复杂实体,使用nentsel也不再能得到子实体,因此,即使使用nentsel也无法得到其中的一段,因此无法自身圆角,这就是楼主无法圆角的原因。
知道原因,就可以想办法解决,不知道acad自身对fillet进行了怎样的改造,我能想到的办法是把轻多段线转换为重多段线(好在acad提供了这个转换命令),下面的代码就是一个基本代码,有兴趣的话可以看一下。
顺便说一句,pause是command函数下的强制交互控制符,应该是无法用point来激活的。
 - (defun c:tt ()
- (setq en1 (nentsel "\n选取第一条边:")
- en2 (nentsel "\n选取第二条边:")
- )
- (cond
- ((and (= (cdr (assoc 0 (entget (car en1)))) "LWPOLYLINE") ;第一点选择的是轻多段线(LWPOLYLINE)
- (equal (car en1) (car en2)) ;选择在同一条多段线上
- )
- (command "convertpoly" "H" en1 "") ;转换为重多段线(POLYLINE)
- (command "fillet"
- (nentselp (cadr en1)) ;“重新”拾取,此时拾取的是重多段线的一段
- (nentselp (cadr en2))
- )
- (command "convertpoly" "l" en1 "") ;转换回轻多段线
- )
- ((and (= (cdr (assoc 0 (entget (car en1)))) "LWPOLYLINE") ;第一条为轻多段线
- (/= (cdr (assoc 0 (entget (car en2)))) "LWPOLYLINE") ;第二条不是轻多段线
- )
- (command "convertpoly" "H" en1 "")
- (command "fillet"
- (nentselp (cadr en1))
- (nentselp (cadr en2))
- )
- (command "convertpoly" "l" en1 "")
- )
- ((and (= (cdr (assoc 0 (entget (car en2)))) "LWPOLYLINE") ;第二条是轻多段线
- (/= (cdr (assoc 0 (entget (car en1)))) "LWPOLYLINE") ;第一条不是轻多段线
- )
- (command "convertpoly" "H" en2 "")
- (command "fillet"
- (nentselp (cadr en1))
- (nentselp (cadr en2))
- )
- ; (command "convertpoly" "l" en1 "")
- )
- ((and (= (cdr (assoc 0 (entget (car en2)))) "LWPOLYLINE") ;选择两条不同的轻多段线
- (= (cdr (assoc 0 (entget (car en1)))) "LWPOLYLINE")
- (not (equal (car en1) (car en2)))
- )
- (command "convertpoly" "H" en1 en2 "")
- (command "fillet"
- (nentselp (cadr en1))
- (nentselp (cadr en2))
- )
- (command "convertpoly" "l" en1 "")
- )
- (t (command "fillet" en1 en2)) ;其它线条
- )
- )
|