Применение Python API в среде Компас-3D

Раздел: Веб-разработка -> API

Основные методы работы с Python API Компас 3D

Наиболее продуктивное решение

Использование официального SDK от АСКОН (пакет kompasapi) позволяет напрямую обращаться к объектной модели Компас-3D без посредников. Этот способ даёт полный контроль над созданием деталей, сборок, чертежей и их параметрами.

Как создать простую деталь и выдать её на экран?

Пример ниже демонстрирует запуск приложения, создание нового документа детали, построение эскиза на плоскости ZX и выдавливание прямоугольника.


import sys
sys.path.append(r'C:\Program Files\ASCON\KOMPAS-3D v21\SDK\Python')
from kompasapi import *

# Запуск Компас-3D (если не запущен)
app = KompasAPI.Application()
app.Visible = True

# Создание документа детали
doc = app.Documents.Add(ksDocumentType.ksDocumentPart)
part = doc.TopPart

# Получение плоскости ZX
plane = part.GetDefaultEntity(ksPartEntityType.ksPartEntityPlaneZX)

# Создание эскиза на плоскости
sketch = part.Sketches.Add(plane)

# Активация эскиза
sketch.Activate(True)

# Построение прямоугольника
rect = sketch.LineSegments.AddRectangle(0, 0, 100, 100, 0)
sketch.Activate(False)

# Выдавливание на 50 мм
extrusion = part.Extrusions.Add(ksExtrusionType.ksExtrusionBlind, 50, sketch)
part.Update()

print('Деталь создана')
  

компас python api (api компас 3d для python)

Возможные проблемы:

  • Путь к SDK может отличаться в зависимости от версии Компас-3D (v18, v21 и т.д.). Необходимо уточнить папку установки.
  • При отсутствии лицензии вызов методов может завершиться ошибкой. Проверить доступность ключа.
  • Атрибут Visible устанавливается только для отладки, в реальной автоматизации лучше оставить False.

Как выполнить сценарий через COM-интерфейс без установки SDK?

Если SDK не установлен или требуется обратная совместимость, используется COM-объект Kompas.Application. Этот метод работает на любой версии Компас-3D, где включена поддержка COM.


import win32com.client

# Подключение к запущенному экземпляру или создание нового
app = win32com.client.Dispatch("Kompas.Application.5")  # Версия 5 - последняя универсальная
app.Visible = False

# Создание детали
doc = app.Documents.Add(1)  # 1 - документ детали
part = doc.TopPart

# Работа с эскизами и операциями
plane = part.GetDefaultEntity(1)  # 1 - плоскость XY
sketch = part.Sketches.Add(plane)
sketch.Activate(True)

# Построение окружности
circle = sketch.LineSegments.AddCircle(0, 0, 50)
sketch.Activate(False)

# Вырезать выдавливанием
extrusion = part.Extrusions.Add(2, 30, sketch)  # 2 - вырезать
part.Update()
print('Деталь через COM создана')
  

Telegram file python (работа с файлами telegram в python)

Типичные ошибки:

  • Ошибка "Invalid class string" - Компас не зарегистрирован как COM-сервер. Переустановка с опцией регистрации.
  • При указании "Kompas.Application.5" может потребоваться версия 4 или 7 в зависимости от установленного Компаса. Проверить через win32com.client.gencache.EnsureDispatch.
  • Методы с числами (например, Documents.Add(1)) не всегда очевидны. Лучше использовать константы из библиотеки KompasAPI.tlb.

Как получить список деталей в сборке и их свойства?

Часто требуется проанализировать существующую сборку. Ниже показан код для получения имён и массы каждой детали.


import win32com.client

app = win32com.client.Dispatch("Kompas.Application.5")
doc = app.ActiveDocument  # предполагается, что сборка уже открыта

assembly = doc.TopPart
enumerator = assembly.Children
for child in enumerator:
    if child.IsDetail:
        name = child.Name
        mass = child.Material.Mass
        print(f"Деталь: {name}, масса: {mass:.3f} кг")
    elif child.IsSubassembly:
        print(f"Подсборка: {child.Name}")
  

проверка ключа python (проверка api ключа в python)

Возможные проблемы:

  • Свойство Material.Mass может возвращать ноль, если материал не задан. Следует проверять Material на None.
  • Для доступа к свойствам подсборок может потребоваться рекурсивный обход.
Как создать 2D чертёж по 3D модели?

Генерация чертежа из существующей детали - типичная задача. Через SDK можно создать ассоциативный вид.


from kompasapi import *

app = KompasAPI.Application()
app.Visible = True

# Открыть деталь
part_doc = app.Documents.Open(r'C:\Temp\MyPart.a3d')
# Создать чертёж
draw_doc = app.Documents.Add(ksDocumentType.ksDocumentDrawing)
draw_sheet = draw_doc.Sheets.ActiveSheet

# Создать стандартный вид (спереди)
view = draw_sheet.Views.AddStandardView(part_doc.TopPart, ksViewType.ksViewFront)
view.Scale = 1.0
view.Placement = (100, 100)  # координаты на листе

draw_doc.Update()
print('Чертёж сгенерирован')
  

Проблемы и решения:

  • При отсутствии лицензии на чертежи (модуль АЧ) может возникнуть ошибка. Проверить ключ.
  • Настройки листа (формат, ориентация) задаются через Sheet.FormatSheet.

Расширенные примеры работы с API Компас 3D

Пример 1. Создание параметрического куба с переменными

В этом примере создаётся куб, размеры которого задаются через глобальные переменные детали. Это позволяет легко изменять геометрию из скрипта.

Пример

from kompasapi import *

app = KompasAPI.Application()
app.Visible = False
doc = app.Documents.Add(ksDocumentType.ksDocumentPart)
part = doc.TopPart

# Создание переменных
var_col = part.VariableStore
var_col.Add("Length", 100.0)
var_col.Add("Width", 100.0)
var_col.Add("Height", 100.0)

# Эскиз на плоскости XY
plane = part.GetDefaultEntity(ksPartEntityType.ksPartEntityPlaneXY)
sketch = part.Sketches.Add(plane)
sketch.Activate(True)
rect = sketch.LineSegments.AddRectangle(0, 0, "Length", "Width", 0)
sketch.Activate(False)

# Выдавливание
blend = part.Extrusions.Add(ksExtrusionType.ksExtrusionBlind, "Height", sketch)
part.Update()

# Изменение размера в коде
var_col.Item("Length").Value = 200.0
part.Update()
print(f"Длина куба изменена на {var_col.Item('Length').Value}")
Длина куба изменена на 200.0

Пример 2. Экспорт 3D модели в формат STEP

После создания или загрузки детали часто требуется сохранить её в универсальном формате для обмена.

Пример

import win32com.client

app = win32com.client.Dispatch("Kompas.Application.5")
doc = app.Documents.Open(r'C:\Temp\MyPart.a3d')
save_filter = app.Filters.GetFilterByFormat(3)  # 3 = STEP
save_result = doc.SaveAs(r'C:\Temp\MyPart.step', save_filter)
if save_result:
    print('Экспорт выполнен успешно')
else:
    print('Ошибка при экспорте')
Экспорт выполнен успешно

Пример 3. Чтение координат вершин детали

Для анализа геометрии может потребоваться получить топологию тела. В API доступен обход граней и вершин.

Пример

from kompasapi import *

app = KompasAPI.Application()
doc = app.Documents.Open(r'C:\Temp\MyPart.a3d')
part = doc.TopPart
body = part.Body
if body:
    # Все грани
    faces = body.Faces
    for face in faces:
        # Грани могут быть разных типов (плоскость, цилиндр и т.д.)
        if face.Type == ksFaceType.ksFacePlane:
            normal = face.Normal
            # Вершины грани
            vertices = face.Vertices
            for v in vertices:
                print(f"Вершина: {v.X:.3f}, {v.Y:.3f}, {v.Z:.3f}")
                break  # только первая вершина каждой грани
Вершина: 0.000, 0.000, 0.000
Вершина: 100.000, 0.000, 0.000
...

Пример 4. Генерация отчёта о составе сборки в Excel

Скрипт собирает данные о всех деталях сборки и записывает их в таблицу.

Пример

import win32com.client
from collections import namedtuple

Komponent = namedtuple('Komponent', ['name', 'path', 'mass'])

def get_components(assembly_part, prefix=''):
    components = []
    for child in assembly_part.Children:
        if child.IsDetail:
            mass = child.Material.Mass if child.Material else 0
            components.append(Komponent(name=child.Name, path=prefix+child.Name, mass=mass))
        elif child.IsSubassembly:
            components.extend(get_components(child, prefix+child.Name+'/'))
    return components

app = win32com.client.Dispatch("Kompas.Application.5")
doc = app.ActiveDocument
assembly = doc.TopPart
all_parts = get_components(assembly)

# Экспорт в Excel
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = True
wb = excel.Workbooks.Add()
ws = wb.ActiveSheet
ws.Cells(1,1).Value = 'Название'
ws.Cells(1,2).Value = 'Путь'
ws.Cells(1,3).Value = 'Масса (кг)'
for idx, comp in enumerate(all_parts, start=2):
    ws.Cells(idx,1).Value = comp.name
    ws.Cells(idx,2).Value = comp.path
    ws.Cells(idx,3).Value = round(comp.mass,3)
print(f'Экспортировано {len(all_parts)} компонентов')
Экспортировано 5 компонентов

API Компас 3D для Python - comments

En
компас python api (python)