I search an alternative to the command _BOUNDARY in the mode of pick point, for finding out minimum contours from intersecting elements (polylines, 3D polylines, lines, circles, ellipses, arcs, splines, multilines, regions): 1. not depending on the sizes of elements on the screen; 2. not depending on that, whether all possible elements of border are visible on the screen; 3. not thinking very long or infinitely; 4. not simplifying the found contours.
I found one variant - program BNDR only, but she does not develop, and actually inaccessible. I made video. At first it is shown how BNDR works, and then _BOUNDARY.
Alex this is for just simple cases, so your first pictures have islands and for this situations it will fail like you shown... For the cases of 2 DWGs you posted, I've discovered where the lacks in the code were... So retest your DWGs with this modification :
Number of points for checking can be greater and that means and reliability of final result can be greater (not precision - just safety for determination of possible smaller boundary parts of boundary curve sel. set you aquire at start)...
And this can improve speed of execution... Like master Evgeniy said if you want to make routine fast, you should cut tree of algorithm if some criteria is fulfilled meaning no need for looping thorugh all list, just terminate it and start over with next outiside loop data...
(mapcar
'(lambda ( a b / loop k v ray ipp ippl )
(setq loop t k -1)
(while (and loop (setq pp (nth (setq k (1+ k)) pll)))
(setq ippl nil)
(setq v (unit (mapcar '- (vlax-curve-getpointatparam c1 (/ (+ (vlax-curve-getparamatpoint c1 a) (vlax-curve-getparamatpoint c1 b)) 2.0)) (trans pp 1 0))))
(setq ray (entmakex (list '(0 . "RAY") '(100 . "AcDbEntity") '(100 . "AcDbRay") (cons 10 (trans pp 1 0)) (cons 11 v))))
(setq ipp (vlax-invoke (vlax-ename->vla-object ray) 'intersectwith (vlax-ename->vla-object c1) acextendnone))
(repeat (setq i2 (sslength ss))
(setq c2 (ssname ss (setq i2 (1- i2))))
(setq ipp (append (vlax-invoke (vlax-ename->vla-object ray) 'intersectwith (vlax-ename->vla-object c2) acextendnone) ipp))
)
(if ipp
(repeat (/ (length ipp) 3)
(setq ippl (cons (list (car ipp) (cadr ipp) (caddr ipp)) ippl))
(setq ipp (cdddr ipp))
)
)
(if (equal (vlax-curve-getpointatparam c1 (/ (+ (vlax-curve-getparamatpoint c1 a) (vlax-curve-getparamatpoint c1 b)) 2.0)) (car (setq ippl (vl-sort ippl '(lambda ( a b ) (< (vlax-curve-getparamatpoint ray a) (vlax-curve-getparamatpoint ray b)))))) 1e-6)
(if (not (vl-position (list a c1 b) trl))
(setq trl (cons (list a c1 b) trl) loop nil)
)
)
(entdel ray)
)
)
ipl
(cdr ipl)
)
So this is my latest revision and should work fast enough...
(defun c:bndr ( / *error* unit bbucs *adoc* pea pck ss p bb dx dy kx ky pp ipp1 ipp2 ippl1 ippl2 rec pl pll li1 li2 i1 c1 i2 c2 ip ipl trl s el sx ii cx k e i ray ipp ippl )
(vl-load-com)
(defun *error* ( m ) (if pea (setvar 'peditaccept pea) ) (if pck (setvar 'pickbox pck) ) (vla-endundomark *adoc*) (if m (prompt m) ) (princ) )
(defun unit ( v ) (if (not (equal v '(0.0 0.0 0.0) 1e-6)) (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v) ) )
(defun bbucs ( ss / UCS2WCSMatrix WCS2UCSMatrix n ent minpt maxpt minptlst maxptlst minptbbx minptbby minptbbz minptbb maxptbbx maxptbby maxptbbz maxptbb )
(vl-load-com)
;; Doug C. Broad, Jr. ;; can be used with vla-transformby to ;; transform objects from the UCS to the WCS (defun UCS2WCSMatrix () (vlax-tmatrix (append (mapcar '(lambda (vector origin) (append (trans vector 1 0 t) (list origin)) ) (list '(1 0 0) '(0 1 0) '(0 0 1)) (trans '(0 0 0) 0 1) ) (list '(0 0 0 1)) ) ) ) ;; transform objects from the WCS to the UCS (defun WCS2UCSMatrix () (vlax-tmatrix (append (mapcar '(lambda (vector origin) (append (trans vector 0 1 t) (list origin)) ) (list '(1 0 0) '(0 1 0) '(0 0 1)) (trans '(0 0 0) 1 0) ) (list '(0 0 0 1)) ) ) )
(if ss (progn (repeat (setq n (sslength ss)) (setq ent (ssname ss (setq n (1- n)))) (vla-TransformBy (vlax-ename->vla-object ent) (UCS2WCSMatrix)) (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint) (vla-TransformBy (vlax-ename->vla-object ent) (WCS2UCSMatrix)) (setq minpt (vlax-safearray->list minpoint)) (setq maxpt (vlax-safearray->list maxpoint)) (setq minptlst (cons minpt minptlst)) (setq maxptlst (cons maxpt maxptlst)) ) (setq minptbbx (caar (vl-sort minptlst '(lambda (a b) (< (car a) (car b)))))) (setq minptbby (cadar (vl-sort minptlst '(lambda (a b) (< (cadr a) (cadr b)))))) (setq minptbbz (caddar (vl-sort minptlst '(lambda (a b) (< (caddr a) (caddr b)))))) (setq maxptbbx (caar (vl-sort maxptlst '(lambda (a b) (> (car a) (car b)))))) (setq maxptbby (cadar (vl-sort maxptlst '(lambda (a b) (> (cadr a) (cadr b)))))) (setq maxptbbz (caddar (vl-sort maxptlst '(lambda (a b) (> (caddr a) (caddr b)))))) (setq minptbb (list minptbbx minptbby minptbbz)) (setq maxptbb (list maxptbbx maxptbby maxptbbz)) ) ) (list minptbb maxptbb) )
It turns out that you have to explode POLYLINE entities and then proceed with routine... Also my latest researches showed me that it's better to use points that don't cross other entites for 2,4, and so on times, so your DWG with narrow gap won't be as desired as you clearly have more general cases where this corssings isn't desirable (two rectangles that corss each other - if you pick point on one side it won't recognize correct boundary - it's correct if you pick inbetween of rectangles, but there is no way to program routine both for narrow gaps and this situation)... At the end I must say that I also revised final gathering of entities - with poor implementation of JOIN command it's better to do it for newer ACAD releases with REGION command followed with CONVTOSURFACE and then OFFSETEDGE, but for releases that don't have those commands it's better to leave it to create final REGION - this is only if your selection contained SPLINE or ELLIPSE... Also I've exculded CIRCLE and full ELLPISE as they can't be trimmed correctly... Couldn't remove ELLIPSE from selection as you may have elliptical arc, but maybe the best is to remove buggus full ellipses or circles if they cross or create their corresponding arcs and proceed... This is all from me for now... We'll see how it'll behave in action, but this is all for simple cases with no ISLANDs and complex contouring... Regards, M.R.
(defun c:bndr ( / *error* unit bbucs *adoc* pea pck qaf ss p bb dx dy kx ky pp ipx ipp1 ipp2 ippl1 ippl2 rec pl pll li1 li2 i1 c1 i2 c2 ip ipl trl s el sx ii cx k e i ray ipp ippl )
(vl-load-com)
(defun *error* ( m ) (if pea (setvar 'peditaccept pea) ) (if pck (setvar 'pickbox pck) ) (if qaf (setvar 'qaflags qaf) ) (vla-endundomark *adoc*) (if m (prompt m) ) (princ) )
(defun unit ( v ) (if (not (equal v '(0.0 0.0 0.0) 1e-6)) (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v) ) )
(defun bbucs ( ss / UCS2WCSMatrix WCS2UCSMatrix n ent minpt maxpt minptlst maxptlst minptbbx minptbby minptbbz minptbb maxptbbx maxptbby maxptbbz maxptbb )
(vl-load-com)
;; Doug C. Broad, Jr. ;; can be used with vla-transformby to ;; transform objects from the UCS to the WCS (defun UCS2WCSMatrix () (vlax-tmatrix (append (mapcar '(lambda (vector origin) (append (trans vector 1 0 t) (list origin)) ) (list '(1 0 0) '(0 1 0) '(0 0 1)) (trans '(0 0 0) 0 1) ) (list '(0 0 0 1)) ) ) ) ;; transform objects from the WCS to the UCS (defun WCS2UCSMatrix () (vlax-tmatrix (append (mapcar '(lambda (vector origin) (append (trans vector 0 1 t) (list origin)) ) (list '(1 0 0) '(0 1 0) '(0 0 1)) (trans '(0 0 0) 1 0) ) (list '(0 0 0 1)) ) ) )
(if ss (progn (repeat (setq n (sslength ss)) (setq ent (ssname ss (setq n (1- n)))) (vla-TransformBy (vlax-ename->vla-object ent) (UCS2WCSMatrix)) (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint) (vla-TransformBy (vlax-ename->vla-object ent) (WCS2UCSMatrix)) (setq minpt (vlax-safearray->list minpoint)) (setq maxpt (vlax-safearray->list maxpoint)) (setq minptlst (cons minpt minptlst)) (setq maxptlst (cons maxpt maxptlst)) ) (setq minptbbx (caar (vl-sort minptlst '(lambda (a b) (< (car a) (car b)))))) (setq minptbby (cadar (vl-sort minptlst '(lambda (a b) (< (cadr a) (cadr b)))))) (setq minptbbz (caddar (vl-sort minptlst '(lambda (a b) (< (caddr a) (caddr b)))))) (setq maxptbbx (caar (vl-sort maxptlst '(lambda (a b) (> (car a) (car b)))))) (setq maxptbby (cadar (vl-sort maxptlst '(lambda (a b) (> (cadr a) (cadr b)))))) (setq maxptbbz (caddar (vl-sort maxptlst '(lambda (a b) (> (caddr a) (caddr b)))))) (setq minptbb (list minptbbx minptbby minptbbz)) (setq maxptbb (list maxptbbx maxptbby maxptbbz)) ) ) (list minptbb maxptbb) )
(mapcar
'(lambda ( a b / loop k v ray ipp ippl )
(setq loop t k -1)
(while (and loop (setq pp (nth (setq k (1+ k)) pll)))
...
To add somewhere or to replace something?
Alex, I've already implemented that part in the code... Look into "Spoiler" roll button... Just click and you'll see my latest version... Look in my last post - last mark is "Spoiler"...
M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)
Still buggus and unconsistent, but I've modified it futher... Added alert message and choice option and now prepared for only newer releases of ACAD (those that support CONVTOSURFACE and OFFSETEDGE commands)... Now I am tired, maybe someone will jump in with fresh thoughts... My previous version had zooming, but then I gave up with this - examples that used to work didn't and example with zooming on some case worked - it's unconsistent and beside I don't know in what scale DWG would be drawn... Regards, M.R.
(defun c:bndr ( / *error* unit bbucs *adoc* pck qaf ss p bb dx dy kx ky pp ipx ipp1 ipp2 ippl1 ippl2 rec ch pl pll li1 li2 i1 c1 i2 c2 ip ipl trl s el sx ii cx k e i ray ipp ippl )
(vl-load-com)
(defun *error* ( m ) (if pck (setvar 'pickbox pck) ) (if qaf (setvar 'qaflags qaf) ) (vla-endundomark *adoc*) (if m (prompt m) ) (princ) )
(defun unit ( v ) (if (not (equal v '(0.0 0.0 0.0) 1e-6)) (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v) ) )
(defun bbucs ( ss / UCS2WCSMatrix WCS2UCSMatrix n ent minpt maxpt minptlst maxptlst minptbbx minptbby minptbbz minptbb maxptbbx maxptbby maxptbbz maxptbb )
(vl-load-com)
;; Doug C. Broad, Jr. ;; can be used with vla-transformby to ;; transform objects from the UCS to the WCS (defun UCS2WCSMatrix () (vlax-tmatrix (append (mapcar '(lambda (vector origin) (append (trans vector 1 0 t) (list origin)) ) (list '(1 0 0) '(0 1 0) '(0 0 1)) (trans '(0 0 0) 0 1) ) (list '(0 0 0 1)) ) ) ) ;; transform objects from the WCS to the UCS (defun WCS2UCSMatrix () (vlax-tmatrix (append (mapcar '(lambda (vector origin) (append (trans vector 0 1 t) (list origin)) ) (list '(1 0 0) '(0 1 0) '(0 0 1)) (trans '(0 0 0) 1 0) ) (list '(0 0 0 1)) ) ) )
(if ss (progn (repeat (setq n (sslength ss)) (setq ent (ssname ss (setq n (1- n)))) (vla-TransformBy (vlax-ename->vla-object ent) (UCS2WCSMatrix)) (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint) (vla-TransformBy (vlax-ename->vla-object ent) (WCS2UCSMatrix)) (setq minpt (vlax-safearray->list minpoint)) (setq maxpt (vlax-safearray->list maxpoint)) (setq minptlst (cons minpt minptlst)) (setq maxptlst (cons maxpt maxptlst)) ) (setq minptbbx (caar (vl-sort minptlst '(lambda (a b) (< (car a) (car b)))))) (setq minptbby (cadar (vl-sort minptlst '(lambda (a b) (< (cadr a) (cadr b)))))) (setq minptbbz (caddar (vl-sort minptlst '(lambda (a b) (< (caddr a) (caddr b)))))) (setq maxptbbx (caar (vl-sort maxptlst '(lambda (a b) (> (car a) (car b)))))) (setq maxptbby (cadar (vl-sort maxptlst '(lambda (a b) (> (cadr a) (cadr b)))))) (setq maxptbbz (caddar (vl-sort maxptlst '(lambda (a b) (> (caddr a) (caddr b)))))) (setq minptbb (list minptbbx minptbby minptbbz)) (setq maxptbb (list maxptbbx maxptbby maxptbbz)) ) ) (list minptbb maxptbb) )
At first long thinks (the computer old), and then endlessly: trim, etc. Or "*Invalid selection *"...
I think, need of a preliminary choice - already a problem...
I assumed long ago that the direct way isn't productive.
Possibly, for this task at first it is necessary to create special model of all file, the relations of the crossed lines, convenient for the fast analysis. And already on it to look for fragments of the lines forming the necessary boundary...
-- Alexander, private person, pacifist, english only with translator 🙂 --
At first long thinks (the computer old), and then endlessly: trim, etc. Or "*Invalid selection *"...
I think, need of a preliminary choice - already a problem...
I assumed long ago that the direct way isn't productive.
Possibly, for this task at first it is necessary to create special model of all file, the relations of the crossed lines, convenient for the fast analysis. And already on it to look for fragments of the lines forming the necessary boundary...
Alex, I worked further more on bugs you mentioned... This version is what I came up with, should be more consistent... Test it on your posted DWGs and passed...
Sorry, I made mistake in my last post... This is the version I should have posted...
(defun c:bndr ( / *error* unit bbucs *adoc* osm pck qaf ss p bb dx dy kx ky pp ipx ipp1 ipp2 ippl1 ippl2 rec ch pl pll li1 li2 i1 c1 i2 c2 ip ipl trl s el sx ii k e i ray ipp ippl )
(vl-load-com)
(defun *error* ( m ) (if osm (setvar 'osmode osm) ) (if pck (setvar 'pickbox pck) ) (if qaf (setvar 'qaflags qaf) ) (vla-endundomark *adoc*) (if m (progn (command "_.-VIEW" "_D" "{_VIEW_}") (prompt m) ) ) (princ) )
(defun unit ( v ) (if (not (equal v '(0.0 0.0 0.0) 1e-6)) (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v) ) )
(defun bbucs ( ss / UCS2WCSMatrix WCS2UCSMatrix n ent minpt maxpt minptlst maxptlst minptbbx minptbby minptbbz minptbb maxptbbx maxptbby maxptbbz maxptbb )
(vl-load-com)
;; Doug C. Broad, Jr. ;; can be used with vla-transformby to ;; transform objects from the UCS to the WCS (defun UCS2WCSMatrix () (vlax-tmatrix (append (mapcar '(lambda (vector origin) (append (trans vector 1 0 t) (list origin)) ) (list '(1 0 0) '(0 1 0) '(0 0 1)) (trans '(0 0 0) 0 1) ) (list '(0 0 0 1)) ) ) ) ;; transform objects from the WCS to the UCS (defun WCS2UCSMatrix () (vlax-tmatrix (append (mapcar '(lambda (vector origin) (append (trans vector 0 1 t) (list origin)) ) (list '(1 0 0) '(0 1 0) '(0 0 1)) (trans '(0 0 0) 1 0) ) (list '(0 0 0 1)) ) ) )
(if ss (progn (repeat (setq n (sslength ss)) (setq ent (ssname ss (setq n (1- n)))) (vla-TransformBy (vlax-ename->vla-object ent) (UCS2WCSMatrix)) (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint) (vla-TransformBy (vlax-ename->vla-object ent) (WCS2UCSMatrix)) (setq minpt (vlax-safearray->list minpoint)) (setq maxpt (vlax-safearray->list maxpoint)) (setq minptlst (cons minpt minptlst)) (setq maxptlst (cons maxpt maxptlst)) ) (setq minptbbx (caar (vl-sort minptlst '(lambda (a b) (< (car a) (car b)))))) (setq minptbby (cadar (vl-sort minptlst '(lambda (a b) (< (cadr a) (cadr b)))))) (setq minptbbz (caddar (vl-sort minptlst '(lambda (a b) (< (caddr a) (caddr b)))))) (setq maxptbbx (caar (vl-sort maxptlst '(lambda (a b) (> (car a) (car b)))))) (setq maxptbby (cadar (vl-sort maxptlst '(lambda (a b) (> (cadr a) (cadr b)))))) (setq maxptbbz (caddar (vl-sort maxptlst '(lambda (a b) (> (caddr a) (caddr b)))))) (setq minptbb (list minptbbx minptbby minptbbz)) (setq maxptbb (list maxptbbx maxptbby maxptbbz)) ) ) (list minptbb maxptbb) )
(defun c:bndr ( / *error* unit bbucs ssoverent process *adoc* osm pck qaf ss p bb dx dy kx ky pp ipx ipp1 ipp2 ippl1 ippl2 rec ch pl pll li1 li2 i1 c1 i2 c2 ip ipl trl s el k e i ray ipp ippl kk cadrtt ttt trx )
(vl-load-com)
(defun *error* ( m ) (if osm (setvar 'osmode osm) ) (if pck (setvar 'pickbox pck) ) (if qaf (setvar 'qaflags qaf) ) (vla-endundomark *adoc*) (if m (progn (command "_.-VIEW" "_D" "{_VIEW_}") (prompt m) ) ) (princ) )
(defun unit ( v ) (if (not (equal v '(0.0 0.0 0.0) 1e-6)) (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v) ) )
(defun ssoverent ( sp ep ent / spar epar len k dx ssx px sx )
(vl-load-com)
(setq spar (vlax-curve-getparamatpoint ent sp)) (setq epar (vlax-curve-getparamatpoint ent ep)) (setq len (- (vlax-curve-getdistatparam ent epar) (vlax-curve-getdistatparam ent spar))) (setq k 0 dx (/ len 100.0) ssx (ssadd)) (repeat 99 (setq px (vlax-curve-getpointatdist ent (+ (vlax-curve-getdistatparam ent spar) (* (setq k (1+ k)) dx)))) (setq sx (ssget "_C" (trans px 0 1) (trans px 0 1))) (if sx (repeat (setq ii (sslength sx)) (ssadd (ssname sx (setq ii (1- ii))) ssx) ) ) ) ssx )
(defun bbucs ( ss / UCS2WCSMatrix WCS2UCSMatrix n ent minpt maxpt minptlst maxptlst minptbbx minptbby minptbbz minptbb maxptbbx maxptbby maxptbbz maxptbb )
(vl-load-com)
;; Doug C. Broad, Jr. ;; can be used with vla-transformby to ;; transform objects from the UCS to the WCS (defun UCS2WCSMatrix () (vlax-tmatrix (append (mapcar '(lambda (vector origin) (append (trans vector 1 0 t) (list origin)) ) (list '(1 0 0) '(0 1 0) '(0 0 1)) (trans '(0 0 0) 0 1) ) (list '(0 0 0 1)) ) ) ) ;; transform objects from the WCS to the UCS (defun WCS2UCSMatrix () (vlax-tmatrix (append (mapcar '(lambda (vector origin) (append (trans vector 0 1 t) (list origin)) ) (list '(1 0 0) '(0 1 0) '(0 0 1)) (trans '(0 0 0) 1 0) ) (list '(0 0 0 1)) ) ) )
(if ss (progn (repeat (setq n (sslength ss)) (setq ent (ssname ss (setq n (1- n)))) (vla-TransformBy (vlax-ename->vla-object ent) (UCS2WCSMatrix)) (vla-getboundingbox (vlax-ename->vla-object ent) 'minpoint 'maxpoint) (vla-TransformBy (vlax-ename->vla-object ent) (WCS2UCSMatrix)) (setq minpt (vlax-safearray->list minpoint)) (setq maxpt (vlax-safearray->list maxpoint)) (setq minptlst (cons minpt minptlst)) (setq maxptlst (cons maxpt maxptlst)) ) (setq minptbbx (caar (vl-sort minptlst '(lambda (a b) (< (car a) (car b)))))) (setq minptbby (cadar (vl-sort minptlst '(lambda (a b) (< (cadr a) (cadr b)))))) (setq minptbbz (caddar (vl-sort minptlst '(lambda (a b) (< (caddr a) (caddr b)))))) (setq maxptbbx (caar (vl-sort maxptlst '(lambda (a b) (> (car a) (car b)))))) (setq maxptbby (cadar (vl-sort maxptlst '(lambda (a b) (> (cadr a) (cadr b)))))) (setq maxptbbz (caddar (vl-sort maxptlst '(lambda (a b) (> (caddr a) (caddr b)))))) (setq minptbb (list minptbbx minptbby minptbbz)) (setq maxptbb (list maxptbbx maxptbby maxptbbz)) ) ) (list minptbb maxptbb) )
In general becomes already obviously best of all. Though, and very long, but I understand that it is so far only a prototype. Main thing now: 1. unpredictability of results. Under approximately identical conditions and a points: - noodles_1_no.png - if is specified to No for "Does boundary contour have narrow passage [Yes/No] <yes>: N" - noodles_1_yes.png - is specified to Yes, - noodles_2_yes.png - too is specified to Yes. - noodles_2_no.png - is specified to No. Perhaps, I specified a point closer to this or that line? Still happens so: - noodles_3_yes.png - noodles_3_yes_delete.png - after deleting the created lines. also there is * Invalid selection * - for example, for the same point in the No. mode. 2. doesn't find "islands". Or finds only them. 3. after all need to beforehand select objects can be defect. Repetition of results of BOUNDARY... 😞
.
-- Alexander, private person, pacifist, english only with translator 🙂 --
Alex, you have to remove all islands, or put them on separate layer and freeze that layer... Then you start bndr.lsp and select objects (you may do "all"), then you pick internal point - no matter where just make sure that it's internal point, then you answer to the question but correct (yes - if there is narrow passage, or no - if it's clearly compound single portion of surrounding curves enclosing boundary... That's all - you may wait for it for a while to do the job, but it should return single entity (LWPOLYLINE or SPLINE - it must and should always be closed one)... Then thaw layer and repeat procedure for each island or course when finished with outer contouring... That's it - make sure you're using my last version - look into "Spoiler" pull down button... Regards, M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)
It buged me on trimming on one example... Just change inside (process) sub function in all occurances of (command "_.TRIM" ... ) factor from 0.01 to 0.05... Also no need to (setq entl nil) in ending of each (cond) statement inside (process) sub... Reply if you see something or if you have comment or important info...
Thanks, M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)
I removed islands in the frozen layer: - noodles_no_no_islands.png - two boundary, but isn't complete ("Can't invoke..."); - noodles_no_no_islands_delete.png - if to delete these boundary; - noodles_2_no_no_islands.png - is found not that boundary and isn't complete? "Cannot invoke...".
The related, in my opinion, problem - "fastest outline generator". In my opinion, the general model of lines was for this purpose created. It is solved successfully, and works very quickly.
-- Alexander, private person, pacifist, english only with translator 🙂 --