Files
SzmediTools/Szmedi.RevitToolkit.Approval/ViewModels/FillMetroParametersViewModel.cs

224 lines
8.4 KiB
C#
Raw Permalink Normal View History

2025-09-16 16:06:41 +08:00
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; }
}
}