Revit二次开发之“遍历过滤对象”

遍历过滤对象,得到想要的对象,是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对象,支持多国语言
 
*/
[Transaction(TransactionMode.Automatic)]
[Regeneration(RegenerationOption.Automatic)]
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;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值