2387x
001659
2020-10-13

使用COM接口进行跨模型更新和编辑结构数据

Bei manchen Strukturen ist es nötig, dass diese in verschiedenen Konfigurationen bemessen werden müssen. So kann es sein, dass eine Hebebühne sowohl in der Stellung am Boden, in der Mitte und ausgefahren analysiert werden muss. Da solche Aufgaben das Anlegen mehrere Modelle erfordert, welche aber nahezu identisch sind, ist eine Aktualisierung aller Modelle mit nur einem Mausklick eine erhebliche Arbeitserleichterung.

在下面的假设中,您已经熟悉了COM接口。 在这些链接中可以找到关于编程基础的文章。

任务

程序会自动调整结构的任何数据,例如节点,线,杆件等。 例如节点1的坐标必须从主模型被传递到各种辅助模型和变量。 但是,不是所有的数值都应该传递。只有那些用户先前自由定义的。

示例

并以一个示例的程序为例,建立了一个高空工作平台。 下面的模型被认为是主模型。

该平台未参数化设置,共有以下三种类型: 全张拉在地面和中间位置 主体模型定义为完全延伸类型,中间类别定义为1,地上类别定义为2。

考虑因素

为了满足上述任务的要求,或者只是必须提供一个比较简单的配置文件类型,或者是一个图形用户界面来定义一个或多个模型之间可以相互比较。

为了定义节点的自由或可变坐标,必须使用相应单元的注释功能。 程序在注释中查找特定的字符串,如果找到,将修改或保留相应的坐标。 此外,在所有子模型中都可以自动创建新的单元的情况。 因此结构的设计是,用户在RFEM中激活所需的模型(在后台编辑),然后程序打开所需的模型,并与主模型进行比较。

图形用户界面

我们选择了下面的图形用户界面进行设计。

用户可以在输入栏中输入路径,或者通过复制或粘贴方式插入。 通过“添加新模型”可以将其添加到要调整的模型列表中。 使用“删除所选模型”按钮可以删除列表中所选的模型。 然后点击“修改模型”,启动程序。

基本程序流程

首先,程序只包含了次模型和变量的路径,并且首先需要与RFEM进行连接。 如果与RFEM的连接建立,则应在附加模型上进行计算。 因为在程序中还应该创建单元,所以必须遵守该分层。 因此首先要比较节点,然后是线,材料,截面和杆件。 节点是一种例外,因为这里x,y和z的方向如有必要,可以保留原样。 所有其他单元都将被完全替换,或者保留原状。 但是对于所有创建新单元的单元来说,都是相同的。

程序的基本结构

点击按钮“修改模型”时执行的方法具有以下基本结构:

私有无效button_mod_click(对象发送方,EventArgs e)
{
//RFEM
//###########################
Dlubal.RFEM5.IModel3 iModel_org = null;
Dlubal.RFEM5.IApplication iApp = null;
尝试
{
//得到应用程序的接口并打开模型
iApp = Marshal.GetActiveObject(“ RFEM5.Application”)as Dlubal.RFEM5.IApplication;
iApp.LockLicense();
iModel_org = iApp.GetActiveModel()作为Dlubal.RFEM5.IModel3;
  
//遍历找到的模型
Dlubal.RFEM5.IModel iModel_cpy = null;
  
for(int i = 0; i <listBox_models.Items.Count; ++ i)
{
//打开模型
iModel_cpy = iApp.OpenModel(listBox_models.Items [i] .ToString());
   
//得到结构数据
Dlubal.RFEM5.IModelData2 iModData_org
= iModel_org.GetModelData()作为Dlubal.RFEM5.IModelData2;
Dlubal.RFEM5.IModelData2 iModData_cpy
= iModel_cpy.GetModelData()as Dlubal.RFEM5.IModelData2;
   
//比较/更改节点
//比较/更改线
//比较/更改材料
//比较/更改截面
//比较/更改杆件
}
  
}
渔获(特例)
{
MessageBox.Show(例如消息,例如来源);
}
最后
{
if(iApp!= null)
{
iApp.UnlockLicense();
   
//释放COM对象 -不需要
//Marshal.ReleaseComObject(iApp);
iApp = null;
}
  
iModel_org = null;
  
//清理垃圾回收器释放所有COM接口和对象。
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
}

如前所述,与RFEM的连接首先通过GetActiveObject(“ RFEM5.Application”)进行。 然后,通过GetActiveModel()与激活的模型建立连接。 为了进行比较,通过列表框(GetModelData())中的输入项,子模型和它们的结构数据一个接一个的打开。 此时所有的几何数据都可以使用并进行比较。

如果出现问题(例如无法打开模型),由try-catch块捕捉错误,并显示,程序将被解锁。

节点比较

主模型和次模型的节点比较如下。

首先,取入主模型的所有节点,并在这些节点上开始循环。 在这种情况下,系统首先尝试在次模型中得到相同编号的节点的数据。 如果在该节点中失败,则使用另一个try-catch块捕捉错误,并在次模型中使用来自主模型的数据创建节点。

如果该节点存在,那么将读取该注释并使用分隔符“;”将其分解。 如果部分少于三部分,那么数据将从主模型中获取。 如果大于或等于三部分,将对它们进行评估。 f表示一个不能重写的固定值。 如果它不是“ f”值,那么该值将被为主模型中的值覆盖。

一个简单的例子是节点注释中的字符串“ f ;; f1; kkl”。 分解后将生成字符串“ f”,“”,“ f1”和“ kkl”。 因此,将x的值保留在节点上,将y和z的值覆盖,因为y包含一个空字符串,并且z包含一个“ f1”,

//比较/更改节点
Dlubal.RFEM5.Node [] nodesorg = iModData_org.GetNodes();
for(int j = 0; j <nodes_org.Length; ++ j)
{
尝试
{
Dlubal.RFEM5.INode iNode = iModData_cpy.GetNode(nodes_org [j] .No,Dlubal.RFEM5.ItemAt.AtNo);
Dlubal.RFEM5.Node =新的Dlubal.RFEM5.Node();
node = iNode.GetData();
  
//检查构件是否固定
list <string> defs =(node.Comment).Split(';')。ToList <string>();
  
if(defs.Count> = 3)
{
如果(defs [0]!=“ f”)
node.X = nodes_org [j] .X;
   
如果(defs [1]!=“ f”)
node.Y = nodes_org [j] .Y;
    
如果(defs [2]!=“ f”)
node.Z = nodes_org [j] .Z;
}
否则
{
node.X = nodes_org [j] .X;
node.Y = nodes_org [j] .Y;
node.Z = nodes_org [j] .Z;
}
  
//设置节点
iModData_cpy.PrepareModification();
iNode.SetData(节点);
iModData_cpy.FinishModification();
  
}
渔获(特例)
{
//如果不存在则创建
iModData_cpy.PrepareModification();
iModData_cpy.SetNode(nodes_org [j]);
iModData_cpy.FinishModification();
}
 
}

线,材料和其他比较

其他元素与节点比较略有不同,但是彼此相同。

//比较/更改线
Dlubal.RFEM5.Line [] lines_org = iModData_org.GetLines();
for(int j = 0; j <lines_org.Length; ++ j)
{
尝试
{
Dlubal.RFEM5.ILine iLine = iModData_cpy.GetLine(lines_org [j] .No,Dlubal.RFEM5.ItemAt.AtNo);
Dlubal.RFEM5.Line(线性)=新建Dlubal.RFEM5.Line();
line = iLine.GetData();
  
//检查线是否固定
List <字符串>列表defs =(line.Comment).Split(';')。ToList <string>();
  
如果(defs [0]!=“ f”)
{
line = lines_org [j];
}
  
//设置线
iModData_cpy.PrepareModification();
iLine.SetData(线);
iModData_cpy.FinishModification();
  
}
渔获(特例)
{
//如果不存在则创建
iModData_cpy.PrepareModification();
iModData_cpy.SetLine(lines_org [j]);
iModData_cpy.FinishModification();
}
 
}

与节点比较的区别在于,如果在拆卸后的注释中没有找到“ f”(通过“;”进行拆卸),则该单元将被完全覆盖。 其他单元的创建和比较完全相同。 请参阅附加的Visual Studio项目中的源代码。

评估

该程序可以在辅助模型中实现所需的更改。 文章视频展示了它是如何工作的。 最大的问题是当前不会截断或截然不同的数据被截获。

总结和展望

这里展示的软件可以在主模型的基础上更新主模型。 对节点和其他单元上的更改的正确传递。

现在缺少了拦截错误条目的例程,这些例程现在可以继续添加。 进一步的优化例如是关闭辅助模型,这可能会导致在后台处理。 然后添加更多的结构数据,荷载和组合。


作者

Günthel 先生为Dlubal 软件客户提供技术支持。

链接
下载