Revit API 判断一个构件在某个视图中的可见性
查看 Revit API。发现有Element::IsHidden
这个方法。通过UI创建一个element,注意要使得这个element在某些视图可见,但是在另一些视图不可见。运行下面的方法,你会发现几乎所有的视图都会返回true
,这个结果并不是我们想要的。
1 public void ishide() 2 { 3 Element elem = Document.GetElement(new ElementId(123456)); 4 FilteredElementCollector fec = new FilteredElementCollector(Document).OfClass(typeof(View)); 5 string res = ""; 6 foreach(View view in fec.ToElements()) 7 { 8 if(elem.IsHidden(view)) 9 continue; 10 res += view.Name + view.Id.ToString() + "\n"; 11 } 12 TaskDialog.Show("Visible", res); 13 }
既然从element这里无法找到适合的方法,那么转到和view相关的方法。这里我想到了在过滤构件的时候,即使用FilteredElementCollector
的时候可以给它传递一个额外的参数。通过这种方式,FilteredElementCollector
仅仅会在特定的视图中可见的那些element上做过滤。运行下面的代码,可以得到期望的结果。
1 public void ishide() 2 { 3 ElementId elemId = new ElementId(123456); 4 FilteredElementCollector fec = new FilteredElementCollector(Document).OfClass(typeof(View)); 5 string res = ""; 6 foreach(View view in fec.ToElements()) 7 { 8 if(!isVisble(view.Id, elemId)) 9 continue; 10 res += view.Name + view.Id.ToString() + "\n"; 11 } 12 TaskDialog.Show("Visible View", res); 13 } 14 15 public bool isVisble(ElementId viewId, ElementId instId) 16 { 17 try 18 { 19 FilteredElementCollector fec = new FilteredElementCollector(Document, viewId).OfClass(typeof(FamilyInstance)); 20 foreach(FamilyInstance fi in fec.ToElements()) 21 { 22 if(fi.Id == instId) 23 return true; 24 } 25 } 26 catch(Exception) 27 { 28 // 某类视图不能使用 FilteredElementCollector 29 } 30 return false; 31 }