В предыдущей статье мы узнали, что такое макросы и утилиты для 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. Просто копируете код, запускаете, изучаете его или используете в своем проекте.
Спасибо, макрос работает.
Запускал через Макросы -> Выполнить
а как код то запустить?
Читайте статью с самого начала.