一、为什么要对元素进行过滤?
-
提高效率: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;}
}