在两条闭合多段线之间创建边界
你好。我正在寻找一个 lisp 代码来在 2 条重叠的闭合折线(如照片)之间创建边界。我知道我可以使用 bounady 命令,但有时绘图不是那么干净和简单(必须有孵化 ot 块等)。 我将此代码用于多边界,但会为选择中的所有区域创建边界。在示例中,您可以看到一条红色闭合折线和一条白色闭合折线。我想选择红色和白色的折线并在重叠区域创建绿色边界。(defun c:test ( / *error* big ent enx idx int lst pt1 pt2 rtn sel spc tmp tot val var vtx )
(defun *error* ( msg )
(foreach obj rtn
(if (and (vlax-write-enabled-p obj) (not (vlax-erased-p obj)))
(vla-delete obj)
)
)
(mapcar 'setvar var val)
(LM:endundo (LM:acdoc))
(if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
(princ (strcat "\nError: " msg))
)
(princ)
)
(LM:startundo (LM:acdoc))
(cond
( (= 4 (logand 4 (cdr (assoc 70 (tblsearch "layer" (getvar 'clayer))))))
(princ "\nCurrent layer locked.")
)
( (setq sel
(LM:ssget "\nSelect Lines or Polylines: "
(list
(list
'(-4 . "<OR")
'(0 . "LINE")
'(-4 . "<AND")
'(0 . "LWPOLYLINE")
'(-4 . "<NOT")
'(-4 . "<>")
'(42 . 0.0)
'(-4 . "NOT>")
'(-4 . "AND>")
'(-4 . "OR>")
(if (= 1 (getvar 'cvport))
(cons 410 (getvar 'ctab))
'(410 . "Model")
)
)
)
)
)
(setq spc
(vlax-get-property (LM:acdoc)
(if (= 1 (getvar 'cvport))
'paperspace
'modelspace
)
)
)
(repeat (setq idx (sslength sel))
(if (= "LINE" (cdr (assoc 0 (setq enx (entget (ssname sel (setq idx (1- idx))))))))
(setq lst (cons (list (cdr (assoc 10 enx)) (cdr (assoc 11 enx))) lst))
(setq vtx (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) enx))
vtx (mapcar 'list vtx (if (= 1 (logand 1 (cdr (assoc 70 enx)))) (cons (last vtx) vtx) (cdr vtx)))
lst (append vtx lst)
)
)
)
(foreach pl1 lst
(setq pt1 (carpl1)
pt2 (cadr pl1)
)
(foreach pl2 lst
(if
(and
(not (equal pl1 pl2 1e-8))
(setq int (inters pt1 pt2 (car pl2) (cadr pl2)))
(not (vl-member-if '(lambda ( pnt ) (equal pnt int 1e-8)) pl1))
)
(setq pl1 (cons int pl1))
)
)
(setq rtn
(append
(mapcar
(function
(lambda ( a b )
(vla-addline spc
(vlax-3D-point a)
(vlax-3D-point b)
)
)
)
(setq pl1
(vl-sort pl1
(function
(lambda ( a b )
(< (distance pt1 a) (distance pt1 b))
)
)
)
)
(cdr pl1)
)
rtn
)
)
)
(setq var '(cmdecho peditaccept)
val(mapcar 'getvar var)
tot0.0
)
(mapcar 'setvar var '(0 1))
(foreach reg (vlax-invoke spc 'addregion rtn)
(setq ent (entlast))
(command "_.pedit" "_m")
(apply 'command (mapcar 'vlax-vla-object->ename (vlax-invoke reg 'explode)))
(command "" "_j" "" "")
(if
(and
(not (eq ent (setq ent (entlast))))
(= "LWPOLYLINE" (cdr (assoc 0 (entget ent))))
)
(progn
(setq tmp (vlax-curve-getarea ent)
tot (+ tot tmp)
)
(if (< (car big) tmp)
(setq big (list tmp ent))
)
)
)
(vla-delete reg)
)
(if (equal (car big) (/ tot 2.0) 1e-3) ;; Gian Paolo Cattaneo
(entdel (cadr big))
)
(foreach obj rtn (vla-delete obj))
(mapcar 'setvar var val)
)
)
(LM:endundo (LM:acdoc))
(princ)
)
;; ssget-Lee Mac
;; A wrapper for the ssget function to permit the use of a custom selection prompt
;; msg - selection prompt
;; arg - list of ssget arguments
(defun LM:ssget ( msg arg / sel )
(princ msg)
(setvar 'nomutt 1)
(setq sel (vl-catch-all-apply 'ssget arg))
(setvar 'nomutt 0)
(if (not (vl-catch-all-error-p sel)) sel)
)
;; Start Undo-Lee Mac
;; Opens an Undo Group.
(defun LM:startundo ( doc )
(LM:endundo doc)
(vla-startundomark doc)
)
;; End Undo-Lee Mac
;; Closes an Undo Group.
(defun LM:endundo ( doc )
(while (= 8 (logand 8 (getvar 'undoctl)))
(vla-endundomark doc)
)
)
;; Active Document-Lee Mac
;; Returns the VLA Active Document Object
(defun LM:acdoc nil
(eval (list 'defun 'LM:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
(LM:acdoc)
)
(vl-load-com) (princ)
页:
[1]