ORD旗舰版中路线元素转com口元素

各位老师, ORD中国版中, 把ORD路线元素, 转换为COM口下的Element元素, 下面这么写不对吗? 为啥运行次数多了会闪崩, 请指教
Bentley.Interop.MicroStationDGN.Element bimEE = SampleMixed.ElementOperation.ConvertToInteropEle(Alignment.Element);

Parents
  • .NET中的Element和Interop(或称COM)中的Element确实不在一个内存空间中,它们之间的互转换确实是比较复杂的。郭老师写过一篇文章,相信您也是参考了那篇文章在使用的。

    不过那篇文章的前提是:这两种Element在内存中(未被保存到DGN文件中,因此没有ElementId)时的互转换。如果任何一方已经被保存在了DGN文件中了的话,其实是可以通过读取ElementId来获得另外一种形式的Element的。所以,如果您的Alignment已经被写入到了DGN文件中的话,可以改用更简单的形式来处理。

    另外,我想了解的是:您要将Alignment.Element转成Interop下的Element的目的是什么?是否某个方法在.NET下找不到了?



  • 老师, 我要获取XDATA数据(BIM.XDataObject oXData = bimEE.GetXData1(xdataName);),
    使用场景是这样的, 首先我把获得的路线存储在一个List<Alignment>集合, 作为全局变量使用, 每次运行某过程, 就读取路线集合里每条路线上的XDATA数据, 我发现在ORD中国版里总是闪崩(之前我发帖子问过您), 但是在原来的英文版中也是这么用的, 但是从未出现这种闪崩的情况, 现在找问题找到这块来了, 怀疑是集合中路线多次转换为 COM口元素时崩溃, 请符老师帮忙看看我这个思路有问题吗, 谢谢

  • 目前看,是Alignment.Element这块的问题,我已经跟开发反馈,另外麻烦提供一下您用英文版获取Alignment.Element不为空的截图,我们这边一并反馈下。

  •  老师, 你看这样行吗, 不行我再给您重新截图, 如果可以的话, 麻烦贵公司尽快解决这个问题, 这个问题对我们影响实在太大了, 因为这个问题, 原来ORD10.0版本编写的程序转到ORD中国版现在都不能用了, 导致我们原来的程序都面临着重构的危险! 拜托老师了, 谢谢

  • 您试试下面的代码,看看再china版本和英文版获取Alignment的al一样吗?

    ConsensusConnectionEdit con = ConsensusConnectionEdit.GetActive();
    con.StartTransientMode();
    List<Bentley.GeometryNET.DPoint3d> points = new List<Bentley.GeometryNET.DPoint3d>();
    Bentley.GeometryNET.DPoint3d pt1 = new Bentley.GeometryNET.DPoint3d(0, 0, 0);
    Bentley.GeometryNET.DPoint3d pt2 = new Bentley.GeometryNET.DPoint3d(1000, 0, 0);
    
    points.Add(pt1);
    points.Add(pt2);
    
    Bentley.GeometryNET.CurveVector cv = Bentley.GeometryNET.CurveVector.CreateLinear(points, Bentley.GeometryNET.CurveVector.BoundaryType.Inner, false);
    Alignment al = con.GetActiveGeometricModel().CreateAlignmentByCurveVector(cv);
    
    con.PersistTransients();

    抱歉,刚没看清您的具体问题,我测试了一遍,是可以的,中国版也能获取:

    获取Alignment中的Element,不能直接用Alignment.Element。

    请参考这个贴:

    communities.bentley.com/.../595728

Reply
  • 您试试下面的代码,看看再china版本和英文版获取Alignment的al一样吗?

    ConsensusConnectionEdit con = ConsensusConnectionEdit.GetActive();
    con.StartTransientMode();
    List<Bentley.GeometryNET.DPoint3d> points = new List<Bentley.GeometryNET.DPoint3d>();
    Bentley.GeometryNET.DPoint3d pt1 = new Bentley.GeometryNET.DPoint3d(0, 0, 0);
    Bentley.GeometryNET.DPoint3d pt2 = new Bentley.GeometryNET.DPoint3d(1000, 0, 0);
    
    points.Add(pt1);
    points.Add(pt2);
    
    Bentley.GeometryNET.CurveVector cv = Bentley.GeometryNET.CurveVector.CreateLinear(points, Bentley.GeometryNET.CurveVector.BoundaryType.Inner, false);
    Alignment al = con.GetActiveGeometricModel().CreateAlignmentByCurveVector(cv);
    
    con.PersistTransients();

    抱歉,刚没看清您的具体问题,我测试了一遍,是可以的,中国版也能获取:

    获取Alignment中的Element,不能直接用Alignment.Element。

    请参考这个贴:

    communities.bentley.com/.../595728

Children