前言
本文介绍 Revit 的图形样式的设定。
内容
Revit 提供了三种替换视图中图形的方式,按图元,按类别和按过滤器。这里有一个隐含的信息,图形样式的设定是和视图关联在一起的,不同的视图可以做不同的设定。
OverrideGraphicSettings
在 Revit API 中都是通过 OverrideGraphicSettings
来进行设定。以按类别设定为例,大致的对应关系如下图所示:
设定相关接口
这个是针对单个图形进行的设定,它的接口是 View
相关的:
// View::GetElementOverrides Method
public OverrideGraphicSettings GetElementOverrides(
ElementId elementId
)
// View::SetElementOverrides Method
public void SetElementOverrides(
ElementId elementId,
OverrideGraphicSettings overrideGraphicSettings
)
这个是针对类别进行的设定,它的接口是 View
相关的:
// View::GetCategoryOverrides Method
public OverrideGraphicSettings GetCategoryOverrides(
ElementId categoryId
)
// View::SetCategoryOverrides Method
public void SetCategoryOverrides(
ElementId categoryId,
OverrideGraphicSettings overrideGraphicSettings
)
这个是针对过滤器进行的设定,它的接口是 View
相关的:
// View::GetFilterOverrides Method
public OverrideGraphicSettings GetFilterOverrides(
ElementId filterElementId
)
// View::SetFilterOverrides
public void SetFilterOverrides(
ElementId filterElementId,
OverrideGraphicSettings overrideGraphicSettings
)
过滤器可以根据类别定义不同的规则,通过 ParameterFilterElement
来实现,可以通过 View.AddFilter
添加。
使用过滤器的例子,来自 Revit API 文档:
public static void CreateViewFilter(Document doc, View view)
{
List<ElementId> categories = new List<ElementId>();
categories.Add(new ElementId(BuiltInCategory.OST_Walls));
List<FilterRule> filterRules = new List<FilterRule>();
using (Transaction t = new Transaction(doc, "Add view filter"))
{
t.Start();
// 创建和类别相关的 ParameterFilterElement
ParameterFilterElement parameterFilterElement = ParameterFilterElement.Create(doc, "Example view filter", categories);
// 规则 1 - 墙的类型必须是外墙
ElementId exteriorParamId = new ElementId(BuiltInParameter.FUNCTION_PARAM);
filterRules.Add(ParameterFilterRuleFactory.CreateEqualsRule(exteriorParamId, (int)WallFunction.Exterior));
// 规则 2 - 墙的高度大于28
ElementId lengthId = new ElementId(BuiltInParameter.CURVE_ELEM_LENGTH);
filterRules.Add(ParameterFilterRuleFactory.CreateGreaterOrEqualRule(lengthId, 28.0, 0.0001));
// 规则 3 - 共享参数必须以 "15." 开始
// 通过 guid 得到某个实例的共享参数 - 目的是得到这个参数的 Id,即 sharedParam.Id
Guid spGuid = new Guid("96b00b61-7f5a-4f36-a828-5cd07890a02a");
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(Wall));
Wall wall = collector.FirstElement() as Wall;
if (wall != null)
{
Parameter sharedParam = wall.get_Parameter(spGuid);
ElementId sharedParamId = sharedParam.Id;
filterRules.Add(ParameterFilterRuleFactory.CreateBeginsWithRule(sharedParamId, "15.", true));
}
ElementFilter elemFilter = CreateElementFilterFromFilterRules(filterRules);
parameterFilterElement.SetElementFilter(elemFilter);
// Apply filter to view
view.AddFilter(parameterFilterElement.Id);
view.SetFilterVisibility(parameterFilterElement.Id, false);
t.Commit();
}
}
这个例子里面有个 CreateElementFilterFromFilterRules
,但没有给出实现:
ElementFilter CreateElementFilterFromFilterRules(IList<FilterRule> filterRules)
{
return new ElementParameterFilter(filterRules);
}
ElementParameterFilter 的接口:
namespace Autodesk.Revit.DB
{
public class ElementParameterFilter : ElementSlowFilter
{
public ElementParameterFilter(IList<FilterRule> filterRules);
public ElementParameterFilter(FilterRule filterRule);
public ElementParameterFilter(IList<FilterRule> filterRules, bool inverted);
public ElementParameterFilter(FilterRule filterRule, bool inverted);
public IList<FilterRule> GetRules();
}
}