2025-02-10 20:53:40 +08:00
|
|
|
|
using System.Windows;
|
|
|
|
|
|
using System.Windows.Controls;
|
|
|
|
|
|
using Autodesk.Revit.DB;
|
|
|
|
|
|
using Autodesk.Revit.UI;
|
|
|
|
|
|
using Nice3point.Revit.Toolkit.External.Handlers;
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-04-24 20:56:44 +08:00
|
|
|
|
namespace ShrlAlgoToolkit.RevitAddins.RvView;
|
2025-02-10 20:53:40 +08:00
|
|
|
|
|
2025-08-25 17:30:53 +08:00
|
|
|
|
public partial class ElementsControlDock : IDockablePaneProvider
|
2025-02-10 20:53:40 +08:00
|
|
|
|
{
|
|
|
|
|
|
public ElementsControlDock()
|
|
|
|
|
|
{
|
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
|
}
|
|
|
|
|
|
private ActionEventHandler ActionEventHandler { get; } = new();
|
|
|
|
|
|
//将外部事件定义为属性
|
|
|
|
|
|
|
|
|
|
|
|
//初始化可停靠窗口
|
|
|
|
|
|
public void SetupDockablePane(DockablePaneProviderData data)
|
|
|
|
|
|
{
|
|
|
|
|
|
data.FrameworkElement = this;
|
|
|
|
|
|
|
|
|
|
|
|
data.InitialState = new DockablePaneState
|
|
|
|
|
|
{
|
|
|
|
|
|
DockPosition = DockPosition.Tabbed
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void Btn_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
|
{
|
2025-08-24 13:49:55 +08:00
|
|
|
|
var btn = (Button)sender;
|
2025-02-10 20:53:40 +08:00
|
|
|
|
|
|
|
|
|
|
ElementClassFilter instanceFilter = new(typeof(FamilyInstance));
|
|
|
|
|
|
ElementClassFilter hostFilter = new(typeof(HostObject));
|
|
|
|
|
|
LogicalOrFilter orFilter = new(instanceFilter, hostFilter);
|
|
|
|
|
|
|
|
|
|
|
|
ActionEventHandler.Raise(app =>
|
|
|
|
|
|
{
|
|
|
|
|
|
var uidoc = app.ActiveUIDocument;
|
|
|
|
|
|
var doc = uidoc.Document;
|
|
|
|
|
|
//得到选择对象的ID
|
|
|
|
|
|
var selectedIds = uidoc.Selection.GetElementIds();
|
|
|
|
|
|
var view = uidoc.ActiveView;
|
|
|
|
|
|
doc.Invoke(
|
2025-10-04 08:52:23 +08:00
|
|
|
|
_ =>
|
2025-02-10 20:53:40 +08:00
|
|
|
|
{
|
|
|
|
|
|
//隐藏元素
|
|
|
|
|
|
if (HideElements == btn)
|
|
|
|
|
|
{
|
|
|
|
|
|
view.HideElements(selectedIds);
|
|
|
|
|
|
}
|
|
|
|
|
|
//所有视图隐藏元素
|
|
|
|
|
|
else if (HideElementsAll == btn)
|
|
|
|
|
|
{
|
|
|
|
|
|
var col = doc.OfClass<View>()
|
|
|
|
|
|
.WhereElementIsNotElementType()
|
|
|
|
|
|
.Cast<View>()
|
|
|
|
|
|
.Where(v => !v.IsTemplate);
|
|
|
|
|
|
foreach (var v in col)
|
|
|
|
|
|
{
|
|
|
|
|
|
v.HideElements(uidoc.Selection.GetElementIds());
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//隔离元素
|
|
|
|
|
|
else if (IsolateElements == btn)
|
|
|
|
|
|
{
|
|
|
|
|
|
var collector = view.OfCollector()
|
|
|
|
|
|
.WherePasses(orFilter)
|
|
|
|
|
|
.Excluding(selectedIds)
|
|
|
|
|
|
.ToElementIds();
|
|
|
|
|
|
doc.Invoke(_ => view.HideElements(collector), $"{btn.Content}");
|
|
|
|
|
|
}
|
|
|
|
|
|
//显示隐藏
|
|
|
|
|
|
else if (RevealHiddenElements == btn)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (doc.IsFamilyDocument)
|
|
|
|
|
|
{
|
|
|
|
|
|
ElementClassFilter formFilter = new(typeof(GenericForm));
|
|
|
|
|
|
ElementClassFilter combineFilter = new(typeof(GeomCombination));
|
|
|
|
|
|
|
|
|
|
|
|
orFilter = new(
|
|
|
|
|
|
[instanceFilter, formFilter, combineFilter]);
|
|
|
|
|
|
}
|
|
|
|
|
|
var hiddenElemsIds = doc.OfCollector()
|
|
|
|
|
|
.WherePasses(orFilter)
|
|
|
|
|
|
.Where(e => e.IsHidden(view))
|
|
|
|
|
|
.Select(e => e.Id).ToList();
|
|
|
|
|
|
doc.Invoke(_ => view.UnhideElements(hiddenElemsIds), $"{btn.Content}");
|
|
|
|
|
|
}
|
|
|
|
|
|
//锁定元素
|
|
|
|
|
|
else if (PinElements == btn)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var eleId in selectedIds)
|
|
|
|
|
|
{
|
|
|
|
|
|
var ele = doc.GetElement(eleId);
|
|
|
|
|
|
if (!ele.Pinned)
|
|
|
|
|
|
{
|
|
|
|
|
|
ele.Pinned = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//锁定类别
|
|
|
|
|
|
else if (PinCategories == btn)
|
|
|
|
|
|
{
|
|
|
|
|
|
var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id);
|
|
|
|
|
|
doc.Invoke(_ =>
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var group in groups)
|
|
|
|
|
|
{
|
|
|
|
|
|
doc.OfCollector()
|
|
|
|
|
|
.OfCategoryId(group.Key)
|
|
|
|
|
|
.Where(elem => !elem.Pinned)
|
|
|
|
|
|
.ToList()
|
|
|
|
|
|
.ForEach(elem => elem.Pinned = true);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, $"{btn.Content}");
|
|
|
|
|
|
}
|
|
|
|
|
|
//隐藏类别
|
|
|
|
|
|
else if (HideCategories == btn)
|
|
|
|
|
|
{
|
|
|
|
|
|
var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id);
|
|
|
|
|
|
doc.Invoke(_ =>
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var group in groups)
|
|
|
|
|
|
{
|
|
|
|
|
|
var collector = view.OfCollector().OfCategoryId(group.Key).ToElementIds();
|
|
|
|
|
|
view.HideElements(collector);
|
|
|
|
|
|
//相当于在VV菜单中关闭类别显示
|
|
|
|
|
|
//if (!UiDocument.ActiveView.GetCategoryHidden(category.Id))
|
|
|
|
|
|
//{
|
|
|
|
|
|
// UiDocument.Document.ActiveView.SetCategoryHidden(category.Id, true);
|
|
|
|
|
|
//}
|
|
|
|
|
|
}
|
|
|
|
|
|
}, $"{btn.Content}");
|
|
|
|
|
|
}
|
|
|
|
|
|
//隔离类别
|
|
|
|
|
|
else if (IsolateCategories == btn)
|
|
|
|
|
|
{
|
|
|
|
|
|
var collector = view.OfCollector()
|
|
|
|
|
|
.WherePasses(orFilter)
|
|
|
|
|
|
.ToElementIds();
|
|
|
|
|
|
view.HideElements(collector);
|
|
|
|
|
|
var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id);
|
|
|
|
|
|
foreach (var group in groups)
|
|
|
|
|
|
{
|
|
|
|
|
|
var collection = view.OfCollector().OfCategoryId(group.Key).ToElementIds();
|
|
|
|
|
|
|
|
|
|
|
|
view.UnhideElements(collection);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//解锁全部
|
|
|
|
|
|
else if (UnpinAllElements == btn)
|
|
|
|
|
|
{
|
|
|
|
|
|
doc.OfCollector()
|
|
|
|
|
|
.WherePasses(orFilter)
|
|
|
|
|
|
.Where(elem => elem.Pinned)
|
|
|
|
|
|
.ToList()
|
|
|
|
|
|
.ForEach(elem => elem.Pinned = false);
|
|
|
|
|
|
}
|
|
|
|
|
|
//解锁类别
|
|
|
|
|
|
else if (UnpinCategories == btn)
|
|
|
|
|
|
{
|
|
|
|
|
|
var groups = selectedIds.GroupBy(id => doc.GetElement(id).Category.Id);
|
|
|
|
|
|
foreach (var group in groups)
|
|
|
|
|
|
{
|
|
|
|
|
|
doc.OfCollector()
|
|
|
|
|
|
.OfCategoryId(group.Key)
|
|
|
|
|
|
.Where(elem => elem.Pinned)
|
|
|
|
|
|
.ToList()
|
|
|
|
|
|
.ForEach(e => e.Pinned = false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
$"{btn.Content}");
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|