EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

萧闫子 发表于 2014-1-9 12:55:33

遍历过滤对象

遍历过滤对象,得到想要的对象,是Revit二次开发一个重要的操作。/*
*Revit对象的标识
* Revit对象的类名称
* 直接可以用类名唯一标识出来:如:Wall,WallType,Floor,FloorType..
* 不同对象,但是共用一个类:FamilyInstance,FamilySymbol,Family,Element
*
* Rervit对象的Category名称
* 通过Revit的Category可以唯一标识对象的类别
* 门实例和门类型具有相同的Category
*
* 其他属性
* 如所在的楼层
* 如某一个参数的值
*
* 如何识别Revit中不同的对象
* 根据标识来识别区分不同的对象
* 只使用类名来判断
* 它们的特点:
* 片关能容纳其它对象或特定用途的类
* 如:Wall,Floor,contFooting,CelingAndFloor等系统族的实例
*
* 如果通过类名无法分别出来,需要联合对象的类别(Category)来判断
* 门窗柱等对象没有专用的类来表示,都是FamilyInstance的实例
* 用Category来判断其类别
* 用枚举型的BuiltInCategory,来创建ElementCategoryFilter对象,支持多国语言
*/


public class GetElement : IExternalCommand
{
    public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
    {
      try
      {
            if (null == commandData)
            {
                throw new ArgumentNullException("commandData");
            }

            UIApplication uiApp = commandData.Application;
            Document doc = uiApp.ActiveUIDocument.Document;
            Selection sel = uiApp.ActiveUIDocument.Selection;

            FilteredElementCollector collector = new FilteredElementCollector(doc);
            collector.OfClass(typeof(Duct)).OfCategory(BuiltInCategory.OST_DuctCurves);//风管,直接用类名
            //collector.OfClass(typeof(Wall)).OfCategory(BuiltInCategory.OST_Walls);//墙,直接用类名
            //collector.OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_Windows);//窗,类型是FamilyInstance
            IList<Element> lists = collector.ToElements();
            string strMsg = string.Format("有{0}个", lists.Count);
            MessageBox.Show(strMsg);

            //使用过滤器
            FilteredElementCollector collector2 = new FilteredElementCollector(doc);
            ElementClassFilter classFilter = new ElementClassFilter(typeof(FamilyInstance));
            ElementCategoryFilter catFilter = new ElementCategoryFilter(BuiltInCategory.OST_Doors);
            //把过滤器联合起来
            LogicalAndFilter logicalFilter = new LogicalAndFilter(classFilter, catFilter);
            collector2.WherePasses(logicalFilter);
            IList<Element> list2 = collector2.ToElements();
            strMsg = string.Format("有门{0}个", list2.Count);
            MessageBox.Show(strMsg);
      }
      catch (Exception e)
      {
            messages = e.Message;
            return Result.Failed;
      }

      return Result.Succeeded;
    }
}


老朽 发表于 2014-2-20 14:39:22

顶......
楼下跟上.....

大雪无痕 发表于 2014-11-29 21:41:37

一定要顶!
页: [1]
查看完整版本: 遍历过滤对象