127
제3장 AutoLISP 유틸리티 앞장에서는 LISP과 이를 이용한 객체지향 환경의 구성에 대하여 다루었다. 본 장에서는 AutoLISP과 오토캐드를 활용하는데 도움이 되는 여러 가지 유틸리티의 활용 방법 및 문제점에 대하여 다루기로 한다. 이후의 내용은 인터넷을 통하여 얻은 자료들을 정리한 것이다.

AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

Embed Size (px)

Citation preview

Page 1: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

제3장

AutoLISP유틸리티

앞장에서는 LISP과 이를 이용한

객체지향 환경의 구성에 대하여 다루었다.

본 장에서는 AutoLISP과 오토캐드를 활용하는데

도움이 되는 여러 가지 유틸리티의

활용 방법 및 문제점에 대하여 다루기로 한다.

이후의 내용은 인터넷을 통하여 얻은 자료들을

정리한 것이다.

Page 2: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

1. 한 손가락 사용법

본 절은 Bill Fane에 의해서 1994년 4월 22일 인터넷에 게재된 내용이다.

(1) 오토캐드를간단하게사용하는법

어느 사람이라도 컴퓨터를 20분 이상 사용해본 경험이 있다면 세 손가락을

사용하는 방법을 알 것이다. Ctrl-Alt-Del이 그것이다.

이어서 두 손가락을 사용하는 방법이 있다. 게으른 오토캐드 사용자라면 이

러한 방법을 찾는데 상당한 관심이 있을 것이다. 앞서의 버전에서는

Command: 단계에서 명령어를 입력하거나 메뉴시스템을 이용하는 방법을 생

각하게 된다.

최신의 버전에서는 화면이나 메뉴 운용방식이 매우 강력하여졌으나, 필요한

작업만을 최소한의 문자를 입력시키어 실행하고자 하는 요구는 아직도 높다.

AutoLISP을 사용한다면 이와 같은 욕구는 다음의 사항을 입력함으로써 만족

할 수 있다.

(defun c:L ( )

(command "line")

(princ)

)

이상의 방식은 단순히 두 번의 손가락으로 실행할 수 있는 방법을 보여준다.

즉 L을 치고 <Enter>를 치는 것이다.

이것은 상당히 유용한 방식이다. 26개의 알파벳을 명령어로 사용하여 재정

의하여 사용할 수 있는 것이다. 또한 이러한 정의가 ACAD.LSP 파일에 포함

되어 있다면 이것을 이용하여 도면을 생성하고 편집할 때 사용할 수 있다. 두

308

제3 장 AutoLISP유틸리티

Page 3: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

개의 철자를 사용하는 방법도 있다.

(defun c:ZW ()

(command "zoom" "w")

(princ)

)

이상의 방식은 ZOOM을 시키는 명령을 3개의 자판을 침으로써 가능하게 해

준다. 즉 Z와 W와 <Enter>이다. 실제로 두 자판 이상의 자판 사용은 비생산

적인 결과를 초래한다.

오토캐드의 11 버전에서부터는 "command aliases" 기능을 사용하는 것이

가능하다. 이 때부터는 단순히 ACAD.PGP라는 파일을 편집함으로써

AutoLISP을 사용할 필요도 없이 앞서 언급한 효과를 달성할 수 있다.

이제 한 손 사용법에 대하여 말하고자 한다. ACAD.PGP 파일은

"ProGram Parameters" 파일이라고 알려져 있다.(이것은 또한 PiGPen 파

일이라고도 불린다) 그 원래의 목적은 오토캐드를 떠나지 않고 shell의 기능으

로서 다른 프로그램을 불러 사용할 수 있는 기능을 활용하려는 의도에서 만들

어졌다.

앞서 설명한대로, 버전 11에서는 "alias"를 오토캐드에서 설정하는 것이

가능하도록 되어 있다. 그 방법은 매우 간단한데 아래와 같은 포맷을 사용

한다.

Z,*ZOOM

여기에서 쉼표 이전의 모든 alias는 별표에 따라나오는 모든 오토캐드 명령

어와 동일한 기능을 가진다. 이것은 한두 개의 문자에 국한되지 않는다. 사용

309

한손가락사용법

Page 4: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

자는 각국의 언어에 해당하는 마치 번역기와 같은 기능으로도 활용할 수 있는

것이다.

좋은 점은 이러한 alias 기능은 오토캐드의 명령어를 완전히 등가로 처리하

므로 그것을 매크로나 메뉴를 사용하듯이 AutoLISP에서도 사용할 수 있다는

것이다.

그러나 다음과 같은 불편한 점도 있게 마련이다.

- <Enter>를 사용하기 때문에 최소한으로 두 번의 자판을 써야 한다.

- alias는 단지 일반적인 오토캐드 명령어만을 부를 수 있다. 즉 그것은 aliases로 정의

된 명령어를 부를 수 없고, 또한 그것에 수반되는 다른 조건을 첨부할 수 없다. 즉

"Zoom Window"의 명령을 처리할 수는 없다.

그러나 하나의 자판을 가지고 이러한 명령을 수행하는 것이 전혀 불가능한

것은 아니다. 흥미롭게도, 사용자가 어떠한 취향을 갖고 있는가에 따라서 두

가지 다른 방법으로 이러한 목적을 달성하는 것이 가능하다. 도스를 사용하는

가 혹은 윈도를 사용하는가에 따라서 두 가지 방식을 각각에 대하여 실현할 수

있다. 먼저 도스 사용자가 할 수 있는 방법에 대하여 설명하고, 후에 윈도 사

용자가 할 수 있는 방법에 대하여 알아보도록 한다.

1) 도스

도스상에서는 단축 키를 재정의 함으로써 목적을 달성할 수 있다.

다음의 두 가지 단계를 따르도록 한다.

- ANSI.SYS 드라이버를 운용하여야한다.

- 오토캐드를 운용하는 배치 파일을 변경하여야 한다.

310

제3 장 AutoLISP유틸리티

Page 5: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

첫번째 조건을 수행하기 위하여는 CONFIG.SYS 파일을 다음과 같이 추가

하여야 한다.

DEVICE=[path]\ANSI.SYS

여기서 [path]는 드라이버 ANSI.SYS 파일이 포함되어 있는 경로를 의미

한다. 일반적으로 C:DOS에 포함되어 있다. 만약에 이러한 행이 config.sys

에 포함되어 있지 않다면 이를 추가한 후 컴퓨터를 재시동하여야 한다.

conifg.sys를 변경하고 재시동한 후, 이제 컴퓨터는 ANSI 정의의 escape

sequence를 할 수 있게 된다. 이것은 오토캐드에만 국한된 것이 아니고, 이것

을 자판으로부터 직접 확인할 수 있다.

도스 커서 상태에서, 아래와 똑같이 치고 <Enter>한다. 마침표에 주의하고

"zoom e" 앞을 제외한 모든 부분에서의 스페이스가 없는 사실에 주목하라.

$e, "z", 그리고 13p 부분은 소문자이어야만 한다.

PROMPT $e["z";"zoom e";13p

더이상 도스 프롬프트가 보이지 않을 것이다. 이것이 정상이고 만약에 이상

한 자들이 나온다면 그것은 문제이다. 이 경우는 자판입력이 잘못된 것이니,

당황하지 말고 차분히 다시 입력하도록 한다.

이제 소문자 z를 입력하면 도스가 알아서 "zoom e"와 <Enter>를 입력하는

것을 볼 수 있을 것이다. 그리고 "Bad command or file name"이라는 메시

지가 화면에 나올 것이다. 당연히 도스는 zoom 명령어를 인식하지 못할 것이

다. 대문자 Z는 그대로 Z로 인식된다.

오토캐드를 시작하고 임의의 도면을 열어 보자. 이제 소문자 z를 입력하여

보자. <Enter>를 입력시킬 필요없이 오토캐드는 "ZOOM Extent" 명령을 실

311

한손가락사용법

Page 6: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

행할 것이다. 단순히 하나의 자판으로 이 모든 것이 가능하다. 이외에도 추가

적으로 여러 개의 명령어의 경우에 대하여도 성립한다.

PROMPT $e["d";"layer s dim dim";13p

("dim dim"사이에는두개의스페이스가있음에주의하라)

이제 오토캐드로 들어가서 소문자 d를 입력하 을 때 어떠한 결과가 나오는

지를 살펴보자.

- 오토캐드는 LAYER 명령어를 부른다.

- 현재의 레이어를 "dim"이라는 이름의 레이어로 설정한다.(이러한 이름의 레이어가 이미

설정되어 있다고 가정한다).

- DIMensioning 명령어를 수행한다.

312

제3 장 AutoLISP유틸리티

<그림 3-1>

원래의 도면

Page 7: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

소문자 z를 친다면 이것은 역시 유효하게 작동을 할 것이다. 사용자는 원하

는 만큼의 자판을 정의하여 사용할 수 있는 것이다.

몇 가지 문제점을 제외하고는 아주 환상적인 결과를 확인하 다. 다음은 이

에 대한 질문과 대답에 관한 것이다.

Q:자판을재정의하 는데계속해서도스프롬프트가나타나는이유는무엇인가?

A: 최종적으로 재정의된 입력이 다음과 같은 지를 확인하라.

PROMPT $p$g

이것은 도스 프롬프트가 현재의 드라이브와 디렉토리를 지시하도록 한다.

Q매번오토캐드를실행하기에앞서이와같은자판재정의과정을거쳐야하는가?

A: 그럴 필요 없이, 그러한 절차를 오토캐드를 시행하는 배치파일에 넣도록

한다. 만약에 사용자가 표준의 오토캐드 설치 과정을 거쳤다면 ACAD386.

313

한손가락사용법

<그림 3-2>

z를 입력 "zoom e"의

역할을 수행한 후의 도면

Page 8: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

BAT라는 배치 파일이 있을 것이다. 그 내용에 자판을 재정의하는 과정을 넣

도록 한다.

Q: 오토캐드로부터나왔을때도자판이재정의된상태로작동이되는것을어떻게하는

가?

A: 많은 프로그램이 자판이 재정의된 상태로 반응을 할 것이다. 오토캐드용

배치 파일을 편집할 때 각각의 자판을 재정의할 때 그것을 원상태로 복귀하는

부분을 추가하도록 한다.

PROMPT $e["z";"z"p

이상의 명령은 소문자 z가 소문자 z로 정상적으로 인식되도록 할 것이다.

Q: Text 명령어를수행할때 'Full Size라는문자열을입력했는데 'Full Sizoom we라

는결과를얻었다. 어떻게이러한현상을방지할수있는가?

A: 대부분의 공학적인 도면이 대문자를 사용하기 때문에 소문자 자판을 이

용하는 방법에 대하여 설명하 다. 만약에 이것이 문제가 된다면 자주 사용하

지 않는 종류의 자판, PgUp, PgDn, F2, F3 등의 F 자판들, 또는 Shift,

Alt, Ctrl과의 조합 등을 사용하면 된다.

이 경우 어려운 점은 이를 재정의하기 위해서 인용 부호안에 이를 지정할 수

있는 자를 써 넣을 수가 없다는 것이다. 이러한 문제는 ASCII 코드의 값을

직접 사용함으로써 해결할 수 있다.

PROMPT $e[122;"zoom w";13p

이상의 표현은 아래와 똑같은 의미를 갖는다.

314

제3 장 AutoLISP유틸리티

Page 9: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

PROMPT $e["z";"zoom w";13p

마찬가지로 알파벳이 아닌 모든 자판들도 그에 해당하는 코드 값을 갖고 있

다. 이것을 확인하기 위해서는 두 개의 수가 필요하다. 만약에 중괄호 이후의

처음의 수가 0이나 224일 때, ANSI 표준은 이것을 자판 재정의로 인식하지

않고, 확장 자판 코드로 인식한다. 사용자는 "zoom window" 기능을 F3의

자판으로 정의하기 위해서 아래와 같은 절차를 따르도록 한다.

PROMPT $e[0;61;"zoom w";13p

도스 매뉴얼은 일반적으로 아스키 코드의 값을 갖고 있으므로 이를 참고하

기 바란다. 중요한 값들을 열거해 보면 다음과 같다.

A - Z 65에서 90까지.

a - z 97에서 122까지.

Ctrl-A - Ctrl-Z 1에서 26까지.

Alt-A - Alt-Z 0;16에서 0;50까지이나 알파벳 순서는 아님.

F1 - F10 0;59에서0;68까지이나가급적사용하지않는것이바람직하다.

Shift-F1 - Shift-F10 0;84에서 0;93까지

Alt-F1 - Alt-F10 0;104에서 0;113까지

F11 - Alt-F12 0;133에서 0;140까지

이외에도 여러 종류의 자판이 있으나 이 곳에서는 언급하지 않도록 한다.

Q: TEXT 명령어를사용할때표준의상용구를넣기위해단축자판을사용하고자하나

<Enter> 의역할까지포함하도록하지않으려한다.

315

한손가락사용법

Page 10: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

A: 단순히 마지막 소문자 p 앞에 있는 ;13 부분을 삭제하면 된다. <Enter>

에 대한 아스키 코드는 13이다.

Q: 도스 사용자들은 이러한 방법대신 ECHO룰 PROMPT 대신 사용하면 도스 프롬프

트를재정의하지않아서좋을것이라고한다.

A: 기술적으로 옳은 말이나, PROMPT의 사용을 권하고 싶다. ECHO는

원칙적으로 배치 파일 내에서 사용되는 명령어이다. 더군다나 escape 자판을

표시하기 위해서 $e를 사용할 수 없다. 많은 종류의 에디터들이 escape을 표

시하기 위하여 서로 다른 방법들을 사용하고 있다. 그러한 문제를 이 곳에서

다루는 것은 의미 없는 일이다.

이제는 이러한 재정의 방식에서의 패턴을 알 수 있을 것이다.

PROMPT $e[{재정의할자판};{새로운정의}p

{새로운 정의} 항목은 하나 이상의 항목을 포함할 수 있고 여럿을 섞어서 사

용할 수 있다. 사용자의 Autoexec.bat 파일은 다음과 같은 줄을 포함한다.

PROMPT $e[0;134;"c:";13;"cd\drawings";13;"c:\acad386";13p

이상과 같이 F12 자판을 입력함으로써 c: 드라이버로 드라이버를 바꾸어주

고, "drawing" 디렉토리로 바꾸어 주며, c:의 최상위 디렉토리에 있는

ACAD386 배치 파일을 실행시키도록 한다.

윈도우(Window)의 경우에는 어떻게 이용할 수 있는 가를 알아보자.

2) 윈도즈

윈도즈(Windows)는 매우 간단하고 단순한 매크로 및 자판 재정의 유틸리

316

제3 장 AutoLISP유틸리티

Page 11: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

티를 가지고 있다. "Recorder" 아이콘이 그것인데, 실제로 이것은 그것의 이

름처럼 소리를 내는 것과는 상관이 없다.

Windows에서 오토캐드를 실행하고 그것을 아이콘화 한다. 레코드를 실행

하고 그의 메뉴로부터 매크로를 선택한다. 대화상자가 나타날 것이다.

"Record Macro Name" 상자에 이름을 쓴다. "Shortcut Key" 상자를 사

용하는 것이 낳을 수도 있다. 사용자는 하나의 자판 기호를 입력하거나, 다른

자판을 선택하기 위해서 화살표를 선택할 수 있다. 적절히 상자를 선택함으로

써 Ctrl, Alt, 혹은 Shift와 연결된 자판을 만들 수도 있다.

"Record Mouse" 상자를 선택하고 "ignore mouse"를 선택한다. 마이크로

소프트사 역시 이 선택사양을 추천하나, default는 그렇지 아니하다.

"Start"를 선택하면 Recorder는 반짝거리는 조그만 아이콘으로 변화한다.

Autocad를 선택하고 자입력을 시작한다. 사용자가 입력하는 모든 것은

Ctrl-Break를 만나거나 Recorder 아이콘을 선택할 때까지 계속된다.

Recorder의 대화상자가 다시 나오면, "Save Macro"를 선택하고 "OK" 한

다. 오토캐드로 돌아와서, 이전에 정의된 단축 키를 사용하면 재정의한 대로

실행될 것이다.

Recorder의 매크로는 파일에 저장되어 있다. 이후에 오토캐드를 다시 사용

할 경우에, Recorder를 먼저 시작하고 파일을 열도록 한다. 매크로는 그 매크

로를 작성한 관련 어플리케이션 프로그램에서만 유용하다.

다른 방법도 가능하다. Recorder가 오토캐드 매크로 파일을 수록된 후 아이

콘화 한다. 이를 "start up" 그룹에 옮겨 놓고 프로그램 매니저를 사용하여

그 속성을 "Run minimized"로 고친다. 이제 윈도를 시작할 때마다

Recorder를 자동적으로 시작하여 오토캐드 매크로 파일을 활성화한다. 이 상

태에서 오토캐드가 시행될 때까지 뒤에서 조용하게 기다리고 있으면, 오토캐

드 시행 후에는 단축 자판을 사용할 수 있게 된다.

317

한손가락사용법

Page 12: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

2. 도스용 오토캐드 R12c3의 버그 보고서

본 절은 마이크 디카슨(Mike Dickason)에 의해서 1994년 6월 26일 인터넷

에 게재된 내용이다.

다음의 버그 목록은 DOS ACAD 12c3에 대하여 저자가 직면했던 문제들과 컴

퓨서브(Compuserve)의 오토캐드 광장에 게시되었던 메시지에 관한 것이다.

저자 자신은 오토데스크 사의 고용인이 아니고, 또한 오토데스크 사를 공격

하기 위해 이러한 작업을 한 것도 아니다. 사실 저자 개인적으로는 R12c3에

대하여 상당히 만족하고 있다. 그러나 이러한 정도의 크기와 용량의 프로그램

은 몇 개의 버그가 있게 마련이다. 이 보고서는 비슷한 종류의 문제를 겪을 다

른 사용자들을 위한 정보로서 다음의 내용을 작성했다. 여기의 모든 버그는 오

토데스크 사에 보고되었고 이를 확인받았다. 이 리스트에 포함되어 있지 않은

버그를 발견한다면, 저자 자신도 상당히 관심이 있고, 그것을 듣고 이 버그 리

스트를 가장 최신 것으로 유지하고 싶다. 다른 언급사항이 없다면 여기의 버그

리스트는 북미판 도스용 오토캐드 R12c3에 관한 것이다.

(1) 도면을 추출하기 위하여 WBLOCK <dwgname> *을 사용하는 경우, 도

면이 xreference를 포함하고 있을 경우에는, 버전 12에서는 모든 xreference

의 레이어 visibility, 색, 그리고 선의 종류에 대한 값들을 외부 도면의 값으

로 정의해 버린다. 이는 사용자가 이러한 값들을 수정하기 위해서

VESRETAIN을 1로 정의하 더라도 마찬가지다.

해결방법: Purge 명령어를 WBLOCK * 대신 사용한다.(블럭이 네스팅되어

있으므로 모든 값들을 Purge하기 위해서는 여러 번 Purge와 OPEN 명령어

를 반복하여 사용하는 불편한 점이 있을 수 있다). 다른 방법으로는 시작부터

318

제3 장 AutoLISP유틸리티

Page 13: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

xref 레이어를 단순하게 정의하고 WBLOCK를 사용한 후에 다시 정의하는

방법도 있겠다.

(2) Paperspace에서 플로팅을 하는 경우, 모델의 공간에서의 줌의 비율이

최근에 바뀐 경우에는, 화면에 나타나 있는 상태로 줌이 되지 아니하고 그전

단계의 줌의 비율로서 플로팅되는 경우가 있다. 용지의 공간의 크기는 올바

른 규격이며, 모델 공간으로 줌 혹은 팬이 된 관점에서의 도면은 정확하지

않다. 이를 피하기 위하여는 도면을 저장하고, 다시 열고, 이를 플롯하도록

한다.

(3) PSOUT 하는 중에 Ctrl-C를 누르면 FATAL ERROR가 발생하고 도면

을 저장하지 못한 채로 도스로 빠져 버린다.

(4) 오토캐드 도면이 자 요소를 갖고 있고 자의 위치가 정상적인 도면의

외곽 범위를 벗어 난다면, 오토캐드는 ZOOM Extend 명령을 수행하면서 혼

동한다. 먼저 이 명령어는 보이지 않는 활자의 외곽 선을 포함하여 줌을 하고,

그 다음에 그것을 포함하지 않는 작은 외곽 범위로 그것을 줄이려고 한다. 다

시 zoom e를 사용하면 이것은 작은 외곽 범위로 외곽 범위를 조절하고 이를

곧바로 큰 외곽범위로 맞추려고 한다. 이와 같이 매번 사용시 그 순서를 달리

하여 외곽 범위를 조절한다. 다음의 예로 이 사실을 확인할 수 있다.

PLINE 0,0 8410,0 8410,5940 0,5940 C

ZOOM E

TEXT 8000,5000 25 0 X

(entmod (subst (cons 1 " ") (assoc 1 (setq eg (entget

(entlast)))) eg))

319

도스용오토캐드R12c3의버그보고서

Page 14: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

SCALE C 0,0 8410,5940 0,0 .1

ZOOM E

위의 명령어 중(entmod)는 활자의 공간을 변형하기 위하여 사용되었다. 이것

은 DDEDIT을 사용하여 간단하게 대치될 수 있다. 이상의 명령을 수행하고

ZOOM E 명령어를 순차적으로 수행을 하여 보면 위에서 설명한 사실을 확인

할 수 있다. 이러한 현상을 피하려면 QTEXT를 켜고 zoom extents를 실행

하고 비어 있는 활자용 공간을 지우면 된다.

(5) "Auto"를 메뉴 매크로에서 Selection set을 설정하는 용도로 사용하는 것

에 문제가 있다. 다음의 메뉴 명령어를 보시오:

[Copy Multiple] c cSelect Au \Copy P Mul \

오토캐드의 내장된 윈도 기능으로 첫 번째 스크린에서 선택함으로서 작동이

되고, 다음 단계에서는 "W" 혹은 "C"가 입력되기를 기다린다.

위의 메뉴를 아래와 같이 변경한다면

[Copy Multiple] c cSelect \Copy P Mul \

오토캐드의 내장된 윈도 기능은 작동되지 않은 상태에서 "W" 혹은 "C"를 쳐

야지만 선택 윈도가 작동한다. 마지막으로 아래와 같이 명령을 변경한다면

[Copy Multiple] c cCopy \

오토캐드의 내장 윈도 기능은 네 번째의 버튼 동작에 작동된다. 이것을 피하는

320

제3 장 AutoLISP유틸리티

Page 15: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

방법은 메뉴 매크로에 리습 루틴을 사용하는 것이다.

(6) TILEMODE=1로 정의된 상태에서 모델 역과 용지 역 모두의 레이어에

포함된 요소들은 "thaw"된다. TILEMODE=0으로 정의하라. 용지 역에 존재

하는 레이어에 "thaw"된 요소들은 화면에 나타나지는 않지만 플롯된다. 이 요

소들을 보기 위하여는 먼저 "freeze"하고 레이어를 "thaw"하면 된다.

(7) 레이어 0에 가서 인수를 생성하고, 사용자 정의 인수로만 정의된 TEST라

는 이름의 블럭을 생성하라. HOWCOME이라는 이름의 새 레이어를 생성하

고, TEST 블럭을 이 레이어에 삽입하고 "THIS IS TEXT"라는 인수를 프롬

프트에서 삽입하라. 레이어 0를 freeze한다. "THIS IS TEXT"라는 인수값을

화면상에서 볼 수 있다. 이것은 레이어 0에서 생성된 모든 값은 삽입된 레이어

의 값을 따르도록 되어 있으므로 당연한 결과이다. 이후에 DDATATE,

ERASE, MOVE, COPY 등을 포함하는 어느 종류의 명령어를 사용하여 블

럭을 선택하도록 한다. 이 경우에 어느 기능도 작동하지 않음을 발견할 수 있

을 것이다. 이를 피하려면 THAW 레이어를 0로 설정한다.

(8) FILEDIA=1로 설정한다. 존재하지 않는 블럭을 삽입하기 위하여 아래와

같은 반복적인 명령어를 사용한다면

[Fan]* c cinsert c:/acad/elecsyms/fan

ACAD는 블럭을 찾을 수 없다는 메시지를 나타낼 것이고, * 때문에 명령을

되풀이할 것이다. 이 순간에, Cltr-C 이외의 다른 자판을 입력한다면 존재하

지 않는 블럭을 삽입하기 위한 무한 루프를 시행할 것이다. 이 경우에는 시스

템의 부팅을 다시 하는 수밖에 없다.

321

도스용오토캐드R12c3의버그보고서

Page 16: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(9) 용지 역의 Viewport에서 Zoom Extents를 실행할 경우에는, 현재의

thaw된 요소들의 외곽 선을 계산하는 것이 아니고, 모든 요소들에 대하여 외

곽을 계산한다. 이를 확인하기 위하여, 새 도면을 시작하고, (5, 5)점에 10인

치의 원을 생성하여 이를 LAYER 1로 한다. 그리고 두 번째의 원을 중심

(1000, 1000)에 반지름 10인치로 생성하고 이를 LAYER 2로 한다.

TILEMODE=0으로 세팅을 하고 두 번째의 Viewport를 생성하기 위하여

MVIEW를 사용한다. VPLAYER를 실행하고 LAYER 1을 하나의

Viewport에서 freeze하고 LAYER 2를 다른 Viewport에서 freeze한다. 이

제 각각의 Viewport에 대하여 Zoom을 실행한다. 이 경우 ACAD는 주어진

역에서만 적용된 결과가 아닌 전체의 모델에 대한 결과를 Zoom한다. 피하

는 방법은 없다.

(10) DDMODIFY 대화 상자를 부르고 취소 단추를 누른다. 외부의 명령어를

undo 하기 위하여 "U"를 입력하면, ACAD는 "그룹이 시작되었고, 더 진행하

기 위해서는 UNDO END를 입력해야 한다"는 메시지를 보내온다. 이 문제를

해결하기 위해서는 DDMODIFY.LSP 파일을 편집하여 "(ai_undo_pop)"이라는

내용을 "(defun reset ( )"이라는 줄에 추가하도록 한다.

(11) 하나의 도면에 대하여 Dview Twist를 실행하고 창문을 통하여 그릴 경

우, 새로운 대화 창에 표시된 창문의 모서리의 좌표는 선택된 실제의 좌표와

일치하지 않는다. 플롯 창문이 어떻게 나타나건 간에 실제로 선택된 좌표가 플

롯을 위하여 선택된 좌표로 사용된다. 이러한 현상은 "TARGET"이라고 불리

는 변수와 관계 있는 것으로 보여지는데, 이 변수는 DVIEW를 사용할 때 바

뀌어지지만 그것의 원래 값으로 복귀하지 않는다.(새로운 도면을 열고,

TARGET의 값을 보고, Dview Twist 값을 300으로 설정하고 그 다음에 0으

로 한 후 TARGET을 다시 보면 그 값이 변한 사실을 확인할 수 있다) 현재로

322

제3 장 AutoLISP유틸리티

Page 17: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

서는 이를 피하는 방법은 알지 못한다.

(12) 선택집합(selection set)에 새로운 요소를 추가하는 새로운 기능을

"Window"나 "Crossing" 방법을 이용하여 수행할 때, 매뉴얼과는 달리 새로

운 선택 집합으로 대치되는 것이 아니라 현재의 집합에 추가된다. 현재로서는

이를 피하는 방법을 알지 못한다.

(13) 파일 잠금 장치가 가동되는 상태에서, 새로운 도면을 생성하고 DXFIN에

서 에러를 가진 DXF 파일을 읽어 들일 경우 오토캐드는 엉뚱한 DXF 파일에

대한 에러 메시지를 생성하고, 도면 편집기를 다시 초기화하여 "unnamed"라

는 파일을 만들며, 이는 원래의 DXF 파일에 향을 미치지 아니한다. 사용자

가 동일한 이름으로 새 도면을 생성하기 위해서는 먼저 그 이름의 DXF 파일

을 지워야 한다. R12c3에서는 일부 이 기능이 교정되었다. 동일한 이름의

DXF 파일을 생성하지는 않지만 도면의 이름을 UNNAMED로 바꾼다.

(14) 파일 잠금 장치가 작동되는 상태에서, 현재의 파일을 저장하고, 약간 수

정 후, shell로 나온 후 그 DXF 파일을 지우고, 다시 오토캐드로 복귀하여

오토캐드를 종료하면 다음의 에러 메시지가 나온다.

Unable to lock file XXX.

Trying to remove a non-existant lock.

Press RETURN to continue:

이와 같은 메시지는 Cntl-C를 누를 때까지 계속하여 나오는데, 이 경우 도면

이 성공적으로 저장되고 오토캐드로부터 빠져 나오게 된다.

323

도스용오토캐드R12c3의버그보고서

Page 18: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(15) PCP 파일은 플롯 파일의 패스와 이름을 기본적으로 갖추고 있는데, 이

를 한 번 저장하고 난 후에 동일한 편집기간 중에 저장된 PGP 파일은 현재의

디폴트 플롯 파일 이름 대신, 처음으로 읽어들인 플롯 파일의 패스와 파일 이

름을 갖고 있게 된다.

(16) 새로운 TRIM을 Fence 옵션으로 폴리라인을 트리밍 경계를 두 번 이상

통과하게 되는 경우에 제대로 작동되지 않는다. 이를 피하기 위해서는 폴리라

인이 모두 없어질 때까지 트림 명령을 계속하여 사용하도록 한다.

(17) 사용자가 두 개 이상의 점으로 구성된 사용자 정의 라인 형태를 생성하는

경우, 오토캐드는 라인 형태를 정확하게 화면에 출력하거나 그리지 못한다. 예

를 들면, "3-dot"라는 이름의 라인 형태를 생성한다고 할 경우(이는 3개의 인

접한 점 이후에 넓은 간격, 그 후에 3개의 인접한 점으로 구성되어 있다고 하

자), 다음의 라인 형태의 정의를 ACAD.LIN로 보내면 된다.

*3DOTS,... ... ... ... ...

A,0,-.25,0,-.25,0,-.5

이 라인 형태를 이용하여 임의의 라인 형태를 그린다면, 몇 부분은 연속적이

고, 다른 부분의 점들은 부정확하게 간격이 띄어져 있고 연속되는 점들의 수도

다른 것을 확인할 수 있다. 이는 버전 12에서의 문제만은 아니다.

해결방법 : 완전히 효과적인 방법은 발견하지 못하 지만 폴리라인을 이용하여

라인 형태를 설정하는 방법이 문제를 최소화한다. 그러나 첫번째와 마지막의

선들은 역시 틀리게 나타나지만 연속적인 선들은 제대로 나타난다. 라인 형태

를 생성하기 위하여 버전 12의 시스템 변수 PLINEGEN을 폴리라인의 도형

324

제3 장 AutoLISP유틸리티

Page 19: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

을 생성하기 전에 1로 설정한다. Ltype 명령어의 PLUD 옵션을 이용하거나,

PEDIT 명령어를 사용하여 이미 생성된 폴리라인의 형태를 바꿀 수 있다.

(18) FILTER의 대화 상자에서, "Select..."의 종속 대화상자 중 하나의 항목

은 두 번 클릭이 되지 않는다. 오토캐드는 대화 상자를 종료해버리고, 원하는

항목은 선택되지 않는다. 이러한 상황을 만들기 위하여 여러 개의 레이어와 라

인 형태를 가진 도면을 열고, FILTER를 실행하여 Layer를 선택한다.

"Select..."를 클릭하고, 레이어의 리스트가 나타날 때 원하는 레이어의 이름

을 두 번 클릭한다. 오토캐드는 FILTER 대화 상자로 되돌아가지만, X:의

텍스트 상자에 레이어의 이름을 복사하지는 않는다. Linetype을 filter 판정

시 방법으로 사용하지 않도록 하여 문제를 피하도록 하는 것이 좋다.

(19) UNDO는 DDIM을 사용하는 경우 잘 작동되지 않는다. 이러한 문제점

은 아래의 방법으로 발견 될 수 있다.

DDIM을 실행하고 현재의 dimvars를 스타일 이름으로 저장한다. 예로서

이를 STANDARD라고 하자.

치수를 그린다.

DDIM을 다시 실행하고 여기에서 종속된 대화 상자를 사용하여 적어도 하나

이상의 Dimmension 변수를 변경하도록 하고 DDIM 대화 상자를 닫는다.

오토캐드는 Dimension style을 갱신한다. 이제 U를 입력하여 undo를 실

행한다. 오토캐드는 성공적으로 undo 기능을 수행하여 이전의 Dimension

style로 복귀한다.

325

도스용오토캐드R12c3의버그보고서

Page 20: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

DDIM을 다시 한 번 실행하면, 현재의 style 이름이 STANDARD가 아닌

*UNNAMED로 되어 있는 것을 확인할 수 있다.

(20) R12c3의 도스 버전에서 "alignment=right"의 DCL 명령어는 text에 대

하여 실행되지 않는다. 반면에 이는 텍스트가 왼쪽 끝을 기준으로 정렬되도록

한다. 이를 피하는 방법은 없다.

(21) PTEXT 프로그램을 사용하는 과정에서, "Fit"을 선택하여 <스페이스바>

를 "Text:" 상태에서 입력하면 "General Protection Exception"이라는 말이

나오고, 자동적으로 ACAD로부터 빠져 나온다. 피하는 방법은 없다.

(22) 파일을 선택하기 위해 새로운 파일 대화 상자를 사용하는 모든 명령어에

는 문제가 있다. 만약에 사용자가 파일 패턴을 이용하여 파일을 찾는데 여러

개의 해당 파일이 있어서 이를 슬라이드 바를 사용하여 화살표로 옮겨가서 선

택할 때 맨 마지막 요소로 가서 슬라이드 바를 위치시키려면 이는 자동적으로

리스트의 최초의 위치로 움직여 가게 된다. DDINSERT를 호출하여 블럭 리

스트를 작성하기 위하여 이를 몇 개의 블럭을 정의하고, * 룰 사용하여 모든

파일을 선택하여 대화상자를 호출하도록 한다. 그리고 슬라이드 바를 맨 마지

막 블럭으로 위치시킨 후 이를 풀면 이는 자동적으로 맨 위쪽의 블럭 요소로

위치하게 된다.

이러한 현상은 패턴을 바꿀 때마다 발생하는데, 두 번째부터는 이러한 현상이

없어진다. 이는 패턴을 바꾸고 첫 번째만 나타나는 현상이다. 이러한 현상은

R12에서 파일 대화 상자를 사용하는 모든 명령어에 대하여 마찬가지로 발견

된다.

(23) help 명령어에서 발견되는 경미한 버그가 있다. help 명령어를 실행하고

326

제3 장 AutoLISP유틸리티

Page 21: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

"index"를 대화상자에서 선택한다. 인덱스 리스트의 아무 항목을 두 번 클릭

한다.(예로서 3D를 사용하자) help 스크린이 화면에 떠오른다. 이제 "index"

를 다시 선택하면 대화 상자가 떠오르고 아직도 선택된 항목이 하일라이트되

어 있다. 이 상태에서 "OK"를 선택하면 하일라이트가 되어 있는 항목이 있음

에도 불구하고 "Nothing selected"라는 메시지가 출력된다. 그 항목을 선택

하기 위해서는 "OK" 아닌 그 항목을 다시 클릭하여야 한다.

(24) TIFF 파일을 보기 위하여 REPLAY를 실행하고 보기 위한 파일 이름을

대화상자에서 두 번 클릭하면 제대로 동작한다. 다시 REPLAY를 호출하면 이

전에 입력된 이름의 파일이 초기 값으로 되어 있다. 이때 "OK"를 클릭하면

"Error: can't locate file"이라는 에러 메시지가 출력된다. RETURN을 쳐도

역시 같은 결과를 얻으며 파일 이름을 두 번 클릭하면 제대로 동작한다.

(25) ADS Reference Manual 인덱스는 GraphScr, TextScr, Redefine,

Undefine, Script, RScript, Resume와 같은 오토캐드 명령어에 대한

reference가 없다.

(26) ADS 리퍼런스 매뉴얼 108 페이지에 있는 ads_entmake()를 사용하여

폴리라인을 생성하는 예제는 완성되어 있지 않다. VERTEX와 SEQEND에

대하여 라인 형태와 색상이 생략되어 있다. 라인 형태와 색상에 대하여

ads_buildlist( )에 의하여 정의되지 않으면, AUDIT 명령어는 예제를 실행한

후 몇 가지 에러 메시지를 보고한다.

(27) ATTEXT는 필드의 길이를 95 문자로 제한하는데 실제로 인수 값들은

256 문자까지로 표현될 수 있다. 문제는 ATTDEF의 한계가 256 문자인 것

보다 ATTEXT 명령어가 100 문자 이상의 문자를 수용하지 않는다는 것이

327

도스용오토캐드R12c3의버그보고서

Page 22: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

다. 'POINT C101000'을 입력하면 에러를 발생하게 되고 인수 인출을 할

수 없다.

(28) viewpoint를 scale 하는 것은 1532와 1576번째 줄의 버그 때문에

MVSETUP.LSP를 파괴한다.(command "_.ZOOM"(strcat (mv_sts vp_

scale) "_xp"))의 명령어는 "<임의의 숫자>_xp"의 형태로 ZOOM 명령어로 발

생하는데 이는 에러를 발생한다.

(29) VSETUP.LSP에서 타이틀 블럭을 선택하는 #12의 [Arch/Engineering

(24 x 36 in)] 2219와 3017의 스트링이 일치하지 않기 때문에 제대로 동작하

지 않는다. 이유는 타이틀 블럭에 있는 스트링이 일치하지 않기 때문이다.

2219 줄은 다음과 같다.

;;; Arch/Engineering (24 x 36in) ,arch-a.dwg,(1.0 1.0

0.0),(30.5 23.0 0.0),in

3097번째줄은다음과같다.

;;; NAME - Arch/Engineering (24 x 36)

문자열 "Arch/Engineering (24 x 36in)"은 "Arch/Engineering (24 x

36)"와 일치하지 않으므로 MVSETUP은 제대로 운용되지 않는다.

문제를 해결하기 위해서는 2219번째 줄의 타이틀에 따라오는 공간에서 다음의

사항을 고치도록 한다.

328

제3 장 AutoLISP유틸리티

Page 23: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

;;; Arch/Engineering (24 x 36in),arch-a.dwg,(1.0 1.0

0.0),(30.5 23.0 0.0),in

^스페이스를제거한다

3097 번째줄에 "in"을추가한다.

;;; NAME - Arch/Engineering (24 x 36in)

마지막으로 결함이 있었던 MVSETUP.LSP에 의해서 생성된 MVSETUP.

DFS 파일을 지우도록 한다.

(30) WPolygon, CPolygon, Fence 등의 옵션을 사용하여 transparent

zoom을 실행할 때 오토캐드는 틀의 외곽을 갱신하지 않는다. 이것은 마치

zoom 이후에 폴리곤을 갱신하기 위해 grdraw를 실행하는 것과 같다. 이는

현재까지의 폴리곤을 생성한 과정에 대한 시각적인 기록이 되지 않아 사용자

가 불편하다. 이는 또한 zoom 이전에 있었던 러버-밴드 폴리곤에 관한 디스플

레이에도 문제를 발생한다.

(31) VPLAYER는 XREF의 레이어들을 동결(freeze)할 수 있으나, 사용중

XREF가 떨어질 경우에는 다시 푸는 작업(thaw)을 할 수 없다. DXFOUT

실행 중에는 DXF 파일의 VPORT를 참고하게 되고 이것은 유효하지 않은 파

일을 지시하게 된다. 이와 같은 동작 예를 들면 다음과 같다.

CHILD라는 도면이 ONE, TWO라는 두 개의 레이어를 갖도록 하고 각각

의 레이어에 원을 하나씩 만들고 이 도면을 저장한다.

PARENT, XREF CHILD라는 이름의 도면을 만든다.

329

도스용오토캐드R12c3의버그보고서

Page 24: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

TILEMODE를 끈다.(이는 paper space로 돌아감을 뜻한다)

MVIEW를 사용하여 VPORT를 생성한다.

VPLAYER를 사용하여 새로운 VPORT에서 CHILD|ONE을 동결한다.

CHILD Xref를 분리한다.

DXFOUT로 도면 PARENT를 PARENT.DXF로 저장한다.

새로운 도면을 만들기 위하여 NEW 명령어를 사용하고, 특별한 프로토타

입은 설정하지 않는다.

DXFIN PARENT.DXF를 입력하면 "Invalid layer name in 1003

group on line <line_number>"의 에러 메시지가 발생된다.

문제점은 VPLAYER는 일단 XREF가 분리된 레이어를 지울 수 없다는 것이

다. 이는 도면 편집기가 실행되어 있는 상태에서만 가능하다. 이러한 현상을

피하기 위하여 다음의 절차를 취하도록 한다.

XREF를 분리하고, 도면을 저장하고, 도면을 다시 열고 난 후에

DXFOUT을 실행한다.

VPORT를 지우고, 동일한 크기의 새로운 도면을 생성하고, 다른

VPLAYER 설정 값들을 reset한다.

(32) "0" 레이어는 DEFPOINTS 레이어에 위치한 객체의 가시성(visibility),

색, 라인 형태 등을 제어한다. 이를 알고 있을 때는 문제가 되지 않지만, 이는

정상적인 오토캐드 운용에서 모순이 된다. 이는 일반적으로 DEFPOINTS 레

이어에 위치한 객체의 레이어와 색, 라인 형태들은 BYLAYER에 의해서 제어

된다.

330

제3 장 AutoLISP유틸리티

Page 25: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

3. 3차원 가구전용 심볼 도면

TRINICO는 건축에서의 3차원 심볼들을 다루기 위한 매크로 메뉴로 구성되

어 있으며 오토캐드 버전 10에서 운용된다.

"Symb"라고 불리는 디렉토리를 열고 그 곳의 모든 심볼과 "Trinico.Mnu"

를 오토캐드 디렉토리에 복사한다. Trinico.Mnu는 단지 사용자가 나름대로

AcadMnu를 변경하여 사용할 경우에 이를 유지할 수 있도록 배려한 것이

다. 숙달된 사용자라면 사용자 메뉴에 단순히 "Symb" 매크로를 더할 수도

있다.

심볼들은 bedroom, living, dining, kitchen, office, plumbing,

electrical, exterior 등으로 주어져 있으며 모든 것은 3차원으로 되어 있고,

모든 심볼의 elevation은 0으로 되어 있다. 그것은 모든 "First Floor Plan"

에 삽입될 준비가 되어 있다. 지하층이나 2층 이상의 경우에 대하여는 삽입 후

elevation을 수정하도록 한다. 가장 좋은 방법은 "Vports"를 사용 전면도에서

값을 조정하고, "Eyebird"를 0도로 설정하는 방법이다.

331

3차원가구전용심볼도면

<그림 3-3>

bedroom의 심볼들

Page 26: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

"Ph"와 "Lampnite" 이외의 대부분의 심볼은 회전각을 묻는다. 이 두 가지

는 "Bureau", "Dresser", "Coftable", "cabinets counter top" 등에 사용될

때 elevation을 요구한다.

"Lampnite", "Ceiling-fan", "Dining4", "Rndtable" 등은 회전각이 필요

332

제3 장 AutoLISP유틸리티

<그림 3-4>

living의 심볼들

<그림 3-5>

dining의 심볼들

Page 27: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

없는데 이는 회전형태를 갖추고 있기 때문이다.

kitchen에서 모든 기본적인 캐비넷, 레인지, 냉장고 등을 삽입하고, "Zoom

Window"와 "Move"를 사용하여 모든 캐비넷, 레인지, 냉장고 등을 자리에

위치시킨다. 카운터의 위에 캐비넷을 위치시키기 위해서는 캐비넷의 상단 좌

333

3차원가구전용심볼도면

<그림 3-6>

kitchen의 심볼들

<그림 3-7>

office의 심볼들

Page 28: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

측 모서리에 포인터를 위치시킨다. 카운터 심볼은 "x", "y"축으로의 길이를 물

어온다. 예를 들어 사용자가 x축에 "B48", "B36", "B24"를 순서대로 갖고 있

다면, "Counter>" 심볼이 "Pick a point"라고 물어올 때 "B48"의 상단 좌측

의 점을 선택하고, "x factor"라고 물어올 때 108을 치고(이는 48, 36, 24를

334

제3 장 AutoLISP유틸리티

<그림 3-8>

plumbing과

electrical의 심볼들

<그림 3-9>

exterior의 심볼들

Page 29: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

더한 값이다), "y factor"라고 물어올 때 25를 친다.(이는 캐비넷의 높이에 1

을 더한 값이다). 만약 y축에 대하여 정렬할 경우 치수의 값들이 달라진다.

"x"=25이고, "y"=108이다. 두께는 항상 2이다. 그 후에 벽장을 삽입하고, 렌

지 후드를 설치한다. 설치하기 위하여 밑의 캐비넷을 같은 것을 사용한다.

"Furred"는 "Counter"와 동일하게 작동한다.

이 소프트웨어를 만족하게 사용하 다면, 다음 주소로 기금을 보내면 된다.

최신 버전에 대한 상세한 정보를 얻을 수 있다.

TRINICO

Francisco Trinidad

P.O. Box 88

Lozano, Tx. 78568

Ph.(512) 399-0469

335

3차원가구전용심볼도면

Page 30: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

4. 테크니컬 디자인사의 3D PEOPLE 모델링

3D PEOPLE은 매우 독특한 오토캐드 라이브러리이다. 이 라이브러리는 세

개의 DWG 파일로 구성되어 있으며(이는 세 명의 남자와 세 명의 여자로 구

성되어 있다). 이 세 남자는

- 일반적인 남성

- 평상복을 입은 남성

- 정장을 입은 남성

으로 구성되어 있다. 세 명의 여성은

- 일반적인 여성

- 가운을 입은 여성

- 정장을 입은 여성

으로 구성되어 있다.

세 모델은 아주 정교하게 상호 위치하고 있으며 풀다운 메뉴를 사용하여 내장

336

제3 장 AutoLISP유틸리티

<그림 3-10>

사무실의 남자

Page 31: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

된 프레임 워크를 사용하고 관절을 이용하여 포즈를 취할 수 있도록 되어 있다.

3-D PEOPLE은 실제로 3차원 모델이며 사용자의 2차원 혹은 3차원 도면

에서 쉽게 이용될 수 있다. 이는 와이어 프레임 혹은 쉐이디드 모델 모두를 이

337

테크니컬디자인사의3D PEOPLE 모델링

<그림 3-11>

기본 프레임

<그림 3-12>

중간 프레임

Page 32: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

용하여 볼 수 있다.

(1) 데모를보는법

시작하려면 아래에 리스트된 모든 파일을 사용자 디렉토리에 복사한다. 슬

라이드 프로그램은 오토캐드 내부에서 돌아간다. 그러므로 오토캐드에 들어간

뒤, 초기 화면에서 "2"를 치고 기존의 파일을 편집한다. "3DPEOPLE"의 도

면을 편집하고 스크린의 프롬프트의 명령에 따라 진행한다. 데모 디스켓은 다

음의 파일들을 갖고 있다.

README.BAT README PROGRAM을 읽기 위한 파일

DEMO.DOC 소개 도큐먼트

INS1-INS3.DOC 인스트럭션 도큐먼트

ORDER.DOC 주문 양식

3DPEOPLE.SCR 슬라이드 프로그램을 위한 스크립트 파일

3DPEOPLE.DWG 슬라이드 프로그램을 위한 Autocad 도면

338

제3 장 AutoLISP유틸리티

<그림 3-13>

옷을 입은 모양

Page 33: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

3DPEO-1.SLD ..

3DPEO-18.SLD 프로그램을 위한 슬라이드

Script에서 3DPEOPLE을 입력하면 슬라이드를 진행한다.

339

테크니컬디자인사의3D PEOPLE 모델링

<그림 3-14>

옷을 입은 여자

Page 34: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

5. 3DSPIRAL

본 절은 Ben Olasov에 의해서 1995년에 인터넷에 게재된 내용이다.

본 리습 프로그램은 원형의 평면이나 폴리라인으로 표현된 어떠한 임의의

형태에 관해 스파이럴을 생성하는 프로그램이다. 종전에 존재하는 형태를 3차

원 스파이럴에 투사하기 위해서는 [O]의 선택사양을 선택하고, 투사할 폴리라

인의 형태를 클릭하면 된다. 3DSPIRSL 프로그램은 시계방향 혹은 반시계방

향의 원하는 방향으로 스파이럴을 생성한다.

;; File: 3DSPIRAL.LSP Copyright (C) Ben Olasov 1995 [email protected] ;;

;; 3DSPIRAL creates a spiral based on a circular plan view or based

;; on any shape described as a polyline entity. To project a pre-existing

;; shape to a 3D spiral, select the [O]ther option, and then pick the

340

제3 장 AutoLISP유틸리티

<그림 3-15>

프로그램 3DSPIRAL의

실행 결과

Page 35: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

;; polyline shape to project. 3DSPIRAL will create spirals in either

;; clockwise or counter-clockwise rotational direction.

;; divide_pline function fixed 05/11/95

(setq c:3dspiral nil c:3ds nil c1 nil)

(gc)

(vmon)

(defun c:3dspiral (/ _cp z_min *c1 c1_rad perim_p1 incr dlta_z c1_pts) ;; 주프로그램

(modesave '("cmdecho" "blipmode"))

(setvar "cmdecho" 0)

(setvar "blipmode" 0)

(graphscr)

(setq circ?

(strcase (userstr (if circ? circ? "O")

"\n\nUse [C]ircle or [O]ther shape for spiral")))

(if (equal circ? "C")

(progn (princ "\nDrawing plan view of spiral")

(setq _cp (getpoint "\nCenterpoint of spiral: "))

(princ "\nRadius: ")

(command "_circle" _cp pause)

(setq z_min (getvar "elevation")

c1 (entlast)

*c1 (entget c1)

c1_rad (cdr (assoc 40 *c1))

perim_p1 (polar _cp 0 c1_rad)

341

3DSPIRAL

Page 36: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

res (userint (if res res 50)

"\nRes of @ rotation")

lngth (userdist _cp (if lngth lngth

(* c1_rad 3.0))

"\nOverall hgt of spiral")

num_thrds (userint (if num_thrds num_thrds 10)

"# rotations")

unit_lngth (/ lngth num_thrds)

incr (/ unit_lngth res)

c1_pts (divide_pline c1 res perim_p1))

(entdel c1))

(progn (setvar "cmdecho" 0)

(setq c1 (user_ent "POLYLINE"

"\nPick a contour to define spiral outline: ")

_cp (getvar "lastpoint"))

(if (null (ssget _cp))

(if (null (ssget (setq _cp op)))

(setq _cp (osnap (getpoint "\nReselect contour: ")

"nea"))))

(setq op (trans (origin_pt c1) c1 1)

res (userint (if res res 50)

"\nRes @ rotation")

c1_pts (divide_pline c1 res _cp)

_ctr (centroid c1_pts))

(setq z_min (getvar "elevation")

*c1 (entget c1)

342

제3 장 AutoLISP유틸리티

Page 37: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

c1_rad (distance _ctr op)

lngth (userdist _cp (if lngth lngth

(* c1_rad 3.0))

"\nOverall height of spiral")

num_thrds (userint (if num_thrds num_thrds 10)

"\n# rotations")

unit_lngth (/ lngth num_thrds)

incr (/ unit_lngth res))))

(setq cw?

(strcase (userstr (if cw? cw? "N")

"[N]ormal or [R]everse rotation")))

(draw_3dspiral _cp (if (not (equal cw? "N"))

(setq c1_pts (reverse c1_pts)) c1_pts) z_min incr num_thrds dlta_z)

; (command "_vpoint" "1,-1,1") ;; 3차원의관점을원하면삭제한다.

(moderestore))

(defun draw_3dspiral (%%cp pt_lst z_mn z_inc num_thr delta_z / in)

;; 3dpoly를이용하여spiral을그린다.

(setq %cp (xy %%cp) thr_n 0 num_pts (length pt_lst) z_base_ext1 z_mn)

(command "_3dpoly")

(repeat num_thr

(setq in 0)

(repeat num_pts

(setq v1 (if (nth in pt_lst)

(nth in pt_lst) (car pt_lst))

v1 (append (xy v1) (list z_base_ext1)))

343

3DSPIRAL

Page 38: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(command v1)

(setq in (1+ in)

z_base_ext1 (+ z_base_ext1 z_inc)))

(setq thr_n (1+ thr_n)))

(command ""))

(defun XY (pt) ;; 3차원의점을2차원으로변환한다.

(list (car pt) (cadr pt)))

;; AutoDesk 의MODE 를변환하 음.

;; 예제는다음과같이사용한다: (modesave '("cmdecho" "blipmode"))

(defun modesave (a) ;; 시스템변수를저장하여둔다.

(setq c_lay (getvar "clayer")

mlst '())

(repeat (length a)

(setq mlst (append mlst (list (list (car a) (getvar (car a))))))

(setq a (cdr a))))

(defun moderestore () ;; 시스템변수를다시읽어들인다.

(if (and c_lay

(= (type c_lay) 'STR) ;;in case something redefined it

(/= c_lay (getvar "clayer")))

(command "_layer" "_s" c_lay ""))

(repeat (length mlst)

(setvar (caar mlst) (cadar mlst))

344

제3 장 AutoLISP유틸리티

Page 39: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(setq mlst (cdr mlst)))

(terpri) 'done)

(defun userdist (refpt dflt prmpt / var) ;; 사용자정의입력을distance로읽어들인다.

;; default 입력을정의할수있다.

(if (setq var

(getdist (if refpt refpt)

(if dflt (strcat prmpt " <" (rtos dflt 4 5) ">: ")

(strcat prmpt ": ")))) var dflt))

(defun userint (dflt prmpt / var) ;; 사용자정의입력을정수로읽어들인다.

;; 디폴트입력을정의할수있다.

(if (setq var

(getint (if dflt (strcat prmpt " <" (itoa dflt) ">: ")

(strcat prmpt ": ")))) var dflt))

(defun userstr (dflt prmpt / var) ;;사용자정의입력스트링을읽어들인다.

;; 디폴트입력을정의할수있다.

(setq var (getstring t (if (and dflt (/= dflt ""))

(strcat prmpt " <" dflt ">: ")

(strcat prmpt ": "))))

(cond ((/= var "") var)

((and dflt (= var "")) dflt)

(T dflt)))

(defun divide_pline (enm n_vrts_ _pt_ / node-1 node-n node1 noden pt_ss pt_l$$)

;; 폴리라인을나눈다.

345

3DSPIRAL

Page 40: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(setvar "cmdecho" 0)

(command "_undo" "_m")

(setq clayer (getvar "clayer"))

(make_la "$PT$")

(command "_divide" _pt_ (1+ n_vrts_))

(setq pt_ss (ssget "x" (list (cons 0 "POINT")

(cons 8 "$PT$")))

pt_l$$ (ss2nodelist pt_ss)

pt_ss nil)

(gc)

(command "_u")

(command "_layer" "_s" clayer "")

pt_l$$)

;; SS2NODELIST는선택집합SS의구성요소들의

;; 원점의리스트를출력한다.

(defun ss2nodelist (ss / *ent* pt pts &i ssl)

(if (or (null ss) (/= (type ss) 'PICKSET)) nil

(progn (setq &i 0

ssl (sslength ss))

(while (/= &i ssl)

(setq ent (ssname ss &i)

*ent* (entget ent)

pt (cdr (assoc 10 *ent*))

pts (cons pt pts))

346

제3 장 AutoLISP유틸리티

Page 41: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(setq &i (1+ &i))))) pts)

(defun origin_pt (pln) ;; 폴리라인의원점의값을출력한다.

(if (equal (cdr (assoc 0 (entget pln))) "POLYLINE")

(cdr (assoc 10 (entget (entnext pln))))

(cdr (assoc 10 (entget pln)))))

(defun make_la (%nam%) ;; %nam% 이름의새로운레이어를만든다.

(if %nam%

(progn (setq %clay (getvar "clayer"))

(if (layerp %nam%)

(if (not (equal %clay %nam%))

(command "_layer""_t"%nam%"_on"%nam%"_s"%nam%""))

(command "_layer" "_m" %nam% "")))))

;;; 레이어의이름이존재하면T, 그렇지않으면NIL을출력한다.

(defun layerp (layername)

(if (null layername) nil

(if (member (strcase layername) (listify_layers))

'T nil)))

(defun collect_vertices (polyln / __ent *polyln* ##pt ##pts)

;; 폴리라인의꼭지점들의리스트를구한다.

(if (= (cdr (assoc 0 (setq *polyln* (entget polyln)))) "POLYLINE")

(progn (setq __ent (entnext polyln))

(while (setq *ent* (entget __ent)

347

3DSPIRAL

Page 42: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

##pt (cdr (assoc 10 *ent*)))

(setq ##pts (cons (trans ##pt polyln 1) ##pts)

__ent (entnext __ent)))

; (if (not (equal (car ##pts) (last ##pts)))

; (setq ##pts (reverse (cons (car ##pts) (reverse ##pts)))))

)

(princ "\ncollect_vertices: not a POLYLINE."))

##pts)

;;; 도면에존재하는모든레이어의값을구한다.

(defun listify_layers (/ layer layers nam)

(setq layer (cdr (assoc 2 (tblnext "layer" T))) ;;rewind layer table

layers (list layer))

(while (setq layer (tblnext "layer")) ;;construct layer list

(setq nam (cdr (assoc 2 layer))

layers (cons nam layers))) layers)

(defun extract_value (key enm) ;; enm에서key와관련된값을구한다.

(if enm (cdr (assoc key (entget enm)))))

(defun user_ent (_ent_type _prm / __ent)

(while (not (equal (extract_value 0

(setq __ent (car (entsel _prm))))

_ent_type))) __ent)

;; 2차원혹은3차원의꼭지점들의중심값으로된리스트를구한다.

(defun centroid (verts / num_verts x_avg y_avg z_avg centrd)

348

제3 장 AutoLISP유틸리티

Page 43: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(if (or (null verts)

(null (listp verts)))

nil

(setq verts (unique_atoms verts)

num_verts (length verts)

x_avg (/ (apply '+ (mapcar 'car verts)) num_verts)

y_avg (/ (apply '+ (mapcar 'cadr verts)) num_verts)

z_avg (/ (apply '+ (mapcar 'caddr verts)) num_verts)

centrd (list x_avg y_avg z_avg))) centrd)

(defun 2d (&pnt) ;; 2차원점으로의변환

(list (car &pnt) (cadr &pnt)))

(defun unique_atoms (lst / tmp unique_lst)

(setq tmp lst)

(repeat (length lst)

(if (null unique_lst)

(setq unique_lst (list (car tmp)))

(if (not (member (car tmp) (cdr tmp)))

(if unique_lst

(if (not (member (car tmp) unique_lst))

(setq unique_lst (cons (car tmp) unique_lst))))))

(setq tmp (cdr tmp)))

(reverse unique_lst))

;; 노드의집합으로부터pt에가장가까운점을찾는다.

(defun closest (pt nodes)

349

3DSPIRAL

Page 44: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(nth

(pos_in_list

(apply 'min (mapcar '(lambda (node) (distance pt node)) nodes))

(mapcar '(lambda (node) (distance pt node)) nodes))

nodes))

;; POS_IN_LIST는 LST에서의 ITEM의위치의번호를출력한다.

;; NTH와함께사용할수있다.

(defun pos_in_list (item lst)

(if (null (member item lst))

nil

(- (length lst) (length (member item lst)))))

(setq c:3ds c:3dspiral)

(princ)

(c:3dspiral)

350

제3 장 AutoLISP유틸리티

Page 45: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

6. 교차로 제작 프로그램

본 프로그램은 두 쌍의 평행선이 교차하는 경우 교차점들 내부에 생성되는

선들을 제거하여 교차로의 형태로 도면을 출력한다.

;======================================================

;Cleans up a "T" junction from 2 pairs of crossing parallel LINEs.

;======================================================

(DEFUN C:4INT (/ B P1 P2 P3 P4 P5 P6 P7 P8)

(SETVAR "CMDECHO" 0)

(SETQ B (GETVAR "OSMODE"))

(SETVAR "OSMODE" 32)

(SETQ P1 (GETPOINT "\nEnter 1st intersection: ")

P2 (GETPOINT "\nEnter 2ND intersection in CCW sequence: ")

P3 (GETPOINT "\nEnter 3rd intersection in CCW sequence: ")

351

교차로제작프로그램

<그림 3-16>

교차로 제작 프로그램의

실행 결과

Page 46: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

P4 (GETPOINT "\nEnter 4th intersection in CCW sequence: ")

P5 (POLAR P1 (ANGLE P1 P2)(/ (DISTANCE P1 P2)2))

P6 (POLAR P2 (ANGLE P2 P3)(/ (DISTANCE P2 P3)2))

P7 (POLAR P3 (ANGLE P3 P4)(/ (DISTANCE P3 P4)2))

P8 (POLAR P4 (ANGLE P4 P1)(/ (DISTANCE P4 P1)2))

)

(COMMAND "BREAK" P5 "F" P1 P2

"BREAK" P6 "F" P2 P3

"BREAK" P7 "F" P3 P4

"BREAK" P8 "F" P4 P1

)

(SEVAR "OSMODE" B)

)

프로그램은 먼저 COMMAND ECHO를 0로 정의하여 입력되는 값들이 디

스플레이 되지 않도록 하고, 현재의 OSMODE 의 값을 저장하고 이 값을 32

로 설정한다. 이는 선택하고자 하는 점이 구체적으로 어떠한 종류인지를 지정

한다.

두 쌍의 평행선의 교차는 4개의 교차점을 생성한다. 이 4개를 반시계 방향

으로 선택하여 이를 P1, P2, P3, P4의 이름으로 저장하고 P1과 P2의 중간

점으로 P5, P2와 P3의 중간 점을 P6, P3와 P4의 중간 점을 P7, P4와 P1의

중간 점을 P8으로 정의한다.

이와 같은 중간 점들을 이용하여 BREAK 하는 방법을 제시할 수 있다. 즉

P5를 선택하면 하나의 선이 선택되고, 이를 P1 P2의 점으로 잘라내는 것이

가능하다. 이와 같은 방법으로 4번의 BREAK 명령을 실시하고, 종래의

OSMODE의 값으로 환원한 뒤 프로그램을 종료한다.

352

제3 장 AutoLISP유틸리티

Page 47: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

7. 오토캐드 유틸리티

아래의 네 가지 오토캐드 유틸리티는 John B. Mauldin에 의해서 개발된

것으로 도면을 읽고 저장하고 변경하는 기능들은 쉽게 처리하도록 도와주는

기능을 갖고 있다.

(1) INSRTDWG.EXE를 사용하기 위해서는 INSRTDWG를 도스 패스에 설

정하고, ACAD.PGP 파일을 아래와 같이 수정한다

INSRTDWG,DOSpath\INSRTDWG [parameters],150000,,4

이 파라미터들은 더 많은 파일이 있을 경우에 증가할 필요가 있다. [ ] 안의

내용은 옵션 파라미터이며, DOSpath는 INSRTDWG.EXE가 있는 곳으로의

패스이다.

버전 10을 사용하는 경우 ACAD.MNU는 다음과 같이 수정한다.

다음을 찾는다.

***POP7

[File]

(추가할내용) [Insert Drawing] C^C^CINSRTDWG;SCRIPT;SELDWG

다음을 찾는다.

***SCREEN

353

오토캐드유틸리티

Page 48: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

**S

[AutoCAD]C^C$S=X $S=S $P1=POP1 $P3=POP3

[* * * *]$S=OSNAPB

(추가할내용) [IsrtDwg] C^C^CINSRTDWG;SCRIPT;SELDWG

[Setup]CCP(progn(prompt "Loading setup... ")(load "setup")) P$S=X $S=UNITS

커서를 원하는 파일에 위치한 후 리턴하거나, 원하는 파일 이름에 "."을 추가

한 내용을 입력하거나, 파일 확장자 이름을 포함한 전체 이름을 입력한다.

ESC를 입력하여 오토캐드 주 메뉴로 들어간다.

드라이브를 바꾸기 위해서 Alt-C를 친다.(드라이브의 이름 + ':' 예를 들면:

D: or D:\)

** NEW ** 스페이스 바는 파일의 표현방식을 두 가지로 보여준다.

파일을 새로 만들거나 바꾸기 위해서 커서를 파일 이름에 위치시키고 F2 자판

을 치도록 한다.

F1 자판을 치면 도움말을 볼 수 있다.

INSRTDWG는 다음의 4개의 명령어 파라미터 옵션이 있다.

/C: = 열의 길이 1부터 5까지(디폴트 = 4).

/D: = 드라이브나 서브 디렉토리(디폴트 = 현재 드라이브와 서브 디렉토리).

/S: = 소트 (Name, Time 등).

/O: = 소트 순서 (Ascending, Descending).

** NEW **

/X 파일 디스크립션 모드를 시작한다.

소트 명령은

/C: 1-5 파일 열의 길이.

354

제3 장 AutoLISP유틸리티

Page 49: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

/D: 드라이브\서브 디렉토리

/S:D 도스의 소트 순서.

N 파일 이름으로 소트.

S 파일 크기로 소트.

T 파일 생성 시간으로 소트.

/O:A Ascending.

D Descending.

이상의 파라미터는 순서에 상관없이 사용된다.

예:

1) INSRTDWG /D:C:\ACAD\BLOCKS일 때 디폴트 디렉토리는 C:\ACAD\BLOCKS에서

시작한다.

2) INSRTDWG /D:C:\ACAD\BLOCKS /C:2인 경우 INSRTDWG는 C:\ACAD\BLOCKS

디렉토리에서 시작되며 두 개의 파일 열로서 화면에 출력된다.

355

오토캐드유틸리티

<그림 3-17>

INSTRDWG의

실행화면

Page 50: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

3) INSRTDWG /C:2 /S:N /D:C:\ACAD\BLOCKS /O:A인 경우 디렉토리는

C:\ACAD\BLOCKS에서 시작되며 두 개의 파일 열로서 이름에 의한 순서로 표시된다.

(2) LOADLSP를 사용하기 위해서는 LOADLSP를 도스 패스에 설정하고,

ACAD.PGP 파일을 아래와 같이 수정한다

LOADLSP,DOSpath\LOADLSP [parameters],150000,,4

이 파라미터들은 더 많은 파일이 있을 경우에 증가할 필요가 있다. [ ] 안의

내용은 옵션 파라미터이며, DOSpath는 LOADLSP.EXE가 있는 곳으로의

패스이다.

버전 10을 사용하는 경우 ACAD.MNU는 다음과 같이 수정한다.

다음을 찾고 추가한다.

***POP7

[File]

(추가할내용)

[Save & Select New Drawing] C^C^CLOADLSP;SCRIPT;SELDWG

다음을 찾는다.

***SCREEN

**S

[AutoCAD]C^C$S=X $S=S $P1=POP1 $P3=POP3

356

제3 장 AutoLISP유틸리티

Page 51: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

[* * * *]$S=OSNAPB

(추가할내용) [LoadLsp] C^C^CLOADLSP;SCRIPT;SELDWG

[Setup]CCP(progn(prompt "Loading setup... ")(load "setup")) P$S=X $S=UNITS

모든 리습 파일을 불러들일 수 있기 위하여는 각 파일의 첫 번째 줄에는 ;

이후에 곧바로 다음의 명령어를 갖고 있도록 한다.

예; 만약 사용자의 파일이 'START'로 시작된다면 다음의 내용을 첫째 줄에 포함하도록

한다.

;START

LOADLSP 프로그램은 첫째 줄을 그 리습 프로그램을 작동하기 위한 명령어

로 해석한다. 이후의 내용은 리습 프로그램으로 해석되므로 그 내용은 변경되

지 않는다.

커서를 원하는 파일에 위치한 후 리턴 하거나, 원하는 파일 이름에 "."을 추가

한 내용을 입력하거나, 파일 확장자 이름을 포함한 전체 이름을 입력한다.

ESC를 입력하여 오토캐드 주 메뉴로 들어간다.

드라이브를 바꾸기 위해서 Alt-C를 친다.(드라이브의 이름 + ':' 예를 들면:

D: or D:\)

** NEW ** 스페이스 바는 파일의 표현방식을 두 가지로 보여준다.

파일을 새로 만들거나 바꾸기 위해서 커서를 파일 이름에 위치시키고 F2 자판

을 치도록 한다.

F1 자판을 치면 도움말을 볼 수 있다.

LOADLESS는 다음의 4개의 명령어 파라미터 옵션이 있다.

/C: = 열의 길이 1부터 5까지 (디폴트 = 4).

357

오토캐드유틸리티

Page 52: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

/D: = 드라이브나 서브 디렉토리 (디폴트 = 현재 드라이브 와 서브 디렉토리).

/S: = 소트 (Name Time 등).

/O: = 소트 순서 (Ascending Descending).

** NEW **

/X 파일 디스크립션 모드를 시작한다.

소트 명령은

/C: 1-5 파일 열의 길이.

/D: 드라이브\서브 디렉토리

/S:D 도스의 소트 순서.

N 파일 이름으로 소트.

S 파일 크기로 소트.

T 파일 생성 시간으로 소트.

/O:A Ascending.

D Descending.

이상의 파라미터는 순서에 상관없이 사용된다.

예:

1) LOADLSP /D:C:\ACAD\LISP일 때 디폴트 디렉토리는 C:\ACAD\LISP에서 시작한다.

2) LOADLSP /D:C:\ACAD\LISP /C:2인 경우 INSRTDWG는 C:\ACAD\LISP 디렉토리에

서 시작되며 두 개의 파일 열로서 화면에 출력된다.

3) LOADLSP /C:2 /S:N /D:C:\ACAD\LISP /O:A인 경우 디렉토리는 C:\ACAD\LISP에

서 시작되며 두 개의 파일 열로서 이름에 의한 순서로 표시된다.

VIEWSLD, INSTRDWG에 대해서도 마찬가지로 적용되며 자세한 내용은

디스켓에 수록된 내용을 참고하도록 한다.

358

제3 장 AutoLISP유틸리티

Page 53: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

8. ATTPROP 프로그램

블럭에 포함된 속성(attribute)의 내용을 변경하는 프로그램으로 Dru

Smith에 의해서 1994년 인터넷에 게재된 내용이다.

프로그램 attprop.lsp를 로딩하고 (attprop "선택 사양")의 형태로 실행을

한다. 선택사양의 종류로 s는 스타일을, h는 높이를, w는 넓이를, a는 각도

를, c는 색을, l은 레이어를 변경할 수 있다.

먼저 하나의 블럭이 원과 세 개의 인수로 이루어진 경우를 생각하여보자.

circle 명령어를 이용하여 임의의 크기의 원을 생성하고 attdef를 이용하여

center, radius, material이라는 세 개의 tag name을 갖는 인수를 생성하

자. 이를 하나의 블럭으로 인식하기 위하여 먼저 block 명령어를 실행하여 임

의의 블럭 이름을 주고 4개의 요소(하나의 원과 세 개의 인수들)을 선택하도록

한다. 이 블럭을 이용하여 추가할 때는 insert를 사용하면 된다. 블럭을 각각

삽입할 경우에는 인수들의 값을 물어오며 이 값을 주면 지정된 도면의 위치에

인수의 값이 설정된다. 이 상태에서 원하는 바대로 인수의 크기 및 성질을 조

절하는 것이 가능하다.

(load "c:attprop")을 실행하여 attprop.lsp 프로그램을 로딩하고, 이를 실

행하기 위하여 (attprop "선택 사양")을 입력한다. 이때 선택사양을 s로 하면

스타일을, h로 하면 높이를, a면 각도를, c로 하면 색을, l로 하면 레이어를

조절할 수 있다. 아래의 프로그램은 블럭의 material 인수의 높이를 0.4로,

center 인수의 넓이를 2배로 조정한 결과와 이의 실행시 명령어 입력 절차를

보여준다.

; ATTPROP.LSP

; load: (load "c:/lisp/attprop) [or whatever the pathname is]

359

ATTPROP 프로그램

Page 54: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

; syntax: (attprop "s")

; ["s" for style

; "h" for height

; "w" for width factor

; "a" for angle

; "c" for color

; "l" for layer]

; Prompts for block name or default <Pick>

; Then lists attributes contained in that block

; and prompts for attribute name

;

;created by Dru Smyth CIS 74037,2434

;(c)1994 VHB, Inc.

;

(defun newerr (er)

(if (/= er "Function cancelled")

(princ (strcat "\nError: " er "\n"))

)

(command)

(command)

(command)

(command ".undo" "end")

(moder)

(setq *error* olderr moder nil)

(prin1)

)

360

제3 장 AutoLISP유틸리티

Page 55: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(defun moder ()

; 변수들의값을 reset 한다

(setq attprop nil)

(setvar "cmdecho" cecho)

(prin1)

)

(defun attprop (DRUass / DRUblk DRUval DRUset DRUnxt DRUnxl DRUntl DRUnty

DRUnm DRUi DRUct DRUent DRUlst DRUnew) ;; 주프로그램

(setq olderr *error* *error* newerr

cecho (getvar "cmdecho")

)

(setvar "cmdecho" 0)

(command ".undo" "group")

(setq DRUblk (strcase (getstring "\nAttribute's block name/<Pick>: "))

;; 블럭의이름을입력

DRUass (cond ((= DRUass "s") 7)

((= DRUass "h") 40)

((= DRUass "w") 41)

((= DRUass "a") 50)

((= DRUass "c") 62)

((= DRUass "l") 8)

;; 스트링값을문자로변환

)

(if (or (= DRUblk "P") (= DRUblk ""))

(progn

(setq DRUblk (cdr (assoc 2 (entget (car (entsel "\rSelect the block...

361

ATTPROP 프로그램

Page 56: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

"))))))

(princ (strcat "\nBlock: " DRUblk))

);end progn or

);end if or

(if (not (tblsearch "block" DRUblk))

(princ (strcat "\rNo blocks named " DRUblk " were found."))

;; 입력된블럭이존재하지않을경우

(progn

(if (/= (cdr (assoc 70 (tblsearch "block" DRUblk))) 66)

(princ (strcat "\rThe block " DRUblk " contains no attributes."))

(progn

(setq DRUset (ssget "x" (list (cons 2 DRUblk)))

DRUnxt (ssname DRUset 0)

DRUnxl (entget (entnext DRUnxt))

DRUntl (cons (cdr (assoc 2 DRUnxl)) DRUntl)

)

(princ (strcat " Attributes: "(cdr (assoc 2 DRUnxl))))

(setq DRUnxl (entget (entnext (cdr (assoc -1 DRUnxl))))

DRUnty (cdr (assoc 0 DRUnxl))

)

(while (not (= DRUnty "SEQEND"))

(princ ", ")

(princ (cdr (assoc 2 DRUnxl)))

(setq DRUntl (cons (cdr (assoc 2 DRUnxl)) DRUntl)

DRUnxl (entget (entnext (cdr (assoc -1 DRUnxl))))

DRUnty (cdr (assoc 0 DRUnxl))

362

제3 장 AutoLISP유틸리티

Page 57: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

)

);end while

(setq DRUnm (strcase (getstring "\nAttribute: ")))

(while (not (member DRUnm DRUntl))

(princ (strcat DRUnm " is not in the list: "))

(princ (reverse DRUntl))

(setq DRUnm (strcase (getstring "\nAttribute: ")))

);end while

(setq DRUval (cond ((= DRUass 7)

(strcase (getstring "\nNew style: ")))

((= DRUass 40)

(getreal "\nNew height: "))

((= DRUass 41)

(getreal "\nNew width factor: "))

((= DRUass 50)

(dtr (getreal "\nNew angle: ")))

((= DRUass 62)

(strcase (getstring "\nNew color: ")))

((= DRUass 8)

(strcase (getstring "\nNew layer: ")))

)

DRUi 0

DRUct 0

)

(if (= DRUass 62) ;; 새로운색을주는경우

(setq DRUval (cond ((= (type (read DRUval)) 'INT) (read DRUval))

363

ATTPROP 프로그램

Page 58: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

;; 정수일때는그대로읽는다.

((= DRUval "BYBLOCK") 0)

((= DRUval "RED") 1)

((= DRUval "YELLOW") 2)

((= DRUval "GREEN") 3)

((= DRUval "CYAN") 4)

((= DRUval "BLUE") 5)

((= DRUval "MAGENTA") 6)

((= DRUval "WHITE") 7)

((= DRUval "BYLAYER") 256)

) ;; 그렇지않은경우는색의숫자로입력한다

)

);end if 62

(repeat (sslength DRUset)

(setq DRUent (ssname DRUset DRUi))

(while (/= (cdr (assoc 0 (entget (entnext DRUent)))) "SEQEND")

(setq DRUent (entnext DRUent)

DRUlst (entget DRUent)

)

(if (= (cdr (assoc 2 DRUlst)) DRUnm)

(progn

(if (= DRUass 62)

(progn

(if (assoc 62 DRUlst)

(if (/= (cdr (assoc 62 DRUlst)) DRUval)

(setq DRUnew (subst (cons 62 DRUval) (assoc 62 DRUlst) DRUlst)

364

제3 장 AutoLISP유틸리티

Page 59: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

DRUct (1+ DRUct)

)

(setq DRUnew DRUlst)

);end if not =

(setq DRUnew (cons (cons 62 DRUval) (cdr DRUlst))

DRUnew (cons (car DRUlst) DRUnew)

DRUct (1+ DRUct)

)

);end if assoc 62

(entmod DRUnew)

(entupd DRUent)

);end progn then 62

(progn

(if (/= (cdr (assoc DRUass DRUlst)) DRUval)

(progn

(setq DRUnew (subst (cons DRUass DRUval) (assoc DRUass DRUlst) DRUlst)

DRUnew (cond ((= DRUass 7)

(subst (cons 41 (cdr (assoc 41 ;; New style인경우넓이조정

(tblsearch "style" DRUval))))

(assoc 41 DRUnew) DRUnew)

)

(t DRUnew)

)

DRUnew (cond ((= DRUass 7)

(subst (cons 51 (cdr (assoc 50 ;; New style인경우회전각조정

(tblsearch "style" DRUval))))

365

ATTPROP 프로그램

Page 60: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(assoc 51 DRUnew) DRUnew)

)

(t DRUnew)

)

DRUct (1+ DRUct)

)

(entmod DRUnew)

(entupd DRUent)

);end progn /=

);end if /=

);end progn else 62

);end if 62

);end progn DRUnm

);end if DRUnm

);end while

366

제3 장 AutoLISP유틸리티

<그림 3-18>

임의의 블록 설정

Page 61: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(setq DRUi (1+ DRUi))

);end repeat

(princ "Changed ")

(princ DRUct)

(if (= DRUct 1)

(princ " attribute")

(princ " attributes")

)

(princ " in ")

(princ (cond ((= (sslength DRUset) 1) "one block ")

(t (strcat (itoa (sslength DRUset)) " blocks "))

)

)

(princ "named ")

(princ DRUblk)

367

ATTPROP 프로그램

<그림 3-19>

height와 width의 변경

Page 62: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(princ ".")

);end progn no attributes

);end if no attributes

);end progn not block

);end if not block

(command ".undo" "end")

(moder)

(setq *error* olderr moder nil)

(prin1)

)

(prin1)

368

제3 장 AutoLISP유틸리티

<그림 3-20>

text의 변경

Page 63: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

9. BATT INSUALTION 프로그램

이 프로그램은 David Sides에 의해 1994년 8월 27일 인터넷에 게재된 내용

이다.

이 프로그램의 역할은 batt insulation을 사용자 정의된 두께로 폴리 앵

과 폴리라인을 사용하여 여러 가지의 각도에서 본 단면의 구조적인 모양을 보

여준다. 대부분의 프로그램 루틴은 블럭과 폴리라인을 이용한 스플라인으로

되어 있다. 블럭을 사용하는 것은 그리 바람직하지는 않다. 폴리라인을 스플라

인화할 때 종종 부드러운 곡선이 되지 않는 경우가 있다.

;; BI.LSP

;;

;; By David Sides

;; Compuserve 70031,1263

;; September 27, 1994

;;

;; This routine draws architectural batt insulation in

;; sectional view at any angle with a user specified

;; thickness using polyarcs and pline segments.

;;

;; Most batt insulation routines use a block or a splined

;; pline to draw the insulation.

;;

;; I personally do not like to use a block that is inserted

;; multiple times. (It is a real pain if you ever have to

369

BATT INSUALTION 프로그램

Page 64: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

;; edit the detail to erase all those blocks.) The splined

;; pline routines rarely draw a smooth curve.

;;

;;==========================================================

(defun SSV (savelist) ;; 시스템변수를보관한다.

(mapcar

'(lambda (sysvar)

(list sysvar (getvar sysvar))

)

savelist)

)

(setq lista '("aunits" "auprec" "blipmode" "cmdecho"

"orthomode"))

;;=========================================================

(defun RSV (savelist) ;; 시스템변수를복귀한다.

(mapcar

'(lambda (sysvar)

(setvar (car sysvar)(cadr sysvar))

(car sysvar)

)

savelist)

)

;;==========================================================

(defun HI () 시작루틴

370

제3 장 AutoLISP유틸리티

Page 65: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(setq olderr *error*)

(defun *error* (errstr)

(print errstr)(princ)

(setq lista (RSV lista))

(setq *error* olderr)

(princ)

)

(setq lista (SSV lista))

(setvar "aunits" 3)

(setvar "auprec" 8)

(setvar "blipmode" 0)

(setvar "cmdecho" 0)

(setvar "orthomode" 0)

(prompt "\nArchitectural batt insulation. ")

(prompt "\nBy David Sides. Sept. 27, 1994. ")

(princ)

)

;;============================================================

(defun BYE () ;; 종료루틴

(setq lista (RSV lista))

(setq *error* olderr)(princ)

(princ "\nProcessing complete. ")

(princ)

)

;;============================================================

(defun c:BI (/ A ANG1 ANG2 ANG3 ANG4 ANG5 ANG6 LEN1 LEN2 PT1

371

BATT INSUALTION 프로그램

Page 66: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

PT2 PT3 PT4 PT5 PT6 PT7 THK1 THK2 THK3 THK4) ;; 주프로그램

(HI)

(setq PT1 (getpoint "\nEnter start point... ")

PT2 (getpoint PT1 "\nEnter end point. ")

THK1(getreal "\nEnter insulation thickness. ")

THK2(* THK1 0.25)

THK3(* THK1 0.40000000)

THK4(* THK1 0.44721360)

LEN1(distance PT1 PT2)

LEN2(/ LEN1 THK1)

ANG1(angle PT1 PT2)

ANG2(+ ANG1 0.0)

ANG3(+ ANG1 1.10714872)

ANG4(+ ANG1 2.21429744)

ANG5(+ ANG1 4.06888787)

ANG6(+ ANG1 4.24874137)

a 0

)

(while (< a LEN2)

(if (= a 0)

(progn

(setq PT3 (polar PT1 ANG3 THK4)

PT4 (polar PT3 ANG4 THK2)

PT5 (polar PT4 ANG2 THK3)

PT6 (polar PT5 ANG5 THK2)

PT7 (polar PT6 ANG2 THK3)

372

제3 장 AutoLISP유틸리티

Page 67: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

a 0.5

)

(command ".pline" PT1 "w" 0.0 0.0 "a" "d"

ANG2 PT3 "l" PT4 "a" PT5 "l" PT6 "a" PT7)

)

(progn

(setq PT3 PT7

PT4 (polar PT3 ANG4 THK2)

PT5 (polar PT4 ANG2 THK3)

PT6 (polar PT5 ANG5 THK2)

PT7 (polar PT6 ANG2 THK3))

(command PT3 "l" PT4 "a" PT5 "l" PT6 "a" PT7)

(setq a (+ a 0.5))

)

)

373

BATT INSUALTION 프로그램

<그림 3-21>

Batt insulation 프로그램의

실행 결과

Page 68: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

)

(command "")

(command ".break" "l" PT7 (polar PT7 ANG6 THK4))

(BYE)

(princ)

)

374

제3 장 AutoLISP유틸리티

Page 69: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

10. 블럭의 내용 추출 프로그램

본 프로그램은 블럭의 내용을 파일로 추출해내는 역할을 수행하는 프로그램

이다.

본 프로그램은 오토캐드 버전 12에서 CDF(Comma Delimitted File)을

블럭으로부터 만들어낸다. 인수 데이터의 값들도 물론 출력된다. CDF 형태로

추출된 파일은 다음의 형태를 갖는다.

블럭 삽입이름, 삽입 레이어, 삽입점 x 좌표, 삽입점 y 좌표, 삽입점 z 좌

표, 회전각, x 방향 스케일, y 방향 스케일, z 방향 스케일, 첫번째 인수의 태

그 이름, 첫 번째 인수의 값, 두 번째 인수의 태그 이름, 두번째 인수의

값..........

아래의 프로그램에서 사용되는 변수의 내용은 다음과 같다.

FILENAME: CF 파일이 쓰여지는 파일의 이름

CDFFILE: CDF 파일 포인터

SS1: 모든 블럭 삽입의 집합

COUNT: 선택된 집합으로부터 블럭의 개수를 지시하는 카운터

ENTINFO: 삽입 블럭으로부터 추출된 블럭과 인수 데이터 값

INFO: CDF 파일에 쓰여질 정보

먼저 블럭을 생성한 후 이로부터 몇 개의 블럭을 INSERT 명령어를 사용

하여 생성한다.(load "c:blext.")를 실행하여 blext.lsp를 로딩하고 blext를

입력하면 블럭 추출 프로그램이 실행된다. 이는 unnamed.cdf 파일에 저장

된다.

375

블록의내용추출프로그램

Page 70: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

; ****************************************************************************

; BLEXT.LSP - BLock EXTtraction to a comma delimited file.

;

; This R12 AutoLISP routine will write a record to a comma delimited file

; (CDF) for each block insertion in the drawing. Attribute data is also

; written. Each record written to the CDF file has the following format:

;

; Bl Name, Ins Layer, X Ins Pt, Y Ins Pt, Z Ins Pt, Orient, X Scale, Y Scale,

; Z Scale, Attrib 1 Tag, Attrib 1 Value, Attrib 2 Tag, Attrib 2 Value ......

;

; *** VARIABLE DICTIONARY ***

;

; FILENAME - The name of the CDF file that the block data is written to.

; CDFFILE - The CDF file pointer.

; SS1 - A selection set of all the block insertions.

376

제3 장 AutoLISP유틸리티

<그림 3-22>

세 개의 블록을 설정

Page 71: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

; COUNT - A counter for selecting block records from the selection set.

; ENTINFO - Block and attribute data extracted from the block insertion.

; INFO - A record to be written to the CDF file.

;

(defun c:BLEXT (/ FILENAME CDFFILE SS1 COUNT ENTINFO INFO) ;; 주프로그램

;; 도면의이름을회수하고CDF 파일확장자를가진파일을생성한다.

(setq FILENAME (strcat (getvar "DWGNAME") ".CDF"))

;; CDF 파일을열고카운터를초기화한다.

(setq CDFFILE (open FILENAME "w")

COUNT 0)

;; 모든블럭엔티티를포함한선택집합을만든다.

(if (setq SS1 (ssget "X" '((0 . "INSERT"))))

377

블록의내용추출프로그램

<그림 3-23>

CDF 파일의 생성

Page 72: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(progn

(prompt "\nExtracting Block and Attribute Data")

;; 각각의블럭에대하여다음을수행한다.

(repeat (sslength SS1)

(prompt ".")

;; 기본적인블럭정보를추출한다.

(setq ENTINFO (entget (ssname SS1 COUNT))

INFO 'nil

INFO (strcat (cdr (assoc 2 ENTINFO)) ",") ; Block name

INFO (strcat INFO (cdr (assoc 8 ENTINFO)) ",") ; Insertion layer

INFO (strcat INFO (rtos (car (cdr (assoc 10 ENTINFO))) 2 8) ",") ; X Ins.

INFO (strcat INFO (rtos (car (cddr (assoc 10 ENTINFO))) 2 8) ",") ; Y Ins.

INFO (strcat INFO (rtos (car (cdddr (assoc 10 ENTINFO)))2 8) ",") ; Z Ins.

INFO (strcat INFO (rtos (cdr (assoc 50 ENTINFO)) 2 8) ",") ; Orientation

INFO (strcat INFO (rtos (cdr (assoc 41 entinfo)) 2 8) ",") ; X Scale

INFO (strcat INFO (rtos (cdr (assoc 42 entinfo)) 2 8) ",") ; Y Scale

INFO (strcat INFO (rtos (cdr (assoc 43 entinfo)) 2 8) ",")) ; Z Scale

;; 인수의정보를추출한다.

(setq ENTINFO (entget (entnext (cdr (assoc -1 ENTINFO)))))

;; 인수가나올때까지찾기를계속한다.

(while (= (cdr (assoc 0 ENTINFO)) "ATTRIB")

(setq INFO (strcat INFO (cdr (assoc 2 ENTINFO)) ",") ; 인수이름

378

제3 장 AutoLISP유틸리티

Page 73: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

INFO (strcat INFO (cdr (assoc 1 ENTINFO)) ",") ; 인수값

ENTINFO (entget (entnext (cdr (assoc -1 ENTINFO)))))

)

;; CDF 파일에레코드를추가한다.

(write-line INFO CDFFILE)

(setq COUNT (+ 1 COUNT))

)

)

)

;; 파일을닫고쓰여진레코드의숫자를출력한다.

(close CDFFILE)

(prompt (strcat "\n" (itoa COUNT) " records written to " FILENAME))

(princ)

)

(prompt "BLEXT Loaded - Type BLEXT to run")

(princ)

379

블록의내용추출프로그램

Page 74: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

11. 높이 변경 프로그램

본 프로그램은 Charles S. Han에 의해서 인터넷에 게재된 내용이다.

프로그램은 changee.lsp의 파일에 수록되어 있다. 먼저 (load

"c:changee")로 파일의 내용을 읽어들인다. 이를 수행하려면 command에

changee를 입력한다. 프로그램은 elevation을 얼마로 할 것인지를 물어오는

데 이는 높이고자 하는 선택 집합의 고도가 된다. 다음으로 높이고자 하는 도

형 요소를 선택한 후 리턴하면 원하는 도형의 높이를 조절할 수 있다.

(defun c:changee ()

(graphscr)

(setq elev (getreal "Enter new object elevation: "))

(setq ss (ssget))

(setq i 0)

380

제3 장 AutoLISP유틸리티

<그림 3-24>

적용 도면

Page 75: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(while (setq ent (ssname ss i))

(setq entlist (entget ent))

(setq entlist (change_point entlist 10 elev))

(cond ((or (eq (cdr (assoc 0 entlist)) "3DFACE")

(eq (cdr (assoc 0 entlist)) "SOLID"))

;; 솔리드나3DFACE 도형요소인경우DXF 파일의

;; 11, 12, 13을변경한다

(setq entlist (change_point entlist 11 elev))

(setq entlist (change_point entlist 12 elev))

(setq entlist (change_point entlist 13 elev))

)

((eq (cdr (assoc 0 entlist)) "LINE") ;; 라인도형요소인경우

(setq entlist (change_point entlist 11 elev))

)

((eq (cdr (assoc 0 entlist)) "POLYLINE") ;; 폴리라인도형요소인경우

381

높이변경프로그램

<그림 3-25>

0.5 elevation을 실행한 결과

Page 76: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(cond ((eq 8 (boole 1 (cdr (assoc 70 entlist)) 8))

(while (eq "VERTEX" (cdr (assoc 0 (setq entlist (entget

(setq ent (entnext ent)))))))

(setq entlist (change_point entlist 10 elev))

)

)

)

)

)

(setq i (1+ i))

)

(command "regenall")

)

(defun change_point (elist point el) ;; elist 엔티티의point 번째요소를el 만큼증가

;; 시키는프로그램

(setq xyz (assoc point elist))

(setq elist

(subst

(list point (nth 1 xyz) (nth 2 xyz) el)

(assoc point elist)

elist

)

)

(entmod elist)

382

제3 장 AutoLISP유틸리티

Page 77: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(setq elist elist)

)

(textscr)

(print " ")

(print " If you find this shareware program of value and continue to")

(print " make use of it, please register by sending your name and ")

(print " address along with the $25 (US) registration fee to: ")

(print " ")

(print " Charles S. Han Consulting ")

(print " 427 Jersey Street ")

(print " San Francisco, CA 94114 ")

(print " ")

(print " Registered users will be sent updates at cost. ")

(print " ")

(print " If you have any ideas for utilities, send them to the ")

(print " above address. If it is written and uploaded to the ")

(print " bulletin board, you will be sent a free copy. ")

(princ)

먼저 서브루틴 change_point는 세 개의 인수를 취한다. elist는 바꾸고자

하는 도형요소의 데이터 베이스이고 point는 도형요소의 번호이며, el은

elevation을 뜻한다. 주어진 도형요소의 데이터 베이스에서 변화하고자 하는

요소를 선택한다. 이는 주로 좌표계로서 point 값은 11, 12, 13 등의 값을 취

하게 된다. 예를 들어 (11. 3 4 0)은 x 좌표 3, y 좌표 4, z 좌표 0의 값을

취하고 있으며, 이의 높이를 수정하기 위해서는 (11. 3 4 9) 등 높이의 값을

383

높이변경프로그램

Page 78: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

넣어준 값으로 그 내용을 수정함으로써 가능하다. 이러한 기능은 데이터베이

스의 특정 부분만을 수정하기 위하여 subst 함수를 이용한다.

주 프로그램은 Solid, 3dface, line, polyline 등에 대하여 각각 높이를 변

경하기 위한 데이터베이스의 요소를 변화하기 위한 절차를 수행함으로써 도형

의 높이 변경이 가능하게 된다.

384

제3 장 AutoLISP유틸리티

Page 79: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

12. 도형 변환 프로그램

본 프로그램은 Ben Olasov에 의해서 1992년 인터넷에 게재된 내용이다.

CHG 프로그램은 개개 도형요소들의 속성을 바꾸어주는 역할을 한다. 이는

엔티티의 종류에 따라 메뉴를 생성하고 프롬프트에 따라 원하는 속성을 바꾸

어줄 수 있도록 한다.

CHG를 사용하여 바뀌어진 내용은 오토캐드의 undo 명령어를 사용하여 취

소할 수 있다. 이 명령어는 CHG를 사용하기 이전 상태로 돌아가도록 한다.

블럭의 경우를 예를 들어 설명하자면 다음과 같다. A와 B의 두개의 블럭이

있다고 가정하면 블럭 A의 이름을 새로 정의함으로써 블럭의 이름을 바꿀 수

있다. 이 경우 모든 블럭 생성 파라미터의 값들은 이전의 값을 유지하나 블럭

의 이름은 B로 바뀌어진다. 만약에 블럭이 속한 레이어의 값을 바꾼다면, 블

럭은 새로 정의한 레이어의 값으로 속하게 된다. 만약에 존재하지 않는 레이어

를 지정하게 되는 경우에는 그 이름으로 새로운 레이어를 창조하고 이 레이어

385

도형변환프로그램

<그림 3-26>

변환 전 도형 요소들

Page 80: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

로 현재의 블럭을 귀속시킨다.

<그림 3-26>으로 <그림 3-32>는 CHG 프로그램을 활용하기 위한 예제이다.

원, 라인, 텍스트, 폴리라인, 블럭을 만든 후에 CHG 프로그램을 활용하여 각

각의 객체를 선택하면 엔티티의 종류에 따라서 그 값들을 나타내는 화면을 출

력한다.

;;; -*- Mode: LISP -*- (C) Ben Olasov 1988, 1989, 1992

;;; [email protected] [email protected]

;;; Entity edit function C:CHG v. 4.0

;;; Displays and modifies properties of individual entities.

;;; 2.0 Revisions: Date: December 10, 1989

;;; ANSI menu added: January 23, 1990

;;; Color ANSI graphics added January 25, 1990

;;; Color ANSI graphics replaced by flat ascii text September 16, 1992

;; This program is provided 'as is' without warranty of any kind, either

;; expressed or implied, including, but not limited to the implied warranties of

;; merchantability and fitness for a particular purpose. The entire risk as to

;; the quality and performance of the program is with the user. Should the

;; program prove defective, the user assumes the entire cost of all necessary

;; servicing, repair or correction.

;; AutoLisp and AutoCad are registered trademarks of AutoDesk, Inc.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; CHG displays and modifies the properties of individual entities. ;;

;; ;;

;; CHG creates a numbered menu of the selected entities properties, and ;;

;; then prompts the user to select the number of the property to modify. ;;

386

제3 장 AutoLISP유틸리티

Page 81: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

;; CHG then prompts for a new value for that property, which may be a ;;

;; point (list), real, integer, or string. ;;

;; ;;

;; Any changes made by CHG can be undone using AutoCad's 'U' command. ;;

;; Doing so will return the drawing to its state before using CHG. ;;

;; ;;

;; A random example of using CHG: ;;

;; In a drawing containing two valid blocks A and B, an individual ;;

;; iteration of block A can be transformed to an iteration of block B by ;;

;; giving B as its new name. All of its previous insertion parameters will ;;

;; remain the same, but its identity will be changed to block B. If the ;;

;; name of the layer in which the entity resides is changed to the name of ;;

;; an existing layer, the entity will change its residence to that layer. ;;

;; However, if the new layer name is the name of a non-existing layer, a ;;

;; layer with that name will be created, and the entity will be transferred ;;

;; to that layer. ;;

;; ;;

;; Syntax: CHG ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(gc)

(vmon)

(graphscr)

(princ "\nLoading- please wait.. ")

(defun descriptor (key e_type) ;; key의내용을확인하여, 그에해당하는스트링의값을

;; 출력한다

(cond ((null key) nil)

387

도형변환프로그램

Page 82: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

((= key -1) "ENTITY NAME <RO>")

((= key 0) "ENTITY TYPE")

((= key 5) "HANDLE <RO>")

((= key 6) "LINETYPE NAME <RO>")

((= key 7) "TEXT STYLE NAME <RO>")

((= key 8) "LAYER")

((= key 9) "VARIABLE NAME IDENTIFIER")

((and (>= key 10)

(<= key 18)) (point_handler key ent))

((= key 38) "ELEVATION")

((= key 39) "THICKNESS")

((and (>= key 1)

(<= key 72)

(or (= e_type "TEXT")

(= e_type "ATTDEF"))) (text_handler key ent))

;; 텍스트를다루기위한키입력

((= key 1) "TEXT VALUE")

((and (>= key 2)

(<= key 71)

(or (= e_type "BLOCK")

(= e_type "INSERT"))) (block_handler key ent))

;; 블럭을다루기위한키입력

((= key 2) "NAME")

((or (= key 3)

(= key 4)) "OTHER NAME VALUE")

((= key 20) "PRIMARY Y COORDINATE")

388

제3 장 AutoLISP유틸리티

Page 83: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

((and (>= key 21) (<= key 28)) "OTHER Y COORDINATE")

((and (>= key 31) (<= key 36)) "OTHER Z COORDINATE")

((and (>= key 40)

(<= key 48)

(or (= e_type "CIRCLE")

(= e_type "ARC"))) "RADIUS")

((and (>= key 40)

(<= key 75)

(= e_type "POLYLINE")) (pline_handler key ent))

;; 폴리라인을다루기위한키입력

((and (>= key 40)

(<= key 48)) "FLOATING POINT VALUE")

((= key 49) "REPEATED VALUE")

((and (>= key 50)

(<= key 58)) "ANGLE")

((= key 62) "COLOR #")

((= key 66) "VERTICES FOLLOW <RO>")

((and (= key 70)

(= e_type "3DFACE")) (3dface_handler key ent))

;; 3dface를다루기위한키입력

((= key 71) "MIRROR DIRECTION")

((and (>= key 70) (<= key 78)) "INTEGER VALUE")

((or (= key 210)

(= key 220)

(= key 230)) "EXTRUSION DIRECTION COORDINATES")

((= key 999) "COMMENTS")

389

도형변환프로그램

Page 84: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(T "UNCLASSIFIED VALUE")))

(defun format-input (key / val label)

(if (null key) nil

(progn (setq val (cdr (assoc key entity)))

(graphscr)

(cond ((= (type val) 'STR) ;; 키의내용이스트링인경우

(setq label (strcat (descriptor key etyp) ": "))

(princ (strcat "\nCurrent " label))

(princ val)

(getstring T (strcat "\nNew " label)))

((= (type val) 'REAL) ;; 키의내용이실수인경우

(cond ((and (>= key 40)

(<= key 48)

(or (= etyp "CIRCLE")

(= etyp "ARC")))

(setvar "coords" 2)

(princ "\nCurrent angle: ")

(princ val)

(usercirc (cdr (assoc 10 entity)) entity))

((and (>= key 50) (<= key 58))

(setvar "coords" 2)

(princ "\nCurrent angle: ")

(princ val)

(getangle (cdr (assoc 10 entity)) "\nNew angle: "))

(T (setq label (strcat (descriptor key etyp) ": "))

(princ (strcat "\nCurrent " label))

390

제3 장 AutoLISP유틸리티

Page 85: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(princ val)

(getreal (strcat "\nNew " label)))))

((= (type val) 'INT) ;; 키의내용이정수인경우

(setq label (strcat (descriptor key etyp) ": "))

(princ (strcat "\nCurrent " label))

(princ val)

(getint (strcat "\nNew " label)))

((= (type val) 'LIST) ;; 키의내용이리스트인경우

(setvar "coords" 2)

(princ "\nCurrent point value: ")

(princ val)

(getpoint val "\nNew point: "))))))

(defun C:CHG (/ entity i ctr num tag new) ;; 주프로그램

(if (setq ename (entsel))

(progn (setq ent (entget (car ename))

entity (aux_remove (assoc 0 ent) ent)

etyp (cdr (assoc 0 ent)) ;; 도형요소의종류

header (strcat etyp " PROPERTY TABLE")

num_props (length entity)

i 0 ctr 0 items nil

cmd (getvar "cmdecho"))

(setvar "cmdecho" 0)

(foreach e entity

(setq items

(cons (strcat (descriptor (car e) etyp)

391

도형변환프로그램

Page 86: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

"\: " (stringify (cdr e))) items)))

(setq num (menu_operation header

(reverse items)

"Number of property to change: "

))

(if (and num

(> num 0)

(<= num num_props))

(progn (setq tag (car (nth (1- num) entity))

new (format-input tag))

(if new

(progn (setq ent (subst (cons tag new)

(assoc tag entity) ent))

(command "undo" "mark")

(setvar "cmdecho" cmd)

(entmod ent))

(princ "\Null input.")))

(princ "\nInvalid number.")))

(princ "\nNo entity selected."))

(princ))

(defun text_handler (key elist) ;; 텍스트도형요소인경우

(setq bit_code (cdr (assoc key elist)))

(cond ((= key 1) "TEXT VAL")

((= key 2) "ATTRIBUTE TAG")

((= key 40) "TEXT HGT")

392

제3 장 AutoLISP유틸리티

Page 87: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

((= key 41) "RELATIVE X SCL FACTOR")

((= key 50) "ROTATION ANG")

((= key 51) "OBLIQUING ANG")

((= key 70)

(strcat "ATTRIBUTE "

(cond ((= bit_code 1) "<INVISIBLE>")

((= bit_code 2) "<CONSTANT>")

((= bit_code 4) "<VERIFICATION REQD>")

((= bit_code 8) "<PRESET>")

(T "<UNKNOWN BIT CODE>"))))

((= key 71)

(strcat "TEXT GENERATION "

(cond ((= bit_code 0) "")

((= bit_code 2) "<BACKWARDS>")

((= bit_code 4) "<UPSIDE DOWN>")

(T "<UNKNOWN BIT CODE>"))))

((= key 72)

(strcat "TEXT JUSTIFICATION "

(cond ((= bit_code 0) "<LEFT JUSTIFIED>")

((= bit_code 1) "<CENTERED ALONG BASELINE>")

((= bit_code 2) "<RIGHT JUSTIFIED>")

((= bit_code 3) "<ALIGNED BTWN 2 POINTS>")

((= bit_code 4) "<MIDDLE CENTERED>")

((= bit_code 5) "<FIT BETWEEN 2 POINTS>")

(T "<UNKNOWN CODE>"))))

(T "UNKNOWN FLAG")))

393

도형변환프로그램

Page 88: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(defun pline_handler (key elist) ;; 폴리라인도형요소인경우

(setq bit_code (cdr (assoc key elist)))

(cond ((= key 40) "STARTING WIDTH")

((= key 41) "ENDING WIDTH")

((= key 66) "VERTICES FOLLOW <RO>")

((= key 70)

(strcat "POLYLINE "

(cond ((= bit_code 1) "<CLOSED>")

((= bit_code 2) "<CURVE-FIT VERTICES ADDED>")

((= bit_code 4) "<SPLINE-FIT VERTICES ADDED>")

((= bit_code 8) "<3D POLYLINE>")

((= bit_code 16) "<3D MESH>")

((= bit_code 32) "<3D MESH CLOSED IN N DIRECTION>")

(T "<UNKNOWN BIT CODE>"))))

((or (= key 71)

(= key 72)) (strcat "POLYGON MESH "

(if (= key 71) "M" "N")

" COUNT"))

((or (= key 73)

(= key 74)) (strcat "POLYGON MESH "

(if (= key 73) "M" "N")

" DENSITY"))

((= key 75)

(strcat "SMOOTH SURFACE TYPE "

(cond ((= bit_code 0) "<NO SMOOTH SURFACE FITTED>")

394

제3 장 AutoLISP유틸리티

Page 89: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

((= bit_code 5) "<QUADRATIC B-SPLINE>")

((= bit_code 6) "<CUBIC B-SPLINE>")

((= bit_code 8) "<BEZIER SURFACE>")

(T "<UNKNOWN BIT CODE>"))))

(T "UNKNOWN POLYLINE FLAG")))

(defun 3dface_handler (key elist) ;; 3dface 도형요소인경우

(setq bit_code (cdr (assoc key elist)))

(cond ((= key 70)

(strcat "INVISIBLE EDGE FLAG "

(cond ((= bit_code 0) "<NO")

((= bit_code 1) "<1ST")

((= bit_code 2) "<2ND")

((= bit_code 4) "<3RD")

((= bit_code 8) "<4TH")

(T "UNIDENTIFIED"))

" EDGE INVISIBLE>"))))

(defun block_handler (key elist) ;; 블럭도형요소인경우

(setq bit_code (cdr (assoc key elist)))

(cond ((= key 2) "BLOCK NAME")

((= key 41) "X SCALE FACTOR")

((= key 42) "Y SCALE FACTOR")

((= key 43) "Z SCALE FACTOR")

((= key 44) "COLUMN SPACING")

((= key 45) "ROW SPACING")

395

도형변환프로그램

Page 90: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

((= key 50) "ROTATION ANG")

((= key 66) "ATTRIBUTES FOLLOW <RO>")

((and (= key 70)

(= etyp "BLOCK"))

(strcat "BLOCK TYPE"

(cond ((= bit_code 1) "ANONYMOUS")

((= bit_code 2) "ATTRIBUTES")

(T "UNKNOWN BIT CODE"))))

((= key 70) "COLUMN COUNT")

((= key 71) "ROW COUNT")

(T "UNCLASSIFIED VALUE")))

(defun point_handler (key elist) ;; 포인트도형요소인경우

(setq bit_code (cdr (assoc key elist)))

(cond ((= key 10) "ORIGIN PT")

((and (= key 11)

(or (= etyp "LINE")

(= etyp "TEXT"))) "END PT")

((= key 11) "2ND PT")

((= key 12) "3RD PT")

((= key 13) "4TH PT")

((and (>= key 14)

(<= key 18)) "OTHER POINT COORDINATE")))

(defun usercirc (key elist / newrad) ;; 사용자정의원으로의변경방법

(princ "\nNew radius: ")

396

제3 장 AutoLISP유틸리티

Page 91: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(command "circle" (cdr (assoc 10 elist)) pause)

(setq newrad (cdr (assoc 40 (entget (entlast)))))

(entdel (entlast)) newrad)

(defun aux_remove (atm lst) ;; lst 중에서atm을제거하는방법

(cond ((null lst) nil)

((null (member atm lst)) lst)

((equal atm (car lst)) (cdr lst))

(t (append (reverse (cdr (member atm (reverse lst))))

(cdr (member atm lst))))))

(defun stringify (exp) ;; 주어진exp 값을스트링으로변환하는방법

(cond ((null exp) "nil")

((= (type exp) 'STR) exp)

((= (type exp) 'ENAME) "")

((= (type exp) 'INT) (itoa exp))

((= (type exp) 'REAL) (rtos exp 2 6))

((= (type exp) 'LIST)

(strcat "\(" (rtos (car exp) 2 4)

(if (cadr exp) (strcat " "(rtos (cadr exp) 2 4)) "")

(if (caddr exp) (strcat " " (rtos (caddr exp) 2 4)) "")

"\)"))

(T "")))

(defun menu_operation (header item-list prompt / hgt wdth i l-col)

;; 메뉴를화면에출력하고, 값을수정하는과정을관리한다.

397

도형변환프로그램

Page 92: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(cls)

(if (/= (rem (strlen header) 2) 0) (setq header (strcat header " ")))

(setq hgt (+ 9 (length item-list))

wdth (+ 10 (max (longest item-list) (strlen header))))

(if (/= (rem hgt 2) 0) (setq hgt (1+ hgt)))

(if (/= (rem wdth 2) 0) (setq wdth (1+ wdth)))

(setq l-col (- 40 (/ wdth 2))

i 0)

(repeat (- 12 (/ hgt 2)) (terpri))

(repeat l-col (princ " "))

(princ "+")

(repeat (- wdth 2) (princ "-"))

(princ "+") (terpri)

(IF (< (+ (LENGTH ITEM-LIST) 5) 19)(BLANK l-col wdth))

(repeat l-col (princ " "))

398

제3 장 AutoLISP유틸리티

<그림 3-27>

원의 크기 변경

Page 93: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(princ "|")

(repeat (- (- (/ wdth 2) (/ (strlen header) 2)) 1) (princ " "))

(princ header)

(repeat (- (- (/ wdth 2) (/ (strlen header) 2)) 1) (princ " "))

(princ "|") (terpri)

(IF (< (+ (LENGTH ITEM-LIST) 5) 19)(BLANK l-col wdth))

(repeat l-col (princ " "))

(princ "+")

(repeat (- wdth 2) (princ "-"))

(princ "+")

(IF (< (+ (LENGTH ITEM-LIST) 5) 19)

(PROGN (TERPRI)

(BLANK l-col wdth)))

(IF (>= (+ (LENGTH ITEM-LIST) 5) 19)

(repeat l-col (princ " ")))

399

도형변환프로그램

<그림 3-28>

라인 요소의 변경

Page 94: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(foreach item item-list

(setq i (1+ i))

(IF (> I 1)

(terpri))

(repeat l-col (princ " "))

(princ (strcat "|" (if ( > I 9) " " " ")

(itoa i) "] " item))

(repeat (- wdth (+ (if ( > I 9) 6 7)

(strlen (itoa i))

(strlen item)))

(princ " "))

(princ "|"))

(terpri)

(if (< (+ (length item-list) 5) 19)

(blank l-col width))

400

제3 장 AutoLISP유틸리티

<그림 3-29>

텍스트 요소의 변경

Page 95: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(repeat l-col (princ " "))

(princ "+")

(repeat (- wdth 2) (princ "-"))

(princ "+")

(princ (strcat "\n\n" prompt))

(setq choice (getint))

(while (or (< choice 1) (> choice (length item-list)))

(setq choice (getint "Choice is out of range, try again: ")))

choice)

;; 가장긴스트링의값을계산한다

(defun longest (lst)

(apply 'max (mapcar '(lambda (itm) (strlen itm)) lst)))

(defun blank (col wd) ;; 외곽선을그린다

(repeat col (princ " "))

(princ "|")

401

도형변환프로그램

<그림 3-30>

폴리라인의 변경

Page 96: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(repeat (- wd 2) (princ " "))

(princ "|")

(terpri))

(defun cls () ;; 화면정리

(if (null textpage)

(progn (textscr)

(repeat 25 (terpri)))

(textpage)))

(defun makelayer (nam color lt) ;; 레이어를만든다.

(if (member nam layers)

(command "layer" "t" nam "m" nam "c" color nam "lt" LT nam "")

(command "layer" "m" nam "c" color nam "lt" LT nam "")))

;;; 도면의모든레이어의값을리스트로출력한다.

(defun listify_layers (/ layer layers nam)

(setq layer (cdr (assoc 2 (tblnext "layer" T))) ;;rewind layer table

402

제3 장 AutoLISP유틸리티

<그림 3-31>

블록 요소의 변경

Page 97: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

layers (list layer))

(while (setq layer (tblnext "layer")) ;;construct layer list

(setq nam (cdr (assoc 2 layer))

layers (cons nam layers))) layers)

(defun userdist (refpt dflt prmpt / var) ;; 스트링의값을입력받아distance로변환,

;; 디폴트의값을지정할수있다

(if (setq var

(getdist (if refpt refpt)

(if dflt (strcat prmpt " <" (rtos dflt 4 2) ">: ")

(strcat prmpt ": ")))) var dflt))

(defun userint (dflt prmpt / var) ;; 스트링의값을입력받아정수로변환,

;; 디폴트의값을지정할수있다

(if (setq var

(getint (if dflt (strcat prmpt " <" (itoa dflt) ">: ")

(strcat prmpt ": ")))) var dflt))

403

도형변환프로그램

<그림 3-32>

수정 후 도면

Page 98: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(defun userstr (dflt prmpt / var) ;; 스트링의값을입력받는다

;; 디폴트의값을지정할수있다.

(setq var (getstring t (if (and dflt (/= dflt ""))

(strcat prmpt " <" dflt ">: ")

(strcat prmpt ": "))))

(cond ((/= var "") var)

((and dflt (= var "")) dflt)

(T dflt)))

(c:chg)

404

제3 장 AutoLISP유틸리티

Page 99: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

13. CONNECT 프로그램

본 프로그램은 Ben Olasov에 의해서 1994년에 인터넷에 게재된 내용이다.

두 개의 폴리곤을 생성하고 프로그램 CONNECT를 실행하면 폴리곤을 선

택하는 가를 질문한다. 순서에 의해서 첫 번째와 두 번째 폴리곤을 선택하면

두 개의 도면을 연결한 새로운 도형을 생성한다.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;; File: CONNECT.LSP Copyright (C) Ben Olasov 1994 [email protected] ;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; load-time variable clean up / garbage collection

(setq c:connect nil c:ct nil connect_plines nil translate_pts nil

extract_value nil userstr nil pos_in_list nil c:rd nil

c:sync nil sync nil aux_close nil list_verts nil

set_la nil redraw_pln nil _pline nil l_left nil

divide_pline nil ss2nodelist nil list_verts nil make_la nil

origin_pt nil ecs2ucs nil) (gc)

(defun c:connect (/ shp1* shp2*)

(setvar "cmdecho" 0)

(setq shp1* (user_ent (list "POLYLINE" "CIRCLE" "ARC") ;; 연결할첫번째도형

"\nfirst polygon: "))

(setq shp2* (user_ent (list "POLYLINE" "CIRCLE" "ARC") ;; 연결할두번째도형

"\npolygon to join: "))

(connect_plines shp1* shp2*)

405

CONNECT 프로그램

Page 100: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

'done)

(defun connect_plines (pl1 pl2 / i_ pl_pts1 pl_pts2 pl_pts_l)

(setq i_ 0

force? nil

eq_vtxlsts nil

pl_pts1 (translate_pts (collect_vertices pl1) pl1) ;; 폴리라인 1의꼭지점

pl_pts2 (translate_pts (collect_vertices pl2) pl2) ;; 폴리라인2의꼭지점

#pts1 (length pl_pts1) ;; 폴리라인 1의꼭지점수

#pts2 (length pl_pts2)) ;; 폴리라인2의꼭지점수

(if (and pl_pts1 pl_pts2)

(progn (gc)

(if (/= #PTS1 #PTS2) ;; 꼭지점의개수가다를때

(progn (princ (strcat

"\nconnect_plines: unequal vertex list lengths: "

(itoa #pts1) " & "

(itoa #pts2)))

(setq eq_vtxlsts nil

force? (userstr (if force? force? "Y")

;; 다를경우강제적으로연결?

"\nForce equal vertex list lengths [Y N]"))

(if (equal force? "Y")

(progn (setq force_method (strcase

(userstr (if force_method

force_method

"O")

"\nForce method [O]ffset or [E]qual division"))) ;; 강제적연결

406

제3 장 AutoLISP유틸리티

Page 101: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(if (equal force_method "O")

;; use polar vertex offsets

(setq %offst_d (distance (car pl_pts1)

(car pl_pts2))

%bp (centroid pl_pts1)

offst_d (userdist (car pl_pts1)

(if offst_d

offst_d

%offst_d)

"Offset distance")

pl_pts2 (offset_verts pl_pts1

%bp

offst_d))

;; 동수의값을사용한다

(setq pl_pts1

(divide_pline pl1

(max #PTS1 #PTS2)

(ecs2ucs

(origin_pt pl1)

pl1))

pl_pts2

(divide_pline pl2

(max #PTS1 #PTS2)

(ecs2ucs

(origin_pt pl2)

pl2)))))))

407

CONNECT 프로그램

Page 102: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

;; 두개의폴리라인을많은꼭지점의개수를가진폴리

;; 라인의수로등분한다

(setq eq_vtxlsts 'T))

(if (or eq_vtxlsts (equal force? "Y"))

(progn (setq pl_pts_l (length pl_pts1))

(command "3dmesh" pl_pts_l 2) ;; 3dmesh를이용한방법

(repeat pl_pts_l

(if (equal force? "Y")

(setq _pl_pt_1 (nth i_ pl_pts1)

_pl_pt_2 (nth i_ pl_pts2))

(setq _pl_pt_1 (nth i_ pl_pts1)

_pl_pt_2 (nth i_ pl_pts2)))

(command _pl_pt_1 _pl_pt_2) ;; 계속하여mesh를작성한다.

(setq i_ (1+ i_))))))))

;; 좌표계변환

;; translate a list of coordinate triplets from UCS(%EN%) to UCS

(defun translate_pts (%ptl% %en% / ntrans)

(defun ntrans (%v%)

(trans %v% %en% 1))

(mapcar 'ntrans %ptl%))

;; 리스트에서의원소의위치의순서를출력한다.

;; NTH 명령어와같이사용된다.

(defun pos_in_list (item lst)

(if (null (member item lst))

nil

(- (length lst) (length (member item lst)))))

408

제3 장 AutoLISP유틸리티

Page 103: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

;;; C:RDP 는동일한간격으로노드들의사이를

;;; 연결하는선택된폴리라인을그린다.

(defun c:rdp ()

(setq *shp1* (user_ent (list "POLYLINE" "LINE") "\ncontour to redraw: "))

(setq op (trans (origin_pt *shp1*) *shp1* 1)

res (userint (if res res 80) "\nResolution")

plnds (divide_pline *shp1* res op)

del_old? (strcase (userstr (if del_old? del_old? "N")

"\nDelete original contour after redraw [Y N]")))

(_pline plnds)

(if (/= del_old? "N")

(entdel *shp1*))

(setq *shp1* nil)

(setq plnds nil)

'done) ;; 결과값들을지운다.

;; C:OFP는선택된폴리라인의옵셋을생성한다.

(defun c:ofp (/ %pl %plpts %basp)

(modes '("cmdecho" "blipmode"))

(setq %pl (user_ent (list "POLYLINE")

"\nSelect a pline for polar offset: ")

%plpts (list_verts %pl)

%basp (centroid %plpts)

%offst_d (userdist %basp

(if %offst_d

409

CONNECT 프로그램

Page 104: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

%offst_d

(distance (car %plpts) (cadr %plpts)))

"Offset distance")

%plpts (offset_verts %plpts %basp %offst_d))

(setvar "blipmode" 0)

(setvar "cmdecho" 0)

(_pline %plpts)

(moder)

(terpri) 'done)

;; SS2NODELIST는선택집합으로부터구성요소들의원점의리스트를출력한다.

;; 이는divide 명령어에의하여생성된점들의좌표값을모으는데사용된다.

(defun ss2nodelist (ss / *ent* pt pts &i ssl)

(if (or (null ss) (/= (type ss) 'PICKSET)) nil

(progn (setq &i 0

ssl (sslength ss))

(while (/= &i ssl)

(setq ent (ssname ss &i)

*ent* (entget ent)

pt (cdr (assoc 10 *ent*)) ;; dxf에서의도형요소 10은

;;원점의좌표를출력한다

pts (cons pt pts))

(setq &i (1+ &i))))) pts)

;; C:SYNC brings two polylines contours having different directions of vertex

;; placement into correspondence by redefining the direction of vertex

;; placement.

410

제3 장 AutoLISP유틸리티

Page 105: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(defun c:sync (/ %pln_ss%)

(princ "\nSelect plines to sync: ")

(setq %pln_ss% (ssget))

(sync %pln_ss%)

(setq %pln_ss% nil) 'done)

(defun sync (pln_ss / # pln_ssl curr_la pln_ pln_pts rfp)

(cond ((null pln_ss) nil)

((not (equal (type pln_ss) 'pickset)) nil)

((= (sslength pln_ss) 0) nil) ;; 선택집합이제대로선택되지않은경우

(T (setq # 0

pln_ssl (sslength pln_ss)

curr_la (getvar "clayer"))

(repeat pln_ssl

(setq pln_ (ssname pln_ss #)

pln_pts_ (aux_close

(translate_pts

(list_verts pln_)

pln_))

rfp (l_left pln_pts_))

(set_la pln_)

(redraw_pln rfp pln_pts_ pln_)

(setq # (1+ #)))

(command "layer" "s" curr_la "")))

(terpri))

411

CONNECT 프로그램

Page 106: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(defun aux_close (&&vrts) ;; 폴리라인이닫혀져있지않은경우꼭지점리스트의값에

;; 처음꼭지점의값을추가한다

(if &&vrts

(if (not (equal (car &&vrts) (last &&vrts)))

(reverse (cons (car &&vrts) (reverse &&vrts)))

&&vrts)))

(defun set_la (%e%) ;; 현재의레이어와주어진레이어의값이다른경우에

;; 주어진레이어의이름으로현재의레이어의값을바꾼다.

(if %e%

(progn (setq %clay (getvar "clayer")

%elay (cdr (assoc 8 (entget %e%))))

(if (not (equal %clay %elay))

(command "layer" "t" %elay "on" %elay "s" %elay "")))))

(defun redraw_pln (rfpt %plns% _e) ;; 폴리라인을다시그린다. 기준점을참고하여

;; 이점이시작점이되도록순서를조정한다.

(setq %%plns% %plns%)

(if (not (equal rfpt (car %%plns%)))

(progn (while (not (equal rfpt (car %%plns%)))

(setq %%plns%

(append (cdr %%plns%)

(list (car %%plns%)))))

(_pline %%plns%))

(_pline %plns%)))

412

제3 장 AutoLISP유틸리티

Page 107: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(defun _pline (pnts) ;; 주어진꼭지점의리스트로부터폴리라인을그린다

(if (and pnts (listp pnts))

(progn (command "pline")

(foreach pt pnts (if pt (command pt)))

(command "")))

(entlast))

(defun l_left (verts / _xmax _ymin tmplst ll_pt) ;; 가장좌하단에있는꼭지점의좌표를구한다

(setq _xmin (apply 'min (mapcar 'car verts)))

(foreach vert verts

(if (equal (car vert) _xmin)

(setq tmplst

(if tmplst (cons vert tmplst)

(list vert)))))

(setq _ymin (apply 'min (mapcar 'cadr tmplst))

ll_pt (nth (pos_in_list _ymin (mapcar 'cadr tmplst)) tmplst)))

(defun divide_pline (enm n_vrts_ _pt_ / pt_ss pt_l$$) ;; 폴리라인의길이를나눈다.

(command "undo" "c" "one")

(setq clayer (getvar "clayer"))

(make_la "$PT$")

(command "divide" _pt_ (1+ n_vrts_))

(setq pt_ss (ssget "x" (list (cons 0 "POINT")

(cons 8 "$PT$")))

pt_l$$ (ss2nodelist pt_ss)

pt_ss nil)

413

CONNECT 프로그램

Page 108: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(gc)

(command "undo" "1")

(command "undo" "1")

(command "undo" "1")

(make_la clayer) pt_l$$)

;; SS2NODELIST는선택집합에포함된원점들의리스트의값을구한다.

(defun ss2nodelist (ss / *ent* pt pts &i ssl)

(if (or (null ss) (/= (type ss) 'PICKSET)) nil

(progn (setq &i 0

ssl (sslength ss))

(while (/= &i ssl)

(setq ent (ssname ss &i)

*ent* (entget ent)

pt (cdr (assoc 10 *ent*))

pts (cons pt pts))

(setq &i (1+ &i))))) pts)

(defun list_verts (polyln / __ent *polyln* ##pt ##pts) ;; 꼭지점의리스트값을출력

(if (= (cdr (assoc 0 (setq *polyln* (entget polyln)))) "POLYLINE")

(progn (setq __ent (entnext polyln))

(while (setq *ent* (entget __ent)

##pt (cdr (assoc 10 *ent*))

crv_fit_bit (cdr (assoc 70 *ent*)))

(if (/= crv_fit_bit 1) ;; test for artificial nodes

(setq ##pts (cons ##pt ##pts)))

414

제3 장 AutoLISP유틸리티

Page 109: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(setq __ent (entnext __ent))))

(princ "\n_list_verts: not a polyline."))

(if ##pts (reverse ##pts)))

(defun make_la (%nam%) ;; %name%의이름을가진레이어를만든다.

(if %nam%

(progn (setq %clay (getvar "clayer"))

(if (layerp %nam%)

(if (not (equal %clay %nam%))

(command "layer""t"%nam%"on"%nam%"s"%nam%""))

(command "layer" "m" %nam% "")))))

(defun origin_pt (pln) ;; 폴리라인의경우원점의좌표값을구한다

(if (equal (cdr (assoc 0 (entget pln))) "POLYLINE")

(cdr (assoc 10 (entget (entnext pln))))

(cdr (assoc 10 (entget pln)))))

(defun ecs2ucs (%p% %e%) ;; 엔티티좌표계를사용자좌표계의값으로바꾼다

(trans %p% %e% 1))

(defun layerp (layername) ;; 레이어의값이존재하면T, 그렇지않으면nil을출력

(if (null layername) nil

(if (member (strcase layername) (listify_layers))

'T nil)))

;;; 도면내에있는모든레이어의리스트값을출력한다.

415

CONNECT 프로그램

Page 110: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(defun listify_layers (/ layer layers nam)

(setq layer (cdr (assoc 2 (tblnext "layer" T))) ;;rewind layer table

layers (list layer))

(while (setq layer (tblnext "layer")) ;;construct layer list

(setq nam (cdr (assoc 2 layer))

layers (cons nam layers))) layers)

(defun offset_verts (%vrts% %bp% %dlt%) ;; 꼭지점의옵셋을구한다.

(defun _polar (%%p)

(polar %%p (angle %bp% %%p) %dlt%))

(mapcar '_polar %vrts%))

;; 꼭지점의리스트로부터중심점의값(2d 혹은3d의형태로)을출력하도록한다.

(defun centroid (verts / num_verts x_avg y_avg z_avg centrd)

(if (or (null verts)

(null (listp verts)))

nil

(setq num_verts (length verts)

x_avg (/ (apply '+ (mapcar 'car verts)) num_verts)

y_avg (/ (apply '+ (mapcar 'cadr verts)) num_verts)

z_avg (/ (apply '+ (mapcar 'caddr verts)) num_verts)

centrd (list x_avg y_avg z_avg))) centrd)

(defun extract_value (key enm) ;; enm으로부터key에해당하는값을추출한다.

(if enm (cdr (assoc key (entget enm)))))

(defun userstr (dflt prmpt / var) ;; 사용자로부터스트링을입력받음.

416

제3 장 AutoLISP유틸리티

Page 111: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

;; 디폴트값을처리할수있다.

(setq var (getstring t (if (and dflt (/= dflt ""))

(strcat prmpt " <" dflt ">: ")

(strcat prmpt ": "))))

(cond ((/= var "") var)

((and dflt (= var "")) dflt)

(T dflt)))

(defun userint (dflt prmpt / var) ;; 사용자로부터스트링을입력받아정수형태로변환

;; 디폴트값을처리할수있다

(if (setq var

(getint (if dflt (strcat prmpt " <" (itoa dflt) ">: ")

(strcat prmpt ": ")))) var dflt))

(defun userdist (refpt dflt prmpt / var);; 사용자로부터스트링을입력받아distance 형태로변환

;; 디폴트값을처리할수있다

(if (setq var

(getdist (if refpt refpt)

(if dflt (strcat prmpt " <" (rtos dflt 2 5) ">: ")

(strcat prmpt ": ")))) var dflt))

(defun user_ent (ent_type_lst _prm / __ent)

(while (not (member (extract_value 0

(setq __ent (car (entsel _prm))))

ent_type_lst))) __ent)

;; from AutoDesk

417

CONNECT 프로그램

Page 112: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(defun modes (a)

(setq mlst '())

(repeat (length a)

(setq mlst (append mlst (list (list (car a) (getvar (car a))))))

(setq a (cdr a))))

;; from AutoDesk

(defun moder ()

(repeat (length mlst)

(setvar (caar mlst) (cadar mlst))

(setq mlst (cdr mlst))))

(defun collect_vertices (polyln / __ent *polyln* ##pt ##pts) ;; 주어진폴리라인으로부터

;; 꼭지점을모은다

(if (= (cdr (assoc 0 (setq *polyln* (entget polyln)))) "POLYLINE")

(progn (setq __ent (entnext polyln))

(while (setq *ent* (entget __ent)

##pt (cdr (assoc 10 *ent*)))

(setq ##pts (cons ##pt ##pts)

__ent (entnext __ent)))

(if (and (equal (cdr (assoc 70 (entget polyln))) 1)

(not (equal (car ##pts) (last ##pts))))

(setq ##pts (reverse (cons (car ##pts)

(reverse ##pts))))))

(if (= (cdr (assoc 0 (setq *polyln* (entget polyln)))) "LINE")

(setq ##pts (list (extract_value 10 polyln)

418

제3 장 AutoLISP유틸리티

Page 113: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(extract_value 11 polyln)))

(princ "\ncollect_vertices: not a POLYLINE.")))

(if ##pts (setq np (length ##pts)))

##pts)

(setq cv collect_vertices)

(defun midpt (p1 p2) ;; 두점의중심점의좌표를구한다.

(polar p1 (angle p1 p2) (/ (distance p1 p2) 2.0)))

(defun inside (p_ vtx_lst / ints i max_x max_y)

(setq ints 0

i 0

num_vtx (length vtx_lst)

max_x (apply 'max (mapcar 'car vtx_lst))

max_y (apply 'max (mapcar 'cadr vtx_lst))

exterior_pt (list (* max_x 2.0) (* max_y 2.0)))

(repeat (1- num_vtx)

(if (= i (1- num_vtx))

(setq vt1 (nth i vtx_lst)

vt2 (nth 0 vtx_lst))

(setq vt1 (nth i vtx_lst)

vt2 (nth (1+ i) vtx_lst)))

(if (inters p_ exterior_pt vt1 vt2)

(setq ints (1+ ints)))

(setq i (1+ i)))

(if (= (rem ints 2) 0)

419

CONNECT 프로그램

Page 114: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

nil 'T))

;; C:FILLPLN은3dface 요소로서이루어진외곽선으로부터면을만든다.

(defun c:fillpln ()

(setq %pl (user_ent (list "POLYLINE")

"\nSelect a pline contour to fill with 3dfaces: "))

(if %pl (fillcontour (collect_vertices %pl))))

(defun fillcontour (vtx-list / v1 v2 v3 old_v1) ;; 꼭지점의리스트로주어진면을만든다.

(cond ((null vtx-list) nil)

((null (listp vtx-list)) nil)

((member nil (mapcar 'listp vtx-list)) nil)

(T (while (caddr vtx-list)

(if v1 (setq old_v1 v1))

(setq v1 (car vtx-list))

420

제3 장 AutoLISP유틸리티

<그림 3-33>

4개의 폴리곤

Page 115: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(setq v2 (cadr vtx-list))

(setq v3 (caddr vtx-list))

(setq mp-v1-v2 (midpt v1 v2))

(setq mp-v2-v3 (midpt v2 v3))

(setq mp-v1-v3 (midpt v1 v3))

(if old-v1

(progn (setq mp-v1old-v1 (midpt v1old v1)

mp-v1old-v2 (midpt v1old v2)

mp-v1old-v3 (midpt v1old v3))

(if (and (inside mp-v1old-v1 vtx-list)

(inside mp-v1old-v2 vtx-list)

(inside mp-v1-v2 vtx-list))

(command "3dface" old_v1 v1 v2 "" ""))

(if (and (inside mp-v1old-v1 vtx-list)

(inside mp-v1old-v3 vtx-list)

421

CONNECT 프로그램

<그림 3-34>

Connect 프로그램을 사용한

각형 도형의 생성

Page 116: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(inside mp-v1-v2 vtx-list))

(command "3dface" old_v1 v2 v3 "" ""))

))

(if (and (inside mp-v1-v2 vtx-list)

(inside mp-v2-v3 vtx-list)

(inside mp-v1-v2 vtx-list))

(command "3dface" v1 v2 v3 "" ""))

(if (and vtx-list (cdr vtx-list))

(setq vtx-list (cdr vtx-list)))))))

(defun c:ct () ;; 주프로그램

(c:connect))

(princ "\nCommand level function C:CONNECT loaded -

type CONNECT to connect two polyline contours with a 3DMESH.")

(princ)

422

제3 장 AutoLISP유틸리티

Page 117: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

14. Sheet Metal 도면 작성 프로그램

본 프로그램은 Ralph Burkey에 의해서 1994년에 인터넷에 게재된 내용

이다.

Cordchrt.lsp는 금속판에 그려져 있는 구멍에 차트를 그리는 프로그램이다.

이를 운용하기 위해서는 두 개의 도면이 필요한데, 하나는 CORDTITLE.

DWG와 CORENTRY.DWG인데 이 두 도면은 오토캐드의 패스 내에 있어야

한다.

그 후에 오토캐드의 도면편집기를 사용하여 원하는 도면을 가져온다. 텍스

트 스타일의 "STANDARD"은 높이를 0으로 하여 정의한다. 이와 같이 하려

면 STYLE을 입력하고 height 옵션이 나올 때까지 디폴트로서 진행하여 가

고, height가 나오면 0를 입력한다. 이외의 옵션 값들은 역시 디폴트로 정의

한다.

파일의 풀다운 메뉴로부터 APPLICATION을 선택한다. CORDCHRT.

LSP 파일을 찾아서 읽어 들리고 CORDCHRT를 입력하여 프로그램을 실행

한 후 다음의 과정을 거친다.

Is this a new chart or a continuation? (N or C) <N>

(N이나C룰입력한다. 디폴트값은N이고이값을사용하려면단순히리턴을한다. 만약기존의차트에요소를추가하려면

C를입력하고리턴을한다.)

Set upper left corner of chart.

(오른쪽으로7인치정도의길이여유를두고점을선택한다. 타이틀블럭이나타난다.)

Choose point for 0,0 datum:

423

Sheet Metal 도면작성프로그램

Page 118: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(패널의기준위치점을선택한다. 좌하단에위치하는것이좋다. 그래야만다른점들의X,Y 좌표가양의수가되기때문이다.)

How many decimal places for coordinates on chart?

(차트에서원하는만큼의X, Y의십진법자리수의값을입력한다.)

Enter decimal places for diameter display or 0 for fractions.

(분수형태로서지름을표시하고싶은경우에는 (예 2-1/2) 0를입력하고그렇지않은경우에는전단계에서의입력대로십진법

으로의자리수를입력한다.)

Choose hole to list:

(패널에서의홀을선택한다. 선택된홀은하일라이트된다.)

Any Comments? (N or Comment) <N>

(특별히커멘트를달경우에원하는스트링을입력한다. 예를들어어느홀이밸브를장착할주요홀이라면, 볼트가들어갈홀을

표시한뒤, 커멘트 부분에 "See detail" "A" 등과 같이표시할수있다. 그렇지 않은경우에는 N을입력하거나디폴트입력

을주면된다. 홀을 연속적으로처리할때현단계에서의커멘트의디폴트는바로전단계의값임을유의하면이를유용하게활

용할수있다. 즉 비슷한종류의홀을연속적으로처리할경우반복적인커멘트를계속해서입력할수있는것이다. 커멘트를넣

지않으려면단순히N을입력하면된다.

이 단계에서 홀의 번호, X 좌표값, Y 좌표값, 지름과 커멘트에 대한 값이 나타난다. 각각의 모듈은 블럭으로 구성되어 있으며

DDATTE를사용하여쉽게수정할수있다. 상응하는홀의번호는홀의바로아래에위치하게된다.)

Do you wish to continue? (Y or N) <Y>

(계속하여 진행할 때에는 엔터를 입력하고, 그렇지 않은 경우에는 N을 입력하고 엔터를 입력하면 프로그램을 종료한다. 첫번째

프롬프트에서C를입력한경우에는다음과같은프롬프트가나타난다.)

Select existing 0,0 datum:

424

제3 장 AutoLISP유틸리티

Page 119: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(0,0를위치할자리를선택한다.)

How many decimal places for coordinates on chart?

(차트에서원하는만큼X, Y의십진법자리수의값을입력한다.)

Enter decimal places for diameter display or 0 for fractions.

(분수형태로서지름을표시하고싶은경우에는 (예 2-1/2) 0를입력하고그렇지않은경우에는전단계에서의입력대로십진법

으로의자리수를입력한다.)

What number for the first hole?

(차트의지난번홀에이어서붙여야할홀번호를입력한다.)

Select lower left corner of existing chart:

(존재하는차트의좌하단의모서리를선택하면이곳으로부터차트를시작한다. "Choose hole to list" 로 앞의순서와같

은방법으로원하는만큼의홀의차트를작성할수있다.)

소프트웨어에 대하여 만족하게 사용하 다면 아래의 주소로 등록기금을 보

내면 좋다.

PLEASE SEND $10.00 (cheap!) TO:

BURKEY COMPUTER SERVICES

6705 FIRE HILL DRIVE

FORT WORTH, TX

76137

425

Sheet Metal 도면작성프로그램

Page 120: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

;*** Coordinate chart definition by Ralph Burkey ***

;*** Copyright 1994 Ralph Burkey ***

(Defun C:Cordchrt ()

(setvar "CMDECHO" 0)

(defun dtr (a)

(* pi (/ a 180.0))

)

(setq fname1 "CORTITLE.DWG")

(setq fname2 "CORENTRY.DWG")

(setq file1 (open fname1 "r"))

(setq file2 (open fname2 "r"))

(if (or (= file1 nil)

(= file2 nil)

) ;; 기존도면을읽어들인다

(progn

(setq msg1 "\n Chart title block (CORTITLE.DWG) and entry block (CORENTRY.DWG)

must be in AutoCAD search path. ")

(setq msg2 "\n Check block locations and try again. ")

(princ msg1)

(princ msg2)

);progn ;; 기존도면이존재하지않는경우

(progn

(setq val 0)

(setq chk (strcase (getstring "\nIs this a new chart or a continuation? (N or C) <N> ")))

(while (= val 0)

426

제3 장 AutoLISP유틸리티

Page 121: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(if (= chk "N")

(setq val 1)

(if (= chk "C")

(setq val 2)

(if (= chk "")

(setq val 1)

(setq chk (getstring "\nN or C, please: "))

);if

);if

);if

);while

(while (= val 1) ;; New chart 인경우

(setq pt1 (getpoint "\nSet upper left corner of chart: "))

(setq blpvar (getvar "BLIPMODE"))

(setvar "BLIPMODE" 0)

(setq scl (getvar "DIMSCALE"))

(setq pt3 (polar pt1 (dtr 270) (* scl 0.50)))

(command "INSERT" "CORTITLE" pt1 scl "" "")

(setvar "BLIPMODE" blpvar)

(setq XY (getpoint "\nChoose point for 0,0 datum: "))

(setvar "BLIPMODE" 0)

(setq dec (getint "\nHow many decimal places for coordinates on chart? "))

(setq X (car XY))

(setq XX (rtos X 2 dec)) ;; 스트링으로변환(real을 string으로)

(setq Y (cadr XY))

(setq YY (rtos Y 2 dec))

427

Sheet Metal 도면작성프로그램

Page 122: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(setq fr1 (strcase (getstring "\nEnter decimal places for diameter display or 0 for

fractions: ")))

(setq nme 1)

(setq LL (list X Y))

(setq MM (polar LL (dtr 270) (* scl 0.25)))

(command "TEXT" "S" "STANDARD" "C" MM "" "" "(0,0)") ;; MM은텍스트위치

(setq quest (strcat "Any " "comments? " " (N or Comment) <N> "))

(setq query "N")

(setq val 3)

);while

(while (= val 2) ;; 연속적인차트의경우

(setq blpvar (getvar "BLIPMODE"))

(setq XY (getpoint "\nSelect existing 0,0 datum: "))

(setq scl (getvar "DIMSCALE"))

(setvar "BLIPMODE" 0)

(setq dec (getint "\nHow many decimal places for coordinates on chart? "))

(setq X (car XY))

(setq XX (rtos X 2 dec))

(setq Y (cadr XY))

(setq YY (rtos Y 2 dec))

(setq fr1 (strcase (getstring "\nEnter decimal places for diameter display or 0 for

fractions: ")))

(setq nme (getint "\nWhat number for the first hole? "))

(setvar "CMDECHO" 0)

(setq pt3 (getpoint "\nSelect lower left corner of existing chart: "))

(setq LL (list X Y))

428

제3 장 AutoLISP유틸리티

Page 123: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(setq MM (polar LL (dtr 270) (* scl 0.25)))

(setq quest (strcat "Any " "comments? " " (N or Comment) <N> "))

(setq query "N")

(setq val 3)

);while

(while (= val 3)

(setvar "CMDECHO" 0)

(setvar "BLIPMODE" blpvar)

(setq test 0)

(setq z (entsel "\nChoose hole to list: "))

(while (/= test 1)

(while (= z nil)

(setq z (entsel "\nHole not found...try again: ")) ;; 홀이존재하지않는경우

);while

(setq P (entget (car z)))

(setq zent (car z))

(setq type (cdr (assoc 0 P)))

(if (= type "CIRCLE") ;; 원이제대로선택된경우

(progn

(setq test 1)

(redraw zent 3)

);progn

(if (/= type "ARC")

(setq z (entsel "\nEntity selected is not a circle or an arc...try again: "))

(progn

(setq test 1)

429

Sheet Metal 도면작성프로그램

Page 124: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(redraw zent 3)

);progn

);if

);if

);while

(setvar "BLIPMODE" 0)

(setq Q (cadr (assoc 10 P))) ; 원의x 좌표를구함

(setq Q1 (- Q X)) ; 0,0 에대한x 값을구함 ;

(setq W (rtos Q1 2 dec)) ; x 에대한십진자릿수를정함;

(setq R (caddr (assoc 10 P))) ; 원의y 좌표를구함;

(setq R1 (- R Y)) ; 0,0 에대한y 값을구함;

(setq U (rtos R1 2 dec)) ; y 에대한십진자릿수를구함;

(setq S (cdr (assoc 40 P))) ; 원의반지름을구함;

(setq S2 (* S 2.0)) ; 원의지름을구함;

(if (= fr1 "0")

(progn

(setq v (rtos s2 5 6))

(if (= (substr v 2 1) " ")

(setq v (strcat (substr v 1 1) "-" (substr v 3 (strlen v)))) ;; 자릿수맞춤

(if (= (substr v 3 1) " ")

(setq v (strcat (substr v 1 2) "-" (substr v 4 (strlen v))))

(if (= (substr v 4 1) " ")

(setq v (strcat (substr v 1 3) "-" (substr 5 (strlen v))))

);if

);if

);if

430

제3 장 AutoLISP유틸리티

Page 125: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

);progn

(progn

(setq fr2 (atoi fr1))

(setq V (rtos S2 2 fr2))

);progn

);if; sets decimal places for diameter ;

(setq LL (list Q R))

(setq MM (polar LL (dtr 270) (+ S (* scl 0.125))))

(setq query1 query)

(setq query (getstring T quest))

(if (= query "")

(setq query query1)

);if

(if (or (= query "N")

(= query "n")

);or

(progn

(setq LL (list Q R))

(setq MM (polar LL (dtr 270) (+ S (* scl 0.125))))

(setq query "")

);progn

);if

(command "INSERT" "CORENTRY" pt3 scl "" "" nme W U V query)

(command "TEXT" "S" "STANDARD" "M" MM "" "" nme)

(setq nme (1+ nme))

(setq pt3 (polar pt3 (dtr 270) (* scl 0.25)))

431

Sheet Metal 도면작성프로그램

Page 126: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

(if (= query "")

(setq query "N")

);if

(setq quest (strcat "Any comments? (N or Comment) <" query "> "))

(setvar "BLIPMODE" blpvar)

(setvar "CMDECHO" 1)

(redraw zent 4)

(setq val 4)

(setq lim (strcase (getstring "\nDo you wish to continue? (Y or N) <Y> ")))

(while (= val 4)

(if (= lim "N")(setq val 5)

(if (= lim "Y")(setq val 3)

(if (= lim "")(setq val 3)

(setq lim (getstring "\nY or N, please: "))

);if

432

제3 장 AutoLISP유틸리티

<그림 3-35>

Cordchrt 프로그램을 이용한

홀의 사양표 작성

Page 127: AutoLISP , p ; m · p d m w 3 Þ × Ñ è (s î efgvo d ;8 dpnnboe [ppn x qsjod i d Ñ ' 7;00. 8 & × z ø 8 p d w x 8 5 ý d > Þ Þ q ç ³ î Ê; ì8 ì &oufs

);if

);if

);while

);while

);progn

);if

(prin1)

)

433

Sheet Metal 도면작성프로그램