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

148 lines
6.2 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 System.Text;
using System.Threading.Tasks;
using Bentley.DgnPlatformNET;
using Bentley.DgnPlatformNET.Elements;
using Bentley.GeometryNET;
namespace Mstn.Toolkit.Extensions
{
internal static class DgnModelExtensions
{
/// <summary>
/// 获得当前模型中的所有图形元素
/// </summary>
/// <param name="dgnModel"></param>
/// <remarks>包含嵌套、成组的元素,会重复</remarks>
/// <returns></returns>
public static ModelElementsCollection OfModelElements(this DgnModel dgnModel)
{
return dgnModel.GetGraphicElements();
}
/// <summary>
/// 过滤出智能实体
/// </summary>
/// <param name="dgnModel"></param>
/// <returns></returns>
public static List<Element> OfSmartSolid(this DgnModel dgnModel)
{
return dgnModel.OfModelElements()
.Where(elem => elem.ElementType == MSElementType.CellHeader && elem.TypeName.Contains("Smart Solid"))
.ToList();
}
/// <summary>
/// 过滤出参数化几何
/// </summary>
/// <param name="dgnModel"></param>
public static List<Element> OfParametericElements(this DgnModel dgnModel)
{
return dgnModel.OfModelElements()
.Where(elem => (int)elem.ElementType == 106 && elem.TypeName == "Parametric Solid/Surface")
.ToList();
}
/// <summary>
/// 过滤出嵌套元素
/// </summary>
/// <param name="dgnModel"></param>
/// <returns></returns>
public static List<Element> OfNestingElements(this DgnModel dgnModel)
{
return dgnModel.OfModelElements()
.Where(elem => elem.ElementType == MSElementType.Solid && elem.IsInvisible == false)//根据元素类型为Solid和元素是否可见判断该筛选方案不严谨因有方法可修改元素是否可见
.ToList();
}
public static List<Element> OfLevelElements(this DgnModel model, string levelName)
{
var level1 = model.GetLevelCache().GetLevelByName(levelName);
var fjj = model.GetElements().Where(e => e.LevelId == level1.LevelId).ToList();
return fjj;
}
/// <summary>
/// 复制当前模型所有信息到目标模型
/// </summary>
/// <param name="dgnModel">当前</param>
/// <param name="targetDgnModel">目标模型</param>
/// <returns></returns>
public static BentleyStatus CopyAllTo(this DgnModel dgnModel, DgnModel targetDgnModel)
{
return DgnFile.CopyModelContents(targetDgnModel, dgnModel);//将test1中的所有信息复制到test2中
}
public static void CreateSweep(this DgnModel dgnModel, CurveVector curve, CurveVector pathCurve)
{
Create.BodyFromSweep(out SolidKernelEntity entityOut, curve, pathCurve, dgnModel, false, true, false,
null, null, null, null);//使用横截面扫掠路径声明实体
BentleyStatus result = Convert1.BodyToElement(out Element eeh, entityOut, null, dgnModel);//将SolidKernelEntity转换为元素
eeh.AddToModel();//将元素写入模型
}
/// <summary>
/// 复制元素
/// </summary>
/// <param name="targetDgnModel">目标模型</param>
/// <param name="elements">不在目标模型中元素</param>
public static void ToCopy(this DgnModel targetDgnModel, params Element[] elements)
{
foreach (Element elem in elements)//遍历元素容器中的元素
{
using (ElementCopyContext copyContext = new(targetDgnModel))//复制元素
{
if (elem.DgnModel.GetModelId() != targetDgnModel.GetModelId())
{
copyContext.DoCopy(elem);//将元素复制到指定模型中
}
}
}
}
/// <summary>
/// 引用模型文件
/// </summary>
/// <param name="dgnModel"></param>
/// <param name="filePath">引用的文件dgndwg</param>
/// <param name="modelName">引用的模型名称dgn时需要设置modelName</param>
/// <returns></returns>
public static StatusInt AttachFile(this DgnModel dgnModel, string filePath, string modelName = null)
{
DgnDocumentMoniker moniker = DgnDocumentMoniker.CreateFromFileName(filePath, null);//声明引用文件系统的DgnDocumentMoniker对象
DgnAttachment attach = dgnModel.CreateDgnAttachment(moniker, modelName);//将指定模型引用到当前模型空间中
return attach.WriteToModel(false);//将引用写入模型
}
/// <summary>
/// 分离dgn引用
/// </summary>
/// <param name="dgnModel"></param>
/// <param name="modelName"></param>
/// <returns></returns>
public static StatusInt DetachDgnModel(this DgnModel dgnModel, string modelName)
{
DgnAttachmentCollection attachments = dgnModel.GetDgnAttachments();//获得该模型空间中所有的参照
foreach (DgnAttachment attachment in attachments)//遍历模型空间中的所有参照
{
if (attachment.AttachModelName == modelName)//判断参照的模型名称
{
return dgnModel.DeleteDgnAttachment(attachment);//删除模型中的指定参照
}
}
return StatusInt.Error;
}
public static EditLevelHandle GetOrCreateLevel(this DgnModel dgnModel, string levelName)
{
FileLevelCache flc = dgnModel.GetFileLevelCache();//获得模型中的图层文件缓存
flc.Write();//将文件写入缓存
var level = flc.GetLevelByName(levelName);
if (!level.IsValid)//判断图层是否有效(若图层无效在则为真)
{
return flc.CreateLevel(levelName);//声明名为levelName的图层
}
return level.GetEditHandle();
}
}
}