肖老师,符老师好:
程序实现沿各种线型放置共享单元。思路是拾取到线后进行判断,然后转为LinearElement,调用其GetPointAtDistanceOffset(double distance,double offset)函数获取投影点。
protected override bool OnDataButton(Bentley.DgnPlatformNET.DgnButtonEvent ev) { HitPath hit = DoLocate(ev, true, 1); if (null == hit) return false; Element element = hit.GetCursorElement(); if (null == element) { System.Windows.Forms.MessageBox.Show("Please Choose Line Elements!"); return false; } if (null == element.ParentElement) { if (element.ElementType == MSElementType.BsplineCurve) { BSplineCurveElement bscElement = element as BSplineCurveElement; CurveVector curveVector = bscElement.GetCurveVector(); linear = LinearElement.CreateFromCurveVector(curveVector, true); } else if (element.ElementType == MSElementType.LineString) { LineStringElement lineStrElem = element as LineStringElement; CurveVector curveVector = lineStrElem.GetCurveVector(); linear = LinearElement.CreateFromCurveVector(curveVector, true); } else if (element.ElementType == MSElementType.Line) { LineElement line = element as LineElement; CurveVector curveVector = line.GetCurveVector(); linear = LinearElement.CreateFromCurveVector(curveVector, true); } else if (element.ElementType == MSElementType.Ellipse) { EllipseElement elpsElement = element as EllipseElement; CurveVector curveVector = elpsElement.GetCurveVector(); linear = LinearElement.CreateFromCurveVector(curveVector, false); } else if (element.ElementType == MSElementType.Arc) { ArcElement arcElement = element as ArcElement; CurveVector curveVector = arcElement.GetCurveVector(); linear = LinearElement.CreateFromCurveVector(curveVector, true); } else if (element.ElementType == MSElementType.ComplexString) { ComplexStringElement complexStrElem = element as ComplexStringElement; CurveVector cv = complexStrElem.GetCurveVector(); linear = LinearElement.CreateFromCurveVector(cv, true); } } }
以上为代码片段,主要是应用LinearElement.CreateFromCurveVector()方法实现MS线类型转为LinearElement。
在程序调试中,选取圆时,linear = LinearElement.CreateFromCurveVector(curveVector, false)中获取到的linear = null.而其他类型线元素可以转成功。
请问EllipseElement是否能采用以上方法转成LinearElement对象?是否有更优的方法呢?
另外我看肖老师说LinearElement永远是米作为单位,上述代码片段在进行转化前,如何进行单位转换?
谢谢两位老师!
Fei Yu said:请问EllipseElement是否能采用以上方法转成LinearElement对象?是否有更优的方法呢?
可否先将EllipseElement切分为ArcElement后再转为LinearElement?
Fei Yu said:LinearElement永远是米作为单位,上述代码片段在进行转化前,如何进行单位转换?
不涉及到提取坐标值时是不需要转换的,只是在提取坐标值时注意不同软件中的对象使用的默认单位是不同的。像EllipseElement或ArcElement为MS软件中的对象,默认单位为uor(Unit Of Resolution),而LinearElement则是ORD中的对象,默认单位为米。
1获取UOR:
double uor= dgnModel.GetModelInfo().UorPerMeter;
2ellipse是圆和圆弧,表达方式就和line不一样,所以肯定是不能转成linear的,如果你实在要转那就stroke成点,就是learnpoint.
Answer Verified By: Fei Yu
符老师,EllipseElement用哪个方法可以切分成ArcElement? 文档没搜到~
张老师,给否给个主要函数代码段?
if (el.ElementType == MSElementType.Ellipse)
{
EllipseElement elpsElement = el as EllipseElement;
var curveVector = Bentley.DgnPlatformNET.Elements.CurvePathQuery.ElementToCurveVector(el);
FacetOptions facetOptions = new FacetOptions();
facetOptions.AngleTolerance = 0.01;
CurveVector curveVectorStroked = curveVector.Stroke(facetOptions);
foreach (Bentley.GeometryNET.CurvePrimitive primitive in curveVectorStroked)
System.Collections.Generic.List<Bentley.GeometryNET.DPoint3d> strokePoints = new System.Collections.Generic.List<Bentley.GeometryNET.DPoint3d>();
if (primitive.TryGetLineString(strokePoints))
LinearElement ele = new Bentley.CifNET.LinearGeometry.LineString(strokePoints.ToArray());
}