Guest User

Insulation

a guest
Apr 19th, 2015
565
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * Created by SharpDevelop.
  3.  * User: smoreau
  4.  * Date: 15/04/2015
  5.  * Time: 06:42
  6.  *
  7.  * To change this template use Tools | Options | Coding | Edit Standard Headers.
  8.  */
  9. using System;
  10. using Autodesk.Revit.UI;
  11. using Autodesk.Revit.DB;
  12. using Autodesk.Revit.DB.Architecture;
  13. using Autodesk.Revit.UI.Selection;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16.  
  17. namespace RoomFinishing
  18. {
  19.     [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
  20.     [Autodesk.Revit.DB.Macros.AddInId("D78844F8-0DB7-4E8D-AD40-3F43F337994A")]
  21.     public partial class ThisApplication
  22.     {
  23.         private void Module_Startup(object sender, EventArgs e)
  24.         {
  25.  
  26.         }
  27.  
  28.         private void Module_Shutdown(object sender, EventArgs e)
  29.         {
  30.  
  31.         }
  32.  
  33.         #region Revit Macros generated code
  34.         private void InternalStartup()
  35.         {
  36.             this.Startup += new System.EventHandler(Module_Startup);
  37.             this.Shutdown += new System.EventHandler(Module_Shutdown);
  38.         }
  39.         #endregion
  40.         private Document doc;
  41.        
  42.         public void FloorsOnUpperFaces()
  43.         {
  44.             doc = this.ActiveUIDocument.Document;
  45.            
  46.             using (Transaction tx = new Transaction(doc)) {
  47.                
  48.                 tx.Start("Create insulations");
  49.                
  50.                 //Get a floor type
  51.                 FloorType floorType = RetriveFloorType();
  52.                
  53.                 //Get all room
  54.                 List<Element> rooms = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms).ToElements().ToList();
  55.                
  56.                 //Loop on every rooms
  57.                 foreach (Element e in rooms) {
  58.                    
  59.                     Room room = e as Room;
  60.                    
  61.                     if (rooms != null)
  62.                     {
  63.                         Level level = room.Level;
  64.                        
  65.                         //Retrive the geometry
  66.                         Options opt = new Options();
  67.                         GeometryElement geometry = e.get_Geometry(opt);
  68.                         Solid solid = geometry.First() as Solid;
  69.  
  70.                         //Loop on every faces
  71.                         foreach (Face face in solid.Faces) {
  72.                             PlanarFace pf = face as PlanarFace;
  73.                             if (pf != null)
  74.                             {
  75.                                 XYZ faceNormal = pf.FaceNormal;
  76.                                 if (faceNormal.X == 0 && faceNormal.Y == 0)
  77.                                 {
  78.                                     if (pf.Origin.Z != level.ProjectElevation)
  79.                                     {
  80.                                         foreach (CurveLoop loop in face.GetEdgesAsCurveLoops()) {
  81.                                             //Create a flat slab
  82.                                             doc.Create.NewFloor(Curves(loop),floorType,level,false);
  83.  
  84.                                         }
  85.  
  86.                                     }
  87.                                 }
  88.                             }
  89.                         }
  90.                     }
  91.                 }
  92.                 tx.Commit();
  93.             }
  94.         }
  95.        
  96.         public void WallsOnFaces()
  97.         {
  98.             doc = this.ActiveUIDocument.Document;
  99.            
  100.             using (Transaction tx = new Transaction(doc)) {
  101.                
  102.                 tx.Start("Create insulations");
  103.                
  104.                 //Get a wall type
  105.                 WallType wallType = RetriveWallType();
  106.                 WallType duplicatedWallType = CreateNewWallType(wallType);
  107.                 List<ElementId> addedWallsIds = new List<ElementId>();
  108.                
  109.                 //Get all room
  110.                 List<Element> rooms = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms).ToElements().ToList();
  111.                
  112.                 //Loop on every rooms
  113.                 foreach (Element e in rooms) {
  114.                    
  115.                     Room room = e as Room;
  116.                    
  117.                     if (rooms != null)
  118.                     {
  119.                         Level level = room.Level;
  120.                        
  121.                         //Retrive the geometry
  122.                         Options opt = new Options();
  123.                         GeometryElement geometry = e.get_Geometry(opt);
  124.                         Solid solid = geometry.First() as Solid;
  125.  
  126.                         //Loop on every faces
  127.                         foreach (Face face in solid.Faces) {
  128.                             PlanarFace pf = face as PlanarFace;
  129.                             if (pf != null)
  130.                             {
  131.                                 XYZ faceNormal = pf.FaceNormal;
  132.                                 if (faceNormal.Z ==0)
  133.                                 {
  134.                                     IList<Curve> curves = CurvesList(face);
  135.                                     XYZ lowerPoint = LowestPoint(curves);
  136.                                     if (lowerPoint.Z > level.ProjectElevation)
  137.                                     {
  138.                                         Wall addedWall = Wall.Create(doc,curves,duplicatedWallType.Id,level.Id,false,-faceNormal);
  139.                                        
  140.                                         addedWallsIds.Add(addedWall.Id);
  141.                                        
  142.                                         Parameter wallHeight = addedWall.get_Parameter(BuiltInParameter.WALL_BASE_OFFSET);
  143.                                         wallHeight.Set(lowerPoint.Z-level.ProjectElevation);
  144.  
  145.                                         Parameter wallJustification = addedWall.get_Parameter(BuiltInParameter.WALL_KEY_REF_PARAM);
  146.                                         wallJustification.Set(2);
  147.                                     }
  148.  
  149.                                 }
  150.                             }
  151.                         }
  152.                     }
  153.                 }
  154.                
  155.                 FailureHandlingOptions options = tx.GetFailureHandlingOptions();
  156.  
  157.                 options.SetFailuresPreprocessor(new PlintePreprocessor());
  158.                 // Now, showing of any eventual mini-warnings will be postponed until the following transaction.
  159.                 tx.Commit(options);
  160.  
  161.                 tx.Start("Create insulations");
  162.                
  163.                 List<ElementId> addedWallsIds2 = new List<ElementId>();
  164.                 foreach (ElementId id in addedWallsIds) {
  165.                    
  166.                     if (doc.GetElement(id) != null)
  167.                     {
  168.                         addedWallsIds2.Add(id);
  169.                     }
  170.                 }
  171.  
  172.                 Wall.ChangeTypeId(doc, addedWallsIds2, wallType.Id);
  173.  
  174.                 foreach (ElementId addedWallId in addedWallsIds2)
  175.                 {
  176.                     Wall addedWall = doc.GetElement(addedWallId) as Wall;
  177.                     Parameter wallJustification = addedWall.get_Parameter(BuiltInParameter.WALL_KEY_REF_PARAM);
  178.                     wallJustification.Set(3);
  179.                 }
  180.  
  181.                 doc.Delete(duplicatedWallType.Id);
  182.  
  183.                 tx.Commit();
  184.             }
  185.         }
  186.        
  187.        
  188.         private CurveArray Curves(CurveLoop loop)
  189.         {
  190.  
  191.             CurveArray curves = new CurveArray();
  192.  
  193.             foreach (Curve curve in loop) {
  194.                
  195.                 curves.Append(curve);
  196.             }
  197.            
  198.             return curves;
  199.         }
  200.        
  201.         private IList<Curve> CurvesList(Face face)
  202.         {
  203.             IList<Curve> curves = new List<Curve>();
  204.  
  205.             foreach (CurveLoop loop in face.GetEdgesAsCurveLoops()) {
  206.                 foreach (Curve curve in loop) {
  207.                    
  208.                     curves.Add(curve);
  209.                 }
  210.             }
  211.            
  212.             return curves;
  213.         }
  214.        
  215.         private XYZ LowestPoint(IList<Curve> curves)
  216.         {
  217.             XYZ point = curves.First().GetEndPoint(0);
  218.            
  219.             foreach (Curve curve in curves) {
  220.                 if (curve.GetEndPoint(0).Z < point.Z)
  221.                 {
  222.                     point = curve.GetEndPoint(0);
  223.                 }
  224.             }
  225.            
  226.             return point;
  227.         }
  228.        
  229.         private FloorType RetriveFloorType()
  230.         {
  231.             IEnumerable<FloorType> floorTypes = from elem in new FilteredElementCollector(doc).OfClass(typeof(FloorType))
  232.                 let type = elem as FloorType
  233.                 select type;
  234.            
  235.             FloorType floorType = doc.GetElement(floorTypes.First().Id) as FloorType;
  236.  
  237.             return floorType;
  238.         }
  239.        
  240.         private WallType RetriveWallType()
  241.         {
  242.             IEnumerable<WallType> wallTypes = from elem in new FilteredElementCollector(doc).OfClass(typeof(WallType))
  243.                 let type = elem as WallType
  244.                 select type;
  245.            
  246.             WallType wallType = doc.GetElement(wallTypes.First().Id) as WallType;
  247.  
  248.             return wallType;
  249.         }
  250.        
  251.         private WallType CreateNewWallType(WallType wallType)
  252.         {
  253.             WallType newWallType;
  254.  
  255.             newWallType = wallType.Duplicate("newWallTypeName") as WallType;
  256.  
  257.             CompoundStructure cs = newWallType.GetCompoundStructure();
  258.  
  259.             IList<CompoundStructureLayer> layers = cs.GetLayers();
  260.             int layerIndex = 0;
  261.  
  262.             foreach (CompoundStructureLayer csl in layers)
  263.             {
  264.                 double layerWidth = csl.Width * 2;
  265.                 if (cs.GetRegionsAssociatedToLayer(layerIndex).Count == 1)
  266.                 {
  267.                     cs.SetLayerWidth(layerIndex, layerWidth);
  268.                 }
  269.                
  270.                 layerIndex++;
  271.             }
  272.  
  273.             newWallType.SetCompoundStructure(cs);
  274.  
  275.             return newWallType;
  276.         }
  277.     }
  278.    
  279.     /// <summary>
  280.     /// Manage Warning in the Revit interface
  281.     /// </summary>
  282.     public class PlintePreprocessor : IFailuresPreprocessor
  283.     {
  284.         public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor)
  285.         {
  286.             IList<FailureMessageAccessor> failList = new List<FailureMessageAccessor>();
  287.             // Inside event handler, get all warnings
  288.             failList = failuresAccessor.GetFailureMessages();
  289.             foreach (FailureMessageAccessor failure in failList)
  290.             {
  291.                 // check FailureDefinitionIds against ones that you want to dismiss,
  292.                 FailureDefinitionId failID = failure.GetFailureDefinitionId();
  293.                 // prevent Revit from showing Unenclosed room warnings
  294.                 if (failID == BuiltInFailures.OverlapFailures.WallsOverlap)
  295.                 {
  296.                     failuresAccessor.DeleteWarning(failure);
  297.                 }
  298.             }
  299.  
  300.             return FailureProcessingResult.Continue;
  301.         }
  302.     }
  303. }
RAW Paste Data