using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using Bentley.DgnPlatformNET; using Bentley.DgnPlatformNET.Elements; using Bentley.GeometryNET; using Bentley.MstnPlatformNET; namespace Mstn.Toolkit.Helpers { public class DgnFileHelper { public static void CreateDgnFile(string filePath) { DgnDocument dgnDoc = DgnDocument.CreateForNewFile( out DgnFileStatus status, filePath, "", 0, "", DgnDocument.OverwriteMode.Always, DgnDocument.CreateOptions.Default);//用DgnDocument对象表示在文件中声明的新文件 if (dgnDoc != null)//判断文件是否声明成功 { StatusInt statusInt = dgnDoc.OnNewFileCreated();//声明文件后调用,允许文档管理器将文件添加到储存库中,若该文件只是临时文件则无需调用 if (statusInt == StatusInt.Success)//判断是否成功 { DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件信息 SeedData seed = new(dgnFile, dgnFile.DefaultModelId, SeedCopyFlags.AllData, false);//获得当前文中默认模型的种子信息 DgnFileOwner owner = DgnFile.CreateNew(out DgnFileStatus fileStatus, dgnDoc, DgnFileOpenMode.ReadWrite, seed, DgnFileFormatType.V8, true);//基于种子文件(可选),声明一个dgn文件 owner.Dispose();//在内存中释放该文件 } } } /// /// 获取线样式 /// /// /// public static LevelDefinitionLineStyle SetLineStyle(string lineStyleName) { DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的dgn文件 int num = LineStyleManager.GetNumberFromName(lineStyleName, dgnFile, true, true);//获得名为Simple 05 V2的线样式索引值 LevelDefinitionLineStyle lineStyle = new(num, null, dgnFile);//声明图层线样式索引 return lineStyle; } /// /// 模型名称 /// /// /// public static DgnModel CreateDgnModel(string modelName) { DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的dgn文件 ModelId id = dgnFile.FindModelIdByName(modelName);//检索文件中是否存在名为modelname引用字符串的模型 if (id != ModelId.InvalidModel)//判断模型ID是否有效 { DgnModel existModel = dgnFile.LoadRootModelById(out StatusInt status, id);//使用ID读取获得对应的模型空间 dgnFile.DeleteModel(existModel); } /* * 声明新模型 * error:(输出)若声明失败,则返回error * name:新声明模型的名称 * type:声明模型类型(Normal,Sheet,Drawing,DgnComponentDefinition) * is3D:声明模型是三维还是二维模型 * seedModel:声明模型所使用的种子文件 */ DgnModel dgnModel = dgnFile.CreateNewModel(out DgnModelStatus createStatus, modelName, DgnModelType.Normal, true, null);//声明新模型 return dgnModel;//返回新建模型 } /// /// 设置图层材质 /// /// /// /// /// public static void SetLevelWithMaterial(string levelName, string materialTableName, string paletteName, string materialName) { DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的dgn模型 FileLevelCache flc = dgnModel.GetFileLevelCache();//获得模型中的图层文件缓存 flc.Write();//将文件写入缓存 LevelHandle level = flc.GetLevelByName(levelName);//根据图层名称获得图层句柄 if (!level.IsValid)//判断图层是否有效(若图层无效在则为真) { EditLevelHandle elh = flc.CreateLevel(levelName);//声明名为levelName的图层 } var material = CreateMaterial(paletteName, materialName);//声明材料 AssignMaterial(materialTableName, material.Name, levelName); } /// /// 创建材质 /// /// 材料所在面板名称 /// 材料名称 public static Material CreateMaterial(string paletteName, string materialName) { DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的dgn文件 DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的dgn模型 Material material = new(dgnModel) { Name = materialName//设置材料名称 };//声明材料 PaletteInfo info = material.GetPalette();//设置材料所在面板信息 info.Name = paletteName;//设置材料所在面板名称 info.SetSource(dgnFile.GetDocument().GetMoniker());//设置面板源文件域 info.Type = PaletteInfo.PaletteType.Dgn;//设置面板类型 MaterialManager.SaveMaterial(null, material, dgnFile);//保存材料信息 return material; } /// /// 创建材料表 /// /// 材料表名称 /// /// public static void AssignMaterial(string materialTableName, string materialName, string levelName) { DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的dgn文件 MaterialTable createdTable = new(dgnFile) { Name = materialTableName,//设置材料表名称 };//声明材料表 MaterialId materialId = new(materialName);//声明材料ID createdTable.AddAssignment(new MaterialAssignment(materialId, levelName, 0, createdTable.GetRenderDgn()));//将材料分配信息添加到表中 MaterialManager.SaveTable(createdTable);//保存材料表 } /// /// 创建文字样式 /// /// /// /// /// public static void CreateTextStyle(string textStyleName, string fontName, double fontWidth, double fontHeight) { DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的dgn文件 DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得声明文本元素的模型空间 double uorMeter = dgnModel.GetModelInfo().UorPerMeter;//获得当前模型中的单位 DgnTextStyle textStyle = new(textStyleName, dgnFile);//声明文本样式 DgnFont font = DgnFontManager.FindSystemFont(fontName, DgnFontFilterFlags.All);//获得名为"KaiTi"的字体 textStyle.SetFontProperty(TextStyleProperty.Font, font);//设置字体 textStyle.SetProperty(TextStyleProperty.Width, fontWidth * uorMeter);//设置文本宽度 textStyle.SetProperty(TextStyleProperty.Height, fontHeight * uorMeter);//设置文本高度 textStyle.Add(dgnFile);//将文本样式添加到文件中 } /// /// 根据模型名称删除模型 /// /// 模型名称 public static void DeleteDgnModel(string modelName) { DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的dgn文件 ModelId id = dgnFile.FindModelIdByName(modelName); DgnModel dgnModel = dgnFile.LoadRootModelById(out StatusInt status, id);//使用ID读取获得对应的模型空间 if (status == StatusInt.Success)//判断是否获得名为“test”的模型 { StatusInt statusInt = dgnFile.DeleteModel(dgnModel);//从文件中删除该模型 } } /// /// 获取dgn模型 /// /// 模型名称 /// public static DgnModel GetDgnModel(string modelName) { DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的dgn文件 ModelId id = dgnFile.FindModelIdByName(modelName); return dgnFile.LoadRootModelById(out StatusInt status, id);//使用ID读取获得对应的模型空间 } /// /// 获取ItemType /// /// /// /// /// public static ItemType GetItemType(string itemLibName, string itemTypeName) { DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的dgn文件 ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(itemLibName, dgnFile);//根据声明名称获取对应的ItemTypeLibrary ItemType itemType = itemTypeLibrary.GetItemTypeByName(itemTypeName); return itemType; } /// /// 导入单元 /// /// 设置需要获取的单元名称 /// 设置单元库路径 public static void ImportCellElement(string filePath, string cellName) { DgnDocument document = DgnDocument.CreateForLocalFile(filePath);//根据路径获取单元库文件 DgnFileOwner owner = DgnFile.Create(document, DgnFileOpenMode.ReadOnly);//声明可读取文件信息的DgnFile对象 DgnFile cellFile = owner.DgnFile;//获得读取文件信息的对象 cellFile.LoadDgnFile(out StatusInt fileLoadStatus);//读取文件信息 if (fileLoadStatus == StatusInt.Error)//若读取失败则返回 { return; } ModelId id = cellFile.FindModelIdByName(cellName);//根据单元名称获取对应单元的模型ID DgnModel cellModel = cellFile.LoadRootModelById(out StatusInt modelLoadStatus, id);//根据模型ID获取对应的模型空间 if (modelLoadStatus == StatusInt.Error)// 若读取失败则返回 { return; } DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前激活的模型 List elems = [];//声明单元子元素列表 foreach (Element elem in cellModel.GetElements())//对普通单元的模型进行遍历 { if (elem.IsGraphics)//将单元中的子元素添加到列表中 { elems.Add(elem); } } CellHeaderElement cellHeaderElem = CellHeaderElement.CreateOrphanCellElement(dgnModel, cellName, elems);//使用子元素声明普通单元 DTransform3d trans = DTransform3d.FromMatrixAndFixedPoint(DMatrix3d.Identity, DPoint3d.Zero);//声明几何变换 TransformInfo transform = new(trans);//声明变换信息 cellHeaderElem.ApplyTransform(transform);//对普通单元应用变换 cellHeaderElem.AddToModel();//将普通单元写入模型 } /// /// 读取dgn文件默认模型元素 /// /// /// public static ModelElementsCollection ReadDgnFile(string dgnFilePath) { DgnDocument dgnDoc = DgnDocument.CreateForLocalFile(dgnFilePath);//声明DgnDocument对象 DgnFileOwner dgnFileOwner = DgnFile.Create(dgnDoc, DgnFileOpenMode.ReadOnly);//声明一个用于加载部分文件的DgnFile,控制DgnFile的生存期 DgnFile dgnFile = dgnFileOwner.DgnFile;//获得已加载的DgnFile dgnFile.LoadDgnFile(out StatusInt errorStatus);//读取加载DgnFile dgnFile.FillDictionaryModel();//确定已填充模型字典(非模型区,保存各种内置对象,如图层、样式等) DgnModel dgnModel = dgnFile.LoadRootModelById(out errorStatus, dgnFile.DefaultModelId);//根据模型ID读取文件中的指定模型 return dgnModel.GetGraphicElements();//获得模型中的所有图形元素 } public static void SaveAsDgnFile(string filePath)//Case:test { /* * 用DgnDocument对象表示在文件中声明的新文件 * status:若返回空,则有可能为:文件已存在,但未指定覆盖或无法覆盖 * documentName:声明文件的文件名称 * searchPath:用于设置搜索的基本路径,可为空,他包含一个或多个配置变量,目录路径或文件路径 * defFileId:表示声明的文件类型 * wDefaultFileName:指定根据名称查找现有文件时使用的默认驱动器,路径,文件名或扩展名 * overwriteMode:指定当文件存在时要执行的操作 * options:声明类型 */ DgnDocument dgnDoc = DgnDocument.CreateForNewFile( out DgnFileStatus status, filePath, "", 0, "", DgnDocument.OverwriteMode.Always, DgnDocument.CreateOptions.Default); if (dgnDoc != null)//判断文件是否声明成功 { StatusInt statusInt = dgnDoc.OnNewFileCreated();//声明文件后调用,允许文档管理器将文件添加到储存库中,若该文件只是临时文件则无需调用 if (statusInt == StatusInt.Success)//判断是否成功 { DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件信息 statusInt = dgnFile.DoSaveAs(dgnDoc, DgnFileFormatType.V8, true, false);//将本文件另存到新建文件中 } } } } }