3102x
001441
2017-05-23

COM -интерфейс в VBA | 3. Создание инструмента

Во второй части серии статей, посвященных интерфейсу COM, описывается на примере стержня создание и изменение узловых опор, нагрузок, загружений, сочетаний нагрузок и расчетных сочетаний. В четвертой части видео будет объяснено создание отдельных инструментов.

Основы

Мы хотим создать инструмент, который создает нелинейные узловые опоры на текущих выбранных в программе узлах. Для этого потребуются следующие основные элементы:

  • Получить выбранные в данный момент узлы
  • Создание узловых опор
  • Создание и назначение нелинейности
  • Запуск инструмента в программе

Эти моменты необходимо пояснить сейчас. Это требует знания предыдущих частей этой серии статей, которые не будут описаны снова. Однако, доступный исходный код включает комментарии, документирующие ранее упомянутые элементы, такие как получение структуры.

Получить текущий выбранный узел

Вы можете редактировать выбранные элементы через интерфейс COM, используя уже известные функции, такие как IModelData.GetNodes для узлов. Однако, чтобы вернуть только выбранные элементы, необходимо сначала перейти к редактированию текущего выбора, введя IModelData.EnableSelections. Если для параметра EnableSelections установлено значение True, IModelData.GetNodes возвращает только выбранные элементы. Вот конкретный пример:

'Получить выбранные узлы.
iModDat.EnableSelections True 'работать только с выбранным объектом
Dim узлы () As RFEM5.Node
node = iModDat.GetNodes
iModDat.EnableSelections False 'снова работать со всеми объектами

После того, как вы получите выбранные узлы, EnableSelections снова будет сброшен на false, так как это часто может вызвать ошибки. Так как для определения узла требуется список узлов в качестве строки для определения, это обеспечивается одновременно:

'Создать список узлов.
Dim nodeList As Строка
Dim iAsДлинная
Простой вопрос - быстрый ответ: i = 0ToUBound (узлов, 1)
nodeList = nodeList & node (i) .No & ","
Next i

Создание узловых опор

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

'Создание узловых опор.
Dim nodSup As RFEM5.NodalSupport
nodSup.No = 100
nodSup.IsColumn = False
nodSup.IsValid = True
nodSup.nodeList = nodeList
nodSup.ReferenceSystem = GlobalSystemType

nodSup.RestraintConstantX = 0,01
nodSup.RestraintConstantY = 0,01
nodSup.RestraintConstantZ = 0,01

nodSup.SupportConstantX = -1
nodSup.SupportConstantY = -1
nodSup.SupportConstantZ = -1

'Определить нелинейность.
nodSup.SupportNonlinearityZ = WorkingDiagramType

iModDat.PrepareModification
iModDat.SetNodalSupport nodSup
iModDat.FinishModification

Как видно из кода, WorkingDiagramType задана как нелинейность в глобальном направлении z.

Создание и назначение нелинейной опоры

После подготовки узловой опоры для нелинейности WorkingDiagramType необходимо создать:

'Создать нелинейность.
Dim Nldgrm As RFEM5.NellinearityDiagram

nldgrm.ForceType = StiffnessDiagramForceType.NoneStiffnessForce
nldgrm.PositiveZoneType = DiagramAfterLastStepType.StopDiagramType
nldgrm.Symmetric = True

'Создать диаграмму.
ReDim nldgrm.PositiveZone (3, 1)
nldgrm.PositiveZone (0, 0) = 0 #
nldgrm.PositiveZone (0, 1) = 0 #

nldgrm.PositiveZone (1, 0) = 0,01
nldgrm.PositiveZone (1, 1) = 100

nldgrm.PositiveZone (2, 0) = 0,03
nldgrm.PositiveZone (2, 1) = 200

nldgrm.PositiveZone (3, 0) = 0,05
nldgrm.PositiveZone (3, 1) = 300

Диаграмма состоит из двумерного массива. Первое измерение соответствует набору данных, второе измерение - элементам набора данных. В этом случае первый элемент в наборе данных - это смещение в m, а второй элемент - это сила в N. Таким образом, в приведенном выше примере были созданы четыре набора данных, где, например, третья точка диаграммы в данном местоположении составляет 30 мм и 0,2 кН. Эта нелинейность теперь должна быть присвоена существующей опоре. Для этого нужно получить интерфейс для узловой опоры, а затем для нелинейности:

'Назначить нелинейность.
Dim iNodSup As RFEM5.INodalSupport
Set iNodSup = iModDat.GetNodalSupport (100, ItemAt.AtNo)
Dim iNldiag As RFEM5.INonlinearityDiagram
Set iNldiag = iNodSup.GetNonlinearity (AlongAxisZ)

iModDat.PrepareModification
iNldiag.SetData nldgrm
iModDat.FinishModification

В этом случае нелинейность идет вдоль оси Z, поэтому при получении нелинейности необходимо выбрать AlongAxisZ. Нелинейность задается в известном блоке Модификации.

Запуск инструмента в программе

В RFEM можно интегрировать внешние программы. Для этого необходимо изменить RFEM.ini в пути программы. В отличие от программирования на C# и VB, в котором создается исполняемый файл, для реализации инструмента в VBA требуется программа Excel. При открытии файла, который нужно открыть, можно задать Excel в качестве аргумента. Это выглядит в командной строке следующим образом (файл Excel находится в папке C: \ temp, а Excel установлен как 32-разрядная версия):
«C: \ Program Files (x86) \ Microsoft Office \ Office15 \ EXCEL.EXE» C: \ temp \ table1.xlsm

Таким образом, Excel открывается с нужным файлом. Чтобы программа RFEM открывала только внешнюю программу без дополнительных аргументов (в данном случае, например, имени файла за EXCEL.EXE), необходимо сначала создать пакетный файл Windows. Этот простой текстовый файл, включающий расширение .bat, обрабатывается Windows как исполняемый EXE-файл. Таким образом, вы можете использовать редактор для создания файла TXT, который включает в себя новое расширение файла «.bat». Параметр для отображения расширения файла должен быть сначала установлен в проводнике Windows. Этот командный файл (далее-EXCEL-Tool.bat) должен содержать следующую запись:
«C: \ Program Files (x86) \ Microsoft Office \ Office15 \ EXCEL.EXE» C: \ temp \ table1.xlsm
Это соответствует команде в том виде, в каком она будет введена в командной строке.

После создания этого исполняемого файла его можно ввести в RFEM.ini в качестве внешнего инструмента. RFEM.ini включен в программный путь RFEM (путь по умолчанию для RFEM 5.07 64-bit: C: \ Program Files \ Dlubal \ RFEM 5.07). Там нужно добавить следующие записи:

ModuleName2 = EXCEL-Tool
ModuleExeName2 = "c: \ temp \ EXCEL-Tool.bat"
ModuleDescription2 = Нелинейный конец стержня

Конечно, пакетный файл EXCEL-Tool.bat и макрос table1.xlsm также должны быть сохранены в C:/temp/.

Для автоматического запуска макроса, необходимо запустить подпрограмму в подпрограмме, автоматически выполняемой Excel при открытии файла. Эта подпрограмма называется Workbook_Open и должна храниться в Workbook.

Теперь нам нужно закрыть Excel после успешного выполнения. Если возникает ошибка или программа RFEM не открывается, можно отредактировать макрос. Для этого используется различие в регистре. Полный проект выглядит следующим образом:

Частные SubWorkbook_Open ()

'Обработчик ошибок запускает RFEM.
On Error GoTo e

'Восстановлен интерфейс с RFEM.
Dim iApp AsRFEM5.Application
Set iApp = GetObject (, «RFEM5.Application»)

e: 'в случае ошибки, отображается сообщение "RFEM not open"
If Err.Number <> 0 Then
MsgBox «RFEM не открывается»ErrSource
   Выйти Sub
Конец If

'Программа обработки ошибок.
On Error GoTo f

'Лицензия COM и доступ к программе заблокированы.
iApp.LockLicense

'Получить интерфейс для активной модели.
Dim iModel As RFEM5.model
If iApp.GetModelCount> 0 Then
Установите iModel = iApp.GetActiveModel
Else
'Ошибка отображения при недостаточном количестве доступных моделей.
Err.Raise vbObjectError, «LoadModel ()»,«iApp.GetModelCount <1»
End If

'Место для вашего собственного исходного кода.

f: 'Ошибка перехвата из исходного кода.
If Err.Number <> 0 Then
MsgBox Err.Description,, Err.Source
' Лицензия COM разблокирована, доступ к программе обновлен
iModel.GetApplication.UnlockLicense
'Инструмент позволяет открывать Excel при возникновении ошибки.
   Exit Sub
End If

' Лицензия COM разблокирована, доступ к программе обновлен
iModel.GetApplication.UnlockLicense
'Инструмент закрывает Excel при успешном применении.
Запоминающийся.Quit

End Sub

На данный момент отсутствует только ссылка на ранее созданную подпрограмму, которая находится в разделе «Место для вашего собственного исходного кода». Полный исходный код доступен по следующей ссылке.

Заключение

Эта статья о создании нелинейной узловой опоры описывает применение нового внешнего модуля и, таким образом, дополняет предыдущие разделы данной серии статей. Интеграция более проста при использовании исполняемых файлов, которые обычно создаются с помощью VisualStudio и VB или C #. Таким образом, сложный процесс с Excel был описан.


Автор

Г-н Гюнтель осуществляет техническую поддержку пользователей Dlubal Software.

Ссылки
Скачивания