Одним из основных ресурсов в современном проектировании является время. Как известно, "время - деньги" и никому не хочется выполнять бессмысленные повторы одних и тех же операций. В связи с этим CAD/CAE пакеты имеют некий набор инструментов для исполнения одних и тех же действий нажатием всего лишь одной кнопки.
В данной статье будет рассмотрен один из способов автоматизации проектирования на основе макроса в Femap API.
Рисунок 1 – Диалоговое окно программы
В ходе выполнения курсовой работы связанной с исследованием влияния коррозийных процессов на несущую способность конструкций, являлось изменение толщин поверхностей. Данная процедура проводилась не один десяток раз и в связи с тем что свойств было довольно много, то данная операция занимала много времени и была довольно нудной. Поэтому было принято решение автоматизировать данный процесс при помощи Femap API. Таким образом был сначала создан обобщенный вариант макроса по изменению толщин.
Суть макроса заключается в том, чтобы автоматически менять значения толщин поверхностных элементов на процент или конкретное значение заданное пользователем.
Суть макроса заключается в том, чтобы автоматически менять значения толщин поверхностных элементов на процент или конкретное значение заданное пользователем.
При запуске макроса перед пользователем появится диалоговое окно (рис. 1) в котором нужно будет выбрать действие (увеличение или уменьшение) и выбрать степень изменения толщины (процентное или численное изменение), а затем ввести число на которое нужно изменить толщину.
Теперь более подробно рассмотрим все элементы программы и алгоритм действий.
Так как создание любой программы начинается с блок-схемы (я так никогда не делаю), мы так же распишем порядок наших действий (рис. 2).
Рисунок 2 – Блок-схема программы
После составления алгоритма программы смело можно приступать к ее созданию. В данном случае мы будем работать с объектом “Property” и для начала собственно его мы и создадим. Далее мы создадим “Set”- это выборка, представляющая собой массив. В него мы будем добавлять имеющиеся в модели свойства и все параметры которые они имеют (в том числе и толщину элемента, которая имеет свое обозначение в свойстве – pval(0)). Следующим шагом будет создание диалогового окна и создание необходимых нам элементов (рис. 3).
Рисунок 3 – Создание диалогового окна
Затем перебирая массив мы вытягиваем из свойства толщины, проводим перерасчет с учетом выбранных параметров изменения и возвращаем толщину обратно. Далее будет показан код программы с пояснениями. Цвета выделения будут соответствовать цветам блок-схемы для сопоставления кусков программы и алгоритма.
Sub MainDim App As femap.model
Set App = feFemap()
Dim feProp As femap.Prop //объявление объекта “Property”
Set feProp = App.feProp
Dim PropSet As femap.Set //объявление выборки
Set PropSet = App.feSet
Dim a As Double
If App.Info_Count(FT_PROP) = 0 Then //исключение ошибки отсутствия свойств
Msg = "No Properties In Model, Exiting..."
rc = MsgBox( Msg, vbOkOnly )
GoTo OK
End If
Begin Dialog UserDialog 400,203,"Thickness" ' %GRID:10,7,1,1 //диалоговое окно
OKButton 20,175,90,21
TextBox 130,119,130,21,.TextBox1
OptionGroup .Group1
OptionButton 20,49,210,14,"increase in the thickness",.OptionButton1
OptionButton 20,70,180,14,"decrease in the thickness",.OptionButton2
OptionGroup .Group2
OptionButton 250,49,90,14,"Persent",.OptionButton3
OptionButton 250,70,90,14,"Value",.OptionButton4
CancelButton 310,175,80,21
text 110,98,210,14,"Value change in thickness",.Text1
End Dialog
Dim dlg As UserDialog
If Dialog(dlg) = 0 Then //исключение ошибки закрытия программы кнопкой отмены
GoTo OK
End If
Dim Thick As Double //объявление коэффициента изменения
Thick = Val(dlg.textbox1) //конвертирование коэффициента
If Thick <= 0 Then //исключение ошибки значения толщины
Msg = "Thickness Field is Blank"
rc = MsgBox( Msg, vbOkOnly )
GoTo OK
End If
PropSet.AddAll(FT_PROP) //добавление в выборку всех свойств модели
If dlg.group1 = 0 Then
If dlg.group2 = 0 Then
While feProp.Next //цикл пересчета толщины
feProp.Get(PropSet.CurrentID) //вынимаем текущее свойство из выборки
a=feProp.pval(0) * Thick/100 //пересчет коэффициента изменения
feProp.pval(0)=feProp.pval(0) + a //пересчет толщины
feProp.Put(feProp.ID) //возвращаем значение толщины в свойство
Wend
End If
If dlg.group2 = 1 Then
While feProp.Next
feProp.Get(PropSet.CurrentID)
feProp.pval(0)=feProp.pval(0) + Thick
feProp.Put(feProp.ID)
Wend
End If
End If
If dlg.group1 = 1 Then
If dlg.group2 = 0 Then
While feProp.Next
feProp.Get(PropSet.CurrentID)
a=feProp.pval(0) * Thick/100
feProp.pval(0)=feProp.pval(0) - a
feProp.Put(feProp.ID)
Wend
End If
If dlg.group2 = 1 Then
While feProp.Next
feProp.Get(PropSet.CurrentID)
feProp.pval(0)=feProp.pval(0) - Thick
feProp.Put(feProp.ID)
Wend
End If
End If
OK:
End Sub
Далее данный макрос был подогнан под модель рамы тепловоза и проведено обновление. Основными изменениями стали возможность корректировка значений конкретных толщин, все толщины были разбиты по основным элементам конструкции и раскиданы по разным формам, а так же добавлена возможность повторного использования макроса без его перезапуска. Пример формы измененного макроса изображена на рисунке 4.
Рисунок 4 - Пример формы измененного макроса
Таким образом мы выполнили основное свойство автоматизации - сэкономить время проектирования и изменить все свойства модели несколькими кликами мыши.
Автор, не подскажешь как вставить код диалог бокса из фемап апи редактора в VBA Excel? а то копирую код и выдает ошибку синтаксиса...
ОтветитьУдалитьНе совсем автор, но уточню. В VBA Excel и VBA Femap немного различный синтаксис. потому просто скопированные строки могут не работать. Если же нужно обратиться из скрипта Excel управление к скриптам в Femap, то это если и возможно - крайне проблематично. Если же нужно знать что было нажато при работе макроса - можно просто добавить строки, которые заполняют какую-то ячейку в Excel данными, по содержимому которой потом скрипт в Excel определяет свое дальнейшее поведение.
ОтветитьУдалитьВ общем, уточните постановку
Здравствуйте. Не подскажите ссылку где я могу разобраться с синтаксисом создания диалогового окна. Интуитивно все понятно, но хотелось бы полностью во всем разобраться, ну и иметь под рукой данный источник информации.
ОтветитьУдалитьBegin Dialog UserDialog 400,203,"Thickness" ' %GRID:10,7,1,1
.
.
.
End Dialog