AutoCAD R12와 AutoCAD R14는 entity의 구조가 다른 부분이 있는데,그 중 하나가 폴리라인 입니다.
AutoCAD R12에서는 pline명령으로 폴리라인을 그리고, list로 정보를 보면,도면요소명이 "polyline"이라고 나올 것입니다.
그러나 AutoCAD R14에서는 pline명령으로 폴리라인을 그리고, list로 정보를 보면,도면요소명이 "lwpolyline"이라고 나옵니다.
물론 entget 함수로 내부구조를 봐도 다릅니다.
다음은 AutoCAD R14에서 사용하던 HBEAM을 그리는 lisp file의 일부입니다.
(command "pline" pt0 pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt9 pt10 pt11 pt12 "c")
(setq ename (entlast))
(setq en1 (entnext ename)
en2 (entnext en1)
en3 (entnext en2)
en4 (entnext en3)
en5 (entnext en4)
en6 (entnext en5)
en7 (entnext en6)
en8 (entnext en7)
en9 (entnext en8)
en10 (entnext en9)
en11 (entnext en10)
en12 (entnext en11)
en13 (entnext en12)
)
(setvar "filletrad" r1)
(command "fillet" en3 en4 "fillet" en4 en5)
(command "fillet" en9 en10 "fillet" en10 en11)
위에서와 같이 HBEAM을 polyline으로 그린후 web 부분을 fillet의 radius값을 조정하여 곡선으로 처리하였습니다.
이때, entnext하여 폴리라인의 다음 요소를 찾아가는 방식을 사용했는데,
R14 이상에서 이 lisp 명령을 사용한다면 원하는데로 실행되지 않을 것입니다.
R14에서 위와같은 결과를 fillet 명령을 통해 구현하고자 한다면,
HBEAM을 line으로 그려주고, fillet 한 후 pedit 명령으로 폴리라인을 만들어야 합니다.
수정한 lisp의 내용입니다.
(command "line" pt0 pt1 "")
(etq en1 (entlast))
(command "line" pt1 pt2 pt3 pt4 pt5 pt6 pt7 pt8 pt9 pt10 pt11 pt12 pt0 "")
(setq en2 (entnext en1)
:
:
:
en12 (entnext en11)
en13 (entnext en12)
)
(setvar "filletrad" r1)
(command "fillet" en3 en4 "fillet" en4 en5)
(command "fillet" en9 en10 "fillet" en10 en11)
(setq ent en1)
(while ent
(command ent)
(setq ent (entnext ent))
)
(command "" "x")
AutoCAD R14이전에는 폴리라인이 "polyline"이라는 도면요소명으로 시작하여 실제 정점에 대한 정보는 "vertex"라는 도면요소명 안에 기록하고, "seqend"라는 도면요소명으로 폴리라인의 끝을 나타냈습니다.
그러니까 폴리라인은 vertex들이 연결된 것이므로 각 정점에 대한 정보를 얻을때 "seqend"가 나올때까지 entnext하면 되었습니다.
그런데, AutoCAD R14이후부터는 2차원 폴리라인은 "lwpolyline"이라는 도면요소명 아래 각 정점의 좌표를 모두 기록하는 형식으로 바뀌었습니다.
그만큼 꼭 필요한 정보만 도면에 기록하게 되어 도면 파일의 크기가 줄게된 것입니다.
다음은 R14 이전과 이후의 폴리라인 정점에 대한 정보를 얻는 AutoLISP 내용입니다.
(defun @vtx_list@ (pl_ent / e_n ed vtx vtx_list ed_list endata edlen code1
code2 @ver)
(setq @ver (atoi (substr (getvar "acadver") 1 2)))
(cond ((< @ver 14)
(setq e_n pl_ent)
(setq vtx_list '() ed_list '() eqq nil)
(while (and (setq e_n (entnext e_n))
(setq ed (entget e_n))
(/= "SEQEND" (dxf 0 ed))
)
(setq vtx (dxf 10 ed))
(foreach @vtx vtx_list (if (equal vtx @vtx 0.1) (setq eqq T)))
(if (not eqq)
(setq ed_list (append ed_list (list ed))
vtx_list (append vtx_list (list vtx)))
(setq eqq nil)
)
)
(list ed_list vtx_list)
)
((= @ver 14)
(setq endata (entget pl_ent))
(setq e_n (dxf 0 endata))
(setq vtx_list '() ed_list '())
(if (= e_n "LWPOLYLINE")
(progn
(setq edlen (length endata))
(setq nn 0)
(repeat edlen
(setq code1 (car (nth nn endata)))
(setq code2 (cdr (nth nn endata)))
(if (= code1 10)
(setq vtx_list (append vtx_list (list code2)))
)
(if (= code1 42)
(setq ed_list (append ed_list (list (list (cons code1 code2)))))
)
(setq nn (1+ nn))
)
)
)
(list ed_list vtx_list)
)
)
)
카페 게시글
LISP강좌
polyline다루기
구대근
추천 0
조회 522
01.03.27 00:10
댓글 0
다음검색