老师们,您好,遇到一个问题百思不得其解,创建了一条复杂链,通过MS的Property面板查看,其有6条子元素,但通过代码去获取,有8条。以下是代码截图及相关的测试文件,请老师们解惑。
更奇怪的是,我把这条复杂链打散后,全选,发现只有6个子元素,然后连接起来,再用代码获取,也只有6个。想不清楚是为什么。
CurveVector不是Mstn中元素的集合,它使CurvePrimitive的集合,CurvePrimitve只代表几何数据,而且从名字可以看出来是基本几何数据。
不是很懂呢?
您还保存有未打散前的dgn文件吗?请上传一份
复杂链子元素数量测试.dgn
Mstn中元素在编程对象中用MSElement(NativeCode中叫MSElement,Addin c#中是Element)表示,元素除了包含有几何数据外,还有很多MSTN相关的属性,例如颜色,线宽等属性,而这个CurveVector仅仅是几何数据的表达。不过我看了您上传的dgn文件,不是这个原因造成的,而是您这个复杂链里边有两条线跟它前后的段不是首尾相连造成的,您可以打开元素窗体看一下,如下图所示:
针对您的这个图形我写了如下测试例子来分析原因:
private static void CurveVectorCountTest() { DgnModel model = Session.Instance.GetActiveDgnModel(); ComplexStringElement cse = model.FindElementById((ElementId)36730L) as ComplexStringElement; int cnt = cse.GetCurveVector().Count; MessageCenter.Instance.ShowInfoMessage("cnt=" + cnt.ToString(), null, false); int i = 0; foreach (CurvePrimitive cp in cse.GetCurveVector()) { double length; cp.Length(out length); DPoint3d start, end; cp.GetStartEnd(out start, out end); string msg = "[" + i.ToString() + "]" + cp.GetCurvePrimitiveType().ToString() + ", Len=" + length.ToString(); msg += ",start=(" + start.X + "," + start.Y + "), end=(" + end.X + "," + end.Y + ")"; MessageCenter.Instance.ShowInfoMessage(msg, null, false); i++; } }
输出结果如下:
不难看出,红框中两条线分别是从头到尾又从尾到头了。MS的分析工具可能是对这种非法情况给过滤了。
Answer Verified By: cao li