295 lines
15 KiB
C#
295 lines
15 KiB
C#
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:声明模型类型(Normal,Sheet,Drawing,DgnComponentDefinition)
|
||
* 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);//将本文件另存到新建文件中
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|