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 simpleautocadpip 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()Наследуется от 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Набор классов для работы с геометрией:
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)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 в объекты (окружности), а затем считывать и применять эту информацию для создания штриховки нужного цвета.
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)