Модуль для работы с AutoCAD через COM интерфейс
Project description
SimpleAutoCAD
SimpleAutoCAD — это мощная Python-библиотека для автоматизации и программного управления Autodesk AutoCAD через COM-интерфейс.
Она предоставляет интуитивно понятный объектно-ориентированный интерфейс к объектной модели AutoCAD, позволяя создавать, редактировать и управлять 2D‑ и 3D‑чертежами непосредственно из Python-скриптов.
Содержание
Особенности
- Полный контроль над AutoCAD – использует объектную модель ActiveX/COM для взаимодействия с установленным приложением AutoCAD, позволяя автоматизировать практически любую задачу.
- Продвинутая работа с геометрией – включает набор классов
PyGeдля выполнения сложных геометрических вычислений, функционально аналогичных нативным классамAcGeиз ObjectARX. - Автоматизация рутинных задач – создание слоёв, блоков, примитивов, атрибутов, работа с XData, таблицами, печатью и т.д.
- Простота интеграции – разрабатывайте собственные приложения на Python без глубокого погружения в C++ или AutoLISP.
- Кроссплатформенность – работает на любой системе Windows с установленным AutoCAD (2000 и новее).
Установка
pip install simpleautocad
pip install git+https://github.com/busy4beaver/simpleautocad.git
Системные требования:
ОС: Windows (7, 8, 10, 11)
Установленный AutoCAD (версия 2000 или выше)
Python 3.8 и выше
Быстрый старт
Подключение к AutoCAD, создание линии в пространстве модели с настройкой цвета, типа линии и веса.
from simpleautocad import AutoCAD, PyGePoint3d, AcLineWeight, AcRegenType
def create_line():
# Подключаемся к AutoCAD
acad = AutoCAD()
# Делаем окно видимым
acad.Visible = True
# Активный документ
doc = acad.ActiveDocument
# Пространство модели
model_space = doc.ModelSpace
# Создаём начальную и конечную точку для отрезка
start_pt = PyGePoint3d() # x=0, y=0, z=0
end_pt = PyGePoint3d(10, 10) # x=10, y=10, z=0
# Добавляем линию
line = model_space.AddLine(start_pt, end_pt)
# Получаем интерфейс AcCmColor для установки цвета
color = acad.uGetAcadAcCmColor()
# Устанавливаем RGB цвет
color.SetRGB(10, 110, 210)
# Применяем цвет к отрезку
line.TrueColor = color
# Применяем тип линии
line.Linetype = 'DASHED'
# Применяем вес линий
line.Lineweight = AcLineWeight.acLnWt020
# Обновляем экран
doc.Regen(AcRegenType.acAllViewports)
if __name__ == "__main__":
create_line()
Основные компоненты
AutoCAD – главный класс
Наследуется от AcadApplication и предоставляет дополнительные удобные методы:
uGetAcadAcCmColor() – создаёт объект цвета.
uGetAcadLayerStateManager() – менеджер состояний слоёв.
uSetXData(obj, xdm) – записывает расширенные данные.
uGetObjectType(obj) – возвращает Python-тип объекта (например, AcadCircle).
from simpleautocad import AutoCAD
app = AutoCAD()
app.Visible = True
doc = app.ActiveDocument
ms = doc.ModelSpace
PyGe – геометрические примитивы
Набор классов для работы с геометрией:
PyGePoint3d / PyGePoint2d – точки (3D и 2D)
PyGeVector3d / PyGeVector2d – векторы
PyGeMatrix3d / PyGeMatrix2d – матрицы преобразований (поворот, перенос, масштабирование, отражение, проекция)
Поддерживаются арифметические операции, нормализация, скалярное и векторное произведения, углы и т.д.
from simpleautocad import PyGePoint3d, PyGeVector3d, PyGeMatrix3d
p1 = PyGePoint3d(1, 2, 3)
v = PyGeVector3d(1, 1, 1)
p2 = p1 + v # точка + вектор
dist = p1.distanceTo(p2)
Работа с XData
XDataManager и DxfGroupXDCode позволяют удобно записывать и читать расширенные данные (пример ниже).
Примеры
Создание отрезка
Базовые операции: создание линии, установка цвета, типа линии и веса, а также регенерация чертежа.
from simpleautocad import AutoCAD, PyGePoint3d, AcLineWeight, AcRegenType
def create_line():
# Подключаемся к AutoCAD
acad = AutoCAD()
# Делаем окно видимым
acad.Visible = True
# Активный документ
doc = acad.ActiveDocument
# Пространство модели
model_space = doc.ModelSpace
# Создаём начальную и конечную точку для отрезка
start_pt = PyGePoint3d() # x=0, y=0, z=0
end_pt = PyGePoint3d(10, 10) # x=10, y=10, z=0
# Добавляем линию
line = model_space.AddLine(start_pt, end_pt)
# Получаем интерфейс AcCmColor для установки цвета
color = acad.uGetAcadAcCmColor()
# Устанавливаем RGB цвет
color.SetRGB(10, 110, 210)
# Применяем цвет к отрезку
line.TrueColor = color
# Применяем тип линии
line.Linetype = 'DASHED'
# Применяем вес линий
line.Lineweight = AcLineWeight.acLnWt020
# Обновляем экран
doc.Regen(AcRegenType.acAllViewports)
if __name__ == "__main__":
create_line()
Аналоговые часы
Этот пример показывает, как создать циферблат, текстовые метки, стрелки и анимировать их в реальном времени с помощью бесконечного цикла. Также демонстрируется использование массивов (ArrayPolar) и матриц поворота.
from simpleautocad import AutoCAD, AcadLine, AcadMtext, PyGePoint3d, PyGeVector3d, PyGeMatrix3d, AcLineWeight, AcAttachmentPoint, AcRegenType, AcColor, vInteger
import math
import time
from datetime import datetime
from zoneinfo import ZoneInfo
def test_clock():
# Подключаемся к AutoCAD
app = AutoCAD()
app.Visible = True
doc = app.ActiveDocument
ms = doc.ModelSpace
# Центр и размер
center = PyGePoint3d()
size = 10
icolor = app.uGetAcadAcCmColor()
ang_1_60 = -math.radians(6) # поворот на 6° по часовой
# Отрисовка шкалы
pt1 = PyGePoint3d(center.x, center.y + size - size/10)
pt2 = PyGePoint3d(center.x, center.y + size)
line = ms.AddLine(pt1, pt2)
hinspt = PyGePoint3d(pt1.x, pt1.y - size/6)
icolor.ColorIndex = 251
line.TrueColor = icolor
lines = line.ArrayPolar(60, -math.pi*2 - ang_1_60, center)
line.ScaleEntity(line.EndPoint, 1.5)
line.Lineweight = AcLineWeight.acLnWt050
icolor.ColorIndex = AcColor.acMagenta
line.TrueColor = icolor
for i in range(4, 59, 5):
objLine = AcadLine(lines[i])
objLine.ScaleEntity(objLine.EndPoint, 1.5)
objLine.Lineweight = AcLineWeight.acLnWt050
objLine.TrueColor = icolor
# Текстовые метки (12 часов)
hour_txt = ms.AddMText(hinspt, size/6, '12')
hour_txt.Height = size/8
hour_txt.AttachmentPoint = AcAttachmentPoint.acAttachmentPointMiddleCenter
hour_txt.InsertionPoint = hinspt
icolor.ColorIndex = 250
hour_txt.TrueColor = icolor
hours = hour_txt.ArrayPolar(12, -math.pi*2 - ang_1_60*5, center)
for i in range(0, 11):
objHour = AcadMtext(hours[i])
objHour.TextString = str(i+1)
objHour.Rotate(objHour.InsertionPoint, -ang_1_60*5*(i+1))
# Стрелки (секундная, минутная, часовая)
line_sec = ms.AddLine(PyGePoint3d(center.x, center.y - size/6), PyGePoint3d(center.x, center.y + size - size/10 - size/40))
icolor.SetRGB(255, 0, 0)
line_sec.TrueColor = icolor
line_sec.Lineweight = AcLineWeight.acLnWt030
line_min = ms.AddLine(PyGePoint3d(center.x, center.y - size/6), PyGePoint3d(center.x, center.y + size - size/10 - size/8))
icolor.SetRGB(0, 255, 0)
line_min.TrueColor = icolor
line_min.Lineweight = AcLineWeight.acLnWt030
line_hour = ms.AddLine(PyGePoint3d(center.x, center.y - size/6), PyGePoint3d(center.x, center.y + size - size/10 - size/4))
icolor.SetRGB(0, 0, 255)
line_hour.TrueColor = icolor
line_hour.Lineweight = AcLineWeight.acLnWt030
# Включаем отображение веса линий
if not doc.GetVariable('LWDISPLAY'):
doc.SetVariable('LWDISPLAY', vInteger(1))
# Матрицы поворота для 60 положений
rotation_matrixes = []
for i in range(0, 60):
mat = PyGeMatrix3d.rotation(ang_1_60 * i, PyGeVector3d.kZaxis, center)
rotation_matrixes.append(mat)
# Текущее время
mytime = datetime.now(ZoneInfo("Asia/Novosibirsk"))
my_h, my_m, my_s = mytime.hour, mytime.minute, mytime.second
# Поворот стрелок
line_sec.TransformBy(rotation_matrixes[my_s])
line_min.TransformBy(rotation_matrixes[my_m])
idx = (my_h if my_h < 12 else my_h - 12) * 5 + (my_m // 12)
line_hour.TransformBy(rotation_matrixes[idx])
# Вид
viewport = doc.ActiveViewport
viewport.Direction = PyGeVector3d(-1, -1, 1)
doc.ActiveViewport = viewport
app.ZoomAll()
# Бесконечный цикл обновления стрелок
while True:
mytime = datetime.now(ZoneInfo("Asia/Novosibirsk"))
regen = False
if my_s != mytime.second:
idx = abs(mytime.second - my_s)
if idx == 59 and mytime.second == 0: idx = 1
line_sec.TransformBy(rotation_matrixes[idx])
my_s = mytime.second
regen = True
if my_m != mytime.minute:
idx = abs(mytime.minute - my_m)
if idx == 59 and mytime.minute == 0: idx = 1
line_min.TransformBy(rotation_matrixes[idx])
my_m = mytime.minute
if not (my_m % 12):
line_hour.TransformBy(rotation_matrixes[1])
regen = True
if regen:
doc.Regen(AcRegenType.acActiveViewport)
print(f"{my_h:02}:{my_m:02}:{my_s:02}")
time.sleep(0.2)
Запись и чтение XData
Пример демонстрирует, как добавлять зарегистрированное приложение, записывать XData в объекты (окружности), а затем считывать и применять эту информацию для создания штриховки нужного цвета.
from simpleautocad import *
def test_xdata():
app = AutoCAD()
app.Visible = True
doc = app.ActiveDocument
ms = doc.ModelSpace
radius = 4
regAppName = 'AppCircleColor'
icolor = app.uGetAcadAcCmColor()
pt1 = PyGePoint3d(10, 30)
pt2 = PyGePoint3d(10, 20)
pt3 = PyGePoint3d(10, 10)
cir1 = ms.AddCircle(pt1, radius)
cir2 = ms.AddCircle(pt2, radius)
cir3 = ms.AddCircle(pt3, radius)
# Подготовка данных
xdm1 = XDataManager(regAppName)
xdm1.add_data(DxfGroupXDCode.kDxfXdInteger16, AcColor.acRed)
xdm2 = XDataManager(regAppName)
xdm2.add_data(DxfGroupXDCode.kDxfXdInteger16, AcColor.acYellow)
xdm3 = XDataManager(regAppName)
xdm3.add_data(DxfGroupXDCode.kDxfXdInteger16, AcColor.acGreen)
# Запись
app.uSetXData(cir1, xdm1)
app.uSetXData(cir2, xdm2)
app.uSetXData(cir3, xdm3)
# Чтение и применение штриховки
for obj in ms:
if app.uGetObjectType(obj) is AcadCircle:
xdata = obj.GetXData(regAppName)
if xdata[0]:
if xdata[0][1] == DxfGroupXDCode.kDxfXdInteger16:
icolor.ColorIndex = xdata[1][1]
else:
icolor.ColorIndex = 255
hatch = ms.AddHatch(AcPatternType.acHatchPatternTypePreDefined, 'SOLID', True, AcHatchObjectType.acHatchObject)
hatch.TrueColor = icolor
hatch.AppendInnerLoop(vObjectArray(obj))
doc.Regen(AcRegenType.acActiveViewport)
Работа с блоками и атрибутами
Класс BlockReference позволяет удобно работать с блоками, имеющими атрибуты и динамические свойства. Пример для пользовательского блока:
from simpleautocad import BlockReference, AutoCAD, PyGePoint3d
class MyBlock(BlockReference):
BlockName = "MY_BLOCK" # Имя блока в чертеже
@property
def my_attribute(self):
return self.get_attribute_value("ATTR1")
@my_attribute.setter
def my_attribute(self, value):
self.set_attribute_value("ATTR1", value)
# Использование
app = AutoCAD()
ms = app.ActiveDocument.ModelSpace
# Вставка блока
block = MyBlock()
block.insert(PyGePoint3d(0, 0, 0), ms)
block.my_attribute = "Новое значение"
Геометрические преобразования
Использование матрицы для поворота объектов относительно произвольной точки:
from simpleautocad import AutoCAD, PyGePoint3d, PyGeVector3d, PyGeMatrix3d
app = AutoCAD()
ms = app.ActiveDocument.ModelSpace
# Создаём линию
line = ms.AddLine(PyGePoint3d(0, 0, 0), PyGePoint3d(10, 0, 0))
# Поворачиваем на 45° вокруг точки (5, 0, 0)
center = PyGePoint3d(5, 0, 0)
axis = PyGeVector3d.kZaxis # ось Z
angle = math.radians(45)
matrix = PyGeMatrix3d.rotation(angle, axis, center)
line.TransformBy(matrix)
# Масштабируем в 2 раза относительно центра
matrix_scale = PyGeMatrix3d.scaling(2.0, center)
line.TransformBy(matrix_scale)
Автор
☕ Поддержать проект
Если этот проект оказался вам полезен, вы можете поддержать его развитие через Boosty:
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file simpleautocad-1.0.2.tar.gz.
File metadata
- Download URL: simpleautocad-1.0.2.tar.gz
- Upload date:
- Size: 98.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a790cf5f47834c73eb45bdfeba70e3e0b31d6c75ac787ba3c0e393902dc08408
|
|
| MD5 |
8baf04ee50ae3579f6e1da60d6001a78
|
|
| BLAKE2b-256 |
d735863541ec5305bb2917209f332e2239a416a0fc1b117dfd3f520343d51331
|
Provenance
The following attestation bundles were made for simpleautocad-1.0.2.tar.gz:
Publisher:
workflow.yml on busy4beaver/simpleautocad
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
simpleautocad-1.0.2.tar.gz -
Subject digest:
a790cf5f47834c73eb45bdfeba70e3e0b31d6c75ac787ba3c0e393902dc08408 - Sigstore transparency entry: 2211456725
- Sigstore integration time:
-
Permalink:
busy4beaver/simpleautocad@09eb5006e7f810ed246c084e2b091b00c315483a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/busy4beaver
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@09eb5006e7f810ed246c084e2b091b00c315483a -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file simpleautocad-1.0.2-py3-none-any.whl.
File metadata
- Download URL: simpleautocad-1.0.2-py3-none-any.whl
- Upload date:
- Size: 163.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e5c3c9551c0e120b6e15eae843ec2382d81f014d0384a674944e9f26b197f17
|
|
| MD5 |
648f82a62e9a654ea4eaed935f6a8253
|
|
| BLAKE2b-256 |
b46bbbf321ad1a2482024f37f8baea6f0c69aa6baf6d5b8fe7469684eacc0e73
|
Provenance
The following attestation bundles were made for simpleautocad-1.0.2-py3-none-any.whl:
Publisher:
workflow.yml on busy4beaver/simpleautocad
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
simpleautocad-1.0.2-py3-none-any.whl -
Subject digest:
1e5c3c9551c0e120b6e15eae843ec2382d81f014d0384a674944e9f26b197f17 - Sigstore transparency entry: 2211456758
- Sigstore integration time:
-
Permalink:
busy4beaver/simpleautocad@09eb5006e7f810ed246c084e2b091b00c315483a -
Branch / Tag:
refs/heads/main - Owner: https://github.com/busy4beaver
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@09eb5006e7f810ed246c084e2b091b00c315483a -
Trigger Event:
workflow_dispatch
-
Statement type: