2455x
001806
2023-07-19

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

通过我们的网络服务,用户可以使用不同的编程语言与 RFEM 6 和 RSTAB 9 进行通信。 Dlubal 的高级函数(HLF)允许您扩展和简化网络服务的功能。 根据 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 库还提供了许多其他功能,可以创建复杂的系统。


作者

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

链接