Files
MsAddIns/Mstn.Toolkit/Extensions/ElementExtensions.cs
2026-02-28 21:01:57 +08:00

257 lines
9.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
{
/// <summary>
/// 元素应用变换
/// </summary>
/// <param name="elem"></param>
/// <param name="transform3D"></param>
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);
}
/// <summary>
/// 提取曲面边界点
/// </summary>
/// <param name="eleMesh"></param>
/// <returns></returns>
public static HashSet<DPoint3d> ExtractBoundaryPoints(Element eleMesh)
{
var listPtNew = new HashSet<DPoint3d>();
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;
}
/// <summary>
/// 设置颜色
/// </summary>
/// <param name="element"></param>
/// <param name="colorIndex"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 获取元素的图层,如果是一般单元,则按第一个子元素来获取
/// </summary>
/// <param name="element"></param>
/// <returns></returns>
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);
}
/// <summary>
/// 设置元素图层
/// </summary>
/// <param name="element"></param>
/// <param name="leveName"></param>
/// <remarks>图层名不存在时,则创建</remarks>
/// <returns></returns>
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;
}
/// <summary>
/// 获取元素的长度
/// </summary>
/// <param name="elem">元素</param>
/// <returns>长度值单位mm</returns>
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);
}
/// <summary>
/// 获取元素的CurveVector
/// </summary>
/// <returns></returns>
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;
}
/// <summary>
/// 获取元素中的圆弧
/// </summary>
/// <param leveName="elem"></param>
/// <returns>若没有,则返回空列表</returns>
public static List<DEllipse3d> GetArcs(this Element elem)
{
var list = new List<DEllipse3d>();
foreach (var child in elem.GetCurveVector())
{
if (child.GetCurvePrimitiveType() == CurvePrimitive.CurvePrimitiveType.Arc)
{
child.TryGetArc(out var arc);
list.Add(arc);
}
}
return list;
}
/// <summary>
/// 获取元素中线
/// </summary>
/// <param leveName="elem"></param>
/// <returns></returns>
public static List<DSegment3d> GetLines(this Element elem)
{
var list = new List<DSegment3d>();
foreach (var child in elem.GetCurveVector())
{
if (child.GetCurvePrimitiveType() == CurvePrimitive.CurvePrimitiveType.Arc)
{
child.TryGetLine(out var line);
list.Add(line);
}
}
return list;
}
}
}