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

298 lines
13 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.IO;
using System.Text;
using System.Windows;
//using Bentley.DgnPlatform;
using Bentley.DgnPlatformNET;
using Bentley.DgnPlatformNET.DgnEC;
using Bentley.DgnPlatformNET.Elements;
using Bentley.ECObjects.Instance;
using Bentley.ECObjects.Schema;
using Bentley.ECObjects.XML;
using Bentley.MstnPlatformNET;
using Mstn.Toolkit.Extensions;
namespace Mstn.Toolkit.Extensions
{
/// <summary>
/// EC扩展类
/// </summary>
/// <remarks>
//ECRepository 就相当于某某项目施工图项目阶段/整个数据库系统
//ECSchema 就相当于结构专业/数据库的定义 ItemTypesLibrary包含多个ItemType
//ecClass 就相当于结构柱明细表/数据库中表的定义 ItemType包含多个ECProperty
//ECProperty 就相当于结构柱属性定义(钢筋型号,混凝土强度,混凝土保护层厚度)/表结构中每一列的定义
//ECInstance 就相当于指定某个结构柱/每个表中的每一行
//ECPropertyValue 就相当于该结构柱的属性值如钢筋混凝土强度为C40钢筋型号HRB400混凝土保护层厚度取35/每一行中的每一个单元
//ECClass加上所产生的ECInstances 就相当于该项目的柱明细表/一个数据库所有的表格
/// </remarks>
public static class EngineeringContentExtensions
{
/// <summary>
/// 挂接ItemType到元素
/// </summary>
/// <param name="elem"></param>
/// <param name="itemLibName"></param>
/// <param name="itemTypeName"></param>
public static void AttachItemType(this Element elem, string itemLibName, string itemTypeName)
{
DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
//根据声明名称获取对应的ItemType
ItemType itemType = GetItemType(itemLibName, itemTypeName);
CustomItemHost host = new CustomItemHost(elem, true);//声明元素的CustomItemHost
//实例化
IDgnECInstance item = 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);//对参数定义设置域参数
item.ScheduleChanges(elem);//对元素更新ItemType信息
elem.ReplaceInModel(elem);
}
/// <summary>
/// 定义Schema
/// </summary>
/// <returns></returns>
public static IECSchema DefineECSchema()
{
IECSchema schema = new ECSchema("ComplexSchema2", 1, 1, "");//声明ECSchema
//create the Project class
ECClass prjClass = new ECClass("ProjectClass");//创建EC类
prjClass.Add(new ECProperty("ProjectID", Bentley.ECObjects.ECObjects.IntegerType));//在EC类中添加EC属性
prjClass.Add(new ECProperty("ProjectName", Bentley.ECObjects.ECObjects.StringType));//在EC类中添加EC属性
prjClass.Add(new ECProperty("ProjectCost", Bentley.ECObjects.ECObjects.DoubleType));//在EC类中添加EC属性
prjClass.IsCustomAttribute = false;//设置EC类是否为自定义属性
prjClass.IsDomainClass = true;//设置EC类是否是域类
schema.AddClass(prjClass);//在ECSchema中添加EC类
//create the Member class
ECClass memberClass = new ECClass("MemberClass");//声明EC类
memberClass.Add(new ECProperty("MemberName", Bentley.ECObjects.ECObjects.StringType));//在EC类中添加EC属性
memberClass.Add(new ECProperty("MemberID", Bentley.ECObjects.ECObjects.IntegerType));//在EC类中添加EC属性
memberClass.Add(new ECProperty("MemberRole", Bentley.ECObjects.ECObjects.StringType));//在EC类中添加EC属性
memberClass.IsCustomAttribute = false;//设置EC类是否为自定义属性
memberClass.IsDomainClass = true;//设置EC类是否是域类
schema.AddClass(memberClass);//在ECSchema中添加EC类
return schema;//返回ECSchema
}
/// <summary>
/// 元素之间传递ItemTypes及值
/// </summary>
/// <param name="source"></param>
/// <param name="target"></param>
public static void DeliverItemTypesTo(this Element source, Element target)
{
CustomItemHost host = new CustomItemHost(source, true);//声明元素的CustomItemHost
var instances = host.CustomItems;
//List<ItemType> list = new List<ItemType>();
foreach (var instance in instances)
{
var ecClass = instance.ClassDefinition;//ItemTypes
var lib = ecClass.Schema;//ItemTypesLibrary
target.AttachItemType(lib.DisplayLabel, ecClass.DisplayLabel);
if (instance.ContainsValues)
{
foreach (var propValue in instance)
{
if (propValue.TryGetNativeValue(out var value))
{
var prop = propValue.Property;
target.SetECPropertyValues(prop.DisplayLabel, value);
}
}
}
}
}
/// <summary>
/// 获取元素的所有属性
/// </summary>
/// <param name="element"></param>
public static StringBuilder ReadAllProperties(this Element element)
{
if (null == element)
{
MessageBox.Show("所提供ElemId无效");
return null;
}
StringBuilder sb = new StringBuilder();
DgnECManager ecManager = DgnECManager.Manager;
int count = 0;
DgnECInstanceCollection instCol = ecManager.GetElementProperties(element, ECQueryProcessFlags.SearchAllClasses);
foreach (IDgnECInstance inst in instCol)
{
count++;
sb.AppendLine($"----ECInstance{count}[{inst.ClassDefinition.Name}]");
IEnumerator<IECProperty> propertyEnum = inst.ClassDefinition.GetEnumerator();
while (propertyEnum.MoveNext())
{
IECPropertyValue propertyValue = inst.GetPropertyValue(propertyEnum.Current.Name);
if (propertyValue.IsArray)
{
IECArrayValue arrayVal = propertyValue as IECArrayValue;
if (arrayVal.Count >= 1)
propertyValue = arrayVal[0];
}
var prop = propertyEnum.Current.Name;
ECNameValidation.DecodeFromValidName(ref prop);
//if (prop == "Level")
//{
//}
if (propertyValue.TryGetStringValue(out var strVal))
{
sb.AppendLine($"Property={prop}, Value={strVal}");
}
else if (propertyValue.TryGetDoubleValue(out var dblVal))
sb.AppendLine($"Property={prop}, Value={dblVal}");
else if (propertyValue.TryGetIntValue(out var intVal))
sb.AppendLine($"Property={prop}, Value={intVal}");
}
}
//MessageBox.Show(sb.ToString());
return sb;
}
/// <summary>
/// 获取Attach引用的属性ItemType属性
/// </summary>
/// <param name="elem">元素</param>
/// <param name="propName">属性名</param>
/// <returns></returns>
public static List<IECPropertyValue> GetAttachedProperties(this Element elem, string propName)
{
var host = new CustomItemHost(elem, false).CustomItems;
List<IECPropertyValue> values = new List<IECPropertyValue>();
foreach (var instance in host)
{
if (instance.ContainsValues)
{
foreach (var prop in instance)
{
if (prop.Property is ECProperty p && p.DisplayLabel == propName)
{
values.Add(prop);
}
}
}
}
return values;
}
/// <summary>
/// 获取ItemType包含多个CustomProperty
/// </summary>
/// <param name="itemLibName"></param>
/// <param name="itemTypeName"></param>
/// <returns></returns>
private static ItemType GetItemType(string itemLibName, string itemTypeName)
{
DgnFile dgnFile = Session.Instance.GetActiveDgnFile();
//根据声明名称获取对应的ItemTypeLibrary
ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(itemLibName, dgnFile);
return itemTypeLibrary?.GetItemTypeByName(itemTypeName);
}
/// <summary>
/// 获取所有属性
/// </summary>
/// <param name="element"></param>
public static List<IECPropertyValue> GetProperyValues(this Element element, string propName)
{
if (null == element)
{
throw new ArgumentNullException(nameof(element), "所提供ElemId无效");
}
List<IECPropertyValue> eCProperties = new List<IECPropertyValue>();
DgnECManager ecManager = DgnECManager.Manager;
int count = 0;
DgnECInstanceCollection instCol = ecManager.GetElementProperties(element, ECQueryProcessFlags.SearchAllClasses);
foreach (IDgnECInstance inst in instCol)
{
count++;
IEnumerator<IECProperty> propertyEnum = inst.ClassDefinition.GetEnumerator();
while (propertyEnum.MoveNext())
{
IECPropertyValue propertyValue = inst.GetPropertyValue(propertyEnum.Current.Name);
if (propertyValue == null)
{
continue;
}
if (propertyValue.IsArray)
{
IECArrayValue arrayVal = propertyValue as IECArrayValue;
if (arrayVal.Count >= 1)
propertyValue = arrayVal[0];
}
var prop = propertyEnum.Current.Name;
ECNameValidation.DecodeFromValidName(ref prop);
var displayLabel = propertyEnum.Current.DisplayLabel;
if (propName == prop || displayLabel == propName)
{
eCProperties.Add(propertyValue);
}
}
}
return eCProperties;
}
/// <summary>
/// 获取属性值
/// </summary>
/// <param name="propertyValue"></param>
/// <returns></returns>
public static object GetValue(this IECPropertyValue propertyValue)
{
//解码属性名称
propertyValue.TryGetNativeValue(out var value);
return value;
}
/// <summary>
/// 通过属性名设置属性值,多个同名属性会同时设置
/// </summary>
/// <param name="elem">元素</param>
/// <param name="propName">属性名</param>
/// <returns></returns>
public static void SetECPropertyValues(this Element elem, string propName, object value)
{
var instances = new CustomItemHost(elem, false).CustomItems;
try
{
foreach (var instance in instances)
{
instance.SetValue(propName, value);
instance.WriteChanges();
}
}
catch (Exception)
{
}
}
/// <summary>
/// 设置元素属性的Items中的属性值
/// </summary>
/// <param name="itemType"></param>
/// <param name="propName"></param>
/// <param name="value"></param>
public static void SetItemTypeProp(this IDgnECInstance ecIns, string propName, object value)
{
ecIns.SetValue(propName, value);
ecIns.WriteChanges();
}
}
}