Lisp 함수 설명
CAD에서의 실행
ex) COMMAND : (LOAD"aaa") (파일이름이 aa.lsp라고 가정)
-ps : 혹시 LOADING이 되지 않고 이상한 메시지가 출력되면 거의 99%가 LISP 소스에 문제!!
프로그램
입력 규칙
AutoLISP의 입력은 키보드로부터 입력되거나 ASCII화일이나 문자열 변수로부터 읽혀 진다.
또한 프로그램 내부에서 사용되는 심벌의 이름은 () . ' " ; 와 같은 특수문자들을 제외한 어떤 문자열에 의해서도
구성될 수 있다. AutoLISP에서 사용되는 심벌과 함수의 이름은 대,소문자 어느 것이나 사용할 수 있지만
숫자로 이름을 시작해서는 안된다. (아래 ex와 같이 대 소문자 구분을 하지 않음)
ex) (defun draw() ) or (DEFUN Draw() )
세미콜론의
사용
Auto LISP프로그램은 다른 언어와 마찬가지로 프로그램 중에 주석문을 포함시킬수 있다.
주석문은 세미콜론으로 시작되어 그 줄의 끝까지 이다. 프로그램이 로드될 때 세미콜론 뒤의 주석은 무시되며,
로드되지 않는다. 프로그램 작성자는 프로그램을 작성할 때 주석을 붙이는 습관을 가져야 한다.
ex) ; This is entire comment line
(setq a (+ 2 b) ) ; computer bplus 2
괄호의 사용
괄호는 AutoLISP프로그램을 작성하는데 필수적이다. 모든 명령어는 위의 ex에서 처럼 괄호에 의해 둘러싸인다.
한 명령어는 여는 괄호"("와 닫는 괄호 ")"한 쌍이 사용된다. 따라서 중첩을 여러번 하는 경우 열고 닫는 괄호수가
반드시 맞아야 한다. 그렇지 않을 경우에는 에러가 발생하여 프로그램이 실행되지 않는다.
변수의 사용
변수는 특수문자와 숫자를 사용할수 없고 대,소문자를 구별하지 않아 'x'와 'X'는 값은 값을 가진다.
변수는 문자 A - Z와 숫자 0 - 9만을 사용한다.
ex) ao or alist or pnt12 (올바른 변수)
2pt : 문자로 시작해야 한다. (틀린 변수)
ab+c : 문자 A - Z만 사용할수 있다. +는 사용할 수 없다. (틀린 변수)
ca$ : 특수문자는 사용할수 없다. (틀린 변수)
AutoLISP이 다른 언어와 틀린점은 변수 하나에 여러 값을 가질수 있다는 것이다.
ex) (setq a ( 3 4 5) ) a에는 3, 4, 5가 대입된다.
지역변수
와
광역변수
지역변수는 프로그램의 실행이 끝나고 나면 그 변수의 값이 사라지는 것을 말하며, defun문 다음의 괄
호의 '/'기호 이후에 그 변수명을 적으면 지역변수가 된다
. 광역변수는 프로그램 실행이 끝난후에도 계속 메모리에 남아있는 변수를 말하며,
AutoCAD가 끝나기 전까지 또는 다른 파일을 불러오기 전까지 메모리에 남아있다.
ex) (defun c:**** ( a / c d e) ) - a는 외부로 부터 값을 입력받는 변수이다. c, d, e는 지역변수이다.
괄호안에 언급되지 않은 기타 모든 변수는 광역변수로 취급된다.
ex) (defun c:**** ( ) )
DEFUN 명령
defun은 다른언어의 function과 sub와 같다고 할수 있다. LISP에서 defun은 없어서는 안될 명령어다.
defun명령은 지역변수와 광역변수 와 독립변수의 적절한 사용을 function과 sub문을 대신하고 있다.
ex) (defun kk () ) or (defun C:kk () )
위의 두 예는 모두 맞는데 사용방법에 있어 약간의 차이가 있다.
첫 번째 예제는 CAD상에서 실행할 때 '(kk)'라고 실행하야 되며, 두 번째의 경우는 'kk'로 실행된다.
SETQ 명령
형식 : (setq <변수1> <표현1> | <변수2> <표현2> | .....)
기능 : 값을 지정(저장, 대입)한다.
setq는 BASIC의 Let문과 같은 기능을 하는데, 지정을 의미하는 명령어로 표현에 나온 값을 변수에 저장한다.
ex) (setq a b) b의 값이 a에 저장된다.
(setq a ( + b c ) ) b와 c를 더한 값이 a에 저장된다.
(setq k 5 ) k에 5가 저장된다.
수식 함수
(+, -, *, / )
다른 언어와 마찬가지로 더하기, 빼기, 곱하기, 나누기를 하는 명령어 들이며 연산의 우선순위는 * / + -순이다.
ex) (+ 2 3 4.0 ) = 9.0 or (- 5 1 2) = 2
(* 2 3 2.0 ) = 12.0 or (/ 20 2 5.0 ) = 2
( + (* 2 3) (- 5 3) ) = 8 or ( / 50 (+ 2 3.0) ) = 10.0
(setq a 5) a = 5 or (setq a (+ a 3) ) a = 8
ANGLE 명령
형식 : (angle <점1> <점2>)
기능 : 두 점 사이의 각도를 측정한다.
내용 : angle은 두 점 사이의 각을 radian으로 측정한다. 이때 주의해야 할 사항은 CAD에서 사용하는 각도는
degree이고, LISP에서 사용하는 각도는 redian이어서 이값을 변환해 줄 필요가 있는데, 다음과 같이 한다.
ex) (defun dtr( an )
(* pi ( / an 180 )) )
(defun rtd( an )
(/ (* an 180 ) pi) )
DISTANCE 명령
형식 : (distance <점1> <점2>
기능 : 두점 사이의 거리를 측정한다.
내용 : 두점 사이의 거리를 측정하는 명령어로서 사용 방법은 다음과 같다.
ex) (setq ki (distance p1 p2) ) 점1과 점2 사이의 거리를 ki에 저장한다.
POLAR 명령
형식 : (polar <점> <각도> <거리> )
기능 : 극좌표에서의 거리를 측정한다.
내용 : polar는 점에서 각도만큼의 거리의 점을 위치를 측정한다.
ex) (setq t (polar '(0 0) 45 100) ) 점 0,0에서 45각도를 가지고 거리가 100인 점의 위치를 t에 저장한다.
t의 값은 141, 141(x,y)가 될 것이다.(의심이 생기면 확인하시오! ...^.^;)
삼각 함수
형식 : (sin <각도> ) or (cos <각도> ) or (tan <각도> )
기능 : sine, cosine, tangent값을 구한다.
ex) (setq a (tan 45) )
기타 수식함수
(max x y .... ) x와 y값중 최대값
(min x y .... ) x와 y값중 최소값
(abs x ) x의 절대값
(sqrt x ) x의 제곱근
(exp x ) e(자연대수)의 x승을 구한다.
(expt x p ) x의 p승을 구한다. x, p가 모두 정수인 경우에만 결과가 정수가 된다.
(log x ) x의 자연대수 값을 구한다.
(float x ) x값을 실수로 변환한다.
(fix x ) x값의 정수부분만을 구한다.
(type a ) 변수a의 타입을 구한다.
수학적 계산
관련 명령어
(+ ... ) + 이후의 숫자 를 모두 더한다.
(- ... ) 에서 이후의 숫자를 모두 뺀다.
(* ... ) * 이후의 숫자를 모두 곱한다.
(/ ... ) 에서 이후의 숫자들의 곱으로 나눈다.
(1+ ) 에 1을 더한다.
(1- ) 에 1을 뺀다.
(gcd ) 과 의 최대 공약수를 구한다.
(logand ... ) logand 이후의 숫자의 논리곱 AND를 구한다.
(logior ... ) logand 이후의 숫자의 논리합 OR를 구한다.
(max ... ) 나열된 수치 중 가장 큰수를 구한다.
(min ... ) 나열된 수치 중 가장 작은 수를 구한다.
(rem ) 을 로 나누고 나머지를 구한다.
관계 논리
명령어
(= ...) 과 가 같은지 검사한다.
(/= ...) 과 가 다른지 검사한다.
(< ...) 이 보다 작은지 검사한다.
(<= ...) 이 보다 같거나 작은지 검사한다.
(> ...) 이 보다 큰지 검사한다.
(>= ...) 이 보다 같거나 큰지 검사한다.
(and ...) , 모두가 T이면 T를 응답한다.
(zerop ) 가 0인지 검사한다.
화면 출력
명령어
(alert ) 대화상자를 통해 경고 메시지를 출력한다.
(graphscr) 화면을 그래픽 화면으로 전환한다.
(prin1 []) 을 화면 또는 파일에 출력한다.
(princ []) 을 화면 또는 파일에 출력한다.
(print []) 을 화면 또는 파일에 출력한다.
(prompt ) 화면에 를 출력한다.
(textscr) TEXT 화면으로 전환한다.
조건 분기 및
반복 명령어
(cond ...) 각각의 조건식의 결과가 T이면 다음의 를 실행한다.
(if [])
이 nil이 아니면 을, 그외의 경우에는 을 실행한다.
(progn ...) 여러개의 실행문 및 수식을 하나의 문장으로 묶어 처리한다.
(repeat ...) 을 만큼 반복한다.
(while ....) 이 nil 이 될 때까지 을 계산한다.
기하 명령어
(angle ) 에서 까지 직선의 각을 구한다.
(atan []) 아크탄젠트값을 라디안으로 응답한다.
(angtos [ []]) .
라디안 단위를 여러단위로 변환하여 문자열로 응답한다
(cos ) 의 코사인 값을 구한다.
(distance ) 과 사이의 거리를 구한다.
(osnap ) 에 의해서 점에 적용한 점을 구한다.
(pi) 상수로 3.1415926, π
(polar )
점에서 각으로 거리 만큼 떨어진 점을 구한다.
(rtos [ ]) 를 여려 형태의 문자열로 응답한다.
(sin ) 의 사인값을 구한다.
문자열 관련
명령어
(ascii ) 의 ASCII 문자 CODE를 응답한다.
(atof ) 을 실수로 변환한다.
(atoi ) 을 정수로 변환한다.
(char ) 를 해당 ASCII문자를 응답한다.
(itoa ) 정수를 문자로 변환한다.
(strcase []) 을 대문자 또는 소문자로 응답한다.
(strcat ...) 나열된 , ...을 연결하여 응답한다.
(strlen ) 의 문자수를 구한다.
(substr []) 을 부터 수 만큼 응답한다.
list 관련
명령어
(append ...) 나열된 을 하나의 list로 만든다.
(apply ) 의 인수를 가진 을 실행한다.
(atom ) 이 list인 경우 nil을 응답한다.
(cadr ) 의 두 번째 요소를 구한다.
(car ) 의 첫 번째 요소를 구한다.
(cdr ) 의 첫 번째 요소를 제외한 모든 요소를 구한다.
(length ) 의 요소수를 정수로 응답한다.
(list ...) , 이후의 요소를 묶어 하나의 list로 응답한다.
(listp ) 이 리스트이면 T, 그렇지 않으면 nil을 응답한다.
(member ) 를 검색하여 을 찾는다.
(nth ) 의 번째 요소를 응답한다.
(null ) 이 nil이면 T를 응답한다.
(numberp ) 이 실수 또는 정수이면 T를 응답한다.
(quote ) 을 계산 없이 그대로 응답한다.
(read ) 의 첫 번째 list또는 atom을 응답한다.
(reverse ) 를 거꾸로 배치한다.
(subst ) 의 을 으로 바꾼다.
(type ) 의 형태를 응답한다.
사용자 입력
명령어
(getangle [] [prompt>]) 사용자로부터 각도를 요구한다.
(getcorner [prompt>]) 사용자로부터 점을 기준으로 점를 요구한다.
(getdist [] [prompt>]) 사용자로부터 거리를 요구한다.
(getreal []) 사용자로부터 실수 입력을 요구한다.
(getstring [] []) 사용자로부터 문자열 입력을 요구한다.
(initget [] []...) getxxx 함수에 의해서 사용되는 각종 옵션을 설정한다.
시스템 변수
관련 명령어
(getenv ) 시스템 환경변수의 값을 응답한다.
(getvar ) AutoCAD의 시스템 변수를 구한다.
(setvar ) AutoCAD의 시스템 변수를 로 설정한다.
파일 입출력
관련 명령어
(close ) 파일을 닫는다.
(findfile ) 의 파일을 찾는다.
(load []) AutoLISP 파일을 loading한다.
(open ) 파일을 오픈한다.
(read-char []) 키보드 또는 파일에서 하나의 문자를 읽어 들인다.
(read-line []) 키보드 또는 파일에서 하나의 문자열을 읽어 들인다.
(write-char []) 파일에 의 ASCII 코드에 대당하는 문자를 기록한다.
(write-line []) 파일에 을 기록한다.
도면요소
(Entity) 관련
명령어
(assoc ) 의 에 해당하는 list를 구한다.
(entdel ) 을 삭제하거나 복구한다.
(entget ) 의 entity list를 구한다.
(entlast) 가장 최근에 그려진 도면요소를 선택한다.
(entmod ) 도면요소의 바뀐 내용을 화면에 반영한다.
(entnext []) 다음에 있는 도면요소를 구한다.
(redraw [ []]) 도면 전체 또는 을 REDRAW한다.
(ssadd [ []])
에 을 추가시킨다.
(ssget [ ] []) 하나 이상의 도면요소를 선택한다.
(sslength ) 에 있는 도면요소의 갯수를 구한다.
(ssname ) 에서 번째의 도면 요소의 이름을 구한다.
(tblsearch [ ]) 의 에 대한 정보를 응답한다.
기타 명령어
(boundp ) 일반 논리 boole함수를 응답한다.
(defun ...) 이라는 이름으로 함수를 정의한다.
(eval ) 의 계산결과를 응답한다.
(foreach ...) 내의 모든 요소를 로 실행한다.
(lambda ...) anonymous(무영) 함수를 정의한다.
(mapcar ... ) list의 개별 요소를 갖는 을 실행한다.