chekalin-v

Copy floor in Revit with openings

Jul 2nd, 2013
389
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     private Floor CopyFloor(Floor sourceFloor)
  2.         {
  3.             var floorGeometryElement =
  4.                 sourceFloor.get_Geometry(new Options());
  5.  
  6.             foreach (var geometryObject in floorGeometryElement)
  7.             {
  8.                 var floorSolid =
  9.                     geometryObject as Solid;
  10.  
  11.                 if (floorSolid == null)
  12.                     continue;
  13.  
  14.                 var topFace =
  15.                     GetTopFace(floorSolid);
  16.  
  17.                 if (topFace == null)
  18.                     throw new NotSupportedException("Floor does not have top face");
  19.  
  20.                 if (topFace.EdgeLoops.IsEmpty)
  21.                     throw new NotSupportedException("Floor top face does not have edges");
  22.  
  23.                 var outerBoundary =
  24.                     topFace.EdgeLoops.get_Item(0);
  25.  
  26.                 // create new floor using source floor outer boundaries
  27.  
  28.                 CurveArray floorCurveArray =
  29.                     GetCurveArrayFromEdgeArary(outerBoundary);
  30.                
  31.                 var newFloor =
  32.                     sourceFloor
  33.                         .Document
  34.                         .Create
  35.                         .NewFloor(floorCurveArray, false);
  36.  
  37.                
  38.                 // if source floor has openings
  39.                 if (topFace.EdgeLoops.Size > 1)
  40.                 {
  41.                     for (int i = 1; i < topFace.EdgeLoops.Size; i++)
  42.                     {
  43.                         var openingEdges =
  44.                             topFace.EdgeLoops.get_Item(i);
  45.  
  46.                         var openingCurveArray =
  47.                             GetCurveArrayFromEdgeArary(openingEdges);
  48.  
  49.                         var opening =
  50.                             sourceFloor
  51.                                 .Document
  52.                                 .Create
  53.                                 .NewOpening(newFloor,
  54.                                             openingCurveArray,
  55.                                             true);
  56.                     }
  57.                 }
  58.                
  59.                 return newFloor;
  60.             }
  61.  
  62.             return null;
  63.         }
  64.  
  65.         private CurveArray GetCurveArrayFromEdgeArary(EdgeArray edgeArray)
  66.         {
  67.             CurveArray curveArray =
  68.                 new CurveArray();
  69.  
  70.             foreach (Edge edge in edgeArray)
  71.             {
  72.                 var edgeCurve =
  73.                         edge.AsCurve();
  74.  
  75.                 curveArray.Append(edgeCurve);
  76.             }
  77.  
  78.             return curveArray;
  79.         }
  80.  
  81.  
  82.         PlanarFace GetTopFace(Solid solid)
  83.         {
  84.             PlanarFace topFace = null;
  85.             FaceArray faces = solid.Faces;
  86.             foreach (Face f in faces)
  87.             {
  88.                 PlanarFace pf = f as PlanarFace;
  89.                 if (null != pf
  90.                   && (Math.Abs(pf.Normal.X - 0) < _eps && Math.Abs(pf.Normal.Y - 0) < _eps))
  91.                 {
  92.                     if ((null == topFace)
  93.                       || (topFace.Origin.Z < pf.Origin.Z))
  94.                     {
  95.                         topFace = pf;
  96.                     }
  97.                 }
  98.             }
  99.             return topFace;
  100.         }
RAW Paste Data