一、为什么要对元素进行过滤?
-
提高效率:Revit模型可能包含成千上万的元素,直接对所有元素进行操作会非常耗时。通过过滤,可以只选择需要处理的元素,从而提高代码的执行效率。
-
精准控制:通过过滤,开发者可以精确地选择特定条件地元素,例如按照类型、类别、属性等进行筛选,从而实现更精细的控制。
-
避免错误:在修改或删除元素时,如果不进行过滤,可能会误操作到不应该更改的元素。过滤可以便面这类错误的发生。
二、Revit API 能进行过滤的基础是什么?
Revit API 进行过滤的基础是其灵活的过滤机制,通过 FilteredElementCollector
类和各种过滤器类,开发者可以精确地筛选出模型中符合特定条件的元素。
如此方便灵活的过滤,基于的是对构件体系的良好实现,参考:Revit API:Element 的分类。如果没有做好元素的分类,想要把过滤机制做好会很困难。而有了这个分类,则逻辑会清晰的多。
三、怎么进行过滤?
官网已经给出了很多例子,现在AI非常聪明,再自己写例子,价值不大。只要能有语言表达清楚,就可以用大模型了。例如,下面这个复杂例子,AI可以很好的生成,仅需自己稍微调整一下代码。查找文件中,类别为墙,高度在2000毫米以上,名字中有Brick,且有一个自定义参数是“预制”,值为“真”的。
// 代码由AI生成,可能存在一定的错误。请自行调试
using Autodesk.Revit.DB;
using System.Collections.Generic;
using System.Linq;
public class WallFinder
{
public List<Element> FindWalls(Document document)
{
if (document == null) throw new ArgumentNullException("document");
FilteredElementCollector collector = new FilteredElementCollector(document);
List<Element> walls = collector
.OfCategory(BuiltInCategory.OST_Walls)
.WhereElementIsNotElementType()
.Where(wall =>
{
// 获取高度参数
Parameter heightParam = wall.get_Parameter(BuiltInParameter.WALL_HEIGHT_PARAM);
if (heightParam == null) return false;
// 获取墙的高度并转换为毫米
double height = heightParam.AsDouble() * 304.8; // 1英尺 = 304.8毫米
if (height <= 2000) return false;
// 检查墙的名字是否包含"Brick"
if (!wall.Name.Contains("Brick")) return false;
// 检查自定义参数"预制"的值是否为"真"
Parameter yParam = wall.LookupParameter("预制");
if (yParam == null) return false;
string yValue =预制Param.AsValueString();
if (yValue != "真") return false;
return true;
})
.ToList();
return walls;
}
}