Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум.doc
Скачиваний:
75
Добавлен:
15.11.2019
Размер:
45.35 Mб
Скачать

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

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

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

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

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

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

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

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

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

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

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

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

Text:

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

Size:

600; 300

FormBorderStyle:

FixedDialog

MaximizeBox:

False

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

Добавим на нашу форму 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:

Размер выбран

Открываем код главного файла формы (LWP07Temp.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#) :: Результат изменения рамзеров шаблона");

}