Files
MsAddIns/Mstn.Toolkit/Helpers/DgnFileHelper.cs

295 lines
15 KiB
C#
Raw Permalink Normal View History

2026-02-28 21:01:57 +08:00
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);
}
/*
*
* errorerror
* name
* typeNormalSheetDrawingDgnComponentDefinition
* 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);//将本文件另存到新建文件中
}
}
}
}
}