SHARE
TWEET

Insulation

a guest Apr 19th, 2015 319 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
Top