您的位置:首页 > 编程语言

编程获取Revit视图中的所有实例对象数量

2012-06-20 10:36 791 查看
转载请复制以下信息:

原文链接: /article/1765006.html

作者: 叶雄进, Autodesk ADN



问题:

现在需要获取视图中的所有实例对象,包括系统族的实例与用户自建族的实例。使用OfClass(typeof(FamilyInstance))过滤方法比较容易获取用户自建族的实例,但是视图中的系统族实例,不知道如何一起获取出来,请指教。



答:



是的,通过FilteredElementCollector.OfClass(typeof((FamilyInstance)) 只能获取标准族实例,也就是你说的自建族实例。

但是系统族实例并不是从FamilyInstance类派生的,而是从HostObject类派生。

所以你可以使用逻辑Or过滤器LogicOrFilter,把两个类过滤器(ElementClassFilter)合并起来实现。



下面是完整实现代码。在对话框中显示所有实例对象的数量。

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

using  Autodesk.Revit .DB;
using Autodesk.Revit.UI;
using Autodesk.Revit .ApplicationServices;
using Autodesk.Revit.Attributes ;

 

  [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class RevitCommand : IExternalCommand
{
    public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
    {

      UIApplication app = commandData.Application;
      Document doc = app.ActiveUIDocument.Document;

      ElementClassFilter instanceFitler = new ElementClassFilter(typeof(FamilyInstance));
      ElementClassFilter hostFilter = new ElementClassFilter(typeof(HostObject));

      LogicalOrFilter andFilter = new LogicalOrFilter(instanceFitler, hostFilter);

      FilteredElementCollector collector = new FilteredElementCollector(doc);
      collector.WherePasses(andFilter);

      TaskDialog.Show("numbers", collector.ToElementIds().Count.ToString());
    
        return Result.Succeeded ;
    }
}



上面的代码获得了实例数量,当然你可以对其中的每一个对象进行遍历做你希望的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐