/// <summary> /// Get the geometry information of bottom rebar /// </summary> /// <returns>the gotten geometry information</returns> 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 <Autodesk.Revit.DB.XYZ> 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 <Autodesk.Revit.DB.XYZ> 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 <Curve> curves = new List <Curve>(); //the profile of the bottom rebar curves.Add(Line.CreateBound(startPoint, endPoint)); // return the rebar geometry information return(new RebarGeometry(normal, curves, rebarNumber, spacing)); }
/// <summary> /// Get the geometry information for top rebar /// </summary> /// <param name="location">indicate where top rebar is placed</param> /// <returns>the gotten geometry information</returns> 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 <Autodesk.Revit.DB.XYZ> 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 <Autodesk.Revit.DB.XYZ> 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 <Curve> curves = new List <Curve>(); //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)); }
/// <summary> /// Get the width of the column /// </summary> /// <returns>the width data</returns> private double GetColumnWidth() { XYZHeightComparer comparer = new XYZHeightComparer(); m_points.Sort(comparer); Autodesk.Revit.DB.XYZ refPoint = m_points[0]; List <Autodesk.Revit.DB.XYZ> directions = GetRelatedVectors(refPoint); directions.Sort(comparer); return(GeomUtil.GetLength(directions[1])); }
/// <summary> /// Get the down direction, which stand for the top hook direction /// </summary> /// <returns>the down direction</returns> public Autodesk.Revit.DB.XYZ GetDownDirection() { XYZHeightComparer comparer = new XYZHeightComparer(); m_points.Sort(comparer); Autodesk.Revit.DB.XYZ refPoint = m_points[3]; List <Autodesk.Revit.DB.XYZ> directions = GetRelatedVectors(refPoint); directions.Sort(comparer); return(directions[0]); }
/// <summary> /// Get the geometry information of the transverse rebar /// </summary> /// <param name="location">the location of transverse rebar</param> /// <param name="spacing">the spacing value of the rebar</param> /// <returns>the gotted geometry information</returns> 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 column surface to the rebar double offset = ColumnRebarData.TransverseOffset; //the length of the transverse rebar double rebarLength = 0; // get the origin and normal parameter for rebar creation Autodesk.Revit.DB.XYZ normal = m_drivingVector; double curveOffset = 0; //set rebar length and origin according to the location of rebar switch (location) { case TransverseRebarLocation.Start: // start transverse rebar rebarLength = m_columnHeight / 4; break; case TransverseRebarLocation.Center: // center transverse rebar rebarLength = m_columnHeight / 2; curveOffset = m_columnHeight / 4 + (rebarLength % spacing) / 2; break; case TransverseRebarLocation.End: // end transverse rebar rebarLength = m_columnHeight / 4; curveOffset = m_columnHeight - rebarLength + (rebarLength % spacing); break; default: throw new Exception("The program should never go here."); } // the number of the transverse rebar int rebarNumber = (int)(rebarLength / spacing) + 1; // get the profile of the transverse rebar List <Autodesk.Revit.DB.XYZ> movedPoints = OffsetPoints(offset); List <Autodesk.Revit.DB.XYZ> translatedPoints = new List <Autodesk.Revit.DB.XYZ>(); foreach (Autodesk.Revit.DB.XYZ point in movedPoints) { translatedPoints.Add(GeomUtil.OffsetPoint(point, m_drivingVector, curveOffset)); } IList <Curve> curves = new List <Curve>(); //the profile of the transverse rebar 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)); }
/// <summary> /// Get the geometry information of vertical rebar /// </summary> /// <param name="location">the location of vertical rebar</param> /// <param name="rebarNumber">the spacing value of the rebar</param> /// <returns>the gotted geometry information</returns> public RebarGeometry GetVerticalRebar(VerticalRebarLocation location, int rebarNumber) { // sort the points of the swept profile XYZHeightComparer comparer = new XYZHeightComparer(); m_points.Sort(comparer); // Get the offset and rebar length of rebar double offset = ColumnRebarData.VerticalOffset; double rebarLength = m_columnHeight + 3; //the length of rebar // Get the start point of the vertical rebar curve Autodesk.Revit.DB.XYZ startPoint = m_drivingLine.GetEndPoint(0); List <Autodesk.Revit.DB.XYZ> movedPoints = OffsetPoints(offset); movedPoints.Sort(comparer); Autodesk.Revit.DB.XYZ normal = new Autodesk.Revit.DB.XYZ(); // the normal parameter double rebarOffset = 0; // rebar offset, equal to rebarNumber* spacing // get the normal, start point and rebar offset of vertical rebar switch (location) { case VerticalRebarLocation.East: //vertical rebar in east normal = new Autodesk.Revit.DB.XYZ(0, 1, 0); rebarOffset = m_columnWidth - 2 * offset; startPoint = movedPoints[1]; break; case VerticalRebarLocation.North: //vertical rebar in north normal = new Autodesk.Revit.DB.XYZ(-1, 0, 0); rebarOffset = m_columnLength - 2 * offset; startPoint = movedPoints[3]; break; case VerticalRebarLocation.West: //vertical rebar in west normal = new Autodesk.Revit.DB.XYZ(0, -1, 0); rebarOffset = m_columnWidth - 2 * offset; startPoint = movedPoints[2]; break; case VerticalRebarLocation.South: //vertical rebar in south normal = new Autodesk.Revit.DB.XYZ(1, 0, 0); rebarOffset = m_columnLength - 2 * offset; startPoint = movedPoints[0]; break; default: break; } double spacing = rebarOffset / rebarNumber; //spacing value of the rebar Autodesk.Revit.DB.XYZ endPoint = GeomUtil.OffsetPoint(startPoint, m_drivingVector, rebarLength); IList <Curve> curves = new List <Curve>(); //profile of the rebar curves.Add(Line.CreateBound(startPoint, endPoint)); // return the rebar geometry information return(new RebarGeometry(normal, curves, rebarNumber, spacing)); }