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> Groups { get { var groups = new Dictionary>(); 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(); } groups[groupName].Add(parameter); } //对分组后的参数进行排序,排序按照名称、编号、分类编码、模型元素名称 //var sortedParameters = new Dictionary>(); //var paramOrder = new List //{ // "名称", // "编号", // "分类编码", // "模型元素名称", // "建筑单体名称", // "所在楼层", // "基点坐标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>(); var groupOrder = new List { "身份信息", "定位信息", "构造尺寸", "设计信息", "技术信息", "生产信息" }; 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 Parameters { get { var parameters = new List(); 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 } }