BIM.Element bimEE = SampleMixed.ElementOperation.ConvertToInteropEle(ele); BIM.XDataObject oXData = bimEE.GetXData1(xdataName);
oXData 的count始终为0,想问一下是什么原因。
还有ConvertToInteropEle元素的转换,会使传进去的元素变为一个新元素?还请老师帮忙看一下!
以下是给元素附加Xdata数据代码:
BIM.Element bimEE = SampleMixed.ElementOperation.ConvertToInteropEle(ele);
BIM.XDataObject oXData = bimEE.GetXData1(xdataName);
oXData.AppendXDatum(BIM.MsdXDatumType.ControlString, "{"); for (int i = 0; i < info.Length; i++) { oXData.AppendXDatum(BIM.MsdXDatumType.String, info[i].ToString()); } oXData.AppendXDatum(BIM.MsdXDatumType.ControlString, "}"); bimEE.SetXData1(xdataName, oXData);
bimEE.Rewrite();
BIM.XDataObject oXDatad = bimEE.GetXData1(xdataName); int cc = oXDatad.Count; //此时count不为0 string sss = bimEE.ID.ToString();
先取消元素转换代码测试一下。Interop对象模型中也含有完整的各种元素操作方法的。尽量避免在.NET和Interop两个对象模型间转来转去的,这样不仅容易出错而且极其影响效率,因为它们是两个内存区(托管区和非托管区),转换是需要重新创建一块内存的。
付老师你好,之所以用这个元素转换是因为我基于ORD路线元素编的一段代码。
我是怀疑会不会这个转换将XData丢失了。所以,建议你先用纯Interop对象模型检测一下。无论是MS还是ORD中的元素,都可用最普通的Element(Interop中也有Element,和.NET中的同名,不要搞混了)读取出来,然后取它的XData。
您也可以发一个测试DGN(仅需要一个含有XData的元素即可)在这里供我们分析。
Answer Verified By: XiaoHu
感谢付老师,我按照你的思路给Interop的Element附加上了Xdata,Xdata数据可以获取到。
问题已解决: 通过com口的GetElementByID找到元素,再附加Xdata数据;
用转换后的元素获取Xdata数据也可以取到。 问题的原因在于不能给转换后的元素附加XData数据。
应该是Dgn文件中存在的元素才能附加XData数据,您在转换之前先将元素添加到dgn文件中试试。
多谢郭老师指点,代码测试的时候元素已经加入到模型中了。
我上面说的这句话:“用转换后的元素获取Xdata数据也可以取到”
还是存在问题,如果一个元素赋予了多个Xdata,只能获取一个,其他的根据Xdata名称还是找不到,但本身Xdata数据是有的。
我测试的结果是不管赋予还是获取Xdata,用ActiveModelReference.GetElementByID获取的元素,就没问题了