고객서비스

  • 프로그램다운로드
  • 팻치다운로드
  • 인증코드신청
  • 아키오피스자료실
  • 아키오피스강좌
  • 아키오피스동영상강좌
  • FAQ
  • FAQ

ArchiOffice강좌

질문과답변
제목 [리습] 간단한 박스 그리기 - 1부
등록일 1998-11-14 조회 1970
마티.. 김남갑입니다.

이번에는 약간 전진을 해서 간단한 기능을 구현해 보겠습니다.
시중에 나와있는 리습관련 서적을 보면... 주로 함수 위주로 되어있지요?
물론... 쳬계적으로 리습을 배우는데에는 좋은 방법입니다만,
직업적으로 사용할게 아니라면 괜히 짜증이 나지요.
직업적으로야... 어차피 이게 아니면 굶어죽는다는 생각으로 하니까
재미가 없어도 해야겠지만요.

아, 쓸데없는 소리 하지 말고 강좌나 하라구요?
예.. 하겠습니다.

마우스로 두 점을 입력받으면, 오토캐드가 그 두점을 기준으로
박스를 그리고.. 사선을 그린 다음, 가운데에 글자를 쓰는 기능입니다.
가운데에 쓰는 글자는... 저는 "Matinata"로 하겠지만, 여러분들은
그냥 자신의 이름을 넣어보세요.

그리고.. 잔소리 같겠지만.. 몇마디만 더 하고 시작할께요.
리습이라는건.. LISt Processing의 약어입니다.
따라서.. 오토캐드에서 명령어를 썼을때, 실행되는 순서랑
오토캐드가 어떤식으로 돌아가는지를 잘 알아두면 아주아주 도움이
많이 된답니다.
예를 들면, pline이란 명령어를 실행하고 한점을 찍으면, 몇가지 옵션들이
죽~ 나오지요?
A는 호를 그릴 때, W는 선굵기를 조절할 때, C는 처음 지점이랑 연결하 때..
등등.. 그런 옵션 같은것들을 말입니다.
물론.. pline 뿐만 아니라.. 모든 명령어에 옵션이 있지요.
뭐.. 이런것들을 다 외울 필요는 없고, 필요시마다.. 직접 키보드로 확인을
해 보세요.

그럼 시작합니다.

(defun C:B (/ q:cmd q:osm p1 p2 p3 p4 hang vang hdist vdist tpt) ; 1

(setq q:cmd (getvar "cmdecho")) ; 2
(setq q:osm (getvar "osmode")) ; 3
(setvar "cmdecho" 0) ; 4
(if (setq p1 (getpoint "\n>> 첫째 구석점 지정: ")) ; 5
(if (setq p3 (getcorner p1 "\n>> 다른 구석점 지정: ")) ; 6
(progn ; 7
(setvar "osmode" 0) ; 8
(setq p2 (list (car p1)(cadr p3))) ; 9
(setq p4 (list (car p3)(cadr p1))) ; 10
(setq hang (angle p1 p2)) ; 11
(setq vang (angle p1 p4)) ; 12
(setq hdist (distance p1 p2)) ; 13
(setq vdist (distance p1 p4)) ; 14
(setq tpt (polar p1 hang (* hdist 0.5))) ; 15
(setq tpt (polar tpt vang (* vdist 0.5))) ; 16
(command ".pline" p1 p2 p3 p4 "c") ; 17
(command ".line" p1 p3 "") ; 18
(command ".line" p2 p4 "") ; 19
(command ".text" "m" tpt (* vdist 0.1) "0" "Matinata") ; 20
) ; 21
) ; 22
) ; 23
(setvar "osmode" q:osm) ; 24
(setvar "cmdecho" q:cmd) ; 25
(princ) ; 26

) ; 27

자.. 그럼 한줄씩 차례로 살펴보도록 하지요.
1. (defun C:B (/ q:cmd q:osm p1 p2 p3 p4 hang vang hdist vdist tpt)
이것은 이전에 단축키 만들때 설명을 하긴 했지만, 그래도 한번 더 할까요?
defun이라는건 함수를 정의한다는 의미입니다.
그러니까 defun뒤에 나오는것(C:B) 함수 이름이 되겠지요?
제가 이 게시판이 작아서 그냥 짧게 C:B라고 했는데,
여러분들은.. 함수 이름을 되도록이면 3자 이상으로 쓰시길 바랍니다.
그래야.. 나중에 함수가 중복돼서 충돌하는 일이 없지요.
함수 이름인 B앞에 왜C :이 들어갔냐구요?
그것은, 오토캐드 Command 라인에서 바로 실행시킬수가 있다는 의미라고
제가 저번에 설명을 했었습니다.

만일 그냥 (defun B (/ ...)라고 했다면, Command라인에서 바로 샐행할수는 없고, 반드시 앞뒤로 괄호를 넣어서 (B)라고 해야 실행이 됩니다.
불편하지요? 그러니까.. 메인 함수는 항상 C:으로 시작하기 바랍니다.

그 다음.. 뒤에 (/ q:cmd q:osm p1 p2 ... 등이 주욱~ 있지요?
이것은.. 다음번에 설명 드리기로 하지요.
그냥.. 잠시 힌트만 드리자면.. 변수처리 입니다.
지금 변수처리에 대한것까지 설명하면.. 여러분은..
그냥 포기하실것 같아서요.

다음줄 진행하겠습니다.
2. (setq q:cmd (getvar "cmdecho"))
setq라는 것은 변수를 넣는 함수입니다.
C나 베이직 같은 랭귀지에서는 그냥 =로 쓰는데, 리습에서는 setq라는
함수를 씁니다. 그냥 그렇거니~ 하세요.
예를 들어 (setq a 3)이라고 하면.. a라는 변수에 3이라는 정수를 넣는다는 애깁니다.
그리고 (getvar "cmdecho")에 대해서 설명하지요.
리습 함수에서 getvar나 setvar가 아주아주.. 종종..자주 쓰이는데,
이것은 필히 알아 둘 필요가 있습니다.
오토캐드에는 시스템 변수가 무지~ 많습니다.
리습의 베테랑(나같은.. 흐흐흐..)도 가끔 이 시스템 변수때문에 골치를
앓는 경우가 있는데, 워낙에 많기 때문에 그걸 다 못 외워서 그렇답니다.
어쨌든... cmdecho라는 시스템 변수는 리습에서 오토캐드 명령어를
쓸때, 그 상황이 명령어라인에 보이게 할것인가 말것인가를 설정하는
시스템 변수입니다.
1이면 보일것이고, 0이면 안보이겠지요?
그렇다면.. 첨부터 그냥 0으로 설정하면 되지, 왜 getvar함수로 변수를
받느냐구요?
에이~~ 사람마다 취향이 틀려서.. 항상 원래대로 되돌려야 나중에
다른사람(누구?)에게 욕을 안먹습니다.
즉, 원래대로 되돌리기 위해서.. q:cmd라는 변수로 그 값을 받아 놓는겁니다.

그런데 우리는 여기서 또 한가지의 의문이 생깁니다.(그것이 알고싶다..??)
변수 이름이 왜 q:cmd인가?
그냥 cmd로 하면 되지? 왜 q:cmd냐 이 말입니다.
제 맘입니다요. 순전히...
그렇긴 하지만, 일반적으로 시스템 변수를 받는 변수는 앞에 q:을 많이
붙여서 쓰더라구요. 그래서.. 저두 제맘대로 앞에 q:을 붙였습니다.
이렇게 해 두면.. 나중에.. 아.. 이건 시스템변수를 담아놓은 변수구나~
라고 알수가 있습니다. 됐시미까?
그래서.. q:cmd라는 변수에다가 현재의 cmdecho시스템 변수를
담아두는 겁니다. 나중에 되돌리기 위해서...
그냥 바닥에 쏟아 버리며 못 줏어 담쟎아요. 그러니 그릇에 담아두는거지요.

다음 라인을 볼까요?
3. (setq q:osm (getvar "osmode"))
이건 뭐 볼거도 없네요. 위의꺼랑 같으네요.
다면.. cmdecho가 아니라 osmode군요.
osmode가 뭐냐구요?
여러분이 가장 많이 쓰는 osnap 변수입니다.
여러분들은.. osnap을 쓸 때, end, nea, int.. 등으로 쓰지만
우리 수준높은 사람들(죄송~ *^^*)은 숫자로 쓴답니다.
0은 non이고, 1은 end, 2는 mid, 4는 cen... 이렇게 배수로 나갑니다.
끝까지 해 보자구요? 함 해볼까요? 좋아요.
8은 node, 16은 qua, 32는 int, 64는 ins.. 헥헥~ 힘들다.
아고.. 나머지는 여러분이 직접 쳐보세요.
즉, osmode에서 아무 숫자나 주고 osnap을 해보면 결과를 알수 있습니다.

아, 중요한거 한가지..
제가 아까 osmode의 숫자는 배수로 나간다고 했는데,
꼭 그렇지만은 않습니다. 이게 무슨 쇠고기 돼지똥싸는 소리냐구요?
3이라는 숫자를 넣어볼까요?
3이라는 숫자는 1+2입니다. 제 말이 맞죠?
따라서 1은 end, 1는 mid니까.. 3으로 설정하면,end와 mid가 동시에
설정됐다는 뜻입니다. 이제 아시겠죠?
그러니까.. osmode값은 0에서 4095까지 모든 정수값을 넣을수가 있는
겁니다. 우와~아아아~

다음 라인을 볼까요? (이러다 해진다.)
4. (setvar "cmdecho" 0)
cmdecho를 0으로 설정했네요.
예, 리습에서 오토캐드 명령어를 쓰더라도 화면상에 안보이게 하기 위함이죠.
왜? 보이면 지저분 하니까... 지저분~

에고.. 한꺼번에 너무 많이 하면.. 머리 아프죠?
그래서.. 1부는 여기까지만 하지요.
2부도 곧 올릴께요.
아고~ 손목이야..

마티.. 김남갑.