Модификация приложения Windows Forms : организация работы с SolidWorks через приложение



 

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

 

Для начала необходимо подключить необходимые библиотеки (подключим их через добавление ссылок в проект). Ссылки две: SldWorks и SwConst. Для добавления, нажмём ПКМ в обозревателе решений на пункте Ссылки, далее в контекстном меню Добавить ссылку... и в открывшемся окне перейдём на вкладку COM. Теперь, нам нужно добавить два компонента (для SolidWorks 2010-2012 все компоненты называются одинаково, различаются только цифрой в версии). Нам нужено (Имя компонента): SldWorks 2012 Type Library и SolidWorks 2012 Constant type library. Обе библиотеки располагаются в корневом каталоге SolidWorks (<исходный путь до директории установки SolidWorks >\ SolidWorks \):

Рис. 4. 1. Добавить ссылку: выбор нужных компонентов для добавления

 

Рис. 4. 2. Результат добавления новых ссылок

 

Теперь нужно, чтобы наше приложение выполняло запуск лишь в том случае, если не запущено других экземпляров SolidWorks. Сделаем проверку на загрузку процесса SLDWORKS . exe в коде. Добавим в самом низу формы три кнопки: Запустить SolidWorks и Послать команду.

 

Запустить SolidWorks , создать деталь (Button):

( Name ): BStart
Text: Запустить SolidWorks, создать деталь
Size: 300; 23

Послать команду, выгрузить (Button):

( Name ): BSend
Text: Послать команду, выгрузить
Size: 300; 23

Фоновый режим (запуск, действие, выгрузка) (Button):

( Name ): BHide
Text: Фоновый режим (запуск, действие, выгрузка)
Size: 300; 23

 

Впишем ещё одну ссылку для работы со списком запущенных процессов в самое начало файла LWP 06 Main . cs:

 

using System.Diagnostics;

 

А также ещё две ссылки:

 

using SldWorks;

using SwConst;

 

Первая кнопка будет запускать SolidWorks (если не запущено других экземпляров приложения) и создавать там пустую деталь. Добавим код события Click для кнопки BStart:

 

   private void BStart_Click(object sender, EventArgs e)

   {

       BHide.Enabled = false;

       swApp = new SldWorks.SldWorks(); // Создаём экземпляр Solidworks приложения (SolidWorks 2012)

 

       if (swApp == null) // Если SolidWorks не запустился, посылаем сообщение; если запустился, гасим кнопку запуска

       { MessageBox.Show("Невозможно запустить экземпляр SolidWorks 2012!", "Работа с SolidWorks (C#) :: Запуск SolidWorks"); }

       else

       {

           BStart.Enabled = false;

           BHide.Enabled = false;

       }

       swApp.Visible = true; // Вытаскиваем окно SolidWorks из фонового режима

       swApp.NewPart(); // Создаём документ с новой деталью

   }

 

 

Вторая кнопка будет вызывать всплывающее окно в SolidWorks средствами API с той информацией, которую будет передавать из нашего приложения, а затем выгружать SolidWorks. Добавим код события Click для кнопки BSend:

 

   private void BSend_Click(object sender, EventArgs e)

   {

       try

       {

           swApp.SendMsgToUser2("Посылаем команды в открытое приложение SolidWorks!", (int)SwConst.swMessageBoxIcon_e.swMbInformation, (int)SwConst.swMessageBoxBtn_e.swMbOk);            

           // Выгрузка фонового процесса не произойдёт из-за некорректного объявления экземпляра класса;

           // это было допущено сознательно для демонстрации возможностей работы открытого приложения и самого Solidworks.

           // Правильная работа ExitApp() будет реализована так:

           // некая_функция() {

           // SldWorks.SldWorks swApp = new SldWorks.SldWorks();

           // /* действия */

           // swApp.ExitApp();

           // swApp = null;

           // }

           swApp.ExitApp();

           /* Выгрузим процесс */

           foreach (Process PSW in Process.GetProcessesByName(SW))

           PSW.Kill();

       }

       catch { MessageBox.Show("Невозможно послать команду экземпляру SolidWorks 2012: экземпляр приложения не найден!", "Работа с SolidWorks (C#) :: Отсылка команды в SolidWorks"); }

   }

 

Также для главного окна формы (LWP 06 Main) инициализируем событие MouseEnter. Для этого один нажмём на заголовок формы в поле конструктора, перейдём на свойства формы и нажмём на знак молнии (События). Код события MouseEnter:

 

   private void LWP06Main_MouseEnter(object sender, EventArgs e)

   {

       PList = Process.GetProcessesByName(SW); // Получаем список процессов с именем SLDWORKS

 

       if (PList.Length == 0) // Если такого процесса нет, активируем кнопку запуска SolidWorks

       {

           BStart.Enabled = true;

           BHide.Enabled = true;

       }

   }

 

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

 

Добавим объявление переменных после строчки:

 

public partial class LWP06Main : Form

{

 

Впишем:

 

   String SW = "SLDWORKS";

   Process[] PList;

   SldWorks.SldWorks swApp;

 

Функцию LWP06Main() перепишем так:

 

   public LWP06Main()

   {

       InitializeComponent();

       BStart.Enabled = false;

       BHide.Enabled = false;

   }

 

Последняя кнопка (BHide) будет выполнять фоновую загрузку SolidWorks, построение3 простой детали, сохранение на диск этой детали и выгрузку самого Solid’а.

 

ПРИМЕЧАНИЕ № 3: При записи макроса на языке C# могут возникнуть проблемы с работой VSTA и непосредственно передачей кода в шаблон. В случае, если макрос на основе шаблона не создаётся или не записывается код (открывается пустой VSTA), необходимо:

1. Вручную, в самом VSTA создать проект макроса (File -> New Project ... далее выбрать SolidWorksMacro).

2. Не закрывая VSTA, попытаться снова записать свои действия.

3. После нажатия на кнопку Остановить запись макроса, SolidWorks предложит выбрать имя для проекта и место куда сохранить код).

4. VSTA должен будет создать корректный проект на основе шаблона и скопировать в него код из SolidWorks, имя проекта будет соответствовать выбранному.

5. Ранее открытый пустой проект в VSTA не будет сохранён.

 

Рис. 4. 3. VSTA: New Project

 

Если в VSTA отсутствует шаблон проекта, этот шаблон необходимо поместить в соответствующую директорию. По умолчанию VSTA подгружает шаблоны из директории (для Windows XP, русская версия): Мои документы\ SolidWorks Visual Studio Tools for Applications \ Templates \ ProjectTemplates \ Visual C #. В эту директорию необходимо скопировать шаблон из стандартной поставки SolidWorks (solidworks _ macro . zip), который можно найти по следующему пути:<исходный путь до директории установки SolidWorks >\ SolidWorks \ data \ VSTA \ csharp \1033\

Копировать необходимо архив без распаковки. Также стоит проверить пути, которые использует VSTA для работы с SolidWorks. Для этого выполним в VSTA: Tools -> Options, нажать на Project and Solutions.

 

Главные пути:

 

Visual Studio user project templates location:

Для Windows XP, русская версия: Мои документы \SolidWorks Visual Studio Tools for Applications\Templates\ProjectTemplates

Для Windows 7, русская версия: Documents\SolidWorks Visual Studio Tools for Applications\Templates\ProjectTemplates

 

Visual Studio user item templates location:

Для Windows XP, русская версия: Мои документы \SolidWorks Visual Studio Tools for Applications\Templates\ItemTemplates

Для Windows 7, русская версия: Documents\SolidWorks Visual Studio Tools for Applications\Templates\ItemTemplates

 

Также, в случае если есть проблемы с записью макросов, стоит сделать следующее: в SolidWorks зайти в Параметры, в разделе Общие найти и снять галочку с пункта Остановить отладчик VSTA при завершении работы макроса и поставить галочку в пункте Автоматически редактировать макрос после записи.

 

Рис. 4. 4. Настройка SolidWorks для работы с VSTA

 

В случае успешной записи макроса, его работу можно проверить следующим образом: скомпилировать dll в VSTA: Build -> Build <имя макроса>. Запустить скомпилированный dll (из директории <имя макроса>\ SwMacro \ bin \ Release) в SolidWorks на новой детали (Выполнить макрос). Основная панель для работы с макросами в SolidWorks выглядит так:

 

Возвращаемся к кнопке нашего приложения, которая будет строить деталь в SolidWorks. Скопируем код записанного макроса построения простенькой детали в наш проект, а именно в код события Click для кнопки BHide:

 

   private void BHide_Click(object sender, EventArgs e)

   {

       BStart.Enabled = false;

       SldWorks.SldWorks swAppHide = new SldWorks.SldWorks();

 

       if (swAppHide == null)

       { MessageBox.Show("Невозможно запустить экземпляр SolidWorks 2012!", "Работа с SolidWorks (C#) :: Запуск SolidWorks"); }

       else

       {

           BStart.Enabled = false;

           BHide.Enabled = false;

       }

       swAppHide.Visible = false;

       swAppHide.NewPart();

       // Начало макроса

       ModelDoc2 swDoc = null;

       PartDoc swPart = null;

       DrawingDoc swDrawing = null;

       AssemblyDoc swAssembly = null;

       bool boolstatus = false;

       int longstatus = 0;

       int longwarnings = 0;

       swDoc = ((ModelDoc2)(swAppHide.ActiveDoc)); // В макросе было использовано swApp

       swDoc = ((ModelDoc2)(swAppHide.ActiveDoc)); // В макросе было использовано swApp

       boolstatus = swDoc.Extension.SelectByID2("Спереди", "PLANE", 0, 0, 0, true, 0, null, 0);

       RefPlane myRefPlane = null;

       myRefPlane = ((RefPlane)(swDoc.FeatureManager.InsertRefPlane(8, 0.01, 0, 0, 0, 0)));

       swDoc.ClearSelection2(true);

       swDoc.ClearSelection2(true);

       Array vSkLines = null;

       vSkLines = ((Array)(swDoc.SketchManager.CreateCornerRectangle(0, 0, 0, 0.070797287636592099, 0.045512542052094929, 0)));

       swDoc.ClearSelection2(true);

       SketchSegment skSegment = null;

       skSegment = ((SketchSegment)(swDoc.SketchManager.CreateCircle(0.035399, 0.022756, 0.000000, 0.048625, 0.029175, 0.000000)));

       swDoc.ClearSelection2(true);

       swDoc.SketchManager.InsertSketch(true);

       boolstatus = swDoc.Extension.SelectByID2("Line2@Эскиз1", "EXTSKETCHSEGMENT", 0, 0.017504823866190358, 0, false, 0, null, 0);

       swDoc.ShowNamedView2("*Триметрия", 8);

       swDoc.ClearSelection2(true);

       boolstatus = swDoc.Extension.SelectByID2("Line2@Эскиз1", "EXTSKETCHSEGMENT", 0, 0.017504823866190358, 0, false, 0, null, 0);

       Feature myFeature = null;

       myFeature = ((Feature)(swDoc.FeatureManager.FeatureExtrusion2(true, false, false, 0, 0, 0.020000000000000004, 0.01, false, false, false, false, 0.017453292519943334, 0.017453292519943334, false, false, false, false, true, true, true, 0, 0, false)));

       swDoc.ISelectionManager.EnableContourSelection = false;

       swDoc.SetPickMode();

       swDoc.ClearSelection2(true);

       // Конец макроса

       swDoc.SaveAsSilent("D:\\LWP06SW01-Деталь.sldprt", false);

       swAppHide.ExitApp();

       swAppHide = null;

       MessageBox.Show("Деталь отрисована и сохранена на диск, работа SolidWorks 2012успещно завершена!", "Работа с SolidWorks (C#) :: Фоновый режим");

   }

 

Код который записывает SolidWorks достаточно прост. Все операции по построению детали совершаются последовательно. SolidWorks записывает абсолютно все действия пользователя (даже повороты камеры во время построения), поэтому иногда целесообразнее останавливать запись, чтобы в макрос не шло лишних ненужных данных. Также имеет смысл останавливать запись и обновлять макрос для «вылавливания» части кода, который например, отвечает за размер детали (чтобы поставить в это место комментарий).

 

Макрос выше, сначала на виде Спереди вставляет справочную плоскость (расстояние от вида Спереди: 10 мм). Затем рисует Эскиз (который находится непосредственно на виде Спереди). Эскиз состоит из двух фигур: прямоугольника и окружности. Затем происходит вытягивание на 20 мм фигуры заключённой между внешнем прямоугольником и внутренней окружностью. Поясним код, который отвечает за размеры фигур:

 

       boolstatus = swDoc.Extension.SelectByID2("Спереди", "PLANE", 0, 0, 0, true, 0, null, 0);

       RefPlane myRefPlane = null;

       myRefPlane = ((RefPlane)(swDoc.FeatureManager.InsertRefPlane(8, 0.01, 0, 0, 0, 0)));

       swDoc.ClearSelection2(true);

 

Здесь по порядку:

1. Выбор вида Спереди.

2. Задание экземпляра объекта Плоскость.

3. Отрисовка плоскости, где 8 это параметр первого ограничения (первая привязка), а второй (0.01) и есть отступ в 10 мм по первой привязке (вид Спереди).\

4. Дальше идёт сбор выделения.

 

       Array vSkLines = null;

        vSkLines = ((Array)(swDoc.SketchManager.CreateCornerRectangle(0, 0, 0, 0.070797287636592099, 0.045512542052094929, 0)));

       swDoc.ClearSelection2(true);

 

Это построение прямоугольника (эскиз как массив линий). Строит четыре линии от начальной точки (три первых нуля), до конечной. В качестве начальной выбрана Исходная точка. Конечная точка это:

· double X2 (ось X): ~70.7 мм.

· double Y2 (ось Y): ~45.5 мм.

· double Z2: 0.

 

       SketchSegment skSegment = null;

       skSegment = ((SketchSegment)(swDoc.SketchManager.CreateCircle(0.035399, 0.022756, 0.000000, 0.048625, 0.029175, 0.000000)));

       swDoc.ClearSelection2(true);

       swDoc.SketchManager.InsertSketch(true);

 

Построение окружности (по двум точкам: точка центра и точка на самой окружности). Первый три координаты (double XC, double YC и double Zc) отвечают за положение точки центра на эскизе. Последние три: за положение точки на окружности. Как видно, функция отрисовки окружности не хранит напрямую параметр радиуса и диаметра. В конце кода выше после строчки выполняющей снятие выделения идёт строчка вставки эскиза (завершение его редактирования).

 

       boolstatus = swDoc.Extension.SelectByID2("Line2@Эскиз1", "EXTSKETCHSEGMENT", 0, 0.017504823866190358, 0, false, 0, null, 0);

       Feature myFeature = null;

       myFeature = ((Feature)(swDoc.FeatureManager.FeatureExtrusion2(true, false, false, 0, 0, 0.020000000000000004, 0.01, false, false, false, false, 0.017453292519943334, 0.017453292519943334, false, false, false, false, true, true, true, 0, 0, false)));

 

Вытягивание. Выбираем весь эскиз (в данном случае была выделена линия прямоугольника). После выделения, весь эскиз выделяется жёлтым цветом. Далее идёт создание экземпляра объекта для вытягивания и собственно последняя строчка выполняет вытягивание в одну сторону (Направление 1) на 20 мм (0.02000...4).

 

Итак. «Читать» код SolidWorks достаточно просто. К тому же, при наведении курсора на функции, сам VSTA также как и Visual Studio 2010 высвечивает подсказки Достаточно скудные подсказки: лишь тип функций, их аргументы и тип аргументов, однако в названии, как функций, так и аргументов уже заложено определение того, для чего всё это можно использовать. Проще всего изучать API на многочисленных примерах как в справочной системе SolidWorks (на локальной машине с установленным SolidWorks), так и на официальном сайте (www.solidworks.com). Также можно записывать макросы с различными действиями.

 

Завершающая часть

 

Компилируем приложение (Release) и запускаем. Результат работы показан ниже (Рис. 5. 1):

Рис. 5. 1. Работа кнопки Фоновый режим: на просмотр было открыто то что SolidWorks собрал (деталь) и сохранил на диск D (LWP 06 SW 01-Деталь. sldprt)

 

Рис. 5. 2. Работа кнопки Послать команду, выгрузить: окно SolidWorks с пустой деталью и всплывающее окошко

 


Дата добавления: 2019-09-13; просмотров: 280; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!