using System.ComponentModel; using System.Diagnostics; using System.Windows; using System.Windows.Data; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Nice3point.Revit.Toolkit.External.Handlers; using ShrlAlgoToolkit.Core.Assists; namespace ShrlAlgoToolkit.RevitAddins.RvView; public partial class ViewManagerViewModel : ObservableObject { [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(RevitAddins.RvView.ViewManagerViewModel.CopyAsDependentCommand))] public partial bool CanCopyAsDependent { get; set; } [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(RevitAddins.RvView.ViewManagerViewModel.CopyOnlyCommand))] public partial bool CanCopyOnly { get; set; } [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(RevitAddins.RvView.ViewManagerViewModel.CopyWithDetailCommand))] public partial bool CanCopyWidthDetail { get; set; } [ObservableProperty] public partial ICollectionView FilteredList { get; set; } private readonly ActionEventHandler handler; [ObservableProperty] public partial string SearchText { get; set; } private List selectedItems; [ObservableProperty] public partial List ViewTemplates { get; set; } public ViewManagerViewModel(UIApplication uiapp) { //IsActive = true; ViewCollection = uiapp.ActiveUIDocument.Document .OfClass() .Cast() .Where( v => v.GetTypeId() != ElementId.InvalidElementId && v is not ViewSchedule { IsTitleblockRevisionSchedule: true } ) .OrderBy(v => v.ViewType) .ThenBy(v => v.Name) .Select(v => new ViewManagerModel(v)) .ToList(); //ViewTemplates = doc.OfCollector().Cast().Where(v => v.IsTemplate).ToList(); //ViewTemplates.Insert(0,View); //var models = (from v in views let model = new ViewManagerModel(v) select model).ToList(); FilteredList = CollectionViewSource.GetDefaultView(ViewCollection); handler = new ActionEventHandler(); //ViewCollection.ListChanged += ViewCollection_ListChanged; } //[RelayCommand] //private void ActiveView(System.Collections.IList items) //{ // if (items == null || items.Count == 0) // { // return; // } // var UiDocument = uiapp.ActiveUIDocument; // var list = items.Cast().ToList(); // try // { // foreach (var model in list) // { // UiDocument.ActiveView = model.View; // } // } // catch (Exception e) // { // Console.WriteLine(e); // throw; // } //} [RelayCommand] private void Confirm(System.Collections.IList items) { if (items == null || items.Count == 0) { return; } var list = items.Cast().ToList(); handler.Raise(uiapp => { var doc = uiapp.ActiveUIDocument.Document; doc.Invoke( _ => { foreach (var model in list) { var view = model.View; if (view == null) { continue; } try { view.Name = model.Name; } catch (Exception) { MessageBox.Show("名称未修改\n\r修改的视图名称不能包含:\n\r\\:{}[]|;<>?`~\n\r及其他不能打印的字符或与其他视图重名", "提示"); } view.ViewTemplateId = ElementId.InvalidElementId; if (model.IsDisplayStyleEditable) { view.DisplayStyle = (Autodesk.Revit.DB.DisplayStyle)model.DisplayStyle; } if (view.HasViewDiscipline()) { Debug.Assert(model.Discipline != null, "model.Discipline != null"); view.Discipline = (Autodesk.Revit.DB.ViewDiscipline)model.Discipline; } if (model.IsScaleEditable) { view.Scale = model.Scale; } if (model.IsDetailLevelEditable) { Debug.Assert(model.DetailLevel != null, "model.DetailLevel != null"); view.DetailLevel = (Autodesk.Revit.DB.ViewDetailLevel)model.DetailLevel; } if (model.ViewTemplate != null && view.IsValidViewTemplate(model.ViewTemplate.Id)) { view.ViewTemplateId = model.ViewTemplate.Id; } if (model.IsSheetNameEditable) { view.get_Parameter(BuiltInParameter.VIEW_DESCRIPTION).Set((string)model.SheetName); } if (model.IsSheetNumberEditable && view is ViewSheet sheet) { sheet.SheetNumber = model.SheetNumber; } } }, "修改视图属性" ); }); } [RelayCommand(CanExecute = nameof(RevitAddins.RvView.ViewManagerViewModel.CanCopyAsDependent))] private void CopyAsDependent(System.Collections.IList items) { if (items == null || items.Count == 0) { return; } var list = items.Cast().ToList(); handler.Raise(uiapp => { var doc = uiapp.ActiveUIDocument.Document; doc.Invoke( _ => { try { foreach (var model in list) { var view = model.View; var viewCopy = view.CopyWithOption(ViewDuplicateOption.AsDependent); ViewCollection.Insert(ViewCollection.IndexOf(model) + 1, new ViewManagerModel(viewCopy)); } } catch (Exception e) { LogAssist.ToLog(e.Message); } }, "复制视图" ); }); } [RelayCommand(CanExecute = nameof(RevitAddins.RvView.ViewManagerViewModel.CanCopyOnly))] private void CopyOnly(System.Collections.IList items) { if (items == null || items.Count == 0) { return; } var list = items.Cast().ToList(); handler.Raise(uiapp => { var doc = uiapp.ActiveUIDocument.Document; doc.Invoke( _ => { try { foreach (var model in list) { var view = model.View; var viewCopy = view.CopyWithOption(ViewDuplicateOption.Duplicate); ViewCollection.Insert(ViewCollection.IndexOf(model) + 1, new ViewManagerModel(viewCopy)); } } catch (Exception e) { LogAssist.ToLog(e.Message); } }, "复制视图" ); }); } [RelayCommand(CanExecute = nameof(RevitAddins.RvView.ViewManagerViewModel.CanCopyWidthDetail))] private void CopyWithDetail(System.Collections.IList items) { if (items == null || items.Count == 0) { return; } var list = items.Cast().ToList(); handler.Raise(uiapp => { var doc = uiapp.ActiveUIDocument.Document; doc.Invoke( _ => { try { foreach (var model in list) { var view = model.View; var viewCopy = view.CopyWithOption(ViewDuplicateOption.WithDetailing); ViewCollection.Insert(ViewCollection.IndexOf(model) + 1, new ViewManagerModel(viewCopy)); } } catch (Exception e) { LogAssist.ToLog(e.Message); } }, "复制视图" ); }); } [RelayCommand] private void Delete(System.Collections.IList items) { if (items == null || items.Count == 0) { return; } var list = items.Cast().ToList(); //ViewCollection.RemoveAll(v => list.Contains(v)); handler.Raise(uiapp => { var doc = uiapp.ActiveUIDocument.Document; doc.Invoke( _ => { foreach (var model in list) { try { //dg.Items.Remove(model); var opened = uiapp.ActiveUIDocument .GetOpenUIViews() .FirstOrDefault(ui => ui.ViewId == model.View.Id); if (opened == null) { ViewCollection.Remove(model); doc.Delete(model.View.Id); } } catch (Exception e) { MessageBox.Show("视图不可删除"); e.Message.ToLog(); } } }, "删除视图" ); //dg.ItemsSource = null; //dg.ItemsSource = ViewCollection; }); } [RelayCommand] void Search() { FilteredList.Filter = o => { if (string.IsNullOrEmpty(SearchText)) { return true; } var item = o as ViewManagerModel; return item.Name.Contains(SearchText) || EnumAssist.GetAttribute(item.UserViewType).Description.Contains(SearchText); }; } [RelayCommand] private void RemoveTemplate(System.Collections.IList items) { if (items != null || items.Count == 0) { return; } handler.Raise(_ => { var list = items.Cast().ToList(); foreach (var model in list) { model.ViewTemplate = null; } }); } [RelayCommand] private void UpdateExecute(System.Collections.IList items) { if (items == null || items.Count == 0) { return; } selectedItems = items.Cast().ToList(); //更新可用性字段 CanCopyOnly = selectedItems.All(m => m.View.CanViewBeDuplicated(ViewDuplicateOption.Duplicate)); CanCopyWidthDetail = selectedItems.All(m => m.View.CanViewBeDuplicated(ViewDuplicateOption.WithDetailing)); CanCopyAsDependent = selectedItems.All(m => m.View.CanViewBeDuplicated(ViewDuplicateOption.AsDependent)); //CommandManager.InvalidateRequerySuggested(); //通知命令按钮可用性更新 //CopyOnly.NotifyCanExecuteChanged(); //CopyWithDetail.NotifyCanExecuteChanged(); //CopyAsDependent.NotifyCanExecuteChanged(); } private void ViewCollection_ListChanged(object sender, ListChangedEventArgs e) { if (e.ListChangedType == ListChangedType.ItemChanged) { var changedItem = ViewCollection[e.NewIndex]; //var changedItem1 = ViewCollection[e.OldIndex]; var x = e.PropertyDescriptor; foreach (var item in selectedItems) { var prop = item.GetType().GetProperty(x.Name, x.PropertyType); var v = x.GetValue(changedItem); prop.SetValue(item, v); } handler.Raise(uiapp => { var doc = uiapp.ActiveUIDocument.Document; doc.Invoke( _ => { foreach (var model in selectedItems) { var view = model.View; if (view == null) { continue; } try { view.Name = model.Name; } catch (Exception) { MessageBox.Show("名称未修改\n\r修改的视图名称不能包含:\n\r\\:{}[]|;<>?`~\n\r及其他不能打印的字符", "提示"); } view.ViewTemplateId = ElementId.InvalidElementId; if (model.IsDisplayStyleEditable) { view.DisplayStyle = (Autodesk.Revit.DB.DisplayStyle)model.DisplayStyle; } if (view.HasViewDiscipline()) { Debug.Assert(model.Discipline != null, "model.Discipline != null"); view.Discipline = (Autodesk.Revit.DB.ViewDiscipline)model.Discipline; } if (model.IsScaleEditable) { view.Scale = model.Scale; } if (model.IsDetailLevelEditable) { Debug.Assert(model.DetailLevel != null, "model.DetailLevel != null"); view.DetailLevel = (Autodesk.Revit.DB.ViewDetailLevel)model.DetailLevel; } if (model.ViewTemplate != null && view.IsValidViewTemplate(model.ViewTemplate.Id)) { view.ViewTemplateId = model.ViewTemplate.Id; } if (model.IsSheetNameEditable) { view.get_Parameter(BuiltInParameter.VIEW_DESCRIPTION).Set((string)model.SheetName); } if (model.IsSheetNumberEditable && view is ViewSheet sheet) { sheet.SheetNumber = model.SheetNumber; } } }, "修改视图属性" ); }); } } //public void Receive(ViewMessage message) //{ // if (selectedItems==null||!selectedItems.Any()) // { // return; // } //} //[ObservableProperty] //ViewManagerModel modelPropertyChanged; //public void Receive(PropertyChangedMessage message) //{ // //ModelPropertyChanged = message.NewValue; //} public List ViewCollection { get; set; } }