private static Result createVisualizationSheets(UIDocument uiDoc, BuildingLoadModel buildingLoadModel, IEnumerable <ILoadModel> levelLiveLoadPerSquareFoots) { //Setup Document _doc = uiDoc.Document; double _concreteDensityPoundsForcePerCubicFoot = 153.0; XYZ _capacityViewCoordinate = new XYZ(2.17649771769026, 0.766954561856788, 0); XYZ _combinedViewCoordinate = new XYZ(0.780872717690263, 0.766954561856788, 0); XYZ _demandViewCoordinate = new XYZ(0.780872717690263, 1.83481042377296, 0); var _levels = Getters.GetLevels(_doc).OrderByDescending(p => p.Elevation).ToList(); var _floors = Getters.GetFloors(_doc).OrderBy(p => p.get_BoundingBox(null)?.Max.Z).ToList(); var _structuralColumns = new FilteredElementCollector(_doc).OfCategory(BuiltInCategory.OST_StructuralColumns).OfType <FamilyInstance>().OrderBy(p => p.get_BoundingBox(null)?.Max.Z).ToList(); var _structuralFraming = new FilteredElementCollector(_doc).OfCategory(BuiltInCategory.OST_StructuralFraming).OfType <FamilyInstance>().OrderBy(p => p.get_BoundingBox(null)?.Max.Z).ToList(); var _walls = new FilteredElementCollector(_doc).OfClass(typeof(Wall)).OfType <Wall>().OrderBy(p => p.get_BoundingBox(null)?.Max.Z).ToList(); BoundingBoxXYZ _modelExtents = GeometryHelpers.GetElementsBBox( new FilteredElementCollector(_doc).WhereElementIsViewIndependent().WhereElementIsNotElementType().ToList()); _modelExtents.Min = new XYZ(_modelExtents.Min.X, _modelExtents.Min.Y, _levels.LastOrDefault().Elevation - 1.0); Category _directShapeCategory = Category.GetCategory(_doc, BuiltInCategory.OST_GenericModel); Level _levelAbove = null; Level _bottomLevel = _levels.LastOrDefault(); Level _topLevel = _levels.FirstOrDefault(); //Begin to generate our VisualizationDeliverables - these are sheets with 3 plan-orientation isometric views. // NOTE - isometric views were used so that semi-transparent color overrides can be overlayed over each other to represent demands vs capacities // ToDo: it would be valuable to scale transparency by percentage of overall demand/capacity List <VisualizationDeliverable> _visualizationDeliverables = new List <VisualizationDeliverable>(); foreach (Level _level in _levels) { if (_levelAbove == null) { _levelAbove = _level; } //Get the elements that are on our current Level List <Floor> _currentLevelFloors = _floors.Where(p => p.LevelId == _level.Id).ToList(); List <FamilyInstance> _currentLevelStructuralColumns = new List <FamilyInstance>(); List <FamilyInstance> _currentLevelStructuralFraming = new List <FamilyInstance>(); List <Wall> _currentLevelWalls = new List <Wall>(); BoundingBoxXYZ _levelBounds = new BoundingBoxXYZ { Min = new XYZ(_modelExtents.Min.X, _modelExtents.Min.Y, _level.Elevation), Max = new XYZ(_modelExtents.Max.X, _modelExtents.Max.Y, _levelAbove.Elevation) }; BoundingBoxIsInsideFilter _withinLevelBoundsFilter = new BoundingBoxIsInsideFilter(new Outline(_levelBounds.Min, _levelBounds.Max)); BoundingBoxIntersectsFilter _intersectsLevelBoundsFilter = new BoundingBoxIntersectsFilter(new Outline(_levelBounds.Min, _levelBounds.Max)); if (_structuralColumns.Count > 0) { _currentLevelStructuralColumns = new FilteredElementCollector(_doc, _structuralColumns.Select(p => p.Id).ToList()).WherePasses(_intersectsLevelBoundsFilter).OfType <FamilyInstance>().ToList(); } else { _currentLevelStructuralColumns = new List <FamilyInstance>(); } if (_structuralFraming.Count > 0) { _currentLevelStructuralFraming = new FilteredElementCollector(_doc, _structuralFraming.Select(p => p.Id).ToList()).WherePasses(_withinLevelBoundsFilter).OfType <FamilyInstance>().ToList(); } else { _currentLevelStructuralFraming = new List <FamilyInstance>(); } if (_walls.Count > 0) { _currentLevelWalls = new FilteredElementCollector(_doc, _walls.Select(p => p.Id).ToList()).WherePasses(_withinLevelBoundsFilter).OfType <Wall>().ToList(); } else { _currentLevelWalls = new List <Wall>(); } //Generate LoadModels to populate a full LevelLoadModel LevelLoadModel _currentLevelLoadModel = LevelLoadModel.Create(_level); foreach (Floor _floor in _currentLevelFloors) { //The "top" floor is where the initial Demand is determined, which is to be supported via reshores propagating down through the building //ToDo: it would be valuable to be able to pick which Level to start from if (_level.Id == _topLevel.Id) { Parameter _floorThicknessParameter = _floor.get_Parameter(BuiltInParameter.FLOOR_ATTR_THICKNESS_PARAM); double _floorThickness = _floorThicknessParameter == null ? 0.0 : _floorThicknessParameter.AsDouble(); _currentLevelLoadModel.addFloorDemandLoadModel(_floor, _concreteDensityPoundsForcePerCubicFoot * _floorThickness); } //Add loads from other sources that are also distributed evenly along a level ILoadModel _floorCapacityLoadModel = levelLiveLoadPerSquareFoots.FirstOrDefault(p => p.Name == _level.Name); if (_floorCapacityLoadModel == null) { continue; } List <LoadModel> _floorLoadModels = _currentLevelLoadModel.addFloorCapacityLoadModel(_floor, _floorCapacityLoadModel.PoundsForcePerSquareFoot); foreach (ILoadModel _loadModel in levelLiveLoadPerSquareFoots.Where(p => p.Name.Equals(_level.Name))) { List <ILoadModel> _otherLoadModels = new List <ILoadModel>(); foreach (LoadModel _floorLoadModel in _floorLoadModels) { LoadModel _otherLoadModel = LoadModel.Create(); _otherLoadModel.Name = _loadModel.Name; _otherLoadModel.LoadType = _loadModel.LoadType; _otherLoadModel.PoundsForcePerSquareFoot = _loadModel.PoundsForcePerSquareFoot; _otherLoadModel.AreaSquareFeetXY = _floorLoadModel.AreaSquareFeetXY; _otherLoadModel.HeightFeetZ = _floorLoadModel.HeightFeetZ; _otherLoadModel.OriginXFeet = _floorLoadModel.OriginXFeet; _otherLoadModel.OriginYFeet = _floorLoadModel.OriginYFeet; _otherLoadModel.Curves = _floorLoadModel.Curves; _otherLoadModel.PlanarFace = _floorLoadModel.PlanarFace; _otherLoadModel.Element = _floorLoadModel.Element; _currentLevelLoadModel.addLoadModel(_otherLoadModel); } } } foreach (FamilyInstance _structuralColumn in _currentLevelStructuralColumns) { _currentLevelLoadModel.addFamilyInstanceLoadModel(_structuralColumn, LoadType.Demand, buildingLoadModel.StructuralColumnWeightPerSquareFoot); _currentLevelLoadModel.addFamilyInstanceLoadModel(_structuralColumn, LoadType.Capacity, buildingLoadModel.StructuralColumnWeightPerSquareFoot); } foreach (FamilyInstance _structuralFrame in _currentLevelStructuralFraming) { _currentLevelLoadModel.addFamilyInstanceLoadModel(_structuralFrame, LoadType.Demand, buildingLoadModel.StructuralBeamWeightPerSquareFoot); } foreach (Wall _wall in _currentLevelWalls) { _currentLevelLoadModel.addWallLoadModel(_wall, LoadType.Demand, buildingLoadModel.StructuralWallWeightPerSquareFoot); _currentLevelLoadModel.addWallLoadModel(_wall, LoadType.Capacity, buildingLoadModel.StructuralWallWeightPerSquareFoot); } //Set the Solid elements that we will project through the building, to represent demands/capacities LoadModel.SetSolids(_currentLevelLoadModel.LoadModels.OfType <LoadModel>(), _level, _topLevel, _bottomLevel); VisualizationDeliverable _visualizationDeliverable = new VisualizationDeliverable(_currentLevelLoadModel) { Floors = _currentLevelFloors, StructuralColumns = _currentLevelStructuralColumns, StructuralFraming = _currentLevelStructuralFraming, Walls = _currentLevelWalls, }; _visualizationDeliverables.Add(_visualizationDeliverable); _levelAbove = _level; } //Now that we've gathered all of our LoadModels, let's read the data about their actual demands/capacities buildingLoadModel.LevelLoadModels = _visualizationDeliverables.Select(p => p.LevelLoadModel as ILevelLoadModel).Where(p => p != null).ToList(); buildingLoadModel.ReadLoads(); foreach (LoadModel _loadModel in _visualizationDeliverables.Select(p => p.LevelLoadModel).SelectMany(p => p.LoadModels)) { _loadModel.SetDirectShapeWithParameters(_doc, _directShapeCategory.Id, _loadModel.Name); } //Update Levels in the model with Load details foreach (LevelLoadModel _levelLoadModel in _visualizationDeliverables.Select(p => p.LevelLoadModel)) { _levelLoadModel.SetLevelParameters(); } //Color our active View for the visualization colorActiveView(_doc, _visualizationDeliverables); //ToDo: something happened which broke colors being correctly applied to these sheets - will need to sort this out //createSheetsAndViews(_doc, _visualizationDeliverables, _modelExtents); // //colorViews(_doc, _visualizationDeliverables); // //createViewports(_doc, _visualizationDeliverables, _capacityViewCoordinate, _combinedViewCoordinate, _demandViewCoordinate); return(Result.Succeeded); }
public static Result CreateVisualizationSheets(UIDocument uiDoc) { //ToDo: these objects would be better passed to/from a UI, or possibly stored somewhere as settings BuildingLoadModel _buildingLoadModel = new BuildingLoadModel(0, 0, 7.0, 7.0, 7.0, 7.0, 7.0); List <ILoadModel> _levelLiveLoadPerSquareFoots = new List <ILoadModel> { LoadModel.Create("ROOF", LoadType.Capacity, 40), LoadModel.Create("Level 18", LoadType.Capacity, 24), LoadModel.Create("Level 17", LoadType.Capacity, 24), LoadModel.Create("Level 16", LoadType.Capacity, 24), LoadModel.Create("Level 15", LoadType.Capacity, 24), LoadModel.Create("Level 14", LoadType.Capacity, 24), LoadModel.Create("Level 13", LoadType.Capacity, 24), LoadModel.Create("Level 12", LoadType.Capacity, 24), LoadModel.Create("Level 11", LoadType.Capacity, 24), LoadModel.Create("Level 10", LoadType.Capacity, 24), LoadModel.Create("Level 09", LoadType.Capacity, 24), LoadModel.Create("Level 08", LoadType.Capacity, 24), LoadModel.Create("Level 07", LoadType.Capacity, 24), LoadModel.Create("Level 06", LoadType.Capacity, 24), LoadModel.Create("Level 05", LoadType.Capacity, 24), LoadModel.Create("Level 04", LoadType.Capacity, 24), LoadModel.Create("Level 03", LoadType.Capacity, 24), LoadModel.Create("Level 02", LoadType.Capacity, 100), LoadModel.Create("Level 01", LoadType.Capacity, 100), LoadModel.Create("P01", LoadType.Capacity, 40), LoadModel.Create("P02", LoadType.Capacity, 40), LoadModel.Create("P03", LoadType.Capacity, 40), LoadModel.Create("P04", LoadType.Capacity, 40), LoadModel.Create("P05", LoadType.Capacity, 40), LoadModel.Create("ROOF", LoadType.LiveLoad, 40), LoadModel.Create("Level 18", LoadType.LiveLoad, 40), LoadModel.Create("Level 17", LoadType.LiveLoad, 40), LoadModel.Create("Level 16", LoadType.LiveLoad, 40), LoadModel.Create("Level 15", LoadType.LiveLoad, 40), LoadModel.Create("Level 14", LoadType.LiveLoad, 40), LoadModel.Create("Level 13", LoadType.LiveLoad, 40), LoadModel.Create("Level 12", LoadType.LiveLoad, 40), LoadModel.Create("Level 11", LoadType.LiveLoad, 40), LoadModel.Create("Level 10", LoadType.LiveLoad, 40), LoadModel.Create("Level 09", LoadType.LiveLoad, 40), LoadModel.Create("Level 08", LoadType.LiveLoad, 40), LoadModel.Create("Level 07", LoadType.LiveLoad, 40), LoadModel.Create("Level 06", LoadType.LiveLoad, 40), LoadModel.Create("Level 05", LoadType.LiveLoad, 40), LoadModel.Create("Level 04", LoadType.LiveLoad, 40), LoadModel.Create("Level 03", LoadType.LiveLoad, 40), LoadModel.Create("Level 02", LoadType.LiveLoad, 100), LoadModel.Create("Level 01", LoadType.LiveLoad, 100), LoadModel.Create("P01", LoadType.LiveLoad, 45), LoadModel.Create("P02", LoadType.LiveLoad, 45), LoadModel.Create("P03", LoadType.LiveLoad, 45), LoadModel.Create("P04", LoadType.LiveLoad, 45), LoadModel.Create("P05", LoadType.LiveLoad, 45), LoadModel.Create("Level 18", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 17", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 16", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 15", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 14", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 13", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 12", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 11", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 10", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 09", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 08", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 07", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 06", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 05", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 04", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 03", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 02", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 01", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("P01", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("P02", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("P03", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("P04", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("P05", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), }; Result _result = Result.Cancelled; using (Transaction _trans = new Transaction(uiDoc.Document, "Create Visualization View")) { _trans.Start(); try { _result = createVisualizationSheets(uiDoc, _buildingLoadModel, _levelLiveLoadPerSquareFoots); _trans.Commit(); } catch (Exception _ex) { _trans.RollBack(); #if DEBUG string _error = _ex.Message + Environment.NewLine + Environment.NewLine + _ex.StackTrace; TaskDialog.Show("Error", _error); #endif return(Result.Failed); } } return(_result); }
public static Result PlaceTemporaryShoring(UIDocument uiDoc) { Result _result = Result.Cancelled; using (Transaction _trans = new Transaction(uiDoc.Document, "Place Temporary Shoring")) { _trans.Start(); try { //ToDo: these objects would be better passed to/from a UI, or possibly stored somewhere as settings BuildingLoadModel _buildingLoadModel = new BuildingLoadModel(0, 0, 7.0, 7.0, 7.0, 7.0, 7.0); List <ILoadModel> _loadModels = new List <ILoadModel> { LoadModel.Create("Level 18", LoadType.Capacity, 24), LoadModel.Create("Level 17", LoadType.Capacity, 24), LoadModel.Create("Level 16", LoadType.Capacity, 24), LoadModel.Create("Level 15", LoadType.Capacity, 24), LoadModel.Create("Level 14", LoadType.Capacity, 24), LoadModel.Create("Level 13", LoadType.Capacity, 24), LoadModel.Create("Level 12", LoadType.Capacity, 24), LoadModel.Create("Level 11", LoadType.Capacity, 24), LoadModel.Create("Level 10", LoadType.Capacity, 24), LoadModel.Create("Level 09", LoadType.Capacity, 24), LoadModel.Create("Level 08", LoadType.Capacity, 24), LoadModel.Create("Level 07", LoadType.Capacity, 24), LoadModel.Create("Level 06", LoadType.Capacity, 24), LoadModel.Create("Level 05", LoadType.Capacity, 24), LoadModel.Create("Level 04", LoadType.Capacity, 24), LoadModel.Create("Level 03", LoadType.Capacity, 24), LoadModel.Create("Level 02", LoadType.Capacity, 100), LoadModel.Create("Level 01", LoadType.Capacity, 100), LoadModel.Create("P1", LoadType.Capacity, 40), LoadModel.Create("P2", LoadType.Capacity, 40), LoadModel.Create("P3", LoadType.Capacity, 40), LoadModel.Create("P4", LoadType.Capacity, 40), LoadModel.Create("P5", LoadType.Capacity, 40), LoadModel.Create("ROOF", LoadType.LiveLoad, 40), LoadModel.Create("Level 18", LoadType.LiveLoad, 40), LoadModel.Create("Level 17", LoadType.LiveLoad, 40), LoadModel.Create("Level 16", LoadType.LiveLoad, 40), LoadModel.Create("Level 15", LoadType.LiveLoad, 40), LoadModel.Create("Level 14", LoadType.LiveLoad, 40), LoadModel.Create("Level 13", LoadType.LiveLoad, 40), LoadModel.Create("Level 12", LoadType.LiveLoad, 40), LoadModel.Create("Level 11", LoadType.LiveLoad, 40), LoadModel.Create("Level 10", LoadType.LiveLoad, 40), LoadModel.Create("Level 09", LoadType.LiveLoad, 40), LoadModel.Create("Level 08", LoadType.LiveLoad, 40), LoadModel.Create("Level 07", LoadType.LiveLoad, 40), LoadModel.Create("Level 06", LoadType.LiveLoad, 40), LoadModel.Create("Level 05", LoadType.LiveLoad, 40), LoadModel.Create("Level 04", LoadType.LiveLoad, 40), LoadModel.Create("Level 03", LoadType.LiveLoad, 40), LoadModel.Create("Level 02", LoadType.LiveLoad, 100), LoadModel.Create("Level 01", LoadType.LiveLoad, 100), LoadModel.Create("P1", LoadType.LiveLoad, 45), LoadModel.Create("P2", LoadType.LiveLoad, 45), LoadModel.Create("P3", LoadType.LiveLoad, 45), LoadModel.Create("P4", LoadType.LiveLoad, 45), LoadModel.Create("P5", LoadType.LiveLoad, 45), LoadModel.Create("Level 18", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 17", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 16", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 15", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 14", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 13", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 12", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 11", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 10", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 09", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 08", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 07", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 06", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 05", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 04", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 03", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 02", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("Level 01", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("P1", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("P2", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("P3", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("P4", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), LoadModel.Create("P5", LoadType.Formwork, _buildingLoadModel.FormWeightPerSquareFoot), }; _result = placeTemporaryShoring(uiDoc, _buildingLoadModel, _loadModels, @"C:\ProgramData\Autodesk\Revit\Addins\2021\ApatosReshoring\Reshoring Poles Ellis 4x4.rfa", "6-on-6"); _trans.Commit(); } catch (Exception _ex) { _trans.RollBack(); #if DEBUG string _error = _ex.Message + Environment.NewLine + Environment.NewLine + _ex.StackTrace; TaskDialog.Show("Error", _error); #endif return(Result.Failed); } } return(_result); }