Skip to main content

Модуль для работы с 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

Системные требования:

ОС: 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:

Boosty

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

simpleautocad-1.0.0.tar.gz (98.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

simpleautocad-1.0.0-py3-none-any.whl (163.3 kB view details)

Uploaded Python 3

File details

Details for the file simpleautocad-1.0.0.tar.gz.

File metadata

  • Download URL: simpleautocad-1.0.0.tar.gz
  • Upload date:
  • Size: 98.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for simpleautocad-1.0.0.tar.gz
Algorithm Hash digest
SHA256 a3460716a4dde3dc648f6b897b1476ab58ed72bbb52b1a42811f94035b679cab
MD5 0ac7fdc7a06db013313a744f43d14332
BLAKE2b-256 b1a29e3d42b969890f00e8bebcb7c5583105cec6a95e11e378ab1b3575f3e31b

See more details on using hashes here.

Provenance

The following attestation bundles were made for simpleautocad-1.0.0.tar.gz:

Publisher: workflow.yml on BusyBeaver54/simpleautocad

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file simpleautocad-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: simpleautocad-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 163.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for simpleautocad-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 40a9ea4b1a1377fede5a09ab864404b0417343d94b6ba03a8039d8f3ff650067
MD5 c1e735bcd1b67d7f6c2a8f793092e9d8
BLAKE2b-256 553d243576844c4ed3808dbc9fa69320df08ae5c99500410c38a23aa6c02b6c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for simpleautocad-1.0.0-py3-none-any.whl:

Publisher: workflow.yml on BusyBeaver54/simpleautocad

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page