Jump to content

Sort list of lines and arcs


doaiena

Recommended Posts

Hello guys,

 

This is my first post in the forum, though ive been a reader for a few years now.

 

Ive been working on a passion project/hobby for the last few months. I want to export cad data (lines,arcs) to a cnc machine. I seem to be stuck and i have the feeling im making the code worse as time passes.

 

I have a part drawn with lines and arcs and cuts that have to be done also drawn with lines and arcs (in 3D). My goal is to sort all the connected lines/arcs so that i get a list of continuous points. Every new cut should append the same list.

 

Example:

(list cut1-1 cut1-2 cut1-3 cut2-1 cut2-2 cut2-3 cut2-4 cut3-1 cut3-2 ...etc)

 

So far ive written around 50Kb of code but it is very sloppy and unefficient, and it doesnt always sort the lines and arcs as intended.

Im not sure you have the time/patience to read through the whole thing, so ill give you a quick summary of the logic.

 

--------------

(ssget lines)

(repeat sslength

(add start points to list)

(add end points to list)

)

(same procedure with arcs)

 

(merge lists of start and end points for lines)

(remove unwanded lines)

(same procedure with arcs)

(add lines and arcs to single list)

;;; lines have 2 points (ctr startX endX startY endY startZ endZ) - length 7

;;; arcs have 3 points (crt startX midX endX startY midY endY startZ midZ endZ) - length 10

 

(here comes the sorting part in which i fail)

 

 

 

I compare start and end points for X and Y for both arcs and lines using FOREACH. Its not efficient and does not give consistent results.

 

 

If needed i can upload a sample dwg and the code.

 

 

I think my logic is all wrong. I would be very happy if you could help me with some kind of sorting algorithm. Thank you in advance.

Link to comment
Share on other sites

Ive prepared a worst case scenario showing most of what i can encounter.

 

The piece has a height of 9mm. My approach right now is as follows:

 

I get rid of all the top lines/arcs that have a Z=9.

I remove all the vertical lines.

That leaves me with all the arcs/lines on Z=0 (and in this case a groove with 4 more lines on Z=3.34).

 

Now i want to sort all the connected lines/arcs in a list. The starting point doesnt matter to me. Thats basically it.

Example.dwg

Link to comment
Share on other sites

You could use the 'grouppoints' function from my code here to return a list of lists in which each sublist represents a set of connected points - of course, you may need to tweak the code to retain other properties (such as arc center/radius) in the output.

Link to comment
Share on other sites

Thank you for the info Lee Mac. Sadly i dont fully understand your code (my skill level is way below yours). I see that the code works with this kind of list

(((point) (point)) ((point) (point) (point))) and im not sure how to edit it to work with my lists.

 

Here is a sample list for the attatched dwg. The point coordinates are based from the lower right corner of the part.

 

lines:

((12 108.457 108.457 145.739 202.165 9.0 9.0) (13 74.7268 108.457 145.739 145.739 9.0 9.0) (14 74.7268 74.7268 202.165 145.739 9.0 9.0) (15 108.457 74.7268 202.165 202.165 9.0 9.0) (16 121.317 121.317 72.8736 85.7702 9.0 9.0) (17 56.0645 118.817 70.3736 70.3736 9.0 9.0) (18 53.5645 53.5645 85.7702 72.8736 9.0 9.0) (19 118.817 56.0645 88.2702 88.2702 9.0 9.0) (20 159.135 153.951 97.0091 97.0091 9.0 9.0) (21 159.135 159.135 0.0 97.0091 9.0 9.0) (22 118.167 232.096 231.126 231.126 9.0 9.0) (23 118.167 118.167 266.439 231.126 9.0 9.0) (24 141.583 141.583 246.29 266.439 9.0 9.0) (25 236.86 141.583 246.29 246.29 9.0 9.0) (26 153.951 153.951 97.0091 0.0 9.0 9.0) (61 159.135 159.135 0.0 97.0091 3.33584 3.33584) (63 159.135 153.951 97.0091 97.0091 3.33584 3.33584) (64 153.951 153.951 97.0091 0.0 3.33584 3.33584))

 

arcs:

((14 195.693 167.649 221.136 111.152 168.395 203.07 9.0 9.0 9.0) (12 53.5645 54.2967 56.0645 85.7702 87.538 88.2702 9.0 9.0 9.0) (11 56.0645 54.2967 53.5645 70.3736 71.1059 72.8736 9.0 9.0 9.0) (3 43.4322 49.8641 8.53788e-011 175.975 270.013 350.0 9.0 9.0 9.0) (1 4.83169e-012 9.72401 43.4322 1.71697e-010 90.9474 175.975 9.0 9.0 9.0) (4 250.0 211.121 195.693 9.42606e-011 49.8476 111.152 9.0 9.0 9.0) (7 236.86 247.456 250.0 246.29 297.635 350.0 9.0 9.0 9.0) (9 221.136 226.928 232.096 203.07 216.976 231.126 9.0 9.0 9.0) (10 118.817 120.585 121.317 70.3736 71.1059 72.8736 9.0 9.0 9.0) (13 121.317 120.585 118.817 85.7702 87.538 88.2702 9.0 9.0 9.0) (15 141.583 129.875 118.167 266.439 278.148 266.439 9.0 9.0 9.0))

 

 

The line list is (counter X1 X2 Y1 Y2 Z1 Z2)

The arc list is (counter X1 Xmid X2 Y1 Ymid Y2 Z1 Zmid Z2)

Link to comment
Share on other sites

variable cl contains the cutlist

 

Here's what I'd try :

 

[b][color=BLACK]([/color][/b]defun c:cutlist [b][color=FUCHSIA]([/color][/b]/ ss i en ed z zl ssp c d
                   ce ra sa ea ia sp ep mp[b][color=FUCHSIA])[/color][/b] [color=#8b4513]; cl global[/color]

 [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]not ss[b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]setq ss [b][color=MAROON]([/color][/b]ssget [b][color=GREEN]([/color][/b]list [b][color=BLUE]([/color][/b]cons 0 [color=#2f4f4f]"ARC,LINE"[/color][b][color=BLUE])[/color][/b][b][color=BLUE]([/color][/b]list 210 0 0 1[b][color=BLUE])[/color][/b][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]setq i 0[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]setq en [b][color=MAROON]([/color][/b]ssname ss i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]setq ed [b][color=MAROON]([/color][/b]entget en[b][color=MAROON])[/color][/b]
               z [b][color=MAROON]([/color][/b]cadddr [b][color=GREEN]([/color][/b]assoc 10 ed[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]if [b][color=MAROON]([/color][/b]not [b][color=GREEN]([/color][/b]member z zl[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
            [b][color=MAROON]([/color][/b]setq zl [b][color=GREEN]([/color][/b]cons z zl[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]setq i [b][color=MAROON]([/color][/b]1+ i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]setq ssp [b][color=NAVY]([/color][/b]ssadd[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]foreach z zl
    [b][color=NAVY]([/color][/b]while [b][color=MAROON]([/color][/b]setq ss [b][color=GREEN]([/color][/b]ssget [color=#2f4f4f]"X"[/color] [b][color=BLUE]([/color][/b]list [b][color=RED]([/color][/b]cons 0 [color=#2f4f4f]"ARC,LINE"[/color][b][color=RED])[/color][/b]
                                     [b][color=RED]([/color][/b]cons -4 [color=#2f4f4f]"*,*,="[/color][b][color=RED])[/color][/b]
                                       [b][color=RED]([/color][/b]list 10 0 0 z[b][color=RED])[/color][/b]
                                     [b][color=RED]([/color][/b]list 210 0 0 1[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]command [color=#2f4f4f]"_.PEDIT"[/color] [b][color=GREEN]([/color][/b]ssname ss 0[b][color=GREEN])[/color][/b] [color=#2f4f4f]"_Yes"[/color] [color=#2f4f4f]"_Join"[/color] ss [color=#2f4f4f]""[/color] [color=#2f4f4f]"X"[/color][b][color=MAROON])[/color][/b]
           [b][color=MAROON]([/color][/b]ssadd [b][color=GREEN]([/color][/b]entlast[b][color=GREEN])[/color][/b] ssp[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]setq i 0[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]setq en [b][color=MAROON]([/color][/b]ssname ssp i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]command[color=#2f4f4f]"_.EXPLODE"[/color] en[b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]setq i [b][color=MAROON]([/color][/b]1+ i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]setq cl nil c 1[b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]foreach z zl
    [b][color=NAVY]([/color][/b]setq ss [b][color=MAROON]([/color][/b]ssget [color=#2f4f4f]"X"[/color] [b][color=GREEN]([/color][/b]list [b][color=BLUE]([/color][/b]cons 0 [color=#2f4f4f]"ARC,LINE"[/color][b][color=BLUE])[/color][/b]
                              [b][color=BLUE]([/color][/b]cons -4 [color=#2f4f4f]"*,*,="[/color][b][color=BLUE])[/color][/b]
                                [b][color=BLUE]([/color][/b]list 10 0 0 z[b][color=BLUE])[/color][/b]
                              [b][color=BLUE]([/color][/b]list 210 0 0 1[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]setq i 0[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 i[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]cond [b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]= [color=#2f4f4f]"LINE"[/color] [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 0 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
                  [b][color=BLUE]([/color][/b]setq d [b][color=RED]([/color][/b]list c [b][color=PURPLE]([/color][/b]cadr [b][color=TEAL]([/color][/b]assoc 10 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
                                  [b][color=PURPLE]([/color][/b]cadr [b][color=TEAL]([/color][/b]assoc 11 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
                                  [b][color=PURPLE]([/color][/b]caddr [b][color=TEAL]([/color][/b]assoc 10 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
                                  [b][color=PURPLE]([/color][/b]caddr [b][color=TEAL]([/color][/b]assoc 11 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
                                  [b][color=PURPLE]([/color][/b]cadddr [b][color=TEAL]([/color][/b]assoc 10 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
                                  [b][color=PURPLE]([/color][/b]cadddr [b][color=TEAL]([/color][/b]assoc 11 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
                 [b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]= [color=#2f4f4f]"ARC"[/color] [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 0 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
                  [b][color=BLUE]([/color][/b]setq ce [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 10 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
                        ra [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 40 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
                        sa [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 50 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
                        ea [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 51 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
                        ia [b][color=RED]([/color][/b]if [b][color=PURPLE]([/color][/b]> sa ea[b][color=PURPLE])[/color][/b]
                               [b][color=PURPLE]([/color][/b]+ [b][color=TEAL]([/color][/b]- [b][color=OLIVE]([/color][/b]* 2 pi[b][color=OLIVE])[/color][/b] sa[b][color=TEAL])[/color][/b] ea[b][color=PURPLE])[/color][/b]
                               [b][color=PURPLE]([/color][/b]- ea sa[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
                        sp [b][color=RED]([/color][/b]polar ce sa ra[b][color=RED])[/color][/b]
                        ep [b][color=RED]([/color][/b]polar ce ea ra[b][color=RED])[/color][/b]
                        mp [b][color=RED]([/color][/b]polar ce [b][color=PURPLE]([/color][/b]+ sa [b][color=TEAL]([/color][/b]* 0.5 ia[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b] ra[b][color=RED])[/color][/b]
                         d [b][color=RED]([/color][/b]list c [b][color=PURPLE]([/color][/b]car sp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]car mp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]car ep[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]cadr sp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]cadr mp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]cadr ep[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]caddr sp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]caddr mp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]caddr ep[b][color=PURPLE])[/color][/b][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]setq cl [b][color=GREEN]([/color][/b]cons d cl[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
           [b][color=MAROON]([/color][/b]setq c [b][color=GREEN]([/color][/b]1+ c[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
           [b][color=MAROON]([/color][/b]setq i [b][color=GREEN]([/color][/b]1+ i[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]setq cl [b][color=NAVY]([/color][/b]reverse cl[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]prin1 cl[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 

 

This will not work with LINEs that have unequal z values.

 

Have fun

 

-David

Link to comment
Share on other sites

This might filter out unequal z value LINEs

 

[b][color=BLACK]([/color][/b]defun c:cutlist [b][color=FUCHSIA]([/color][/b]/ ss i en ed z1 z2 zl ssp c d
                   ce ra sa ea ia sp ep mp[b][color=FUCHSIA])[/color][/b] [color=#8b4513]; cl global[/color]

 [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]not ss[b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]setq ss [b][color=MAROON]([/color][/b]ssget [b][color=GREEN]([/color][/b]list [b][color=BLUE]([/color][/b]cons 0 [color=#2f4f4f]"ARC,LINE"[/color][b][color=BLUE])[/color][/b][b][color=BLUE]([/color][/b]list 210 0 0 1[b][color=BLUE])[/color][/b][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]setq i 0[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]setq en [b][color=MAROON]([/color][/b]ssname ss i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]setq ed [b][color=MAROON]([/color][/b]entget en[b][color=MAROON])[/color][/b]
              z1 [b][color=MAROON]([/color][/b]cadddr [b][color=GREEN]([/color][/b]assoc 10 ed[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
              z2 [b][color=MAROON]([/color][/b]cadddr [b][color=GREEN]([/color][/b]assoc 11 ed[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]and [b][color=MAROON]([/color][/b]equal z1 z2[b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]not [b][color=GREEN]([/color][/b]member z1 zl[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
             [b][color=MAROON]([/color][/b]setq zl [b][color=GREEN]([/color][/b]cons z1 zl[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]setq i [b][color=MAROON]([/color][/b]1+ i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]setq ssp [b][color=NAVY]([/color][/b]ssadd[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]foreach z zl
    [b][color=NAVY]([/color][/b]while [b][color=MAROON]([/color][/b]setq ss [b][color=GREEN]([/color][/b]ssget [color=#2f4f4f]"X"[/color] [b][color=BLUE]([/color][/b]list [b][color=RED]([/color][/b]cons -4 [color=#2f4f4f]"<OR"[/color][b][color=RED])[/color][/b]
                                      [b][color=RED]([/color][/b]cons -4 [color=#2f4f4f]"<AND"[/color][b][color=RED])[/color][/b]
                                         [b][color=RED]([/color][/b]cons 0 [color=#2f4f4f]"ARC"[/color][b][color=RED])[/color][/b]
                                         [b][color=RED]([/color][/b]cons -4 [color=#2f4f4f]"*,*,="[/color][b][color=RED])[/color][/b]
                                           [b][color=RED]([/color][/b]list 10 0 0 z[b][color=RED])[/color][/b]
                                      [b][color=RED]([/color][/b]cons -4 [color=#2f4f4f]"AND>"[/color][b][color=RED])[/color][/b]
                                      [b][color=RED]([/color][/b]cons -4 [color=#2f4f4f]"<AND"[/color][b][color=RED])[/color][/b]
                                         [b][color=RED]([/color][/b]cons 0 [color=#2f4f4f]"LINE"[/color][b][color=RED])[/color][/b]
                                         [b][color=RED]([/color][/b]cons -4 [color=#2f4f4f]"*,*,="[/color][b][color=RED])[/color][/b]
                                           [b][color=RED]([/color][/b]list 10 0 0 z[b][color=RED])[/color][/b]
                                         [b][color=RED]([/color][/b]cons -4 [color=#2f4f4f]"*,*,="[/color][b][color=RED])[/color][/b]
                                           [b][color=RED]([/color][/b]list 11 0 0 z[b][color=RED])[/color][/b]
                                      [b][color=RED]([/color][/b]cons -4 [color=#2f4f4f]"AND>"[/color][b][color=RED])[/color][/b]
                                     [b][color=RED]([/color][/b]cons -4 [color=#2f4f4f]"OR>"[/color][b][color=RED])[/color][/b]
                                     [b][color=RED]([/color][/b]list 210 0 0 1[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]command [color=#2f4f4f]"_.PEDIT"[/color] [b][color=GREEN]([/color][/b]ssname ss 0[b][color=GREEN])[/color][/b] [color=#2f4f4f]"_Yes"[/color] [color=#2f4f4f]"_Join"[/color] ss [color=#2f4f4f]""[/color] [color=#2f4f4f]"X"[/color][b][color=MAROON])[/color][/b]
           [b][color=MAROON]([/color][/b]ssadd [b][color=GREEN]([/color][/b]entlast[b][color=GREEN])[/color][/b] ssp[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]setq i 0[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]setq en [b][color=MAROON]([/color][/b]ssname ssp i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]command[color=#2f4f4f]"_.EXPLODE"[/color] en[b][color=NAVY])[/color][/b]
        [b][color=NAVY]([/color][/b]setq i [b][color=MAROON]([/color][/b]1+ i[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]setq cl nil c 1[b][color=FUCHSIA])[/color][/b]

 [b][color=FUCHSIA]([/color][/b]foreach z zl
    [b][color=NAVY]([/color][/b]setq ss [b][color=MAROON]([/color][/b]ssget [color=#2f4f4f]"X"[/color] [b][color=GREEN]([/color][/b]list [b][color=BLUE]([/color][/b]cons -4 [color=#2f4f4f]"<OR"[/color][b][color=BLUE])[/color][/b]
                               [b][color=BLUE]([/color][/b]cons -4 [color=#2f4f4f]"<AND"[/color][b][color=BLUE])[/color][/b]
                                  [b][color=BLUE]([/color][/b]cons 0 [color=#2f4f4f]"ARC"[/color][b][color=BLUE])[/color][/b]
                                  [b][color=BLUE]([/color][/b]cons -4 [color=#2f4f4f]"*,*,="[/color][b][color=BLUE])[/color][/b]
                                    [b][color=BLUE]([/color][/b]list 10 0 0 z[b][color=BLUE])[/color][/b]
                               [b][color=BLUE]([/color][/b]cons -4 [color=#2f4f4f]"AND>"[/color][b][color=BLUE])[/color][/b]
                               [b][color=BLUE]([/color][/b]cons -4 [color=#2f4f4f]"<AND"[/color][b][color=BLUE])[/color][/b]
                                  [b][color=BLUE]([/color][/b]cons 0 [color=#2f4f4f]"LINE"[/color][b][color=BLUE])[/color][/b]
                                  [b][color=BLUE]([/color][/b]cons -4 [color=#2f4f4f]"*,*,="[/color][b][color=BLUE])[/color][/b]
                                    [b][color=BLUE]([/color][/b]list 10 0 0 z[b][color=BLUE])[/color][/b]
                                  [b][color=BLUE]([/color][/b]cons -4 [color=#2f4f4f]"*,*,="[/color][b][color=BLUE])[/color][/b]
                                    [b][color=BLUE]([/color][/b]list 11 0 0 z[b][color=BLUE])[/color][/b]
                               [b][color=BLUE]([/color][/b]cons -4 [color=#2f4f4f]"AND>"[/color][b][color=BLUE])[/color][/b]
                              [b][color=BLUE]([/color][/b]cons -4 [color=#2f4f4f]"OR>"[/color][b][color=BLUE])[/color][/b]
                              [b][color=BLUE]([/color][/b]list 210 0 0 1[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]setq i 0[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 i[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]cond [b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]= [color=#2f4f4f]"LINE"[/color] [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 0 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
                  [b][color=BLUE]([/color][/b]setq d [b][color=RED]([/color][/b]list c [b][color=PURPLE]([/color][/b]cadr [b][color=TEAL]([/color][/b]assoc 10 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
                                  [b][color=PURPLE]([/color][/b]cadr [b][color=TEAL]([/color][/b]assoc 11 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
                                  [b][color=PURPLE]([/color][/b]caddr [b][color=TEAL]([/color][/b]assoc 10 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
                                  [b][color=PURPLE]([/color][/b]caddr [b][color=TEAL]([/color][/b]assoc 11 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
                                  [b][color=PURPLE]([/color][/b]cadddr [b][color=TEAL]([/color][/b]assoc 10 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b]
                                  [b][color=PURPLE]([/color][/b]cadddr [b][color=TEAL]([/color][/b]assoc 11 ed[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
                 [b][color=GREEN]([/color][/b][b][color=BLUE]([/color][/b]= [color=#2f4f4f]"ARC"[/color] [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 0 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
                  [b][color=BLUE]([/color][/b]setq ce [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 10 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
                        ra [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 40 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
                        sa [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 50 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
                        ea [b][color=RED]([/color][/b]cdr [b][color=PURPLE]([/color][/b]assoc 51 ed[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
                        ia [b][color=RED]([/color][/b]if [b][color=PURPLE]([/color][/b]> sa ea[b][color=PURPLE])[/color][/b]
                               [b][color=PURPLE]([/color][/b]+ [b][color=TEAL]([/color][/b]- [b][color=OLIVE]([/color][/b]* 2 pi[b][color=OLIVE])[/color][/b] sa[b][color=TEAL])[/color][/b] ea[b][color=PURPLE])[/color][/b]
                               [b][color=PURPLE]([/color][/b]- ea sa[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b]
                        sp [b][color=RED]([/color][/b]polar ce sa ra[b][color=RED])[/color][/b]
                        ep [b][color=RED]([/color][/b]polar ce ea ra[b][color=RED])[/color][/b]
                        mp [b][color=RED]([/color][/b]polar ce [b][color=PURPLE]([/color][/b]+ sa [b][color=TEAL]([/color][/b]* 0.5 ia[b][color=TEAL])[/color][/b][b][color=PURPLE])[/color][/b] ra[b][color=RED])[/color][/b]
                         d [b][color=RED]([/color][/b]list c [b][color=PURPLE]([/color][/b]car sp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]car mp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]car ep[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]cadr sp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]cadr mp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]cadr ep[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]caddr sp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]caddr mp[b][color=PURPLE])[/color][/b]
                                   [b][color=PURPLE]([/color][/b]caddr ep[b][color=PURPLE])[/color][/b][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]setq cl [b][color=GREEN]([/color][/b]cons d cl[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
           [b][color=MAROON]([/color][/b]setq c [b][color=GREEN]([/color][/b]1+ c[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b]
           [b][color=MAROON]([/color][/b]setq i [b][color=GREEN]([/color][/b]1+ i[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]setq cl [b][color=NAVY]([/color][/b]reverse cl[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]prin1 cl[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 

 

Pretty ugly though :shock:

Link to comment
Share on other sites

Thank you for your suggestion David. I was looking just for a sorting algorithm though. Im currently working on adapting my code to Lee Mac's grouppoints command but without much success for now.

Link to comment
Share on other sites

Sometimes it's better to let AutoCAD do the work. By using pedit to create a polyline and then explode it, it automatically sorts the segments by endpoints. -David

Link to comment
Share on other sites

I haven't checked the output, but this should get you most of the way there:

([color=BLUE]defun[/color] c:test ( [color=BLUE]/[/color] cen cnt ent enx ept idx lst rad sel spt )

   ([color=BLUE]defun[/color] assocf ( x l f )
       ([color=BLUE]vl-some[/color] '([color=BLUE]lambda[/color] ( a ) ([color=BLUE]if[/color] ([color=BLUE]equal[/color] x ([color=BLUE]car[/color] a) f) a)) l)
   )
 
   ([color=BLUE]defun[/color] grouppoints ( l [color=BLUE]/[/color] a r x x1 x2 )
       ([color=BLUE]while[/color] ([color=BLUE]setq[/color] x ([color=BLUE]car[/color] l))
           ([color=BLUE]setq[/color] x ([color=BLUE]list[/color] x)
                 l ([color=BLUE]cdr[/color]  l)
           )
           ([color=BLUE]while[/color]
               ([color=BLUE]cond[/color]
                   (   ([color=BLUE]setq[/color] a (assocf ([color=BLUE]setq[/color] x1 ([color=BLUE]caar[/color] x)) l 1e-)
                       ([color=BLUE]setq[/color] x ([color=BLUE]cons[/color] ([color=BLUE]reverse[/color] a) x)
                             l ([color=BLUE]vl-remove[/color] a l)
                       )
                   )
                   (   ([color=BLUE]setq[/color] a (assocf ([color=BLUE]setq[/color] x2 ([color=BLUE]last[/color] ([color=BLUE]last[/color] x))) l 1e-)
                       ([color=BLUE]setq[/color] x ([color=BLUE]append[/color] x ([color=BLUE]list[/color] a))
                             l ([color=BLUE]vl-remove[/color] a l)
                       )
                   )
                   (   ([color=BLUE]setq[/color] a (assocf x1 ([color=BLUE]setq[/color] l ([color=BLUE]mapcar[/color] '[color=BLUE]reverse[/color] l)) 1e-)
                       ([color=BLUE]setq[/color] x ([color=BLUE]cons[/color] ([color=BLUE]reverse[/color] a) x)
                             l ([color=BLUE]vl-remove[/color] a l)
                       )
                   )
                   (   ([color=BLUE]setq[/color] a (assocf x2 l 1e-)
                       ([color=BLUE]setq[/color] x ([color=BLUE]append[/color] x ([color=BLUE]list[/color] a))
                             l ([color=BLUE]vl-remove[/color] a l)
                       )
                   )
               )
           )
           ([color=BLUE]setq[/color] r ([color=BLUE]cons[/color] x r))
       )
   )

   ([color=BLUE]defun[/color] amid ( c s e [color=BLUE]/[/color] v x )
       ([color=BLUE]setq[/color] v ([color=BLUE]mapcar[/color] '[color=BLUE]-[/color] e s)
             x ([color=BLUE]trans[/color] c 0 v)
       )
       ([color=BLUE]trans[/color] ([color=BLUE]cons[/color] ([color=BLUE]-[/color] ([color=BLUE]car[/color] x) ([color=BLUE]distance[/color] c s)) ([color=BLUE]cdr[/color] x)) v 0)
   )

   ([color=BLUE]if[/color] ([color=BLUE]setq[/color] sel ([color=BLUE]ssget[/color] '((0 . [color=MAROON]"LINE,ARC"[/color]))))
       ([color=BLUE]progn[/color]
           ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] idx ([color=BLUE]sslength[/color] sel))
               ([color=BLUE]setq[/color] ent ([color=BLUE]ssname[/color] sel ([color=BLUE]setq[/color] idx ([color=BLUE]1-[/color] idx)))
                     enx ([color=BLUE]entget[/color] ent)
               )
               ([color=BLUE]if[/color] ([color=BLUE]=[/color] [color=MAROON]"LINE"[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 enx)))
                   ([color=BLUE]progn[/color]
                       ([color=BLUE]setq[/color] spt ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 10 enx))
                             ept ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 11 enx))
                       )
                       ([color=BLUE]if[/color] ([color=BLUE]equal[/color] ([color=BLUE]caddr[/color] spt) ([color=BLUE]caddr[/color] ept) 1e-
                           ([color=BLUE]setq[/color] lst ([color=BLUE]cons[/color] ([color=BLUE]list[/color] spt ept) lst))
                       )
                   )
                   ([color=BLUE]setq[/color] cen ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 10 enx))
                         rad ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 40 enx))
                         spt ([color=BLUE]trans[/color] ([color=BLUE]polar[/color] cen ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 50 enx)) rad) ent 0)
                         ept ([color=BLUE]trans[/color] ([color=BLUE]polar[/color] cen ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 51 enx)) rad) ent 0)
                         lst ([color=BLUE]cons[/color]  ([color=BLUE]list[/color]  spt (amid ([color=BLUE]trans[/color] cen ent 0) spt ept) ept) lst)
                   )
               )
           )
           ([color=BLUE]setq[/color] cnt 0)
           ([color=BLUE]mapcar[/color]
               ([color=BLUE]function[/color]
                   ([color=BLUE]lambda[/color] ( grp )
                       ([color=BLUE]mapcar[/color]
                           ([color=BLUE]function[/color]
                               ([color=BLUE]lambda[/color] ( obj )
                                   ([color=BLUE]cons[/color] ([color=BLUE]setq[/color] cnt ([color=BLUE]1+[/color] cnt))
                                       ([color=BLUE]apply[/color] '[color=BLUE]append[/color] ([color=BLUE]apply[/color] '[color=BLUE]mapcar[/color] ([color=BLUE]cons[/color] '[color=BLUE]list[/color] obj)))
                                   )
                               )
                           )
                           grp
                       )
                   )
               )
               (grouppoints lst)
           )
       )
   )
   ([color=BLUE]princ[/color])
)

Link to comment
Share on other sites

After a bit of tinkering i managed to implement your sorting solution to my code. Now it works like a charm. Its faster than my old code and it did a great job for all the parts i tested it with.

 

Thank you for all the help Lee Mac, not only in this thread, but for all the knowledge you have shared with the community through http://www.lee-mac.com/ and your multiple forum posts.

You have helped me learn a lot about AutoLisp in the last few years. I truly appreciate that.

Link to comment
Share on other sites

After a bit of tinkering i managed to implement your sorting solution to my code. Now it works like a charm. Its faster than my old code and it did a great job for all the parts i tested it with.

 

Excellent to hear doaiena! :)

 

Thank you for all the help Lee Mac, not only in this thread, but for all the knowledge you have shared with the community through http://www.lee-mac.com/ and your multiple forum posts.

You have helped me learn a lot about AutoLisp in the last few years. I truly appreciate that.

 

Thank you for your kind words of gratitude doaiena, that means a lot. I'm delighted to have helped you both directly & indirectly with your AutoLISP studies over the years - you're most welcome.

Link to comment
Share on other sites

I haven't checked the output, but this should get you most of the way there:

([color=BLUE]defun[/color] c:test ( [color=BLUE]/[/color] cen cnt ent enx ept idx lst rad sel spt )

   ([color=BLUE]defun[/color] assocf ( x l f )
       ([color=BLUE]vl-some[/color] '([color=BLUE]lambda[/color] ( a ) ([color=BLUE]if[/color] ([color=BLUE]equal[/color] x ([color=BLUE]car[/color] a) f) a)) l)
   )
 
   ([color=BLUE]defun[/color] grouppoints ( l [color=BLUE]/[/color] a r x x1 x2 )
       ([color=BLUE]while[/color] ([color=BLUE]setq[/color] x ([color=BLUE]car[/color] l))
           ([color=BLUE]setq[/color] x ([color=BLUE]list[/color] x)
                 l ([color=BLUE]cdr[/color]  l)
           )
           ([color=BLUE]while[/color]
               ([color=BLUE]cond[/color]
                   (   ([color=BLUE]setq[/color] a (assocf ([color=BLUE]setq[/color] x1 ([color=BLUE]caar[/color] x)) l 1e-)
                       ([color=BLUE]setq[/color] x ([color=BLUE]cons[/color] ([color=BLUE]reverse[/color] a) x)
                             l ([color=BLUE]vl-remove[/color] a l)
                       )
                   )
                   (   ([color=BLUE]setq[/color] a (assocf ([color=BLUE]setq[/color] x2 ([color=BLUE]last[/color] ([color=BLUE]last[/color] x))) l 1e-)
                       ([color=BLUE]setq[/color] x ([color=BLUE]append[/color] x ([color=BLUE]list[/color] a))
                             l ([color=BLUE]vl-remove[/color] a l)
                       )
                   )
                   (   ([color=BLUE]setq[/color] a (assocf x1 ([color=BLUE]setq[/color] l ([color=BLUE]mapcar[/color] '[color=BLUE]reverse[/color] l)) 1e-)
                       ([color=BLUE]setq[/color] x ([color=BLUE]cons[/color] ([color=BLUE]reverse[/color] a) x)
                             l ([color=BLUE]vl-remove[/color] a l)
                       )
                   )
                   (   ([color=BLUE]setq[/color] a (assocf x2 l 1e-)
                       ([color=BLUE]setq[/color] x ([color=BLUE]append[/color] x ([color=BLUE]list[/color] a))
                             l ([color=BLUE]vl-remove[/color] a l)
                       )
                   )
               )
           )
           ([color=BLUE]setq[/color] r ([color=BLUE]cons[/color] x r))
       )
   )

   ([color=BLUE]defun[/color] amid ( c s e [color=BLUE]/[/color] v x )
       ([color=BLUE]setq[/color] v ([color=BLUE]mapcar[/color] '[color=BLUE]-[/color] e s)
             x ([color=BLUE]trans[/color] c 0 v)
       )
       ([color=BLUE]trans[/color] ([color=BLUE]cons[/color] ([color=BLUE]-[/color] ([color=BLUE]car[/color] x) ([color=BLUE]distance[/color] c s)) ([color=BLUE]cdr[/color] x)) v 0)
   )

   ([color=BLUE]if[/color] ([color=BLUE]setq[/color] sel ([color=BLUE]ssget[/color] '((0 . [color=MAROON]"LINE,ARC"[/color]))))
       ([color=BLUE]progn[/color]
           ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] idx ([color=BLUE]sslength[/color] sel))
               ([color=BLUE]setq[/color] ent ([color=BLUE]ssname[/color] sel ([color=BLUE]setq[/color] idx ([color=BLUE]1-[/color] idx)))
                     enx ([color=BLUE]entget[/color] ent)
               )
               ([color=BLUE]if[/color] ([color=BLUE]=[/color] [color=MAROON]"LINE"[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 enx)))
                   ([color=BLUE]progn[/color]
                       ([color=BLUE]setq[/color] spt ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 10 enx))
                             ept ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 11 enx))
                       )
                       ([color=BLUE]if[/color] ([color=BLUE]equal[/color] ([color=BLUE]caddr[/color] spt) ([color=BLUE]caddr[/color] ept) 1e-
                           ([color=BLUE]setq[/color] lst ([color=BLUE]cons[/color] ([color=BLUE]list[/color] spt ept) lst))
                       )
                   )
                   ([color=BLUE]setq[/color] cen ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 10 enx))
                         rad ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 40 enx))
                         spt ([color=BLUE]trans[/color] ([color=BLUE]polar[/color] cen ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 50 enx)) rad) ent 0)
                         ept ([color=BLUE]trans[/color] ([color=BLUE]polar[/color] cen ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 51 enx)) rad) ent 0)
                         lst ([color=BLUE]cons[/color]  ([color=BLUE]list[/color]  spt (amid ([color=BLUE]trans[/color] cen ent 0) spt ept) ept) lst)
                   )
               )
           )
           ([color=BLUE]setq[/color] cnt 0)
           ([color=BLUE]mapcar[/color]
               ([color=BLUE]function[/color]
                   ([color=BLUE]lambda[/color] ( grp )
                       ([color=BLUE]mapcar[/color]
                           ([color=BLUE]function[/color]
                               ([color=BLUE]lambda[/color] ( obj )
                                   ([color=BLUE]cons[/color] ([color=BLUE]setq[/color] cnt ([color=BLUE]1+[/color] cnt))
                                       ([color=BLUE]apply[/color] '[color=BLUE]append[/color] ([color=BLUE]apply[/color] '[color=BLUE]mapcar[/color] ([color=BLUE]cons[/color] '[color=BLUE]list[/color] obj)))
                                   )
                               )
                           )
                           grp
                       )
                   )
               )
               (grouppoints lst)
           )
       )
   )
   ([color=BLUE]princ[/color])
)

 

Thanx Lee , you've just givin' me a headache , just by looking @ your code haha

Link to comment
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
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...