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
|
|
|
|
}
|