고객서비스

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

ArchiOffice강좌

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

계속해서.. 2부를 올립니다.

다섯번째 라인째지요?.

5. (if (setq p1 (getpoint "\n>> 첫째 구석점 지정: "))
p1이라는 변수에다가 사용자로부터 한 점을 입력받아 저장하는군요.
앞에 보니까.. if문이 있지요?
이것은, 사용자가 마우스로 어느 지점을 입력받지 않고, 그냥 엔터를 쳤을때
그냥 프로그램을 끝나게끔 하려고 if문을 쓴겁니다.
만일 if문을 안쓰면.. 다음 문장이 계속 실행되어서 에러가 주루룩~ 나겠지요?
따라서 .프로그램을 잘짜는 프로그래머는(나같은.. 퍽~!) 이런 상황을
잘 대처 한답니다. 호~ *^^*

getpoint라는 함수는 리습에서 아주아주 자주 쓰이는 함수입니다.
그리고.. 뒤에 "\n>> 첫째 구석점 지정: "이라는건 그냥 화면상에 보이는
메세지인데, 이것은.. 여러분 맘대로 써도 됩니다만,
\n만은 꼭 써주세요. 유식한 말로 "개행" 또는 new line이라고 하는데,
Command line에서 다음라인으로 내려주는 역할을 하지요.

노파심에서 또 한번 부탁 드리지만.. 리습은 괄호가 생명입니다.
괄호가 하나 빠지거나 하나 더 많으면, 로딩조차 안되는 경우가 있습니다.
따라서.. 괄호를 반드시 체크하세요.

다음 라인..
6. (if (setq p3 (getcorner p1 "\n>> 다른 구석점 지정: "))
이것은 위의 getpoint와 비슷한데, getcorner 함수를 썼네요.
이 함수는 꼭 알아두어야 하 것이, 메세지를 쓰기전에
그 앞에 반드시 지점 변수를 써 주어야 합니다.
여기서는 그 지점변수(말이 좀 이상하지요?)가 p1이네요.
그래야만.. 그 지점 변수를 시작으로 러버밴드가 생깁니다.
러버밴드란 일면 고무줄이라는 말인데, 어느 한 점을 찍고나면
그 점을 기준으로 박스 고무줄 같은게 생기지요?
늘었다.. 줄었다.. 늘었다.. 줄었다...
그래서.. 어느지점부터인지 눈으로 알기가 쉽지요.
물론 리턴 결과값은 getpoint와 같습니다.

그럼 다음라인...
7. (progn
progn 이네요. 저두 이것이 무엇의 약자인지는 잘 모르겠습니다.
그냥.. 무작정 씁니다. 허.. 참.. 창피하네.
if문 다음에 한줄만 쓸때는 이 progn이라는 함수를 쓸 필요는 없지만,
2줄 이상일때는 이 progn이라는 함수로 묶어줘야 합니다.
따라서.. 이 progn함수 안에 있는 문장들이 모두 실행되지요.

다음라인..
8. (setvar "osmode" 0)
osmode를 0으로 설정했네요.
즉, osnap을 non으로 설정했다는 애기지요.
왜 그랬을까요?
리습에서.. 오토캐드 명령어를 써서.. 라인같은걸 그릴 때,
osnap이 걸려 있으면.. 걸려있는 osnap을 참조해서 그려집니다.
나는 분명히.. 이쪽에 찍었는데.. 나중에 엉뚱한곳에 선이 그려진다면
황당하겠죠?
그런것을 방지하기 위해서.. 프로그램 내에서는 될수 있는 한.. osmode를
0으로 설정합니다.

다음 라인..
9. (setq p2 (list (car p1)(cadr p3)))
여기서는 car이란 함수와 cadr이란 함수가 나왔네요.
car이란 함수는 리스트중에서 맨 앞에 있는 값을 가져옵니다.
p1이나 p2의 값은 (32.43 47.23 0.0)이런 형태일것이 분명하니
이 중에서 가장 앞에 있는 값, 32.43이란 값을 가져오기 위해서죠.
그럼 32.43은 뭘까요? 바로 X값입니다. 뒤의 47.23은 Y 값이겠죠?
그럼.. 0.0은...? Z값입니다.
리습에서.. 지점변수는 항상 X, Y, Z 값을 가지고 있습니다.
(그래서 (car p1)이라는건 p1의 X값만 가져오기 위함입니다.

그러면.. cadr함수는 뭘까요? 두번째 값을 가져오기 위한 함수입니다.
두번째 값은 Y값이지요.
그럼 세번째 값인 Z값은 어떻게 가져올까요? caddr 함수입니다.
요기까지만 하죠. 머리 아프쟎아요.
그리하여.. p2변수는 p1의 X값과 p3의 Y값을 취해서 새로운 지점 변수를
갖게 되는겁니다.
여기서 영리한 분은 눈치 채셨을겁니다.
왜 p2에는 Z값이 없냐구요?
없어도 됩니다. 평면에서만 사용할 것이기 때문에요.
그리고.. 또 Z값을 생략하면.. 기본값으로 0이 들어갑니다.

다음 라인..
10. (setq p4 (list (car p3)(cadr p1)))
위 9번째 라인과 같으네요.
다만.. 방법이 조금 틀릴 뿐이지..
p3의 X값과 p1의 X값을 취하네요.
그냥 넘어갈께요.

다음라인..
11. (setq hang (angle p1 p2))
angle이라는 함수는 두 지점간의 각도를 알아내는 함수입니다.
변수 이름을 hang라고 한 이유는 Horizontal Angle의 약어로 쓴겁니다.
여러분들도 변수를 쓸때는 여러분들이 알아보기 쉽도록 쓰는 습관을
들이세요. 즉, 짧지만 한눈에 알아볼수 있는 그런 변수를요.

다음라인..
12. (setq vang (angle p1 p4))
이것두 그냥 지나갈게요.
Vertical Angle의 약어로 썼습니다.

다음라인..
13. (setq hdist (distance p1 p2))
distance라는 함수는 두 점간의 거리를 알아내는 함수입니다.
따라서 p1과 p2의 거리를 알아내는거지요.

다음라인..
14. (setq vdist (distance p1 p4))
위 13째라인과 이하동문이네요.
다만 세로의 길이가 되겠지요?

다음라인..
15. (setq tpt (polar p1 hang (* hdist 0.5)))
자.. 이건 좀 중요한거라서.. 설명을 약간 길게 하겠습니다.
polar함수는 리습에서 아주아주 중요한 함수랍니다.
어느 지점으로부터 다른지점의 거리를 알아내는 함수이지요.
tpt는 Text 가 써질 자리를 담는 변수인데, 우선 가로방향으로 반만
움직입니다. 왜 반만 움직이냐구요? 그럼 다 움직일래요?
그냥 보기좋게.. 반만 움직입시다. 예..?
그래서.. p1에서 시작해서 hang방향(가로 방향이지요.)으로
hdist의 반만 움직입니다.
즉, polar함수는 (polar 시작점 각도 거리) 이런 형태가 됩니다.
가로 방향으로 반 움직였죠?

다음라인..
16. (setq tpt (polar tpt vang (* vdist 0.5)))
이제는 세로 방향으로 반만 움직여 보지요.
변수는 이미 한번 옮겨진 tpt입니다. 옮긴데에서 다시 또 옮기는거지요.
세로 방향으로 반만 움직였으니까.. 이젠 정 가운데가 되겠지요?
나중에, 이 정가운데에 "Matinata"라는 글자를 쓰려고 합니다.

다음라인..
17. (command ".pline" p1 p2 p3 p4 "c")
이제는 실제로 오토캐드 명령어를 써서 실행을 합니다.
명령어를 어떻게 쓰냐구요?
나 이런... 그냥 오토캐드 명령어 라인에서 함 해보세요.
그 순서 그래도 적어 넣으면 되는겁니다. 네..
끝네 "c"도 그냥.. 오토캐드 명령어 라인에서 입력한것과 같습니다.

여기서 또.. 눈치 빠른 분은 한가지 이상한 것을 눈치 채셨을겁니다.
pline 명령어 앞에 왜 점(.)이 붙어서 pline이 아니고, .plinr이냐?
예.. 아주 예리한 눈으로 보셨습니다.
이것은, 오리지날 명령어를 쓴다고 생각하면 됩니다.
이런.. 명령어도 오리지날이 있고. 짜가가 있나..?
예.. 물론 있습니다.
오토캐드 명령어도 define할 수 있습니다.
잘 안쓸 뿐이지요.
undefine과 redefine이란 명령으로 명령어를 삭제 복구할 수가 있는데,
이것은 아무나 해서는 안되는 위험한(?) 명령입니다.
어쨌든.. 이러한 위험한(?) 명령어로 undefine해 놓은 명령어라도
앞에 점(.)을 붙이면 다 실행이 되는데, 그러한 연유에서 앞에 점(.)을
붙여서 쓴 이유입니다.
undefine과 redefine에 대해서는 나중에 다시 설명을 하지요.

다음라인..
18. (command ".line" p1 p3 "")
이 것은, LINE 명령으로 사선을 긋는 부분입니다.
마우스로 지정한 지점끼리 선이 그어 지겠네요.
아래의 19번째 라인도 마찬가지겠지요?

다음라인..
19. (command ".line" p2 p4 "")
마우스로 지정하지 않은 곳끼리 선이 그어 지겠지요?

다음라인..
20. (command ".text" "j" "m" tpt (* vdist 0.1) "0" "Matinata")
에~ 문자를 쓰는 부분입니다.
명령순서를 잘 볼까요?
text명령을 쓴 다음, "j"와 "m"이 있네요,
물론.. "j"는 생략해도 됩니다만, 이해를 돕기위해서 썼습니다.
j는 Justify의 약자지죠?
즉, 문자의 기준점을 어디에 둘 것인가를 설정하는 것입니다.
m은 정 가운데를 말하는겁니다.
기본값은 L(Left)입니다.
글자를 정 가운데에 쓰기 위해서 이런 짓(?)을 했습니다.
그리고.. 다음에, 문자 삽입점(tpt)을 썼지요?
다음이 문자의 크기인데, vdist를 1/10으로 나눈 만큼의 크기로
설정했습니다.
다음이 각도인데, 0도로 해서.. 무조건 똑바로 쓰여 지도록 했구요.
마지막으로 "Matinata"라는 문자를 썼습니다.
이 "Matinata"가 맘에 안들면... 다른걸 쓰세요.

다음라인..
21. )
이거 뭐.. 그냥 썰렁하네요.
7번째 라인 progn에 대응하는 괄호입니다.
그렇다고 이 괄호를 무시하면... 어떻게 되는지 알죠? -_-

다음라인..
22. )
이건.. 6번째 라인 if에 대응하는 괄호입니다.

다음라인..
23. )
이건 5번째 라인 if에 대응하는 괄호입니다.

다음라인..
24. (setvar "osmode" q:osm)
이제.. 할일을 다 했으니 osmode를 처음걸로 되돌리는군요.
처음에 받아 놓았던 변수가 q:osm이지요?

다음라인..
25. (setvar "cmdecho" q:cmd)
역시.. cmdecho 변수를 되돌리는군요.

다음라인..
26. (princ)
이것역시.. 저번에 한번 설명을 했지만,
친절하게 한번 더 설명을 하지요.
뒤를 깨끗하게(??) 하는 함수입니다.
무엇이든지 일을 하고나면..
뒷처리를 깔끔하게 해야 교양있는 국민이 됩니다.
으험험~
다시한번 애기하자면, 마지막 리턴값을 화면에서 없애주는겁니다.

다음라인..
27. )
마지막 라인이네요.