RevitAPI实现元素的筛选和颜色修改

zhy

发布于 2020.02.13 14:06 阅读 2762 评论 0

        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。