C#教程 WebService & API
技术文章
通过我们的网络服务,您可以使用各种编程语言与 RFEM 6 和 RSTAB 9 进行通信。 Dlubal 的 HLF(高级功能)允许您扩展和简化 WebService 的功能。 将我们的网络服务与 RFEM 6 和 RSTAB 9 结合使用可以方便和加快工程师的工作。 您可以试用后自己验证软件的优越性。 本教程通过一个简单的示例向您展示如何使用 C#library。
C#的 HLF 库为在 RFEM 和 RSTAB 中创建结构提供了许多有用的功能,其中一些将在下面的示例中使用。
为了运行程序代码,首先需要连接到程序。 必须将可用端口之一指定为地址。 RFEM/RSTAB 的默认地址是 http://localhost:8081。 如果需要,可以在程序选项中进行修改。
在下一步中,可以使用 C#库中的函数创建各种对象,例如节点、线和杆件。 该库包含所有可用对象的类。 可以根据参数定义和指定 objects' 的属性。 参数的数量可能会根据使用情况而有所不同。 下面以节点为例说明如何定义对象:
节点 newNode = new()
{
no = nodeId,
坐标 = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
坐标系类型 = 节点坐标系类型.COORDINATE_SYSTEM_CARTESIAN,
坐标系类型指定 = true,
comment = "梁的节点"
};
线、面和其他对象的定义方法相同。 请注意,对于某些属性,必须定义相应的“指定”属性并将其设置为“真”。
实例
本例介绍如何创建具有恒定线荷载的连续梁。 跨度、梁跨度和线荷载大小可以通过用户输入进行设置。 首先,所需的变量是用户在控制台中定义的。 程序检查用户的输入是否与相应变量的数据类型兼容。 如果输入不正确或为空,则控制台中将显示错误消息。 在编程时要特别注意小数点的位数和逗号都可以输入,以尽量减少出错的可能性。
到 RFEM/RSTAB 的连接
以下代码尝试在 try-catch 模块中与 RFEM/RSTAB 建立连接:
var logger = LogManager.GetCurrentClassLogger();
string CurrentDirectory = Directory.GetCurrentDirectory();
试试
{
application_information ApplicationInfo;
试试
{
//连接到 RFEM6 或 RSTAB9 应用程序
application = new ApplicationClient(Binding, Address);
}
catch(异常异常)
{
if (application != zero)
{
if (application.State != CommunicationState.Faulted)
{
应用程序.关闭();
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 = "我的测试模型";
字符串模型Url="";
ModelClient model = new ModelClient(Binding, new EndpointAddress(modelUrl));
为了建立连接,在运行代码之前必须打开程序。 连接成功后,程序信息将显示在控制台中,并在 RFEM/RSTAB 中创建一个用户自定义名称的新模型。
基本对象的定义
在下一步中,您可以定义连续梁的材料和截面。 重要的是描述与存储在 RFEM 材料库或截面库中的名称相对应。
材料 materialConcrete = 新材料
{
编号 = 1,
名称 = "C20/25 | EN 1992-1-1:2004/A1:2014"
};
截面sectionRectangle = 新建截面
{
编号 = 1,
材料 = materialConcrete.no,
materialSpecified = true,
类型 = 截面类型.TYPE_PARAMETRIC_MASSIVE_I,
typeSpecified = true,
参数化类型 = 截面参数化类型.PARAMETRIC_MASSIVE_I__MASSIVE_RECTANGLE__R_M1,
parametrization_typeSpecified = true,
名称 = "R_M1 0.5/1.0"
};
在循环的帮助下,可以在列表中创建和组织各种对象(节点、线、杆件)。 根据用户自定义的跨距定义节点,并将其传送到“线定义节点”列表中。 该列表稍后将用于根据线的定义节点创建线。 在创建 RSTAB 模型时,使用列表来根据杆件的定义节点定义杆件。 在使用 RFEM 时,杆件是通过线定义的。
SortedList nodes = new SortedList();
int[] lineDefinitionNodes = new int[spanNumber + 1];
int nodeId = 1;
双 xVector = 0.0;
for (int i = 0; i < spanNumber + 1; i++)
{
节点 newNode = new()
{
no = nodeId,
坐标 = new vector_3d() { x = xVector, y = 0.0, z = 0.0 },
坐标系类型 = 节点坐标系类型.COORDINATE_SYSTEM_CARTESIAN,
坐标系类型指定 = true,
comment = "混凝土构件"
};
nodes.Add(nodeId, newNode);
lineDefinitionNodes[i] = nodeId;
xVector = xVector + span;
节点ID++;
}
//创建线
int lineId = 1;
SortedList lines = new SortedList();
for (int i = 0; i < spanNumber; i++)
{
线 newLine = new()
{
no = lineId,
definition_nodes = new int[] { lineDefinitionNodes[i], lineDefinitionNodes[i + 1] },
comment = "梁的线",
type = line_type.TYPE_POLYLINE,
typeSpecified = true,
};
lines.Add(lineId, newLine);
线号++;
}
在创建完所有基础对象后,将定义两个不同的节点支座。 第一个节点支座采用固定支座,其余支座在 X 轴方向采用滚轮支座。 不同支座类型的定义节点汇总在一个单独的列表中。
node_support support1 = new()
{
编号 = 1,
节点=supportedNodes1.ToArray(),
spring = new vector_3d() { x = double.PositiveInfinity, y = double.PositiveInfinity, z = double.PositiveInfinity },
旋转约束 = new vector_3d() { x = double.PositiveInfinity, y = 0.0, z = double.PositiveInfinity }
};
node_support support2 = new()
{
否 = 2,
节点=supportedNodes2.ToArray(),
spring = new vector_3d() { x = 0.0, y = double.PositiveInfinity, z = double.PositiveInfinity },
旋转约束 = new vector_3d() { x = 0.0, y = 0.0, z = double.PositiveInfinity }
};
nodeSupports.Add(support1);
nodeSupports.Add(support2);
将对象传递到 RFEM
为了使创建的对象在 RFEM/RSTAB 中可用,必须先将它们导入程序中。 这是通过 HLF 库的对象特定函数在两个函数之间完成的,即“model.begin_modification”和“model.end_modification”。 Foreach 循环用于将一个类型的所有对象传递给程序。
试试
{
model.begin_modification("几何");
model.set_material(materialConcrete);
model.set_section(sectionRectangle);
foreach (KeyValuePair nodeItem in nodes)
{
model.set_node(nodeItem.Value);
}
foreach (KeyValuePair lineItem in lines)
{
model.set_line(lineItem.Value);
}
foreach (KeyValuePair memberItem in members)
{
model.set_member(memberItem.Value);
}
foreach (var nodeSupport in nodalSupports)
{
model.set_nodal_support(nodalSupport);
}
}
catch(异常异常)
{
model.cancel_modification();
logger.Error(exception, "创建几何图形时发生了一些事情" + exception.Message);
投掷;
}
终于
{
试试
{
model.finish_modification();
}
catch(异常异常)
{
logger.Error(exception, "完成几何修改时出错\n" + exception.Message + "\n");
模型.reset();
}
}
定义荷载
荷载工况、荷载组合和设计状况与基本对象类似,然后传递给程序。 然后可以创建之前由用户指定的杆件荷载:
SortedList member_loads = new SortedList();
int member_load_id = 1;
for (int i = 0; i < spanNumber; i++)
{
member_load newMemberLoad = new()
{
否 = i + 1,
members_string = (i + 1).ToString(),
members = new int[] { i + 1 },
load_distribution = member_load_load_distribution.LOAD_DISTRIBUTION_UNIFORM,
load_distributionSpecified = true,
大小 = memberLoad * 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 中进行。 计算成功后,控制台中会显示本例中的计算结果。 C#的 HLF 库还允许将结果导出为 XML 或 CSV 文件。 最后,可以使用 model.save() 函数将模型保存到括号中所示的文件路径下:
//关闭之前保存模型
model.save(CurrentDirectory +@"\testmodels\");
application.close_model(0, true);
小结
在示例中清楚地显示了 C#库的优势和易于操作。 通过用户自定义输入,可以快速调整结构,在 RFEM 6 和 RSTAB 9 中可以节省大量时间。 C#的 HLF 库还提供了许多其他功能,可以创建复杂的系统。
作者

Dipl.-Ing. Rebecca Göbel
Product Engineering & Customer Support
Göbel 女士为德儒巴用户提供技术支持
关键词
网络服务 & API RFEM 6 RSTAB 9 结构分析软件 有限元分析 BIM 编程 C#
链接
写评论...
写评论...
联系我们
你有问题或需要咨询吗? 请通过表格、电邮、电话、微信、QQ等方式联系我们,您也可以查看我们网页的常见问题(FAQ)。
