Files
ShrlAlgoToolkit/ShrlAlgoToolkit.RevitAddins/DrawSheet/ViewManagerViewModel.cs

453 lines
16 KiB
C#
Raw Normal View History

2024-09-22 11:05:41 +08:00
using System.ComponentModel;
using System.Diagnostics;
using System.Windows;
using System.Windows.Data;
using Autodesk.Revit.DB;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Nice3point.Revit.Toolkit.External.Handlers;
2026-02-21 16:31:24 +08:00
using ShrlAlgoToolkit.RevitAddins.Common.Assists;
using ShrlAlgoToolkit.RevitAddins.Common.Extensions;
2026-02-22 20:03:42 +08:00
namespace ShrlAlgoToolkit.RevitAddins.DrawSheet;
2024-09-22 11:05:41 +08:00
public partial class ViewManagerViewModel : ObservableObject
{
[ObservableProperty]
2026-02-24 11:34:18 +08:00
[NotifyCanExecuteChangedFor(nameof(CopyAsDependentCommand))]
public partial bool CanCopyAsDependent { get; set; }
2024-09-22 11:05:41 +08:00
[ObservableProperty]
2026-02-24 11:34:18 +08:00
[NotifyCanExecuteChangedFor(nameof(CopyOnlyCommand))]
public partial bool CanCopyOnly { get; set; }
2024-09-22 11:05:41 +08:00
[ObservableProperty]
2026-02-24 11:34:18 +08:00
[NotifyCanExecuteChangedFor(nameof(CopyWithDetailCommand))]
public partial bool CanCopyWidthDetail { get; set; }
2024-09-22 11:05:41 +08:00
[ObservableProperty]
public partial ICollectionView FilteredList { get; set; }
2024-09-22 11:05:41 +08:00
private readonly ActionEventHandler handler;
[ObservableProperty]
public partial string SearchText { get; set; }
2024-09-22 11:05:41 +08:00
private List<ViewManagerModel> selectedItems;
[ObservableProperty]
public partial List<View> ViewTemplates { get; set; }
2024-09-22 11:05:41 +08:00
public ViewManagerViewModel(UIApplication uiapp)
{
//IsActive = true;
ViewCollection = uiapp.ActiveUIDocument.Document
.OfClass<View>()
.Cast<View>()
.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<View>().Cast<View>().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<ViewManagerModel>().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<ViewManagerModel>().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)
{
2026-02-24 11:34:18 +08:00
view.DisplayStyle = (DisplayStyle)model.DisplayStyle;
2024-09-22 11:05:41 +08:00
}
if (view.HasViewDiscipline())
{
Debug.Assert(model.Discipline != null, "model.Discipline != null");
2026-02-24 11:34:18 +08:00
view.Discipline = (ViewDiscipline)model.Discipline;
2024-09-22 11:05:41 +08:00
}
if (model.IsScaleEditable)
{
view.Scale = model.Scale;
}
if (model.IsDetailLevelEditable)
{
Debug.Assert(model.DetailLevel != null, "model.DetailLevel != null");
2026-02-24 11:34:18 +08:00
view.DetailLevel = (ViewDetailLevel)model.DetailLevel;
2024-09-22 11:05:41 +08:00
}
if (model.ViewTemplate != null && view.IsValidViewTemplate(model.ViewTemplate.Id))
{
view.ViewTemplateId = model.ViewTemplate.Id;
}
if (model.IsSheetNameEditable)
{
2025-04-24 20:56:44 +08:00
view.get_Parameter(BuiltInParameter.VIEW_DESCRIPTION).Set((string)model.SheetName);
2024-09-22 11:05:41 +08:00
}
if (model.IsSheetNumberEditable && view is ViewSheet sheet)
{
sheet.SheetNumber = model.SheetNumber;
}
}
},
"修改视图属性"
);
});
}
2026-02-24 11:34:18 +08:00
[RelayCommand(CanExecute = nameof(CanCopyAsDependent))]
2024-09-22 11:05:41 +08:00
private void CopyAsDependent(System.Collections.IList items)
{
if (items == null || items.Count == 0)
{
return;
}
var list = items.Cast<ViewManagerModel>().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)
{
2026-02-24 11:34:18 +08:00
LogAssist.ToLog(e.Message);
2024-09-22 11:05:41 +08:00
}
},
"复制视图"
);
});
}
2026-02-24 11:34:18 +08:00
[RelayCommand(CanExecute = nameof(CanCopyOnly))]
2024-09-22 11:05:41 +08:00
private void CopyOnly(System.Collections.IList items)
{
if (items == null || items.Count == 0)
{
return;
}
var list = items.Cast<ViewManagerModel>().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)
{
2026-02-24 11:34:18 +08:00
LogAssist.ToLog(e.Message);
2024-09-22 11:05:41 +08:00
}
},
"复制视图"
);
});
}
2026-02-24 11:34:18 +08:00
[RelayCommand(CanExecute = nameof(CanCopyWidthDetail))]
2024-09-22 11:05:41 +08:00
private void CopyWithDetail(System.Collections.IList items)
{
if (items == null || items.Count == 0)
{
return;
}
var list = items.Cast<ViewManagerModel>().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)
{
2026-02-24 11:34:18 +08:00
LogAssist.ToLog(e.Message);
2024-09-22 11:05:41 +08:00
}
},
"复制视图"
);
});
}
[RelayCommand]
private void Delete(System.Collections.IList items)
{
if (items == null || items.Count == 0)
{
return;
}
var list = items.Cast<ViewManagerModel>().ToList();
//ViewCollection.RemoveAll(v => list.Contains(v));
handler.Raise(uiapp =>
{
var doc = uiapp.ActiveUIDocument.Document;
doc.Invoke(
_ =>
2024-09-22 11:05:41 +08:00
{
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;
2026-02-20 16:47:26 +08:00
return item.Name.Contains(SearchText) || item.UserViewType.GetAttribute<DescriptionAttribute>().Description.Contains(SearchText);
2024-09-22 11:05:41 +08:00
};
}
[RelayCommand]
private void RemoveTemplate(System.Collections.IList items)
{
if (items != null || items.Count == 0)
{
return;
}
handler.Raise(_ =>
2024-09-22 11:05:41 +08:00
{
var list = items.Cast<ViewManagerModel>().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<ViewManagerModel>().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)
{
2026-02-24 11:34:18 +08:00
view.DisplayStyle = (DisplayStyle)model.DisplayStyle;
2024-09-22 11:05:41 +08:00
}
if (view.HasViewDiscipline())
{
Debug.Assert(model.Discipline != null, "model.Discipline != null");
2026-02-24 11:34:18 +08:00
view.Discipline = (ViewDiscipline)model.Discipline;
2024-09-22 11:05:41 +08:00
}
if (model.IsScaleEditable)
{
view.Scale = model.Scale;
}
if (model.IsDetailLevelEditable)
{
Debug.Assert(model.DetailLevel != null, "model.DetailLevel != null");
2026-02-24 11:34:18 +08:00
view.DetailLevel = (ViewDetailLevel)model.DetailLevel;
2024-09-22 11:05:41 +08:00
}
if (model.ViewTemplate != null && view.IsValidViewTemplate(model.ViewTemplate.Id))
{
view.ViewTemplateId = model.ViewTemplate.Id;
}
if (model.IsSheetNameEditable)
{
2025-04-24 20:56:44 +08:00
view.get_Parameter(BuiltInParameter.VIEW_DESCRIPTION).Set((string)model.SheetName);
2024-09-22 11:05:41 +08:00
}
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<ViewManagerModel> message)
//{
// //ModelPropertyChanged = message.NewValue;
//}
public List<ViewManagerModel> ViewCollection { get; set; }
}