Библиотека Hlf для C#предоставляет множество полезных функций для создания конструкций в RFEM и RSTAB, некоторые из которых будут применены в следующем примере.
Для реализации запрограммированного кода сначала требуется соединение с программой. Один из доступных портов должен быть указан в качестве адреса. Адрес по умолчанию в RFEM/RSTAB - http://localhost:8081 . При необходимости, их можно изменить в настройках программы.
На следующем этапе мы можем создать различные объекты, такие как узлы, линии и стержни, с помощью функций, доступных в библиотеке C#. База данных включает классы для всех доступных объектов. На основе параметров можно задать и указать свойства объектов'. Количество параметров может изменяться в зависимости от случая использования.
Далее показано, каким образом можно задать объекты, на примере узла:
- code.csharp#
узел новыйУзел = новый ()
{
- no = nodeId,
- координаты = новый вектор_3d () { x = xVjector, y = 0,0, z = 0,0 },
- координата_системы_типа = node_coordinate_system_type.COORDINATE_SYSEM_carTESIAN,
- Координата_system_typeStecification = верная,
- комментарий = "узел для балки"
};
- /код#
Линии, поверхности и другие объекты задаются таким же образом. Обратите, пожалуйста, внимание также на то, что для некоторых атрибутов должен быть установлен соответствующий атрибут «Заданный» и установлен на «true».
Практический пример
В этом примере показано, как создать неразрезную балку с постоянной линейной нагрузкой. Количество пролетов, пролет балки и величина линейной нагрузки могут быть заданы пользователем.
Сначала в консоли задаются требуемые переменные. Программа проверяет, совместим ли пользовательский ввод с типом данных соответствующей переменной. Если запись неправильная или пустая, в консоли появляется сообщение об ошибке. Во время программирования основное внимание уделялось тому, чтобы десятичные разряды можно было вводить с использованием как точки, так и запятых, в целях минимизации подверженности ошибкам во время ввода.
Соединение с RFEM/RSTAB
Следующий код пытается установить соединение с RFEM/RSTAB в пределах блока try-catch:
- code.csharp#
var Logger = LogМенеджер.GetCurrentКлассЛоггер();
строкаCurrentDirectory = каталог.GetCurrentDirectory();
try
{
- application_informationApplicationInfo;
- try
- {
- //соединение с приложением RFEM6 или RSTAB9
- приложение = новое ApplicationClient (Привязка, Адрес);
- }
- Поймать (исключение)
- {
- if (приложение != ноль)
- {
- if (application.State != CommunicationState.Faulted)
- {
- приложение.Закрыть();
- logger.Ошибка (исключение, "Что-то произошло:" + исключение.Сообщение);
- }
- else
- {
- application.Abort();
- логгер.Ошибка(исключение, "Ошибка связи с программой RFEM:" + исключение.Сообщение);
- }
- }
- Консоль.ЗаписьЛинии(исключение.ToString());
- }
- finally
- {
- ApplicationInfo = применением.get_information ();
- logger.Info("Название: {0}, Версия:{1}, Тип: {2}, язык: {3} ",ApplicationInfo.name,ApplicationInfo.version,ApplicationInfo.type,ApplicationInfo.language_name);
- Консоль.WiteLine("Название: {0}, Версия:{1}, Тип: {2}, язык: {3} ",ApplicationInfo.name,ApplicationInfo.version,ApplicationInfo.type,ApplicationInfo.language_name);
- }
}
строка modelName = "MyTestModel";
строка modelUrl ="";
ModelClient model =new ModelClient(Binding,new EndpointAddress(modelUrl));
- /код#
Для установки соединения, программа должна быть открыта перед запуском кода. После успешного соединения, информация о программе будет отображаться в консоли, а в RFEM/RSTAB будет создана новая модель с пользовательским именем.
Определение основных объектов
На следующем этапе мы можем задать материал и сечение неразрезной балки. Важно, чтобы описание соответствовало названию, сохраненному в базе данных материалов или сечений RFEM.
- code.csharp#
материалmaterialConcrete = новый материал
{
- № = 1,
- title = "C20/25 | EN 1992-1-1:2004/A1:2014"
};
section sectionRectlang = новое сечение
{
- № = 1,
- material=materialConcrete.no,
- Заданныйматериал = верный,
- тип = section_type.TYPE_PARAMETRIC_MASSIVE_I,
- titleStecification = true,
- ь
- параметризация_typeStecification = true,
- title = "R_M1 0.5/1.0"
};
- /код#
С помощью циклов создаются и организуются в списки различные объекты (узлы, линии, стержни). Узлы задаются в зависимости от пользовательского количества пролетов и переносятся в список «lineDefinitionNodes». Список будет позже использован для создания линий на основе их задающих узлов. При создании модели в RSTAB данный список используется для задания стержней на основе их задающих узлов. В программе RFEM стержни задаются с помощью линий.
- code.sharp#
SortedList
int[]lineDefinitionNodes = новый int[spanNumber + 1];
Целый узелId = 1;
двойной хВектор = 0,0;
для (int i = 0; i < spanNumber + 1; i ++)
{
- узел новыйУзел = новый ()
- {
- no = nodeId,
- координаты = новый вектор_3d () { x = xVjector, y = 0,0, z = 0,0 },
- координата_системы_типа = node_coordinate_system_type.COORDINATE_SYSEM_carTESIAN,
- Координата_system_typeStecification = верная,
- комментарий = "бетонная часть"
- };
- nodes.Add (nodeId, новыйУзел);
- lineDefinitionNodes[i] = nodeId;
- xВектор = xВектор + диапазон;
- NodeId++;
}
//создать линии
IntlineId = 1;
SortedList
для (int i = 0; i < spanNumber; i ++)
{
- линия новаяЛиния = новая ()
- {
- no =lineId,
- definition_nodes =new int[] {lineDefinitionNodes[i],lineDefinitionNodes[i + 1]},
- комментарий = "линии для балок",
- тип =line_type.TYPE_POLYLINE,
- titleStecification = true,
- };
- lines.Add(lineId,newLine);
- lineId++;
}
- /код#
После создания всех базовых объектов задаются две различные узловые опоры. Узловая опора в первом узле должна быть закреплена; остальные опоры должны быть рассчитаны как ролики в направлении X. Задающие узлы для различных типов опор сведены в отдельный список.
- code.csharp#
nodeal_support1 = новое ()
{
- № = 1,
- nodes =supportNodes1.ToArray(),
- пружина = новый вектор_3d() { x = двойной.PositiveInfinity, y = двойной.PositiveInfinity, z = двойной.PositiveInfinity },
- rotation_restraint = новый вектор_3d() { x = двойной.PositiveInfinity, y = 0,0, z = двойной.PositiveInfinity }
};
nodeal_support2 = новое ()
{
- no = 2,
- nodes =supportNodes2.ToArray(),
- пружина = новый вектор_3d() { x = 0,0, y = двойной.PositiveInfinity, z = двойной.PositiveInfinity },
- вращательное_ограничение = новый вектор_3d () { x = 0,0, y = 0,0, z = двойной.PositiveInfinity }
};
nodealSupports.Add(support1);
nodealSupports.Add(support2);
- /код#
Передача объектов в программу RFEM
Чтобы сделать созданные объекты доступными в RFEM/RSTAB, их нужно сначала передать в программу. Это выполняется между двумя функциями «model.begin_modification» и «model.end_modification», с помощью объектно-специфических функций базы данных Hlf. Все однотипные объекты передаются в программу с помощью цикла forEach.
- code.csharp#
try
{
- model.begin_modification("Геометрия");
- model.set_material (materialConcrete);
- model.set_section (sectionRectlang);
- forach (KeyvaluePair
nodeItem в узлах) - {
- model.set_node (nodeItem.value);
- }
- forEach (KeyvaluePair
lineItem в линиях) - {
- model.set_line (lineItem.value);
- }
- forach (KeyvaluePair
- {
- model.set_member (memberItem.value);
- }
- forEach (var nodalSupport в nodeSupports)
- {
- model.set_nodal_support (nodalSupport);
- }
}
Поймать (исключение)
{
- model.cancel_modification();
- logger. Ошибка (исключение, "Ошибка при создании геометрии" + исключение.Сообщение);
- кидать ;
}
finally
{
- try
- {
- model.finish_modification ()
- }
- Поймать (исключение)
- {
- logger.Ошибка (исключение, "Проблема при завершении модификации геометрии\n" + исключение.Сообщение + "\n");
- model.reset();
- }
}
- /код#
Задание нагрузок
Загружения, сочетания нагрузок и расчетные ситуации создаются аналогично основным объектам, а затем передаются в программу.
Затем можно создать нагрузку на стержень, которая была ранее задана пользователем.
- code.csharp#
SortedList
Int Member_load_id = 1;
для (int i = 0; i < spanNumber; i ++)
{
- Member_loadnewMemberLoad = новый ()
- {
- № = i + 1,
- Members_string = (i + 1).ToString (),
- элементы = новый int [] { i + 1 },
- load_distribution = Member_load_load_distribution.LOAD_DISTRIBUTION_UNIFORM,
- load_distributionSspecificed = true,
- величина = нагрузка на стержень * 1000,
- Величинауказанной = верная,
- load_is_over_total_length = верная,
- load_is_over_total_lengthSspecificed = true,
- };
- Member_loads.Add(i + 1,newMemberLoad);
- Member_load_id++;
}
- /код#
Кроме равномерно распределенных нагрузок, возможны также трапециевидные и параболические нагрузки.
Расчёт и вывод результатов
Для выполнения всех расчетов в программе RFEM используется функция model.calculate(all).
После успешного вычисления результаты в данном примере отображаются в консоли. Библиотека Hlf для C#позволяет также экспортировать результаты в файлы XML или CSV.
Наконец, для сохранения модели можно использовать функцию model.sable(), путь к файлу указан в скобках:
- code.csharp#
/сохраняем модель перед закрытием
model.sage(CurrentDirectory +@"\testmodels\");
применением.
- /код#
Заключение
В представленном примере продемонстрированы преимущества и простота работы с базой данных C#. Конструкцию можно быстро адаптировать с помощью пользовательского ввода, что экономит много времени при вводе систем конструкций в RFEM 6 и RSTAB 9. Библиотека Hlf для C#предлагает также множество других функций для создания сложных систем.