Приветствую, всех кто сюда заглянул!
Почему я решил всё это написать? Всё очень просто. В процессе поиска решений и примеров мне пришлось просмотреть огромное количество информации, в основном представленной на иностранном языке. Нередко встречалась ситуация «ничего не работает, почему – не понятно…». Сам я не являюсь программистом и обладаю лишь общими представлениями о написании кода, что, конечно, затрудняет понимание материала.
Исходя из этого, я решил помочь тем, кто только начинает программировать под SolidWorks API, и поделиться своим опытом, в той последовательности, в которой я его получил.
Пару слов о себе, меня зовут Дмитрий, основную часть своей жизни я работаю инженером-конструктором, последние 10 лет – в программе SolidWorks. Моё основное направление деятельности связано с оптимизацией различных производственных процессов, а также с совершенствованием процессов проектирования и оформления конструкторской документации.
Когда у меня появилось немного свободного времени, я решил разобраться, что такое макросы в SolidWorks, зачем они нужны и как их создавать.
Макросы – это программный код, в моём случае написанный на языке VBA.
VBA (Visual Basic for Applications) – это встроенный язык программирования, который используется для автоматизации задач и разработки приложений в продуктах Microsoft Office (таких как Excel, Word, Outlook, Access) и, например, в SolidWorks.
Такой код может выполнять последовательность действий. Например, вместо поочередного нажатия трех-пяти кнопок, можно создать макрос, который выполнит все необходимые действия по нажатию одной кнопки.
Итак, давайте перейдём к созданию макросов. Первое, что нужно освоить – это запись макросов в SolidWorks с использованием встроенного инструмента.
Чтобы его добавить необходимо верхней области нажать правой кнопкой мыши -Вкладки/макросы
Что тут есть:
- Выполнить макрос – запускает уже созданный макрос. При частом использование конкретного макроса, на панель инструментов можно добавить кнопку и привязать к ней конкретный макрос.
- Запись макроса – после нажатия этой кнопки вы начинаете выполнять манипуляции с моделью, а SolidWorks записывает все ваши действия в код до тех пор, пока вы не нажмёте «Остановить». Затем задаётся имя и выбирается место для сохранения.
- Создать макрос – откроется чистый документ в VBA-студии для ручного написания кода макроса.
- Редактировать макрос – открывается документ с уже написанным кодом в VBA-студии, который вы можете изменить.
Что касается функции записи макросов, информации по этой теме в интернете предостаточно, и я не буду повторяться. Однако я расскажу о некоторых недостатках этого метода:
- Автоматически сгенерированный код не всегда работает корректно, а иногда и не работает совсем.
- Типы переменных объектов часто объявлены общим типом «Object», а не конкретным, что может приводить к ошибкам (подробнее об этом далее).
- Если во время записи вы сделали выделение объекта (грани, элемента дерева проектирования), то при выполнении кода программа тоже запросит что-то выделить – при этом об этом ничего не сообщается, и программа может просто зависнуть или выдать ошибку.
- Если, например, при записи на эскизе вы ввели размер, то макрос будет ожидать ручного ввода этого размера.
- Вставка таблиц в чертежи вообще не записывается.
- Работа со Свойствами Файла тоже может не работать.
Таким образом, автоматическая запись макросов – это прежде всего инструмент для ознакомления с функциями и методами, после чего рекомендуется создавать и редактировать код вручную.
Переходим к моему первому макросу: его задача – сохранить деталь в формате STEP. Макрос создан на основе автоматической записи, но затем был отредактирован вручную.
Взглянем на код. Я старался оставлять комментарии:
К сожалению не нашёл как вставить цветным текст в виде текста а не картинки, в ч/б программный код на много тяжелее воспринимается.
Давайте разберём, что здесь происходит:
Строка «Dim FileName As String»:
С помощью оператора Dim мы объявляем переменную FileName типа String («строка»), что означает, что в ней будет храниться текст. Дополнительную информацию об этом операторе можно найти в справочниках по VBA.
В строке «Dim swApp As Object» тип «Object» используется по умолчанию при автоматической записи макроса. На самом деле, правильно было бы написать «Dim swApp As SldWorks.SldWorks». В таком виде могут быть ошибки, для каждого объекта существует свой специфический тип, информация о которых приведена в справочнике по SolidWorks API.
Основные сведения, примеры использования и список доступных методов вы найдёте в официальном справочнике:
https://help.solidworks.com/2022/English/api/
Этот справочник доступен как в интернете, так и непосредственно в SolidWorks, и я лично предпочитаю искать в нём нужную информацию, нежели полагаться исключительно на поисковые системы.
Почему важно правильно указать тип объекта? Помимо корректной работы кода, при правильном определении типа переменной VBA будет подсказывать доступные свойства и методы, когда вы пишете функцию и ставите точку (выпадает список). Если нужный метод или свойство не появляется в выпадающем списке, значит, где-то допущена ошибка, и функция работать не будет. То же самое касается определения типа объекта после ключевого слова AS.
Пару слов об объектах в программировании, как я их понимаю:
Объект – это некая сущность, которую можно представить как многоквартирный дом, где есть этажи, на которых находятся квартиры, а в квартирах – комнаты. В некоторых комнатах живут люди, способные перемещаться и что-то делать. Повторюсь – это мое упрощенное понимание, так как я ещё не являюсь профессиональным программистом.
В данном примере:
swApp – это собственно дом;
swApp.Part – это один из этажей в этом доме;
swApp.Part.GetPathName – это квартира, в которой содержится свойство с именем модели.
Важно понимать эту вложенность. Функция GetPathName возвращает имя активной модели (той, которая сейчас открыта) и путь к ней в виде строки (например:
"C:\Desktop\Макросы Solid\тест\Деталь металло конструкция.SLDPRT").
Однако, если вызвать эту функцию для объекта, находящегося «на другом этаже», она работать не будет.
Рассмотрим строку:
FileName = Left(FileName, Len(FileName) - 6) & "step"
В ней из строки, полученной методом GetPathName, удаляются последние 6 символов (то есть расширение файла SLDPRT) и заменяются на «step». Полученную строку затем передаём в функцию longstatus=Part.SaveAs3(FileName, 0, 2).
Этот механизм работает для множества форматов, но, например, с PDF всё устроено иначе (обсудим в следующей записи).
Многие функции возвращают значения – в данном случае логическое значение (False или True), которое необходимо сохранить в переменную. Если написать только правую часть, например, «Part.SaveAs3(FileName, 0, 2)», то функция не сработает.
Для вывода информации используется функция MsgBox, в которую передаётся текст сообщения или переменная. Функция MsgBox обладает различными вариантами отображения (значки - вопросительные, предупреждающие и т.д., типы кнопок - одна, две, три ), и при необходимости, можно обработать их выбор. Кроме того, MsgBox является одним из способов отладки кода, позволяющим понять, в какую ветку программы мы попали и посмотреть значение переменной. О его использовании не составит труда найти информацию.
В целом, по коду всё. Надеюсь, этот материал окажется полезным для вас.
Пара слов по отладке кода: В среде VBA существуют несколько полезных инструментов для отладки:
– Точки останова – они позволяют остановить выполнение программы в определённом месте.
– Пошаговый режим – вы можете выполнять код построчно.
– Окно Watch – в него можно добавить переменные, чтобы наблюдать за их значениями в процессе выполнения (добавляется через меню «Вид»).
– Поле Immediate – также доступно через меню «Вид». В него выводятся сообщения с помощью команды Debug.Print, например:
Debug.Print "Успешно сохранено как STEP."
Это работает как лог, при этом программа не останавливается при появлении сообщения.
Наконец, для лучшего понимания принципов создания макросов я рекомендую посмотреть обучающие видео по макросам для Excel. Язык программирования, среда разработки и многие принципы здесь взаимозаменяемы, поэтому материалы для Excel будут весьма полезны.
Надеюсь, этот материал поможет вам лучше понять основы работы с SolidWorks API и начальные этапы программирования макросов на VBA. В дальнейшем планирую еще добавить статей, т.к. написал несколько десятков макросов и везде были свои нюансы.
Успехов в изучении и практической работе!
Код из картинки выше для возможности скопировать.
Dim swApp As Object
Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long
Dim FileName As String
Sub main()
' Получаем приложение SolidWorks
Set swApp = Application.SldWorks
' Получаем активный документ
Set Part = swApp.ActiveDoc
' Проверяем, является ли активный документ деталью
If Part.GetType = swDocPART Then
' Получаем имя файла и заменяем его расширение на "step"
FileName = Part.GetPathName
FileName = Left(FileName, Len(FileName) - 6) & "step"
' Сохраняем как STEP файл
longstatus = Part.SaveAs3(FileName, 0, 2)
' Успешное сообщение
MsgBox "Успешно сохранено как STEP."
Else
' Выводим предупреждение, если активный документ не является деталью
MsgBox "Активный документ не является деталью (Part)."
End
End If
End Sub
Маленькое но Важное дополнение как сохранять в STEP 214 или 203 в некоторых случаях это принципиально важный момент. В 214 точно передаются цвета модели других явных отличий я не заметил.
Чтобы однозначно указать формат вставляем перед сохранением (можно в начале кода) следующий код:
Dim step As Long
step = swApp.SetUserPreferenceIntegerValue(swStepAP, 214) 'Сохранять в формат STEP AP214 или 203
Чтобы проверить в каком формате сохранился нужно step открыть блокнотом.