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;
}
}
}