using Autodesk.Revit.UI; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Nice3point.Revit.Toolkit.External.Handlers; using System.Linq; using System.Windows; using Szmedi.RvKits.Assists; using Szmedi.RvKits.InfoManager.Delivery; using Szmedi.RvKits.Models; namespace Szmedi.RvKits.InfoManager { public partial class MetroParamManagerViewModel : ObservableObject { [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(AddParametersCommand))] private bool canAdd; private readonly List commonParams; private readonly DapperUtil dapperUtil; private readonly ActionEventHandler handler; /// /// 添加通用属性 /// [ObservableProperty] private bool isAddCommonParam = true; /// /// 是否族参数 /// [ObservableProperty] private bool isFamilyParam; /// /// 是否共享族参数 /// [ObservableProperty] private bool isSharedFamilyParam; /// /// 共享项目参数 /// [ObservableProperty] private bool isSharedProjectParam = true; private readonly List paramsToAdd; private readonly UIApplication uiapp; //public ParamManagerWin ParentWindow { get; set; } //public MetroParamManagerViewModel(ParamManagerWin parentWindow) //{ // ParentWindow = parentWindow; // dapperUtil = parentWindow.DapperUtil; // List dedicatedParams = GetMetroDedicatedProperties(); // commonParams = GetMetroCommonProperties(); // MetroSharedParams = GetMetroSharedParams(); // GenerateMetroDedicatedPropTree(dedicatedParams); // CanAdd = paramsToAdd.Count > 0; //} public MetroParamManagerViewModel(UIApplication uiapp, DapperUtil dapperUtil, ActionEventHandler handler) { this.dapperUtil = dapperUtil; this.handler = handler; this.uiapp = uiapp; List dedicatedParams = GetMetroDedicatedProperties(); commonParams = GetMetroCommonProperties(); MetroSharedParams = GetMetroSharedParams(); GenerateMetroDedicatedPropTree(dedicatedParams); paramsToAdd = new List(); CanAdd = paramsToAdd.Count > 0; } [RelayCommand] private void AddParameters() { if (paramsToAdd.Any()) { handler.Raise( uiapp => { if (paramsToAdd.Any()) { if (IsAddCommonParam) { paramsToAdd.AddRange(commonParams); } var uidoc = uiapp.ActiveUIDocument; var filePath = Path.Combine(GlobalVariables.DirAssembly, $"TempSharedParameters.txt"); if (IsSharedProjectParam) { ParameterHelpers.AddParameterElementsBinding(uidoc, paramsToAdd, MetroSharedParams, filePath); } else { ParameterHelpers.AddFamilyParameters(uidoc, paramsToAdd, MetroSharedParams, IsFamilyParam, filePath); } } }); //ParentWindow.AddParameterEventHandler.IsSharedProjectParam = IsSharedProjectParam; //ParentWindow.AddParameterEventHandler.IsFamilyParam = IsFamilyParam; //ParentWindow.AddParameterEventHandler.IsSharedFamilyParam = IsSharedFamilyParam; //ParentWindow.AddParameterEventHandler.ParametersToAdded = paramsToAdd; //ParentWindow.AddParameterEventHandler.SharedParameters = MetroSharedParams; //ParentWindow.AddParameterEvent.Raise(); } //CanAdd = x != ExternalEventRequest.Accepted; } //private void PerformCheckedAll(object obj) //{ // if (obj is List) // { // List paramters = obj as List; // foreach (ParamData param in paramters) // { // param.IsChecked = true; // } // } //} [RelayCommand] private void DeleteParameters() { MessageBoxResult result = MessageBox.Show("是否清理所有轨道交通标准参数?", "警告", MessageBoxButton.OKCancel, MessageBoxImage.Warning); if (result == MessageBoxResult.OK) { //ParentWindow.DeleteElementsParamEvent.Raise(); handler.Raise( uiapp => { ParameterHelpers.RemoveMetroParameters(uiapp.ActiveUIDocument.Document); }); } } /// /// 专项属性 /// /// private void GenerateMetroDedicatedPropTree(IList paramsData) { var projects = paramsData.GroupBy(param => param.Project); foreach (var project in projects) { //项目 List projectChildren = new(); TreeModel projectTreeModel = new() { Name = project.Key, Icon = null, IsChecked = false, IsExpanded = true, Parent = null, Children = projectChildren, Tag = null }; Models.Add(projectTreeModel); //专业 IEnumerable> majors = project.GroupBy(p => p.Major); foreach (var major in majors) { List majorChildren = new(); TreeModel majorTreeModel = new() { Name = major.Key, Icon = null, IsChecked = false, IsExpanded = false, Children = majorChildren, Tag = null }; projectChildren.Add(majorTreeModel); //构件 var components = major.GroupBy(p => p.Component); foreach (var component in components) { TreeModel componentTreeModel = new() { Id = null, Name = component.Key, Icon = null, IsExpanded = false, Parent = null, Children = null, Tag = component.ToList() }; majorChildren.Add(componentTreeModel); //属性分类 //var propertyCategories = component.GroupBy(p => p.PropertyCategory); //foreach (var category in propertyCategories) //{ // List categoryChildren = new List(); // TreeModel categoryTreeModel = new TreeModel // { // Id = null, // Name = category.Key, // Icon = null, // IsChecked = false, // IsExpanded = false, // Parent = null, // Children = categoryChildren, // Tag = category // }; // componentChildren.Add(categoryTreeModel); // //属性分组 // var groups = category.GroupBy(p => p.PropertyGroup); // foreach (var ZoomRBGroup in groups) // { // List groupChildren = new List(); // TreeModel groupTreeModel = new TreeModel // { // Id = null, // Name = ZoomRBGroup.Key, // Icon = null, // IsChecked = false, // IsExpanded = false, // Parent = null, // Children = groupChildren, // Tag = ZoomRBGroup // }; // categoryChildren.Add(groupTreeModel); // //属性 // var properties = ZoomRBGroup.GroupBy(p => p.FullProperty); // foreach (var property in properties) // { // TreeModel propertyTreeModel = new TreeModel // { // Id = null, // Name = property.Key, // Icon = null, // IsChecked = false, // IsExpanded = false, // Parent = null, // Tag = property // }; // groupChildren.Add(propertyTreeModel); // } // } //} } } } } /// /// 轨交通用属性 /// private List GetMetroCommonProperties() { return dapperUtil.LoadModel("metro_common_properties"); } /// /// 轨交专项属性 /// private List GetMetroDedicatedProperties() { return dapperUtil.LoadModel("metro_dedicated_properties"); } /// /// 轨交共享参数 /// private List GetMetroSharedParams() { return dapperUtil.LoadModel("metro_shared_params"); } //partial void OnIsAddCommonParamChanged(bool oldValue, bool newValue) //{ // if (newValue) // { // paramsToAdd.AddRange(commonParams); // } // else // { // foreach (var item in commonParams) // { // var data = paramsToAdd.Find(d => item.FullProperty == d.FullProperty); // paramsToAdd.Remove(data); // } // } //} [RelayCommand] private void TreeItemChanged(object obj) { if (obj is List parameters) { paramsToAdd.Clear(); if (parameters.Any()) { paramsToAdd.AddRange(parameters.Where(param => param.IsChecked == true)); } } CanAdd = paramsToAdd.Any() && !uiapp.ActiveUIDocument.Document.IsFamilyDocument; } //private RelayCommand deleteParameters; //private RelayCommand addParameters; //private RelayCommand checkAll; //private RelayCommand treeItemChanged; //private RelayCommand unCheckAll; //public ICommand CheckAll //{ // get // { // checkAll ??= new RelayCommand(PerformCheckedAll); // return checkAll; // } //} //public ICommand UnCheckAll => unCheckAll ??= new RelayCommand(PerformUnCheckedAll); public List MetroSharedParams { get; set; } public List Models { get; } = new List(); //private void PerformUnCheckedAll(object obj) //{ // if (obj is List) // { // List paramters = obj as List; // foreach (ParamData param in paramters) // { // param.IsChecked = false; // } // } //} } }