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 { /// /// 获得当前模型中的所有图形元素 /// /// /// 包含嵌套、成组的元素,会重复 /// public static ModelElementsCollection OfModelElements(this DgnModel dgnModel) { return dgnModel.GetGraphicElements(); } /// /// 过滤出智能实体 /// /// /// public static List OfSmartSolid(this DgnModel dgnModel) { return dgnModel.OfModelElements() .Where(elem => elem.ElementType == MSElementType.CellHeader && elem.TypeName.Contains("Smart Solid")) .ToList(); } /// /// 过滤出参数化几何 /// /// public static List OfParametericElements(this DgnModel dgnModel) { return dgnModel.OfModelElements() .Where(elem => (int)elem.ElementType == 106 && elem.TypeName == "Parametric Solid/Surface") .ToList(); } /// /// 过滤出嵌套元素 /// /// /// public static List OfNestingElements(this DgnModel dgnModel) { return dgnModel.OfModelElements() .Where(elem => elem.ElementType == MSElementType.Solid && elem.IsInvisible == false)//根据元素类型为Solid和元素是否可见判断(注:该筛选方案不严谨,因有方法可修改元素是否可见) .ToList(); } public static List 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; } /// /// 复制当前模型所有信息到目标模型 /// /// 当前 /// 目标模型 /// 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();//将元素写入模型 } /// /// 复制元素 /// /// 目标模型 /// 不在目标模型中元素 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);//将元素复制到指定模型中 } } } } /// /// 引用模型文件 /// /// /// 引用的文件dgn,dwg /// 引用的模型名称,dgn时,需要设置modelName /// 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);//将引用写入模型 } /// /// 分离dgn引用 /// /// /// /// 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(); } } }