using System; using System.Collections.Generic; using System.Linq; using Bentley.DgnPlatformNET; using Bentley.DgnPlatformNET.Elements; using Bentley.GeometryNET; using Bentley.MstnPlatformNET; using Mstn.Toolkit.Extensions; namespace Mstn.Toolkit.Extensions { public static class ElementExtensions { /// /// 元素应用变换 /// /// /// public static void MakeTransform(this Element elem, DTransform3d transform3D) { Element newElement = Element.GetFromElementRef(elem.GetNativeElementRef()); TransformInfo info = new TransformInfo(transform3D); newElement.ApplyTransform(info); newElement.ReplaceInModel(elem); } /// /// 提取曲面边界点 /// /// /// public static HashSet ExtractBoundaryPoints(Element eleMesh) { var listPtNew = new HashSet(); var query = MeshQuery.GetAsMeshQuery(eleMesh); PolyfaceHeader faceHeader = query.GetMeshData(); if (faceHeader.IsClosedByEdgePairing) { foreach (var item in faceHeader.Point) { listPtNew.Add(item); } } else { var face = PolyfaceHeader.RemoveDuplicateFaces(faceHeader, true); var curVector = face.ExtractBoundaryStrings(out var openPaths, out int closedPaths); foreach (var item in face.Point) { listPtNew.Add(item); } } return listPtNew; } /// /// 设置颜色 /// /// /// /// public static Element SetSolidColor(this Element element, uint colorIndex) { if (element.ElementType == MSElementType.Solid)//判断元素类型是否为Solid { ElementPropertiesSetter setter = new ElementPropertiesSetter();//修改元素属性 setter.SetColor(colorIndex);//设置索引值colorIndex的颜色为元素颜色 setter.Apply(element);//将设置应用于指定元素 return element; } return null; } /// /// 获取元素的图层,如果是一般单元,则按第一个子元素来获取 /// /// /// public static LevelHandle GetLevel(this Element element) { ElementPropertiesGetter getter = new ElementPropertiesGetter(element); var lvlcache = Session.Instance.GetActiveDgnFile().GetLevelCache(); //一般单元 if (element.GetChildren().Count() > 0) { foreach (var elem in element.GetChildren()) { if (elem is DisplayableElement && !elem.IsInvisible) { return elem.GetLevel(); } } } return lvlcache.GetLevel(getter.Level, true); } /// /// 设置元素图层 /// /// /// /// 图层名不存在时,则创建 /// public static Element SetLevel(this Element element, string leveName) { Element oldElem = Element.GetFromElementRef(element.GetNativeElementRef()); if (string.IsNullOrEmpty(leveName)) { return element; } //获取指定名层 DgnFile dgnfile = Session.Instance.GetActiveDgnFile(); FileLevelCache lvlCache = dgnfile.GetLevelCache(); LevelHandle lvlHandle = lvlCache.GetLevelByName(leveName); if (!lvlHandle.IsValid)//当前文件中不存在时创建 { lvlCache.CreateLevel(leveName); lvlCache.Write(); lvlHandle = lvlCache.GetLevelByName(leveName); } //设置元素的层属性写入模型中 ElementPropertiesSetter eleSet = new ElementPropertiesSetter(); eleSet.SetLevel(lvlHandle.LevelId); eleSet.Apply(element); element.ReplaceInModel(oldElem); return element; } /// /// 获取元素的长度 /// /// 元素 /// 长度值,单位mm public static double GetLength(this Element elem) { double length = default; if (elem is LineElement line) { length = line.GetCurveVector().SumOfLengths(); } if (elem is ComplexStringElement complexString) { length = complexString.GetCurveVector().SumOfLengths(); } if (elem is LineStringBaseElement lineStringBase) { length = lineStringBase.GetCurveVector().SumOfLengths(); } if (elem is EllipseElement ellipseElement) { length = ellipseElement.GetCurveVector().SumOfLengths(); } //if (elem is LineStringElement lineString) //{ // curve = lineString.GetCurveVector().SumOfLengths(); // //GetFilteredECPropValue(lineString, "ID-100-名称"); //} //if (elem is ShapeElement shape) //{ // curve = shape.GetCurveVector().SumOfLengths(); //} if (elem is ComplexShapeElement complexShape) { length = complexShape.GetCurveVector().SumOfLengths(); } if (elem is BSplineCurveElement bSplineCurve) { length = bSplineCurve.GetCurveVector().SumOfLengths(); } return Math.Round(length, MidpointRounding.AwayFromZero); } /// /// 获取元素的CurveVector /// /// public static CurveVector GetCurveVector(this Element elem) { CurveVector curve = default; if (elem is LineElement line) { curve = line.GetCurveVector(); } if (elem is ComplexStringElement complexString) { curve = complexString.GetCurveVector(); } if (elem is LineStringBaseElement lineStringBase) { curve = lineStringBase.GetCurveVector(); } if (elem is EllipseElement ellipseElement) { curve = ellipseElement.GetCurveVector(); } //if (elem is LineStringElement lineString) //{ // curve = lineString.GetCurveVector(); // //GetFilteredECPropValue(lineString, "ID-100-名称"); //} //if (elem is ShapeElement shape) //{ // curve = shape.GetCurveVector(); //} if (elem is ComplexShapeElement complexShape) { curve = complexShape.GetCurveVector(); } if (elem is BSplineCurveElement bSplineCurve) { curve = bSplineCurve.GetCurveVector(); } return curve; } /// /// 获取元素中的圆弧 /// /// /// 若没有,则返回空列表 public static List GetArcs(this Element elem) { var list = new List(); foreach (var child in elem.GetCurveVector()) { if (child.GetCurvePrimitiveType() == CurvePrimitive.CurvePrimitiveType.Arc) { child.TryGetArc(out var arc); list.Add(arc); } } return list; } /// /// 获取元素中线 /// /// /// public static List GetLines(this Element elem) { var list = new List(); foreach (var child in elem.GetCurveVector()) { if (child.GetCurvePrimitiveType() == CurvePrimitive.CurvePrimitiveType.Arc) { child.TryGetLine(out var line); list.Add(line); } } return list; } } }