Jump to content

Possible LISP request - Break up a circle into equal parts


CADMASTER1128

Recommended Posts

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

Link to comment
Share on other sites

  • Replies 21
  • Created
  • Last Reply

Top Posters In This Topic

  • Lee Mac

    10

  • CADMASTER1128

    5

  • alanjt

    3

  • SteveK

    2

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]
       
          
          
   

Link to comment
Share on other sites

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]
       
          
          
   

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 :)

Link to comment
Share on other sites

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

Link to comment
Share on other sites

  (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"))))

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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:

Link to comment
Share on other sites

  • 4 years later...
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:

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