Модификация приложения 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!