Autolisp Notes
Autolisp Notes
Autolisp Notes
"string" - any valid string or variable representing a string. If you use a variable name omit the quotes. startPoint - an integer or variable representing an integer that corresponds to the position in the string to start the substring at. The first character is character 1. numberOfCharacters - an integer or variable representing an integer that corresponds to the length of string to return. Length being the number of characters. Returns a partial string starting at the character represented by startPoint and ending at the character represented by the numberOfCharacters or the end of the string. Whichever comes first..
(substr "Jeff Sanders" 1 6) would return "Jeff S" (substr "Jeff Sanders" 6 3) would return "San" (substr "Jeff Sanders" 64 456) would return "" (substr "Jeff Sanders" -4 3) would return "Error: Bad argument" [No negative character positions] (substr "Jeff Sanders" 4 -3) would return "Error: Bad argument" [No negative string lengths]
(substr "Jeff" 6 4) would return "" (substr "" 9 3) would return "" (substr "Jeff Sanders" 9) would return "ders" If you omit the last parameter, the remainder of the string from the startPoint will be returned..
Returns a string that is either upper or lower case depending on the flag setting. (strcase "Jeff" T) returns "jeff" (strcase "Jeff" nil) returns "JEFF" (strcase "123a" nil) returns "123A" (strcase "" nil) returns ""
(strcase 123 T) returns "Error: Bad Argument Type" (strcase 1.0 nil) returns "Error: Bad Argument Type" (strcase "Jeff") returns "JEFF" Omitting the flag is the same as having the flag set to nil or false.
(strlen (list 1.0 2.0)) returns "Error: Bad Argument Type [(list 1.0 2.0) is a list, not a string]
strcat - This function adds multiple strings together to form one string.
Syntax : (strcat "string1" "string2" "string3" ....ect. ) "string1" - any valid string or variable representing a string. If you use a variable omit the quotes. Returns a string that includes all of the strings in the list. (strcat "Jeff" "Sanders") returns "JeffSanders" (strcat "Jeff " "Sanders") returns "Jeff Sanders" (strcat "" "56" "Jeff" "abcdefg") returns "56Jeffabcdefg" (strcat "" 5 "Jeff") returns "Error: Bad argument type". [5 is an integer, not a string] (strcat "" 3.1 "Jeff") returns "Error: Bad argument type". [3.1 is a real number, not a string] This function can only accept strings or a variable representing a string as it's arguments. (parameters) End of String Functions
Example Program 1: (defun C:myProg() (setq str1 "Jeffery") (setq str2 "P") (setq str4(substr str1 1 4)) (princ str4) ;sets str4 to 1st 4 characters of str1 ;Prints "Jeff" to the command line.
(setq str4(strcase str4)) (princ str4) (setq int1(strlen str4)) (princ int1) (setq str5 (strcat str4 " " str2)) (princ str5) (princ) ) Command: (load "myProg")<enter> Command: myProg<enter> Command: JeffJEFF4JEFF P
;Sets str4 to uppercase ;Prints "JEFF" to the command line. ;Sets int1 to 4 (length of string) ;Prints 4 to the command line. ;sets str5 to "JEFF P" ;Prints "JEFF P" to the command line. ;clean exit (supresses echo) ;close the program
Program Example 2:
(defun C:NameMix() (setq strName(getstring T "\n Enter your name: ")) (setq keepGoing 1) (while (<= keepGoing (strlen strName)) (setq char1(substr strName 1 keepGoing))
(setq char1 (strcase char1)) (setq strName2(strcat char1 (substr strName (+ keepGoing 1)))) (setq keepGoing(+ keepGoing 1)) (princ (strcat "\n " strName2)) ) (princ "\n Program Complete.") (princ) )
Command: (load "namemix")<enter> Command: namemix<enter> Command: Enter Your Name: jeff<enter> Command: Jeff Command: JEff Command: JEFf Command: JEFF Command: Program Complete.
Math Functions + / *
1+ 1- cos atan sin sqrt expt Example Program
- Addition. Syntax : (+ number number) number - any valid number.[integer or real number] Returns an integer or a real number. (+ 3 4) returns 7 (+ 3.5 4.2) returns 7.7 (+ 3 4 5) returns 12 (+ 1.2 1.2 1.2) returns 3.6 (+ "3" "4") returns "Error: Bad Argument Type" ["3" and "4" are strings, not numbers]
number - any valid number.[integer or real number] Returns an integer or a real number. (- 4 3) returns 1 (- 4.5 4.2) returns 0.3 (- 9 5 2) returns 2 (- 40.5 10.0 5.2) returns 25.3 (- "3" "4") returns "Error: Bad Argument Type" ["3" and "4" are strings, not numbers]
- Division. Syntax : (/ number number) number - any valid number.[integer or real number] Returns an integer or a real number. (/ 9 3) returns 3 (/ 5 2) returns 2 [if both numbers are integers then it returns an integer]
(/ 5 2.0) returns 2.5 [if either number is a real number then it returns a real number] (/ 5.0 2) returns 2.5 [if either number is a real number then it returns a real number]
(/ 12 2 3) returns 2 [12/2 = 6 then 6/3 = 2 ] (/ "3" "4") returns "Error: Bad Argument Type" ["3" and "4" are strings, not numbers]
- Multiplication. Syntax : (* number number) number - any valid number.[integer or real number] Returns an integer or a real number. (* 9 3) returns 12 (* 5 2) returns 10 [if both numbers are integers then it returns an integer]
(* 5 2.0) returns 10.0 [if either number is a real number then it returns a real number] (* 5.0 2) returns 10.0 [if either number is a real number then it returns a real number] (* 2 3 4) returns 24 [2*3 = 6 then 6*4 = 24 ] (* "3" "4") returns "Error: Bad Argument Type" ["3" and "4" are strings, not numbers]
Returns an integer or a real number. (1+ 3) returns 4 (1+ 5) returns 6 [if the number is an integer then it returns an integer]
(1+ 5.0) returns 6.0 [if number is a real number then it returns a real number] (1+ "3") returns "Error: Bad Argument Type" ["3" is a string, not a number] (1+ 3 4) returns "Error: Too Many Arguments" [Only accepts one number as argument]
(1- 5.0) returns 4.0 [if number is a real number then it returns a real number] (1- "3") returns "Error: Bad Argument Type" ["3" is a string, not a number] (1- 3 4) returns "Error: Too Many Arguments" [Only accepts one number as argument]
(Note: Radians are AutoCads angular units. A circle = 2*pi Syntax : (cos number)
or
180 degrees = pi )
number - any valid number.[integer or real number] that represents an angle expressed in radians. Returns a real number. (cos pi) returns -1.0 (cos (+ pi pi)) returns 1.0 (cos 5.0) returns 0.283662 (cos "3") returns "Error: Bad Argument Type" ["3" is a string, not a number] (cos 3 4) returns "Error: Too Many Arguments" [Only accepts one number as argument]
(atan -1) returns -0.785398 (atan 5.0) returns 1.3734 (atan "3") returns "Error: Bad Argument Type" ["3" is a string, not a number] (atan 3 4) returns 0.643501 [Returns the arctangent of 3 divided by 4] (Note: The range of angles returned is -pi/2 to +pi/2 radians. )
(expt 5 2) returns 25 (expt "3" 2) returns "Error: Bad Argument Type" ["3" is a string, not a number]
Example Program 1: (defun C:myProg() (setq intAge(getint "\n Enter your Age: ")) (setq intDays(* intAge 365)) (setq intWeeks(/ intDays 7)) (princ (strcat "\n You are " (itoa intDays) " Days old!")) (princ (strcat "\n You are " (itoa intWeeks) " Weeks old!")) (princ) ) Execution: Command: (load "myProg")<enter> Command: myProg<enter> Command: Enter your Age: 39<enter>
Command: You are 14235 Days old! Command: You are 2033 Weeks old!
Example Program 2: (defun C:Triangle() (setq pt1(getpoint "\n Pick First Point: ")) (setq pt2(getpoint "\n Pick Last Point: ")) (setq x1(car pt1)) (setq x2(car pt2)) (setq y1(cadr pt1)) (setq y2(cadr pt2)) ;x-coord of point one ;x-coord of point two ;y-coord of point one ;y-coord of point two
(setq xdis(- x2 x1)) ;distance in x direction between points (setq ydis(- y2 y1)) ;distance in y direction between points (setq slpdis(sqrt(+ (expt xdis 2.0)(expt ydis 2.0)))) ;A sq + B sq = C sq (princ (strcat "\n Distance = " (rtos slpdis 4 4))) (princ) )
Execution:
Command: (load "Triangle")<enter> Command: Triangle<enter> Command: Pick First Point:<pick> Command: Pick Last Point:<pick> Command: Distance = 3'-4 1/2" Command:
Number Functions
abs atof atoi fix float itoa Example Program
(abs -345) returns 345 (abs -345.5) returns 345.5 (abs "345JEFF") returns "Error: Bad Argument Type" ["345JEFF" is a string, not a number]
(atoi 5.6) returns "Error: Bad argument type". [5.6 is a real number, not a string] This function looks at the first character, then the next, then the next, ect. until it finds a character that part of an integer. cannot be
(atof "5'3-1/2"") returns 63.5 (atof "3-1/2"") returns 3.5 (atof "") returns 0.0 (atof "345JEFF") returns 345.0 (atof 345) returns "Error: Bad Argument Type" [345 is an integer, not a string] (atof 3.4) returns "Error: Bad Argument Type" [345 is a real number, not a string] (atof (list 3 4)) returns "Error: Bad Argument Type" [(list 3 4) is a list, not a string] This function looks at the first character, then the next, then the next, ect. until it finds a character that part of an real number. cannot be
This function takes the whole number part of a decimal number and returns it as an integer.
float - This function takes a number (integer or real) and converts it to a real number.
Syntax : (float integer) (float real) Integer - Any valid integer. real - Any valid real number. (float 5) returns 5.0 (float 345) returns 345.0 (float 3.5) returns 3.5 [No effect, but no error] (float "3") returns "Error: Bad Argument Type" ["3" is a string, not a number]
(float "3.5") returns "Error: Bad Argument Type" ["3.5" is a string, not a number] (float "abc") returns "Error: Bad Argument Type" ["abc" is a string, not a number]
Example Program 1: (defun C:myProg() (setq intAge(getint "\n Enter your Age: "))
(setq intDays(* intAge 365)) (princ (strcat "\n You are " (itoa intDays) " Days old!")) (princ) ) Execution: Command: (load "myProg")<enter> Command: myProg<enter> Command: Enter your Age: 39<enter>
List Functions :
car cdr cadr caddr caar cddr foreach list cons nth
Example Programs
You are about to unravel the mystery behind the car of a cdr. Better sit down.
car - This function returns the first item of a list. The item can be a list as shown in example 3 below.
Syntax : (car list) list - Any valid list.
(car (1 2 3)) returns 1 (car ("ab" "cde" "Jeff")) returns "ab" (car ((1 2 3) (4 5 6))) returns (1 2 3) (car 1) returns "Error: Bad Argument Type" [1 is an integer, not a list]
(car "Jeff") returns "Error: Bad Argument Type" ["Jeff" is a string, not a list] (car (1 (2 3))) returns 1 (car ((1 2) 3)) returns (1 2) This function is mainly used to get the x coordinate of a point. [ (car (x y z)) returns x ]
cdr - This function returns a list that includes everything but the first item in a list. The item can be a list as shown in
example 3 below. Syntax : (cdr list) list - Any valid list. (cdr (1 2 3)) returns ( 2 3) (cdr ("ab" "cde" "Jeff")) returns ("cde" "Jeff") (cdr ((1 2 3) (4 5 6))) returns (4 5 6) since (4 5 6) is the second item in the list. (cdr 1) returns "Error: Bad Argument Type" [1 is an integer, not a list]
(cdr "Jeff") returns "Error: Bad Argument Type" ["Jeff" is a string, not a list]
(cdr (1 (2 3))) returns (2 3) (cdr ((1 2) 3)) returns 3 Mystery HINT: (car (cdr ( 1 (2 3) ) ) ) returns 2 [So, that's what a car of a cdr is] if the cdr of (1 (2 3)) returns (2 3) and the car of (2 3) returns 2 then the mystery is solved. The car of a cdr is the first item in the second item in the list.
cadr - This function returns the second item in a list. The item can be a list as shown in example 3 below.
Syntax : (cadr list) list - Any valid list. (cadr (1 2 3)) returns 2 (cadr ("ab" "cde" "Jeff")) returns "cde" (cadr ((1 2 3) (4 5 6) (7 8 9))) returns (4 5 6) (cadr 1) returns "Error: Bad Argument Type" [1 is an integer, not a list]
(cadr "Jeff") returns "Error: Bad Argument Type" ["Jeff" is a string, not a list] (cadr (1 (2 3))) returns (2 3) (cadr ((1 2) 3)) returns 3 (cadr (1)) returns nil [There isn't a second item]
This function is mainly used to get the y coordinate of a point. [ (cadr (x y z)) returns y ]
caddr - This function returns the third item in a list. The item can be a list as shown in example 3 below.
Syntax : (caddr list) list - Any valid list. (caddr (1 2 3)) returns 3 (caddr ("ab" "cde" "Jeff")) returns "Jeff" (caddr ((1 2 3) (4 5 6) (7 8 9))) returns (7 8 9) (caddr 1) returns "Error: Bad Argument Type" [1 is an integer, not a list]
(caddr "Jeff") returns "Error: Bad Argument Type" ["Jeff" is a string, not a list] (caddr (1 (2 3))) returns nil [There isn't a third item] (caddr ((1 2) 3 (5 6) 7)) returns (5 6) (caddr (1)) returns nil [There isn't a third item] This function is mainly used to get the z coordinate of a point. [ (caddr (x y z)) returns z ]
caar - This function returns the first item of the first item in a list. The item can be a list as shown in example 3
Syntax : (caar list) list - Any valid list. (caar (1 2 3)) returns "Error: Bad Argument Type" [The first item in the list is not a list]
below.
(caar ((1 2 3)(4 5 6)) returns 1 (caar (("ab" "cde") ("Jeff")) returns "ab" (caar (("Jeff" 1 2 3)("x" "y" "z")(4 5 6))) returns "Jeff" (caar 1) returns "Error: Bad Argument Type" [1 is an integer, not a list]
(caar "Jeff") returns "Error: Bad Argument Type" ["Jeff" is a string, not a list] (caar (1 (2 3))) returns "Error: Bad Argument Type" [The first item in the list is not a list] (caar ((1 2) 3)) returns 1
cddr - This function returns a list that includes everything after the second item in a list.
Syntax : (cddr list) list - Any valid list. (cddr (1 2 3)) returns (3) (cddr ("ab" "cde" "Jeff" "Sanders")) returns ("Jeff" "Sanders") (cddr ((1 2 3) (4 5 6) (7 8 9)(10 11 12))) returns ((7 8 9)(10 11 12)) (cddr 1) returns "Error: Bad Argument Type" [1 is an integer, not a list]
(cddr "Jeff") returns "Error: Bad Argument Type" ["Jeff" is a string, not a list] (cddr (1 (2 3))) returns nil [There isn't a third item] (cddr ((1 2) 3 (5 6) 7)) returns ((5 6) 7)
foreach - This function steps through each item in the list and returns the last value.
Syntax : (foreach varName list yourFunctions) varName - Any valid variable name that you make up. list - Any valid list. yourFunctions - Any valid autolisp functions. (foreach a (list 1 2 3)(princ a)) prints 123 to the screen and returns 3 1) (princ 2) (princ 3) except that it only returns the last value.] (foreach a (list 1 2 3)(princ (+ a 5))) prints 678 to the screen and returns 8 as (princ (+ 1 5)) (princ (+ 2 5)) (princ (+ 3 5)) except that it only returns the last value.] [same as (princ
[same
(list 1 2 3) returns (1 2 3) (list "ab" "cde" "Jeff" "Sanders") returns ("ab" "cde" "Jeff" "Sanders")
(list (list 1 2 3) (list 4 5 6)) returns ((1 2 3) (4 5 6)) (list 1) returns (1) (list "Jeff") returns ("Jeff") (list 1 (list 2 3)) returns (1 (2 3)) (list (list 1 2) 3 (list 5 6) 7) returns ( (1 2) 3 (5 6) 7)
cons - This function takes an item and a list, and returns the addition of that item to the beginning of the list. The first item can be an
atom or a list. Syntax : (cons Item list) Item - Any valid item including a list. list - Any valid list. ;thanks tim!
(cons 1 2 3) returns "Error: Too Many Arguments" [cons requires an item and a list] (cons "ab" (list "cde" "Jeff" "Sanders")) returns ("ab" "cde" "Jeff" "Sanders") (cons (list 1 2 3) (list 4 5 6)) returns ((1 2 3) 4 5 6) (cons 1) returns "Error: Too Few Arguments" [cons requires an item and a list] [cons requires an item and a list]
(cons 1 (list 2 3)) returns (1 2 3) [notice the difference here from the list function above] (cons "Jeff" (list 1 2 3 5 6 7)) returns ( "Jeff" 1 2 3 5 6 7 )
nth - This function returns the Nth item in a list. The first item in a list is item zero.
Syntax : (nth integer list) integer - Any valid integer. list - Any valid list.
(nth 2 1 2 3) returns "Error: Bad Argument Type" [nth requires an integer and a list] (nth 2 (list "cde" "Jeff" "Sanders")) returns "Sanders" (nth 0 (list 1 2 3)) returns 1 (nth 1 (list 1 2 3)) returns 2 (nth 2 (list 1 2 3)) returns 3 (nth 1 (list "a" (list "b" "c") "d")) returns ("b" "c") (nth 4 (list 1 2 3 5 6 7)) returns 6
Example Program 1: (defun C:myProg() (setq pt1(getpoint "\n First Corner: ")) (setq pt2(getcorner pt1 "\n Last Corner: ")) (setq x1(car pt1)) (setq x2(car pt2)) (setq y1(cadr pt1)) (setq y2(cadr pt2)) (setq hor1(- x2 x1)) (setq ver1(- y2 y1)) [define program] [get first point] [get other point on a square] [get x coordinate of pt1] [get x coordinate of pt2] [get y coordinate of pt2] [get y coordinate of pt2] [get horizontal distance] [get vertical distance]
(princ "\n Horizontal Distance = ")(princ hor1) [print to screen] (princ "\n Vertical Distance = ")(princ ver1) (princ) ) [print to screen] [supress echo..clean exit] [close program]
Command: First Corner: <pick a point> Command: Last Corner: <pick a point> Command: Horizontal Distance = 23.5 Command: Vertical Distance = 11.5
Example Program 2: (defun C:AddText() (setq myList(list "e" "b" "c" "m" "at")) (foreach myVar myList (princ (strcat myVar (nth 4 myList))) ) (princ) ) Execution: Command: (load "AddText")<enter> Command: AddText<enter> Command: eat [define program] [make a list of 6 letters] [start the foreach loop] [define a valid function] [close the foreach statement] [supress echo..clean exit] [close program]
Command: bat Command: cat Command: mat Command: atat End of List Functions
((-1 . <Entity name: 3b40cf0>) (0 . "CIRCLE") (5 . "146") (100 . "AcDbEntity") (67 . 0) (8 . "HOL") (100 . "AcDbCircle") (10 163.135 367.479 0.0) (40 . 2.56277) (210 0.0 0.0 1.0)) Where: Group code -1 is the name of the entity. Group code 0 is the type of entity. Group code 8 is the layer name. Group code 10 is the center of the circle. Group code 40 is the radius of the circle.
How do you list the codes for an entity? Type this at the command line, press enter, and select an entity. (entget(car(entsel))) Entsel selects the entity, car gets the entity name from entsel, and entget returns the Group Codes of the entity.
What are the numbers in the group code for? They aide in extracting data from the group codes. Take for instance this code: (setq entList(entget (car (entsel)))) If I selected a circle, this code would set entList to something like this:
((-1 . <Entity name: 3b40cf0>) (0 . "CIRCLE") (5 . "146") (100 . "AcDbEntity") (67 . 0) (8 . "HOL") (100 . "AcDbCircle") (10 163.135 367.479 0.0) (40 . 2.56277) (210 0.0 0.0 1.0)) If I wanted to extract data from this group code list I would simply type: (assoc 40 entList) ;would return 2.56277 (assoc 0 entList) ;would return "CIRCLE" (assoc 10 entList) ;would return (163.135 367.479 0.0) (assoc 8 entList) ;would return "HOL" An associated list can make extraction a very easy thing to accomplish.
Selecting Entities
Functions - entsel ssget Example Programs
entsel - This function prompts for the user to pick one entity.
Syntax : (entsel) Returns the entity's name and the point selected in a list. Example: (<Entity name: 3b40a08> (230.666 285.862 0.0))
(car(entsel)) returns the entity name if entsel does not return nil..
(cadr(entsel)) returns the point selected if entsel does not return nil.. Note: Selecting an area in the drawing where there are no entities would return nil. You will get an error if you try to get the car or cadr of nil as shown above. The best thing to do is to save the return value of the entsel function, then check to see if it is a valid selection. Example: (setq myEnt(entsel)) (if myEnt (progn ;do some stuff ) (alert "Nothing Selected.") ) ; save the return value of the entsel function ; if the value of myEnt is not nil then do some stuff ; use the progn statement here for multiple statements ; put your code here ; close the progn statement here ; alert the user ; close the if statement
Syntax : (ssget mode) ;prompts the user for a selection set and sets mode to "W", "C", "L", and "P", corresponding to the Window, Crossing, Last, and Previous selection methods. Another optional mode value is "X", which selects the entire database. There are other modes, but this list contains the modes that will be used most often.
Syntax : (ssget "W" ) Syntax : (ssget "C" ) Syntax : (ssget "L" ) Syntax : (ssget "P" ) Syntax : (ssget "X" )
;prompts the user for a selection set using the Window mode. ;prompts the user for a selection set using the Crossing mode. ;Selects the last entity selected. ;Selects the previously selected entities. ;Selects all entities in the drawing.
Syntax : (ssget filter_List) or (ssget mode filter_List) filter_List - an association list containing valid filters for entities corresponding to the Entity DXF Group What did I just say? Entity DXF Group Codes? What the heck is that? Click here to find out. wanted
Codes.
You can filter out enitites that do no match your criteria using the filter_List. If you only entities that were on layer "STR" then you could add a filter list that looks like this: (setq myFilter(list (cons 8 "STR"))) ;returns ((8 . "STR")) (ssget "X" myFilter) or (setq myFilter(list (cons 0 "LINE")(cons 8 "STR"))) ;returns ((0 . "LINE")(8 . "STR")) (ssget "X" myFilter) ;returns a selection set containing only line entities on layer "STR" ;returns a selection set containing only entities on layer "STR"
Example Program 1: (defun C:myProg() (if (setq myEnt(entsel)) (progn ;start the if statement ;going to have multiple statements ;store base point ;store displacement pt ;move entity
(setq pt1(getpoint "\n Base Point: ")) (setq pt2(getpoint "\n Displacement Point: ")) (command "move" (car myEnt) "" pt1 pt2) ) (alert "Please select an entity!") ) (princ) ) Execution: Command: (load "myProg")<enter> Command: myProg<enter>
;close the progn ;else alert the user of an error ;close the if statement ;clean exit (supresses echo) ;close the program
Command: Select Object: <pick> Command: Base Point: <pick> Command: Displacement Point: <pick> Command:
Example Program 2: (defun C:myProg2() (if (setq mySet(ssget "X" (list (cons 8 "STR")(cons 0 "CIRCLE")))) ;get set (progn ;going to have multiple statements ;store base point ;store displacement pt
(setq pt1(getpoint "\n Base Point: ")) (setq pt2(getpoint "\n Displacement Point: ")) (command "move" mySet "" pt1 pt2) )
(alert "No entites Match Criteria!") ;else alert the user of an error ) (princ) ) Execution: ;close the if statement ;clean exit (supresses echo) ;close the program
Command: (load "myProg2")<enter> Command: myProg2<enter> Command: Base Point: <pick> Command: Displacement Point: <pick> Command:
Conditional Statements:
if cond
Coming soon...
thisIsTrue (progn thenDoAllOfThis) (progn elseDoAllOfThis) ) thisIsTrue (progn thenDoAllOfThis) elseDoThis) thisIsTrue thenDoThis (progn elseDoAllOfThis) )
thisIsTrue - Any valid autolisp expression that evaluates to true or non nil. thenDoThis - Any valid autolisp expression.
elseDoThis - Any valid autolisp expression. thenDoAllOfThis - Any valid autolisp expressions. elseDoAllOfThis - Any valid autolisp expressions. progn - Simply means there will be more than one statement here.
(if T (princ 3)) (if T (princ 3)(princ 4)) (if nil (princ 3)(princ 4))
returns 3 returns 3 because T always evaluates to True returns 4 because nil always evaluates to False
(if (= nil T) (princ 3)(princ 4)) returns 4 because nil does not equal T (if (= 3 3) (princ 3) (princ 4)) (if (= 3 4) (princ 3) (princ 4)) returns 3 returns 4
) --------------------------------------------------------------------------------------------------(if (= 3 3) (progn (princ 3) (princ 5) ) (progn (princ 8) (princ 9) ) ) -------------------------------------------------------------------------------------------------(if (= 3 4) (progn (princ 3) (princ 5) program never gets inside here because 3 does not equal 4 program never gets inside here because 3 does not equal 4 program never gets inside here because 3 = 3 program never gets inside here because 3 = 3 returns 3 returns 5
cond - This function test conditions until one of them is true. At that point it exits the function.
Syntax : (cond (ifThisIsTrue thenDoThis) thenDoThis) thenDoThis)
(elseIfThisIsTrue
(elseIfthisIsTrue (progn thenDoAllOfThis) ) (elseIfthisIsTrue thenDoThis)) (elseIfthisIsTrue (progn thenDoAllOfThis) ) (elseIfthisIsTrue thenDoThis)) ) thisIsTrue - Any valid autolisp expression that evaluates to true or non nil. thenDoThis - Any valid autolisp expression. elseDoThis - Any valid autolisp expression. thenDoAllOfThis - Any valid autolisp expressions. elseDoAllOfThis - Any valid autolisp expressions. progn - Simply means there will be more than one statement here.
(cond ( (= 1 1) (princ "True") ) ( (= 1 2) (princ "True") ) ) prints TRUE and exits doesn't make it to this point returns True
--------------------------------------------------------------------------------------------------
(cond ( (= 1 0) (princ "True") ) ( (= 1 1) (princ "True") ) ( (= 1 2) (princ "True") ) ) skips because 1 does not equal 0 prints TRUE and exits doesn't make it to this point returns True
-------------------------------------------------------------------------------------------------(cond ( (= 4 3) (princ "True") ) ( (= 4 2) (princ "True") ) ( (= 4 1) (princ "True") ) ) skips because 4 does not equal 3 skips because 4 does not equal 2 skips because 4 does not equal 1 returns nil
-------------------------------------------------------------------------------------------------(cond ( (= 4 3) (princ "True") ) ( (= 4 2) (princ "True") ) ( (= 4 1) (princ "True") ) skips because 4 does not equal 3 skips because 4 does not equal 2 skips because 4 does not equal 1
( T (princ "Nothing") ) )
-------------------------------------------------------------------------------------------------(setq a (cond ( (= 4 3) (princ "True") ) ( (= 4 2) (princ "True") ) ( (= 4 1) (princ "True") ) ( T (princ "Nothing") ) ) ) End of Conditional Statements skips because 4 does not equal 3 skips because 4 does not equal 2 skips because 4 does not equal 1 prints "Nothing" because T = True returns "Nothing" sets variable [a] to "Nothing" set a variable
Loop Functions :
While Repeat Example Programs
While
Syntax : (while expression dothis) expression - Any valid autolisp expression that evaluates to true or non nil. dothis - Any valid autolisp expression or expressions Note: No PROGN necessary for multiple expressions like the IF statement. (while T (princ 1)) returns 1 and keeps returning 1 forever. Your locked into the loop. (while nil (princ 1)) Exits the loop. ---------------------------------------------------------(setq cntr 1) (while (< cntr 4) (princ cntr) (setq cntr(+ cntr 1)) ) ---------------------------------------------------------(setq eset(ssget)) (setq cntr 1) returns a selection set setup a counter setup a counter loop until cntr is not less than 4 print the cntr increment the counter returns 1 then 2 then 3 and then exits the loop
(while (< cntr (sslength eset)) (setq en(ssname eset cntr)) (setq enlist(entget en)) (princ (cdr(assoc 0 enlist))) (setq cntr(+ cntr 1)) )
loop through all entities in the selection set get the entity name of the nth item get the DXF group codes of the entity print the entity type to the command line increment the counter close the while loop
repeat - This function does exactly what you think it would do.
Syntax : (repeat integer) integer - Any number that is an integer. Note: No PROGN necessary for multiple expressions like the IF statement.
(repeat 20 (princ "A") ) prints the letter "A" to the command line twenty times
repeat these functions 4 times. add 1 to [a] each loop add 5 to [b] each loop close the loop prints 5 to the command line prints 25 tot he command line
Example Program 1: (defun C:DrawLines() (setq pt1(getpoint "\n First Point: ")) [define program] [get first point]
(while (/= nil (setq pt2 (getpoint pt1 "\n Next Point: "))) [get next point] (command "line" pt1 pt2 "") (setq pt1 pt2) ) ) [draw a line] [set pt1 to last point] [close the loop] [close the program]
Example Program 2: (defun C:LetterGuess() (setq myAnswer "J") (setq yourGuess nil) (while (/= myAnswer yourGuess) define a program set up a variable to hold the answer set up a variable to hold your guess while you don't know the answer
(setq yourGuess(getstring "\n Guess what letter: ")) get your guess ) ) close the loop close the program
Example Program 3: (defun C:PrintVert() (setq str(getstring "\n Enter a string:")) (setq cntr 1) (repeat (strlen str) (setq myChar(substr str cntr 1)) (princ (strcat "\n " myChar)) (setq cntr(+ cntr 1)) define a program get a string from the user setup a counter loop once for each character in string get nth character in string print a new line then the nth character increment the counter
Note: Writing the file does not occur until you use the close statement. . Example: (if (setq f(open "c:/acad/myfile.txt" "r")) (progn (while (setq txtLine(read-line f)) (princ txtLine) ) (close f) ) (princ "\n Error - File was not opened.") )
Assuming (setq g(open "text8.txt" "r")) failed. (read-line f) (read-line g) ;returns string from file ;returns Error - Bad Argument Type
Final note:
I've stated over and over that the OPEN statement opens a file. This can also be any resource available to you. Instead of opening "C:\ACAD\MyTextFile.txt" you can just as easily open "LPT1" or "\\myserver\myprinter" and write the file to a printer exactly like you write to a file. Cool! Printing from AutoLisp! One thing to keep in mind. The file does not get written to disk or sent to the printer until after the CLOSE statement. [ This will help you when debugging.] If you cannot get a printer to print, write the data into a text file instead of the printer. Then open the file with notepad and see if it is what you expect. If the data looks good in notepad then you've probably got the printer name wrong, a printer problem, or a network access problem.
Example Program 1: Let's write a program that prints a text file on the command line. (defun C:pTxt() ;define a program name
(setq fname(getstring "\n Enter a valid file name: ")) ;get file name cheaply (if(setq f(open fname "r")) ;open the file in read mode
(while (setq txtLine(read-line f)) ;while lines of text exist in file (princ txtLine) ) ;print the text string to the command line ;close the while statement
(princ "\n Error - Could not find file") ;print a message on the else statement ) ;close the if statement ; note: the if statement can be a " if then " statement or a " if then else" statement