HLF 的 C#库为 RFEM 和 RSTAB 中的结构创建提供了许多有用的功能,下面的示例中将使用其中的一些功能。
想要执行上面的代码,首先需要连接到软件软件. 必须以地址形式指定一个可用端口。 RFEM/RSTAB的默认地址是 http://localhost:8081 . 如有必要,可以在程序选项中进行修改。
下一步,可以使用C#库中的函数创建各种对象,例如节点、线和杆件。 该库包含了所有可用对象的类。 基于参数,可以定义和指定对象的属性。 参数的数量取决于用例。
下面举例说明如何通过定义节点来定义对象:
- code.csharp#
node newNode = new()
{
- no = nodeID,
- coordinates = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
- coordinate_system_type = node_coordinate_system_type.COORDINATE_SYSTEM_CARTESIAN,
- coordinate_system_typeSpecified = true,
- comment = "梁的节点"
};
- /代码#
线、面和其他对象的定义方法相同。 请注意,对于某些属性,必须定义相应的“特定”属性,并将其设为“true”。
实例
该例题展示了如何创建恒定线荷载的连续梁。 用户可以根据需要设置杆件的跨度、跨度和跨度。
首先,所需的变量在控制台中由用户自定义。 程序检查用户的输入是否符合各个变量的数据类型。 如果输入错误或为空,则在控制台中会显示错误信息。 在编程过程中,我们特别注意了小数位数的输入。
连接到 RFEM/RSTAB
以下代码尝试在 ry-catch 块中与 RFEM/RSTAB 建立连接:
- code.csharp#
var logger = logmanager.getcurrentclasslogger();
string CurrentDirectory = Directory.GetCurrentDirectory();
尝试
{
- application_information
- 尝试
- {
- //连接到 RFEM6 或 RSTAB9 的应用程序
- application = new ApplicationClient(Binding, Address);
- }
- catch(Exception异常)
- {
- if (应用程序 != 零)
- {
- if (application.State != CommunicationState.Faulted)
- {
- application.Close();
- logger.Error(exception, "发生了什么事:" + exception.Message);
- }
- 其他
- {
- application.Abort();
- logger.Error(exception, "与 RFEM 的通信错误:" + exception.Message);
- }
- }
- Console.WriteLine(exception.ToString());
- }
- 最终
- {
- ApplicationInfo = application.get_information();
- logger.Info("用户名: {0},版本:{1},类型: {2}, 语言: {3} ", ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
- Console.WriteLine("名称: {0},版本:{1},类型: {2}, 语言: {3} ", ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
- }
}
string modelName = "My测试模型";
string modelUrl="";
ModelClient model = new ModelClient(Binding, new EndpointAddress(modelUrl));
- /代码#
为了建立连接,必须在运行代码之前打开程序。 连接成功后,在 RFEM/RSTAB 中的控制台中会显示程序信息,并具有用户自定义名称的新模型被创建。
基本对象定义
在下一步选择中定义连续梁的材料和截面。 请注意,截面名称要与 RFEM 中材料库或截面库的名称相对应。
- code.csharp#
材料 materialConcrete = 新材料
{
- 没有 = 1,
- name = "C20/25 | EN 1992-1-1:2004/A1:2014
};
sectionRectangle = 新建截面
{
- 没有 = 1,
- 材料= materialConcrete.no,
- 指定材料 = true,
- type = section_type.TYPE_PARAMETRIC_MASSIVE_I,
- 指定类型 = true,
- parametrization_type = section_parametrization_type.PARAMETRIC_MASSIVE_I_MASSIVE_RECTANGLE_R_M1,
- parametrization_specified = true,
- name = "R_M1 0.5/1.0"
};
- /代码#
用户可以通过列表来创建和管理各种对象(节点、线、杆件)。 系统会根据用户定义的跨数来定义节点,并将其传递到“线定义节点”列表中。 该列表稍后将用于根据线的定义节点创建线。 在创建 RSTAB 模型时可以通过该列表根据杆件的定义节点进行定义。 RFEM 中的杆件是通过线来定义的。
- code.sharp#
Sortedlist
int[] lineDefinitionNodes = new int[spanNumber + 1];
int nodeid = 1;
double xVector = 0.0;
for (int i = 0; i < spanNumber + 1; i++)
{
- node newNode = new()
- {
- no = nodeID,
- coordinates = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
- coordinate_system_type = node_coordinate_system_type.COORDINATE_SYSTEM_CARTESIAN,
- coordinate_system_typeSpecified = true,
- comment = "混凝土部分"
- };
- nodes.Add(nodeid, newNode);
- lineDefinitionNodes[i] = nodeid;
- x向量 = x向量 + span;
- nodeid+;;
}
//创建线
int lineid = 1;
Sortedlist
for (int i = 0; i < spanNumber; i)
{
- line newLine = new()
- {
- no = lineID,
- definition_nodes = new int[] { lineDefinitionNodes[i], lineDefinitionNodes[i + 1] },
- comment = "梁线",
- type = line_type.TYPE_POLYLINE,
- 指定类型 = true,
- };
- lines.Add(lineid, newline);
- lineid+;
}
- /代码#
在创建所有基础对象后,将定义两个不同的节点支座。 第一个节点上的节点支座应该是固定的;其余的支座在 X 方向上设计为可动支座。 不同的支座类型的定义节点都在单独的列表中。
- code.csharp#
nodal_support support1 = new()
{
- 没有 = 1,
- nodes = supportedNodes1.ToArray(),
- spring = new vector_3d() { x = double.PositiveInfinity, y = double.PositiveInfinity, z = double.PositiveInfinity },
- rotational_restraint = new vector_3d() { x = double.PositiveInfinity, y = 0.0, z = double.PositiveInfinity }
};
nodal_support support2 = new()
{
- 没有= 2,
- nodes = supportedNodes2.ToArray(),
- spring = new vector_3d() { x = 0.0, y = double.PositiveInfinity, z = double.PositiveInfinity },
- rotational_restraint = new vector_3d() { x = 0.0,y = 0.0,z = double.PositiveInfinity }
};
nodalSupports.Add(support1);
nodalSupports.Add(support2);
- /代码#
导出模型对象-RFEM
为了使创建的对象在 RFEM/RSTAB 中可用,必须先将它们传输到程序中。 这是在 "model.begin_modification" 和 "model.end_modification" 两个函数之间使用 HLF 库中的对象特定函数来完成的。 一种类型的所有对象通过 foreach 循环传递到程序中。
- code.csharp#
尝试
{
- model.begin_modification("几何尺寸");
- model.set_material(materialConcrete);
- model.set_section(sectionRectangle);
- foreach(节点中的键值对
nodeItem) - {
- model.set_node(nodeItem.Value);
- }
- foreach(键值对
lineItem in lines) - {
- model.set_line(lineItem.Value);
- }
- foreach(杆件中的键值对
memberItem) - {
- model.set_member(memberItem.Value);
- }
- foreach(节点支座中可变节点)
- {
- model.set_nodal_support(nodalSupport);
- }
}
catch(Exception异常)
{
- model.cancel_modification();
- logger.Error(exception, "创建几何图形时发生错误" + exception.Message);
- 抛出;
}
最终
{
- 尝试
- {
- model.finish_modification();
- }
- catch(Exception异常)
- {
- logger.Error(exception, "完成几何图形修改时出现问题\n" + exception.Message + "\n");
- model.reset();
- }
}
- /代码#
定义荷载
荷载工况、荷载组合和设计状况也可以通过与基本对象类似的方法创建,然后导入到软件中。
然后可以创建用户先前指定的杆件荷载:
- code.csharp#
Sortedlist
int member_load_id = 1;
for (int i = 0; i < spanNumber; i)
{
- member_load newMemberLoad = new()
- {
- no = i + 1
- members_string = (i + 1).ToString(),
- members = new int[] { i + 1 },
- load_distribution = member_load_load_distribution.LOAD_DISTRIBUTION_UNIFORM,
- load_distributionSpecified = true,
- 大小 = 杆件荷载 * 1000,
- 震级指定 = true,
- load_is_over_total_length = true,
- load_is_over_total_lengthSpecified = true,
- };
- member_loads.Add(i + 1, newMemberLoad);
- member_load_id++;
}
- /代码#
除了均匀分布的荷载外,还可以承受梯形和抛物线荷载。
计算和结果输出
model.calculate(all) 函数用于 RFEM 中的所有计算。
计算成功后,本例中的结果将显示在控制台中。 HLF C#库还允许将结果导出为 XML 或 CSV 文件。
最后,使用 model.save() 函数将模型保存在括号中指定的文件路径下:
- code.csharp#
//关闭前保存模型
model.save(CurrentDirectory +@"\测试模型\");
application.close_model(0, true);
- /代码#
概述总结
从这个例子中可以看出C#库的优点和容易操作。 可以通过用户自定义条目快速对结构进行调整,从而节省了大量在 RFEM 6 和 RSTAB 9 中输入结构体系的时间。 C#的 HLF 库还提供了许多其他函数,可以创建复杂的系统。