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

编程如何判断一个对象在视图中可见?

2012-09-29 16:58 239 查看
转载请复制以下信息:

原文链接: http://blog.csdn.net/joexiongjin/article/details/8032852
作者: 叶雄进 , Autodesk ADN

一个对象在Revit的视图中是否可以见取决于

1. 这个对象是否在这个视图中隐藏了? 如果是用命令的方式在该视图中把目标对象隐藏了,可以用Element.IsHIde() 函数来获取这个对象的可见性。

2. 有些是因为视图设置的缘故看不见。比如在二层平面由于设置的原因,在二层看不见一层可见的对象。这种情况下用IsHide() 无法来判断一层的那些可见的对象是否在二层可见。

3. 对于轴线,我们可以在立面图上设置其在哪些平面图中显示。这样可以设置轴线在哪些平明图中可见。这种情况下无法用用IsHide() 来判断。

那么用什么办法可以判断一个对象在某一个视图中的可见性呢?

答:

对于2,3两种情况,Revit没有提供函数来直接判断对象是否可见。

变通办法: 使用Revit的过滤器。

Revit 过滤器有三个重载形式:

FilteredElementCollector(Document)

FilteredElementCollector(Document, ElementId)

FilteredElementCollector(Document, ICollection(ElementId))

其中第二个函数可以用来获取一个视图中所有可见对象。

所以我们可以通过第二个函数获取所有目标视图中的可见对象列表。然后在这个列表中确定是否包含了你的目标对象。

请看下面的代码。

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 ;
using Autodesk.Revit.UI.Selection;

  [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;
      Transaction trans = new Transaction(doc, "ExComm");
      trans.Start();

      //pick an object in the elevation view.
      Selection sel = app.ActiveUIDocument.Selection;
      Reference ref1 = sel.PickObject(ObjectType.Element, "pick the grid to check if it is visible in level 1 and level 2");
      Element pickObj = doc.GetElement(ref1);

      //check its visibility

      ViewPlan plan1 = null;
      ViewPlan plan2 = null;

      FilteredElementCollector collector = new FilteredElementCollector(doc);
      collector.OfClass(typeof(ViewPlan));

      Autodesk.Revit.DB.View plan;
      foreach (Element elem in collector) 
      {
        plan = elem as Autodesk.Revit.DB.View;
        if(plan.ViewType  ==  ViewType.FloorPlan)
        {
          if (plan.Name.Equals("Level 2"))
            plan2 = plan as ViewPlan;          
        }
      }

      FilteredElementCollector collector1 = new FilteredElementCollector(doc, plan2.Id);

      string msg = "not visible in Level 2";
      IList<Element> lists = collector1.ToElements();
      foreach (Element elem in lists)
      {
        if (elem.Id.IntegerValue.Equals(pickObj.Id.IntegerValue))
        {
          msg = "The pick object is visilbe in Level 2 plan view";
          break;
        }
      }

      TaskDialog.Show("visible?", msg);

      trans.Commit();

      return Result.Succeeded;
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: