### Author Topic: Still learning, but now trying to make an "L" shape.  (Read 1081 times)

0 Members and 1 Guest are viewing this topic.

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Still learning, but now trying to make an "L" shape.
« on: June 17, 2022, 02:41:45 PM »
Thank you to everyone who helped last time I tried making a LISP and a pre thank you for any advice and guidance.

I am trying to make an "L" shape using polylines. The goal is to be able to set the leg lengths and thickness. I will eventually need to be able to have the legs vary in length, but keep the same thickness. So far I have the following thrown together:

Code - Auto/Visual Lisp: [Select]
1. (defun C:BAA ()
2.
3.         (setq pt (getpoint "Choose a starting point"))
4.
5.                 (setq ptx (nth 0 pt))
6.
7.                         (setq pty (nth 1 pt))
8.
9.                                 (setq LG1 (getreal "How long is the 1st leg?"))
10.
11.                                         (setq THK1 (getreal "How thick is the member?"))
12.
13.                                                         (setq x1 (+ pty LG1))
14.
15.                                                 (setq pt1 (list x1 ptx 0))
16.
17.                                         (setq y1 (+ pty THK1))
18.
19.                                 (setq pt2 (- x1 THK1))
20.
21.                         (setq pt3 (list ptx y1 0))
22.
23.                 (setq pt4 (- pty THK1))
24.
25.         (command "pline" pt pt1 pt2 pt3 pt4 "c")
26.
27. ) ;Closes defun.

I know I need to adjust the points and lengths (as it's trying to make a triangle right now), but I am trying to narrow down what needs switched around.

I am very grateful for any and all help.

#### Grrr1337

• Swamp Rat
• Posts: 783 ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #1 on: June 17, 2022, 06:19:13 PM »
Hi, heres a quick example. Not sure if thats what you are after -
Code - Auto/Visual Lisp: [Select]
1. ; Sample chart:
2. ;
3. ;   pt_legYaxis
4. ;    |  | ipt_legYaxis
5. ;    |  |
6. ;    |  |
7. ;    |  | ipt
8. ;    |  |___________ ipt_legXaxis
9. ; pt |________________ pt_legXaxis
10. ;
11. ;
12. (defun C:BAA ( / pt LG1 LG2 THK1 pt_legYaxis pt_legXaxis ipt_legYaxis ipt_legXaxis ipt ) ; always localise your variables
13.
14.   (if
15.     (and ; code block that collects all the user's inputs
16.       (setq pt (getpoint "Choose a starting point"))
17.       (setq LG1 (getreal "How long is the 1st leg?"))
18.       (setq LG2 (getreal "How long is the 2nd leg?"))
19.       (setq THK1 (getreal "How thick is the member?"))
20.     ); and
21.     (progn ; code block that processes the inputs
22.       (setq pt_legYaxis (mapcar '+ pt (list 0.0 LG1 0.0))) ; calculate the vertical leg by adding 'LG1' distance to 'pt's Y coordinate
23.       (setq pt_legXaxis (mapcar '+ pt (list LG2 0.0 0.0))) ; calculate the horizontal leg by adding 'LG2' distance to 'pt's X coordinate
24.       (setq ipt_legYaxis (mapcar '+ pt_legYaxis (list THK1 0.0 0.0))) ; calculate the inner top vertex by adding 'THK1' distance on 'ipt_legYaxis' s X coordinate
25.       (setq ipt_legXaxis (mapcar '+ pt_legXaxis (list 0.0 THK1 0.0))) ; calculate the inner bottom vertex by adding 'THK1' distance on 'ipt_legXaxis' s Y coordinate
26.       (setq ipt (mapcar '+ pt (list THK1 THK1 0.0))) ; calculate the inner intersection by adding 'THK1' distance on 'pt's X coordinate and Y coordinate
27.
28.       (command "_.pline" pt pt_legXaxis ipt_legXaxis ipt ipt_legYaxis pt_legYaxis "c") ; invoke polyline command and order the point arguments to shape an outline
29.     ); progn
30.     (alert "User interrupted an input")
31.   ); if
32.   (princ)
33. ); defun C:BAA
(apply ''((a b c)(a b c))
'(
(( f L ) (apply 'strcat (f L)))
(( L ) (if L (cons (chr (car L)) (f (cdr L)))))
(72 101 108 108 111 32 87 111 114 108 100)
)
)

#### BIGAL

• Swamp Rat
• Posts: 1037
• 40 + years of using Autocad ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #2 on: June 17, 2022, 10:12:44 PM »
Grrr1337 has provided a good solution

You can change input to this if you want. Code: [Select]
`(if (not AH:getvalsm)(load "Multi Getvals.lsp"))(setq ans (AH:getvalsm (list "Enter values " "1st leg Len " 10 9 "6" "2nd leg len" 10 9 "6" "Thickness " 10 9 "1" )))`

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #3 on: June 20, 2022, 09:07:58 AM »
That command does work amazing and I am learning a lot from checking out what each line does, but I was wondering if there would be an easy way to incorporate the angle (plus or minus 90 degrees) and a fillet on the outside of the angle. I am hoping to start the incorporation now, so that later I can have it change based on user input.

thank you for all your help and guidance, it is greatly appreciated.

#### Grrr1337

• Swamp Rat
• Posts: 783 ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #4 on: June 20, 2022, 11:11:05 AM »
You have your 'regular' points for describing the shape, for such recalculation you might need some point-rotating and/or point-reflecting subfunctions.

Rotate a list of points
How to calculate mirrored point

For me personally to perform such tasks I use Lee Mac's Matrix transform functions (because I'm not that good at math):
Matrix Transformation Functions

Your next objective is how to incorporate them into your code, and also decide on what kind of user input to draw the rotated/mirrored shape.

(apply ''((a b c)(a b c))
'(
(( f L ) (apply 'strcat (f L)))
(( L ) (if L (cons (chr (car L)) (f (cdr L)))))
(72 101 108 108 111 32 87 111 114 108 100)
)
)

#### BIGAL

• Swamp Rat
• Posts: 1037
• 40 + years of using Autocad ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #5 on: June 20, 2022, 08:46:46 PM »
It maybe that entering -ve value for lengths may invert the "L" using GRRR code but it will need a couple of values changed. Will have a think if Grrr does not do 1st. #### BIGAL

• Swamp Rat
• Posts: 1037
• 40 + years of using Autocad ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #6 on: June 22, 2022, 01:38:23 AM »
Found some time and had a play sorry Grrr got lost in pt names, accepts negative distances.

Code: [Select]
`; Sample chart:; Original code by Grrr; Modified by Alanh to do 4 directions;      pt2  pt3;       |  |;       |  |;       |  |;       |  | pt4;       |  |___________ pt5; pt1 |________________ pt6;;(defun C:BAA ( / oldsnap pt1 LG1 LG2 THK1 l1 l2 l3 l4 pt1 pt2 pt3 pt4 pt5 pt6) ; always localise your variables(defun l1 ( / )(setq pt2 (mapcar '+ pt1 (list 0.0 LG1 0.0))) ; calculate the vertical leg by adding 'LG1' distance to 'pt's Y coordinate(setq pt3 (mapcar '+ pt2 (list THK1 0.0 0.0))) ; calculate the inner top vertex by adding 'THK1' distance on 'ipt_legYaxis' s X coordinate(setq pt4 (mapcar '+ pt1 (list THK1 THK1 0.0))) ; calculate the inner intersection by adding 'THK1' distance on 'pt's X coordinate and Y coordinate(setq pt6 (mapcar '+ pt1 (list LG2 0.0 0.0))) ; calculate the horizontal leg by adding 'LG2' distance to 'pt's X coordinate(setq pt5 (mapcar '+ pt6 (list 0.0 THK1 0.0))) ; calculate the inner bottom vertex by adding 'THK1' distance on 'ipt_legXaxis' s Y coordinate(command "_.pline" pt1 pt2 pt3 pt4 pt5 pt6  "c"))(defun l2 ( / )(setq pt2 (mapcar '+ pt1 (list 0.0 LG1 0.0))) ; calculate the vertical leg by adding 'LG1' distance to 'pt's Y coordinate(setq pt3 (mapcar '+ pt2 (list THK1 0.0 0.0))) ; calculate the inner top vertex by adding 'THK1' distance on 'ipt_legYaxis' s X coordinate(setq pt4 (mapcar '+ pt1 (list THK1 (- THK1) 0.0))) ; calculate the inner intersection by adding 'THK1' distance on 'pt's X coordinate and Y coordinate(setq pt6 (mapcar '+ pt1 (list LG2 0.0 0.0))) ; calculate the horizontal leg by adding 'LG2' distance to 'pt's X coordinate(setq pt5 (mapcar '+ pt6 (list 0.0 (- THK1) 0.0))) ; calculate the inner bottom vertex by adding 'THK1' distance on 'ipt_legXaxis' s Y coordinate(command "_.pline" pt1 pt2 pt3 pt4 pt5 pt6  "c"))(defun l3 ( / )(setq pt2 (mapcar '+ pt1 (list 0.0 LG1 0.0))) ; calculate the vertical leg by adding 'LG1' distance to 'pt's Y coordinate(setq pt3 (mapcar '+ pt2 (list (- THK1) 0.0 0.0))) ; calculate the inner top vertex by adding 'THK1' distance on 'ipt_legYaxis' s X coordinate(setq pt4 (mapcar '+ pt1 (list (- THK1) THK1 0.0))) ; calculate the inner intersection by adding 'THK1' distance on 'pt's X coordinate and Y coordinate(setq pt6 (mapcar '+ pt1 (list LG2 0.0 0.0))) ; calculate the horizontal leg by adding 'LG2' distance to 'pt's X coordinate(setq pt5 (mapcar '+ pt6 (list 0.0 THK1 0.0))) ; calculate the inner bottom vertex by adding 'THK1' distance on 'ipt_legXaxis' s Y coordinate(command "_.pline" pt1 pt2 pt3 pt4 pt5 pt6  "c"))(defun l4 (  / )(setq pt2 (mapcar '+ pt1 (list 0.0 LG1 0.0))) ; calculate the vertical leg by adding 'LG1' distance to 'pt's Y coordinate(setq pt3 (mapcar '+ pt2 (list (- THK1) 0.0 0.0))) ; calculate the inner top vertex by adding 'THK1' distance on 'ipt_legYaxis' s X coordinate(setq pt4 (mapcar '+ pt1 (list (- THK1) (- THK1) 0.0))) ; calculate the inner intersection by adding 'THK1' distance on 'pt's X coordinate and Y coordinate(setq pt6 (mapcar '+ pt1 (list LG2 0.0 0.0))) ; calculate the horizontal leg by adding 'LG2' distance to 'pt's X coordinate(setq pt5 (mapcar '+ pt6 (list 0.0 (- THK1) 0.0))) ; calculate the inner bottom vertex by adding 'THK1' distance on 'ipt_legXaxis' s Y coordinate(command "_.pline" pt1 pt2 pt3 pt4 pt5 pt6  "c"))(if (not AH:getvalsm)(load "Multi Getvals.lsp"))(if (= (setq  pt1 (getpoint "Choose a starting point")) nil)(alert "User interrupted an input")(progn  (setq ans (AH:getvalsm (list "Enter values " "Height  " 6 5 "100" "Length " 6 5 "150" "Thick " 6 5 "10" )))  (setq LG1 (atof (nth 0 ans)) lG2 (atof (nth 1 ans)) THK1 (atof (nth 2 ans)))  (setq oldsnap (getvar 'osmode))  (setvar 'osmode 0)  (cond    ((and (> lg1 0.0)(> LG2 0.0))(L1))    ((and (< lg1 0.0)(> LG2 0.0))(L2))    ((and (> lg1 0.0)(< lg2 0.0))(L3))    ((and (< lg1 0.0)(< lg2 0.0))(L4)) ) ; cond (setvar 'osmode oldsnap)    ); progn ); if   (princ)); defun C:BAA(c:baa)`

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #7 on: June 23, 2022, 03:08:46 PM »
I think I will end up having to set the base point and leg orientation later, but what I meant when I was talking about changing the angle of the angle member I meant how would I go about making it either acute or obtuse instead of a 90 degree angle. I am currently working on the best way to incorporate the angle as well as a fillet on the "outside corner". If I can figure it out I will attach a dwg of what I hope the end product to look similar to.

#### BIGAL

• Swamp Rat
• Posts: 1037
• 40 + years of using Autocad ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #8 on: June 23, 2022, 07:57:12 PM »
Good task to learn lisp, look at what I posted, you would remove the mapcar functions and replace with a (setq pt2 (polar pt1 ang dist)) « Last Edit: June 23, 2022, 08:00:50 PM by BIGAL »

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #9 on: July 06, 2022, 09:58:49 AM »
Well, I am still working on it and I am trying to incorporate everything I have found so far, but this is what I have and it isn't loading properly. Any and all feedback is greatly appreciated.

Code - Auto/Visual Lisp: [Select]
1. (defun C:BAA ( / pt LG1 LG2 THK1 pty ptx ipty iptx ipt dtr) ; Localizes the variables.
2.
3. (setq CL (getvar "clayer")); Gets the current layer.
4.
5. (command "layer" "m" "0" "c" 4 "" "l" "continuous" "" nil); Creates and sets layer 0.
6.
7. (setq lm (getvar "limcheck")); Gets the current limit setting.
8.
9. (setvar "limcheck" 0); Sets limits to 0 or off.
10.
11. (defun dtr (x); Defines the degrees to radians. Remember to change it back.
12.
13. (* pi (/ x 180.0)); Angle divided by 180, then total is multiplied by Pi.
14.
16.
17.
18.
19.         (if
20.
21.                 (and
22.
23.                         (setq pt (getpoint "Please choose a start?")); Bottom left starting point of leg.
24.
25.                                 (setq LG1 (getreal "Please enter the 1st leg length?")); Vertical leg length.
26.
27.                                         (setq LG2 (getreal "Please enter the 2nd leg length?")); horizontal leg length.
28.
29.                                                 (setq THK1 (getreal "How thick is the member?")); Thickness of the angle member.
30.
31.                                                         ); Closes and
32.
33.                                                                 (progn ; code block that processes the inputs
34.
35.                                                                         (setq pty (polar '+ pt (dtr 0.0 LG1 0.0))) ; Outside of vertical leg.
36.
37.                                                                 (setq ptx (polar '+ pt (dtr LG2 0.0 0.0))) ; Outside of horizontal leg.
38.
39.                                                         (setq ipty (polar '+ pty (dtr THK1 0.0 0.0))) ; Inside of vertical leg.
40.
41.                                                 (setq iptx (polar '+ ptx (dtr 0.0 THK1 0.0))) ; Inside horizontal leg.
42.
43.                                         (setq ipt (polar '+ pt (dtr THK1 THK1 0.0))) ; Inside intersection.
44.
45.                                 (command "pline" pt ptx iptx ipt ipty pty "c") ; Polyline to make the angle.
46.
47.                                                                 ); Closes progn
48.
49.         ); Closed if
50.
51. (command "layer" "s" cl ""); To set layer back to original.
52.
53. (setvar "limcheck" lm); To reset limit to starting limit.
54.
55. ); Closes defun ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #10 on: July 06, 2022, 10:34:48 AM »
The problem with your current code is that you are trying to pass too many arguments to the `dtr` function.

Little tips, there are simple standard conventions for some (they may seem minor but they will help you later).

1. Comment the function close with a " ;_ <function> " string.
2. You can line up your inline comments for easier reading (I tend to use column 57 if you are using a text editor and have control over that).
3. I prefix my comments with a dash so I can tell where a new comment (sentence/statement) starts.

Code - Auto/Visual Lisp: [Select]
1. ;; -X-          This code does not work          -X-
2. (defun C:BAA ( / pt LG1 LG2 THK1 pty ptx ipty iptx ipt dtr) ; -Localizes the variables.
3.   (setq CL (getvar "clayer"))                           ; -Gets the current layer.
4.   (command "layer" "m" "0" "c" 4 "" "l" "continuous" "" nil); -Creates and sets layer 0.
5.   (setq lm (getvar "limcheck"))                         ; -Gets the current limit setting.
6.   (setvar "limcheck" 0)                                 ; -Sets limits to 0 or off.
7.
8.   (defun dtr (x)                                        ; -Defines the degrees to radians. Remember
9.                                                         ;  to change it back.
10.     (* pi (/ x 180.0))                                  ; -Angle divided by 180, then total
11.                                                         ;  is multiplied by Pi.
12.     );_ defun
13.
14.
15.   (if
16.     (and
17.       (setq pt (getpoint "Please choose a start?"))     ; -Bottom left starting point of leg.
18.       (setq LG1 (getreal "Please enter the 1st leg length?")); -Vertical leg length.
19.       (setq LG2 (getreal "Please enter the 2nd leg length?")); -Horizontal leg length.
20.       (setq THK1 (getreal "How thick is the member?"))  ; -Thickness of the angle member.
21.       );_ and
22.
23.     (progn                                              ; -code block that processes the inputs
24.       (setq pty (polar '+ pt (dtr 0.0 LG1 0.0)))        ; -Outside of vertical leg.
25.       (setq ptx (polar '+ pt (dtr LG2 0.0 0.0)))        ; -Outside of horizontal leg.
26.       (setq ipty (polar '+ pty (dtr THK1 0.0 0.0)))     ; -Inside of vertical leg.
27.       (setq iptx (polar '+ ptx (dtr 0.0 THK1 0.0)))     ; -Inside horizontal leg.
28.       (setq ipt (polar '+ pt (dtr THK1 THK1 0.0)))      ; -Inside intersection.
29.       (command "pline" pt ptx iptx ipt ipty pty "c")    ; -Polyline to make the angle.
30.       );_ progn
31.     );_ if
32.
33.   (command "layer" "s" cl "")                           ; -To set layer back to original.
34.   (setvar "limcheck" lm)                                ; -To reset limit to starting limit.
35.   );_ defun
36.
TheSwamp.org (serving the CAD community since 2003)

Donate to TheSwamp.org

#### BIGAL

• Swamp Rat
• Posts: 1037
• 40 + years of using Autocad ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #11 on: July 06, 2022, 08:28:12 PM »
Did you look at all the code in my post 6 it is full 4 direction "L's". Just make sure that Multi Getvals.lsp is in support path or Appload add to Startup Suite to it gets loaded on startup.

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #12 on: July 07, 2022, 09:04:24 AM »
Is there a good way to make it work without the "Multi GETVALS" LISP?

#### dexus

• Newt
• Posts: 75 ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #13 on: July 07, 2022, 09:12:57 AM »
Is there a good way to make it work without the "Multi GETVALS" LISP?
You can always combine the two files by putting al the code from multi getvals.lsp at the end of your lisp file.
That way you only have to load one file.

Edit, make sure to leave the header in, its good practice and a good way to see where you found the code so you can find the source a couple of years later if needed.

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #14 on: July 07, 2022, 09:35:31 AM »
I think I will try that. I did want to see where I went wrong with incorporating this following link.

I tried to use the "dtr" command and I am getting some pushback from the linked forum. I see where it is overused, but I am still learning programing language.

https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/creating-custom-shape-with-formed-leg/m-p/11281305#M433384

Any and all help is greatly appreciated.

#### BIGAL

• Swamp Rat
• Posts: 1037
• 40 + years of using Autocad ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #15 on: July 07, 2022, 09:42:02 PM »
The (if (not loads the multi getvals if not loaded, you can do 2 solutions.

Save the file in a support file location. Make a directory if you dont have one for saving all the code you get from here.

Or use Appload add to Startup Suite Multi Getvals.lsp this is the way I have it set up.

The program is designed to not copy the code into every other program rather just call it geberally around 3 lines, you can also save previous selections as defaults when ran again. But only in current session. There is also Multi Radio Buttons, Multi Radio Buttons 2col and  Multi Toggles.

Lastly all my code uses this method now for initget style input nad value input. Been at it for like 40 years coding.

ALMOST FORGOT did you look at your post on other forums, new code includes angles.

Code: [Select]
`; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/creating-custom-shape-with-formed-leg/td-p/11281202; angle design; Sample chart:; Original code by Grrr; Modified by Alanh to do 4 directions July 2022;      pt2  pt3;       |  |;       |  |;       |  |;       |  | pt4;       |  |___________ pt5; pt1 |________________ pt6;;(defun C:BAA ( / oldsnap pt1 LG1 LG2 THK1 l1 l2 l3 l4 pt1 pt2 pt3 pt4 pt5 pt6) ; always localise your variables(defun dtr (a)(* pi (/ a 180.0)))(setq pi90 (/ Pi 2.0) pi270 (* 1.5 pi))(if (not AH:getvalsm)(load "Multi Getvals.lsp"))(if (= (setq  pt1 (getpoint "Choose a starting point")) nil)(alert "User interrupted an input")(progn  (setq ans (AH:getvalsm (list "Enter values " "Height  " 6 5 "100" "ANG1" 6 5 "0" "Length " 6 5 "150" "ANG2" 6 5 "90" "Thick " 6 5 "10" )))  (setq LG1 (atof (nth 0 ans)) ang1 (dtr (atof (nth 1 ans))) lG2 (atof (nth 2 ans)) ang2 (dtr (atof (nth 3 ans))) THK1 (atof (nth 4 ans)))  (setq oldsnap (getvar 'osmode) oldaunits (getvar 'aunits))  (setvar 'osmode 0)  (setvar 'aunits 3)(setq pt2 (polar pt1 (+ pi90 ang1) lg1))(setq pt3 (polar pt2 ang1 THK1))(setq pt4 (polar pt3 (+ pi270 ang1) lg1))(setq pt6 (polar pt1 (+ pi270 ang2) lg2))(setq pt5 (polar pt6 ang2 thk1))(setq pt7 (polar pt5  (- ang2 pi270) lg2))(command "_.pline" pt4 pt3 pt2 pt1 pt6 pt5  pt7 "")(setq pt6 (mapcar '* (mapcar '+ pt7 pt5) '(0.5 0.5)))(setq pt7(mapcar '* (mapcar '+ pt3 pt4) '(0.5 0.5)))(setvar 'filletrad 0.0)(command "fillet"  pt6 pt7) (setvar 'osmode oldsnap) (setvar 'aunits oldaunits)    ); progn ); if  (princ)); defun C:BAA(c:baa)`
« Last Edit: July 07, 2022, 09:47:01 PM by BIGAL »

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #16 on: July 08, 2022, 09:28:20 AM »
I am very grateful for your code Al, and I can easily use it to do what I want it to do, but I am hoping to learn how to code what I want to do without outside lisp commands and why things work the way they do. I know that just about everything I would ever want to do and more is already done, but I really want to learn the ins and outs so I can do what you did on my own. I know I am a some what slow learner, but I am trying and want to make my skills better. I think if I go go line by line I can transfer hat I want to do to my own code, but it will take time. I think the main thing I am looking for now is a "what did I do wrong and what/how will it work in theory".

I definitely have a great place to start, but I hope to understand the language and how it works together. So thank you everyone for your help and patience while I learn.

#### BIGAL

• Swamp Rat
• Posts: 1037
• 40 + years of using Autocad ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #17 on: July 08, 2022, 10:01:06 PM »
Good to hear your having a go so many just ask for free, with projects like this I get a pen and paper draw the shape and label all the points. So work out next point then last join together line/pline.

I wrote some code then used copy and paste a line to command line, getpoint 1, work out next pt2 using polar, then I typed Line !pt1 !pt2 Enter and  a line was drawn note "!" so could check line was going in correct direction, just repeated this for all line segments. Re the inside point I could have used a Tan function to work out the angle for the polar but it was easier to let Acad fillet the 1st and last line.

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #18 on: July 12, 2022, 10:28:07 AM »
I think I am getting closer to having a working code, but it's no longer drawings the lines. I am also getting a new error, but I'm a little stumped on what's not working correctly.

Code - Auto/Visual Lisp: [Select]
1. (defun C:BAA ( / pt1 LG1 LG2 THK1 L1 L2 L3 L4 pt2 pt3 pt4 pt5 pt6 pt7 piA piB ans dtr) ; -Localizes the variables.
2.
3.
4.         (setq CL (getvar "clayer"))                                     ; -Gets the current layer.
5.
6.         (command "layer" "m" "0" "c" 4 "" "l" "continuous" "" nil)      ; -Creates and sets layer 0.
7.
8.         (setq lm (getvar "limcheck"))                                   ; -Gets the current limit setting.
9.
10.         (setvar "limcheck" 0)                                           ; -Sets limits to 0 or off.
11.
12.
13.         (defun dtr (d)                                                  ; -Defines the degrees to radians. Remember to change it back.
14.
15.                 (* pi (/ d 180.0))                                      ; -Angle divided by 180, then total is multiplied by Pi.
16.
18.
19.         (setq piA (/ Pi 2.0) piB (* 1.5 pi))
20.
21.
22.         (if
23.
24.
25.                 (and
26.
27.                 (setq pt1 (getpoint "Please choose a start?"))          ; -Bottom left starting point of leg.
28.
29.                 (setq LG1 (getreal "Please enter the 1st leg length?")) ; -Vertical leg length.
30.
31.                 (setq LG2 (getreal "Please enter the 2nd leg length?")) ; -Horizontal leg length.
32.
33.                 (setq THK1 (getreal "How thick is the member?"))        ; -Thickness of the angle member.
34.
35.                 (setq ang1 (getreal "Set the angle please..."))         ; -Sets the angle.
36.
37.                 ); Closes and
38.
39.
40.
41.                 (setq pt2 (polar pt1 (+ piA ang1) LG1))
42.
43.                 (setq pt3 (polar pt2 ang1 THK1))
44.
45.                 (setq pt4 (polar pt3 (+ piB ang1) LG1))
46.
47.                 (setq pt6 (polar pt1 (+ piB ang2) LG2))
48.
49.                 (setq pt5 (polar pt6 ang2 thk1))
50.
51.                 (setq pt7 (polar pt5  (- ang2 piB) LG2))
52.
53.                 (setq pt6 (mapcar '* (mapcar '+ pt7 pt5) '(0.5 0.5)))
54.
55.                 (setq pt7(mapcar '* (mapcar '+ pt3 pt4) '(0.5 0.5)))
56.
57.                 (command "pline" pt4 pt3 pt2 pt1 pt6 pt5  pt7 "c")      ; -Polyline to make the angle.
58.
59.                 (setvar 'filletrad (* THK1 0.5))
60.
61.         (command "fillet"  pt6 pt7)
62.
63.
64.          ); -Closes progn
65.
66.          ); -Closes if
67.
68.         (princ)
69.
70.         (command "layer" "s" cl "")                                     ; -To set layer back to original.
71.
72.         (setvar "limcheck" lm)                                          ; -To reset limit to starting limit.
73.
74.
75. ); -Closes defun
76.

This is the code and the error I get back "; error: bad argument type: numerp: nil"

Any and all feedback as greatly appreciated.

#### ScottMC

• Newt
• Posts: 123 ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #19 on: July 12, 2022, 05:34:27 PM »
No 'ang2'..  turn the fillet off too. Now it's getting the order of coords to work for the pline.

#### BIGAL

• Swamp Rat
• Posts: 1037
• 40 + years of using Autocad ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #20 on: July 12, 2022, 09:24:38 PM »
Curious drafter you only need to check say you have picked a point or maybe pressed esc.

Your welcome to use my multi getvals.lsp it is a library program can be used in any program just change the list to suit. Just make sure its saved in a support path or autoload on startup. You can cahnge the default values you can save the default values between goes can explain if required.

Code: [Select]
`(if (not AH:getvalsm)(load "Multi Getvals.lsp"))(if (= (setq  pt1 (getpoint "Choose a starting point")) nil)(alert "User interrupted an input")(progn  (setq ans (AH:getvalsm (list "Enter values " "Height  " 6 5 "100" "Length " 6 5 "150"  "Thick " 6 5 "10" "ANGLE" 6 5 "90")))  (setq LG1 (atof (nth 0 ans))  LG2 (atof (nth 2 ans))  THK1 (atof (nth 4 ans)) ang1 (* pi (/ (atof (nth 3 ans)) 180.0)) )`
« Last Edit: July 12, 2022, 09:29:24 PM by BIGAL »

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #21 on: August 02, 2022, 11:51:37 AM »
I decided to try and take it back a couple steps and make sure I get my head wrapped around everything again so I can see how and why things are or are not working for me. I altered my lisp back to the following:
Code - Auto/Visual Lisp: [Select]
1. (defun C:BAA ( / pt1 LG1 LG2 THK1 pt2 pt3 pt4 pt5 pt6) ; -Localizes the variables.
2.
3.
4.         (setq CL (getvar "clayer"))                                     ; -Gets the current layer.
5.
6.         (command "layer" "m" "0" "c" 4 "" "l" "continuous" "" nil)      ; -Creates and sets layer 0.
7.
8.         (setq lm (getvar "limcheck"))                                   ; -Gets the current limit setting.
9.
10.         (setvar "limcheck" 0)                                           ; -Sets limits to 0 or off.
11.
12.
13.         (if
14.
15.
16.                 (and
17.
18.                 (setq pt1 (getpoint "Please choose a start?"))          ; -Bottom left starting point of leg.
19.
20.                 (setq LG1 (getdist "Please enter the 1st leg length?")) ; -Vertical leg length.
21.
22.                 (setq LG2 (getdist "Please enter the 2nd leg length?")) ; -Horizontal leg length.
23.
24.                 (setq THK1 (getdist "How thick is the member?"))        ; -Thickness of the angle member.
25.
26.                 (setq ang1 (getangle "Set the angle please..."))        ; -Sets the angle.
27.
28.                 ); Closes and
29.
30.         (progn                                                          ; -Code block that processes the inputs
31.
32.
33.                 (setq pt2 (polar pt1 1.57 LG1))                         ; changed for testing
34.
35.                 (setq pt3 (polar pt2 0 THK1))                           ; changed for testing
36.
37.                 (setq pt4 (polar pt3 4.71 (- LG1 THK1) ))               ; changed for testing
38.
39.                 (setq pt5 (polar pt4 6.28 (- LG2 THK1) ))               ; changed for testing
40.
41.                 (setq pt6 (polar pt5 4.71 thk1))                        ; changed for testing
42.
43.                 (command "pline" pt1 pt2 pt3 pt4 pt5 pt6 "c")           ; -Polyline to make the angle.
44.
46.
47.         ; -For later use -command "fillet" at outside point typical-    ; -Creates radius at external corner
48.
49.
50.          ); -Closes progn
51.
52.          ); -Closes if
53.
54.         (princ)
55.
56.         (command "layer" "s" cl "")                                     ; -To set layer back to original.
57.
58.         (setvar "limcheck" lm)                                          ; -To reset limit to starting limit.
59.
60.
61. ); -Closes defun

Still working out the kinks, but attached is the slightly cleaned up end goal for now. I am hoping to eventually have my lisp so all that is needed is to enter the known and needed values and have it generate a fully dimensioned shape like in the dwg. I finally have it making an "L" again and will change it so that it will use "dtr" instead of using radians as it does now.

I know I can use and I am grateful for the permission to use the multi getvals.lsp, but I am still hoping to create the routine from the ground up. Hopefully it helps me to better understand what I am doing instead of just poking in the dark.

For now I am going to read what I can find and have been sent again now that I have a clearer picture of what does and doesn't work so far. Any tips are still greatly appreciated and thank you for your patience when I am surely causing frustration.

#### BIGAL

• Swamp Rat
• Posts: 1037
• 40 + years of using Autocad ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #22 on: August 02, 2022, 11:26:25 PM »
As you say use the getreal etc multiple times then when ready add the multi getvals.

Have a look at this re dims.

Code: [Select]
`; simple draw a box and dimension it ; By Alan H March 2019(defun ah:box ( / pt1 pt2 pt3 ahl ahh ahoff )(setq oldsnap (getvar 'osmode))(setq oldang (getvar 'angdir))(setq pt1 (getpoint "\nPick lower left"))(setvar 'osmode 0)(if (not AH:getvalsm)(load "Multi Getvals.lsp"))(setq ans (AH:getvalsm (list "Simple rectang" "Enter length" 8 7 "1" "Enter height " 8 7 "2")))(setq ahL (atof (nth 0 ans)))(setq ahH (atof (nth 1 ans)))(setq pt2 (polar pt1 0.0 ahl))(setq pt3 (polar pt2 (/ pi 2.0) ahH))(command "rectang" pt1 pt3)(setq ahoff (* 2.0 (* (getvar 'dimasz)(getvar 'dimscale)))) ; change offset as required(setq pt4 (polar pt2  (* pi 1.5) ahoff)) (command "dim" "hor" pt1 pt2 pt4 "" "exit")(setq pt4 (polar pt3 0.0 ahoff))(command "dim" "Ver" pt2 pt3 pt4 "" "exit")(setvar 'osmode oldsnap))(ah:box)`

#### GDF ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #23 on: August 03, 2022, 02:53:25 PM »
Why is there never enough time to do it right, but always enough time to do it over?

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #24 on: August 09, 2022, 03:10:07 PM »
Well, I took another couple shots at this and I have to say that I still have no clue how the angles work in this code. I only assume I made a greater power angry at some point and now they are laughing.

With this code I can at least make a shape that resembles an angle piece.

Code - Auto/Visual Lisp: [Select]
1. (defun C:LBA ( / pt1 LG1 LG2 THK1 pt2 pt3 pt4 pt5 p5A pt6 pt7 p7A pt8 pt9) ; -Localizes the variables.
2.
3.
4.         (setq CL (getvar "clayer"))                                     ; -Gets the current layer.
5.
6.         (command "layer" "m" "0" "c" 4 "" "l" "continuous" "" nil)      ; -Creates and sets layer 0.
7.
8.         (setq lm (getvar "limcheck"))                                   ; -Gets the current limit setting.
9.
10.         (setvar "limcheck" 0)                                           ; -Sets limits to 0 or off.
11.
12.
13.         (if
14.
15.
16.                 (and
17.
18.                 (setq pt1 (getpoint "Please choose a start?"))          ; -Bottom left starting point of leg.
19.
20.                 (setq LG1 (getdist "Please enter the 1st leg length?")) ; -Vertical leg length.
21.
22.                 (setq LG2 (getdist "Please enter the 2nd leg length?")) ; -Horizontal leg length.
23.
24.                 (setq THK1 (getdist "How thick is the member?"))        ; -Thickness of the angle member.
25.
26.                 (setq ang1 (getangle "Set the angle please..."))        ; -Sets the angle.
27.
28.                 ); Closes and
29.
30.         (progn                                                          ; -Code block that processes the inputs
31.
32.
33.                 (setq pt2 (polar pt1 (/ pi 2) LG1)                      ; -Inside of Vertical Leg
34.
35.                         pt3 (polar pt2 pi LG2)                          ; -Inside of Angled Leg
36.
37.                         pt4 (polar pt3 (/ pi 2) THK1)                   ; -Thickness of Angled Leg
38.
39.                         pt5 (polar pt4 0 (+ LG2 LG1))                   ; -Outside of Angled Leg
40.
41.                         pt6 (polar pt1 0 THK1)                          ; -Outside of Angled Leg
42.
43.                         pt7 (polar pt6 (/ pi 2) (+ LG2 LG1))            ; -Outside of Angled Leg
44.
45.                         pt8 (polar pt1 pi 2)                            ; -Point for Vert Dim
46.
47.                         pt9 (polar pt1 (* pi 1.5) 2)                    ; -Point for Horz Dim -Side note. I am hoping to make this align with the angled leg.
48.
49.                 ;(setq p5A (mapcar '* (mapcar '+ pt4 pt5) '(0.5 0.5))) ; -Not working, set to the side for now.
50.
51.                 ;(setq p7A (mapcar '* (mapcar '+ pt6 pt7) '(0.5 0.5))) ; -Not working, set to the side for now.
52.
53.                 ); Closes setq
54.
55.                 (command "pline" pt7 pt6 pt1 pt2 pt3 pt4 pt5 "")        ; -Polyline to make the angle.
56.
58.
59.         ;(command "fillet" p5A p7A)                                     ; -Creates radius at external corner
60.
61.
62.          ); -Closes progn
63.
64.          ); -Closes if
65.
66.         (princ)
67.
68.         (command "dim" "hor" pt2 pt3 pt9 "" "exit")                     ; -Creates the Angled Leg Dim.
69.
70.         (command "dim" "ver" pt1 pt2 pt8 "" "exit")                     ; -Creates the Vertical Leg Dim.
71.
72.         (command "layer" "s" cl "")                                     ; -To set layer back to original.
73.
74.         (setvar "limcheck" lm)                                          ; -To reset limit to starting limit.
75.
76.
77. ); -Closes defun

When I try to do anything to change the angle is where things to weird and stop being consistent. I have tested a number of different combinations of just angles, radians, angles and radians, rolling dice, etc. but there doesn't seem to be a consistent change when the angle is changed.

The following is an example.

Code - Auto/Visual Lisp: [Select]
1. (defun C:LBA ( / pt1 LG1 LG2 THK1 pt2 pt3 pt4 pt5 p5A pt6 pt7 p7A pt8 pt9) ; -Localizes the variables.
2.
3.
4.         (setq CL (getvar "clayer"))                                     ; -Gets the current layer.
5.
6.         (command "layer" "m" "0" "c" 4 "" "l" "continuous" "" nil)      ; -Creates and sets layer 0.
7.
8.         (setq lm (getvar "limcheck"))                                   ; -Gets the current limit setting.
9.
10.         (setvar "limcheck" 0)                                           ; -Sets limits to 0 or off.
11.
12.
13.         (if
14.
15.
16.                 (and
17.
18.                 (setq pt1 (getpoint "Please choose a start?"))          ; -Bottom left starting point of leg.
19.
20.                 (setq LG1 (getdist "Please enter the 1st leg length?")) ; -Vertical leg length.
21.
22.                 (setq LG2 (getdist "Please enter the 2nd leg length?")) ; -Horizontal leg length.
23.
24.                 (setq THK1 (getdist "How thick is the member?"))        ; -Thickness of the angle member.
25.
26.                 (setq ang1 (getangle "Set the angle please..."))        ; -Sets the angle.
27.
28.                 ); Closes and
29.
30.         (progn                                                          ; -Code block that processes the inputs
31.
32.
33.                 (setq pt2 (polar pt1 (/ pi 2) LG1)                      ; -Inside of Vertical Leg
34.
35.                         pt3 (polar pt2 (* pi (/ (- 270 ang1) 180)) LG2) ; -Inside of Angled Leg
36.
37.                         pt4 (polar pt3 (* pi (/ (- 180 ang1) 180)) THK1)        ; -Thickness of Angled Leg
38.
39.                         pt5 (polar pt4 (* pi (/ (- 90 ang1) 180)) (* LG2 2))    ; -Outside of Angled Leg
40.
41.                         pt6 (polar pt1 0 THK1)                          ; -Outside of Angled Leg
42.
43.                         pt7 (polar pt6 (/ pi 2) (* LG1 2))              ; -Outside of Angled Leg
44.
45.                         pt8 (polar pt1 pi 2)                            ; -Point for Vert Dim
46.
47.                         pt9 (polar pt1 (* pi 1.5) 2)                    ; -Point for Horz Dim  -Side note. I am hoping to make this align with the angled leg.
48.
49.                 ;(setq p5A (mapcar '* (mapcar '+ pt4 pt5) '(0.5 0.5))) ; -Not working, set to the side for now
50.
51.                 ;(setq p7A (mapcar '* (mapcar '+ pt6 pt7) '(0.5 0.5))) ; -Not working, set to the side for now
52.
53.                 ); Closes setq
54.
55.                 (command "pline" pt7 pt6 pt1 pt2 pt3 pt4 pt5 "")        ; -Polyline to make the angle.
56.
58.
59.         ;(command "fillet" p5A p7A)                                     ; -Creates radius at external corner
60.
61.
62.          ); -Closes progn
63.
64.          ); -Closes if
65.
66.         (princ)
67.
68.         ;(command "dim" "hor" pt2 pt3 pt9 "" "exit")                    ; -Creates the Angled Leg Dim.
69.
70.         (command "dim" "ver" pt1 pt2 pt8 "" "exit")                     ; -Creates the Vertical Leg Dim.
71.
72.         (command "layer" "s" cl "")                                     ; -To set layer back to original.
73.
74.         (setvar "limcheck" lm)                                          ; -To reset limit to starting limit.
75.
76.
77. ); -Closes defun

If anyone would point me in a good direction for what I did wrong or how to appease the angry spirits I would greatly appreciate it.

Also, on a side note I decided to change how I create this lisp. I am trying to work it so the 1st leg is always vertical and the 2nd leg rotates around it. I was going to break that into left "LBA" and right "RBA" so the user could pick the side, put in the angle from the vertical and the other dimension. I figured if I did it this way the dimensions provided would always be the inside of the bend. (That's just how the company I work for does things.)

#### BIGAL

• Swamp Rat
• Posts: 1037
• 40 + years of using Autocad ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #25 on: August 09, 2022, 08:12:36 PM »
I wrote the double angle answer for you why have you not looked at that ? It may be on the other forum. It did left rights up down etc.

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #26 on: August 10, 2022, 08:07:31 AM »
I was having a hard time wrapping my head around how to use that to get the "in between" angles, but I am starting to understand. I think that is one of the main draw backs of trying to self teach something like this.

A lot of pieces of code are hard to find good information on. A good majority can be found here, but as an example with (command "dim" "ver" pt1 pt2 pt8 "" "exit") I understand how that works, except for the "ver" and what options are out there for that placeholder. And with (setq p7A (mapcar '* (mapcar '+ pt6 pt7) '(0.5 0.5))) I thought I had followed the right steps, but AutoCAD is telling me something isn't right with it.

Thanks for the patience and gentle guidance

#### Curious Drafter

• Mosquito
• Posts: 18
• Marine r try use big brain not stronk arms... ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #27 on: August 10, 2022, 02:28:32 PM »
Found that I had put the fillet command in the wrong place in the code and the mapcar lines needed to be after the pline command. Also, I was able to get the dimension command to work for both legs, but I am trying to get an angular dimension between the two as well. I tried to re work the line as such (command "dim" "Angular" "Vertex" p2 p3 p1A "" "exit") but it's not working. The line (command "dim" "align" pt2 pt3 pt9 "" "exit") worked great for the angled leg though.

Any guidance would be greatly appreciated.

#### BIGAL

• Swamp Rat
• Posts: 1037
• 40 + years of using Autocad ##### Re: Still learning, but now trying to make an "L" shape.
« Reply #28 on: August 10, 2022, 10:19:50 PM »
Its called a pencil, yeah often the answer is just do it manually and write down the steps so your (command just does the same same as when making the shape I drew on a piece of paper the point ids so I knew how to connect for the pline.

The mapcar function can be used to + - * / say 2 points

Code: [Select]
`(setq pt3  (mapcar '+ pt1 pt2) )  ;  adds(setq pt3 (mapcar '(lambda (x) (/ x 2.0)) pt3)   ;  divide pt3 by 2these 2 are same answer(setq mp (mapcar '* (mapcar '+ p1 p3) '(0.5 0.5))) ; midpoint of 2 points a double add 2 pts then multiply by 0.5(setq mp (mapcar '/ (mapcar '+ p1 p3) '(2.0 2.0))) ; midpoint of 2 points a double add 2 pts then divide by 2(setq pt3 (mapcar '+ pt3 (list X Y 0))) ; adds x and y to a point value can be X or Y or Z`
This seems to work for dim ang and pline, it uses mid pt of legs

Code: [Select]
`(command "dim" "ang" (ssget pt1)(ssget pt2) pt3 "" "" "exit")`
« Last Edit: August 10, 2022, 10:32:29 PM by BIGAL »