本帖最后由 xiaxiang 于 2012-3-20 13:32 编辑
如下代码须全部一起选中,边界必须是复线
 - (defun c:mextend (/ ang c e lines lwp lyr ptlst pts ss)
- (if (setq ss (ssget ":L" '((0 . "LWPOLYLINE,LINE,SPLINE,CIRCLE"))))
- (progn
- (mapcar '(lambda (e)
- (if (wcmatch (cdr (assoc 0 (entget e))) "LINE")
- (setq lines (cons e lines))
- (setq lwp (cons e lwp))
- )
- )
- (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
- )
- (if (and lwp lines)
- (foreach l (mapcar 'vlax-ename->vla-object lines)
- (setq
- ang (vla-get-angle l)
- lyr (vla-get-layer l)
- ptlst nil
- )
- (foreach pl (mapcar 'vlax-ename->vla-object lwp)
- (setq c nil)
- (if
- (and (vlax-property-available-p pl 'closed) (zerop (vlax-get pl 'closed)) (setq c t))
- (vlax-put pl 'closed -1)
- )
- (if (setq pts (vlax-invoke l 'intersectwith pl acextendthisentity))
- (while pts
- (setq ptlst (cons (list (car pts) (cadr pts)) ptlst))
- (setq pts (cdddr pts))
- )
- )
- (and c (vlax-put pl 'closed 0))
- )
- (if ptlst
- (progn (setq ptlst (vl-sort ptlst
- (function (lambda (d1 d2)
- (if (equal ang 0.0 pi)
- (> (car d1) (car d2))
- (< (cadr d1) (cadr d2))
- )
- )
- )
- )
- )
- (while ptlst
- (entmakex
- (list '(0 . "LINE") (cons 8 lyr) (cons 10 (car ptlst)) (cons 11 (cadr ptlst)))
- )
- (setq ptlst (cddr ptlst))
- )
- (vla-delete l)
- )
- )
- )
- )
- )
- )
- (princ)
- )
|