Files
SzmediTools/Szmedi.Test/ElementModel.cs
2025-09-16 16:06:41 +08:00

173 lines
7.2 KiB
C#
Raw 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 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
}
}