3305x
001806
2023-07-19

网络服务教程C#编程接口

通过我们的网络服务,用户可以使用不同的编程语言与 RFEM 6 和 RSTAB 9 进行通信。 Dlubal 的高级函数(HLF)允许您扩展和简化网络服务的功能。 根据 RFEM 6 和 RSTAB 9,使用我们的网络服务可以让工程师的工作变得更轻松和更快。 您可以试用后自己验证软件的优越性。 本教程通过一个简单的示例向您展示如何使用 C#library。

HLF 的 C#库为 RFEM 和 RSTAB 中的结构创建提供了许多有用的功能,下面的示例中将使用其中的一些功能。

想要执行上面的代码,首先需要连接到软件软件. 必须以地址形式指定一个可用端口。 RFEM/RSTAB的默认地址是 http://localhost:8081 . 如有必要,可以在程序选项中进行修改。

下一步,可以使用C#库中的函数创建各种对象,例如节点、线和杆件。 该库包含了所有可用对象的类。 基于参数,可以定义和指定对象的属性。 参数的数量取决于用例。

下面举例说明如何通过定义节点来定义对象:

  1. code.csharp#

node newNode = new()
{

  1. no = nodeID,
  2. coordinates = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
  3. coordinate_system_type = node_coordinate_system_type.COORDINATE_SYSTEM_CARTESIAN,
  4. coordinate_system_typeSpecified = true,
  5. comment = "梁的节点"

};

  1. /代码#

线、面和其他对象的定义方法相同。 请注意,对于某些属性,必须定义相应的“特定”属性,并将其设为“true”。

实例

该例题展示了如何创建恒定线荷载的连续梁。 用户可以根据需要设置杆件的跨度、跨度和跨度。

首先,所需的变量在控制台中由用户自定义。 程序检查用户的输入是否符合各个变量的数据类型。 如果输入错误或为空,则在控制台中会显示错误信息。 在编程过程中,我们特别注意了小数位数的输入。

连接到 RFEM/RSTAB

以下代码尝试在 ry-catch 块中与 RFEM/RSTAB 建立连接:

  1. code.csharp#

var logger = logmanager.getcurrentclasslogger();
string CurrentDirectory = Directory.GetCurrentDirectory();
尝试
{

  1. application_information
  1. 尝试
  2. {
  3. //连接到 RFEM6 或 RSTAB9 的应用程序
  4. application = new ApplicationClient(Binding, Address);
  5. }
  6. catch(Exception异常)
  7. {
  8. if (应用程序 != 零)
  9. {
  10. if (application.State != CommunicationState.Faulted)
  11. {
  12. application.Close();
  13. logger.Error(exception, "发生了什么事:" + exception.Message);
  14. }
  15. 其他
  16. {
  17. application.Abort();
  18. logger.Error(exception, "与 RFEM 的通信错误:" + exception.Message);
  19. }
  20. }
  21. Console.WriteLine(exception.ToString());
  22. }
  23. 最终
  24. {
  25. ApplicationInfo = application.get_information();
  26. logger.Info("用户名: {0},版本:{1},类型: {2}, 语言: {3} ", ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
  27. Console.WriteLine("名称: {0},版本:{1},类型: {2}, 语言: {3} ", ApplicationInfo.name, ApplicationInfo.version, ApplicationInfo.type, ApplicationInfo.language_name);
  28. }

}

string modelName = "My测试模型";
string modelUrl="";
ModelClient model = new ModelClient(Binding, new EndpointAddress(modelUrl));

  1. /代码#

为了建立连接,必须在运行代码之前打开程序。 连接成功后,在 RFEM/RSTAB 中的控制台中会显示程序信息,并具有用户自定义名称的新模型被创建。

基本对象定义

在下一步选择中定义连续梁的材料和截面。 请注意,截面名称要与 RFEM 中材料库或截面库的名称相对应。

  1. code.csharp#

材料 materialConcrete = 新材料
{

  1. 没有 = 1,
  2. name = "C20/25 | EN 1992-1-1:2004/A1:2014

};

sectionRectangle = 新建截面
{

  1. 没有 = 1,
  2. 材料= materialConcrete.no,
  3. 指定材料 = true,
  4. type = section_type.TYPE_PARAMETRIC_MASSIVE_I,
  5. 指定类型 = true,
  6. parametrization_type = section_parametrization_type.PARAMETRIC_MASSIVE_I_MASSIVE_RECTANGLE_R_M1,
  7. parametrization_specified = true,
  8. name = "R_M1 0.5/1.0"

};

  1. /代码#

用户可以通过列表来创建和管理各种对象(节点、线、杆件)。 系统会根据用户定义的跨数来定义节点,并将其传递到“线定义节点”列表中。 该列表稍后将用于根据线的定义节点创建线。 在创建 RSTAB 模型时可以通过该列表根据杆件的定义节点进行定义。 RFEM 中的杆件是通过线来定义的。

  1. code.sharp#

Sortedlist nodes = new Sortedlist();
int[] lineDefinitionNodes = new int[spanNumber + 1];
int nodeid = 1;
double xVector = 0.0;

for (int i = 0; i < spanNumber + 1; i++)
{

  1. node newNode = new()
  2. {
  3. no = nodeID,
  4. coordinates = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
  5. coordinate_system_type = node_coordinate_system_type.COORDINATE_SYSTEM_CARTESIAN,
  6. coordinate_system_typeSpecified = true,
  7. comment = "混凝土部分"
  8. };
  9. nodes.Add(nodeid, newNode);
  10. lineDefinitionNodes[i] = nodeid;
  11. x向量 = x向量 + span;
  12. nodeid+;;

}

//创建线
int lineid = 1;
Sortedlist lines = new Sortedlist();

for (int i = 0; i < spanNumber; i)
{

  1. line newLine = new()
  2. {
  3. no = lineID,
  4. definition_nodes = new int[] { lineDefinitionNodes[i], lineDefinitionNodes[i + 1] },
  5. comment = "梁线",
  6. type = line_type.TYPE_POLYLINE,
  7. 指定类型 = true,
  8. };
  9. lines.Add(lineid, newline);
  10. lineid+;

}

  1. /代码#

在创建所有基础对象后,将定义两个不同的节点支座。 第一个节点上的节点支座应该是固定的;其余的支座在 X 方向上设计为可动支座。 不同的支座类型的定义节点都在单独的列表中。

  1. code.csharp#

nodal_support support1 = new()
{

  1. 没有 = 1,
  2. nodes = supportedNodes1.ToArray(),
  3. spring = new vector_3d() { x = double.PositiveInfinity, y = double.PositiveInfinity, z = double.PositiveInfinity },
  4. rotational_restraint = new vector_3d() { x = double.PositiveInfinity, y = 0.0, z = double.PositiveInfinity }

};

nodal_support support2 = new()
{

  1. 没有= 2,
  2. nodes = supportedNodes2.ToArray(),
  3. spring = new vector_3d() { x = 0.0, y = double.PositiveInfinity, z = double.PositiveInfinity },
  4. rotational_restraint = new vector_3d() { x = 0.0,y = 0.0,z = double.PositiveInfinity }

};

nodalSupports.Add(support1);
nodalSupports.Add(support2);

  1. /代码#

导出模型对象-RFEM

为了使创建的对象在 RFEM/RSTAB 中可用,必须先将它们传输到程序中。 这是在 "model.begin_modification" 和 "model.end_modification" 两个函数之间使用 HLF 库中的对象特定函数来完成的。 一种类型的所有对象通过 foreach 循环传递到程序中。

  1. code.csharp#

尝试
{

  1. model.begin_modification("几何尺寸");
  2. model.set_material(materialConcrete);
  3. model.set_section(sectionRectangle);
  1. foreach(节点中的键值对 nodeItem)
  2. {
  3. model.set_node(nodeItem.Value);
  4. }
  5. foreach(键值对 lineItem in lines)
  6. {
  7. model.set_line(lineItem.Value);
  8. }
  9. foreach(杆件中的键值对 memberItem)
  10. {
  11. model.set_member(memberItem.Value);
  12. }
  13. foreach(节点支座中可变节点)
  14. {
  15. model.set_nodal_support(nodalSupport);
  16. }

}
catch(Exception异常)
{

  1. model.cancel_modification();
  2. logger.Error(exception, "创建几何图形时发生错误" + exception.Message);
  3. 抛出;

}
最终
{

  1. 尝试
  2. {
  3. model.finish_modification();
  4. }
  5. catch(Exception异常)
  6. {
  7. logger.Error(exception, "完成几何图形修改时出现问题\n" + exception.Message + "\n");
  8. model.reset();
  9. }

}

  1. /代码#

定义荷载

荷载工况、荷载组合和设计状况也可以通过与基本对象类似的方法创建,然后导入到软件中。

然后可以创建用户先前指定的杆件荷载:

  1. code.csharp#

Sortedlist member_loads = new Sortedlist();
int member_load_id = 1;

for (int i = 0; i < spanNumber; i)
{

  1. member_load newMemberLoad = new()
  2. {
  3. no = i + 1
  4. members_string = (i + 1).ToString(),
  5. members = new int[] { i + 1 },
  6. load_distribution = member_load_load_distribution.LOAD_DISTRIBUTION_UNIFORM,
  7. load_distributionSpecified = true,
  8. 大小 = 杆件荷载 * 1000,
  9. 震级指定 = true,
  10. load_is_over_total_length = true,
  11. load_is_over_total_lengthSpecified = true,
  12. };
  13. member_loads.Add(i + 1, newMemberLoad);
  14. member_load_id++;

}

  1. /代码#

除了均匀分布的荷载外,还可以承受梯形和抛物线荷载。

计算和结果输出

model.calculate(all) 函数用于 RFEM 中的所有计算。

计算成功后,本例中的结果将显示在控制台中。 HLF C#库还允许将结果导出为 XML 或 CSV 文件。

最后,使用 model.save() 函数将模型保存在括号中指定的文件路径下:

  1. code.csharp#

//关闭前保存模型
model.save(CurrentDirectory +@"\测试模型\");
application.close_model(0, true);

  1. /代码#

概述总结

从这个例子中可以看出C#库的优点和容易操作。 可以通过用户自定义条目快速对结构进行调整,从而节省了大量在 RFEM 6 和 RSTAB 9 中输入结构体系的时间。 C#的 HLF 库还提供了许多其他函数,可以创建复杂的系统。


作者

Göbel 女士为 Dlubal 软件的客户提供技术支持。

链接


;