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 allClassifications; //private readonly SQLiteConnection cnn; //[ObservableProperty] //private MetroPropTable baseTable; //private const string id = "深圳构件标识"; //private const string code = "AM-100-EAM分类编码"; //[ObservableProperty] //private List metroPropTables; [ObservableProperty] public partial List ClassHierarchicalData { get; set; } //private readonly ActionEventHandler handler; //[ObservableProperty] //public partial Dictionary> KeyValues { get; set; } [ObservableProperty] public partial ObservableCollection PropertyCollection { get; set; } //private readonly IEnumerable 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(); //var baseProps = cnn.GetList(); list.AddRange(baseProps); PropertyCollection = [.. list]; return; } if (model.Children.Count == 0) { var list = new List(); //var baseProps = cnn.GetList(); 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 Properties { get; set; } } }