// // (C) Copyright 2003-2013 by Autodesk, Inc. // // Permission to use, copy, modify, and distribute this software in // object code form for any purpose and without fee is hereby granted, // provided that the above copyright notice appears in all copies and // that both that copyright notice and the limited warranty and // restricted rights notice below appear in all supporting // documentation. // // AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS. // AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF // MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC. // DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE // UNINTERRUPTED OR ERROR FREE. // // Use, duplication, or disclosure by the U.S. Government is subject to // restrictions set forth in FAR 52.227-19 (Commercial Computer // Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii) // (Rights in Technical Data and Computer Software), as applicable. // using System; using System.Collections.Generic; using System.Linq; using System.Text; using Autodesk.Revit.DB.CodeChecking; using Autodesk.Revit.DB.CodeChecking.Documentation; using Autodesk.Revit.DB; using Autodesk.Revit.DB.ExtensibleStorage.Framework.Documentation; using Autodesk.Revit.DB.ExtensibleStorage; using Autodesk.Revit.DB.CodeChecking.Engineering; using Autodesk.Revit.DB.CodeChecking.Engineering.Concrete; using CodeCheckingConcreteExample.Utility; using CodeCheckingConcreteExample.Main; using CodeCheckingConcreteExample.Properties; using Autodesk.Revit.DB.CodeChecking.Engineering.Tools; #pragma warning disable 1591 namespace CodeCheckingConcreteExample.Server { [Autodesk.Revit.DB.CodeChecking.Attributes.CalculationParamsStructure(typeof(CalculationParameter))] [Autodesk.Revit.DB.CodeChecking.Attributes.LabelStructure(typeof(LabelBeam), BuiltInCategory.OST_BeamAnalytical, Autodesk.Revit.DB.StructuralAssetClass.Concrete)] [Autodesk.Revit.DB.CodeChecking.Attributes.LabelStructure(typeof(LabelColumn), BuiltInCategory.OST_ColumnAnalytical, Autodesk.Revit.DB.StructuralAssetClass.Concrete)] [Autodesk.Revit.DB.CodeChecking.Attributes.ResultStructure(typeof(ResultBeam), BuiltInCategory.OST_BeamAnalytical, Autodesk.Revit.DB.StructuralAssetClass.Concrete)] [Autodesk.Revit.DB.CodeChecking.Attributes.ResultStructure(typeof(ResultColumn), BuiltInCategory.OST_ColumnAnalytical, Autodesk.Revit.DB.StructuralAssetClass.Concrete)] public class Server : Autodesk.Revit.DB.CodeChecking.Documentation.MultiStructureServer { public static readonly Autodesk.Revit.DB.ResultsBuilder.UnitsSystem UnitSystem = Autodesk.Revit.DB.ResultsBuilder.UnitsSystem.Metric; public static readonly Guid ID = new Guid("1d3d13ad-4330-4b4a-bfe3-067ff87a72b1"); #region ICodeCheckingServer Members public override Entity GetDefaultLabel(Autodesk.Revit.DB.Document document, StructuralAssetClass material, BuiltInCategory category) { switch (material) { case StructuralAssetClass.Concrete: switch (category) { default: break; case Autodesk.Revit.DB.BuiltInCategory.OST_ColumnAnalytical: { IList materials = RebarUtility.GetListMaterialOfRebars(document); if (materials.Count > 0) { IList barsIds = RebarUtility.GetListRebarForMaterial(document, materials[0]); if (barsIds.Count > 0) { LabelColumn label = new LabelColumn(); label.LongitudinalReinforcement.Material = document.GetElement(materials[0]) as Material; label.LongitudinalReinforcement.RebarBarType = RebarUtility.GetRebarType(document, barsIds[0]); label.TransversalReinforcement.Material = label.LongitudinalReinforcement.Material; label.TransversalReinforcement.RebarBarType = label.LongitudinalReinforcement.RebarBarType; return label.GetEntity(); } } } break; case Autodesk.Revit.DB.BuiltInCategory.OST_BeamAnalytical: { IList materials = RebarUtility.GetListMaterialOfRebars(document); if (materials.Count > 0) { IList barsIds = RebarUtility.GetListRebarForMaterial(document, materials[0]); if (barsIds.Count > 0) { LabelBeam label = new LabelBeam(); label.LongitudinalReinforcement.Material = document.GetElement(materials[0]) as Material; label.LongitudinalReinforcement.RebarBarType = RebarUtility.GetRebarType(document, barsIds[0]); label.TransversalReinforcement.Material = label.LongitudinalReinforcement.Material; label.TransversalReinforcement.RebarBarType = label.LongitudinalReinforcement.RebarBarType; return label.GetEntity(); } } } break; } break; } return base.GetDefaultLabel(document, material, category); } public enum ElementType { Beam, Column }; /// /// Build document body for result document /// /// Code calculation parameters /// Revit element for which result document is built /// Active Revit document /// public override DocumentBody BuildResultDocumentBody(Autodesk.Revit.DB.ExtensibleStorage.Entity calculationParameters, Element element, Autodesk.Revit.DB.Document document) { Autodesk.Revit.DB.CodeChecking.Storage.StorageService service = Autodesk.Revit.DB.CodeChecking.Storage.StorageService.GetStorageService(); Autodesk.Revit.DB.CodeChecking.Storage.StorageDocument storageDocument = service.GetStorageDocument(document); Guid activePackageId = storageDocument.CalculationParamsManager.CalculationParams.GetInputResultPackageId(Server.ID); Autodesk.Revit.DB.CodeChecking.Storage.ResultStatus status = storageDocument.ResultsManager.GetResultStatus(element, activePackageId, Server.ID); DocumentBody body = new DocumentBody(); if (!status.IsError()) { // create body object // get results schema for the current element bool isBeam = calculationParameters.Schema.SchemaName == "ResultBeam"; bool isColumn = calculationParameters.Schema.SchemaName == "ResultColumn"; if (isBeam || isColumn) { ResultLinearElement resultSchema = null; if (isBeam) { resultSchema = new ResultBeam(); } else { resultSchema = new ResultColumn(); } resultSchema.SetProperties(calculationParameters); // Fill document with results from reinforcement calculation WriteTheoreticalReinfToNote(body, resultSchema, document, isBeam ? ElementType.Beam : ElementType.Column); } } return body; } /// /// Fills document body object with formatted reinforcement calculation results /// /// DocumentBody to be filled /// Calculation results schema class /// Active Revit document /// Structural element type private void WriteTheoreticalReinfToNote(DocumentBody body, ResultLinearElement linearElementResult, Autodesk.Revit.DB.Document document, ElementType elementType) { /////////////////////////// Prepare data // Get revit units Units units = document.GetUnits(); // Get raw calculation results as a collection of ResultInPointLinear objects for all element sections ( one ResultInPointLinear per section) List resultsInPoints = linearElementResult.GetResultsInPoints(); if (resultsInPoints.Count == 0) return; /////////////////////////// Add a general reinforcement review to the body( mean and extreme values of reinfocement ) // Create document section DocumentSection resultSummary = new DocumentSection(Resources.ResourceManager.GetString("Summary"), 5); // Calculate mean and extreme values IEnumerable longRnf = new List { ResultTypeLinear.Atop, ResultTypeLinear.Abottom, ResultTypeLinear.Aleft, ResultTypeLinear.Aright }; double maxLongitudinal = resultsInPoints.Max(s => (longRnf.Sum(q => s[q]))), minLongitudinal = resultsInPoints.Min(s => (longRnf.Sum(q => s[q]))), maxSpacing = resultsInPoints.Max(s => s[ResultTypeLinear.StirrupsSpacing]), minSpacing = resultsInPoints.Min(s => s[ResultTypeLinear.StirrupsSpacing]), maxX = resultsInPoints.Max(s => s[ResultTypeLinear.X]), minX = resultsInPoints.Min(s => s[ResultTypeLinear.X]), meanLongitudinal = resultsInPoints.Average(s => (longRnf.Sum(q => s[q]))), meanTransversal = resultsInPoints.Average(s => s[ResultTypeLinear.TransversalReinforcemenDensity]); // Add them to the section resultSummary.Body.Elements.Add((new DocumentValueWithName(Resources.ResourceManager.GetString("MeanReinforcemenDensityLongitudinal"), meanLongitudinal, UnitsConverter.GetInternalUnit(UnitType.UT_Reinforcement_Area), UnitType.UT_Reinforcement_Area, document.GetUnits()))); resultSummary.Body.Elements.Add((new DocumentValueWithName(Resources.ResourceManager.GetString("MeanTransversalReinforcemenDensity"), meanTransversal, UnitsConverter.GetInternalUnit(UnitType.UT_Reinforcement_Area_per_Unit_Length), UnitType.UT_Reinforcement_Area_per_Unit_Length, document.GetUnits()))); resultSummary.Body.Elements.Add((new DocumentValueWithName(Resources.ResourceManager.GetString("MaximumLongitudinalReinforcement"), maxLongitudinal, UnitsConverter.GetInternalUnit(UnitType.UT_Reinforcement_Area), UnitType.UT_Reinforcement_Area, document.GetUnits()))); resultSummary.Body.Elements.Add((new DocumentValueWithName(Resources.ResourceManager.GetString("MinimumLongitudinalReinforcement"), minLongitudinal, UnitsConverter.GetInternalUnit(UnitType.UT_Reinforcement_Area), UnitType.UT_Reinforcement_Area, document.GetUnits()))); resultSummary.Body.Elements.Add((new DocumentValueWithName(Resources.ResourceManager.GetString("MaximumStirrupsSpacing"), maxSpacing, UnitsConverter.GetInternalUnit(UnitType.UT_Section_Dimension), UnitType.UT_Section_Dimension, document.GetUnits()))); resultSummary.Body.Elements.Add((new DocumentValueWithName(Resources.ResourceManager.GetString("MinimumStirrupsSpacing"), minSpacing, UnitsConverter.GetInternalUnit(UnitType.UT_Section_Dimension), UnitType.UT_Section_Dimension, document.GetUnits()))); resultSummary.Level = DetailLevel.General; // Add section to the document body body.Elements.Add(resultSummary); /////////////////////////// Create result tables for deflection, internal forces and reinforcement // Create reinforcement table List nonZeroReinforcement = ResultTypeLinearHelper.ReinforcementResults.Where(s => resultsInPoints.Any(r => Math.Abs(r[s]) > Double.Epsilon)).ToList(); if (nonZeroReinforcement.Count() > 0) { DocumentSection section = CreateSectionTableAndDiagram(resultsInPoints, nonZeroReinforcement, document, elementType, true, false, false, Resources.ResourceManager.GetString("Reinforcement")); if (section != null) body.Elements.Add(section); string diagramTitle = ""; bool reversedAxis = false; foreach (ResultTypeLinear resultType in nonZeroReinforcement) { switch (resultType) { case ResultTypeLinear.Abottom: diagramTitle = Resources.ResourceManager.GetString("LongReinforcementBottom"); break; case ResultTypeLinear.Atop: diagramTitle = Resources.ResourceManager.GetString("LongReinforcementTop"); break; case ResultTypeLinear.Aleft: diagramTitle = Resources.ResourceManager.GetString("LongReinforcementLeft"); break; case ResultTypeLinear.Aright: diagramTitle = Resources.ResourceManager.GetString("LongReinforcementRight"); break; case ResultTypeLinear.TransversalReinforcemenDensity: diagramTitle = Resources.ResourceManager.GetString("TransversalReinforcement"); break; case ResultTypeLinear.StirrupsSpacing: diagramTitle = Resources.ResourceManager.GetString("StirrupsSpacing"); break; } List oneNonZeroReinforcement = new List(1); oneNonZeroReinforcement.Add(resultType); section = CreateSectionTableAndDiagram(resultsInPoints, oneNonZeroReinforcement, document, elementType, false, true, reversedAxis, "", "", diagramTitle); if (section != null) body.Elements.Add(section); } } // Create internal forces tables and graph List nonZeroInternalForces = ResultTypeLinearHelper.InternalForcesResults.Where(s => resultsInPoints.Any(r => Math.Abs(r[s]) > Double.Epsilon)).ToList(); if (nonZeroInternalForces.Count() > 0) { DocumentSection section = CreateSectionTableAndDiagram(resultsInPoints, nonZeroInternalForces, document, elementType, true, true, false, Resources.ResourceManager.GetString("InternalForces"), "", Resources.ResourceManager.GetString("Internal_Forces")); if (section != null) body.Elements.Add(section); } List nonZeroInternalMoments = ResultTypeLinearHelper.InternalMomentsResults.Where(s => resultsInPoints.Any(r => Math.Abs(r[s]) > Double.Epsilon)).ToList(); if (nonZeroInternalMoments.Count() > 0) { DocumentSection section = null; if (nonZeroInternalForces.Count() != 0) section = CreateSectionTableAndDiagram(resultsInPoints, nonZeroInternalMoments, document, elementType, true, true, true, "", "", Resources.ResourceManager.GetString("Internal_Moments")); else section = CreateSectionTableAndDiagram(resultsInPoints, nonZeroInternalMoments, document, elementType, true, true, true, Resources.ResourceManager.GetString("InternalForces"), "", Resources.ResourceManager.GetString("Internal_Moments")); if (section != null) body.Elements.Add(section); } // Create deflection table and graph List nonZeroDeflection = ResultTypeLinearHelper.RealDeflectionResults.Where(s => resultsInPoints.Any(r => Math.Abs(r[s]) > Double.Epsilon)).ToList(); if (nonZeroDeflection.Count() > 0) { List displacement = new List(nonZeroDeflection.Count()); List displacementAndDeflection = new List(nonZeroDeflection.Count() * 2); displacementAndDeflection.AddRange(nonZeroDeflection); foreach (ResultTypeLinear resultType in nonZeroDeflection) { switch (resultType) { case ResultTypeLinear.UxRealMax: displacement.Add(ResultTypeLinear.UxMax); break; case ResultTypeLinear.UxRealMin: displacement.Add(ResultTypeLinear.UxMin); break; case ResultTypeLinear.UyRealMax: displacement.Add(ResultTypeLinear.UyMax); break; case ResultTypeLinear.UyRealMin: displacement.Add(ResultTypeLinear.UyMin); break; case ResultTypeLinear.UzRealMax: displacement.Add(ResultTypeLinear.UzMax); break; case ResultTypeLinear.UzRealMin: displacement.Add(ResultTypeLinear.UzMin); break; } } displacementAndDeflection.AddRange(displacement); DocumentSection section = CreateSectionTableAndDiagram(resultsInPoints, displacementAndDeflection, document, elementType, true, false, false, Resources.ResourceManager.GetString("Deflection"), "", Resources.ResourceManager.GetString("DeflectionEnvelope")); if (section != null) { body.Elements.Add(section); section = CreateSectionTableAndDiagram(resultsInPoints, nonZeroDeflection, document, elementType, false, true, false, "", "", Resources.ResourceManager.GetString("DeflectionEnvelope")); if (section != null) { body.Elements.Add(section); section = CreateSectionTableAndDiagram(resultsInPoints, displacement, document, elementType, false, true, false, "", "", Resources.ResourceManager.GetString("DisplacementEnvelope")); if (section != null) body.Elements.Add(section); } } } } static private Dictionary ResultTypeLinearToColorDictionary = new Dictionary() { {ResultTypeLinear.X,new Color (0, 255, 0 ) }, {ResultTypeLinear.X_Rel,new Color (225, 0, 0 ) }, {ResultTypeLinear.MxMax,new Color (0, 0, 255 ) }, {ResultTypeLinear.MxMin,new Color (255, 119, 28 ) }, {ResultTypeLinear.MyMin,new Color (51, 177, 33 ) }, {ResultTypeLinear.MyMax,new Color (163, 73, 180 ) }, {ResultTypeLinear.MzMin,new Color (159, 99, 66 ) }, {ResultTypeLinear.MzMax,new Color (0, 128, 128 ) }, {ResultTypeLinear.FxMax,new Color (0, 0, 255 ) }, {ResultTypeLinear.FxMin,new Color (255, 119, 28 ) }, {ResultTypeLinear.FyMin,new Color (51, 177, 33 ) }, {ResultTypeLinear.FyMax,new Color (163, 73, 180 ) }, {ResultTypeLinear.FzMin,new Color (159, 99, 66 ) }, {ResultTypeLinear.FzMax,new Color (0, 128, 128 ) }, {ResultTypeLinear.Abottom,new Color (0, 0, 255 ) }, {ResultTypeLinear.Atop,new Color (255, 119, 28 ) }, {ResultTypeLinear.Aleft,new Color (51, 177, 33 ) }, {ResultTypeLinear.Aright,new Color (163, 73, 180 ) }, {ResultTypeLinear.StirrupsSpacing,new Color(159, 99, 66 ) }, {ResultTypeLinear.TransversalReinforcemenDensity, new Color(0, 128, 128 ) }, {ResultTypeLinear.UxMax,new Color (0, 0, 255 ) }, {ResultTypeLinear.UxMin,new Color (255, 119, 28 ) }, {ResultTypeLinear.UyMax,new Color (51, 177, 33 ) }, {ResultTypeLinear.UyMin,new Color (163, 73, 180 ) }, {ResultTypeLinear.UzMax,new Color (159, 99, 66 ) }, {ResultTypeLinear.UzMin,new Color (0, 128, 128 ) }, {ResultTypeLinear.UxRealMax,new Color (0, 0, 255 ) }, {ResultTypeLinear.UxRealMin,new Color (255, 119, 28 ) }, {ResultTypeLinear.UyRealMax,new Color (51, 177, 33 ) }, {ResultTypeLinear.UyRealMin,new Color (163, 73, 180 ) }, {ResultTypeLinear.UzRealMax,new Color (159, 99, 66 ) }, {ResultTypeLinear.UzRealMin,new Color (0, 128, 128 ) }, }; /// /// Creats the section of document with table /// /// Result in point collection /// The type of results that will be displayed in the table. /// Active Revit document /// Returns section of document with table private DocumentTable CreateTable(ICollection resultsInPoints, List resultTypes, Autodesk.Revit.DB.Document document) { Units units = document.GetUnits(); resultTypes.Insert(0, ResultTypeLinear.X); DocumentTable resultTable = new DocumentTable(resultsInPoints.Count + 1, resultTypes.Count()); int colId = 0; resultTable.HeaderColumnsCount = 1; resultTable.HeaderRowsCount = 1; foreach (ResultTypeLinear resultType in resultTypes) { string description = Resources.ResourceManager.GetString(resultType.ToString()); resultTable[0, colId].Elements.Add(new DocumentText(description)); int rowId = 1; UnitType unitType = resultType.GetUnitType(); DisplayUnitType displayUnitType = Utility.UnitsConverter.GetInternalUnit(unitType); foreach (ResultInPointLinear resultInPoint in resultsInPoints) { if (DisplayUnitType.DUT_UNDEFINED != displayUnitType) resultTable[rowId++, colId].Elements.Add(new DocumentValue(resultInPoint[resultType], displayUnitType, unitType, units)); else { resultTable[rowId++, colId].Elements.Add(new DocumentText(String.Format("{0:0.00}", resultInPoint[resultType]))); } } colId++; } resultTypes.Remove(ResultTypeLinear.X); return resultTable; } /// /// Creats the section of document with diagram /// /// Title of the diagram /// Result in point collection /// The type of results that will be displayed in the diagram. /// Active Revit document /// Structural element type /// Sets the direction of the Y axis on the graph /// Returns section of document with diagram private DocumentDiagram CreateDiagram(String title, IEnumerable resultsInPoints, List resultTypes, Autodesk.Revit.DB.Document document, ElementType elementType, bool reversedAxis) { Units units = document.GetUnits(); DocumentDiagram chart = new DocumentDiagram(); if (resultTypes != null) { if (resultTypes.Count() > 0) { if (title.Length != 0) chart.Title = title; chart.Height = 200; chart.Width = 4 * chart.Height; UnitType unitTypeX = ResultTypeLinear.X.GetUnitType(); FormatOptions formatOptions = units.GetFormatOptions(unitTypeX); DisplayUnitType displayUnitTypeX = formatOptions.DisplayUnits; DisplayUnitType internalDisplayUnitTypeX = UnitsConverter.GetInternalUnit(unitTypeX); UnitSymbolType unitSymbolTypeX = formatOptions.UnitSymbol; String axisTitle = ""; if (ElementType.Column == elementType) axisTitle = Resources.ResourceManager.GetString("AxisHeight"); else axisTitle = Resources.ResourceManager.GetString("AxisLength"); if (UnitSymbolType.UST_NONE != unitSymbolTypeX) { axisTitle += " " + LabelUtils.GetLabelFor(unitSymbolTypeX); } chart.AxisX.Title = axisTitle; chart.AxisY.Reversed = reversedAxis; UnitType unitTypeY = resultTypes.First().GetUnitType(); formatOptions = units.GetFormatOptions(unitTypeY); DisplayUnitType displayUnitTypeY = formatOptions.DisplayUnits; DisplayUnitType internalDisplayUnitTypeY = UnitsConverter.GetInternalUnit(unitTypeY); UnitSymbolType unitSymbolTypeY = formatOptions.UnitSymbol; switch (unitTypeY) { case UnitType.UT_Reinforcement_Area: axisTitle = Resources.ResourceManager.GetString("AxisArea"); break; case UnitType.UT_Force: axisTitle = Resources.ResourceManager.GetString("AxisForce"); break; case UnitType.UT_Moment: axisTitle = Resources.ResourceManager.GetString("AxisMoment"); break; case UnitType.UT_Displacement_Deflection: axisTitle = Resources.ResourceManager.GetString("AxisDisplacmentDeflection"); break; case UnitType.UT_Section_Dimension: axisTitle = Resources.ResourceManager.GetString("AxisSpacing"); break; case UnitType.UT_Reinforcement_Area_per_Unit_Length: axisTitle = Resources.ResourceManager.GetString("AxisDencity"); break; default: break; } if (UnitSymbolType.UST_NONE != unitSymbolTypeY) { axisTitle += " " + LabelUtils.GetLabelFor(unitSymbolTypeY); } chart.AxisY.Title = axisTitle; double valX = 0; double valY = 0; foreach (ResultTypeLinear resultType in resultTypes) { DocumentDiagramSeries series = new DocumentDiagramSeries(resultType.ToString()); chart.Legend = true; chart.Series.Add(series); series.Color = ResultTypeLinearToColorDictionary[resultType]; series.Name = Resources.ResourceManager.GetString(resultType.ToString()); int lblNbr = 5; int lblN = 0; int lblStep = resultsInPoints.Count() / lblNbr; // Labels on the X axis will be formatted according to Revit preferences //formatOptions = units.GetFormatOptions(unitTypeX); //string accuracy = formatOptions.Accuracy.ToString(); //accuracy = accuracy.Replace("1", "0"); string valXAsString = ""; foreach (ResultInPointLinear resultInPoint in resultsInPoints) { valX = Autodesk.Revit.DB.UnitUtils.Convert(resultInPoint[ResultTypeLinear.X], internalDisplayUnitTypeX, displayUnitTypeX); valY = Autodesk.Revit.DB.UnitUtils.Convert(resultInPoint[resultType], internalDisplayUnitTypeY, displayUnitTypeY); series.AddXY(valX, valY); if (lblStep == 0 || lblN % lblStep == 0) { //DocumentValue docVal = new DocumentValue(resultInPoint[ResultTypeLinear.X], displayUnitTypeX, unitTypeX, units); DocumentValue docVal = new DocumentValue(valX, displayUnitTypeX, unitTypeX, units); valXAsString = (string)docVal.Value; chart.AxisX.Labels.Add(new DocumentDiagramAxisLabel(valX, valXAsString)); } lblN++; } } } } return chart; } /// /// Creats document section with table and graph /// /// Title of the section /// Result in point collection /// The type of results that will be displayed in the diagram and in the table. /// Active Revit document /// Structural element type /// Enabling/disabling inserting a table /// Enabling/disabling inserting a graph /// Title of the table /// Title of the graph /// Sets the direction of the Y axis on the graph /// Returns section of document with diagram and table private DocumentSection CreateSectionTableAndDiagram(ICollection resultsInPoints, List resultTypes, Autodesk.Revit.DB.Document document, ElementType elementType, bool addTable = true, bool addDiagram = true, bool reversedAxis = false, String sectionTitle = "", String tableTitle = "", String diagramTitle = "") { DocumentSection newDocumentSection = null; if (addTable || addDiagram) { newDocumentSection = new DocumentSection(sectionTitle, 5); newDocumentSection.Level = DetailLevel.Medium; if (addTable) { DocumentSection tableSection = new DocumentSection(tableTitle, 6); DocumentTable resultTable = CreateTable(resultsInPoints, resultTypes, document); resultTable.Level = DetailLevel.Medium; newDocumentSection.Body.Elements.Add(resultTable); } if (addDiagram) { DocumentSection diagramSection = new DocumentSection(); DocumentDiagram resultDiagram = CreateDiagram(diagramTitle, resultsInPoints, resultTypes, document, elementType, reversedAxis); resultDiagram.Level = DetailLevel.Detail; newDocumentSection.Body.Elements.Add(new DocumentLineBreak(2)); newDocumentSection.Body.Elements.Add(resultDiagram); } } return newDocumentSection; } public override void Verify(Autodesk.Revit.DB.CodeChecking.ServiceData data) { Autodesk.Revit.DB.CodeChecking.Storage.StorageService service = Autodesk.Revit.DB.CodeChecking.Storage.StorageService.GetStorageService(); Autodesk.Revit.DB.CodeChecking.Storage.StorageDocument storageDocument = service.GetStorageDocument(data.Document); Main.Calculation.EngineData enginData = new Main.Calculation.EngineData(); Engine.Engine engine = new Engine.Engine(enginData); engine.Calculate(this, data); } public override IList GetSupportedCategories(StructuralAssetClass material) { List supportedCategories = new List(); supportedCategories.Add(BuiltInCategory.OST_BeamAnalytical); supportedCategories.Add(BuiltInCategory.OST_ColumnAnalytical); return supportedCategories; } public override IList GetSupportedMaterials() { return new List(){ Autodesk.Revit.DB.StructuralAssetClass.Concrete}; } #endregion /// /// Gets the document body for label. /// /// label. /// document. /// /// The body of the document. /// public override DocumentBody BuildLabelDocumentBody(Entity label, Autodesk.Revit.DB.Document document) { switch (label.Schema.SchemaName) { default: return base.BuildLabelDocumentBody(label, document); case "LabelColumn": { DocumentBody body = new DocumentBody(); LabelColumn labelColumn = new LabelColumn(); labelColumn.SetProperties(label, document); body.Elements.Add(new DocumentTitle(Resources.ResourceManager.GetString("CalculationOptions"), 4)); if (labelColumn.EnabledInternalForces.Count > 0) { body.Elements.Add(new DocumentText(Resources.ResourceManager.GetString("EnabledInternalForces") + ":", true)); if (labelColumn.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.FX)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("ColumnFX_Note"), true)); if (labelColumn.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.FY)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("ColumnFY_Note"), true)); if (labelColumn.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.FZ)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("ColumnFZ_Note"), true)); if (labelColumn.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.MX)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("ColumnMX_Note"), true)); if (labelColumn.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.MY)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("ColumnMY_Note"), true)); if (labelColumn.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.MZ)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("ColumnMZ_Note"), true)); } body.Elements.Add(DocumentElement.GetDocumentElement("CreepCoefficient", labelColumn, this, document)); body.Elements.Add(new DocumentTitle(Resources.ResourceManager.GetString("Buckling"), 4)); body.Elements.Add(new DocumentTitle(Resources.ResourceManager.GetString("BucklingDirectionY"), 5)); if (labelColumn.BucklingDirectionY) { body.Elements.Add(DocumentElement.GetDocumentElement("LengthCoefficientY", labelColumn, this, document)); body.Elements.Add(DocumentElement.GetDocumentElement("ColumnStructureTypeY", labelColumn, this, document)); } else { body.Elements.Add(new DocumentText(Resources.ResourceManager.GetString("NotTakenIntoConsideration"), true)); } body.Elements.Add(new DocumentTitle(Resources.ResourceManager.GetString("BucklingDirectionZ"), 5)); if (labelColumn.BucklingDirectionZ) { body.Elements.Add(DocumentElement.GetDocumentElement("LengthCoefficientZ", labelColumn, this, document)); body.Elements.Add(DocumentElement.GetDocumentElement("ColumnStructureTypeZ", labelColumn, this, document)); } else { body.Elements.Add(new DocumentText(Resources.ResourceManager.GetString("NotTakenIntoConsideration"), true)); } // longitudinal body.Elements.Add(new DocumentTitle(Resources.ResourceManager.GetString("LongitudinalReinforcement"), 4)); if (labelColumn.LongitudinalReinforcement.Material != null) { StructuralAsset assL = Autodesk.Revit.DB.CodeChecking.Engineering.Concrete.RebarUtility.GetMaterialStructuralAsset(labelColumn.LongitudinalReinforcement.Material); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("Material"), assL.Name)); } else body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("Material"), "")); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("MinimumYieldStress"), labelColumn.LongitudinalReinforcement.MinimumYieldStress, UnitsConverter.GetInternalUnit(UnitType.UT_Stress), UnitType.UT_Stress, document.GetUnits())); if (labelColumn.LongitudinalReinforcement.RebarBarType != null) body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("RebarBarType"), labelColumn.LongitudinalReinforcement.RebarBarType.Name)); else body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("RebarBarType"), "")); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("DeformationType"), labelColumn.LongitudinalReinforcement.DeformationType.ToString())); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("BarDiameter"), labelColumn.LongitudinalReinforcement.BarDiameter, UnitsConverter.GetInternalUnit(UnitType.UT_Bar_Diameter), UnitType.UT_Bar_Diameter, document.GetUnits())); // transverse body.Elements.Add(new DocumentTitle(Resources.ResourceManager.GetString("TransversalReinforcement"), 4)); if (labelColumn.TransversalReinforcement.Material != null) { StructuralAsset assL = Autodesk.Revit.DB.CodeChecking.Engineering.Concrete.RebarUtility.GetMaterialStructuralAsset(labelColumn.TransversalReinforcement.Material); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("Material"), assL.Name)); } else body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("Material"), "")); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("MinimumYieldStress"), labelColumn.TransversalReinforcement.MinimumYieldStress, UnitsConverter.GetInternalUnit(UnitType.UT_Stress), UnitType.UT_Stress, document.GetUnits())); if (labelColumn.TransversalReinforcement.RebarBarType != null) body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("RebarBarType"), labelColumn.TransversalReinforcement.RebarBarType.Name)); else body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("RebarBarType"), "")); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("DeformationType"), labelColumn.TransversalReinforcement.DeformationType.ToString())); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("BarDiameter"), labelColumn.TransversalReinforcement.BarDiameter, UnitsConverter.GetInternalUnit(UnitType.UT_Bar_Diameter), UnitType.UT_Bar_Diameter, document.GetUnits())); return body; } case "LabelBeam": { DocumentBody body = new DocumentBody(); LabelBeam labelBeam = new LabelBeam(); labelBeam.SetProperties(label, document); body.Elements.Add(new DocumentLineBreak(1)); body.Elements.Add(new DocumentTitle(Resources.ResourceManager.GetString("CalculationOptions"), 4)); if (labelBeam.EnabledInternalForces.Count > 0) { body.Elements.Add(new DocumentText(Resources.ResourceManager.GetString("EnabledInternalForces") + ":", true)); if (labelBeam.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.FX)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("BeamFX_Note"), true)); if (labelBeam.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.FY)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("BeamFY_Note"), true)); if (labelBeam.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.FZ)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("BeamFZ_Note"), true)); if (labelBeam.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.MX)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("BeamMX_Note"), true)); if (labelBeam.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.MY)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("BeamMY_Note"), true)); if (labelBeam.EnabledInternalForces.Contains(ConcreteTypes.EnabledInternalForces.MZ)) body.Elements.Add(new DocumentText("- " + Resources.ResourceManager.GetString("BeamMZ_Note"), true)); } body.Elements.Add(DocumentElement.GetDocumentElement("CreepCoefficient", labelBeam, this, document)); string interaction = Resources.ResourceManager.GetString("No"); if (labelBeam.SlabBeamInteraction == ConcreteTypes.BeamSectionType.WithSlabBeamInteraction) { interaction = Resources.ResourceManager.GetString("Yes"); } body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("SlabBeamInteraction"), interaction)); // longitudinal body.Elements.Add(new DocumentTitle(Resources.ResourceManager.GetString("LongitudinalReinforcement"), 4)); if (labelBeam.LongitudinalReinforcement.Material != null) { StructuralAsset assL = Autodesk.Revit.DB.CodeChecking.Engineering.Concrete.RebarUtility.GetMaterialStructuralAsset(labelBeam.LongitudinalReinforcement.Material); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("Material"), assL.Name)); } else body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("Material"), "")); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("MinimumYieldStress"), labelBeam.LongitudinalReinforcement.MinimumYieldStress, UnitsConverter.GetInternalUnit(UnitType.UT_Stress), UnitType.UT_Stress, document.GetUnits())); if (labelBeam.LongitudinalReinforcement.RebarBarType != null) body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("RebarBarType"), labelBeam.LongitudinalReinforcement.RebarBarType.Name)); else body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("RebarBarType"), "")); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("DeformationType"), labelBeam.LongitudinalReinforcement.DeformationType.ToString())); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("BarDiameter"), labelBeam.LongitudinalReinforcement.BarDiameter, UnitsConverter.GetInternalUnit(UnitType.UT_Bar_Diameter), UnitType.UT_Bar_Diameter, document.GetUnits())); // transverse body.Elements.Add(new DocumentTitle(Resources.ResourceManager.GetString("TransversalReinforcement"), 4)); if (labelBeam.TransversalReinforcement.Material != null) { StructuralAsset assL = Autodesk.Revit.DB.CodeChecking.Engineering.Concrete.RebarUtility.GetMaterialStructuralAsset(labelBeam.TransversalReinforcement.Material); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("Material"), assL.Name)); } else body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("Material"), "")); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("MinimumYieldStress"), labelBeam.TransversalReinforcement.MinimumYieldStress, UnitsConverter.GetInternalUnit(UnitType.UT_Stress), UnitType.UT_Stress, document.GetUnits())); if (labelBeam.TransversalReinforcement.RebarBarType != null) body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("RebarBarType"), labelBeam.TransversalReinforcement.RebarBarType.Name)); else body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("RebarBarType"), "")); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("DeformationType"), labelBeam.TransversalReinforcement.DeformationType.ToString())); body.Elements.Add(new DocumentValueWithName(Resources.ResourceManager.GetString("BarDiameter"), labelBeam.TransversalReinforcement.BarDiameter, UnitsConverter.GetInternalUnit(UnitType.UT_Bar_Diameter), UnitType.UT_Bar_Diameter, document.GetUnits())); return body; } } } /// /// Gets the document body for calculation parameters. /// /// Calculation parameters /// document /// Body of the document public override DocumentBody BuildCalculationParamDocumentBody(Entity calcParams, Autodesk.Revit.DB.Document document) { DocumentBody body = new DocumentBody(); return body; } #region IExternalServer Members public override string GetDescription() { return "Code Checking Concrete Example for Revit API"; } public override string GetName() { return "CodeCheckingConcreteExample"; } public override Guid GetServerId() { return ID; } public override string GetVendorId() { return "ADSK"; } /// /// Gets the output package result types. This information is needed to create proper ResultsBuilder Package. /// /// public override Autodesk.Revit.DB.ResultsBuilder.ResultsPackageTypes GetOutputPackageResultTypes() { return Autodesk.Revit.DB.ResultsBuilder.ResultsPackageTypes.RequiredReinforcement | Autodesk.Revit.DB.ResultsBuilder.ResultsPackageTypes.SteelRatio; } /// /// Gets the output package unit system. This information is needed to create proper ResultsBuilder Package. /// /// public override Autodesk.Revit.DB.ResultsBuilder.UnitsSystem GetOutputPackageUnitSystem() { return UnitSystem; } #endregion #region ICodeCheckingServerDocumentation Members public override string GetResource(string key, string context) { string txt = Resources.ResourceManager.GetString(key); if (!string.IsNullOrEmpty(txt)) return txt; return key; } #endregion } }