Files
SzmediTools/Szmedi.RevitToolkit.Approval/ViewModels/FillMetroParametersViewModel.cs
2025-09-16 16:06:41 +08:00

224 lines
8.4 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 System.Collections.ObjectModel;
using System.Data;
using System.Text;
using System.Windows;
using Autodesk.Revit.DB;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Nice3point.Revit.Toolkit.External.Handlers;
using Szmedi.RevitToolkit.Approval.Models;
using Szmedi.Toolkit.Revit.Approval;
namespace Szmedi.RevitToolkit.Approval.ViewModels
{
public partial class FillMetroParametersViewModel : ObservableObject
{
private readonly List<MetroNode> allClassifications;
//private readonly SQLiteConnection cnn;
//[ObservableProperty]
//private MetroPropTable baseTable;
//private const string id = "深圳构件标识";
//private const string code = "AM-100-EAM分类编码";
//[ObservableProperty]
//private List<MetroPropTable> metroPropTables;
[ObservableProperty]
public partial List<MetroNode> ClassHierarchicalData { get; set; }
//private readonly ActionEventHandler handler;
//[ObservableProperty]
//public partial Dictionary<string, List<Element>> KeyValues { get; set; }
[ObservableProperty]
public partial ObservableCollection<AfcaMetroBaseParameter> PropertyCollection { get; set; }
//private readonly IEnumerable<MetroBaseProperty> baseProps;
public FillMetroParametersViewModel()
{
//PropertyDictionary = GlobalAssists.GetArchiMajorParameters(value);
allClassifications = GlobalAssists.GetMetroClassificationModels().Where(c => !string.IsNullOrEmpty(c.CategoryName)).ToList();
ClassHierarchicalData = GlobalAssists.InitTreeViewSource(allClassifications, true);
//handler = new ActionEventHandler();
}
[RelayCommand]
private void GetProperties(MetroNode model)
{
if (model != null)
{
PropertyCollection?.Clear();
//通用属性
var baseProps = GlobalAssists.GetMetroCommonParameters();
if (model.Parent == null)
{
var list = new List<AfcaMetroBaseParameter>();
//var baseProps = cnn.GetList<MetroBaseProperty>();
list.AddRange(baseProps);
PropertyCollection = [.. list];
return;
}
if (model.Children.Count == 0)
{
var list = new List<AfcaMetroBaseParameter>();
//var baseProps = cnn.GetList<MetroBaseProperty>();
list.AddRange(baseProps);
var dedicatedProps = model.Properties;
list.AddRange(dedicatedProps);
PropertyCollection = [.. list];
}
}
}
private string GetSign(Element e)
{
var list = e.GetParameters("深圳构件标识");
string str = default;
if (list.Any())
{
foreach (var param in list)
{
str = param.AsString();
if (string.IsNullOrEmpty(str))
{
str = "未定义";
}
}
return str;
}
else
{
return "未定义";
}
}
[RelayCommand]
private void ManualProcess(MetroNode model)
{
RvApp.Handler.Raise(
uiapp =>
{
StringBuilder sb = new StringBuilder();
var uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
var elems = uidoc.Selection.PickElementsByRectangle("请框选元素!");
if (model == null)
{
MessageBox.Show("请选择分类节点");
return;
}
if (model.Children.Count > 0)
{
MessageBox.Show("请选择子节点");
return;
}
doc.Invoke(
ts =>
{
foreach (var item in elems)
{
var paras = item.GetParameters("深圳构件标识");
if (!paras.Any())
{
sb.AppendLine($"{item.Id} {item.Name}未定义参数:深圳构件标识");
continue;
}
var parameters = paras.Where(p => !p.IsReadOnly).ToList();
foreach (var param in parameters)
{
param.Set(model.CategoryName);
}
var codesParams = item.GetParameters("AM-100-EAM分类编码");
var classification =
allClassifications.FirstOrDefault(d => d.CategoryName == model.CategoryName);
if (codesParams.Count <= 0)
{
sb.AppendLine($"{item.Id} {item.Name}未定义参数AM-100-EAM分类编码");
continue;
}
foreach (var param in codesParams.Where(p => !p.IsReadOnly))
{
param.SetValue(classification?.Code);
}
}
},
"手动修改标识&编码");
if (sb.Length > 0)
{
MessageBox.Show(sb.ToString(), "部分元素处理失败", MessageBoxButton.OK, MessageBoxImage.Warning);
}
else
{
MessageBox.Show("处理完成", "完成");
}
});
}
[RelayCommand(CanExecute = nameof(CanModify))]
private void ModifyParameterValue()
{
RvApp.Handler
.Raise(
uiapp =>
{
CanModify = false;
var uidoc = uiapp.ActiveUIDocument;
var doc = uidoc.Document;
//doc.OfParentModelCollector
try
{
doc.Invoke(
ts =>
{
var elements = uidoc.Selection
.PickElementsByRectangle(
new FuncFilter(
e => e.Category is { CategoryType: CategoryType.Model, AllowsBoundParameters: true, Parent: null }),
"请选择要填写参数值的构件");
foreach (var elem in elements)
{
foreach (var prop in Properties)
{
var param = elem.LookupParameter(prop.ParamName);
param.SetValue(prop.ParamValue);
}
}
},
"填写轨交工程参数");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
//CanModify = true;
}
CanModify = true;
});
}
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(ModifyParameterValueCommand))]
public partial bool CanModify { get; set; }
//public FillMetroParametersViewModel()
//{
//}
[ObservableProperty]
public partial List<AfcaMetroBaseParameter> Properties { get; set; }
}
}