我们目前在尝试导入轨枕构件到ORD的一个dgn文件。
导入dgn模型到另一个dgn的代码如下:
/// <summary> /// 将一个dgn文件中的构建模板导入到指定坐标点位置 /// </summary> /// <param name="dgnPath"></param> /// <param name="cellName"></param> /// <param name="point">指定坐标点</param> /// <param name="scalePoint"></param> /// <param name="matrizIdentidad"></param> public static Element CreateNormalCell(string dgnPath, string cellName, BIM.Point3d point, BIM.Point3d scalePoint, BIM.Matrix3d matrizIdentidad) { Bentley.Interop.MicroStationDGN.Application msApp = Bentley.MstnPlatformNET.InteropServices.Utilities.ComApp; msApp.AttachCellLibrary(dgnPath); BIM.CellElement cellEle = msApp.CreateCellElement2(cellName, ref point, ref scalePoint, true, ref matrizIdentidad); // cellElement转普通element long cellElePtr = cellEle.MdlElementDescrP(); Element elem = ElementOperation.ConvertToDgnNetEle(cellEle); elem.AddToModel(); return elem; }
轨枕构件的模型如下:
导入以后的效果如下图(白色方块为导入的轨枕构件):
但是,轨枕的数量相当多,超过15000个。这也使得导入的时间非常的长,总时长大约在20分钟。
我们计算了一下,大概每秒只能导入10个左右的轨枕模型。
请问是否有办法提升导入速度?
图形完全相同的构件可以改用共享单元,共享单元元素本身不会包含图形元素,它包含了一个引用,指向共享单元定义元素,所有的图形元素都在定义元素里边保存。改用共享单元以后应该效率会有显著提高。另外还有就是推荐改用纯c/c++编程来实现,这种批量耗时操作最好不要用c#来实现,c#只是提高了开发人员的开发效率,但是程序执行效率是没办法跟c/c++相媲美的,况且c#的接口底层还是通过c++/cli语言封装的c/c++的接口,c#的程序集基本上都是Mixed,即包含托管代码和非托管代码,调用时经常发生托管代码与非托管代码之间的来回穿梭,这个也是比较耗时的。
MS学习资源:
MicroStation Wednesday视频分享
深入探讨MicroStation DGN基本概念系列
一步步学习MicroStation CE Addin开发
一步步学习MicroStation CE MDL开发
请问是否有C#代码创建共享单元的案例代码?
我们项目周期比较紧且前期都是基于C#做的开发,现在切换到C/C++成本太高了。
我们还在考虑能否用多线程来改善这里的效率。
Bentley.MstnPlatformNET.InteropServices.Utilities.ComApp.CreateSharedCellElement2