Применение Python API в среде Компас-3D
Основные методы работы с 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 компонентов