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

295 lines
15 KiB
C#
Raw Permalink 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 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();//在内存中释放该文件
}
}
}
/// <summary>
/// 获取线样式
/// </summary>
/// <param name="lineStyleName"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 模型名称
/// </summary>
/// <param name="modelName"></param>
/// <returns></returns>
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声明模型类型NormalSheetDrawingDgnComponentDefinition
* is3D声明模型是三维还是二维模型
* seedModel声明模型所使用的种子文件
*/
DgnModel dgnModel = dgnFile.CreateNewModel(out DgnModelStatus createStatus, modelName, DgnModelType.Normal, true, null);//声明新模型
return dgnModel;//返回新建模型
}
/// <summary>
/// 设置图层材质
/// </summary>
/// <param name="levelName"></param>
/// <param name="materialTableName"></param>
/// <param name="paletteName"></param>
/// <param name="materialName"></param>
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);
}
/// <summary>
/// 创建材质
/// </summary>
/// <param name="paletteName">材料所在面板名称</param>
/// <param name="materialName">材料名称</param>
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;
}
/// <summary>
/// 创建材料表
/// </summary>
/// <param name="materialTableName">材料表名称</param>
/// <param name="materialName"></param>
/// <param name=""></param>
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);//保存材料表
}
/// <summary>
/// 创建文字样式
/// </summary>
/// <param name="textStyleName"></param>
/// <param name="fontName"></param>
/// <param name="fontWidth"></param>
/// <param name="fontHeight"></param>
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);//将文本样式添加到文件中
}
/// <summary>
/// 根据模型名称删除模型
/// </summary>
/// <param name="modelName">模型名称</param>
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);//从文件中删除该模型
}
}
/// <summary>
/// 获取dgn模型
/// </summary>
/// <param name="modelName">模型名称</param>
/// <returns></returns>
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读取获得对应的模型空间
}
/// <summary>
/// 获取ItemType
/// </summary>
/// <param name="dgnFile"></param>
/// <param name="itemLibName"></param>
/// <param name="itemTypeName"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 导入单元
/// </summary>
/// <param name="filePath">设置需要获取的单元名称</param>
/// <param name="cellName">设置单元库路径</param>
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<Element> 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();//将普通单元写入模型
}
/// <summary>
/// 读取dgn文件默认模型元素
/// </summary>
/// <param name="dgnFilePath"></param>
/// <returns></returns>
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);//将本文件另存到新建文件中
}
}
}
}
}