要获取墙上的门窗,可以先把所有门窗过滤出来,再拿门窗的Host跟墙比,如果一个门或窗的Host Id和墙的Id相同,说明门窗依附于墙上。代码片段如下:
FilteredElementCollector collector = new FilteredElementCollector(uiDoc.Document);
collector.OfClass(typeof(Opening)).OfCategory(BuiltInCategory.OST_SWallRectOpening);
//wallId 618627
var wallOpenings = from c in collector where ((Opening)c).Host.Id == new ElementId(618627) select c;
以上代码是查找的洞口的,门窗同理。具体见大气象的文章。
还有一个简单点的办法,Wall类下有一个FindInserts方法,可以直接返回墙上的门窗洞口等。示例用法如下:
var v = SeleteWall.FindInserts(true, false, false, false);
如这样的一个墙
运行后
205829和204873分别是门、窗的Id。