Jump to content

Possible LISP request - Break up a circle into equal parts


Recommended Posts

Posted

Possible LISP request - Break up a circle into equal parts -

 

Is there a LISP already made that will allow me to take a circle and break it up into equal parts?

 

If not, could it be possible for someone to make one? If you are making one, can you make it so all I have to do is enter the number of sections.

 

Thanks in advance!!

 

-SH

  • Replies 21
  • Created
  • Last Reply

Top Posters In This Topic

  • Lee Mac

    10

  • CADMASTER1128

    5

  • alanjt

    3

  • SteveK

    2

Posted

Just a quick one, I had fun making it :)

 

[b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:CBrk [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] ss tmp i j ent elst inc[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]or[/color][/b] Cbrk:num [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] Cbrk:num [b][color=#009900]2[/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]setq[/color][/b] ss [b][color=RED]([/color][/b][b][color=BLUE]ssget[/color][/b] [b][color=DARKRED]'[/color][/b][b][color=RED]([/color][/b][b][color=RED]([/color][/b][b][color=#009900]0[/color][/b] . [b][color=#ff00ff]"CIRCLE"[/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]initget[/color][/b] [b][color=#009900]6[/color][/b][b][color=RED])[/color][/b]
        [b][color=RED]([/color][/b][b][color=BLUE]and[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] tmp [b][color=RED]([/color][/b][b][color=BLUE]getint[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcat[/color][/b] [b][color=#ff00ff]"\nSpecify Number of Sections <"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]itoa[/color][/b] Cbrk:num[b][color=RED])[/color][/b] [b][color=#ff00ff]"> : "[/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]setq[/color][/b] Cbrk:num tmp[b][color=RED])[/color][/b][b][color=RED])[/color][/b]

        [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] i [b][color=#009900]-1[/color][/b][b][color=RED])[/color][/b]
        [b][color=RED]([/color][/b][b][color=BLUE]while[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] ent [b][color=RED]([/color][/b][b][color=BLUE]ssname[/color][/b] ss [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] i [b][color=RED]([/color][/b][b][color=BLUE]1+[/color][/b] i[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]setq[/color][/b] elst [b][color=RED]([/color][/b][b][color=BLUE]entget[/color][/b] ent[b][color=RED])[/color][/b] inc [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]*[/color][/b] [b][color=#009900]2[/color][/b] [b][color=BLUE]pi[/color][/b][b][color=RED])[/color][/b] cBrk:num[b][color=RED])[/color][/b] j [b][color=#009900]-1[/color][/b][b][color=RED])[/color][/b]

          [b][color=RED]([/color][/b][b][color=BLUE]repeat[/color][/b] cbrk:num
            [b][color=RED]([/color][/b][b][color=BLUE]entmake[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b]   [b][color=#009900]0[/color][/b] [b][color=#ff00ff]"ARC"[/color][/b][b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b]  [b][color=#009900]8[/color][/b]  elst[b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]10[/color][/b]  elst[b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]40[/color][/b]  elst[b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b]  [b][color=#009900]50[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]*[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] j [b][color=RED]([/color][/b][b][color=BLUE]1+[/color][/b] j[b][color=RED])[/color][/b][b][color=RED])[/color][/b] inc[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b]  [b][color=#009900]51[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]*[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]1+[/color][/b] j[b][color=RED])[/color][/b] inc[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]entdel[/color][/b] ent[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]
       
          
          
   

Posted

Wow LeeMac, so fast and what a nice LISP. Is it possible to have lines drawn from the center to the edge of each arc? Make sense?

Posted

Certainly:

 

[b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:CBrk [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] ss tmp i j ent elst inc[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]or[/color][/b] Cbrk:num [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] Cbrk:num [b][color=#009900]2[/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]setq[/color][/b] ss [b][color=RED]([/color][/b][b][color=BLUE]ssget[/color][/b] [b][color=DARKRED]'[/color][/b][b][color=RED]([/color][/b][b][color=RED]([/color][/b][b][color=#009900]0[/color][/b] . [b][color=#ff00ff]"CIRCLE"[/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]initget[/color][/b] [b][color=#009900]6[/color][/b][b][color=RED])[/color][/b]
        [b][color=RED]([/color][/b][b][color=BLUE]and[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] tmp [b][color=RED]([/color][/b][b][color=BLUE]getint[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]strcat[/color][/b] [b][color=#ff00ff]"\nSpecify Number of Sections <"[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]itoa[/color][/b] Cbrk:num[b][color=RED])[/color][/b] [b][color=#ff00ff]"> : "[/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]setq[/color][/b] Cbrk:num tmp[b][color=RED])[/color][/b][b][color=RED])[/color][/b]

        [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] i [b][color=#009900]-1[/color][/b][b][color=RED])[/color][/b]
        [b][color=RED]([/color][/b][b][color=BLUE]while[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] ent [b][color=RED]([/color][/b][b][color=BLUE]ssname[/color][/b] ss [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] i [b][color=RED]([/color][/b][b][color=BLUE]1+[/color][/b] i[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]setq[/color][/b] elst [b][color=RED]([/color][/b][b][color=BLUE]entget[/color][/b] ent[b][color=RED])[/color][/b] inc [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]*[/color][/b] [b][color=#009900]2[/color][/b] [b][color=BLUE]pi[/color][/b][b][color=RED])[/color][/b] cBrk:num[b][color=RED])[/color][/b] j [b][color=#009900]-1[/color][/b][b][color=RED])[/color][/b]

          [b][color=RED]([/color][/b][b][color=BLUE]repeat[/color][/b] cbrk:num
            [b][color=RED]([/color][/b][b][color=BLUE]entmake[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b]   [b][color=#009900]0[/color][/b] [b][color=#ff00ff]"ARC"[/color][/b][b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b]  [b][color=#009900]8[/color][/b]  elst[b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]10[/color][/b]  elst[b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]40[/color][/b]  elst[b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b]  [b][color=#009900]50[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]*[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] j [b][color=RED]([/color][/b][b][color=BLUE]1+[/color][/b] j[b][color=RED])[/color][/b][b][color=RED])[/color][/b] inc[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b]  [b][color=#009900]51[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]*[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]1+[/color][/b] j[b][color=RED])[/color][/b] inc[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]entmake[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]list[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b]   [b][color=#009900]0[/color][/b] [b][color=#ff00ff]"LINE"[/color][/b][b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b]  [b][color=#009900]8[/color][/b]   elst[b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]10[/color][/b]   elst[b][color=RED])[/color][/b]
                           [b][color=RED]([/color][/b][b][color=BLUE]cons[/color][/b]  [b][color=#009900]11[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]polar[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]10[/color][/b] elst[b][color=RED])[/color][/b][b][color=RED])[/color][/b]
                                            [b][color=RED]([/color][/b][b][color=BLUE]*[/color][/b] j inc[b][color=RED])[/color][/b]
                                            [b][color=RED]([/color][/b][b][color=BLUE]cdr[/color][/b] [b][color=RED]([/color][/b][b][color=BLUE]assoc[/color][/b] [b][color=#009900]40[/color][/b] elst[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]entdel[/color][/b] ent[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]
       
          
          
   

Posted

Why to go my friend!!! You are the best! And the fast service as well!

 

I cant thank you enough! I love the LISP, thanks again!

Posted

Lee can I ask, do you have a reason for choosing a while or foreach loop for different situations or do you just like mixing it up?

Posted
Lee can I ask, do you have a reason for choosing a while or foreach loop for different situations or do you just like mixing it up?

 

Hi Steve,

 

It depends upon the task - with Selection Set handling, if I am performing more than one operation for each entity, I will use a while loop over repeat, as it is quicker.

 

(defun _while (ss / i lst)
 (setq i -1)
 (while (setq ent (ssname ss (setq i (1+ i))))
   (setq lst (cons ent lst)))

 lst)

(defun _repeat (ss / i lst)
 (setq i -1)
 (repeat (sslength ss)
   (setq lst (cons (ssname ss (setq i (1+ i))) lst)))
 
 lst)

(defun _mapcar (ss)
 (vl-remove-if 'listp
   (mapcar 'cadr (ssnamex ss))))

SSLength: 2500

Elapsed milliseconds / relative speed for 256 iteration(s):

   (_WHILE SS)......1076 / 2.99 <fastest>
   (_REPEAT SS).....1107 / 2.90
   (_MAPCAR SS).....3214 / 1.00 <slowest>

It is interesting to note that while the mapcar code is the most elegant, the ssnamex means that it is by far the slowest.

 

For things other than Selection Set handling, it depends on what I am using to control the iteration - in this case (with Steve's Circle Break), it is a set number, so a repeat is in order. If I am iterating through a list and dealing with each element in turn, I may use a while and shorten the list with each iteration using a cdr. Else, if I need the list to stay in tact, I will use a foreach.

 

Hope this helps,

 

Lee

Posted

That's very interesting. As soon as I got to understanding mapcar & ssnamex I've just stuck with that, but really it sounds like there are times back to basics is best!

Thanks, I will take that on board in future.

Posted

Beat me to it. I was about 3/4 of the way through it, when I had to put the baby down for the night. Decided to watch Dexter with the wife, so I'm just getting back to the computer. I actually was going the same exact route, so I won't bother posting incomplete code. Glad the Master is happy. :) Nice work.

Posted

I have a new idea for the LISP. Is it possible to have the same action be applied to a 1/2 circle or even an ARC?

Posted
Beat me to it. I was about 3/4 of the way through it, when I had to put the baby down for the night. Decided to watch Dexter with the wife, so I'm just getting back to the computer. I actually was going the same exact route, so I won't bother posting incomplete code. Glad the Master is happy. :) Nice work.

 

Thanks Alan - it was just by chance that I was around at the time :)

 

That's very interesting. As soon as I got to understanding mapcar & ssnamex I've just stuck with that, but really it sounds like there are times back to basics is best!

Thanks, I will take that on board in future.

 

There are many many ways to accomplish the same thing in programming - sometimes I will opt for a more elegant solution, even though it may not be the fastest, other times I will optimise :twisted:

 

I have a new idea for the LISP. Is it possible to have the same action be applied to a 1/2 circle or even an ARC?

 

We shall see :)

Posted

Try this Steve:

 

(defun c:CBrk (/ ss tmp i j ent elst inc st)
 (vl-load-com)

 (or Cbrk:num (setq Cbrk:num 2))

 (cond ((setq ss (ssget "_:L" '((0 . "ARC,CIRCLE"))))
        
        (initget 6)
        (and (setq tmp (getint (strcat "\nSpecify Number of Sections <" (itoa Cbrk:num) "> : ")))
             (setq Cbrk:num tmp))

        (setq i -1)
        (while (setq ent (ssname ss (setq i (1+ i))))
          (setq elst (entget ent) j -1)

          (cond (  (eq "CIRCLE" (cdr (assoc 0 elst)))
                   (setq inc (/ (* 2 pi) cBrk:num) st 0.))
                (t (setq inc (/ (- (cdr (assoc 51 elst))
                                   (setq st (cdr (assoc 50 elst)))) cBrk:num))))

          (repeat cbrk:num
            (entmake (list (cons   0 "ARC")
                           (assoc  8  elst)
                           (assoc 10  elst)
                           (assoc 40  elst)
                           (cons  50 (+ st (* (setq j (1+ j)) inc)))
                           (cons  51 (+ st (* (1+ j) inc)))))
            
            (entmake (list (cons   0 "LINE")
                           (assoc  8   elst)
                           (assoc 10   elst)
                           (cons  11 (polar (cdr (assoc 10 elst))
                                            (+ st (* j inc))
                                            (cdr (assoc 40 elst)))))))

          (if (eq "ARC" (cdr (assoc 0 elst)))
            (entmake (list (cons   0 "LINE")
                           (assoc  8   elst)
                           (assoc 10   elst)
                           (cons  11 (polar (cdr (assoc 10 elst))
                                            (+ st (* (1+ j) inc))
                                            (cdr (assoc 40 elst)))))))
          
        (entdel ent))))

 (princ))

Posted

  (cond ((setq ss (ssget '((0 . "ARC,CIRCLE"))))

Don't forget to filter locked layers.

(cond ((setq ss (ssget [color=Red]"_:L"[/color] '((0 . "ARC,CIRCLE"))))

Posted
Cheers dude - always forgot that :oops:

I only remember it as a result of staring at an old layer change routine I wrote and couldn't figure out why it suddenly started failing.

Posted
I only remember it as a result of staring at an old layer change routine I wrote and couldn't figure out why it suddenly started failing.

 

I've done things like that before - I wrote a sub-function to Unlock/Thaw all layers, and had it wrapped somewhere in a vl-catch-all-apply (worst thing you can do..), could work out why til I figured you can't freeze/thaw the current layer... :roll:

Posted

This LISP works real nice... Thanks again!!!

  • 4 years later...
Posted
Try this Steve:

 

(defun c:CBrk (/ ss tmp i j ent elst inc st)
 (vl-load-com)

 (or Cbrk:num (setq Cbrk:num 2))

 (cond ((setq ss (ssget "_:L" '((0 . "ARC,CIRCLE"))))
        
        (initget 6)
        (and (setq tmp (getint (strcat "\nSpecify Number of Sections <" (itoa Cbrk:num) "> : ")))
             (setq Cbrk:num tmp))

        (setq i -1)
        (while (setq ent (ssname ss (setq i (1+ i))))
          (setq elst (entget ent) j -1)

          (cond (  (eq "CIRCLE" (cdr (assoc 0 elst)))
                   (setq inc (/ (* 2 pi) cBrk:num) st 0.))
                (t (setq inc (/ (- (cdr (assoc 51 elst))
                                   (setq st (cdr (assoc 50 elst)))) cBrk:num))))

          (repeat cbrk:num
            (entmake (list (cons   0 "ARC")
                           (assoc  8  elst)
                           (assoc 10  elst)
                           (assoc 40  elst)
                           (cons  50 (+ st (* (setq j (1+ j)) inc)))
                           (cons  51 (+ st (* (1+ j) inc)))))
            
            (entmake (list (cons   0 "LINE")
                           (assoc  8   elst)
                           (assoc 10   elst)
                           (cons  11 (polar (cdr (assoc 10 elst))
                                            (+ st (* j inc))
                                            (cdr (assoc 40 elst)))))))

          (if (eq "ARC" (cdr (assoc 0 elst)))
            (entmake (list (cons   0 "LINE")
                           (assoc  8   elst)
                           (assoc 10   elst)
                           (cons  11 (polar (cdr (assoc 10 elst))
                                            (+ st (* (1+ j) inc))
                                            (cdr (assoc 40 elst)))))))
          
        (entdel ent))))

 (princ))

 

Genius as always . thank you so much lee mac!!!:shock:

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...