Jump to content

Recommended Posts

Posted

Hi

 

I have a couple of hundred 3D Polylines which have point crosses at each vertex. Does anyone have a way to remove these point crosses that fall on the 3D Polylines i.e. a LISP solution?

 

Reason I can't just filter out the points and delete is that there are points that don't fall on Polylines which I want to keep. All points are on the same layer. Polylines are on various layers. Data is from a 3D topographical survey.

 

Many thanks

Demesne

Posted

Can you post a sample? -David

Posted

Here is a quickly written program, it might take a while on large drawings though:

 

(defun c:PtDel ( / en i lst p1 s1 s2 )
   (if
       (and
           (setq s1 (ssget "_X" (list '(0 . "POLYLINE") (cons 410 (getvar 'CTAB)))))
           (setq s2 (ssget "_X" (list '(0 . "POINT")    (cons 410 (getvar 'CTAB)))))
       )
       (progn
           (repeat (setq i (sslength s1))
               (setq en (ssname s1 (setq i (1- i))))
               (while (eq "VERTEX" (cdr (assoc  0 (entget (setq en (entnext en))))))
                   (setq lst (cons (cdr (assoc 10 (entget en))) lst))
               )
           )
           (repeat (setq i (sslength s2))
               (setq en (ssname s2 (setq i (1- i)))
                     p1 (cdr (assoc 10 (entget en)))
               )
               (if (vl-some '(lambda ( p2 ) (equal p1 p2 1e-) lst)
                   (entdel en)
               )
           )
       )
   )
   (princ)
)
(vl-load-com) (princ)

Posted (edited)

Yes, sorry, Point Entities.

 

Two examples attached. Both of the same extract from a larger drawing.

 

BEFORE.dwg - points entities on line vertexes and individual points representing ground height.

 

AFTER.dwg - point entities on line vertexes removed individual points remain.

 

 

Many thanks

Demesne

BEFORE.dwg

AFTER.dwg

Edited by Demesne
no attachments!!
Posted (edited)

I took a little different approach:

 

[b][color=BLACK]([/color][/b]defun c:del-vpt [b][color=FUCHSIA]([/color][/b]/ pl ss en ed vn vd[b][color=FUCHSIA])[/color][/b]

[color=#8b4513];;;ROUND A POINT VALUE[/color]
[color=#8b4513];;;ARG -> Pointlist Decimalplace[/color]
[color=#8b4513];;;RET -> POINT LIST[/color]
 [b][color=FUCHSIA]([/color][/b]defun roundpt [b][color=NAVY]([/color][/b]p d[b][color=NAVY])[/color][/b]
   [b][color=NAVY]([/color][/b]list [b][color=MAROON]([/color][/b]atof [b][color=GREEN]([/color][/b]rtos [b][color=BLUE]([/color][/b]car p[b][color=BLUE])[/color][/b] 2 d[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
         [b][color=MAROON]([/color][/b]atof [b][color=GREEN]([/color][/b]rtos [b][color=BLUE]([/color][/b]cadr p[b][color=BLUE])[/color][/b] 2 d[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
         [b][color=MAROON]([/color][/b]atof [b][color=GREEN]([/color][/b]rtos [b][color=BLUE]([/color][/b]caddr p[b][color=BLUE])[/color][/b] 2 d[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]and [b][color=NAVY]([/color][/b]setq ss [b][color=MAROON]([/color][/b]ssget [color=#2f4f4f]"X"[/color] '[b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]0 . [color=#2f4f4f]"POLYLINE"[/color][b][color=BLUE])[/color][/b]
                            [b][color=BLUE]([/color][/b]-4 . [color=#2f4f4f]"<OR"[/color][b][color=BLUE])[/color][/b]
                              [b][color=BLUE]([/color][/b]70 . 8[b][color=BLUE])[/color][/b]
                              [b][color=BLUE]([/color][/b]70 . 9[b][color=BLUE])[/color][/b]
                            [b][color=BLUE]([/color][/b]-4 . [color=#2f4f4f]"OR>"[/color][b][color=BLUE])[/color][/b]  [b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
      [b][color=NAVY]([/color][/b]while [b][color=MAROON]([/color][/b]setq en [b][color=GREEN]([/color][/b]ssname ss 0[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]setq vn [b][color=GREEN]([/color][/b]entnext en[b][color=GREEN])[/color][/b]
                   vd [b][color=GREEN]([/color][/b]entget vn[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]while [b][color=GREEN]([/color][/b]= [color=#2f4f4f]"VERTEX"[/color] [b][color=BLUE]([/color][/b]cdr [b][color=RED]([/color][/b]assoc 0 vd[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
                    [b][color=GREEN]([/color][/b]setq pl [b][color=BLUE]([/color][/b]cons [b][color=RED]([/color][/b]roundpt [b][color=PURPLE]([/color][/b]cdr [b][color=TEAL]([/color][/b]assoc 10 vd[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b] 8[b][color=RED])[/color][/b] pl[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
                    [b][color=GREEN]([/color][/b]setq vn [b][color=BLUE]([/color][/b]entnext vn[b][color=BLUE])[/color][/b]
                          vd [b][color=BLUE]([/color][/b]entget vn[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]ssdel en ss[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]and [b][color=NAVY]([/color][/b]setq ss [b][color=MAROON]([/color][/b]ssget [color=#2f4f4f]"X"[/color] '[b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]0 . [color=#2f4f4f]"POINT"[/color][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
      [b][color=NAVY]([/color][/b]while [b][color=MAROON]([/color][/b]setq en [b][color=GREEN]([/color][/b]ssname ss 0[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]setq ed [b][color=GREEN]([/color][/b]entget en[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]if [b][color=GREEN]([/color][/b]member [b][color=BLUE]([/color][/b]roundpt [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 10 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] 8[b][color=BLUE])[/color][/b] pl[b][color=GREEN])[/color][/b]
                 [b][color=GREEN]([/color][/b]entdel en[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
            [b][color=MAROON]([/color][/b]ssdel en ss[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
[b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 

-David

 

Well maybe not quite so differnt after all......

Edited by David Bethel
Allow for closed 3D Polylines
Posted

Thanks Lee

 

I have just run that on a 1MB drawing with 5213 3D Polylines and 7220 points. It took about 25 seconds but saves a great deal of time.

 

David - I'll try out yours now.

 

Thanks again.

Demesne

Posted

Well, now here's something.

 

Lee - Your routine took 22sec and leaves 3305 points remaining

David - Your routine took 11sec and leaves 3742 points remaining

 

...not that it's a race but I thought you might like to know.

 

It looks like the latter is leaving point entities on closed polylines.

 

Now that the drawing I'm looking at has been 'cleaned' I see that some of the points remaining are sitting on polylines but not on their vertices. Is it possible that the point entities that fall on polylines can also be removed? And as I feel like I've asked for too much already, I may as well go the whole hog and see if there's any chance of a fuzz-factor option? ;)

 

Thanks ....again.

 

Demesne

Posted

The fuzz factor in my code is the 1e-8 - this means that it will accept any point inside a ball of radius 1e-8 from the point/vertex.

Posted

Thanks Lee

 

I've had a play around with it and it works great for the point entities on polyline vertices.

Posted

I also used 8 places as a tolerance. ( Updated to allow for closed polylines post #6 )

 

Lee's allows for any type pline and only in the current layout. There all kinds of ways to filter the selection set

ie

only 3dpolyines on a given layer etc. It's kind of up to you to state what needs to be filtered. -David

Posted

Here's a stab with added point on line segments:

 

[b][color=BLACK]([/color][/b]defun c:del-vpt [b][color=FUCHSIA]([/color][/b]/ pl ss en ed vn vd vl sl i p10[b][color=FUCHSIA])[/color][/b]

[color=#8b4513];;;ARG -> TestPt LinePt1 LinePt2 Fuzz[/color]
[color=#8b4513];;;RET T nil[/color]
[b][color=FUCHSIA]([/color][/b]defun is_pt_online [b][color=NAVY]([/color][/b]pt l1 l2 fz[b][color=NAVY])[/color][/b]
 [b][color=NAVY]([/color][/b]and [b][color=MAROON]([/color][/b]numberp fz[b][color=MAROON])[/color][/b]
      [b][color=MAROON]([/color][/b]equal [b][color=GREEN]([/color][/b]distance l1 l2[b][color=GREEN])[/color][/b]
             [b][color=GREEN]([/color][/b]+ [b][color=BLUE]([/color][/b]distance l1 pt[b][color=BLUE])[/color][/b]
                [b][color=BLUE]([/color][/b]distance l2 pt[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] fz[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

[color=#8b4513];;;ROUND A POINT VALUE[/color]
[color=#8b4513];;;ARG -> Pointlist Decimalplace[/color]
[color=#8b4513];;;RET -> POINT LIST[/color]
 [b][color=FUCHSIA]([/color][/b]defun roundpt [b][color=NAVY]([/color][/b]p d[b][color=NAVY])[/color][/b]
   [b][color=NAVY]([/color][/b]list [b][color=MAROON]([/color][/b]atof [b][color=GREEN]([/color][/b]rtos [b][color=BLUE]([/color][/b]car p[b][color=BLUE])[/color][/b] 2 d[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
         [b][color=MAROON]([/color][/b]atof [b][color=GREEN]([/color][/b]rtos [b][color=BLUE]([/color][/b]cadr p[b][color=BLUE])[/color][/b] 2 d[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
         [b][color=MAROON]([/color][/b]atof [b][color=GREEN]([/color][/b]rtos [b][color=BLUE]([/color][/b]caddr p[b][color=BLUE])[/color][/b] 2 d[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]princ [color=#2f4f4f]"\nReading 3DPOLY Data...\n"[/color][b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]and [b][color=NAVY]([/color][/b]setq ss [b][color=MAROON]([/color][/b]ssget [color=#2f4f4f]"X"[/color] '[b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]0 . [color=#2f4f4f]"POLYLINE"[/color][b][color=BLUE])[/color][/b]
                            [b][color=BLUE]([/color][/b]-4 . [color=#2f4f4f]"<OR"[/color][b][color=BLUE])[/color][/b]
                              [b][color=BLUE]([/color][/b]70 . 8[b][color=BLUE])[/color][/b]
                              [b][color=BLUE]([/color][/b]70 . 9[b][color=BLUE])[/color][/b]
                            [b][color=BLUE]([/color][/b]-4 . [color=#2f4f4f]"OR>"[/color][b][color=BLUE])[/color][/b]  [b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
      [b][color=NAVY]([/color][/b]while [b][color=MAROON]([/color][/b]setq en [b][color=GREEN]([/color][/b]ssname ss 0[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]princ [color=#2f4f4f]"\r"[/color][b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]prin1 en[b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]setq ed [b][color=GREEN]([/color][/b]entget en[b][color=GREEN])[/color][/b]
                   vn [b][color=GREEN]([/color][/b]entnext en[b][color=GREEN])[/color][/b]
                   vd [b][color=GREEN]([/color][/b]entget vn[b][color=GREEN])[/color][/b]
                   vl nil[b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]while [b][color=GREEN]([/color][/b]= [color=#2f4f4f]"VERTEX"[/color] [b][color=BLUE]([/color][/b]cdr [b][color=RED]([/color][/b]assoc 0 vd[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
                    [b][color=GREEN]([/color][/b]setq pl [b][color=BLUE]([/color][/b]cons [b][color=RED]([/color][/b]roundpt [b][color=PURPLE]([/color][/b]cdr [b][color=TEAL]([/color][/b]assoc 10 vd[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b] 8[b][color=RED])[/color][/b] pl[b][color=BLUE])[/color][/b]
                          vl [b][color=BLUE]([/color][/b]cons [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 10 vd[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] vl[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
                    [b][color=GREEN]([/color][/b]setq vn [b][color=BLUE]([/color][/b]entnext vn[b][color=BLUE])[/color][/b]
                          vd [b][color=BLUE]([/color][/b]entget vn[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]setq i 0[b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]repeat [b][color=GREEN]([/color][/b]1- [b][color=BLUE]([/color][/b]length vl[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
                     [b][color=GREEN]([/color][/b]setq sl [b][color=BLUE]([/color][/b]cons [b][color=RED]([/color][/b]list [b][color=PURPLE]([/color][/b]nth i vl[b][color=PURPLE])[/color][/b] [b][color=PURPLE]([/color][/b]nth [b][color=TEAL]([/color][/b]1+ i[b][color=TEAL])[/color][/b] vl[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] sl[b][color=BLUE])[/color][/b]
                            i [b][color=BLUE]([/color][/b]1+ i[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]if [b][color=GREEN]([/color][/b]= [b][color=BLUE]([/color][/b]cdr [b][color=RED]([/color][/b]assoc 70 ed[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b] 9[b][color=GREEN])[/color][/b]
                 [b][color=GREEN]([/color][/b]setq sl [b][color=BLUE]([/color][/b]cons [b][color=RED]([/color][/b]list [b][color=PURPLE]([/color][/b]car vl[b][color=PURPLE])[/color][/b] [b][color=PURPLE]([/color][/b]last vl[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b] sl[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]ssdel en ss[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]princ [color=#2f4f4f]"\nReading Point Data...\n"[/color][b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]and [b][color=NAVY]([/color][/b]setq ss [b][color=MAROON]([/color][/b]ssget [color=#2f4f4f]"X"[/color] '[b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]0 . [color=#2f4f4f]"POINT"[/color][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
      [b][color=NAVY]([/color][/b]while [b][color=MAROON]([/color][/b]setq en [b][color=GREEN]([/color][/b]ssname ss 0[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]princ [color=#2f4f4f]"\r"[/color][b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]prin1 en[b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]setq ed [b][color=GREEN]([/color][/b]entget en[b][color=GREEN])[/color][/b]
                  p10 [b][color=GREEN]([/color][/b]cdr [b][color=BLUE]([/color][/b]assoc 10 ed[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]if [b][color=GREEN]([/color][/b]member [b][color=BLUE]([/color][/b]roundpt p10 8[b][color=BLUE])[/color][/b] pl[b][color=GREEN])[/color][/b]
                 [b][color=GREEN]([/color][/b]entdel en[b][color=GREEN])[/color][/b]
                 [b][color=GREEN]([/color][/b]foreach s sl
                    [b][color=BLUE]([/color][/b]and [b][color=RED]([/color][/b]entget en[b][color=RED])[/color][/b]
                         [b][color=RED]([/color][/b]is_pt_online p10 [b][color=PURPLE]([/color][/b]nth 0 s[b][color=PURPLE])[/color][/b] [b][color=PURPLE]([/color][/b]nth 1 s[b][color=PURPLE])[/color][/b] 1e-8[b][color=RED])[/color][/b]
                         [b][color=RED]([/color][/b]entdel en[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]ssdel en ss[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

[b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 

 

This could add a substantial amount of processing time to the routine. -David

Posted

David,

 

Consider:

 

(-4 . "&=") (70 . 

 

For the Polyline bit-code filter :thumbsup:

Posted
David,

 

Consider:

 

(-4 . "&=") (70 . 

 

For the Polyline bit-code filter :thumbsup:

 

 

Lee, that wouldn't filter spline fitted ( 4 ) 3DPOLYs. I don't think those would be good candidates for this process. -David

Posted
Lee, that wouldn't filter spline fitted ( 4 ) 3DPOLYs. I don't think those would be good candidates for this process. -David

 

Good catch, I hadn't considered those ;)

Posted

David

 

Many thanks. You're right - it does take longer, but now gives an excuse to put the kettle on.

Posted

We Yanks would brew a pot. Most of us don't own a kettle -David

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
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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...