Revit元素的筛选是Revit中最常用到的功能,接下来要通过筛选Revit中的屋顶并改变其颜色来进行API的学习。
在使用之前先了解一下Revit提供的元素过滤器的API,FilteredElementCollector有三种构造方法。
FilteredElementCollector的筛选方法有三种类型:
1. 通过WherePasses(ElementFilter filter)来筛选,可以多次使用
2.通过OfClass,OfCategoryId,OwnedByView三种快捷方法获取
3. 通过UnionWith(FilteredElementCollector),IntersectWith(FilteredElementCollector)来筛选两个过滤器的并集和交集
了解完API后,就要使用API来进行练习了:
实现步骤如下:
1. 获取Document对象
2. 过滤填充图案
3. 获得实体填充
4. 创建事务,开始事务
5. 获取当前视图和OverrideGraphicSettings对象
6. 设置设置填充图案和颜色,应用到视图
7. 提交事务,返回成功结果
代码实现如下:
//传入Document对象
public void ChangeRoofColor(Document doc)
{
//过滤填充图案
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(FillPatternElement));
//获取实体填充
FillPatternElement fp = collector.First(m => (m as FillPatternElement).GetFillPattern().IsSolidFill) as FillPatternElement;
Transaction trans = new Transaction(doc, "trans");
trans.Start();
View v = doc.ActiveView;
FilteredElementCollector ElementCollector = new FilteredElementCollector(doc);
//筛选出Roof元素
ICollection<ElementId> elementIds = ElementCollector.OfCategory(BuiltInCategory.OST_Roofs).ToElementIds();
string prompt = "The ids of the Roof in the current document are:";
foreach (ElementId elementId in elementIds)
{
String name = doc.GetElement(elementId).Category.Name;
prompt += "\n\t" + elementId.IntegerValue + " "+name;
OverrideGraphicSettings ogs = v.GetElementOverrides(elementId);
//设置 投影/表面 ->填充图案->填充图案
ogs.SetProjectionFillPatternId(fp.Id);
//设置 投影/表面 ->填充图案->颜色
ogs.SetProjectionFillColor(new Color(255, 255, 0));
//应用到视图
v.SetElementOverrides(elementId, ogs);
}
TaskDialog.Show("Revit", prompt);
//提交事务
trans.Commit();
}
前后实现效果:
学习总结:
1.OfClass(typeof(FillPatternElement))等同于
WherePasses(new ElementClassFilter(typeof(FillPatternElement)))。
2.在Revit中,每个元素都有唯一的id,通过getElement(ElementId id)可以获取到元素。
3.对Revit模型进行修改的操作要放在事务中,否则会出现 ModificationOutsideTransactionException。
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}