本帖最后由 vormittag 于 2011-11-15 20:08 编辑
我简单写了一个,代码不一定健壮。楼主可以试试看是不是这个效果,只对lwpolyline有效。
 - (defun c:te(/ ell pename pt obj n ptlist ellpre ellpost pts pte pt1 p linename lineell)
- (while (or (not (setq pename (entsel))) (/= (cdr (assoc 0 (setq ell (entget (car pename))))) "LWPOLYLINE"))
- );while
- (setq pt (cadr pename)
- obj (vlax-ename->vla-object (car pename))
- n (fix (vlax-curve-getParamAtPoint obj (vlax-curve-getClosestPointTo obj (trans pt 1 0))))
- pts (nth n (apply 'append (mapcar '(lambda(x) (if (= 10 (car x)) (list (cdr x)))) ell)))
- ellpre (member (cons 10 pts) (reverse ell))
- ellpost (cdr (member (cons 10 pts) ell))
- pte (cdr (assoc 10 ellpost))
- p (grread t 4 0)
- pt1 (cadr p)
- );setq
- (entmake (list '(0 . "LINE") (cons 10 (trans pt 1 0)) (cons 11 (trans pt1 1 0))))
- (setq linename (entlast)
- lineell (entget linename)
- );setq
- (while (= 5 (car p))
- (setq p (grread t 4 0)
- pt1 (cadr p)
- vec (mapcar '- (trans pt1 1 0) (trans pt 1 0))
- ellpre (subst (cons 10 (mapcar '+ vec pts)) (assoc 10 ellpre) ellpre)
- ellpost (subst (cons 10 (mapcar '+ vec pte)) (assoc 10 ellpost) ellpost)
- ell (append (reverse ellpre) ellpost)
- lineell (subst (cons 11 (trans pt1 1 0)) (assoc 11 lineell) lineell)
- );setq
- (entmod ell)
- (entmod lineell)
- );while
- (entdel linename)
- (princ)
- )
|