Hi I am typing up an autolisp code that will create the shape of a 3d bolt, my code is as follows:
; Meghan Hendricks
; BOLT3D.LSP
;
(defun c:bolt3d ()
(setq scmde (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq sblip (getvar "blipmode"))
(setvar "blipmode" 1)
(setq sosmd (getvar "osmode"))
(setvar "osmode" 0)
(setq 3dosmd (getvar "3dosmode"))
(setvar "3dosmode" 0)
(setq dyucs (getvar "ucsdetect"))
(setvar "ucsdetect" 0)
(setq A "y")
(While (= A "y")
(setq D1 (getreal "\nInput Diameter of bolt head: "))
(setq L1 (getreal "\nInput Height of bolt head: "))
(setq L2 (getreal "\nInput Overall length of the shank: "))
(setq L3 (getreal "\nInput Length of the threaded portion of the shank: "))
(setq D2 (getreal "\nInput Diameter of the shank: "))
(setq pt1 (getpoint "\nEnter location of center of bolt head: "))
(setq pt2 (list (car pt1) (cadr pt1) L1))
(setq R1 (/ (/ D1 2) (cos (/ pi 6))))
;(setq R2 (/ D2 2))
(setq pt3 (list (+ (car pt1) R1) (cadr pt1)))
(setq pt4 (list (car pt1) (cadr pt1) (- (- L2 L3))))
(command "cylinder" pt2 pt3 (- L1))
(setq x (- R1 (/ (* D1 0.95) 2)))
(setq y (/ (* (sin (/ pi 6)) x) (cos (/ pi 6))))
(command "chamfer" pt3 "" x y pt3 "")
(setq e1 (entlast))
(command "POLYGON" 6 pt1 "I" R1)
(command "extrude" "l" "" L1)
(command "intersect" e1 "l" "")
(setq e2 (entlast))
if (> L2 L3) (progn
(command "cylinder" pt1 D2 (- (- L2 L3));
(Command "union" e2 "l" "")
))
(set e3 (entlast))
(command "cylinder" pt4 (* D2 0.8) (- L3));
(command "union" e3 "l" "")
(setq e4 (entlast))
(setq pt5 (list (car (+ pt1 (/ D2 2))) (cadr pt2) - L2));
(setq pt6 (list (car (+ pt1 (/ D2 2))) (cadr pt1) (+ (* D2 0.1) - L2)));
(setq pt7 (list (car (+ pt1 (/ D2 2))) (cadr pt1) (+ (* D2 0.2) - L2)));
(command "3dpoly" pt5 pt6 pt7 pt5)
(command "revolve" "l" "" pt1 pt2 "")
(setq e5 (entlast))
(setq n (- fix(/ L3 (* 0.2 D2)) 1))
(while (<= i n)
(command "copy" e5 "" (list 0 0 0) (list 0 0 (* i 0.2 D2)))
(command "union" "l" e4 "")
(setq e4 (entlast))
(setq i (+ i 1))
)
(command "union" e4 e5 "")
(Setq A (getstring "/nDo you want to create another bolt (y or n)")); get string does not expect a # value
)
(command "ucs" "w")
(command "vpoint" (list 1 -1 1))
(command "hide")
(setvar "blipmode" sblip)
(setvar "cmdecho" scmde)
(setvar "osmode" snp)
(setvar "3dosmode" 3dosmd)
(setvar "ucsdetect" dyucs)
)
I run this and the program gets part way through (around where the distance L2 - L3 is used) and then I get the error "error: bad argument type: symbolp nil"
any suggestions?
Solved! Go to Solution.
Solved by john.uhden. Go to Solution.
I believer you're getting the error from this line. Take another look:
if (> L2 L3) (progn
(command "cylinder" pt1 D2 (- (- L2 L3));
(Command "union" e2 "l" "")
))
(set e3 (entlast))
(command "cylinder" pt4 (* D2 0.8) (- L3));
(command "union" e3 "l" "")
Thank you!
I fixed that but now I am getting the error "error: bad argument type: numberp: (23.8036 5.1828 0.0)"
Any suggestions
That is here
(setq pt5 (list (car (+ pt1 (/ D2 2))) (cadr pt2) - L2)); (setq pt6 (list (car (+ pt1 (/ D2 2))) (cadr pt1) (+ (* D2 0.1) - L2))); (setq pt7 (list (car (+ pt1 (/ D2 2))) (cadr pt1) (+ (* D2 0.2) - L2)));
Pt1 is a list and you are trying to use it as a number. Try retrieving the correct element from the list as (car pt1) or (cadr pt1), you know better which number you need; and then call the "+" operator
@Anonymous wrote:
Hi I am typing up an autolisp code that will create the shape of a 3d bolt, my code is as follows:
; Meghan Hendricks
; BOLT3D.LSP
;
(defun c:bolt3d ()
(setq scmde (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq sblip (getvar "blipmode"))
(setvar "blipmode" 1)
(setq sosmd (getvar "osmode"))
(setvar "osmode" 0)
(setq 3dosmd (getvar "3dosmode"))
(setvar "3dosmode" 0)
(setq dyucs (getvar "ucsdetect"))
(setvar "ucsdetect" 0)(setq A "y")
(While (= A "y")
(setq D1 (getreal "\nInput Diameter of bolt head: "))
(setq L1 (getreal "\nInput Height of bolt head: "))
(setq L2 (getreal "\nInput Overall length of the shank: "))
(setq L3 (getreal "\nInput Length of the threaded portion of the shank: "))
(setq D2 (getreal "\nInput Diameter of the shank: "))
(setq pt1 (getpoint "\nEnter location of center of bolt head: "))(setq pt2 (list (car pt1) (cadr pt1) L1))
(setq R1 (/ (/ D1 2) (cos (/ pi 6))))
;(setq R2 (/ D2 2))
(setq pt3 (list (+ (car pt1) R1) (cadr pt1)))
(setq pt4 (list (car pt1) (cadr pt1) (- (- L2 L3))))
(command "cylinder" pt2 pt3 (- L1))(setq x (- R1 (/ (* D1 0.95) 2)))
(setq y (/ (* (sin (/ pi 6)) x) (cos (/ pi 6))))
(command "chamfer" pt3 "" x y pt3 "")
(setq e1 (entlast))
(command "POLYGON" 6 pt1 "I" R1)
(command "extrude" "l" "" L1)
(command "intersect" e1 "l" "")
(setq e2 (entlast))
if (> L2 L3) (progn ; no parenthesis
(command "cylinder" pt1 D2 (- (- L2 L3));
(Command "union" e2 "l" "")
))
(set e3 (entlast))
(command "cylinder" pt4 (* D2 0.8) (- L3));
(command "union" e3 "l" "")
(setq e4 (entlast))
(setq pt5 (list (car (+ pt1 (/ D2 2))) (cadr pt2) - L2));
(setq pt6 (list (car (+ pt1 (/ D2 2))) (cadr pt1) (+ (* D2 0.1) - L2)));
(setq pt7 (list (car (+ pt1 (/ D2 2))) (cadr pt1) (+ (* D2 0.2) - L2)));
(command "3dpoly" pt5 pt6 pt7 pt5) ;last ""??
(command "revolve" "l" "" pt1 pt2 "")
(setq e5 (entlast))(setq n (- fix(/ L3 (* 0.2 D2)) 1))
; where is i??
(while (<= i n)
(command "copy" e5 "" (list 0 0 0) (list 0 0 (* i 0.2 D2)))
(command "union" "l" e4 "")
(setq e4 (entlast))
(setq i (+ i 1))
)(command "union" e4 e5 "")
(Setq A (getstring "/nDo you want to create another bolt (y or n)")); get string does not expect a # value
)
(command "ucs" "w")
(command "vpoint" (list 1 -1 1))
(command "hide")(setvar "blipmode" sblip)
(setvar "cmdecho" scmde)
(setvar "osmode" snp)
(setvar "3dosmode" 3dosmd)
(setvar "ucsdetect" dyucs)
)
I run this and the program gets part way through (around where the distance L2 - L3 is used) and then I get the error "error: bad argument type: symbolp nil"
any suggestions?
Yah, I noticed that too.. Are you using the debugger? Try setting a break point in the Vlide editor and stepping through the code to find where the error is happening.
Thank you that helped a lot, I forgot that the car is only for the use of points.
DO you happen to know what this error means "error: bad argument type: numberp: #<SUBR @000001dcc6aefb88 ->"
Maybe not specific to my code but what I should be looking for
It is expecting a number but you're giving it a sub.. like:
(+ 20 princ)
Look for a > with improper parenthesis.
@Anonymous wrote:
"DO you happen to know what this error means "error: bad argument type: numberp: #<SUBR @000001dcc6aefb88 ->" "
That is most likely caused by applying an arithmetric function to another function, such as:
(setq b (+ setq a))
John F. Uhden
@Anonymous wrote:
Thank you that helped a lot, I forgot that the car is only for the use of points.
@Anonymous you happen to know what this error means "error: bad argument type: numberp: #<SUBR @000001dcc6aefb88 ->"
Maybe not specific to my code but what I should be looking for
Failed the NumberProof test. See HERE
I tried adjusting the parenthesis around for the if statements and the while loop and I still keep getting the same errors
@Anonymous wrote:
I tried adjusting the parenthesis around for the if statements and the while loop and I still keep getting the same errors
post your revised code
(defun c:bolt3d ()
(setq scmde (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq sblip (getvar "blipmode"))
(setvar "blipmode" 1)
(setq sosmd (getvar "osmode"))
(setvar "osmode" 0)
(setq 3dosmd (getvar "3dosmode"))
(setvar "3dosmode" 0)
(setq dyucs (getvar "ucsdetect"))
(setvar "ucsdetect" 0)
(setq A "y")
(While (= A "y")
(setq D1 (getreal "\nInput Diameter of bolt head: "))
(setq L1 (getreal "\nInput Height of bolt head: "))
(setq L2 (getreal "\nInput Overall length of the shank: "))
(setq L3 (getreal "\nInput Length of the threaded portion of the shank: "))
(setq D2 (getreal "\nInput Diameter of the shank: "))
(setq pt1 (getpoint "\nEnter location of center of bolt head: "))
(setq pt2 (list (car pt1) (cadr pt1) L1))
(setq R1 (/ (/ D1 2) (cos (/ pi 6))))
;(setq R2 (/ D2 2))
(setq pt3 (list (+ (car pt1) R1) (cadr pt1)))
(setq pt4 (list (car pt1) (cadr pt1) (- (- L2 L3))))
(command "cylinder" pt2 pt3 (- L1))
(setq x (- R1 (/ (* D1 0.95) 2)))
(setq y (/ (* (sin (/ pi 6)) x) (cos (/ pi 6))))
(command "chamfer" pt3 "" x y pt3 "")
(setq e1 (entlast))
(command "POLYGON" 6 pt1 "I" R1)
(command "extrude" "l" "" L1)
(command "intersect" e1 "l" "")
(setq e2 (entlast))
if (> L2 L3) (progn
(command "cylinder" pt1 D2 (- (- L2 L3));
(Command "union" e2 "l" "")
))
(setq e3 (entlast))
(command "cylinder" pt4 (* D2 0.8) (- L3));
(command "union" e3 "l" "")
(setq e4 (entlast))
(setq pt5 (list (+ (car pt1) (/ D2 2)) (cadr pt1) - L2));
(setq pt6 (list (+ (car pt1) (/ D2 2)) (cadr pt1) (+ - L2 (* D2 0.1))));
(setq pt7 (list (+ (car pt1) (/ D2 2)) (cadr pt1) (+ - L2(* D2 0.2))));
(command "3dpoly" pt5 pt6 pt7 pt5)
(command "revolve" "l" "" pt1 pt2 "")
(setq e5 (entlast))
(setq n (- fix (/ L3 (* 0.2 D2)) 1))
(while (<= i n)
(command "copy" e5 "" (list 0 0 0) (list 0 0 (* i 0.2 D2)))
(command "union" "l" e4 "")
(setq e4 (entlast))
(setq i (+ i 1))
)
(command "union" e4 e5 "")
(Setq A (getstring "/nDo you want to create another bolt (y or n)")); get string does not expect a # value
)
(command "ucs" "w")
(command "vpoint" (list 1 -1 1))
(command "hide")
(setvar "blipmode" sblip)
(setvar "cmdecho" scmde)
(setvar "osmode" snp)
(setvar "3dosmode" 3dosmd)
(setvar "ucsdetect" dyucs)
)
What is this
(+ - L2 (* D2 0.1))))
if you want the negative of L2 then it should be (- L2). "+" operator needs a number and you are passing it a SUBR; operator "-"
Thank you that helped!
I changed my code to now what is shown in bold:
(setq pt5 (list (+ (car pt1) (/ D2 2)) (cadr pt1) - L2));
(setq pt6 (list (+ (car pt1) (/ D2 2)) (cadr pt1) - (- L2 (* D2 0.1))));
(setq pt7 (list (+ (car pt1) (/ D2 2)) (cadr pt1) - (- L2 (* D2 0.2))));
(command "3dpoly" pt5 pt6 pt7 pt5)
(command "revolve" "l" "" pt1 pt2 "")
(setq e5 (entlast))
(setq n (- (fix (/ L3 (* 0.2 D2)) 1)))
now I am getting "error: too many arguments"
@Anonymous wrote:
....
(setq pt5 (list (+ (car pt1) (/ D2 2)) (cadr pt1) - L2));
(setq pt6 (list (+ (car pt1) (/ D2 2)) (cadr pt1) - (- L2 (* D2 0.1))));
....(setq n (- (fix (/ L3 (* 0.2 D2)) 1)))
....
Breaking down to see the component parts:
(setq pt5
(list
(+ (car pt1) (/ D2 2)) ; the X coordinate [look OK]
(cadr pt1) ; the Y coordinate [looks OK]
- L2 ; the Z coordinate -- not right -- needs parentheses around it (- L2)
); list
); setq
(setq pt6
(list
(+ (car pt1) (/ D2 2)) ; the X coordinate [look OK]
(cadr pt1) ; the Y coordinate [looks OK]
- (- L2 (* D2 0.1)) ; the Z coordinate -- not right -- try removing the unaffiliated - sign
); list
); setq
and similarly for pt7.
(setq n
(-
(fix (/ L3 (* 0.2 D2)) ; the right parenthesis after 1 below should be at the end of this line instead
1)
); -
); setq
[There's a (1-) function that you can use to reduce something by 1, instead of (- whatever 1).]
Well, I don't like the looks of this too much...
(setq pt5 (list (+ (car pt1) (/ D2 2)) (cadr pt1) - L2))
which returns a list of 4 items, the 3rd of which is '- (the function for subtraction), as in...
Command: (nth 2 pt5) #<SUBR @052fd598 ->
and
Command: (eval -)
#<SUBR @052fd598 ->
John F. Uhden
Can't find what you're looking for? Ask the community or share your knowledge.