ID:
PW:

     0 분
     11 분

엔지니어 돌종
  dolljong
프로그래밍 Tips
프로그래밍에 관한 Tip을 공유하는 곳입니다.


(엔지니어를 위한)파이썬 시작하기[15] 파이썬-캐드 연동(pyautocad)
이석종  2022-12-20 16:18:01, 조회 : 698, 추천 : 46
- Download #1 : engpython15.png (47.9 KB), Download : 6


(엔지니어를 위한) 파이썬 시작하기[15]

 

내용 : 파이썬-CAD 연동-1/2(pyautocad,pyzwcad)

참조 : https://pypi.org/project/pyautocad/  (pyautoacad - AutoCAD Automation for Python

)

https://pyautocad.readthedocs.io/en/latest/ (Welcome to pyautocad’s documentation!)

https://pypi.org/project/pyzwcad/ (pyzwcad - ZwCAD Automation for Python)

 

 

0.시작하며

엔지니어들이 많이 사용하는 소프트웨어 중 엑셀과 함께 가장 많이 사용하는 소프웨어가 CAD일 것이다. 설계라는 것이 기획-계획-계산(분석)-도면작성의 순으로 이루어지고 최종 성과품은 도면이다. 한국에서는 AutoCAD시장 점유율이 매우 높다. python을 지원하는 CAD는 AutoCAD, ZWCAD가 있다. (pypi.org 사이트기준) 대부분의 저가형 캐드는 AutoCAD를 모사했으므로 사용법이 거의 비슷하다고 보면 되겠다. 대부분의 CAD는 LISP, C#, C++, Visual Basic을 지원한다. 하지만 파이썬을 이용하는 이유는 파이썬이 라이브러리가 다양하고 다른 목적으로 개발하는 프로그램(예를 들어 구조계산프로그램)과 연동하기 위해서다. 즉 파이썬 코드 하나로 다른 기능들을 모두 구현하기 위함이다.  

 

1. ActiveX , COM, comtypes

파이썬으로 CAD를 통제하기 위해서는 pyautocad가 설치되어 있어야 한다. 이 프로그램의 설명에는 This library aimed to simplify writing ActiveX Automation scripts for AutoCAD with Python’라고 써있다. ActiveX작성을 쉽게 하기 위한 라이브러리라는 것이다. 그렇다면 ActiveX는 또 무엇인가? 깊이 알 필요는 없지만 대충 이런 것이다 정도 알고 넘어가자. ActiveX는 마이크로소프트가 만든 기술로 프로그램간에 소통할 수 있도록 해주는 기술이다. 이정도만 알고 있자. COM(Component Object Model) 과 OLE(Object Linking and Embedding)를 합쳐서 ActiveX라고 불렀다고 한다. OLE는 아마도 마이크로소프트 엑셀을 쓸 때 들어본 적이 있을 것이다. python을 이용해서 CAD프로그램을 통제하는 것은 COM기술을 이용하는 것이라는 것 정도만 알아두자.

이번 게시물에서는 pyautocad라는 라이브러리를 이용하겠지만 다음 게시물에는 comtypes라이브러리를 이용할 것이다. 둘 다 COM기술을 이용하는 것이지만 pyautocad는 autocad를 위해서 단순하게 만든 것이고 comtypes는 autocad뿐 아니라 엑셀 등에도 적용할 수 있는 범용 기술이라고 생각하면 되겠다.

 

2. pyautocad 설치하기.

파이썬으로 CAD를 통제하기 위해서 pyautocad를 설치하자. pip명령을 이용하면 된다.

pip install pyautocad

 

(base) D:\dev\python\pyautocad>pip show pyautocad
Name: pyautocad
Version:
0.2.0
Summary: AutoCAD Automation
for Python
Home-page: https://github.com/reclosedev/pyautocad
Author: Roman Haritonov
Author-email: reclosedev@gmail.com
License: BSD License
Location: c:\programdata\anaconda3\
lib\site-packages
Requires: comtypes
Required-
by:

 

pyautocad를 설치한 후 pip show pyautocad 명령으로 정보를 살펴보자. Requires에 comtypes가 있는 것을 알 수 있다. 앞에서 설명한 것처럼 pyautocad도 comtypes 라이브러리를 이용한다.

 

pyzwcad로 마찬가지 방법으로 설치하면 된다.

pyautocad는 2015년, pyzwcad는 2020년이 마지막 업데이트다. pyautocad가 상당기간 업데이트가 이루어지지 않은 것을 알 수 있다. comtypes이라는 기술로 커버가 가능하기 때문일 수도 있다.

 

3. 시작하기-파이썬과 CAD연결

pyautocad를 이용해서 CAD와 소통하는 것부터 해보자. 아래의 코드를 hello.py라는 이름으로 저장해보자.

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

 

acad=Autocad() : 이부분이 실행되어 있는 AutoCAD를 취해서 acad라는 이름으로 할당한것이다. 이제부터 실행된 AutoCAD는 acad를 통해서 접근 가능하다.

acad.prompt(“~ “) 이 명령은 autocad명령창에 문자를 출력하는 내용이다.

acad.doc.Name은 acad의 파일명이라는 뜻이다. 실행하면 아래와 같은 결과를 볼 수 있다.

(base) D:\dev\python\pyautocad>python hello.py
Hello, Autocad
from Python

Drawing1.dwg

 

캐드명령창에도 acad.prompt() 명령의 결과로 Hello~ 가 출력된 것을 볼 수 있다.

 

COM기술을 이용하려면 model을 알고 있어야 한다. 모델을 계층적으로 구조화 되어 있기 때문에 모델을 이해하고 있으면 자신이 원하는 객체를 만들거나 원하는 기능을 찾아볼 수 있다. 이것은 VBA로 CAD용 프로그램을 만들 때도 마찬가지다. 아래 디렉토리에 있는 chm 도움말 파일을 열어보자.

C:\Program Files\Common Files\Autodesk Shared\acadauto.chm

한글버전인 경우에는 아래의 디렉토리에 있다. C:\Program Files\Common Files\Autodesk Shared\ko-KR\acadauto.chm

AutoCAD Object Model이다. Application이라는 것이 가장 상위에 있고 그 아래 체계적으로 구성되어있다. Application은 곧 AutoCAD를 뜻한다. 말단을 보면 circle, line, text등이 있는 것을 볼 수 있다. 이 정도만 확인하고 넘어가자. pyautocad는 이 Object모델을 쉽게 다루도록 도와주는 라이브러리다.

 

-       캐드실행하기

앞의 예에서는 캐드가 실행되어있는 상태를 가정하고 연결만 했다. acad=Autocad(). 캐드가 실행되어 있지 않은 경우에는 에러가 발생한다. 그래서 만약 캐드가 실행되어있지 않을 때는 캐드를 실행하라는 옵션을 추가할 수 있다. Autocad()에 create_if_not_exists=True 옵션을 추가해주면 된다.

from pyautocad import Autocad
acad = Autocad(create_if_not_exists=
True)
acad.prompt(
"Hello, Autocad from Python\n")
print(acad.doc.Name)

 

이 코드를 실행하면 캐드가 실행되고 난 후 acad.doc.Name의 결과인 Drawing1.dwg이 콘솔통에 출력되는 것을 볼 수 있다.

 

4. 객체 추가

파이썬과 캐드가 잘 연결된 것을 확인했다. 이번에는 선이나 원, 텍스트 같은 객체들을 추가해 보자. 객체를 추가하기 위해서는 좌표가 있어야 하는데 pyautocad에서 APoint라는 좌표 타입을 지원한다. 사용법은 APoint(x,y,z)라고 써주면 된다. z는 생략할 수 있다. import할 대 APoint도 import했다.

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

객체를 추가하는 method (함수)는 AddText, AddLine, AddCircle이 사용되었다. 객체는 model에다 추가할 수 있다. acad는 AutoCAD프로그램, model은 Modelspace라고 생각하면 된다. AutoCAD에 있는 Modelspace에 객체를 추가하는 것이다.

-        Text 추가하기(AddText)

사용법 : acad.model.AddText(문자열, 삽입점, 텍스트크기)

return : Text 객체

이 메소드는 텍스트를 그리고 텍스트 객체를 돌려준다.

사용예 : acad.model.AddText(u’'Hi %s!' % i, p1, 2.5)

  “앞에 붙은 u는 유니코드라는 뜻이다. i는 0부터 4까지 변하는 for문이 적용되었다. p1은 APoint()로 정의되었는데 처음엔 0,0으로 시작했다. for문의 마지막에 p1.y+=10이 있는데 p1의 y좌표를 한번 반복할 때마다 10씩 증가시킨다는 뜻이다. 만들어진 텍스트를 text라는 변수에 할당했다.

 

-        Line 추가하기(AddLine)

사용법 : acad.model.AddLine(시작점, 끝점)

return : Line 객체

적용예 : acad.model.AddLine(p1, p2)

p1에서 p2로 line을 그린다.

 

-        Circle 추가하기(AddCircle)

사용법 : acad.model.AddCircle(중심점, 반지름)

return : Line 객체

적용예 : acad.model.AddCircle(p1, 10)

p1을 중심점으로 하는 반지름 10인 원을 그린다.

 

위의 코드를 실행하면 아래와 같은 결과를 볼 수 있다. 5개의 원을 y좌표를 10씩 증가시키면서 그리고 그 중심에 Hi와 번호를 텍스트로 썼다. 중심점에서 50,25로 선을 그렸다. 

 

 

5. 객체 변경

-        색상 변경

객체를 추가하는 것을 해봤다. 이번에는 객체를 변경해보자.  객체의 속성을 변경하기 위해서는 객체 다음에 .을 찍고 속성을 써주고 값을 할당해주면 된다. for문 안에서 만들어진 text의 색을 바꿔보자 text.Color=i이렇게 바꾸자. i는 for문 안에서 0~4으로 변한다. 즉 첫번째 text의 색은 0, 두번째는1…이렇게 될 것이다.

 

from pyautocad import Autocad, APoint, ACAD
acad = Autocad()
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(
u'Hi %s!' % i, p1, 2.5)
    text.Color=i
    acad.model.AddLine(p1, p2)
    acad.model.AddCircle(p1,
10)
    p1.y +=
10

 

 

 

-        텍스트 정렬 설정

텍스트에 정렬은 매우 중요하다. 정렬을 middle로 설정해보겠다. Alignment 속성을 설정해주면 된다. Alignment를 변경하면 TextAlignmentPoint도 같이 변경해줘야 한다.

from pyautocad import Autocad, APoint, ACAD

acad = Autocad()
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(
u'Hi %s!' % i, p1, 2.5)
    text.Color=i
    text.Alignment = ACAD.acAlignmentMiddle
    text.TextAlignmentPoint = p1
    acad.model.AddLine(p1, p2)
    acad.model.AddCircle(p1,
10)
    p1.y +=
10

 

text의 정렬방법을 설정하기 위해서 text.Alignment속성을 설정해준다. 정렬 방법은 acAlignment~ 로 시작하는 상수로 미리 설정되어있다. 이 상수를 사용하려면 ACAD를 import해야 한다. 정렬방법들은 아래와 같다. 이 목록은 앞에서 이야기한 C:\Program Files\Common Files\Autodesk Shared\ko-KR\acadauto.chm 도움말인 ActiveX Reference Guide에서 가져온 것이다. 모델 중 text object를 선택하고 그 중 Aligment property를 선택하면 목록을 볼 수 있다. pyautocad의 문서에 모든 설정이 설명되어있지 않다. ActiveX Reference Guide를 참조하면 된다.

      acAlignmentLeft

      acAlignmentCenter

      acAlignmentRight

      acAlignmentAligned

      acAlignmentMiddle

      acAlignmentFit

      acAlignmentTopLeft

      acAlignmentTopCenter

      acAlignmentTopRight

      acAlignmentMiddleLeft

      acAlignmentMiddleCenter

      acAlignmentMiddleRight

      acAlignmentBottomLeft

      acAlignmentBottomCenter

      acAlignmentBottomRight

정렬점을 설정한 텍스트를 선택해보면 삽입점(왼쪽 아래) 외에 정렬점(Middle)도 설정되는 것을 확인할 수 있다.

 

-        텍스트 회전 설정

텍스트의 각도를 설정하기 위해서는 Rotation 속성을 설정해주면 된다. 각도는 Radian이다. pi값을 사용하기 위해서 import math를 추가해줘야 한다. 각도의 방향은 반시계 방향이 +다. 45도로 설정하기 위해서 math.pi * 0.25를 적용했다.

 

import math
text.Rotation = math.pi *
0.25

 

 

-        다른 객체 변경

앞에서 텍스트의 정렬방법을 변경할 때 ActiveX Reference Guide를 참조했다. 각 object의 속성들을 파악하고 거기에 맞게 설정해주면 된다. pyautocad가 모든 속성을 지원하지는 않는다. 속성의 이름이 다른 경우도 있다. 예를 들어 text의 color속성은 ActiveX에는 TrueColor로 되어있다. 도면에서 사용하는 객체의 종류가 생각보다 많지 않다. 각 객체별 원하는 속성이나 메소드는 구글링을 하거나 ActiveX Reference를 참조하자.

 

 

6. 객체 선택

예를 들어 현재 도면에 그려진 모든 원의 중심점을 현재 점에서 오른쪽으로 10 만큼 이동하려면 어떻게 해야 할까? 우선 이미 그려진 원을 선택해야 하고 그 다음엔 각 원에 대해서 변경을 하면 될 것이다. 우선 현재 도면 내의 모든 원을 선택하는 방법을 알아보자.

① 도면전체에서 선택하기. acad.iter_objects(조건)

② 사용자가 선택하기 acad.get_selection(‘메시지’)

 

acad.iter_objects(조건) : 전체 도면에서 선택하기

acad에는 pyautocad가 지원하는 iter_objects()함수(메소드)가 있다. 이 메소드는 ()안에 주어진 조건에 맞는 object리스트를 돌려준다. 아래 코드는 위의 코드의 마지막에 추가한 코드다. 여기에서 for문에 사용된 acad.iter_objects([‘Circle’,’Line’])은 원과 선을 모두 선택하라는 뜻이다.

for obj in acad.iter_objects(['Circle', 'Line']):
   
#print(obj.ObjectName)
   
if obj.ObjectName=='AcDbLine':
        print(obj.Length, obj.StartPoint, obj.EndPoint)
   
if obj.ObjectName=='AcDbCircle':
        print(obj.Area)

 

for문 안의 내용은 선택된 ObjectName이 ‘AcDbLine’(‘Line’이 아님에 주의하자)이면 선의 길이와(obj.Length) 시작점(StartPoint), 끝점(EndPoint)를 출력하도록 하고 있다. 그리고 ObjectName이 ‘AcDbCircle’(역시 ‘Circle’이 아님에 주의하자)이면 원의 면적(Area)를 출력하도록 하고 있다.  아래와 같이 앞에서 그려진 5개의 선과 원에 대해서 선의길이, 시작점, 끝점좌표와 원의 면적이 출력된 것을 확인할 수 있다.  이 코드에서 사용한 StartPoint, EndPoint, Area 등 각 객체마다의 속성은 ActiveX reference를 참고하여 확인하고 사용하는 것을 추천한다.

(base) D:\dev\python\pyautocad>python pya.py
Hello, Autocad
from Python

Drawing1.dwg
55.90169943749474 (0.0, 0.0, 0.0) (50.0, 25.0, 0.0)
314.1592653589793
52.20153254455275 (0.0, 10.0, 0.0) (50.0, 25.0, 0.0)
314.1592653589793
50.24937810560445 (0.0, 20.0, 0.0) (50.0, 25.0, 0.0)
314.1592653589793
50.24937810560445 (0.0, 30.0, 0.0) (50.0, 25.0, 0.0)
314.1592653589793
52.20153254455275 (0.0, 40.0, 0.0) (50.0, 25.0, 0.0)
314.1592653589793

 

 

            acad.get_selection(“메시지”) : 사용자가 선택하기

acad에는 사용자가 객체들을 선택하도록 하는 get_selection()메소드가 있다. 아래의 코드를 위의 코드의 마지막에 삽입해보자. get_selection('select object: ')를 만나면 사용자가 물체를 선택하기를 기다린다. 물체 선택이 완료되면 for문을 돌면서 ObjectName을 출력해주는 기능이다.

for obj in acad.get_selection('select object: '):
    print(obj.ObjectName)

 

8. 다른 객체들

pyautocad공식문서가 충실하지 않다. ActiveX reference를 많이 참조해야 한다. 구글링을 해보니 잘 정리해놓은 사이트가 있다. 많은 예제들이 포함되어 있다. https://www.supplychaindataanalytics.com/category/python-for-autocad/ Python for AutoCAD

 

-        폴리라인

AutoCAD에서 폴리라인은 두 종류가 있다. LightWeightPolyline과 그냥 Polyline이다. LWpolyline은 2D, polyline은 3D다. 사용법은 점의 array를 주면 된다. 여기서 array는 x,y좌표 또는 x,y,z좌표가 연속되어 나열된 것이다. 이 array를 사용하기 위해 array모듈을 import해준다. array모듈은 내장 모듈이다. array를 생성할 때 array.array(“d”, point리스트)와 같이 입력해준다. “d”는 double의 의미다 “i”는 integer의 의미다. 즉 array를 이루는 데이터 형이다. 자세한 것은 파이썬 공식문서를 참고하자. https://docs.python.org/ko/3/library/array.html

 

AddLightWeightPolyline(2D점 array)

AddPolyline(3D점 array)

 

from pyautocad import Autocad
import array
acad = Autocad(create_if_not_exists=
True)
points_2d = [
0, 1, 1, 2, 2, 2]
points_double = array.array(
"d", points_2d)
acad.model.AddLightWeightPolyline(points_double)

points_3d = [
0, 0, 0, 1, 1, 0, 2, 1, 0]
points_double = array.array(
"d", points_3d)
acad.model.AddPolyline(points_double)

 

 

이런 식으로 좌표를 1차원으로 나열해서 사용하려면 당연히 불편하다. 그래서 여러개의 좌표를 연결해서 array로 만들어서 쓰는 것이 편할 것이다. reduce라는 함수를 이용할 수 있다. 이전에 다뤘던 map함수가 리스트의 요소들에 대해서 각각 어떤 연산을 한 결과를 돌려준다면 reduce는 누적해서 연산을 수행한다. reduce함수를 쓰기 위해서는 from functools import reduce명령으로 먼저 reduce를 import해야 한다.

아래와 같이 a,b,c라는 세개의 좌표를 가지고 있다고 하자 이 좌표들을 array형태로 바꾸기 위해서 reduce함수를 적용하면 된다. lambda함수는 익명함수로 x,y리스트를 받아서 하나로 합치는 연산(+)을 하고 결과를 가지고 있는 상태에서 다음 list의 요소에 대해 +연산을 수행한다. 세개의 list가 하나로 합쳐졌다. 이 코드는 1차원으로 만드는 것을 예로 든 것이고 pyautocad에서 사용하려면 array함수를 써서 형식을 변환해줘야 한다.

from functools import reduce
a=[
1,2]
b=[
3,4]
c=[
5,6]
k=reduce(
lambda x,y: x+y, [a,b,c])

print(k)

 

[1, 2, 3, 4, 5, 6]

 

이번에는 조금 다른 방법을 사용해보겠다. 1차원의 좌표를 만드는 방법은 extend함수를 사용하고, 형식 변환은 pyautocad가 제공하는 aDouble이라는 함수를 적용하겠다.

from pyautocad import Autocad, aDouble

acad = Autocad(create_if_not_exists=
True)
k=[]
a=[
0,0]
b=[
10,0]
c=[
10,10]
d=[
0,10]

k.extend(a)
k.extend(b)
k.extend(c)
k.extend(d)
k.extend(a)

#karr=array.array("d",k)
karr=aDouble(k)
pl = acad.model.AddLightWeightPolyline(karr)

print(pl.Coordinates)
print(pl.Closed)
pl.Closed=
True
print(pl.Closed)
print(pl.Area)
print(pl.Coordinate(
1))

 

(base) D:\dev\python\pyautocad>python polyline1.py
(
0.0, 0.0, 10.0, 0.0, 10.0, 10.0, 0.0, 10.0, 0.0, 0.0)
False
True
100.0

(10.0, 0.0)

 

 

array를 import하지 않았고 빈 리스트를 만든 다음에 extend메소드를 이용해서 a,b,c,d,a를 추가했다. 마지막에 시작점 a를 추가했다. 앞의 예에서는 array를 사용했는데 이번에는 aDouble함수를 사용해서 형식변환했다. 만들어진 LWpolyline을 pl에다 할당하고 속성들을 출력해봤다. 폴리라인에는 속성 Coordinates, Closed, Area 등이 있다. Coordinates는 폴리라인의 좌표들을 출력해준다. 첫번 째 pl.Closed를 출력했을 때는 False가 출력되었고, pl.Closed=True로 변경한 다음 pl.Closed를 출력했을 때는 True가 출력된 것을 확인할 수 있다. Area속성을 이용해서 면적을 알 수 있다. 각 점의 좌표를 알고 싶을 때 pl.Coordinate(1)와 같이 Coordinate() 메소드를 이용할 수 있다.

 

-        호(Arc)

pyautocad로 호를 그리는 방법은 중심좌표와 반지름, 시작각도, 끝각도를 주면 된다. 이때 각도는 radian이다.

acad.model.AddArc(center, radius, start angle , end angle)

아래의 코드는 두개의 호를 그린다. 첫번째 호는 15도에서 시작해서 105도까지 그리고 두번째 호는 105도에서 15도까지 그린다. 첫번째 호의 색은 노란색(2), 두번째 호의 색은 빨간색(1)이다. 호를 그릴 때 주의할 점은 시계반대방향으로 그린다는 것이다. 따라서 시작각과 끝각을 적절하게 선택해야 한다.

호 객체에서 지원하는 주요 속성은 다음과 같다.

arcobject.color : 색

arcobject.Center : 중심점좌표(CenterPoint가 아니다)

arcobject.StartPoint : 시작점(시작각에 의해서 정해짐)

arcobject.EndPoint : 끝점(끝각에 의해서 정해짐)

arcobject.ArcLength : 호의 길이

arcobject.Radius : 호의 반지름

 

from pyautocad import Autocad, aDouble, APoint
import math

acad = Autocad(create_if_not_exists=
True)
cp=APoint(
0,0,0)

arc1 = acad.model.AddArc(cp,
10, 15*math.pi/180 , 105*math.pi/180)
arc1.color=
2

arc2 = acad.model.AddArc(cp,
10, 105*math.pi/180, 15*math.pi/180)
arc2.color=
1

cp=APoint(arc1.Center)
sp=APoint(arc1.StartPoint)
ep=APoint(arc1.EndPoint)

ls=acad.model.AddLine(cp, sp)
le=acad.model.AddLine(cp, ep)
ls.color=
3
le.color=
3

print(arc1.ArcLength)

print(arc1.Radius)

 

 

-        치수선

치수선은 옵션이 상당히 많은 편이다. pyautocad로 dimension을 그리기 위해서는 치수선에 대한 옵션들을 잘 알고 있어야 한다. 치수선을 그리는 명령은 아래와 같다. 자세한 사항들은 ActiveX Reference Guide(ARG)를 참조하자.

object.AddDimAligned(ExtLine1Point, ExtLine2Point, TextPosition)

object.AddDimAligned(치수보조선 첫점, 치수보조선 둘째점, 텍스트 위치)

ARG에는 아래와 같은 그림이 포함되어 있다.

 

 

아래 코드는 1사분면부터 4사분면 까지 4개의 선에 대해서 치수선을 그리는 코드다. 선을 4개 그리고 각 선의 StatPoint와 EndPoint를 이용해서 치수선을 그렸다. 텍스트의 위치는 중간점에서 x=20 또는 -20, y=20 또는 -20 만큼 떨어진 점으로 지정해서 dimension을 그렸다. 그리고 각종 속성을 변경해줬다. 주요 속성은 다음과 같다. 상세한 속성은 ARG를 참조하자.

dimobject.ExtensionLineColor  : 치수보조선 색

dimobject.DimensionLineColor : 치수선 색

dimobject.Arrowhead1Type = ACAD.acArrowDot : 화살촉 형식

dimobject.ArrowheadSize = 5 : 화살촉 크기

dimobject.TextHeight = 10 : 텍스트 높이

 

from pyautocad import Autocad, aDouble, APoint, ACAD

acad = Autocad(create_if_not_exists=
True)

l1=acad.model.AddLine(APoint(
0,0),APoint(100,100))
l2=acad.model.AddLine(APoint(
0,0),APoint(-100,100))
l3=acad.model.AddLine(APoint(
0,0),APoint(-100,-100))
l4=acad.model.AddLine(APoint(
0,0),APoint(100,-100))

dimp1m = APoint((l1.StartPoint[
0]+l1.EndPoint[0])/2-20,(l1.StartPoint[1]+l1.EndPoint[1])/2+20)
dimp2m = APoint((l2.StartPoint[
0]+l2.EndPoint[0])/2+20,(l2.StartPoint[1]+l2.EndPoint[1])/2+20)
dimp3m = APoint((l3.StartPoint[
0]+l3.EndPoint[0])/2-20,(l3.StartPoint[1]+l3.EndPoint[1])/2+20)
dimp4m = APoint((l4.StartPoint[
0]+l4.EndPoint[0])/2+20,(l4.StartPoint[1]+l4.EndPoint[1])/2+20)

dimo1=acad.model.AddDimAligned(APoint(l1.StartPoint), APoint(l1.EndPoint), dimp1m)
dimo2=acad.model.AddDimAligned(APoint(l2.StartPoint), APoint(l2.EndPoint), dimp2m)
dimo3=acad.model.AddDimAligned(APoint(l3.StartPoint), APoint(l3.EndPoint), dimp3m)
dimo4=acad.model.AddDimAligned(APoint(l4.StartPoint), APoint(l4.EndPoint), dimp4m)

dimo1.ExtensionLineColor=
1
dimo1.DimensionLineColor=
1

dimo2.ExtensionLineColor=
1
dimo2.DimensionLineColor=
1
dimo2.Arrowhead1Type = ACAD.acArrowDot
dimo2.Arrowhead2Type = ACAD.acArrowDot

dimo3.ExtensionLineColor=
1
dimo3.DimensionLineColor=
1
dimo3.Arrowhead1Type = ACAD.acArrowDot
dimo3.Arrowhead2Type = ACAD.acArrowDot
dimo3.ArrowheadSize =
5

dimo4.ExtensionLineColor=
1
dimo4.DimensionLineColor=
1
dimo4.Arrowhead1Type = ACAD.acArrowDot
dimo4.Arrowhead2Type = ACAD.acArrowDot
dimo4.TextHeight =
10

 

 

8. 맺음말

이번 시간에는 pyautocad 라이브러리를 이용해서 autocad에 객체를 생성하고 수정하는 것을 해봤다. 오늘 다룬 객체는 Line, Circle, Text, Polyline, Arc, Dimension 등이다. 이정도의 객체만 있어서 웬만한 도면은 모두 그릴 수 있을 것이다. 객체선택도 알아봤다. 도면전체에서 조건에 맞는 객체를 선택하는 방법과 사용자가 마우스로 선택하는 방법 모두 가능하다. 다른 객체를 생성하거나 수정하기 위해서는 구글링을 하거나 ActiveX Reference Guide를 참고하면 된다. 다음 시간에는 점을 입력받고 객체를 수정하는 다른 기능들을 더 알아보도록 하겠다.

 

-끝-



  추천하기   목록보기

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