ID:
PW:

     0 분
     8 분

프로그래밍 Tips
프로그래밍에 관한 Tip을 공유하는 곳입니다.


[PYTHON] python으로 ZWCAD통제하기
이석종  2021-01-31 06:42:48, 조회 : 368, 추천 : 2
- Download #1 : after.png (20.1 KB), Download : 0


요즘 저가 캐드(대안캐드가 맞겠군요) 에 관한 관심이 높아지고 있습니다.

오늘은 대안 캐드 중 하나인 ZWCAD를 python으로 통제하는 것을 해보겠습니다.

ZWCAD는 기본적으로 lisp, vba 등의 개발환경을 제공하고 있습니다.

하지만 python으로도 가능하면 더 좋겠죠? 그래서 검색해봤는데 pyzwcad가 pypi.org에 등록되어 있었습니다. 역시 zwcad는 시장 규모가 큰 중국에서 개발하는 소프트웨어라서 그런지 대응이 빠른 것 같다는 생각을 해봤습니다.

설치방법 등은 'python으로 autocad통제하기'내용과 모두 같습니다. 다만 pyautocad를 설치하는 대시 pyzwcad를 설치하는 것만 다르고 import명령 줄만 다릅니다.

일단 pyzwcad를 아래의 링크를 참조해서 설치합니다.
https://pypi.org/project/pyzwcad/



설치방법은 python을 실행할 수 있는 console을 실행한 후 pip install pyzwcad를 실행합니다.
console을 띄우는 방법은 윈도우에서는 cmd창을 띄우면 됩니다. 물론 python이 깔려있어야 합니다.

pyzwcad가 설치된 후에 ZWCAD를 실행합니다. 물론 console과 ZWCAD의 실행 순서는 관계가 없습니다. ZWCAD를 먼저 실행해도 관계 없습니다.

이제 test.py라는 파일을 만듭니다. 이 파일을 실행하면 ZWCAD에 그림이 그려지는 예제입니다. text editor를 실행하고 아래의 내용을 입력한 후 test.py라는 이름으로 저장합니다.

이제 console에서 python test.py를 실행합니다.
그러면 ZWCAD에 그림이 그려집니다. 그리고 console에도 여러가지 정보들이 출력됩니다. 이프로그램이 어떤 기능을 하는 것인지는 설명드리겠습니다.



test.py의 내용을 간략하게 설명하자면,
from pyzwcad import ZwCAD, APoint



이 줄은 아까 설치한 pyzwcad 팩키지를 import하는 것입니다.

acad = ZwCAD()

이 줄은 ZWCAD를 acad라는 이름으로 부르겠다는 뜻입니다.
이 줄이 실행된 후에는 ZWCAD는 acad라는 이름으로 통제가 가능하게 됩니다.

acad.prompt("Hello, Autocad from Python\n")

이 줄은 ZWCAD 에 문자열을 출력하는 명령입니다.

print acad.doc.Name

이 명령은 console창에 ZWCAD의 파일명(doc.Name)을 출력하는 내용입니다.
ZWCAD의 정보를 python으로 불러올 수 있는 것이죠.

p1 = APoint(0, 0)

APoint함수를 이용해서 p1이라는 변수명에 0,0이라는 좌표를 할당합니다.

for i in range(5):

python의 for 반복문입니다. range(5)는 0,1,2,3,4 라는 값을 만들어서 i에 대입하면서 순서대로 반복하라는 뜻입니다.

    text = acad.model.AddText('Hi %s!' % i, p1, 2.5)

model space에 text를 추가하는 명려입니다.
'Hi %s!'% i  --> 이부분은 i를 %s에 대입해서 출력하라는 것이구요.
p1 --> 삽입점을 정해주는 것이고
2.5 --> 글자크기입니다. 일반적으로 텍스트를 쓸 때 필요한 정보입니다.

    acad.model.AddLine(p1, p2)

선을 그리는 명령입니다. 마찬가지로 acad.model을 지정해주고 Addline을 했습니다. p1,p2는 시작점 끝점이겠죠.

    acad.model.AddCircle(p1, 10)

다음은 원을 그리는 명령입니다. p1이 원점좌표, 10이 원의 반지름입니다.

여기까지가 텍스트,라인,원을 그리는 명령입니다.

    p1.y += 10

이 문장은 다음 세트를 그리기 위해서 y좌표에 10을 더해주는 명령이구요

이렇게 해서 5개의 텍스트, 라인, 원을 그리도록 되어있습니다.

여기까지가 새로운 개체를 만드는 예제였다면
이 이후의 코드는 ZWCAD에서 정보를 가져오는 예제입니다.

이미 만들어진 텍스트의 위치를 오른쪽으로 10만큼 움직이고
선과 원의 object이름을 출력해주는 기능입니다.

한 줄씩 보겠습니다.

dp = APoint(10, 0)

우선 delta p즉 움직일 양을 설정해줍니다. 오른쪽으로 10만큼입니다.

for text in acad.iter_objects('Text'):

python의 for문을 이용해서 반복하는데 iter_objects기능을 이용합니다. 'Text'들을 모두 골라내서 text란 이름으로 부여해서 차례대로 뭔가 하겠다는 뜻입니다. 무엇을 할 것인지는 아래에 나오겠죠?

    print('text: %s at: %s' % (text.TextString, text.InsertionPoint))

python의 print기능을 이용합니다. %를 이용해서 fortmatting을 하고 있구요.
첫번째 %s엔 text.TextString을 넣겠다는 것이고
두번째 %s에는 text.InsertionPoint를 넣겠다는 뜻입니다.
text라는 객체의 TextString은 text내용, InsertionPoint는 삽입점이라는 뜻이겠죠?
이 문장을 실행하면 python console에 이렇게 출력이 됩니다.
text: Hi 0! at: (0.0, 0.0, 0.0)

    text.InsertionPoint = APoint(text.InsertionPoint) + dp

이 문장은 text의 InsertionPoint를 변경하는 문장입니다. Apoint(text.InsertionPoint)에 dp만큼 더하고 있습니다. dp는 10,0이었습니다. 오늘쪽으로 10만큼 움직이는 것이죠.

이렇게 해서 모든 라인과 원의 좌표를 출력했고 텍스트들을 오른쪽으로 10만큼 이동시켰습니다.

다음 기능도 위의 기능과 비슷합니다.
이번에는 object들의 이름을 출력해주는 기능입니다.
for문은 앞의 것과 같은데 어떤 object들을 선택할 것인가만 다릅니다.

for obj in acad.iter_objects(['Circle', 'Line']):

[ ]로 묶어서 'Circle'과 'Line'을 모두 선택하도록 했습니다. 선택된 object들을 obj라는 변수에 할당했구요.

    print(obj.ObjectName)

obj의 ObjectName을 print문으로 출력했습니다.

이렇게 해서 새로운 라인,원,텍스트를 생성하고,
만들어진 ojbect들의 좌표를 출력하고, 옮기고, object들의 이름을 출력하는 프로그램을 설명해드렸습니다.

--- test.py --

from pyzwcad import ZwCAD, APoint

acad = ZwCAD()
acad.prompt("Hello, Autocad from Python\n")
print acad.doc.Name

p1 = APoint(0, 0)
p2 = APoint(50, 25)
for i in range(5):
    text = acad.model.AddText('Hi %s!' % i, p1, 2.5)
    acad.model.AddLine(p1, p2)
    acad.model.AddCircle(p1, 10)
    p1.y += 10

dp = APoint(10, 0)
for text in acad.iter_objects('Text'):
    print('text: %s at: %s' % (text.TextString, text.InsertionPoint))
    text.InsertionPoint = APoint(text.InsertionPoint) + dp

for obj in acad.iter_objects(['Circle', 'Line']):
    print(obj.ObjectName)

-- test.py --





이석종
이 기능은 ZWCAD만 되는 것이 아니고 AutoCAD도 됩니다. python으로 AutoCAD통제하기는 이 게시판에 올려져있습니다. 아래 링크를 참고하세요.
http://www.gumifo.org/zeroboard/view.php?id=devtips&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=15
2021-01-31
11:27:39

 


이석종
pyzwcad의 자세한 기능은 pyautocad를 참조하시기 바랍니다.
http://pyautocad.readthedocs.io/en/latest/index.html
2021-01-31
13:37:00

 


  추천하기   목록보기

Copyright 1999-2021 Zeroboard / skin by zero
구조설계의 미래를 준비하는 모임 [구조설계미래포럼]