// // (C) Copyright 2003-2019 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.Text; using Autodesk.Revit; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Structure; namespace Revit.SDK.Samples.Reinforcement.CS { /// /// The geometry support for reinforcement creation on beam. /// It can prepare the geometry information for top rebar, bottom and transverse rebar creation /// public class BeamGeometrySupport : GeometrySupport { // Private members double m_beamLength; //the length of the beam double m_beamWidth; //the width of the beam double m_beamHeight; //the height of the beam /// /// constructor /// /// the beam which the rebars are placed on /// the geometry option public BeamGeometrySupport(FamilyInstance element, Options geoOptions) : base(element, geoOptions) { // assert the host element is a beam if (!element.StructuralType.Equals(StructuralType.Beam)) { throw new Exception("BeamGeometrySupport can only work for beam instance."); } // Get the length, width and height of the beam. m_beamLength = GetDrivingLineLength(); m_beamWidth = GetBeamWidth(); m_beamHeight = GetBeamHeight(); } /// /// Get the geometry information for top rebar /// /// indicate where top rebar is placed /// the gotten geometry information public RebarGeometry GetTopRebar(TopRebarLocation location) { // sort the points of the swept profile XYZHeightComparer comparer = new XYZHeightComparer(); m_points.Sort(comparer); // Get the normal parameter for rebar creation List directions = GetRelatedVectors(m_points[3]); directions.Sort(comparer); Autodesk.Revit.DB.XYZ normal = directions[1]; double offset = 0; //the offset from the beam surface to the rebar double startPointOffset = 0; // the offset of start point from swept profile double rebarLength = m_beamLength / 3; //the length of the rebar int rebarNumber = BeamRebarData.TopRebarNumber; //the number of the rebar // set offset and startPointOffset according to the location of rebar switch (location) { case TopRebarLocation.Start: // top start rebar offset = BeamRebarData.TopEndOffset; break; case TopRebarLocation.Center: // top center rebar offset = BeamRebarData.TopCenterOffset; startPointOffset = m_beamLength / 3 - 0.5; rebarLength = m_beamLength / 3 + 1; break; case TopRebarLocation.End: // top end rebar offset = BeamRebarData.TopEndOffset; startPointOffset = m_beamLength * 2 / 3; break; default: throw new Exception("The program should never go here."); } // Get the curve which define the shape of the top rebar curve List movedPoints = OffsetPoints(offset); Autodesk.Revit.DB.XYZ startPoint = movedPoints[movedPoints.Count - 1]; // offset the start point according startPointOffset startPoint = GeomUtil.OffsetPoint(startPoint, m_drivingVector, startPointOffset); // get the coordinate of endpoint Autodesk.Revit.DB.XYZ endPoint = GeomUtil.OffsetPoint(startPoint, m_drivingVector, rebarLength); IList curves = new List(); //the profile of the top rebar curves.Add(Line.CreateBound(startPoint, endPoint)); // the spacing of the rebar double spacing = spacing = (m_beamWidth - 2 * offset) / (rebarNumber - 1); // return the rebar geometry information return new RebarGeometry(normal, curves, rebarNumber, spacing); } /// /// Get the geometry information of bottom rebar /// /// the gotten geometry information public RebarGeometry GetBottomRebar() { // sort the points of the swept profile XYZHeightComparer comparer = new XYZHeightComparer(); m_points.Sort(comparer); // Get the normal parameter for bottom rebar creation List directions = GetRelatedVectors(m_points[0]); directions.Sort(comparer); Autodesk.Revit.DB.XYZ normal = directions[0]; double offset = BeamRebarData.BottomOffset; //offset value of the rebar int rebarNumber = BeamRebarData.BottomRebarNumber; //the number of the rebar // the spacing of the rebar double spacing = (m_beamWidth - 2 * offset) / (rebarNumber - 1); // Get the curve which define the shape of the bottom rebar curve List movedPoints = OffsetPoints(offset); Autodesk.Revit.DB.XYZ startPoint = movedPoints[0]; //get the coordinate of startpoint //get the coordinate of endpoint Autodesk.Revit.DB.XYZ endPoint = GeomUtil.OffsetPoint(startPoint, m_drivingVector, m_beamLength); IList curves = new List(); //the profile of the bottom rebar curves.Add(Line.CreateBound(startPoint, endPoint)); // return the rebar geometry information return new RebarGeometry(normal, curves, rebarNumber, spacing); } /// /// Get the geometry information of transverse rebar /// /// indicate which part of transverse rebar /// the spacing of the rebar /// the gotten geometry information public RebarGeometry GetTransverseRebar(TransverseRebarLocation location, double spacing) { // sort the points of the swept profile XYZHeightComparer comparer = new XYZHeightComparer(); m_points.Sort(comparer); // the offset from the beam surface to the rebar double offset = BeamRebarData.TransverseOffset; // the offset from the beam end to the transverse end double endOffset = BeamRebarData.TransverseEndOffset; // the offset between two transverses double betweenOffset = BeamRebarData.TransverseSpaceBetween; // the length of the transverse rebar double rebarLength = (m_beamLength - 2 * endOffset - 2 * betweenOffset) / 3; // the number of the transverse rebar int rebarNumber = (int)(rebarLength / spacing) + 1; // get the origin and normal parameter for rebar creation Autodesk.Revit.DB.XYZ normal = m_drivingVector; double curveOffset = 0; //judge the coordinate of transverse rebar according to the location switch (location) { case TransverseRebarLocation.Start: // start transverse rebar curveOffset = endOffset; break; case TransverseRebarLocation.Center: // center transverse rebar curveOffset = endOffset + rebarLength + betweenOffset; curveOffset = curveOffset + (rebarLength % spacing) / 2; break; case TransverseRebarLocation.End: // end transverse rebar curveOffset = m_beamLength - endOffset - rebarLength + (rebarLength % spacing); break; default: throw new Exception("The program should never go here."); } // get the profile of the transverse rebar List movedPoints = OffsetPoints(offset); // Translate curves points List translatedPoints = new List(); foreach (Autodesk.Revit.DB.XYZ point in movedPoints) { translatedPoints.Add(GeomUtil.OffsetPoint(point, m_drivingVector, curveOffset)); } IList curves = new List(); Autodesk.Revit.DB.XYZ first = translatedPoints[0]; Autodesk.Revit.DB.XYZ second = translatedPoints[1]; Autodesk.Revit.DB.XYZ third = translatedPoints[2]; Autodesk.Revit.DB.XYZ fourth = translatedPoints[3]; curves.Add(Line.CreateBound(first, second)); curves.Add(Line.CreateBound(second, fourth)); curves.Add(Line.CreateBound(fourth, third)); curves.Add(Line.CreateBound(third, first)); // return the rebar geometry information return new RebarGeometry(normal, curves, rebarNumber, spacing); } /// /// Get the down direction, which stand for the top hook direction /// /// the down direction public Autodesk.Revit.DB.XYZ GetDownDirection() { XYZHeightComparer comparer = new XYZHeightComparer(); m_points.Sort(comparer); Autodesk.Revit.DB.XYZ refPoint = m_points[3]; List directions = GetRelatedVectors(refPoint); directions.Sort(comparer); return directions[0]; } /// /// Get the width of the beam /// /// the width data private double GetBeamWidth() { XYZHeightComparer comparer = new XYZHeightComparer(); m_points.Sort(comparer); Autodesk.Revit.DB.XYZ refPoint = m_points[0]; List directions = GetRelatedVectors(refPoint); directions.Sort(comparer); return GeomUtil.GetLength(directions[0]); } /// /// Get the height of the beam /// /// the height data private double GetBeamHeight() { XYZHeightComparer comparer = new XYZHeightComparer(); m_points.Sort(comparer); Autodesk.Revit.DB.XYZ refPoint = m_points[0]; List directions = GetRelatedVectors(refPoint); directions.Sort(comparer); return GeomUtil.GetLength(directions[1]); } } }