148 lines
6.2 KiB
C#
148 lines
6.2 KiB
C#
|
|
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">引用的文件dgn,dwg</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();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|