我基于道路中线创建了若干条边线(有些是基于新创建的边线偏移的),创建后我想同时给它们附上EC属性,但是在Persist之前和之后都会触发异常。我想请问Transient有什么用?从Persist时大概做了哪些操作?创建Alignment同时给它附加EC属性的正确做法是怎么样的?
由于实际代码比较长,我只在上图中列了个框架。
您可以这样,先通过AlignmentEdit创建Alignment,然后在con.PersistTransients()后通过 al.DgnECInstance.Element.ElementId 获取Alignment的元素ID,然后根据下面代码获得该元素,然后通过EC接口为该元素添加EC属性或者通过ITemtype添加属性。
ElementId elId = new ElementId(ref myid);
Element myel = Session.Instance.GetActiveDgnModel().FindElementById(elId);
我在PersistTransients后,去取alignmentEdit,监测显示已经无法访问到它的内容。所以我想知道PersistTransients还做了什么操作,是不是清理了对象的内存。
只是持久化了,你可以新建一个模型,运行完创建alignment代码后,模型里面应该有两个对象,一个是原本的线,一个是新的alignment
我怀疑在Persist这个操作中,程序基于内存优化的目的,有额外的操作。下图是我调试过程中遇到的问题。
对于这个问题,我后来想到一个迂回的方法,即在persist后,不通过alignmentEdit局部变量去取单元或单元ID,而是在GeometricModel.Alignments中取最后一个,即刚刚永久化的那个,这样就没有问题了。
Bentley.CifNET.SDK.ConsensusConnection m_con = new Bentley.CifNET.SDK.ConsensusConnection(Bentley.MstnPlatformNET.Session.Instance.GetActiveDgnModelRef()); Bentley.CifNET.GeometryModel.SDK.GeometricModel sdkGeomModel = m_con.GetActiveGeometricModel();
Alignment ali= sdkGeomModel.Alignments.Last();
Answer Verified By: 熊 江陵
GOOD TO KNOW.
后来经大师同事研究,得到一个更加好的办法。
先创建ComplexStringElement 并AddToModel。然后再基于ComplexStringElement 创建Alignment 。
ComplexStringElement str = new ComplexStringElement(m_dgnModel, null); str.SetCurveVector(cv); str.AddToModel();
Alignment offsetAlig = Alignment.CreateFromElement(conEdit, str);