Files
SzmediTools/Szmedi.Test/ElementModel.cs

173 lines
7.2 KiB
C#
Raw Normal View History

2025-09-16 16:06:41 +08:00

using Autodesk.Revit.DB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RevitAddins
{
internal class ElementModel
{
private readonly Element element;
private readonly EngineeringType engineeringType;
public string Category => element.GetParameters("深圳构件标识").FirstOrDefault()?.AsString() ?? "无";
public int Count => Parameters.Count;
public Dictionary<string, List<Parameter>> Groups
{
get
{
var groups = new Dictionary<string, List<Parameter>>();
foreach (Parameter parameter in Parameters)
{
string groupName = string.Empty;
var parameterName = parameter.Definition.Name;
switch (engineeringType)
{
case EngineeringType.Architecture:
//对Revit中的所有模型元素按照“深圳构件标识”属性的值进行分组分组后每个组中的元素都具有相同的“深圳构件标识”属性值。每个组都创建一张Sheet表格SheetName为“深圳构件标识”属性的值
//Revit第一行是深圳构件标识的属性值
//第二行是根据参数的名称,比如属性包含名称、编号、编码,则为身份信息,包含基点坐标则为定位信息,其余为技术信息
//第三行是Revit中的元素的“深圳构件标识”属性值对应的参数的名称
{
if (parameterName is "名称" or "编号" or "编码")
{
groupName = "身份信息";
}
else if (parameterName.Contains("基点坐标") || parameterName is "所在楼层" or "建筑单体名称")
{
groupName = "定位信息";
}
else if (parameterName.Contains("生产") || parameterName.Contains("产品") || parameterName.Contains("出厂"))
{
groupName = "生产信息";
}
else
{
groupName = "技术信息";
}
break;
}
case EngineeringType.Municipal:
{
//第二行是根据参数的名称,比如属性包含模型元素名称、编号、分类编码,则为身份信息,包含桩号范围、桥面高度、相对位置、梁底高程则为定位信息,包含长度、宽度、高度则为构造尺寸,其余为设计信息
if (parameterName is "模型元素名称" or "编号" or "分类编码")
{
groupName = "身份信息";
}
else if (parameterName is "桩号范围" or "桥面高度" or "相对位置" or "梁底高程")
{
groupName = "定位信息";
}
else if (parameterName is "长度" or "宽度" or "高度")
{
groupName = "构造尺寸";
}
else
{
groupName = "设计信息";
}
break;
}
default:
break;
}
if (!groups.ContainsKey(groupName))
{
groups[groupName] = new List<Parameter>();
}
groups[groupName].Add(parameter);
}
//对分组后的参数进行排序,排序按照名称、编号、分类编码、模型元素名称
//var sortedParameters = new Dictionary<string, List<Parameter>>();
//var paramOrder = new List<string>
//{
// "名称",
// "编号",
// "分类编码",
// "模型元素名称",
// "建筑单体名称",
// "所在楼层",
// "基点坐标X",
// "基点坐标Y",
// "基点坐标Z",
// "主要材料导热系数",
// "主要材料密度",
// "K 值",
// "耐火极限",
// "墙厚",
//};
foreach (var group in groups)
{
group.Value.Sort((x, y) => string.Compare(x.Definition.Name, y.Definition.Name, StringComparison.Ordinal));
}
//对分组进行排序,顺序是身份信息、定位信息、构造尺寸、设计信息、技术信息、生产信息
var sortedGroups = new Dictionary<string, List<Parameter>>();
var groupOrder = new List<string>
{
"身份信息",
"定位信息",
"构造尺寸",
"设计信息",
"技术信息",
"生产信息"
};
foreach (var groupName in groupOrder)
{
if (groups.ContainsKey(groupName))
{
sortedGroups[groupName] = groups[groupName];
}
}
//将排序后的分组添加到字典中
foreach (var group in groups)
{
if (!sortedGroups.ContainsKey(group.Key))
{
sortedGroups[group.Key] = group.Value;
}
}
return groups;
}
}
private List<Parameter> Parameters
{
get
{
var parameters = new List<Parameter>();
foreach (Parameter parameter in element.Parameters)
{
if (parameter.HasValue && parameter.Definition.ParameterGroup == BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES && !string.IsNullOrEmpty(parameter.AsString()))
{
parameters.Add(parameter);
}
}
return parameters;
}
}
public ElementModel(Element element, EngineeringType engineeringType)
{
this.element = element;
this.engineeringType = engineeringType;
}
}
enum EngineeringType
{
Architecture,
Municipal
}
}