Модификация приложения SwCSharpAddin : построение через шаблон детали



 

А теперь немного реалий. Да, наше добавление справляется со своей задачей. Строит болты ( J ), но вот незадача. Редактировать построенное макрос уже не может. Естественно, что записать в макрос можно любые действия (почти любые), и даже действия по редактированию, но целесообразность подобного можно поставить под сомнение хотя бы потому, что это уже лишняя работа, надстройка над надстройкой. Костыль. Один макрос чтобы нарисовать с «нуля», второй чтобы изменить размер у нарисованного. А если, допустим, у нас не простенький болт, а модель какого-нибудь аппарата высокого давления с парочкой тысяч деталей или ракеты «Протон-М» с миллионом?

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

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

 

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

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

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

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

 

Итак. Пускай теперь у нас есть шаблон модели шестигранного болта с резьбой с расставленными привязками и сформированными зависимостями размеров друг от друга. В шаблоне выделено три ключевых размера. Назовём его Bolt _ Default _ Template . sldprt. Шаблон выглядит так:

 

Рис. 4. 1. Заготовка шаблона для добавления SwCSharpAddin

 

Добавим ещё одну форму. Нажмём ПКМ на названии проекта в обозревателе решений, далее в раскрывающемся списке Добавить -> Создать элемент... (Ctrl+Shift+A). Выберем в открывшемся окне Форма Windows Forms. В поле Имя внизу окна вписываем LWP 07 Temp . cs, далее жмём ОК.

 

Задаём следующие параметры формы на панели Свойства:

 

Text: Использование SwCSharpAddin (C#) :: Ввод размеров болта для шаблона
Size: 600; 300
FormBorderStyle: FixedDialog
MaximizeBox: False

 

Рис. 4. 2. Модифицированная форма LWP 07 Temp

 

Добавим на нашу форму ToolTip ( ).

 

Параметры добавленного элемента всплывающей подсказки таковы:

 

( Name ): Hint

 

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

 

Для начала размести на форме два диалога: FileOpenDialog и SaveFileDialog с параметрами:

 

OpenFileDialog:

( Name ): OFD_Template
FileName: Bolt_Default_Template.sldprt

SaveFileDialog:

( Name ): SFD_Template
FileName: Bolt_Final.sldprt

 

Сверху под заголовком размести две кнопки Button и две TextBox:

 

Сверху вниз, слева направо идёт:

 

Button:

( Name ): B_Template
Text: Выбор файла шаблона

TextBox:

( Name ): TB_Template
ReadOnly: True

Button:

( Name ): B_Final
Text: Выбор файла для сохранения

TextBox:

( Name ): TB_Final
ReadOnly: True

 

Снизу разместим три TextBox и кнопку:

 

TextBox:

( Name ): TB_H
ToolTip на Hint: Высота болта

TextBox:

( Name ): TB_R
ToolTip на Hint: Радиус стержня

TextBox:

( Name ): TB_C
ToolTip на Hint: Шаг спирали

Button:

( Name ): B_OK
Text: Размер выбран

 

Открываем код главного файла формы (LWP 07 Temp . cs). Выбираем форму в обозревателе решений, далее правая кнопка мыши и во всплывающем меню Перейти к коду. Найдём:

 

public partial class LWP07Temp : Form

{

 

Добавим после:

 

   public string P_Template, P_Final; // Строковый переменные пути к шаблону и путь куда сохранить готовую деталь

   public double H, R, P; // Высота, радиус и шаг

   private bool B1, B2; // Логические переменные для организации работы с диалогами

 

Найдём:

 

   public LWP07Temp()

   {

       InitializeComponent();

 

Добавим после:

       // Инициализируем переменные при старте формы

       P_Template = "D:\\Bolt_Default_Template.sldprt";

       P_Final = "D:\\Bolt_Final.sldprt";

       B1 = false;

       B2 = false;

       TB_Template.Text = P_Template;

       TB_Final.Text = P_Final;

       TB_H.Text = "100";

       TB_R.Text = "10";

       TB_P.Text = "3";

 

Событие Click кнопки B_Template:

 

   private void B_Template_Click(object sender, EventArgs e)

   {

       B1 = true; // Пользователь открыл диалог выбора файла

       OFD_Template.ShowDialog();

       TB_Template.Text = OFD_Template.FileName; // Отправляем путь в TextBox

       P_Template = TB_Template.Text; // Значение TextBox присваиваем переменной

   }

 

Событие Click кнопки B_Final:

 

   private void B_Final_Click(object sender, EventArgs e)

   {

       B2 = true;

       SFD_Final.ShowDialog();

       TB_Final.Text = SFD_Final.FileName;

         P_Final = TB_Final.Text;

   }

 

Событие Click кнопки B _ OK:

 

   private void B_OK_Click(object sender, EventArgs e)

   {

       if (B1 == false)

       {

           P_Template = "D:\\Bolt_Default_Template.sldprt";

       }

       else { P_Template = OFD_Template.FileName; } // Если диалог выбора файла был открыт, сохраняем пользовательский выбор в переменную

       if (B2 == false)

       {

           P_Final = "D:\\Bolt_Final.sldprt";

       }

       else { P_Final = SFD_Final.FileName; }

       double.TryParse(TB_H.Text, out H);

       double.TryParse(TB_R.Text, out R);

       double.TryParse(TB_P.Text, out P);

       if (H > 0 && R > 0 && P > 0)

           Close();

       else

       {

           MessageBox.Show("Ошибка ввода размеров: нужно ввести все неотрицательные числа в поля формы.\n\nРазмеры по умолчанию:\nH: 100 мм.\nR: 10 мм.\nP: 3 мм.", "Использование SwCSharpAddin (C#) :: Ввод размеров болта для шаблона");

       }

   }

 

Теперь изменим код функции UsingTemp() файла SwAddin.cs:

 

   public void UsingTemp()

   {

       String Path_Template, Path_Final;

       Double FormH, FormR, FormP;

       Double NewH, NewR, NewP;

       // Загружаем форму LWP07Temp

       LWP07Temp Temp = new LWP07Temp();

       Temp.Text = "Использование SwCSharpAddin (C#) :: Ввод размеров болта для шаблона";

       Temp.ShowDialog();

       Path_Template = Temp.P_Template;

       Path_Final = Temp.P_Final;

       FormH = Temp.H / 1000.0;

       FormR = Temp.R * 2 / 1000.0;

       FormP = Temp.P / 1000.0;

       Temp.Dispose();

       IModelDoc2 swDoc = (IModelDoc2)iSwApp.OpenDoc6(Path_Template, (int)swDocumentTypes_e.swDocPART, 0, "", 0, 0); // Открываем шаблон

       bool boolstatus = false;

       swDoc = (IModelDoc2)iSwApp.ActivateDoc2(Path_Template, false, 0); // Делаем шаблон активным

       Dimension myDimension = null; // Объявляем переменную для размеров

       myDimension = ((Dimension)(swDoc.Parameter("D1@Бобышка-Вытянуть1"))); // Высота болта

       myDimension.SystemValue = FormH; // Присваиваем размеру значение с формы

       myDimension = ((Dimension)(swDoc.Parameter("D1@Эскиз1"))); // Радиус стержня

       myDimension.SystemValue = FormR;

       myDimension = ((Dimension)(swDoc.Parameter("D4@Спираль1"))); // Шаг спирали

       myDimension.SystemValue = FormP;

       swDoc.SaveAs2(Path_Final, 0, false, false); // Сохраняем новую модель как новый файл, шаблон при это закрывается

       boolstatus = swDoc.EditRebuild3(); // Перестраиваем вид модели (обновляем по размерам)

       swDoc = (IModelDoc2)iSwApp.ActivateDoc2(Path_Final, false, 0);

       swDoc.ClearSelection2(true);

       // Получаем новые размеры непосредственно из детали

       myDimension = ((Dimension)(swDoc.Parameter("D1@Бобышка-Вытянуть1"))); // Высота болта

       NewH = myDimension.SystemValue;

       myDimension = ((Dimension)(swDoc.Parameter("D1@Эскиз1"))); // Радиус стержня

       NewR = myDimension.SystemValue;

       myDimension = ((Dimension)(swDoc.Parameter("D4@Спираль1"))); // Шаг спирали

       NewP = myDimension.SystemValue;

       System.Windows.Forms.MessageBox.Show("В результате изменения размеров шаблона шестигранного болта были установлены слпедующие размеры:\n\n\tВысота болта: " + (NewH * 1000) + "мм\n\tРадиус стрежня: " + (NewR * 1000) + "мм\n\tШаг спирали: " + (NewP * 1000) + "мм\n\nЭти данные были успешно получены из сохранённой при работе дополнения детали.", "Использование SwCSharpAddin (C#) :: Результат изменения рамзеров шаблона");

   }

 

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

 

Компилируем приложение (Release) и запускаем. Не создавая новой детали добавим на панель инструментов наше добавление:

 

Нажимаем на кнопку с буквой «Ш»:

 

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

 

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

Рис. 5. 1. Работа кнопки Создать болт (шаблон): на просмотр было открыто то что SolidWorks собрал (шестигранный болт на основе шаблона) и сохранил на диск по указанному в форме пути и с именем заданным пользователем (Bolt _ Final . sldprt)

 


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

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






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