Найти в Дзене
Будни трейдера

Параметризация. SolidApi с нуля! (часть 1)

Доброго всем дня! Хочу поделиться своими успехами и неудачами на пути от ручного проектирования до параметрических моделей. Читая эту статью, прошу держать в голове тот факт, что на старте я абсолютно ничего не знал о параметризации, а опыт объектно-ориентированного программирования у меня хоть и был, но это было 10 лет назад на паскале в среде Delphi. В мои рабочие задачи конструкторской деятельности входит проектирование изделий из листового металла с подготовкой разверток для производства. Дополнительно, имея большой опыт в технологии производства, я проектирую с учетом конкретного оборудования. Мой опыт проектирования в Solidworks составляет больше 12 лет (7 лет с листовым металлом, 5 лет в мебели), но я всегда использовал солид для ручного проектирования, даже конфигурациями не пользовался (сохраняя несколько копий одного изделия). Я конечно же знал, что в Solidworks можно делать параметрические модели, облегчая свой труд автоматизацией проектирования, всё-таки это одна из популяр

Доброго всем дня! Хочу поделиться своими успехами и неудачами на пути от ручного проектирования до параметрических моделей. Читая эту статью, прошу держать в голове тот факт, что на старте я абсолютно ничего не знал о параметризации, а опыт объектно-ориентированного программирования у меня хоть и был, но это было 10 лет назад на паскале в среде Delphi.

В мои рабочие задачи конструкторской деятельности входит проектирование изделий из листового металла с подготовкой разверток для производства. Дополнительно, имея большой опыт в технологии производства, я проектирую с учетом конкретного оборудования. Мой опыт проектирования в Solidworks составляет больше 12 лет (7 лет с листовым металлом, 5 лет в мебели), но я всегда использовал солид для ручного проектирования, даже конфигурациями не пользовался (сохраняя несколько копий одного изделия).

-2

Я конечно же знал, что в Solidworks можно делать параметрические модели, облегчая свой труд автоматизацией проектирования, всё-таки это одна из популярнейших CAD-систем для 3д моделирования. Но всё время я откладывал "на потом", да и несмотря на такой багаж опыта, я никогда не связывал свою судьбу с конструированием. К тому же, в Solidworks нет дружелюбного интерфейса для начала работы с автоматизаций. И всё делается через Api (Application Programming Interface) посредством запускаемых макросов или разработкой стороннего приложения, для управления Solidworks.

В 2023 году, мне довелось поработать с молодым, перспективным конструктором, Семёном, который проектировал в AutoDesk Inventor (это как солид, только инвентор). И буквально сразу же он начал проектировать параметрические модели для стандартных изделий. Это многократно ускоряло работу, выполняя дневной объем работы, который я осилил бы дня за три минимум. В то время я был в основном загружен другими проектами, которые как раз требовали ручного проектирования (нестандартные шкафы, двухконтурные БСК и т.д.), так что на стандартную фасонину (фасонные элементы) я отвлекался очень редко. Но когда отвлекался, то пользовался как раз параметрическими моделями, и мне это очень нравилось, даже несмотря на то, что процесс проектирования был полуавтоматическим (развертку приходилось доводить руками, делая постобработку, добавляя необходимые технологические элементы).

Тройник в Inventor
Тройник в Inventor
-4

Помню, у нас был корпоратив (осень 2023) и руководитель спросил: есть ли у меня пожелания, в какую сторону я хотел бы развиваться. В ту осень у нас был учебный бум, многие проходили курсы, кто по тендерам, кто по битриксу (система планирования и постановки задач). Я тогда ответил, что мне было бы интересно разобраться в Solidworks Api и идти в сторону интеграции программирования и конструирования (в прошлом я довольно успешно кодил на паскале в Delphi, но затем был большой перерыв, более 10 лет). И мне это действительно нравилось, но ушел я в бизнес, вместо того, чтобы пойти в айти. Сейчас, оглядываясь на пепелище двух моих начинаний (мебель и авторазборка), я с грустью понимаю, что кроме дорогущего опыта длиною в 10 лет жизни и проблем со здоровьем от постоянного стресса, я ничего не заработал.

Итак, вернемся в конец 2023 года, а именно: начало декабря. Семён уволился, перейдя на более оплачиваемую работу, а я понял, что оставшись единственным конструктором, мне предстоит делать весь тот объем работы, что делал Сёма.

Мне нужно было максимально быстро понять, как работает автоматизация в Solidworks, так как случись что с инвенторовскими моделями, исправить их мне будет сложно, как и внести что-то новое. Начал гуглить, смотреть ютуб. Но как оказалось, в ру-сегменте, нормальной структурированной информации очень мало! Да, есть объемная справочная система самого солида, но чтоб в ней разобраться, нужно по-моему ещё одно обучающее пособие. Благо в хроме есть встроенный переводчик, это помогло читать зарубежные ресурсы (правда в большинстве случаев с впн).

Поставил себе задачу, накидал эскиз main-формы будущей программы, оформил в голове структуру будущего проекта.

Эскиз будущего приложения
Эскиз будущего приложения
Постановка задачи
Постановка задачи

Сначала я понял как работают уравнения и создал свою первую параметрическую модель с управлением параметрами через внешний текстовый файл, в котором эти параметры и хранятся.

Я не знал, как с помощью кода макроса менять глобальные переменные в модели, а уж считать данные из текстового файла и записать новые, задача вполне тривиальная.
Уравнения в обечайке
Уравнения в обечайке

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

Пользовательская форма
Пользовательская форма

Отмечу, что программирование макроса в SolidWorks реализовано на языке VBA (visual Basic for Application). Это событийно-ориентированный язык программирования, изначально расширяющий возможности Microsoft Office.
На бейсике я даже в школе не кодил, хотя, когда я изучал C++ в универе, параллельно с Turbo pascal, то сложностей с переходом на другой язык особо не было. Немного другой синтаксис, к которому в принципе привыкаешь.

Данные благополучно записываются в текстовый файл, но после перезаписи файла, в солиде "слетает" уравнение, так как он не может найти исходный файл. Бедааа... снова гугл в помощь.

В итоге, нашел (готовый) способ изменить глобальную переменную внутри кода vba. Считываем глобальные переменные, при нахождении нужной, меняем значение на необходимое (введённое в пользовательскую форму).

Call SetVar("Диаметр БСК", 450)

Sub SetVar(Global_name As String, Value As Variant) 'Имя глобальной переменной: "Диаметр БСК", Нужное значение: 500
'Меняет значение указанной в аргументе глобальной переменной на Value
' Подключаемся к SolidWorks
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
' Подключаемся к активной модели
Dim swModel As ModelDoc2
Set swModel = swApp.ActiveDoc
Dim swEqnMgr As SldWorks.EquationMgr
Set swEqnMgr = swModel.GetEquationMgr Set swEqnMgr = swModel.GetEquationMgr
Dim i As LongDim i As Long
Dim vSplit As VariantvSplit As Variant
For i = 0 To swEqnMgr.GetCount - 1 'GetCount - количество (индекс) уравнений в моделиFor i = 0 To swEqnMgr.GetCount - 1 'GetCount - количество (индекс) уравнений в модели
vSplit = Split(swEqnMgr.Equation(i), "= ") 'vSplit - массив, в нулевую ячейку записывается строка до разделителя vSplit = Split(swEqnMgr.Equation(i), "= ") 'vSplit - массив, в нулевую ячейку записывается строка до разделителя
vSplit(0) = Replace(vSplit(0), Chr(34), Empty) 'найти-заменить - кавычку на "пусто" vSplit(0) = Replace(vSplit(0), Chr(34), Empty) 'найти-заменить - кавычку на "пусто"
If vSplit(0) = Global_name Then _If vSplit(0) = Global_name Then _
swEqnMgr.Equation(i) = Replace(swEqnMgr.Equation(i), vSplit(1), value) 'если находим нужную переменную, меняем на value swEqnMgr.Equation(i) = Replace(swEqnMgr.Equation(i), vSplit(1), value) 'если находим нужную переменную, меняем на value
Next iNext i
End Sub
-9
-10

Сборка БСК (быстросъемная конструкция) состоит из 2х подсборок (половинки), каждая половинка собирается из 3х комплектующих (обечайка + торец + зеркальное отражение торца).

Надо бы в будущем пересобрать сборку, убрав половинки, немного оптимизировать время формирования новой модели.
БСК - быстросъемная конструкция
БСК - быстросъемная конструкция

С помощью пользовательской формы мы вводим значение диаметра и длины бск. При нажатии кнопки "ок", модель перестраивается в соответствие с заданными параметрами.

Поначалу сборка не хотела перестраиваться, и я не мог понять в чем причина, ведь каждый элемент уже обладал нужными параметрами. В итоге, написал две процедуры на открытие модели и закрытие. После ввода параметров я поочередно открываю каждую модель, меняю в ней параметры и закрываю модель. После чего, программно перестраиваю сборку и всё заработало, БИНГО!

Радовался как ребенок, когда увидел как модель перестраивается за 10 секунд (учитывая, что не так давно, на это у меня уходило по 15 минут на типоразмер, но это с развертками). А здесь до разверток я ещё не добрался.

Гравировку сделал с помощью эскиза "Текст". Развертка при этом, сохраняется с включением эскизов.

Эскиз гравировки
Эскиз гравировки
Уже позже, я избавился от необходимости сохранять эскиз в развертке, сделав прямо в модели вырез глубиной 0,1мм.

В поле ввода выполняется проверка на ввод только цифр.

Private Sub t_length_Change()
'допускается только ввод цифр
If t_length.Text Like "*[!0-9]*" Then t_length.Text = t_length.Tag Else t_length.Tag = t_length.Text
End Sub
-13
-14

Объединение проектов (21.12.2023)

С самого начала я планировал вести два проекта

  1. Параметризация - отвечает за параметрические модели в Solidworks.
  2. SolidApi - программная оболочка, управление автоматизацией.

Казалось, что разделение оправдано, но через 2 недели работы над проектами, я понял, что один проект невозможен без второго. Нет смысла делать отдельно модели, без пользовательского интерфейса, и наоборот: интерфейс бессмысленен без подготовленных моделей. В итоге, я объединяю два проекта: "Параметризация. Solid Api".

-15

-16
-17

Автоматический экспорт разверток

Пришло время заняться развертками. Решил пойти по пути наименьшего сопротивления: записал макрос сохранения развертки одной детали, чтобы в дальнейшем просто зациклить, как я делал с открытием деталей. Но что-то пошло не так, созданный солидом макрос, не работает, бред какой-то.

Начал гуглить запрос "Solidworks api сохранить развертку в Dxf", и наткнулся на видео с макросом, который выгружает все развертки из папки. Скачал нужный мне макрос, запустил, и он реально работает!!! Крутота!!!

Разобрался с настройками макроса, теперь развертки сортируются по толщине, складываясь в отдельные папки и имена файлов настраиваемые, с полным шифром Шелтер БСК...(бла-бла-бла).

Столкнулся с проблемой сохранения зеркальной развертки. Это очень критично, если материал имеет лицевую сторону (например нержавейка в пленке).

Решил вопрос переопределением зафиксированной грани в параметрах развертки (редактировать определение развертки / зафиксированная грань). Теперь экспортируется как надо, только вверх ногами. Перенес эскиз гравировки на другую сторону.

Переопределение зафиксированной грани в параметрах развертки
Переопределение зафиксированной грани в параметрах развертки

Скрипт, который я нашел, отлично работает в автономном режиме, экспортирует развертки, всё о'кей. Но как только я заключил весь модуль в одну процедуру и вызвал её (процедуру) из своей программы, то после экспорта первой развертки вылезает ошибка.

Ошибка: Object variable or With block variable not set

Переменная объекта или переменная блока не установлена. На переменную ссылаются до того, как ей было присвоено значение.

Не понимаю... все переменные определены, всё должно работать! (должно, но не обязано) Снова топчемся на месте
-19

Пока то да сё, сделал основную форму, которая открывает всю сборку БСК и форму ввода параметров. В дальнейшем, на главной форме будут кнопки всех основных фасонных элементов. Метод открытия модели: swApp.OpenDoc7.

Первая кнопка на первой форме
Первая кнопка на первой форме

Внезапно открыл для себя условный оператор (if then else) прямо в разделе уравнений солида! Это кардинально поменяло ситуацию. Ведь теперь, с помощью условий я могу изменять некоторые параметры прямо внутри модели, а также отображать или скрывать элементы (эскизы, вырезы, бобышки, массивы и т.д.).

Мда... как я там говорил? "в Solidworks нет дружелюбного интерфейса для начала работы с автоматизаций", зато с параметризацией тут все отлично! Нужно только знать, куда лезть!

Например: если длина >1000, то высветить эскиз, иначе погасить
iif (длина > 1000, "unsuppressed", "suppressed").

Отложив ошибку с развертками я переключился на крепежки теплоизоляции. Как я писал выше, расположение и количество отверстий зависит от длины, диаметра, толщины теплоизоляции. Всё условия удалось в дальнейшем решить прямо внутри модели, за исключением одного параметра. Вычисляя шаг отверстий массива я ловил критичную ошибку деления на ноль, когда использовалось всего одно отверстие (кол-во отв -1 = 0). На изображении это параметр kr1_step и Kr1_n_array.

Уравнения с условиями
Уравнения с условиями

В дальнейшем, удалось решить эту проблему путем расчета количества отверстий в коде и принудительной записи результата в модель как вычисленную переменную (Kr1_count).

Доработанные уравнения
Доработанные уравнения
-23

Люблю я работать на удалёнке, никто не отвлекает, нет внешнего шума офиса, можно сконцентрироваться на задаче а при необходимости тут же посмотреть какой-нибудь обучающий туториал. И самое, пожалуй, главное: ты не теряешь времени на дорогу (а в моем случае это минимум 1,5 часа в одну сторону) с пересадкой.

29 декабря был как раз такой день, стоял сильный мороз 30 градусов, снегопад с нечищеными дорогами вкупе с предновогодними пробками, добраться до работы было чем-то сверхъестественным. 8 часов беспрерывного кодинга и проектирования, и на выходе полностью рабочая модель БСК с правильно меняющимися отверстиями и вводом параметров с формы.

Готовая параметрическая модель БСК
Готовая параметрическая модель БСК

Помимо дневника проекта, в котором я веду подробную хронологию разработки (с пометками, мыслями, ошибками, периодическими скринами), я так же отслеживаю тайминг разработки.

В итоге, с момента постановки задачи (8.12.2023г) и до конца года, я приступал к проекту на протяжении 13 дней, затратив на это ровно 54 часа.

Kaiten - учет времени
Kaiten - учет времени

Сейчас, для учета времени я использую таск-менеджер Kaiten, стало удобнее, нежели я записывал и считал все вручную.

-26

Наступил Новый 2024 год, начало которого я с головой провел в State of Decay 2, а 5-го января приступил к работе (благо для этого не надо было ехать в офис).

Передо мной стояла большая задача сделать несколько десятков БСК с разными типоразмерами. И мне очень не хотелось делать их по старинке, да и у нас уже были разработаны новые правила расположения отверстий, которые я благополучно внедрил в 3д-модель, осталось только протестировать. В итоге, я решил, что лучше я потрачу ещё день-два на допиливание скрипта, а потом за пару тройку часов сделаю блоки (по 15 секунд на изделие), чем я утону в списках, тратя на каждую БСК по 10-15 минут.

За 2,5 дня я решил вопрос с экспортом разверток, найдя другой способ, что позволило интегрировать скрипт в основной макрос. Обновил пользовательскую форму, смирился с особенностью гравировки, отложив решение на будущее и зафиксировал первый рабочий билд параметрической модели БСК (7.01.2024).

Пользовательская форма ввода параметров
Пользовательская форма ввода параметров
Sub ExportToDxfPart()
' Подключаемся к SolidWorks
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
' Подключаемся к активной модели
Dim swModel As ModelDoc2
Set swModel = swApp.ActiveDoc
' Проверка: открыта ли модель
If swModel Is Nothing Then
swApp.SendMsgToUser2 "Необходимо открыть деталь", swMessageBoxIcon_e.swMbStop, swMessageBoxBtn_e.swMbOk
Exit Sub
End If
Dim swPart As PartDoc
Set swPart = swModel
' Создать новый путь к файлу
Dim filePath As String
Dim newFilePath As String
filePath = swModel.GetPathName
newFilePath = gPropertyPart("Шифр") & ".dxf"
' Определение информации о листовом металле для экспорта
Dim sheetMetalOptions As SheetMetalOptions_e
sheetMetalOptions = Geometry
' Экспорт в DXF
Dim success As Boolean
success = swPart.ExportToDWG2(newFilePath, filePath, swExportToDWG_e.swExportToDWG_ExportSheetMetal, True, Nothing, False, False, sheetMetalOptions, Nothing)
End Sub
-28

На создание разверток по одному типоразмеру БСК (4 детали) уходит 2 минуты (скрипт = 1 минута, ручная корректировка гравировки = 1 минута).

Напомню, что ранее, у меня уходило на данную операцию от 10 до 15 минут. А с появлением в дальнейшем параметрических моделей в инвенторе: 5 минут на одно изделие.

После 15-ти секундной модели я, конечно же, ожидал лучших результатов, но скрипт работает медленно. К слову, если я вручную меняю уравнения, то перестроение сборки происходит мгновенно, а та же операция со скриптом уже 15 секунд. Добавление экспорта разверток, увеличивает длительность ещё почти на 45 секунд. В любом случае, это как минимум в 2 раза быстрее моего лучшего результата ранее.

Пару слов о гравировке

Вариант 1: Гравировку выполняю отдельным эскизом на развертке (без выреза). Инструментом "Текст". Затем, сохраняю развертку с включением эскизов, что в итоге добавляет в файл (dxf) одну лишнюю осевую линию (опорная линия для текста), которую приходится удалять руками и пересохранять файл. В итоге, на эту операцию уходит примерно 1 минута (4 разных детали).

Лишняя линия в развертке
Лишняя линия в развертке

Вариант 2: В какой-то момент показалось, что нашел отличный способ обойти этот нюанс, путем частичного выреза на модели (глубиной 0,1мм). Кстати, полный вырез я не делаю, так как нужно использовать трафаретный шрифт или вручную делать перемычки на цифрах, чтобы внутренняя часть не выпала при резке.

Итак, делаем частичный вырез и сохраняем развертку, предварительно установив в настройках экспорта dxf опцию "Экспортировать все сплайны в качестве полилиний". Без этой опции (сохранение сплайнами) шрифт деформируется. Лишней линии нет в обоих случаях, так как мы уже не включаем эскизы в сохранении развертки.

Частичный вырез в модели
Частичный вырез в модели
-31

Для самоконтроля я использую 4 инструмента:

Evernote - дневник проекта, в котором каждую сессию я ставлю себе задачи, прописываю прогресс и результат. У меня есть центральная заметка с содержанием проекта и дополнительные заметки по каждому реализуемому разделу.

-32

Kaiten (таск-менеджер) - удобный учет времени работы над проектом. Начал пользоваться им в апреле 2024 года. Но из-за некоторых минусов, не могу перейти в него полностью.

-33

Календарь (хронология работы над проектом) - таблица в обычном экселе, но функционально она мне очень помогает. Визуально видно дни работы над проектом, сюда я записываю отношение времени работы над проектом к общему рабочему времени за месяц по производственному календарю (это единственная строка с процентами на скрине).

-34

Чек-лист - я разделил весь проект на задачи и подзадачи, выполнение которых отмечаю в соответствующих столбцах. Добавил параметр MVP (минимально жизнеспособный продукт). Но проблема в том, что данный чек-лист расширяется по мере внедрения дополнительных возможностей, о которых в начале работы над проектом я даже не думал ))

-35
-36

В следующей статье расскажу о прогрессе за 2024 год, что удалось реализовать, с какими проблемами сталкивался, как решил. Скоро будет уже год разработки, но у меня на работу над проектом выделен всего 1 день в неделю и тот порой занят текущими рабочими задачами.

По таймингу, у меня ушло 325 часов (на 31.10.2024) и 94 сессии (так я называю день, когда я работал над проектом).

-37

Всем удачи и реализации поставленных задач!