사례 제작자: CAD 개발셀 김민섭님
원본 : 컨플루언스 https://midasitdev.atlassian.net/wiki/spaces/CADDEV/pages/3005614998/Midas+AutoLISP+GPT+LISP
ChatGPT! 너무 좋은데? CAD에서 쓸 수 있는 방법은 없을까?
요즘 ChatGPT를 활용한 사례가 계속해서 나오고 있습니다.
자기소개서, 에세이, 소설, 음악, 프로그램 개발 등 정말 다양한 분야에서 활용하고 있습니다.
저 역시도 간단한 개발을 진행할때 ChatGPT를 종종 활용하고 있습니다.
그런데 CAD 에서 활용할 수 있는 방법은 없을까?
이미 다른분들이 CAD에서도 GPT를 활용해 보려고 노력중이였습니다.
CAD 에 대한 사용 설명
ARX에 대한 개발
LISP 을 통한 개발
위와 같은 것들을 사용하고 있었습니다.
그래서 한번 해봤습니다!
오오 뭔가 그럴싸 한데?
그럴싸한 리습 파일을 만들어 주긴 하였지만
저희 제품에서는 제대로 동작하지 않았습니다…… ㅜㅜ
왜 안되지? GPT 문제? 우리 제품 문제?
ChatGPT 가 잘 못 만든 경우
우리 CAD 제품은 우수하기에? GPT가 잘못했다고 생각했습니다.
여러번 시도를 해본 결과 GPT가 제대로 만들지 않는 경우가 많았습니다.
특히 다음과 같이 간단하게 질문했을 경우에 말이죠
“ CAD 프로그램에서 동작하는 별을 그릴 수 있는 LISP 프로그램 작성해줘” “ 계단을 그릴 수 있는 Lisp 프로그램 작성해줘”
우리 제품 문제인 경우
GPT가 잘 만들어 주었더라도 우리제품이 Lisp 문법을 지원하지 않는 경우가 있었습니다.
특히 Autodesk 사에서 자주 사용하는 VLISP 관련 함수들이 누락 된 경우가 있습니다.
개선을 통해 점차 해결해 나아갈 수 있지만 저는 지금 당장 결과물을 보고 싶었습니다 ㅜㅜ
GPT를 커스텀 할 수 있지 않을까? feat, OpenAI api
GPT와 관련된 자료들을 찾아보니 API로서 활용할 수 있는 방법이 있었습니다.
유료 구독 결제를 하지 않더라도 GPT 3.5-terbo, gpt-4 를 사용할 수 있었습니다.( 건별 결제이긴 합니다.)
그리고 가장 유용한 것은, GPT에게 역할을 부여할 수 있다는 것입니다.
GPT야 너는 이제부터 Midas LISP 전용 GPT야!
일반적으로 우리가 사용하는 ChatGPT와는 다르게 API를 활용하면 시스템 명령을 줄 수 있습니다.
위 예시처럼 어떠한 답변을 줘야 할지 지정 할 수 있습니다.
그렇다면 GPT가 저희 제품에서 더 좋은 품질의 답변을 내놓으려면 어떻게 해야 할까요???
먼저 우리를 알려주자!
ChatGPT가 Lisp 관련 코드를 알려줄 때 저희가 가지고 있는 함수 외에 있는 함수를 작성해 주니 저희 CAD 제품에서 제대로 인식하지 못했습니다. 그래서 GPT에게 저희 제품이 지원하고 있는 VLISP 관련 함수를 알려주는 프롬포트를 작성했습니다.
MidasCAD 가 지원 가능한 VLisp 을 json 형태로 정리한 것
또한 저희 제품이 2D CAD 라는점, 사용자 입력이 동반되어야 한다는 점 등을 다음과 같이 System 명령으로 주었습니다. (lispData} ← 저희가 사용할 수 있는 VLisp Data 입니다.
- The VLISP functions we can use : {lispData}
- Write in a way that allows the user to witout enter parameters
- Basic LISP functions are available
- Please write an example usage in the comments below.
- To make it work in 2D CAD program
- Add a c: so it's ready to run질문도 잘 해보자!
우리 제품에 대해서 잘 알려줬으나 ChatGPT를 잘 활용하기 위해서는 질문도 잘 해야 합니다.
저는 계단을 자동으로 그려보고 싶었기에 두 점을 입력 받고, 계단이 너비, 높이를 입력할 수 있는 Lisp을 그려달라고 했습니다.
다음과 같은 시나리오로 동작하는 리습을 만들어줘!
계단을 그리는 리습을 만들거야!
- 두 점을 입력 받는다.
- 계단의 너비를 입력받는다.
- 계단의 높이를 입력받는다.
- 두 점 사이를 계단으로 만들어준다.
그랬더니 다음과 같은 답변과 함께 리습 코드를 작성해 주었습니다.
아래는 AutoCAD 2D에서 동작하는 계단 그리기 리습입니다.
사용자로부터 시작점과 끝점, 그리고 계단의 너비와 높이를 입력받아서,
두 점을 계단으로 이어줍니다.
```
(defun c:drawstairs()
(setq startpt (getpoint "\nSpecify start point: "))
(setq endpt (getpoint startpt "\nSpecify end point: "))
(setq width (getdist "\nSpecify width of stairs: "))
(setq height (getdist "\nSpecify height of stairs: "))
(setq slope (/ height width))
(setq dx (- (car endpt) (car startpt)))
(setq dy (- (cadr endpt) (cadr startpt)))
(setq angle (atan dy dx))
(setq distance (distance startpt endpt))
(setq steps (fix (/ distance width)))
(setq remainder (/ (- distance (* steps width)) width))
(setq x (car startpt))
(setq y (cadr startpt))
(command "._line" startpt (list x (+ y height)))
(setq y (+ y height))
(repeat steps
(setq x (+ x width))
(setq y (+ y (* slope width)))
(command "._line" (list x (- y height)) (list x y))
(setq x x)
(setq y y)
)
(if (/= remainder 0.0)
(progn (setq x (+ x remainder))
(setq y (+ y (* slope remainder)))
(command "._line" (list x (- y height)) (list x y))
(setq x x)
(setq y y)
)
)
(command "._line" endpt (list x (+ y height)))
(princ)
)
```
사용 예시:
1. 계단 그리기 명령을 입력합니다.
2. 시작점을 지정합니다.
3. 끝점을 지정합니다.
4. 계단의 너비를 지정합니다.
5. 계단의 높이를 지정합니다.
6. 두 점을 입력된 너비와 높이를 바탕으로 계단으로 연결합니다.
참고: 이 리습은 2D AutoCAD에서만 동작하며,
3D AutoCAD에서는 원하는 대로 동작하지 않을 수 있습니다.실제로 잘 동작하나?
오오오옹오오오옹오
뭔가 끝에가 살짝 아쉽긴 하지만 그래도 뭔가 잘 나온것 같은 느낌이 듭니다.
이거 이대로 사용 가능?
지금의 과정대로 GPT에게 물어보고 이를 Lisp 파일로 만들고, 로드를 한다고 하면 굉장히 사용하기 불편할 것 같다는 생각이 듭니다.
또한 아직까지 정확도가 떨어지기 때문에 좀 더 보완해야 할 것 같다는 생각입니다.
CAD 제품 내에서 명령을 바로 만들고, 실행해보고 상호작용을 한다면 편의성을 향상시킬 수 있을 것 같다는 생각이 듭니다.
또한 상호작용이 가능하기 때문에 Lsip 명령을 수정하거나 다시 생성해 달라고 할 수도 있을 것 같다는 생각이 듭니다.
실제로 CAD 에 탐재되면 이런 느낌???










