添加项目文件。

This commit is contained in:
GG Z
2024-09-22 11:05:41 +08:00
parent fb5d55723a
commit 49ceaae6a8
764 changed files with 78850 additions and 0 deletions

View File

@@ -0,0 +1,159 @@
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Architecture;
namespace Sai.Toolkit.Revit.Assist;
public static class CollectorAssist
{
/// <summary>
/// 多类别的元素集合
/// </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>
///// 基于视图的类别收集器
///// </summary>
///// <param name="view">收集的视图</param>
///// <param name="builtInCategory">元素的类别</param>
///// <returns>过滤元素收集器</returns>
//public static FilteredElementCollector OfCategory(this View view, BuiltInCategory builtInCategory) =>
// view.OfCollector().OfCategory(builtInCategory);
/// <summary>
/// 类型的元素集合
/// </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>
/// 基于视图的类型收集器
/// </summary>
/// <typeparam name="T">元素的类</typeparam>
/// <param name="view">收集的视图</param>
/// <returns>过滤元素收集器</returns>
public static FilteredElementCollector OfClass<T>(this View view)
where T : Element => view.OfCollector().OfClass(typeof(T));
/// <summary>
/// 多类型的元素集合
/// </summary>
/// <param name="doc"></param>
/// <param name="types">指定类型</param>
/// <returns></returns>
public static FilteredElementCollector OfClasses(this Document doc, params Type[] types) =>
doc.OfCollector().WherePasses(new ElementMulticlassFilter(types));
/// <summary>
/// 基于视图的多类别收集器
/// </summary>
/// <param name="view">收集的视图</param>
/// <param name="types">多个类别</param>
/// <returns>过滤元素收集器</returns>
public static FilteredElementCollector OfClasses(this View view, params Type[] types) =>
view.OfCollector().WherePasses(new ElementMulticlassFilter(types));
/// <summary>
/// 视图元素收集器(临时隐藏也算不可见)
/// </summary>
/// <param name="view">收集的视图</param>
/// <returns></returns>
public static FilteredElementCollector OfCollector(this View view) =>
view == null
? throw new ArgumentNullException(nameof(view), "收集视图为空")
: FilteredElementCollector.IsViewValidForElementIteration(view.Document, view.Id)
? new FilteredElementCollector(view.Document, view.Id)
: throw new ArgumentException($"视图{view.Id}不可应用收集器");
public static FilteredElementCollector OfModelCollector(this Document doc)
{
if (doc == null)
{
throw new ArgumentNullException(nameof(doc), "文档为空");
}
var li = doc.OfCollector()
.WhereElementIsNotElementType()
.Where(
e => e is TopographySurface ||
(e.CanHaveTypeAssigned() &&
e.HasPhases() &&
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);
}
/// <summary>
/// 文档的元素收集器
/// </summary>
/// <param name="document"></param>
/// <returns>过滤元素收集器</returns>
public static FilteredElementCollector OfCollector(this Document document) => document == null ? throw new ArgumentNullException(nameof(document), "文档为空") : new(document);
/// <summary>
/// 基于视图的实例收集器
/// </summary>
/// <param name="view">收集的视图</param>
/// <param name="builtInCategory">元素的类别</param>
/// <returns>过滤元素收集器</returns>
public static FilteredElementCollector OfElementType(this FilteredElementCollector collector) =>
collector.WhereElementIsElementType();
/// <summary>
/// 基于过滤器元素集合
/// </summary>
/// <param name="collector"></param>
/// <param name="filter"></param>
/// <returns></returns>
public static FilteredElementCollector OfFilter(this FilteredElementCollector collector, ElementFilter filter) =>
collector.WherePasses(filter);
/// <summary>
/// 多个过滤器的收集器
/// </summary>
/// <param name="collector">收集器</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>
/// 基于视图的实例收集器
/// </summary>
/// <param name="collector">收集器</param>
/// <returns>过滤元素收集器</returns>
public static FilteredElementCollector OfInstance(this FilteredElementCollector collector) =>
collector.WhereElementIsNotElementType();
/// <summary>
/// 过滤项目文件的模型元素
/// </summary>
/// <returns>元素集合</returns>
public static IEnumerable<Element> OfModelElements(this FilteredElementCollector collector) =>
collector
.WhereElementIsNotElementType()
.Where(
e => e is TopographySurface ||
(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)
);
}