2014-03-05 72 views
0

我正在做一個Revit Macro以獲取零件(地板部分)的中心點,以檢查它是否在房間或空間內。 我無法得到BoundingBox對象,它給我一個點以外的部分,所以我嘗試使用Geometry元素內部表面獲得網格頂點,但我卡在計算中點。 我在下面的代碼片段中使用了一種相當天真的算法,但它給了我一個假結果,因爲它似乎受到最小/最大變量的初始默認值的影響。 有什麼建議嗎?如何在Revit中獲取Face或PlanarFace元素的中心點

PS:DebugTools是我自己的自定義幫助類。

public void ZoneDetect() 
{ 
    Document doc = this.ActiveUIDocument.Document; 

    using (Transaction t = new Transaction(doc,"Set Rooms By Region")) 
    { 
     t.Start(); 

     FilteredElementCollector fec = 
      new FilteredElementCollector(doc) 
       .OfClass(typeof(Part)) 
       .OfCategory(BuiltInCategory.OST_Parts) 
       .Cast<Part>(); 

     foreach (Part p in fec) 
     { 


      Options op = new Options(); 
      op.View=doc.ActiveView; 
      op.ComputeReferences=true; 

      GeometryElement gm=p.get_Geometry(op); 
      Solid so = gm.First() as Solid; 
      PlanarFace fc=so.Faces.get_Item(0) as PlanarFace; 

      foreach (PlanarFace f in so.Faces) 
      { 
       if (f.Normal == new XYZ(0,0,-1)) fc=f; 
      } 
      XYZ max = new XYZ(); 
      XYZ min = new XYZ(); 

      int no = 0; 
      foreach (XYZ vx in fc.Triangulate().Vertices) 
      { 
       // Just for debugging 
       DebugTools.DrawModelTick(vx,doc,"Max"); 
       doc.Regenerate(); 
       TaskDialog.Show("Point:"+no.ToString(),vx.ToString()); 
       no++; 

       //Comparing points 
       if (vx.X>max.X) max=new XYZ (vx.X,max.Y,0); 
       if (vx.Y>max.Y) max=new XYZ (max.X,vx.Y,0); 
       if (vx.X<min.X) min=new XYZ (vx.X,min.Y,0); 
       if (vx.Y<min.Y) min=new XYZ (min.X,vx.Y,0); 
      } 

      XYZ mid = new XYZ(max.X-min.X,max.Y-min.Y,0); 

      DebugTools.DrawModelTick(mid,doc,"Mid"); 
      DebugTools.DrawModelTick(max,doc,"Max"); 
      DebugTools.DrawModelTick(min,doc,"Min"); 
     } 

     t.Commit(); 
    } 
} 

回答

0

看起來好像你正在尋找一個多邊形的重心。該算法可以在這裏找到:Center of gravity of a polygon

一旦你有一個Face對象,您可以枚舉其邊緣接收的頂點列表。使用臉上最長的EdgeLoops。收集所有點並確保它們按照正確的順序(邊緣的起點和終點可能需要交換)。

+1

即便如此,仍然會出現假想的情況,即重心不在地面上。在某些情況下,你最好做一個網格點並確定點是否在臉內。 – Matt

0

達仁&馬特非常感謝您的回答, 由於我處理的是相當簡單的形狀(主要是矩形),我只需要在中心附近得到一個點,以測試它是否在房間內,我的問題與我使用的天真算法相比,結果是錯誤的。 我糾正它,如下所示:

XYZ midSum = Max + Min; 
XYZ mid = new XYZ(midSum.X/2 , midSum.Y/2,0); 

我會考慮使用你提供的鏈接煉化它,但現在我將進入手完成我的任務。

非常感謝

相關問題