Files
SzmediTools/Szmedi.RvKits/InfoManager/AFCA/ApprovalViewModel.cs
2025-09-16 16:06:41 +08:00

885 lines
34 KiB
C#

using System.Collections.ObjectModel;
using System.Data.SQLite;
using System.Linq;
using System.Windows;
using System.Windows.Controls.Primitives;
using Autodesk.Revit.DB;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Dapper;
using Dapper.Contrib.Extensions;
using Nice3point.Revit.Toolkit.External.Handlers;
using Szmedi.RvKits.InfoManager.Delivery;
namespace Szmedi.RvKits.InfoManager.AFCA
{
public partial class ApprovalViewModel : ObservableObject
{
private readonly ActionEventHandler handler;
private readonly SQLiteConnection cnn;
[ObservableProperty]
private ObservableCollection<PropertyBase> properties;
//[ObservableProperty]
//private MetroPropTable baseTable;
private const string id = "深圳构件标识";
private const string code = "AM-100-EAM分类编码";
//[ObservableProperty]
//private List<MetroPropTable> metroPropTables;
[ObservableProperty] private List<ClassificationModel> classHierarchicalData;
[ObservableProperty] private Dictionary<string, List<Element>> keyValues;
private readonly List<ClassificationModel> allClassifications;
private readonly IEnumerable<MetroBaseProperty> baseProps;
public ApprovalViewModel(SQLiteConnection cnn)
{
this.cnn = cnn;
handler = new ActionEventHandler();
//获取基本属性。
ClassHierarchicalData = InitData(cnn, out var classes);
baseProps = cnn.GetAll<MetroBaseProperty>();
allClassifications = classes;
}
[RelayCommand]
private void LocationElement(object obj)
{
if (obj is Element elem)
{
handler.Raise(
uiapp =>
{
var uidoc = uiapp.ActiveUIDocument;
uidoc.ShowElements([elem.Id]);
uidoc.Selection.SetElementIds([elem.Id]);
});
}
}
[RelayCommand]
private void CheckId(object obj)
{
handler.Raise(
uiapp =>
{
var uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
var allElements = doc.OfAllModelCollector()?.ToList();
if (allElements == null)
{
MessageBox.Show("没有找到模型元素", "错误");
return;
}
KeyValues = allElements.GroupBy(e => GetIDProperty(e)).ToDictionary(g => g.Key ?? "空", g => g.ToList());
if (obj is ToggleButton toggle && toggle.IsChecked == false)
{
toggle.IsChecked = true;
}
});
}
[RelayCommand]
private void ModifyCode()
{
handler.Raise(
uiapp =>
{
var uidoc = uiapp.ActiveUIDocument;
uidoc.Document
.Invoke(
ts =>
{
var elems = uidoc.Document.OfAllModelCollector()?.ToList();
if (elems == null)
{
MessageBox.Show("没有找到模型元素", "错误");
return;
}
foreach (var item in elems)
{
var paras = item.GetParameters(id);
var categoryName = string.Empty;
if (paras.Count > 0)
{
foreach (var param in paras)
{
categoryName = param.AsString();
break;
}
}
var codesParams = item.GetParameters(code);
var classification =
allClassifications.FirstOrDefault(d => d.CategoryName == categoryName);
if (codesParams.Count > 0)
{
foreach (var param in codesParams.Where(p => !p.IsReadOnly))
{
param.SetValue(classification?.Code);
}
}
}
}, "批处理编码");
});
}
/// <summary>
/// 添加属性
/// </summary>
[RelayCommand]
private void BatchAddProperty()
{
handler.Raise(
uiapp =>
{
var uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
var allElements = doc.OfAllModelCollector().ToList();
var group = allElements.GroupBy(
e => GetIDProperty(e));
foreach (var item in group)
{
var classification = allClassifications.SingleOrDefault(c => c.CategoryName == item.Key);
if (classification != null)
{
if (item is FamilyInstance instance && !instance.Symbol.Family.IsInPlace)
{
//ParameterHelpers.AddFamilyParameters(uidoc,,true,)
}
else//使用共享参数
{
}
}
}
});
}
private string GetIDProperty(Element e)
{
var list = e.GetParameters(id);
if (list.Any())
{
var str = list.FirstOrDefault().AsString();
if (str == string.Empty)
{
return "未填写标识";
}
return str;
}
else
{
return "未定义标识";
}
}
/// <summary>
/// 批量修改节点
/// </summary>
/// <param name="model"></param>
[RelayCommand]
private void ModifyIdAndCode(ClassificationModel model)
{
if (model == null)
{
MessageBox.Show("请选择分类节点");
return;
}
if (model.Children.Count > 0)
{
MessageBox.Show("请选择子节点");
return;
}
handler.Raise(
uiapp =>
{
var uidoc = uiapp.ActiveUIDocument;
var elems = uidoc.Selection.PickElementsByRectangle("请框选元素!");
uidoc.Document
.Invoke(
ts =>
{
foreach (var item in elems)
{
var paras = item.GetParameters(id);
if (paras.Count > 0)
{
foreach (var param in paras.Where(p => !p.IsReadOnly))
{
param.Set(model.CategoryName);
}
}
var codesParams = item.GetParameters(code);
var classification =
allClassifications.FirstOrDefault(d => d.CategoryName == model.CategoryName);
if (codesParams.Count > 0)
{
foreach (var param in codesParams.Where(p => !p.IsReadOnly))
{
param.SetValue(classification?.Code);
}
}
}
}, "批处理标识&编码");
});
}
/// <summary>
/// 预处理,根据类别,自动赋予构件分类
/// </summary>
[RelayCommand]
private void BatchProcess()
{
handler.Raise(
uiapp =>
{
var uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
doc.InvokeGroup(
tg =>
{
var b1 = SharedParameterAssists.IsExistProjectParam(
doc,
id,
out var def1,
out var bindng1);
var b2 = SharedParameterAssists.IsExistProjectParam(
doc,
code,
out var def2,
out var bindng2);
CategorySet set = uiapp.Application.Create.NewCategorySet();
var builtInCategories = Enum.GetValues(typeof(BuiltInCategory));
foreach (BuiltInCategory cate in builtInCategories)
{
try
{
if (cate == BuiltInCategory.OST_StairsStringerCarriage)
{
}
//有的类别不支持这个方法获取
var category = Category.GetCategory(doc, cate);
if (category != null &&
category.CategoryType == CategoryType.Model &&
category.AllowsBoundParameters)
{
set.Insert(category);
}
}
catch (Exception)
{
}
}
if (b1)
{
doc.Invoke(
ts =>
{
bindng1.Categories = set;
doc.ParameterBindings.ReInsert(def1, bindng1);
}, "重新绑定ID参数类别");
}
else
{
ParameterHelpers.AddSharedParam(doc, id, set, BuiltInParameterGroup.PG_IFC);
}
if (b2)
{
doc.Invoke(
ts =>
{
bindng2.Categories = set;
doc.ParameterBindings.ReInsert(def2, bindng2);
}, "重新绑定Code参数类别");
}
else
{
ParameterHelpers.AddSharedParam(doc, code, set, BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES);
}
var allElements = doc.OfAllModelCollector();
if (allElements == null)
{
MessageBox.Show("没有找到模型元素", "错误");
return;
}
try
{
foreach (var elem in allElements)
{
var idParams = elem.GetParameters(id).Where(p => !p.IsReadOnly);
var codesParams = elem.GetParameters(code).Where(p => !p.IsReadOnly);
var ids = idParams.ToList();
var codes = codesParams.ToList();
if (!ids.Any() || !codes.Any())
{
continue;
}
//获取元素类别名称
string categroyName = GetCategory(doc, elem);
doc.Invoke(
ts =>
{
foreach (var param in ids)
{
param.SetValue(categroyName);
}
var classification =
allClassifications.FirstOrDefault(d => d.CategoryName == categroyName);
foreach (var param in codes)
{
param.SetValue(classification?.Code);
}
},
"标识填写和编码");
}
}
catch (Exception)
{
throw;
}
}, "预处理标识&编码");
});
}
private static string GetCategory(Document doc, Element item)
{
string categroyName = string.Empty;
switch (item.Category.ToBuiltInCategory())
{
//结构连接
case BuiltInCategory.OST_StructConnections:
{
if (item.Name.Contains("钢") && item.Name.Contains("节点"))
{
categroyName = "钢结构连接节点";
}
if (item.Name.Contains("钢") && item.Name.Contains("附件"))
{
categroyName = "钢结构连接附件";
}
}
break;
//钢筋形状
case BuiltInCategory.OST_RebarShape:
break;
//结构路径钢筋
case BuiltInCategory.OST_PathRein:
break;
//结构区域钢筋
case BuiltInCategory.OST_AreaRein:
break;
//结构钢筋
case BuiltInCategory.OST_Rebar:
break;
//隔热层
case BuiltInCategory.OST_FabricationPipeworkInsulation:
break;
//内衬
case BuiltInCategory.OST_FabricationDuctworkLining:
break;
//MEP 预制保护层
case BuiltInCategory.OST_FabricationContainment:
break;
// MEP 预制管道
case BuiltInCategory.OST_FabricationPipework:
break;
//MEP 预制支架
case BuiltInCategory.OST_FabricationHangers:
break;
//隔热层
case BuiltInCategory.OST_FabricationDuctworkInsulation:
break;
//线管
case BuiltInCategory.OST_Conduit:
break;
//电缆桥架
case BuiltInCategory.OST_CableTray:
break;
//线管配件
case BuiltInCategory.OST_ConduitFitting:
break;
//电缆桥架配件
case BuiltInCategory.OST_CableTrayFitting:
break;
//风管内衬
case BuiltInCategory.OST_DuctLinings:
break;
//风管隔热层
case BuiltInCategory.OST_DuctInsulations:
break;
//管道隔热层
case BuiltInCategory.OST_PipeInsulations:
break;
//HVAC 区
case BuiltInCategory.OST_HVAC_Zones:
break;
//喷头
case BuiltInCategory.OST_Sprinklers:
break;
//灯具
case BuiltInCategory.OST_LightingDevices:
break;
//火警设备
case BuiltInCategory.OST_FireAlarmDevices:
break;
//数据设备
case BuiltInCategory.OST_DataDevices:
break;
//通讯设备
case BuiltInCategory.OST_CommunicationDevices:
break;
//安全设备
case BuiltInCategory.OST_SecurityDevices:
break;
//护理呼叫设备
case BuiltInCategory.OST_NurseCallDevices:
break;
//电话设备
case BuiltInCategory.OST_TelephoneDevices:
break;
//管道附件
case BuiltInCategory.OST_PipeAccessory:
break;
//软管
case BuiltInCategory.OST_FlexPipeCurves:
break;
//管件
case BuiltInCategory.OST_PipeFitting:
break;
//管道
case BuiltInCategory.OST_PipeCurves:
break;
//管道系统
case BuiltInCategory.OST_PipingSystem:
break;
//导线
case BuiltInCategory.OST_Wire:
break;
//软风管
case BuiltInCategory.OST_FlexDuctCurves:
break;
//风管附件
case BuiltInCategory.OST_DuctAccessory:
break;
//风管系统
case BuiltInCategory.OST_DuctSystem:
break;
//风道末端
case BuiltInCategory.OST_DuctTerminal:
break;
//风管管件
case BuiltInCategory.OST_DuctFitting:
break;
//风管
case BuiltInCategory.OST_DuctCurves:
break;
//桥梁支座
case BuiltInCategory.OST_BridgeBearings:
break;
//桥梁大梁
case BuiltInCategory.OST_BridgeGirders:
break;
//桥梁基础
case BuiltInCategory.OST_BridgeFoundations:
{
categroyName = "混凝土桥台";
}
break;
//桥面
case BuiltInCategory.OST_BridgeDecks:
break;
//桥拱
case BuiltInCategory.OST_BridgeArches:
break;
//桥梁缆索
case BuiltInCategory.OST_BridgeCables:
break;
//桥塔
case BuiltInCategory.OST_BridgeTowers:
break;
//桥墩
case BuiltInCategory.OST_BridgePiers:
{
categroyName = "混凝土桥墩";
}
break;
//桥台
case BuiltInCategory.OST_BridgeAbutments:
break;
//空间
case BuiltInCategory.OST_MEPSpaces:
break;
//体量洞口
case BuiltInCategory.OST_MassOpening:
break;
//体量天窗
case BuiltInCategory.OST_MassSkylights:
break;
//体量玻璃
case BuiltInCategory.OST_MassGlazing:
break;
//体量屋顶
case BuiltInCategory.OST_MassRoof:
break;
//体量外墙
case BuiltInCategory.OST_MassExteriorWall:
break;
//体量内墙
case BuiltInCategory.OST_MassInteriorWall:
break;
//体量分区
case BuiltInCategory.OST_MassZone:
break;
//体量楼层
case BuiltInCategory.OST_MassFloor:
break;
//体量
case BuiltInCategory.OST_Mass:
break;
//项目信息
case BuiltInCategory.OST_ProjectInformation:
break;
//环境
case BuiltInCategory.OST_Entourage:
break;
//植物
case BuiltInCategory.OST_Planting:
break;
//专用设备
case BuiltInCategory.OST_SpecialityEquipment:
break;
//建筑地坪
case BuiltInCategory.OST_BuildingPad:
break;
//场地
case BuiltInCategory.OST_Site:
break;
//道路
case BuiltInCategory.OST_Roads:
break;
//停车场
case BuiltInCategory.OST_Parking:
break;
//卫浴装置
case BuiltInCategory.OST_PlumbingFixtures:
break;
//机械设备
case BuiltInCategory.OST_MechanicalEquipment:
break;
//照明设备
case BuiltInCategory.OST_LightingFixtures:
break;
//电气装置
case BuiltInCategory.OST_ElectricalFixtures:
break;
//电气设备
case BuiltInCategory.OST_ElectricalEquipment:
break;
//橱柜
case BuiltInCategory.OST_Casework:
break;
//竖井洞口
case BuiltInCategory.OST_ShaftOpening:
break;
//房间
case BuiltInCategory.OST_Rooms:
break;
//结构桁架
case BuiltInCategory.OST_StructuralTruss:
{
categroyName = "钢桁架";
if (item.Name.Contains("网"))
{
categroyName = "钢网架";
}
}
break;
//结构柱
case BuiltInCategory.OST_StructuralColumns:
{
categroyName = "混凝土柱";
if (item.Name.Contains("钢"))
{
categroyName = "钢柱";
}
if (doc.Title.Contains("围护"))
{
categroyName = "围护柱";
if (item.Name.Contains("桩"))
{
categroyName = "围护桩";
}
}
}
break;
//结构框架
case BuiltInCategory.OST_StructuralFraming:
{
categroyName = "混凝土梁";
if (item.Name.Contains("钢") && item.Name.Contains("梁"))
{
categroyName = "钢梁";
}
if (item.Name.Contains("钢") && item.Name.Contains("支撑"))
{
categroyName = "钢支撑";
}
if (doc.Title.Contains("围护"))
{
categroyName = "围护梁";
}
}
break;
//结构基础
case BuiltInCategory.OST_StructuralFoundation:
{
if (doc.Title.Contains("围护"))
{
categroyName = "围护柱";
if (item.Name.Contains("桩"))
{
categroyName = "围护桩";
}
}
if (item is Floor floor)
{
categroyName = "混凝土板";
}
if (item is WallFoundation)
{
categroyName = "混凝土墙";
}
}
break;
//常规模型
case BuiltInCategory.OST_GenericModel:
{
if (item.Name.Contains("雨棚"))
{
categroyName = "雨棚";
}
if (item.Name.Contains("台阶"))
{
categroyName = "台阶";
}
if (item.Name.Contains("预埋件"))
{
categroyName = "预埋件";
}
}
break;
//终端
case BuiltInCategory.OST_RailingTermination:
//支座
case BuiltInCategory.OST_RailingSupport:
//扶手
case BuiltInCategory.OST_RailingHandRail:
//顶部扶栏
case BuiltInCategory.OST_RailingTopRail:
//栏杆扶手
case BuiltInCategory.OST_StairsRailing:
{
categroyName = "栏杆";
}
break;
//柱
case BuiltInCategory.OST_Columns:
{
categroyName = "建筑柱";
}
break;
//家具
case BuiltInCategory.OST_Furniture:
break;
//结构加强板
case BuiltInCategory.OST_StructuralStiffener:
//楼板边缘
case BuiltInCategory.OST_EdgeSlab:
//楼板
case BuiltInCategory.OST_Floors:
{
categroyName = "楼地板";
if (item is Floor floor)
{
var structural = floor
.get_Parameter(BuiltInParameter.FLOOR_PARAM_IS_STRUCTURAL)
.AsInteger();
if (structural == 1)
{
categroyName = "混凝土板";
}
var levelMax = doc.OfClass<Level>()
.Cast<Level>()
.OrderBy(l => l.Elevation)
.LastOrDefault();
if (levelMax!.Id == floor.LevelId)
{
categroyName = "混凝土屋面";
}
}
}
break;
//平台
case BuiltInCategory.OST_StairsLandings:
//梯段
case BuiltInCategory.OST_StairsRuns:
//楼梯
case BuiltInCategory.OST_Stairs:
//支撑
case BuiltInCategory.OST_StairsStringerCarriage:
{
categroyName = "楼梯";
}
break;
//屋顶
case BuiltInCategory.OST_Roofs:
//檐沟
case BuiltInCategory.OST_Gutter:
//封檐板
case BuiltInCategory.OST_Fascia:
//屋檐底板
case BuiltInCategory.OST_RoofSoffit:
{
categroyName = "屋顶";
}
break;
//坡道
case BuiltInCategory.OST_Ramps:
//门
case BuiltInCategory.OST_Doors:
//窗
case BuiltInCategory.OST_Windows:
//天花板
case BuiltInCategory.OST_Ceilings:
{
categroyName = item.Category.Name;
}
break;
//幕墙系统
case BuiltInCategory.OST_CurtaSystem:
//幕墙竖梃
case BuiltInCategory.OST_CurtainWallMullions:
//幕墙嵌板
case BuiltInCategory.OST_CurtainWallPanels:
{
categroyName = "幕墙";
}
break;
//墙饰条
case BuiltInCategory.OST_Cornices:
//墙
case BuiltInCategory.OST_Walls:
{
categroyName = "建筑墙";
if (item is Wall wall)
{
var structural = wall
.get_Parameter(BuiltInParameter.WALL_STRUCTURAL_SIGNIFICANT)
.AsInteger();
if (structural == 1)
{
categroyName = "混凝土墙";
}
if (wall.StructuralUsage ==
Autodesk.Revit.DB.Structure.StructuralWallUsage.NonBearing)
{
categroyName = "建筑墙";
}
if (wall.WallType.Kind == WallKind.Curtain)
{
categroyName = "幕墙";
}
if (doc.Title.Contains("围护"))
{
categroyName = "围护墙";
}
}
}
break;
default:
break;
}
return categroyName;
}
[RelayCommand]
private void GetProperties(ClassificationModel model)
{
if (model != null)
{
Properties?.Clear();
if (model.Parent == null)
{
var list = new List<PropertyBase>();
//var baseProps = cnn.GetList<MetroBaseProperty>();
list.AddRange(baseProps);
Properties = [.. list];
return;
}
if (model.Children.Count == 0)
{
var list = new List<PropertyBase>();
//var baseProps = cnn.GetList<MetroBaseProperty>();
list.AddRange(baseProps);
var dedicatedProps = model.Properties;
list.AddRange(dedicatedProps);
Properties = [.. list];
}
}
}
private static List<ClassificationModel> InitData(SQLiteConnection cnn,
out List<ClassificationModel> treeModels)
{
//专项属性
var metroProps = cnn.GetAll<MetroDedicatedProperty>();
//获取分类节点
treeModels = [.. cnn.GetAll<ClassificationModel>()];
foreach (var model in treeModels)
{
//找到model的父节点
model.Parent = treeModels.FirstOrDefault(t => t.CategoryName == model.ParentName);
//model的属性集
model.Properties = [.. metroProps.Where(p => p.ParamTableIndex == model.ParamTableIndex)];
//找到model的子节点
model.Children = [.. treeModels.Where(t => t.ParentName == model.CategoryName)];
}
var result = treeModels.Where(t => t.Parent == null && t.ParentName == null);
return [.. result];
}
}
}