在下面的假设中,您已经熟悉了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项目中的源代码。
评估
该程序可以在辅助模型中实现所需的更改。 文章视频展示了它是如何工作的。 最大的问题是当前不会截断或截然不同的数据被截获。
总结和展望
这里展示的软件可以在主模型的基础上更新主模型。 对节点和其他单元上的更改的正确传递。
现在缺少了拦截错误条目的例程,这些例程现在可以继续添加。 进一步的优化例如是关闭辅助模型,这可能会导致在后台处理。 然后添加更多的结构数据,荷载和组合。