Jump to content

how do I find self intersections


Recommended Posts

I'm trying to create a region out of a closed polyline and it keeps telling me I have self intersection. What is a self intersection? I'm guessing it means the polylines criss-cross at some point, but I don't see any such thing anywhere. I would I find it?

Link to post
Share on other sites
umop-3p!sdn

The only way I've ever gotten past that is to zoom in EXTREMELY on every intersecting line .... :(

 

Anyone have a better way?

Link to post
Share on other sites
fuccaro

Try to select the polyline and go to the PROPERTIES window (CTRL+1). Under the GEOMETRY you have the properties of the Vertex1. Click the field where says Vertex1 and you see two arrows pointing to left/right. Press one of them and you can see the other vertexes. Watch the screen and you will see a mark "walking" on your polyline. Sometimes you can see the place where "something is wrong" just watching the order and the position of the vertexes.

Also you can use the PEDIT command for this.

Link to post
Share on other sites
  • 2 years later...

I have the same errormessage with an spline.

It's a logo converted from EPS to DWG.

Unfortunately it seems that Spline doesn't allow you to 'walk' trought the vertices.

 

Any Idea how to tackle this one?

Link to post
Share on other sites
skipsophrenic
I have the same errormessage with an spline.

It's a logo converted from EPS to DWG.

Unfortunately it seems that Spline doesn't allow you to 'walk' trought the vertices.

 

Any Idea how to tackle this one?

 

Not sure about the problem mate sorry,

 

But just to let you know, if the threads been inactive for a couple of years, it's best to start a new one. :thumbsup:

 

Hope someone more knowledgable than me can help you out.

Link to post
Share on other sites

It is indeed a very old thread, but I wouldn't see why we couldn't bundle the solutions for this problem.

 

Thank you for any help.

I am manually tracing all my clients product logo's at the moment.

Link to post
Share on other sites
Lee Mac

In answer to the OP's inital question:

 

;  Self-Intersection Test by Lee McDonnell  ~  17.03.09

(defun c:SelfInt (/ ent iArr vLst iLst ptLst)
 (vl-load-com)
 (if (and (setq ent (vlax-ename->vla-object (car (entsel "\nSelect LWPline..."))))
      (eq "AcDbPolyline" (vla-get-ObjectName ent))
      (> (vlax-safearray-get-u-bound
       (setq iArr (vlax-variant-value
         (vla-IntersectWith ent ent acExtendNone))) 1) 0))
   (progn
     (setq vLst (mapcar '(lambda (x) (append (cdr x) '(0.0)))
            (vl-remove-if-not '(lambda (x) (= 10 (car x)))
               (entget (vlax-vla-object->ename ent)))))
      (setq iLst (vlax-safearray->list iArr))
     (while (not (zerop (length iLst)))
       (setq ptLst (cons (list (car iLst) (cadr iLst) (caddr iLst)) ptLst)
          iLst (cdddr iLst)))
     (setq ptLst (vl-remove-if '(lambda (x) (member x vLst)) ptLst))
     (if ptLst
   (alert (strcat "Object Intersects Itself in " (rtos (length ptLst) 2 0) " place(s).\n\n"
              (vl-princ-to-string ptLst)))
   (princ "\n<!> Object Doesn't Intersect Itself <!>")))
   (princ "\n<!> Object isn't a LWPline, or doesn't Intersect Itself <!>"))
 (princ))

The above will find all self-intersections for LWPOLYLINEs.

Link to post
Share on other sites

nice Lee Mac :)

 

you can also (if whatever autocad you're using has it) shrinkwrap it, then just delete the old pline, or draw a rectangle around the pline, and bpoly in the rectangle; it will draw a new pline around the old pline.

Link to post
Share on other sites
Lee Mac

Thanks Alan,

 

Am only using ACAD '04 - don't think I've even heard of the methods of which you speak :oops:

 

Let me know if you think its available with '04 :)

 

Lee

Link to post
Share on other sites
Thanks Alan,

 

Am only using ACAD '04 - don't think I've even heard of the methods of which you speak :oops:

 

Let me know if you think its available with '04 :)

 

Lee

 

well, shrinkwrap is an AEC command, won't come with generic acad. however, bpoly has been around forever.

bpoly, boundary, bp: i think these are the possible ways to execute it.

 

I haven't had a chance to test your routine, but I'm really excited about it. Sometimes, when i extract the boundary from a surface (to then alter & set as my surface boundary), it will tell me give me my polyline intersects itself. Generally shrinkwrap will solve the problem, but there are the situations where that won't do it (the new pline shrinkwrap creates will intersect itself).

 

Lee, are you taking coding classes? Just curious; seems like your coding has really improved in a short amount of time. Then again, i may be confusing your coding with someone else.

Link to post
Share on other sites
Lee Mac

Lee, are you taking coding classes? Just curious; seems like your coding has really improved in a short amount of time. Then again, i may be confusing your coding with someone else.

 

Thanks Alan, but no, I am not taking (and have never taken) coding classes... just learning from the people on here mostly.

 

ASMI's code has been a great help with the VL which I am just starting to get to grips with. I was always against using it and usually just resorted to the DXF code approach in most cases. But now that I have dipped my toe into the world of VL, things are a lot easier to manipulate with a lot less coding.

 

I learn most from just dissecting the code posted on here and see how people do things. That, and an AutoLISP reference manual helps.

 

Cheers

 

Lee

 

EDIT: plus the fact that I now spend pretty much every spare minute I get on this forum and coding. - I think an addiction is emerging... :P

Link to post
Share on other sites
Thanks Alan, but no, I am not taking (and have never taken) coding classes... just learning from the people on here mostly.

 

ASMI's code has been a great help with the VL which I am just starting to get to grips with. I was always against using it and usually just resorted to the DXF code approach in most cases. But now that I have dipped my toe into the world of VL, things are a lot easier to manipulate with a lot less coding.

 

I learn most from just dissecting the code posted on here and see how people do things. That, and an AutoLISP reference manual helps.

 

Cheers

 

Lee

 

EDIT: plus the fact that I now spend pretty much every spare minute I get on this forum and coding. - I think an addiction is emerging... :P

 

it's most definitely addictive. :)

yeah, until recently, i always just accessed the DXF library and did my coding from there. with our switch to 09 and beginning the usage of multileaders and annotative text, i realized a lot of my entmod routines didn't work. i looked into accessing the information through vla and soon realized that once you get the hang of how to retrieve the information, VLA is beyond powerful and so much better. i was able to completely rewrite (from scratch) several routines in one night; completely written in VLA.

Link to post
Share on other sites
  • 6 months later...
  • 2 months later...
In answer to the OP's inital question:

 

;  Self-Intersection Test by Lee McDonnell  ~  17.03.09

(defun c:SelfInt (/ ent iArr vLst iLst ptLst)
 (vl-load-com)
 (if (and (setq ent (vlax-ename->vla-object (car (entsel "\nSelect LWPline..."))))
      (eq "AcDbPolyline" (vla-get-ObjectName ent))
      (> (vlax-safearray-get-u-bound
       (setq iArr (vlax-variant-value
         (vla-IntersectWith ent ent acExtendNone))) 1) 0))
   (progn
     (setq vLst (mapcar '(lambda (x) (append (cdr x) '(0.0)))
            (vl-remove-if-not '(lambda (x) (= 10 (car x)))
               (entget (vlax-vla-object->ename ent)))))
      (setq iLst (vlax-safearray->list iArr))
     (while (not (zerop (length iLst)))
       (setq ptLst (cons (list (car iLst) (cadr iLst) (caddr iLst)) ptLst)
          iLst (cdddr iLst)))
     (setq ptLst (vl-remove-if '(lambda (x) (member x vLst)) ptLst))
     (if ptLst
   (alert (strcat "Object Intersects Itself in " (rtos (length ptLst) 2 0) " place(s).\n\n"
              (vl-princ-to-string ptLst)))
   (princ "\n<!> Object Doesn't Intersect Itself <!>")))
   (princ "\n<!> Object isn't a LWPline, or doesn't Intersect Itself <!>"))
 (princ))

The above will find all self-intersections for LWPOLYLINEs.

 

Hi

 

I'm trying to break polylines at self intersections, your code looks great, but it does not detect the intersection if the line has a vertex at that point.

Link to post
Share on other sites
Hi

 

I'm trying to break polylines at self intersections, your code looks great, but it does not detect the intersection if the line has a vertex at that point.

 

All the vertices of the polyline will be registered as self-intersections - hence I removed them from the list.

 

I shall look at the code for you :)

Link to post
Share on other sites

Check this:

 

[i][color=#990099];  Self-Intersection Test by Lee McDonnell  ~  19.12.09[/color][/i]

[b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] SelfInt [b][color=RED]([/color][/b]obj [b][color=BLUE]/[/color][/b] vlax-list->3D-point obj[b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]vl-load-com[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] vlax-list->3D-point [b][color=RED]([/color][/b]lst[b][color=RED])[/color][/b]
   [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] lst
     [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] lst[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cadr[/color][/b] lst[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]caddr[/color][/b] lst[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
           [b][color=RED]([/color][/b]vlax-list->3D-point [b][color=RED]([/color][/b][b][color=BLUE]cdddr[/color][/b] lst[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]or[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=DARKRED]'[/color][/b]VLA-OBJECT [b][color=RED]([/color][/b][b][color=BLUE]type[/color][/b] obj[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
     [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] obj [b][color=RED]([/color][/b][b][color=BLUE]vlax-ename->vla-object[/color][/b] obj[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b]vlax-list->3D-point [b][color=RED]([/color][/b][b][color=BLUE]vlax-invoke[/color][/b] obj [b][color=DARKRED]'[/color][/b]IntersectWith obj [b][color=Blue]acExtendNone[/color][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]



[b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:test [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] ent obj[b][color=RED])[/color][/b]

 [b][color=RED]([/color][/b][b][color=BLUE]while[/color][/b]
   [b][color=RED]([/color][/b][b][color=BLUE]progn[/color][/b]
     [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] ent [b][color=RED]([/color][/b][b][color=BLUE]car[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]entsel[/color][/b] [b][color=#ff00ff]"\nSelect Object: "[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

     [b][color=RED]([/color][/b][b][color=BLUE]cond[/color][/b] [b][color=RED]([/color][/b]  [b][color=RED]([/color][/b][b][color=BLUE]eq[/color][/b] [b][color=DARKRED]'[/color][/b]ENAME [b][color=RED]([/color][/b][b][color=BLUE]type[/color][/b] ent[b][color=RED])[/color][/b][b][color=RED])[/color][/b]

              [b][color=RED]([/color][/b][b][color=BLUE]if[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]not[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]vlax-method-applicable-p[/color][/b]
                         [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] obj [b][color=RED]([/color][/b][b][color=BLUE]vlax-ename->vla-object[/color][/b] ent[b][color=RED])[/color][/b][b][color=RED])[/color][/b] [b][color=DARKRED]'[/color][/b]IntersectWith[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
                [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b] [b][color=#ff00ff]"\n** Invalid Selection **"[/color][/b][b][color=RED])[/color][/b]

                [b][color=RED]([/color][/b][b][color=BLUE]not[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]foreach[/color][/b] x [b][color=RED]([/color][/b]SelfInt obj[b][color=RED])[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]print[/color][/b] x[b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
 

Link to post
Share on other sites

Try this for breakages:

 

;  Self-Intersection Test by Lee McDonnell  ~  19.12.09

(defun SelfInt (obj / vlax-list->3D-point obj)
 (vl-load-com)

 (defun vlax-list->3D-point (lst)
   (if lst
     (cons (list (car lst) (cadr lst) (caddr lst))
           (vlax-list->3D-point (cdddr lst)))))

 (or (eq 'VLA-OBJECT (type obj))
     (setq obj (vlax-ename->vla-object obj)))

 (vlax-list->3D-point (vlax-invoke obj 'IntersectWith obj acExtendNone)))



(defun c:test (/ *error* vl ov ent obj uflag doc)
 (vl-load-com)

 (defun *error* (msg)
   (and ov (mapcar (function setvar) vl ov))
   (and uflag (vla-EndUndomark doc))
   (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
       (princ (strcat "\n** Error: " msg " **")))
   (princ))
 

 (setq vl '("CMDECHO" "OSMODE") ov (mapcar (function getvar) vl))
 (mapcar (function setvar) vl '(0 0))
 

 (while
   (progn
     (setq ent (car (entsel "\nSelect Object: ")))

     (cond (  (eq 'ENAME (type ent))

              (if (not (vlax-method-applicable-p
                         (setq obj (vlax-ename->vla-object ent)) 'IntersectWith))
                (princ "\n** Invalid Selection **")
                (progn
                  (setq uflag (not (vla-StartUndomark
                                     (setq doc (vla-get-ActiveDocument
                                                 (vlax-get-acad-object))))))

                  (defun BrkSelf (ent)
                    (foreach x (SelfInt ent)
                      (vl-cmdf "_.break" (list ent x) "_F" x x)
                      (BrkSelf (entlast))))

                  (BrkSelf ent)                 
                  (setq uflag (vla-EndUndoMark doc))))))))

 (mapcar (function setvar) vl ov)                   
 (princ))
 

Link to post
Share on other sites
  • 10 years later...
On 10/8/2009 at 10:11 PM, orion said:

Offset the line a little bit- say .1". Delete the original. Offset it back. viola.

Thanks you so mush, This worked for me, I dropped the Daylights(boundary) from Civil3D corridor, and they had like thousands self intersecting points,

The lisps that were posted identified them, but Offset in and out 0.1 did the trick..

It did not want to offset out but In was working ..

Thanks

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...