Files
ShrlAlgoToolkit/Sai.Toolkit.Revit/Assist/CollectorAssist.cs

183 lines
7.0 KiB
C#
Raw Normal View History

2024-09-22 11:05:41 +08:00
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
namespace Sai.Toolkit.Revit.Assist;
public static class CollectorAssist
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>
/// </summary>
/// <param name="collector"></param>
/// <param name="categories"></param>
/// <returns></returns>
public static FilteredElementCollector OfCategories(this FilteredElementCollector collector, params BuiltInCategory[] categories) =>
collector.WherePasses(new ElementMulticategoryFilter(categories));
///// <summary>
///// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>
///// </summary>
///// <param name="view"><3E>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>ͼ</param>
///// <param name="builtInCategory">Ԫ<>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD></param>
///// <returns><3E><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD></returns>
//public static FilteredElementCollector OfCategory(this View view, BuiltInCategory builtInCategory) =>
// view.OfCollector().OfCategory(builtInCategory);
/// <summary>
/// <20><><EFBFBD>͵<EFBFBD>Ԫ<EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="doc"></param>
/// <returns></returns>
public static FilteredElementCollector OfClass<T>(this Document doc)
where T : Element => doc.OfCollector().OfClass(typeof(T));
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>
/// </summary>
/// <typeparam name="T">Ԫ<>ص<EFBFBD><D8B5><EFBFBD></typeparam>
/// <param name="view"><3E>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>ͼ</param>
/// <returns><3E><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD></returns>
public static FilteredElementCollector OfClass<T>(this View view)
where T : Element => view.OfCollector().OfClass(typeof(T));
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>Ԫ<EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>
/// </summary>
/// <param name="doc"></param>
/// <param name="types">ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns></returns>
public static FilteredElementCollector OfClasses(this Document doc, params Type[] types) =>
doc.OfCollector().WherePasses(new ElementMulticlassFilter(types));
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>
/// </summary>
/// <param name="view"><3E>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>ͼ</param>
/// <param name="types"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD></returns>
public static FilteredElementCollector OfClasses(this View view, params Type[] types) =>
view.OfCollector().WherePasses(new ElementMulticlassFilter(types));
/// <summary>
/// <20><>ͼԪ<CDBC><D4AA><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>
/// </summary>
/// <param name="view"><3E>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>ͼ</param>
/// <returns></returns>
public static FilteredElementCollector OfCollector(this View view) =>
view == null
? throw new ArgumentNullException(nameof(view), "<22>ռ<EFBFBD><D5BC><EFBFBD>ͼΪ<CDBC><CEAA>")
: FilteredElementCollector.IsViewValidForElementIteration(view.Document, view.Id)
? new FilteredElementCollector(view.Document, view.Id)
: throw new ArgumentException($"<22><>ͼ{view.Id}<7D><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>");
/// <summary>
/// <20>ĵ<EFBFBD><C4B5><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>
/// </summary>
/// <param name="document"></param>
/// <returns><3E><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD></returns>
public static FilteredElementCollector OfCollector(this Document document) => document == null ? throw new ArgumentNullException(nameof(document), "<22>ĵ<EFBFBD>Ϊ<EFBFBD><CEAA>") : new(document);
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>ʵ<EFBFBD><CAB5><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>
/// </summary>
/// <param name="view"><3E>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>ͼ</param>
/// <param name="builtInCategory">Ԫ<>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD></returns>
public static FilteredElementCollector OfElementType(this FilteredElementCollector collector) =>
collector.WhereElementIsElementType();
/// <summary>
/// <20><><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>
/// </summary>
/// <param name="collector"></param>
/// <param name="filter"></param>
/// <returns></returns>
public static FilteredElementCollector OfFilter(this FilteredElementCollector collector, ElementFilter filter) =>
collector.WherePasses(filter);
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>
/// </summary>
/// <param name="collector"><3E>ռ<EFBFBD><D5BC><EFBFBD></param>
/// <param name="filters"></param>
/// <returns></returns>
public static FilteredElementCollector OfFilters(
this FilteredElementCollector collector,
List<ElementFilter> filters,
bool logicalAnd = false
)
{
ElementLogicalFilter filter = logicalAnd ? new LogicalAndFilter(filters) : new LogicalOrFilter(filters);
collector.WherePasses(filter);
return collector;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>ʵ<EFBFBD><CAB5><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>
/// </summary>
/// <param name="collector"><3E>ռ<EFBFBD><D5BC><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD></returns>
2024-12-22 10:26:12 +08:00
public static FilteredElementCollector OfInstances(this FilteredElementCollector collector) =>
2024-09-22 11:05:41 +08:00
collector.WhereElementIsNotElementType();
2024-12-22 10:26:12 +08:00
public static FilteredElementCollector OfModelCollector(this Document doc)
{
if (doc == null)
{
throw new ArgumentNullException(nameof(doc), "<22>ĵ<EFBFBD>Ϊ<EFBFBD><CEAA>");
}
var li = doc.OfCollector()
.WhereElementIsNotElementType()
.Where(
e => e is TopographySurface ||
e is DirectShape ||
(e.CanHaveTypeAssigned()
&& e.IsValidObject
&& e.HasPhases()
&& e.get_BoundingBox(null) != null
&& e.Category is { Parent: null, CategoryType: CategoryType.Model }
&& e is not Panel
&& e is not Mullion
&& e is not RevitLinkInstance)).Select(e => e.Id).ToList();
return new FilteredElementCollector(doc, li);
}
2024-09-22 11:05:41 +08:00
/// <summary>
2024-12-22 10:26:12 +08:00
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EEB6A5><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ԫ<EFBFBD><D4AA>
2024-09-22 11:05:41 +08:00
/// </summary>
/// <returns>Ԫ<>ؼ<EFBFBD><D8BC><EFBFBD></returns>
2024-12-22 10:26:12 +08:00
public static IEnumerable<Element> OfParentModelElements(this Document doc) =>
doc.OfCollector()
2024-09-22 11:05:41 +08:00
.WhereElementIsNotElementType()
.Where(
e => e is TopographySurface ||
2024-12-22 10:26:12 +08:00
e is DirectShape ||
2024-09-22 11:05:41 +08:00
(e.CanHaveTypeAssigned()
&& e.IsValidObject
&& e.HasPhases()
&& e.get_BoundingBox(null) != null
2024-12-22 10:26:12 +08:00
&& e.Category is { CategoryType: CategoryType.Model, AllowsBoundParameters: true }
&& (e is HostObject || e.Category.Parent == null)
2024-09-22 11:05:41 +08:00
&& e is not Panel
&& e is not Mullion
&& e is not RevitLinkInstance)
);
2024-12-22 10:26:12 +08:00
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ԫ<EFBFBD><D4AA>
/// </summary>
/// <returns>Ԫ<>ؼ<EFBFBD><D8BC><EFBFBD></returns>
public static IEnumerable<Element> OfAllModelElements(this Document doc) =>
doc.OfCollector()
.WhereElementIsNotElementType()
.Where(
e => e is TopographySurface ||
e is DirectShape ||
(e.CanHaveTypeAssigned()
&& e.IsValidObject
&& e.HasPhases()
&& e.ViewSpecific == false
&& e.Category is { CategoryType: CategoryType.Model, AllowsBoundParameters: true }
&& e.get_BoundingBox(null) != null
&& e is not RevitLinkInstance)
);
2024-09-22 11:05:41 +08:00
}