CADMASTER1128 Posted September 28, 2009 Share Posted September 28, 2009 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 Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted September 28, 2009 Share Posted September 28, 2009 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] Quote Link to comment Share on other sites More sharing options...
CADMASTER1128 Posted September 28, 2009 Author Share Posted September 28, 2009 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? Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted September 28, 2009 Share Posted September 28, 2009 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] Quote Link to comment Share on other sites More sharing options...
CADMASTER1128 Posted September 28, 2009 Author Share Posted September 28, 2009 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! Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted September 28, 2009 Share Posted September 28, 2009 Not a problem Steve Quote Link to comment Share on other sites More sharing options...
SteveK Posted September 28, 2009 Share Posted September 28, 2009 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? Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted September 28, 2009 Share Posted September 28, 2009 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 Quote Link to comment Share on other sites More sharing options...
SteveK Posted September 29, 2009 Share Posted September 29, 2009 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. Quote Link to comment Share on other sites More sharing options...
alanjt Posted September 29, 2009 Share Posted September 29, 2009 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. Quote Link to comment Share on other sites More sharing options...
CADMASTER1128 Posted September 29, 2009 Author Share Posted September 29, 2009 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? Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted September 29, 2009 Share Posted September 29, 2009 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 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 Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted September 29, 2009 Share Posted September 29, 2009 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)) Quote Link to comment Share on other sites More sharing options...
alanjt Posted September 29, 2009 Share Posted September 29, 2009 (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")))) Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted September 29, 2009 Share Posted September 29, 2009 Cheers dude - always forgot that Quote Link to comment Share on other sites More sharing options...
alanjt Posted September 29, 2009 Share Posted September 29, 2009 Cheers dude - always forgot that 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. Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted September 29, 2009 Share Posted September 29, 2009 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... Quote Link to comment Share on other sites More sharing options...
CADMASTER1128 Posted October 1, 2009 Author Share Posted October 1, 2009 This LISP works real nice... Thanks again!!! Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted October 1, 2009 Share Posted October 1, 2009 This LISP works real nice... Thanks again!!! Not a problem Quote Link to comment Share on other sites More sharing options...
danielk Posted October 17, 2013 Share Posted October 17, 2013 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!!! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.