目前筛选还是只能选出一类东西,如果要更精确地往下取,比如只选出一个特定的墙、门,则需要进一步了解FilteredElementCollector,了解IEnumberable接口以及List的应用。
查找Revit API时发现上面一直用的FilteredElementCollector有个叫IEnumberable接口(List<>列表也是继承了这个接口),所以可以做foreach循环。 List的话感觉像是一个数组,这边基础没学,有空补一下。 因为Element最大,全部元素都继承于它,所以任何类型都能由Element类型接收。
//转为List获取 List<Element> elementList = new List<Element>(); foreach (var item in collector) { if (item.Name== "CL_W1") { elementList.Add(item); } } //用Linq表达式实现上述代码同样的功能 var wallElement = from element in collector where element.Name == "CL_W1" select element; List<Element> wallElement2 = wallElement.ToList<Element>();某个族实例的获取,确定只有一个实例时:
//list获取 Element wallInstance = elementList[0]; //IEnumberable获取 Element wallInstance = wallElement.FirstOrDefault<Element>();这里要注意直接Element wallInstance = wallElement[0]会报错 这边出现的问题在于 IEnumberable接口不能用[i]型查找,得用.FirstOrDefault()。 IEnumberable接口可以用来foreach,不过要用[i]的话还是得转成List。
另外还有一种lambda写法,可以在.FirstOrDefault()里添加筛选条件。 里面的x是个变量,y也可以,随意命名。
//lambda表达式的一种写法 Element wallInstance = collectorTwo.OfCategory(BuiltInCategory.OST_Walls).OfClass(typeof(Wall)).FirstOrDefault<Element>(x => x.Name == "CL_W1");