一、背景
在Revit【视图】→【可见性/图形】中,可以通过自定义过滤器的方式获得具有相同特征的构件,并进一步设置构件在指定视图中表面、投影、截面的线和面的可见性、填充图案、填充颜色等属性。Revit二开应该如何实现此功能呢?
二、解决思路
实现上述功能主要用到Revit API中提供的OverrideGraphicSettings类,通过GetElementOverrides方法获得指定视图的OverrideGraphicSettings,该方法需要传入一个ElementId。
1.过滤器获得ElementId
a.ParameterFilterRuleFactory方法获得ElementId
ElementId elementId = new ElementId(BuiltInParameter.ALL_MODEL_FAMILY_NAME);//参数
IList<FilterRule> rules = new List<FilterRule>();
rules.Add(ParameterFilterRuleFactory.CreateContainsRule(elementId, "衬砌",true));//true,是否区分大小写
ElementParameterFilter elementParameterFilter = new ElementParameterFilter(rules);
FilteredElementCollector collector = new FilteredElementCollector(document).OfCategory(BuiltInCategory.OST_Mass).WherePasses(elementParameterFilter);
b.FilteredElementCollector方法获得ElementId
List<Element> collector = new FilteredElementCollector(document).OfCategory(BuiltInCategory.OST_Mass).OfClass(typeof(FamilyInstance)).Where<Element>(x => x.Name.Contains(inputData[7][i])).ToList();
这里的本质是通过一定规则获得ElementId,因此最简单常用的过滤器方法都是可行的。上述两种方法的区别在于,第一种更还原我们在Revit中的操作方式,同时可以设置多个规则的复杂组合,适用于需求较复杂的情况;第二种更直接,一般情况比较推荐。
2.参数设置
//获取填充方式(实体填充)
FilteredElementCollector fillPatternElementFilter = new FilteredElementCollector(document);
fillPatternElementFilter.OfClass(typeof(FillPatternElement));
FillPatternElement fillPatternElement = fillPatternElementFilter.First(f => (f as FillPatternElement).GetFillPattern().IsSolidFill) as FillPatternElement;
foreach (Element element in collector)
{
OverrideGraphicSettings overrideGraphicSettings = document.ActiveView.GetElementOverrides(element.Id);//GetElementOverrides GetCategoryOverrides
transaction.Start();
overrideGraphicSettings.SetSurfaceForegroundPatternId(fillPatternElement.Id);//前景填充图案
overrideGraphicSettings.SetSurfaceForegroundPatternColor(new Color(255,182,193));//前景填充颜色
overrideGraphicSettings.SetSurfaceTransparency(0);//设置透明度(0:不透明;1:透明)
//将设置应用到视图
document.ActiveView.SetElementOverrides(element.Id, overrideGraphicSettings);
transaction.Commit();
}
三、注意事项
1. 注意GetElementOverrides与GetCategoryOverrides,别用混了;
2. 注意SetProjectionFillPatternId与SetProjectionFillColor仅Revit 2019之前的版本可用,之后被废弃了;
3. 如果是修改参数,则必须将设置应用到视图,提取参数则不必,别问我怎么知道的~ ~;
4. 使用ParameterFilterRuleFactory时,如果发现过滤器中没有Element,可用去检查BuiltInParameter的枚举类型是否正确。