카테고리 없음

[AutoCAD]AutoLisp 예제 - 폭이 존재하는 폴리선 만들기

데브프로그라 2024. 2. 23. 21:29
반응형

AutoCAD에서는 폴리선(Polyline)을 이용하여 다양한 기능과 프로그램에 응용할 수 있다.

폴리선을 작성하여 길이와 위치, 다음 포인트등을 활용하여 간격, 위치등 다양하게 활용할 수 있다.

 

메모장 및 텍스트 편집기에서 아래와 같이 작성하고 test.lsp파일을 만든다.
AutoCAD를 실행하여 appload명령을 이용하여 해당 리습파일을 올린다.
poly1 라는 명령을 Command 상에서 실행한다.

명령은 poly1을 사용자가 원하는 명령어 이름으로 변경하여 사용할 수 있다.
실행을 완료하면 zoom all을 이용하여 그려진 폴리선을 확인한다.


결과 : 폭이 있는 노란 폴리선을 확인한다.
응용 : 각 정보를 이용하여 변형해서 확인해 본다.
 
(defun c:poly1()
    ;vertex list
    (Setq vlist '( (50 50) (150 50) (150 150) (50 150)  ))
    (setq elist '())
    (setq lay "0")
    (setq col 2)
    (setq wdt 2.0)
    ;build header
 
    (setq elist (append elist
                (list               
                    (cons 0  "LWPOLYLINE")
                    (cons 100  "AcDbEntity")
                    (cons 67  0)
                    (cons 62 col)
                    (cons 410  "Model")
                    (cons 8 lay)
                    (cons 100 "AcDbPolyline")
                    (cons 90 (length vlist))
                    (cons 70  1)
                    (cons 43  wdt)
                    (cons 38  0.0)
                    (cons 39  0.0)
                )
             )
      );setq               
   
    ;build vertexes
    (foreach pt vlist
        (setq elist (append elist
                (list   
                    (cons 10  pt)
                    (cons 40  2.0)
                    (cons 41  2.0)
                    (cons 42  0.0)
                )
                )
        );setq             
    );foreach
 
    (setq elist (append elist (list (list 210 0.0 0.0 1.0)))) ;normal vector
    ;create lwpolyline
    (entmake elist)
    (princ)
)

 

결과 : AutoCAD에서 실행한 결과 화면

 

화면을 보면서 다양하게 변경하여 확인할 수 있다.

색상변경, 크기변경, 폭 변경 등

 

위치를 입력받는 방식인 GetPoint, GetCorner를 이용하여 폴리선을 만들어보는 예제

(defun c:poly2()
  (setq ptLB(GetPoint "\n첫번째 위치:"))
  (setq ptRT(GetCorner ptLB "\n두번째 위치:"))
  (setq ptLT(List (car ptLB) (cadr ptRT)))
  (setq ptRB(List (car ptRT) (cadr ptLB)))
  (command "pline" ptLB ptLT ptRT ptRB "c")
)

 

Getpoint 함수

사용자 함수로 좌표값을 마우스로 입력받는 함수이다.

입력받은 좌표값(x y z)setq함수로 선언한 변수에 치환하는 방식으로 setq함수와 주로 같이 쓰인다.

(getpoint) - 기본 메시지를 이용하여 포인트를 받는다.

(getpoint "\n메시지") - 원한는 메시지를 이용하여 포인트를 받는다.

(setq pt1 (getpoint "\n메시지")) - 포인트를 받아서 pt1에 저장한다.

(setq pt2 (getpoint pt1  "\n메시지")) - pt1 좌표에서 다음 받을 좌표까지 Line Drag가 이루어지며, 포인트를 pt2에 받는다.

메시지는 큰따옴표로 반드시 묶도록 한다.

메시지의 앞의 ‘\n’은 개행문자로써 메시지를 다음줄에 표시해준다.

메시지는 생략가능하나 입력함수 의미 부각으로 넣어주는 것이 바람직하다.

 

Getcorner 함수

기준점으로부터 대각방향의 좌표값을 받는데, 사작형 Drag로 화면에 표시된다.

(getcorner 기준점)

(getcorner 기준점 "메시지")

(setq pt1 (getpoint "\nLeft Corner:"))

(setq pt2 (getcorner pt1 "\nRight Corner :"))

Getpoint와 GetCorner를 이용하여 마치 사각드래그 형식으로 좌측코너와 우측코너를 입력 받는다.

 

표 만들기 예제

먼저 좌측 코너와 우측 코너를 사용자에게 입력받아

좌우상하 중간점을 Polar를 이용하여 좌표를 받아온 후 Polyline과 Line으로 그려준다.

 

<예제> 표 그리기

(defun c:tt1 ()
(setq ptLB (getpoint "\n좌측 코너:"))
(setq ptRT (getcorner ptLB "\n우측 코너:"))
(setq ptLT(List (car ptLB) (cadr ptRT)))
(setq ptRB(List (car ptRT) (cadr ptLB)))
(command "pline" ptLB ptLT ptRT ptRB "c")

(setq distH (distance ptLT ptRT)) ;;가로 길이를 구한다.
(setq distV (distance ptLB ptLT)) ;; 세로 길이를 구한다.

 

;;Polar를 이용하여 중간점을 구한다.
(setq ptTM (polar ptLT (angle ptLT ptRT) (/ distH 2))) 
(setq ptBM (polar ptLB (angle ptLB ptRB) (/ distH 2)))
(command "line" ptTM ptBM "");;중간 상하 그리기

(setq ptLM (polar ptLB (angle ptLB ptLT) (/ distV 2)))
(setq ptRM (polar ptRB (angle ptRB ptRT) (/ distV 2)))
(command "line" ptLM ptRM "");;중간 좌우 그리기

(redraw) 
)

 

반응형