Files
MsAddIns/QuickModeling/ItemTypesHelpers.cs
2026-02-28 21:01:57 +08:00

185 lines
7.9 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.Collections.Generic;
using Bentley.DgnPlatformNET;
using Bentley.DgnPlatformNET.DgnEC;
using Bentley.DgnPlatformNET.Elements;
using Bentley.ECObjects.Instance;
using Bentley.MstnPlatformNET;
namespace QuickModeling
{
public class ItemTypesHelpers
{
/// <summary>
/// ItemTypeLibrary的获取或创建表现为一个分组的集合
/// </summary>
/// <param name="libName"></param>
/// <returns></returns>
public static ItemTypeLibrary GetOrCreateItemTypeLibrary(string libName)
{
var dgnFile = Session.Instance.GetActiveDgnFile();
ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(libName, dgnFile);
if (itemTypeLibrary != null)
{
return itemTypeLibrary;
}
return ItemTypeLibrary.Create(libName, dgnFile);
}
/// <summary>
/// 通过名称获取ItemTypes
/// </summary>
/// <param name="libName"></param>
/// <returns></returns>
public static IEnumerable<ItemType> GetItemTypes(string libName)
{
ItemTypeLibrary itemTypeLibrary = GetOrCreateItemTypeLibrary(libName);
return itemTypeLibrary.ItemTypes;
}
/// <summary>
/// 获取当前DGN文件中的所有ItemTypeLibrary
/// </summary>
/// <returns></returns>
public static IList<ItemTypeLibrary> GetItemTypeLibraries()
{
DgnFile dgnFile = Session.Instance.GetActiveDgnFile();
if (dgnFile != null)
{
return ItemTypeLibrary.PopulateListFromFile(dgnFile);
}
return null;
}
/// <summary>
/// 获取ItemType包含多个CustomProperty表现为属性分组
/// </summary>
/// <param name="itemLibName"></param>
/// <param name="itemTypeName"></param>
/// <returns></returns>
public static ItemType GetOrCreateItemType(string itemLibName, string itemTypeName)
{
ItemTypeLibrary itemTypeLibrary = GetOrCreateItemTypeLibrary(itemLibName);
ItemType itemType = itemTypeLibrary.GetItemTypeByName(itemTypeName);
if (itemType != null)
{
return itemType;
}
return itemTypeLibrary.AddItemType(itemTypeName);
}
/// <summary>
/// 获取ItemType包含多个CustomProperty表现为属性分组
/// </summary>
/// <param name="itemTypeLibrary"></param>
/// <param name="itemTypeName"></param>
/// <returns></returns>
public static ItemType GetOrCreateItemType(ItemTypeLibrary itemTypeLibrary, string itemTypeName)
{
ItemType itemType = itemTypeLibrary.GetItemTypeByName(itemTypeName);
if (itemType != null)
{
return itemType;
}
return itemTypeLibrary.AddItemType(itemTypeName);
}
/// <summary>
/// 添加参数到ItemType
/// </summary>
/// <param name="itemType"></param>
/// <param name="propertyName"></param>
/// <param name="kind"></param>
/// <param name="unit"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
public static bool AddPropertyToItemType(ItemType itemType, string propertyName, CustomProperty.TypeKind kind, WorkingUnit unit, object defaultValue)
{
CustomProperty property = itemType.AddProperty(propertyName);
property.Type = kind;
property.DefaultValue = defaultValue;
if (property.SupportsUnits)
{
property.Units = new DgnECUnit(unit); // 可以根据需要设置单位
}
return itemType.Library.Write(); // 确保更改被写入到库中
}
/// <summary>
/// 添加参数到ItemType不带单位
/// </summary>
/// <param name="itemType"></param>
/// <param name="propertyName"></param>
/// <param name="kind"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
public static bool AddPropertyToItemType(ItemType itemType, string propertyName, CustomProperty.TypeKind kind, object defaultValue)
{
CustomProperty property = itemType.AddProperty(propertyName);
property.Type = kind;
property.DefaultValue = defaultValue;
return itemType.Library.Write(); // 确保更改被写入到库中
}
/// <summary>
/// 获取ItemType的所有CustomProperty
/// </summary>
/// <param name="itemType"></param>
/// <returns></returns>
public static List<CustomProperty> GetProperties(ItemType itemType)
{
List<CustomProperty> properties = new List<CustomProperty>();
var props = itemType.GetEnumerator();
while (props.MoveNext())
{
CustomProperty prop = props.Current;
if (prop != null)
{
properties.Add(prop);
}
}
return properties;
}
///// <summary>
///// 添加ItemType到Model
///// </summary>
///// <param name="itemLibName"></param>
///// <param name="itemTypeName"></param>
//public static void AttachItemTypeToModel(string itemLibName, string itemTypeName)
//{
// DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前活动的模型
// CustomItemHost host = new CustomItemHost(dgnModel);//声明元素的CustomItemHost
// DgnFile dgnFile = Session.Instance.GetActiveDgnFile();
// ItemTypeLibrary ITL = ItemTypeLibrary.FindByName(itemLibName, dgnFile);
// ItemType itemType = ITL.GetItemTypeByName(itemTypeName);
// IDgnECInstance ecIns = host.GetCustomItem(itemLibName, itemTypeName);
// if (null == ecIns)
// ecIns = host.ApplyCustomItem(itemType, true); //对CustomItemHost应用ItemType得到EC实例
// CustomProperty myProp = itemType.GetPropertyByName("项目名称");
// ecIns.SetString(myProp.InternalName, "属性值");
// var s = ecIns.WriteChanges();
//}
/// <summary>
/// 挂接ItemType到元素
/// </summary>
/// <param name="elem"></param>
/// <param name="itemLibName"></param>
/// <param name="itemTypeName"></param>
public static IDgnECInstance AttachItemTypeToElement(Element elem, string itemLibName, string itemTypeName)
{
//DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
//DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
//根据声明名称获取对应的ItemType
ItemType itemType = GetOrCreateItemType(itemLibName, itemTypeName);
CustomItemHost host = new CustomItemHost(elem, true);//声明元素的CustomItemHost
IDgnECInstance ecIns = host.GetCustomItem(itemLibName, itemTypeName);
if (null == ecIns)
ecIns = host.ApplyCustomItem(itemType, true); //对CustomItemHost应用ItemType得到EC实例
//EditParameterDefinitions defs = EditParameterDefinitions.GetForModel(dgnModel);//获得模型中的参数定义
//DgnECInstanceEnabler enabler = DgnECManager.Manager.ObtainInstanceEnabler(dgnFile, itemType.ECClass);//获得文件中使用指定EC类的EC实例
//if (null != enabler && enabler.SupportsCreateInstanceOnElement)//判断是否是否支持对元素挂接EC实例
// defs.SetDomainParameters(enabler.SharedWipInstance);//对参数定义设置域参数
ecIns.ScheduleChanges(elem);//对元素更新ItemType信息
elem.ReplaceInModel(elem);
return ecIns;
}
}
}