Перейти к содержимому
Войти

Программное заполнение основной надписи чертежа в КОМПАС-3D

03.08.2023
3195
3

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

Теперь постараемся более детально разобраться, как писать такие макросы. Для этого нам понадобится КОМПАС-3D и интерпретатор Python.

Сразу отмечу, что среда Python устанавливается совместно с КОМПАС-3D. Т.е. если у вас установлена полная версия КОМПАС-3D, то вам не стоит беспокоиться о том, как установить Python на свой компьютер. Просто следуйте инструкции в данном видео:

Итак, запускаем интерпретатор Pythonwin (или любой другой). Создаем файл: File\New\Python Script.

Далее сразу сохраним этот пустой файл File\SaveAs… Запустить на исполнение можно только сохраненный скрипт.

Теперь начинаем писать код. С чего начать?

Начнём с кодировки. Чтобы мы могли пользоваться русским языком при написании кода, например, в комментариях или в текстовых переменных, используем стандарт кодирования utf-8. Запишем первую строку:

# -*- coding: utf-8 -*-

Следующая строка кода задает имя. Пусть будет:

#|Stamp

Далее нам необходимо подключить все необходимые модули для работы кода. Модуль - это готовая библиотека, которая используется разработчиками для того, чтобы не писать один и тот же код много раз.
Итак, для создания нашего кода нам потребуется всего один модуль - win32.com, из которого мы через свойство client импортируем модули Dispatch и gencache.

from win32com.client import Dispatch, gencache

Думаю, что глубоко лезть в структуру этих модулей в контексте данной статьи будет излишним. Достаточно понимать, что эти модули позволят нам подключиться к файлам, содержащим всю иерархическую структуру КОМПАС API. Данные файлы можно найти по следующему пути C:\Users\User\AppData\Local\Temp\gen_py\Х.Х (вместо Х.Х будет ваша версия Python). Папка AppData является скрытой папкой, поэтому прежде необходимо в параметрах папок установить флажок на «Показывать скрытые файлы, папки и диски». О том, как это сделать, есть масса статей в интернете.

Следующим шагом подключаем константы API КОМПАС для 2D-документов.

const = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants

Подключим описание интерфейсов API7 (есть ещё более старые интерфейсы API5 и к ним иногда тоже стоит подключаться, т.к. не все они имеют свои эквиваленты в API7, но об этом поговорим как-нибудь в другой раз).

KAPI7 = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)

В этих двух строках мы получили доступ к двум скрытым файлам. В первом идёт описание констант, а во втором - иерархии интерфейсов.

Теперь можно получить интерфейс самого приложения КОМПАС-3D.

iApplication = KAPI7.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(KAPI7.IApplication.CLSID, pythoncom.IID_IDispatch))

Итак, мы подключились к КОМПАС-3D посредством Python. Далее нам необходимо подключиться к активному документу. Для этого, переходим в справочную систему SDK.chm по данному пути C:\Program Files\ASCON\KOMPAS-3D vХХ\SDK (вместо ХХ у вас будет ваша версия КОМПАС).

Вводим в поисковую строку iApplication. Получаем описание интерфейса приложения КОМПАС.

У данного интерфейса находим свойство ActiveDocument.

Таким образом, подключимся к активному документу.

iKompasDocument = iApplication.ActiveDocument

Переходим в справке к интерфейсу iKompasDocument и находим у него свойство iLayoutSheets, которое даст нам доступ к интерфейсу коллекции листов документа.

iLayoutSheets = iKompasDocument.LayoutSheets

У данного интефейса через свойство Item получим интерфейс листа документа по индексу.

Если нам нужен доступ к первому листу документа, то вводим индекс, равный 0 (в программировании любая индексация идёт, начиная с 0, а не с 1, как мы привыкли в повседневной жизни).

iLayoutSheet = iLayoutSheets.Item(0)

И, наконец, получаем доступ к основной надписи листа посредством интерфейса iStamp через свойство Stamp интерфейса iLayoutSheet.

iStamp = iLayoutSheet.Stamp

Теперь внутри основной надписи нам необходимо получить доступ к ячейкам, которые мы будем заполнять. Для этого ищем у интерфейса iStamp свойство Text. Перейдя в него, видим, что нужно в скобках вводить идентификатор ячейки.

Но, к сожалению, нигде в справке нет информации, откуда брать этот номер. Будем пользоваться вот этой шпаргалкой:

Итак, заполним следующие ячейки: Разраб., Пров., Т.контр., Н.контр., Утв., Организация. Ячейки 1, 2, 3, 5,6 трогать не будем, т.к. они обычно заполняются из 3D-модели при добавлении в чертеж ассоциативного вида. Но при желании можете сделать это самостоятельно.
Однако, прежде нужно учесть ещё один момент. Через свойство Text мы получаем доступ к интерфейсу iText, у которого есть свои свойства, в том числе и свойство Str, то есть строка текста.

Таким образом, чтобы ввести текст в ячейку, необходимо присвоить значение именно строке. Это будет выглядеть так:

iStamp.Text(110).Str = "Иванов" iStamp.Text(111).Str = "Петров" iStamp.Text(112).Str = "Сидоров" iStamp.Text(114).Str = "Кузнецов" iStamp.Text(115).Str = "Петров" iStamp.Text(9).Str = "Рога и Копыта"

И в завершение, чтобы изменения вступили в силу, вызовем метод Update().

iStamp.Update()

Теперь запускаем КОМПАС-3D, открываем чертеж или спецификацию и запускаем код. Штамп заполнен.
В качестве эксперимента, поменяйте фамилии на другие, попробуйте заполнить другие ячейки штампа. Попробуйте очистить штамп с помощью метода Clear().

В следующей статье я покажу, как программно в штамп добавить текущее время. Это бывает очень удобно для конструкторов, которым не нужно будет каждый раз вводить дату от руки и печатать её. Просто, запуская макрос, вы сможете быстро проставлять текущую дату в чертеж или спецификацию.

Спасибо за внимание!

Полный код из статьи:

# -*- coding: utf-8 -*-
#|Stamp

from win32com.client import Dispatch, gencache

# Подключим константы API Компас
const = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
const_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

# Подключим описание интерфейсов API7
KAPI7 = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
iApplication = KAPI7.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(KAPI7.IApplication.CLSID, pythoncom.IID_IDispatch))

#Базовый класс документов КОМПАС
iKompasDocument = iApplication.ActiveDocument
#Интерфейс коллекции листов оформления
iLayoutSheets = iKompasDocument.LayoutSheets
#Интерфейс параметров листа оформления
iLayoutSheet = iLayoutSheets.Item(0)
#Основная надпись листа
iStamp = iLayoutSheet.Stamp
#Текст в ячейке
iStamp.Text(110).Str = "Иванов"
iStamp.Text(111).Str = "Петров"
iStamp.Text(112).Str = "Сидоров"
iStamp.Text(114).Str = "Кузнецов"
iStamp.Text(115).Str = "Петров"
iStamp.Text(9).Str = "Рога и Копыта"
#Обновить свойства штампа
iStamp.Update()

P.S. Хочу сообщить, что у меня есть сообщество в ВК Python & КОМПАС-3D где можно приобрести базовый учебный курс по КОМПАС API, а также по подписке доступны статьи с примерами по различным интерфейсам КОМПАС API. Просто копируете код, запускаете, изучаете его или используете в своем проекте.


Комментарии 3
user-avatar
21.09.2023 в 12:21

Спасибо, макрос работает.
Запускал через Макросы -> Выполнить

user-avatar

а как код то запустить?

user-avatar
05.08.2023 в 20:36

Читайте статью с самого начала.

Чтобы оставить комментарий, необходимо войти