пятница, 30 ноября 2012 г.

Пример создания макроса в Femap API

    Одним из основных ресурсов в современном проектировании является время. Как известно, "время - деньги" и никому не хочется выполнять бессмысленные повторы одних и тех же операций. В связи с этим CAD/CAE пакеты имеют некий набор инструментов для исполнения одних и тех же действий нажатием всего лишь одной кнопки. 
     В данной статье будет рассмотрен один из способов автоматизации проектирования на основе макроса в Femap API.
   
image
Рисунок 1 – Диалоговое окно программы
   В ходе выполнения курсовой работы связанной с исследованием влияния коррозийных процессов на несущую способность конструкций, являлось изменение толщин поверхностей. Данная процедура проводилась не один десяток раз и в связи с тем что свойств было довольно много, то данная операция занимала много времени и была довольно нудной. Поэтому было принято решение автоматизировать данный процесс при помощи Femap API. Таким образом был сначала создан обобщенный вариант макроса по изменению толщин.
  Суть макроса заключается в том, чтобы автоматически менять значения толщин поверхностных элементов на процент или конкретное значение заданное пользователем.
  При запуске макроса перед пользователем появится диалоговое окно (рис. 1) в котором нужно будет выбрать действие (увеличение или уменьшение) и выбрать степень изменения толщины (процентное или численное изменение), а затем ввести число на которое нужно изменить толщину.
    Теперь более подробно рассмотрим все элементы программы и алгоритм действий.
    Так как создание любой программы начинается с блок-схемы (я так никогда не делаю), мы так же распишем порядок наших действий (рис. 2).
image
Рисунок 2 – Блок-схема программы

  После составления алгоритма программы смело можно приступать к ее созданию. В данном случае мы будем работать с объектом “Property” и для начала собственно его мы и создадим. Далее мы создадим “Set”- это выборка, представляющая собой массив. В него мы будем добавлять имеющиеся в модели свойства и все параметры которые они имеют (в том числе и толщину элемента, которая имеет свое обозначение в свойстве – pval(0)). Следующим шагом будет создание диалогового окна и создание необходимых нам элементов (рис. 3).
image
Рисунок 3 – Создание диалогового окна

   Затем перебирая массив мы вытягиваем из свойства толщины, проводим перерасчет с учетом выбранных параметров изменения и возвращаем толщину обратно. Далее будет показан код программы с пояснениями. Цвета выделения будут соответствовать цветам блок-схемы для сопоставления кусков программы и алгоритма.

Sub Main
    Dim 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 - Пример формы измененного макроса

  Таким образом мы выполнили основное свойство автоматизации - сэкономить время проектирования и изменить все свойства модели несколькими кликами мыши.

3 комментария:

  1. Автор, не подскажешь как вставить код диалог бокса из фемап апи редактора в VBA Excel? а то копирую код и выдает ошибку синтаксиса...

    ОтветитьУдалить
  2. Не совсем автор, но уточню. В VBA Excel и VBA Femap немного различный синтаксис. потому просто скопированные строки могут не работать. Если же нужно обратиться из скрипта Excel управление к скриптам в Femap, то это если и возможно - крайне проблематично. Если же нужно знать что было нажато при работе макроса - можно просто добавить строки, которые заполняют какую-то ячейку в Excel данными, по содержимому которой потом скрипт в Excel определяет свое дальнейшее поведение.

    В общем, уточните постановку

    ОтветитьУдалить
  3. Здравствуйте. Не подскажите ссылку где я могу разобраться с синтаксисом создания диалогового окна. Интуитивно все понятно, но хотелось бы полностью во всем разобраться, ну и иметь под рукой данный источник информации.

    Begin Dialog UserDialog 400,203,"Thickness" ' %GRID:10,7,1,1
    .
    .
    .
    End Dialog

    ОтветитьУдалить