Message 1 of 10
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Dear Experts,
Have a difficulty to finish >> this thread << and i'm asking for your help.
bellow is the code i have so far... variable 'cross' is a list collecting all intersect points. what i need is functions to return a list with groups of points in this format:
grp0 grp1 grp2
( ((x y z)) ((x y z) (x y z)) ((x y z) (x y z) (x y z)) ........)
in a group all points must fall in < cmrk-fazz (a variable in program) from each other.
in >> this thread << you will find more info you need including a sample dwg to test.
thanks in advance
Moshe
(defun c:cmrk (/ askreal is_intersect double->lst ; local functions
CMRK-FUZZ ss data ename0 ename1 pline0 pline1 rgn1 rgnUnion doubles points)
(defun askreal (def)
(initget 4)
(if (not (setq ask (getreal (strcat "\ncmrk-fuzz <" (rtos def 2) ">: "))))
(setq ask def)
(setq def ask)
)
); askreal
(defun is_intersect (o0 o1 / r)
(if
(not
(vl-catch-all-error-p
(setq r (vl-catch-all-apply 'vlax-invoke (list o0 'IntersectWith o1 acExtendNone)))
)
)
r
)
); is_intersect
(defun double->lst (doubles / _index i lst)
(setq _index (lambda (b inc) (+ (* b 3) inc)))
(setq i -1)
(repeat (/ (length doubles) 3)
(setq i (1+ i))
(setq lst (cons (list (nth (_index i 0) doubles) (nth (_index i 1) doubles) (nth (_index i 2) doubles)) lst))
)
lst
); double->lst
; here start c:cmrk
(setvar "cmdecho" 0)
(command "._undo" "_begin")
(setq cross nil)
(if (= (getvar "userr1") 0)
(setq def-fuzz (setvar "userr1" 1e-2))
(setq def-fuzz (getvar "userr1"))
)
(if (and
(setvar "userr1" (setq cmrk-fuzz (askreal def-fuzz)))
(setq ss (ssget '((0 . "lwpolyline") (70 . 1)))) ; select closed polylines
)
(progn
(setq data (mapcar '(lambda (ename) ename) (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
(foreach ename0 (reverse (cdr (reverse data)))
(setq pline0 (vlax-ename->vla-object ename0))
(foreach ename1 (cdr (member ename0 data))
(setq pline1 (vlax-ename->vla-object ename1))
(if (setq doubles (is_intersect pline0 pline1))
(progn
(command ".region" "_si" (vlax-vla-object->ename (vla-copy pline0)))
(setq rgn0 (entlast))
(command ".region" "_si" (vlax-vla-object->ename (vla-copy pline1)))
(setq rgn1 (entlast))
(command "._union" rgn0 rgn1 "")
(setq rgnUnion (vlax-ename->vla-object (entlast)))
(if (and
(not (equal (vla-get-area rgnUnion) (+ (vlax-curve-getarea pline0) (vlax-curve-getarea pline1)) 0.0))
(setq points (double->lst doubles))
)
(setq cross (append cross points))
); if
(vla-delete rgnUnion)
(vlax-release-object rgnUnion)
); progn
); if
(vlax-release-object pline1)
); foreach
(vlax-release-object pline0)
); foreach
); progn
); if
(command "._undo" "_end")
(setvar "cmdecho" 0)
(princ)
); c:cmrk
Solved! Go to Solution.