using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Szmedi.Toolkit.RvExtensions;
public static class UIDocumentExtensions
{
///
/// 运行命令选择元素或选择元素执行操作
///
public static List GetSelectedElems(
this UIDocument uidoc,
string prompt = "请选择元素",
ISelectionFilter filter = null,
ObjectType type = ObjectType.Element
)
{
//取到当前文档。
Document doc = uidoc.Document;
//取到当前文档的选择集。
List collection = uidoc.Selection.GetElementIds().Select(id => doc.GetElement(id)).ToList();
if (collection.Any())
{
return collection;
}
try
{
IList references =
filter == null ? uidoc.Selection.PickObjects(type, prompt) : uidoc.Selection.PickObjects(type, filter, prompt);
collection = references.Select(refer => doc.GetElement(refer)).ToList();
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException) { }
return collection;
}
///
/// 重复命令
///
///
///
///
public static void RepeatCommand(this UIDocument uidoc, Action action)
{
try
{
action?.Invoke();
uidoc.RepeatCommand(action);
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException) { }
}
///
/// 按类型选择元素
///
///
///
///
///
///
public static T SelectObject(this UIDocument uidoc, string prompt = "请选择元素", ObjectType objectType = ObjectType.Element)
where T : Element
{
try
{
Reference reference = uidoc.Selection.PickObject(objectType, new GenericFilter(), prompt);
return uidoc.Document.GetElement(reference) as T;
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException)
{
return null;
}
}
///
/// 按类型框选元素
///
///
///
///
///
public static IList SelectObjectsByRectangle(this UIDocument uidoc, string prompt = "请框选元素")
where T : Element
{
try
{
return uidoc.Selection.PickElementsByRectangle(new GenericFilter(), prompt).Cast().ToList();
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException)
{
return null;
}
}
///
/// 选择元素
///
///
///
///
///
public static Element SelectObject(
this UIDocument uidoc,
FuncFilter funcFilter,
string prompt = "请选择元素",
ObjectType objectType = ObjectType.Element
)
{
try
{
var reference = uidoc.Selection.PickObject(objectType, funcFilter, prompt);
return uidoc.Document.GetElement(reference);
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException)
{
return null;
}
}
public static List SelectObjects(
this UIDocument uidoc,
FuncFilter funcFilter,
string prompt = "请选择元素",
ObjectType objectType = ObjectType.Element
)
{
try
{
var references = uidoc.Selection.PickObjects(objectType, funcFilter, prompt);
return [.. references.Select(uidoc.Document.GetElement)];
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException)
{
return null;
}
}
///
/// 按类型选择多个元素
///
///
///
///
///
///
public static List SelectObjects(this UIDocument uidoc, string prompt = "请选择多个元素", ObjectType objectType = ObjectType.Element)
where T : Element
{
try
{
IList references = uidoc.Selection.PickObjects(objectType, new GenericFilter(), prompt);
return references.Select(refer => uidoc.Document.GetElement(refer) as T).ToList();
}
catch (Autodesk.Revit.Exceptions.OperationCanceledException)
{
return [];
}
}
}