В современных условиях для любого предприятия важно сокращение сроков проектирования новых изделий. Один из путей такого сокращения – это автоматизация процессов проектирования. Среди проектируемых изделий можно выделить стандартную тару. С помощью этой тары (комплектов ящиков) могут быть упакованы, например, комплексы радиоэлектронной аппаратуры. Задача проектирования таких комплектов ящиков в отдельных случаях может быть достаточно формализована и представлять собой монотонную работу.



Следует отметить, что задачами автоматизации проектирования тары занимался ряд ученых, разработчиков и организаций (см. например [1, 2, 3]). Однако не существует широко известных инструментов, предназначенных для решения узкоспециализированной задачи: проектирования ящиков типа VI по ГОСТ 5959-80 (см. рисунок выше) на основе API SolidWorks. Поэтому представляют интерес способы такого решения.

Автор статьи, работая конструктором и имея некоторые навыки разработки приложений VBA, как раз и столкнулся с необходимостью проектировать комплекты ящиков. И это подтолкнуло его к идее разработать для этого программу.

Первоначально для автоматизации проектирования был написан макрос VBA (ознакомиться с результатами разработки можно в соответствующей публикации [4]). Однако за рамками публикации остались отдельные моменты, представляющие скорее не научный, а практический интерес для разработчиков, использующих API SolidWorks. Тем, кто приступает к программированию с использованием API, зачастую много времени приходится затрачивать на поиск методов решения типовых задач, причем иногда на англоязычных ресурсах.

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

Это послужило основанием для рассмотрения в статье следующих вопросов.

  1. Разработка приложения, которое лишено вышеуказанных недостатков.
  2. Средства API, используемые для решения некоторых типовых задач.

Приложение, упомянутое выше, было написано на языке программирования C++/CLI (и я не испугаюсь этих слов). Выбор такого языка для решения задачи основывался на ряде причин, выходящих за рамки данной статьи. В качестве альтернативы можно использовать, например, язык программирования C#. Названия объектов, методов и свойств API SolidWorks для VBA, C# и С++/CLI одни и те же, поэтому для переноса программного кода в другой язык программирования требуется знать лишь некоторые особенности синтаксиса.

Для разработки такого приложения автору пришлось получить начальное представление о программировании на языке С++.

Внешний вид стартовой формы приложения представлен на рисунке.



Демонстрацию процесса проектирования тары с помощью программы можно увидеть на видео.


Структурная схема программного продукта, приведенная в публикации [4], претерпела некоторые изменения в основном в части архитектуры приложения. Методика построения 3D-модели, схема обмена данными и применения ряда инструментов SolidWorks осталась та же. Измененная структурная схема представлена на рисунке.



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

Теперь перейдем к описанию решения некоторых типовых задач.

1. Получение доступа к объекту типа SldWorks^


Предполагается, что разработчиком в Visual Studio 2019 создан пустой проект CLR и начата работа над приложением Windows Form (см., например [5]). Также предполагается, что разработчик получил начальное представление о программировании на С++ (или, например, на С# или VB, если идти другими путями).

Кроме файла исходного кода, запускающего стартовую форму, добавлен заголовочный файл и основной файл исходного кода. В последних двух файлах после директив препроцессора #include указываются пространства имен SolidWorks:

using namespace SolidWorks::Interop::sldworks;
using namespace SolidWorks::Interop::swcommands;
using namespace SolidWorks::Interop::swconst;

В окне обозревателя решений Visual Studio 2019 в разделе «Ссылки» необходимо добавить ссылки на файлы dll SolidWorks, предназначенные для работы с API (см. рисунок).



Данные файлы находятся в папке C:\Program Files\SolidWorks Corp\SolidWorks\api\redist\

Одним из способов получения доступа к объекту типа SldWorks^ является использование следующего программного кода:

SldWorks^ swApp = nullptr; //Объект типа SldWorks^
        
//Массив запущенных процессов SolidWorks
array<Process^>^ localByName = Process::GetProcessesByName("SLDWORKS");
		

//Проверяем, запущен ли хоть один процесс SW
if (localByName->Length > 0)
{
MessageBoxA(0, "Запущено одно или несколько приложений SolidWorks. Закройте их и повторите попытку.", "Ошибка!", MB_ICONSTOP | MB_OK);
     return -1;
}
swApp = (SldWorks^) Activator::CreateInstance(Type::GetTypeFromProgID("SldWorks.Application.21"));

Отметим, что в нашем случае для корректной работы приложения необходимо запускать определенную версию SolidWorks, для чего выполняются дополнительные проверки. Аргумент «SldWorks.Application.21» означает, что необходимо запустить SolidWorks 2013. Цифры в конце аргумента возрастают на единицу с увеличением года версии программы на один.

2. Задача копирования файлов шаблонов 3D-модели сборки ящика


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

//Предполагается здесь и в других примерах кода, что уже получен доступ к приложению //SolidWorks (переменная swApp типа SldWorks^), что показано в фрагменте кода к задаче 1 

IModelDoc2^ swModel;
int longstatus;
bool boolstatus;

//Открываем файл 3D-модели ящика и чертеж в папке с шаблонами
swApp->OpenDoc6(gcnew System::String(str_Drawing_input_path.c_str()), 3, 0, "", swErrors, swWarnings);
//str_Drawing_input_path – путь хранения шаблона чертежа, тип переменной string
swApp->OpenDoc6(gcnew System::String(str_Box_input_path.c_str()), 2, 0, "", swErrors, swWarnings);
//str_Box_input_path – путь хранения шаблона 3D-модели сборки, тип переменной string
swApp->ActivateDoc2("Ящик", false, longstatus);
swModel = (IModelDoc2^)swApp->ActiveDoc;

//Сохраняем сборку в папку, указанную пользователем. Ссылки на модель в чертеже при этом меняются
longstatus = swModel->SaveAs3(gcnew System::String(str_Box_output_path.c_str()), 0, 1);
//str_Box_output_path – путь для сохранения файла сборки в папку пользователя, тип переменной string
swModel = (IModelDoc2^)swApp->ActiveDoc;
swApp->ActivateDoc2("Ящик - Лист1", false, longstatus);
swModel = (IModelDoc2^)swApp->ActiveDoc;
		
//Сохраняем шаблон чертежа
boolstatus = swModel->Save3(1, swErrors, swWarnings);

//Закрываем шаблон чертежа
swApp->CloseDoc("Ящик - Лист1");

//Копируем шаблон чертежа в папку пользователя
File::Copy(gcnew System::String(str_Drawing_input_path.c_str()), gcnew System::String(str_Drawing_output_path.c_str()), true);
//str_Drawing_output_path - путь для сохранения файла сборки в папку пользователя, тип переменной string
		
//Открываем шаблон чертежа
swModel = swApp->OpenDoc6(gcnew System::String(str_Drawing_input_path.c_str()), 3, 0, "", swErrors, swWarnings);

//Сохраняем сборку в предыдущее место. Ссылки на модель в чертеже опять меняются
swApp->ActivateDoc2(gcnew System::String(Box_parametres.str_Box_designation.c_str()) + " - Ящик.SLDASM", false, longstatus);
swModel = (IModelDoc2^)swApp->ActiveDoc;
longstatus = swModel->SaveAs3(gcnew System::String(str_Box_input_path.c_str()), 0, 1);
		
//Закроем шаблон файла сборки ящика
swApp->CloseDoc("Ящик.SLDASM");
swModel = (IModelDoc2^)swApp->ActiveDoc;
swApp->ActivateDoc2("Ящик - Лист1", false, longstatus);
swModel = (IModelDoc2^)swApp->ActiveDoc;
		
//Снова сохраняем шаблон чертежа
boolstatus = swModel->Save3(1, swErrors, swWarnings);
		
//Закрываем шаблон чертежа
swApp->CloseDoc("Ящик - Лист1");

3. Задача записи в файл 3D-модели сборки пользовательских свойств


Решение этой задачей иллюстрируется программным кодом соответствующей функции:

	//Функция добавления свойств к файлу модели
int SetActiveConfigProperty(IModelDoc2^ Model, string PropertyName, string PropertyValue, int PropertyType)
{
		ConfigurationManager^ swConfMgr;               
		ModelDocExtension^ swModelDocExt;
		CustomPropertyManager^ swCustProp;
		System::String^ ConfigName;
		System::String^ resolvedPropertyValue;
		int int_Result_code;
		
		swConfMgr = Model->ConfigurationManager;
		ConfigName = swConfMgr->ActiveConfiguration->Name;

		swModelDocExt = Model->Extension;
		swCustProp = swModelDocExt->CustomPropertyManager[ConfigName];
		
		//Для корректной работы удаляем свойство, если оно существует
		int_Result_code = swCustProp->Delete(gcnew System::String(PropertyName.c_str()));
		//Проверяем тип добавляемого свойства: 1 - текст, 2 - число
		if (PropertyType == 1)
			int_Result_code = swCustProp->Add2(gcnew System::String(PropertyName.c_str()), 30, gcnew System::String(PropertyValue.c_str()));
		else if (PropertyType == 2)
			int_Result_code = swCustProp->Add2(gcnew System::String(PropertyName.c_str()), 5, gcnew System::String(PropertyValue.c_str()));
		
		return int_Result_code;
}

4. Задача автоматического перестроения таблицы параметров без участия конструктора


Предварительно в файле 3D-модели сборки сохранены пользовательские свойства, которые должны обновиться в таблице параметров. Решение этой задачи в макросе, предназначенном для других целей, рассмотрено на ресурсе [6]. Приведем фрагмент кода, отвечающий за данную функциональность:

DesignTable^ DesTbl;
bool bool_Result;
ModelDoc2^ swDoc;

//Получаем доступ к таблице параметров
swDoc = (ModelDoc2^)swApp->ActiveDoc;
DesTbl = (DesignTable^)swDoc->GetDesignTable();
bool_Result = DesTbl->Attach();

//Обновляем таблицу параметров и отключаемся от нее
bool_Result = DesTbl->UpdateTable(2, true);
DesTbl->Detach();

5. Задачи ускорения работы макроса


Эти задачи могут быть решены путем использования ряда методов API [7]. В нашей работе было использовано два из них: скрытие приложения от пользователя и отключение регенерации экрана. Отключение регенерации экрана осуществлялось не на всех этапах, а лишь на этапе автоматического обновления таблицы параметров. Поэтому решаемая задача иллюстрирует не количественный, а качественный выигрыш в скорости. Обращаем внимание, что для отключения видимости приложения нужно изменять не одно свойство приложения, а целых три [8]:

Frame^ pFrame;

swApp->UserControl = false;
swApp->Visible = false;
pFrame = (Frame^)swApp->Frame();
pFrame->KeepInvisible = true;

Фрагмент кода, отключающий регенерацию экрана:

IModelDoc2^ swModel;
ModelView^ modView;

swModel = (IModelDoc2^)swApp->ActiveDoc;
modView = (ModelView^)swModel->ActiveView;
modView->EnableGraphicsUpdate = false;

Как показали замеры времени, взаимодействие с API SolidWorks макроса VBA (с учетом ручного обновления таблицы параметров) и приложения C++/CLI при проектировании одного и того же ящика занимает приблизительно 160 и 65 секунд соответственно. Это подтверждает ожидаемое сокращение времени работы макроса. Примерно такая же картина наблюдается при сравнении двух версий приложений на C++/CLI.

В заключение отметим, что в статье были рассмотрены средства API, которые были использованы при решении ряда типовых задач взаимодействия с SolidWorks. Усовершенствованное приложение позволяет получить комплект конструкторской документации на ящик приблизительно за 5-7 минут по сравнению с 10-15 минутами для макроса VBA (без учета сохранения документации в PDM/PLM системе).

Библиографический список


  1. Инженерная компания Глосис [Электронный ресурс] .– URL: glosys.ru/index.php/projects/item/161-sistema-avtomatizirovannogo-proektirovaniya-yaschichnoy-taryi.html .– (дата обращения 12.01.2022).
  2. Полянсков Ю. В., Павлов П. Ю., Блюменштейн А. А., Мешихин А. А. Автоматизированное проектирование тары для транспортировки панелей гражданского самолета // Известия Самарского научного центра Российской академии наук .–2019 .– т. 21 .– №4.
  3. Ястребов Д. В., Згуральская Е. Н., Егорычев Д. В. Автоматизированное проектирование тары для транспортировки узлов и панелей авиационных изделий // Известия Самарского научного центра Российской академии наук .– 2021 .– т. 23 .– №1.
  4. Серков Е. А. Автоматизация проектирования тары для комплексов радиоэлектронной аппаратуры // Изв. вузов. Приборостроение .– 2020 .– т. 63 .– №6 .– с. 548-554.
  5. YouTube. Создание оконного приложения С++/Visual studio 2019/Windows Form. [Электронный ресурс] .– URL: www.youtube.com/watch?v=QbMVxkzTi54 .– (дата обращения 09.11.2021).
  6. SolidWorks. Forums. [Электронный ресурс] .– Режим доступа: для авториз. пользователей .– URL: forum.solidworks.com/thread/114067 .– (дата обращения 07.11.2021).
  7. CAD booster. SolidWorks automation. How to improve SOLIDWORKS macro speed 10x [Электронный ресурс] .– URL: cadbooster.com/improve-solidworks-macro-speed-10x/#disable-updating-feature-tree .– (дата обращения 07.11.2021).
  8. SolidWorks. Forums. [Электронный ресурс] .– Режим доступа: для авториз. пользователей .– URL: forum.solidworks.com/thread/106420 .– (дата обращения 07.11.2021).

Комментарии (9)


  1. Kekushiftkey
    12.01.2022 07:14

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


    1. starfair
      12.01.2022 10:36

      Я в свое время, пытался решать одну из задач автоматизации, которую традиционно используют сейчас в CorelDraw на SolidWork, но отказался от этой идеи, по причине того, что API очень жестко привязано к версии программы, и созданное в версии для солида 2010, не работает порой даже в обновлении этой же версии, не говоря уже о других, и надо фактически компилировать и поддерживать целый рой аддонов. Не знаю правда, как сейчас, но это оказалось очень не удобным. А на VBA, многие задачи просто делаются намного менее очевидно, и есть проблемы в плане удобства написания и отладки.
      А что до авторов и их уровня, ну так и задачи то не обыденные, можно сказать - штучные. Посему и уровень подготовки у решающих их должен быть соответствующим, как мне кажется.


      1. constructor_e Автор
        12.01.2022 11:23

        Была подобного рода проблема при работе над этой программой, правда не с API, а с таблицей параметров 3D-модели сборки. При переходе с SolidWorks 2013 на (если не ошибаюсь) 2017 или 2019 пропадала возможность редактировать взаимосвязи в таблице параметров. Хоть и делаешь все по справке SolidWorks, но не все взаимосвязи можно задать. Потом после переработки 3D-модели сборки и таблицы параметров результат получился такой, что, как в SolidWorks 2013, так и в SolidWorks 2019 все работает в плане перестроения модели.


        1. Txanxs
          13.01.2022 16:51

          В AutoCAD была такая же беда. Меняешь версию - и можешь готовиться к переписыванию макросов.


  1. Zhbert
    12.01.2022 10:33

    На самом деле очень круто! Говорю, как человек, который делал комплекты упаковок.

    Правда, мы тогда пошли немного другим путём, да и работали мы в Creo. Мы сделали сборку, начинающуюся от одного «основного» угла. Далее пошла магия с формулами — основными были три размера: длина, ширина и высота. От них пересчитывалось все — количество досок, расстояние между ними, угол наклона укосин (ух как мы там наворотили с тангенсами и косинусами...), количество гвоздей.

    В итоге получилась одна единственная модель, в которой было достаточно поменять три основных размера, чтобы получить новый ящик. Чертежи, правда, потом все равно чертили на них руками, но модель очень сильно упростила процесс разработки стандартного комплекта упаковки.


  1. Txanxs
    13.01.2022 16:49

    Я в свое время очень много чего автоматизировал при помощи именно VBA. И считаю, что этот инструмент недооценен. Достаточно просто с его помощью, даже не имея большого опыта программирования решать рутинные задачи.

    Понятно, что VBA есть в продуктах микрософт. Хорошо, что он встречается в других продуктах. Правда я так понял, что в данном случае потребовался отдельно устанавливаемый Visual Studio. Я с VBA работал только во встроенных IDE - офиса (кстати, включая Visio) и в AutoCAD.

    То есть вообще, использование VBA - это весьма эффективный подход к автоматизации проектирования. Но и не только.


  1. eikhner
    13.01.2022 16:56

    Извините что вклиниваюсь в комментарии - но задача ящиков может решаться просто с помощью обычного эксель фаила (и текстовика для уравнении). Задайте в нем - экселе - переменные ширины, длины и высоты, и на основании этого, привязав нужные вам поперечины к этим размерам - строите любые ящики любой конфигурации, просто создав на основании этих переменных записанные в текстовик данные ... Из которого SW будет брать размеры ваших ящиков .
    Для этого достаточно просто уравнении , встроенных в программное обеспечение SW ..
    Могу ошибаться - но возможно вам легче это сделать на API ...


    1. constructor_e Автор
      13.01.2022 19:50

      В контексте того, как я Вас понял, попробую сравнить 2 идеи. Я немного вольно интерпретирую и разовью Вашу логику, опираясь на описание методики, которую использовал мой коллега для решения этой же задачи.

      Идея, рассматриваемая в статье:

      1. Имеется 35 шаблонов 3D-моделей сборок и связанных с ними чертежей.

      2. 3D-модель сборки конфигурируется через связку уравнений и таблицы параметров в файле Excel.

      3. Файлы спецификации и ведомости покупных изделий генерируются автоматически через доступ к API Excel.

      Идея, производная от Вашей:

      1. Имеется некоторе количество шаблонов 3D-моделей сборок и связанных с ними чертежей. Точно посчитать количество не могу, т.к. гвозди, указываемые в спецификации, могут различаться по числу позиций в зависимости от толщины планок. И это может дать свой набор комбинаций шаблонов.

      2. 3D-модель сборки конфигурируется через связку уравнений и таблицы параметров в файле Excel.

      3. Файлы спецификации и ведомости покупных изделий создаются на отдельных листах сборочного чертежа. Переменные данные в спецификацию вытаскиваются через ссылки на свойства файла 3D-модели сборки. При этом надо описать спец

      На мой взгляд, примерно одинаковые по трудоемкости реализации идеи.


      1. constructor_e Автор
        14.01.2022 08:22

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