示例#1
0
        /// <summary>The create end rebar.</summary>
        /// <param name="currentOriginalRebar">The original rebar.</param>
        /// <param name="maxLength">The max length.</param>
        /// <param name="splitPattern">The split pattern.</param>
        /// <param name="splitRebarSet">The split reinforcement bar set.</param>
        /// <param name="incrementalLength">The incremental length.</param>
        /// <param name="lastSegment">The last segment.</param>
        /// <returns>The System.Boolean.</returns>
        private bool CreateEndRebar(
            SingleRebar currentOriginalRebar,
            double maxLength,
            Vector splitPattern,
            ArrayList splitRebarSet,
            ref double incrementalLength,
            out double lastSegment)
        {
            var    rebarPoints = new ArrayList();
            double finalRebarLength;

            splitPattern.Normalize(incrementalLength);
            var firstPoint = new Vector(splitPattern);

            lastSegment = Distance.PointToPoint(
                (Point)currentOriginalRebar.Polygon.Points[0] + firstPoint, (Point)currentOriginalRebar.Polygon.Points[1]);

            rebarPoints.Add((Point)currentOriginalRebar.Polygon.Points[0] + firstPoint);
            rebarPoints.Add(currentOriginalRebar.Polygon.Points[1]);
            bool result = this.CreateSplittedRebars(FirstOrLastEnum.LastRebar, rebarPoints, splitRebarSet, out finalRebarLength);

            incrementalLength += maxLength + (this.splitData.LappingLength / 2.0);

            return(result);
        }
示例#2
0
        public static SingleRebar createDiagonal(T3D.Point p1, T3D.Point p2, double diametro)
        {
            SingleRebar rebar = crearBarra(p1, p2, diametro);

            rebar.Name = "DIAGONAL";
            return(rebar);
        }
示例#3
0
        public static SingleRebar createBarraLongitudinal(T3D.Point p1, T3D.Point p2, double diametro)
        {
            SingleRebar rebar = crearBarra(p1, p2, diametro);

            rebar.Name = "BARRA_VIGUETA";
            return(rebar);
        }
示例#4
0
        /// <summary>The set new reinforcement bar properties from reinforcement bar group.</summary>
        /// <param name="newRebar">The new rebar.</param>
        /// <param name="originalRebarGroup">The original reinforcement bar group.</param>
        private void SetNewRebarPropertiesFromRebarGroup(SingleRebar newRebar, RebarGroup originalRebarGroup)
        {
            newRebar.Father = originalRebarGroup.Father;
            newRebar.Name   = originalRebarGroup.Name;
            newRebar.Size   = originalRebarGroup.Size;
            newRebar.Grade  = originalRebarGroup.Grade;
            newRebar.Class  = originalRebarGroup.Class;

            newRebar.StartHook.Shape  = originalRebarGroup.StartHook.Shape;
            newRebar.StartHook.Angle  = originalRebarGroup.StartHook.Angle;
            newRebar.StartHook.Radius = originalRebarGroup.StartHook.Radius;
            newRebar.StartHook.Length = originalRebarGroup.StartHook.Length;

            newRebar.EndHook.Shape  = originalRebarGroup.EndHook.Shape;
            newRebar.EndHook.Angle  = originalRebarGroup.EndHook.Angle;
            newRebar.EndHook.Radius = originalRebarGroup.EndHook.Radius;
            newRebar.EndHook.Length = originalRebarGroup.EndHook.Length;

            newRebar.OnPlaneOffsets        = new ArrayList();
            newRebar.FromPlaneOffset       = 0.0;
            newRebar.EndPointOffsetValue   = 0.0;
            newRebar.EndPointOffsetType    = originalRebarGroup.EndPointOffsetType;
            newRebar.StartPointOffsetValue = 0.0;
            newRebar.StartPointOffsetType  = originalRebarGroup.StartPointOffsetType;

            newRebar.NumberingSeries.Prefix      = originalRebarGroup.NumberingSeries.Prefix;
            newRebar.NumberingSeries.StartNumber = originalRebarGroup.NumberingSeries.StartNumber;
            newRebar.RadiusValues = originalRebarGroup.RadiusValues;
        }
示例#5
0
        /// <summary>The set new reinforcement bar properties from single rebar.</summary>
        /// <param name="newRebar">The new rebar.</param>
        /// <param name="originalSingleRebar">The original single rebar.</param>
        private void SetNewRebarPropertiesFromSingleRebar(SingleRebar newRebar, SingleRebar originalSingleRebar)
        {
            newRebar.Father = originalSingleRebar.Father;
            newRebar.Name   = originalSingleRebar.Name;
            newRebar.Size   = originalSingleRebar.Size;
            newRebar.Grade  = originalSingleRebar.Grade;
            newRebar.Class  = originalSingleRebar.Class;

            newRebar.StartHook.Shape  = originalSingleRebar.StartHook.Shape;
            newRebar.StartHook.Angle  = originalSingleRebar.StartHook.Angle;
            newRebar.StartHook.Radius = originalSingleRebar.StartHook.Radius;
            newRebar.StartHook.Length = originalSingleRebar.StartHook.Length;

            newRebar.EndHook.Shape  = originalSingleRebar.EndHook.Shape;
            newRebar.EndHook.Angle  = originalSingleRebar.EndHook.Angle;
            newRebar.EndHook.Radius = originalSingleRebar.EndHook.Radius;
            newRebar.EndHook.Length = originalSingleRebar.EndHook.Length;

            newRebar.FromPlaneOffset             = originalSingleRebar.FromPlaneOffset;
            newRebar.OnPlaneOffsets              = originalSingleRebar.OnPlaneOffsets;
            newRebar.NumberingSeries.Prefix      = originalSingleRebar.NumberingSeries.Prefix;
            newRebar.NumberingSeries.StartNumber = originalSingleRebar.NumberingSeries.StartNumber;
            newRebar.RadiusValues = originalSingleRebar.RadiusValues;

            newRebar.EndPointOffsetValue   = originalSingleRebar.EndPointOffsetValue;
            newRebar.EndPointOffsetType    = originalSingleRebar.EndPointOffsetType;
            newRebar.StartPointOffsetValue = originalSingleRebar.StartPointOffsetValue;
            newRebar.StartPointOffsetType  = originalSingleRebar.StartPointOffsetType;
        }
示例#6
0
        /// <summary>The create different middle rebar in center symmetry.</summary>
        /// <param name="remainingLength">The remaining length.</param>
        /// <param name="currentOriginalRebar">The original rebar.</param>
        /// <param name="splitPattern">The split pattern.</param>
        /// <param name="incrementalLength">The incremental length.</param>
        /// <param name="splitRebarSet">The split reinforcement bar set.</param>
        /// <returns>The System.Boolean.</returns>
        private bool CreateDifferentMiddleRebarInCenterSymmetry(
            double remainingLength,
            SingleRebar currentOriginalRebar,
            ref Vector splitPattern,
            ref double incrementalLength,
            ref ArrayList splitRebarSet)
        {
            double rebarLength, finalRebarLength;
            var    rebarPoints = new ArrayList();

            if (this.splitData.SpliceType == 0)
            {
                rebarLength = remainingLength - this.splitData.LappingLength;
            }
            else
            {
                rebarLength = remainingLength;
            }

            splitPattern.Normalize(incrementalLength);
            var firstPoint = new Vector(splitPattern);

            splitPattern.Normalize(rebarLength);
            var secondPoint = new Vector(splitPattern);

            rebarPoints.Add((Point)currentOriginalRebar.Polygon.Points[0] + firstPoint);
            rebarPoints.Add((Point)currentOriginalRebar.Polygon.Points[0] + firstPoint + secondPoint);
            bool result = this.CreateSplittedRebars(FirstOrLastEnum.MiddleRebar, rebarPoints, splitRebarSet, out finalRebarLength);

            incrementalLength += finalRebarLength;

            return(result);
        }
示例#7
0
        /// <summary>The split rebar.</summary>
        /// <param name="originalRebar">The original rebar.</param>
        /// <param name="section">The section.</param>
        /// <param name="barPosition">The bar position.</param>
        /// <param name="remainingOffset">The remaining offset.</param>
        /// <param name="splitRebarSet">The split reinforcement bar set.</param>
        /// <returns>The System.Boolean.</returns>
        private bool SplitRebar(
            SingleRebar originalRebar,
            SpliceSection section,
            BarPositions barPosition,
            ref double remainingOffset,
            out ArrayList splitRebarSet)
        {
            var    result = true;
            double maxLength, totalOffset, remainingLength, hookLength, incrementalLength = 0.0;

            splitRebarSet = new ArrayList();
            var totalRebarLength = Distance.PointToPoint((Point)originalRebar.Polygon.Points[1], (Point)originalRebar.Polygon.Points[0]);
            var splitPattern     = new Vector((Point)originalRebar.Polygon.Points[1] - (Point)originalRebar.Polygon.Points[0]);

            this.GetRebarMaximumLength(FirstOrLastEnum.MiddleRebar, out maxLength);
            this.CalculateTotalOffset(
                totalRebarLength,
                section,
                barPosition,
                remainingOffset,
                out totalOffset,
                out remainingLength,
                out hookLength);

            for (var ii = 0; incrementalLength + this.GetRebarLengthEpsilon() < totalRebarLength; ii++)
            {
                if (ii == 0)
                {
                    result &= this.CreateStartRebar(originalRebar, splitPattern, splitRebarSet, totalOffset, hookLength, ref incrementalLength);
                }
                else if (incrementalLength + maxLength + this.GetRebarLengthEpsilon() < totalRebarLength)
                {
                    var centralBarsCount = (int)Math.Floor(totalRebarLength / maxLength);

                    if (this.splitData.SpliceSymmetry == 2 && barPosition == BarPositions.First && centralBarsCount > 1 &&
                        incrementalLength < totalRebarLength / 2.0 &&
                        incrementalLength + maxLength > totalRebarLength / 2.0)
                    {
                        result &= this.CreateDifferentMiddleRebarInCenterSymmetry(remainingLength, originalRebar, ref splitPattern, ref incrementalLength, ref splitRebarSet);
                    }
                    else
                    {
                        result &= this.CreateMiddleRebar(originalRebar, splitPattern, splitRebarSet, ref incrementalLength);
                    }
                }
                else
                {
                    double lastSegment;
                    result &= this.CreateEndRebar(originalRebar, maxLength, splitPattern, splitRebarSet, ref incrementalLength, out lastSegment);

                    if (barPosition == BarPositions.First)
                    {
                        remainingOffset = lastSegment;
                    }
                }
            }

            return(result);
        }
示例#8
0
 private static void addRebarSettings(SingleRebar rebar, double diametro)
 {
     rebar.RadiusValues.Add(40.0);
     rebar.Class = 3;
     rebar.Size  = "" + diametro;
     rebar.NumberingSeries.StartNumber = 0;
     rebar.Grade = "Undefined";
 }
 public static dynamic GetTSObject(SingleRebar dynObject)
 {
     if (dynObject is null)
     {
         return(null);
     }
     return(dynObject.teklaObject);
 }
示例#10
0
        private static SingleRebar crearBarra(T3D.Point p1, T3D.Point p2, double diametro)
        {
            SingleRebar rebar = new SingleRebar();

            rebar.Polygon.Points.Add(p1);
            rebar.Polygon.Points.Add(p2);
            addRebarSettings(rebar, diametro);
            return(rebar);
        }
示例#11
0
        /// <summary>The create start rebar.</summary>
        /// <param name="currentOriginalRebar">The original rebar.</param>
        /// <param name="splitPattern">The split pattern.</param>
        /// <param name="splitRebarSet">The split reinforcement bar set.</param>
        /// <param name="totalOffset">The total offset.</param>
        /// <param name="hookLength">The hook length.</param>
        /// <param name="incrementalLength">The incremental length.</param>
        /// <returns>The System.Boolean.</returns>
        private bool CreateStartRebar(
            SingleRebar currentOriginalRebar,
            Vector splitPattern,
            ArrayList splitRebarSet,
            double totalOffset,
            double hookLength,
            ref double incrementalLength)
        {
            var    rebarPoints = new ArrayList();
            double finalRebarLength;

            if (totalOffset < DistanceEpsilon)
            {
                double rebarLength;

                if (this.splitData.SpliceSymmetry == 2)
                {
                    rebarLength = this.splitData.MaxLength;

                    if (this.splitData.SpliceType == 0)
                    {
                        rebarLength -= this.splitData.LappingLength / 2.0;
                    }

                    rebarLength -= hookLength;
                }
                else
                {
                    this.GetRebarMaximumLength(FirstOrLastEnum.FirstRebar, out rebarLength);
                }

                splitPattern.Normalize(rebarLength);
            }
            else
            {
                splitPattern.Normalize(totalOffset);
            }

            var secondPoint = new Vector(splitPattern);

            rebarPoints.Add(currentOriginalRebar.Polygon.Points[0]);
            rebarPoints.Add((Point)currentOriginalRebar.Polygon.Points[0] + secondPoint);
            bool result = this.CreateSplittedRebars(FirstOrLastEnum.FirstRebar, rebarPoints, splitRebarSet, out finalRebarLength);

            incrementalLength += finalRebarLength;

            return(result);
        }
示例#12
0
        private void fabricarBarras()
        {
            T3D.Point p1 = new T3D.Point(x1(), YBarras(offset), z2());
            T3D.Point p2 = new T3D.Point(x2(), YBarras(offset), z2());
            T3D.Point p3 = new T3D.Point(x1(), YBarras(offset), z1());
            T3D.Point p4 = new T3D.Point(x2(), YBarras(offset), z1());

            SingleRebar barra1 = FabricaElementosPanel.createBarraLongitudinal(p1, p2, p.diametroBarras);
            SingleRebar barra2 = FabricaElementosPanel.createBarraLongitudinal(p3, p4, p.diametroBarras);

            barra1.Father = p.muro;
            barra2.Father = p.muro;

            barra1.Insert();
            barra2.Insert();
        }
示例#13
0
        private void fabricarBarras()
        {
            T3D.Point p1 = new T3D.Point(XBarras(offset), p.min.Y - p.adicionalInferior, z2());
            T3D.Point p2 = new T3D.Point(XBarras(offset), p.max.Y + p.adicionalSuperior, z2());
            T3D.Point p3 = new T3D.Point(XBarras(offset), p.min.Y - p.adicionalInferior, z1());
            T3D.Point p4 = new T3D.Point(XBarras(offset), p.max.Y + p.adicionalSuperior, z1());

            SingleRebar barra1 = FabricaElementosPanel.createBarraLongitudinal(p1, p2, p.diametroBarras);
            SingleRebar barra2 = FabricaElementosPanel.createBarraLongitudinal(p3, p4, p.diametroBarras);

            barra1.Father = p.muro;
            barra2.Father = p.muro;

            barra1.Insert();
            barra2.Insert();
        }
        /// <summary>The reinforcement bars can be spliced.</summary>
        /// <param name="primaryRebar">The primary rebar.</param>
        /// <param name="secondaryRebar">The secondary rebar.</param>
        /// <returns>The System.Boolean.</returns>
        private bool RebarsCanBeSpliced(SingleRebar primaryRebar, SingleRebar secondaryRebar)
        {
            var result = false;

            for (var primaryIndex = 0; primaryIndex < primaryRebar.Polygon.Points.Count && !result; primaryIndex++)
            {
                for (var secondaryIndex = 0; secondaryIndex < secondaryRebar.Polygon.Points.Count && !result; secondaryIndex++)
                {
                    if (Distance.PointToPoint(primaryRebar.Polygon.Points[primaryIndex] as Point, secondaryRebar.Polygon.Points[secondaryIndex] as Point) < DistanceEpsilon)
                    {
                        var primaryVector   = this.GetRebarVectorForSingleRebar(primaryIndex, primaryRebar);
                        var secondaryVector = this.GetRebarVectorForSingleRebar(secondaryIndex, secondaryRebar);
                        result = this.RebarsDoNotOverlap(primaryVector, secondaryVector);
                    }
                }
            }

            return(result);
        }
        static private void ungroupRebar(TSM.RebarGroup current)
        {
            ArrayList currentPolygons = current.GetRebarGeometries(true);

            foreach (TSM.RebarGeometry geo in currentPolygons)
            {
                TSM.Polygon poly   = new TSM.Polygon();
                PolyLine    line   = geo.Shape;
                ArrayList   points = line.Points;

                poly.Points = points;

                SingleRebar single = new SingleRebar();
                single.Polygon = poly;
                single.Father  = current.Father;

                single.Name = current.Name;

                single.Class        = current.Class;
                single.Size         = current.Size;
                single.Grade        = current.Grade;
                single.RadiusValues = current.RadiusValues;

                single.NumberingSeries.StartNumber = current.NumberingSeries.StartNumber;
                single.NumberingSeries.Prefix      = current.NumberingSeries.Prefix;

                single.OnPlaneOffsets = new ArrayList();
                single.OnPlaneOffsets.Add(0.0);
                single.StartHook.Angle  = -90;
                single.StartHook.Length = 10;
                single.StartHook.Radius = 10;
                single.StartHook.Shape  = RebarHookData.RebarHookShapeEnum.NO_HOOK;
                single.EndHook.Angle    = 90;
                single.EndHook.Length   = 10;
                single.EndHook.Radius   = 10;
                single.EndHook.Shape    = RebarHookData.RebarHookShapeEnum.NO_HOOK;

                single.Insert();
            }

            current.Delete();
            MessageBox.Show(currentPolygons.Count.ToString());
        }
示例#16
0
        /// <summary>The create middle rebar.</summary>
        /// <param name="currentOriginalRebar">The original rebar.</param>
        /// <param name="splitPattern">The split pattern.</param>
        /// <param name="splitRebarSet">The split reinforcement bar set.</param>
        /// <param name="incrementalLength">The incremental length.</param>
        /// <returns>The System.Boolean.</returns>
        private bool CreateMiddleRebar(SingleRebar currentOriginalRebar, Vector splitPattern, ArrayList splitRebarSet, ref double incrementalLength)
        {
            var    rebarPoints = new ArrayList();
            double rebarLength, finalRebarLength;

            splitPattern.Normalize(incrementalLength);
            var firstPoint = new Vector(splitPattern);

            this.GetRebarMaximumLength(FirstOrLastEnum.MiddleRebar, out rebarLength);
            splitPattern.Normalize(rebarLength);
            var secondPoint = new Vector(splitPattern);

            rebarPoints.Add((Point)currentOriginalRebar.Polygon.Points[0] + firstPoint);
            rebarPoints.Add((Point)currentOriginalRebar.Polygon.Points[0] + firstPoint + secondPoint);
            bool result = this.CreateSplittedRebars(FirstOrLastEnum.MiddleRebar, rebarPoints, splitRebarSet, out finalRebarLength);

            incrementalLength += finalRebarLength;

            return(result);
        }
示例#17
0
        internal static SingleRebar GetSingleRebar()
        {
            var beam  = GetBeam();
            var solid = beam.GetSolid();

            Polygon Polygon = new Polygon();

            Polygon.Points.Add(new Point(solid.MinimumPoint.X, solid.MaximumPoint.Y, solid.MaximumPoint.Z));
            Polygon.Points.Add(new Point(solid.MaximumPoint.X, solid.MaximumPoint.Y, solid.MaximumPoint.Z));

            SingleRebar singleRebar = new SingleRebar
            {
                Polygon        = Polygon,
                Father         = beam,
                Name           = "SingleRebar",
                Class          = 9,
                Size           = "12",
                Grade          = "A500HW",
                OnPlaneOffsets = new ArrayList {
                    25.00
                },
                NumberingSeries = new NumberingSeries("Single", 0),
                StartHook       = new RebarHookData()
                {
                    Angle  = -90,
                    Length = 10,
                    Radius = 10,
                    Shape  = RebarHookData.RebarHookShapeEnum.CUSTOM_HOOK
                },
                EndHook = new RebarHookData()
                {
                    Angle  = 90,
                    Length = 10,
                    Radius = 10,
                    Shape  = RebarHookData.RebarHookShapeEnum.CUSTOM_HOOK
                }
            };

            singleRebar.Insert();
            return(singleRebar);
        }
示例#18
0
        /// <summary>The get single rebar.</summary>
        /// <param name="rebarPoints">The reinforcement bar points.</param>
        /// <returns>The Tekla.Structures.Model.SingleRebar.</returns>
        public SingleRebar GetSingleRebar(ArrayList rebarPoints)
        {
            var newRebar  = new SingleRebar();
            var polyRebar = new Polygon();

            polyRebar.Points.Add(rebarPoints[0]);
            polyRebar.Points.Add(rebarPoints[1]);
            newRebar.Polygon = polyRebar;

            var originalSingleRebar = this.originalRebar as SingleRebar;

            if (originalSingleRebar != null)
            {
                this.SetNewRebarPropertiesFromSingleRebar(newRebar, originalSingleRebar);
            }
            else
            {
                var originalRebarGroup = this.originalRebar as RebarGroup;
                if (originalRebarGroup != null)
                {
                    this.SetNewRebarPropertiesFromRebarGroup(newRebar, originalRebarGroup);
                }
            }

            // Needed to ensure that the reinforcement bar ends will not overcome the cover thinkness.
            if (newRebar.EndPointOffsetType == Reinforcement.RebarOffsetTypeEnum.OFFSET_TYPE_COVER_THICKNESS &&
                newRebar.EndPointOffsetValue < OverhangEpsilon)
            {
                newRebar.EndPointOffsetValue = OverhangEpsilon;
            }

            if (newRebar.StartPointOffsetType == Reinforcement.RebarOffsetTypeEnum.OFFSET_TYPE_COVER_THICKNESS &&
                newRebar.StartPointOffsetValue < OverhangEpsilon)
            {
                newRebar.StartPointOffsetValue = OverhangEpsilon;
            }

            return(newRebar);
        }
示例#19
0
        private void fabricarDiagonales()
        {
            double i = p.max.Y - p.dy - DISTANCIA_A_TUBO;

            while (i - NORMAL_DIAGONAL > p.min.Y)
            {
                T3D.Point p1 = new T3D.Point(XDiagonal(offset), i, z1());
                T3D.Point p2 = new T3D.Point(XDiagonal(offset), p1.Y - NORMAL_DIAGONAL, z2());
                T3D.Point p3 = new T3D.Point(XDiagonal(offset), p2.Y - 50.0, z2());
                T3D.Point p4 = new T3D.Point(XDiagonal(offset), p3.Y - NORMAL_DIAGONAL, z1());

                SingleRebar d1 = FabricaElementosPanel.createDiagonal(p1, p2, p.diametroDiagonal);
                SingleRebar d2 = FabricaElementosPanel.createDiagonal(p3, p4, p.diametroDiagonal);

                d1.Father = p.muro;
                d2.Father = p.muro;

                d1.Insert();
                d2.Insert();

                i -= 400.0;
            }
        }
示例#20
0
        private void fabricarDiagonales()
        {
            double i = -(p.min.X + p.dx + DISTANCIA_A_TUBO);

            while (-i + NORMAL_DIAGONAL < p.max.X)
            {
                T3D.Point p1 = new T3D.Point(-i, YDiagonal(offset), z2());
                T3D.Point p2 = new T3D.Point(p1.X + NORMAL_DIAGONAL, YDiagonal(offset), z1());
                T3D.Point p3 = new T3D.Point(p2.X + 50.0, YDiagonal(offset), z1());
                T3D.Point p4 = new T3D.Point(p3.X + NORMAL_DIAGONAL, YDiagonal(offset), z2());

                SingleRebar d1 = FabricaElementosPanel.createDiagonal(p1, p2, p.diametroDiagonal);
                SingleRebar d2 = FabricaElementosPanel.createDiagonal(p3, p4, p.diametroDiagonal);

                d1.Father = p.muro;
                d2.Father = p.muro;

                d1.Insert();
                d2.Insert();

                i -= 400.0;
            }
        }
示例#21
0
        /// <summary>The split reinforcement bars if needed.</summary>
        /// <param name="newSplitRebars">The split reinforcement bars.</param>
        /// <returns>The System.Boolean.</returns>
        public bool SplitRebarsIfNeeded(out ArrayList newSplitRebars)
        {
            var result          = false;
            var remainingOffset = 0.0;

            newSplitRebars = new ArrayList();

            if (this.singleRebars.Count > 0)
            {
                for (var rebarIndex = 0; rebarIndex < this.singleRebars.Count; rebarIndex++)
                {
                    this.originalRebar = this.singleRebars[rebarIndex] as SingleRebar;
                    double length   = Distance.PointToPoint((Point)this.originalRebar.Polygon.Points[1], (Point)this.originalRebar.Polygon.Points[0]);
                    double diameter = this.GetRebarDiameter(this.originalRebar.Size, this.originalRebar.Grade);
                    this.startHookLength = this.GetHookRealLength(this.originalRebar.StartHook, diameter);
                    this.endHookLength   = this.GetHookRealLength(this.originalRebar.EndHook, diameter);

                    if (this.originalRebar != null && length > this.splitData.MaxLength + this.GetRebarLengthEpsilon())
                    {
                        bool      rebarSplitted;
                        ArrayList splitRebarSet;

                        switch (this.splitData.SpliceSection)
                        {
                        case 0:
                            rebarSplitted = this.SplitEveryRebarInSameLocation(rebarIndex, ref remainingOffset, new List <double>(), out splitRebarSet);
                            break;

                        case 1:
                            rebarSplitted = this.SplitEverySecondRebarInSameLocation(rebarIndex, ref remainingOffset, new List <double>(), out splitRebarSet);
                            break;

                        case 2:
                            rebarSplitted = this.SplitEveryThirdRebarInSameLocation(rebarIndex, new List <double>(), ref remainingOffset, out splitRebarSet);
                            break;

                        case 3:
                            rebarSplitted = this.SplitEveryFourthRebarInSameLocation(rebarIndex, new List <double>(), ref remainingOffset, out splitRebarSet);
                            break;

                        default:
                            rebarSplitted = this.SplitEveryRebarInSameLocation(rebarIndex, ref remainingOffset, new List <double>(), out splitRebarSet);
                            break;
                        }

                        if (rebarSplitted)
                        {
                            foreach (SingleRebar splitRebar in splitRebarSet)
                            {
                                newSplitRebars.Add(splitRebar);
                            }
                        }
                    }
                    else
                    {
                        newSplitRebars.Add(this.originalRebar);
                    }
                }

                result = true;
            }

            return(result);
        }
示例#22
0
        /// <summary>The split rebar.</summary>
        /// <param name="originalRebar">The original rebar.</param>
        /// <param name="section">The section.</param>
        /// <param name="barPosition">The bar position.</param>
        /// <param name="rebarSegmentLengths">Lengths of all rebars segments.</param>
        /// <param name="remainingOffset">The remaining offset.</param>
        /// <param name="splitRebarSet">The split reinforcement bar set.</param>
        /// <returns>The System.Boolean.</returns>
        private bool SplitRebar(
            SingleRebar originalRebar,
            SpliceSection section,
            BarPositions barPosition,
            List <double> rebarSegmentLengths,
            ref double remainingOffset,
            out ArrayList splitRebarSet)
        {
            bool   result = true;
            double maxLength;
            double totalOffset;
            double remainingLength;
            double hookLength;
            double incrementalLength = 0.0;
            double totalRebarLength  = 0.0;
            double previousLength    = 0.0;

            splitRebarSet = new ArrayList();

            ArrayList previousPoints = new ArrayList();

            foreach (double length in rebarSegmentLengths)
            {
                totalRebarLength += length;
            }

            CreateSingleRebar createSingleRebar = new CreateSingleRebar(originalRebar);

            for (int jj = 0; jj < originalRebar.Polygon.Points.Count - 1; jj++)
            {
                Vector splitPattern = new Vector((Point)originalRebar.Polygon.Points[jj + 1] - (Point)originalRebar.Polygon.Points[jj]);

                this.GetRebarMaximumLength(FirstOrLastEnum.MiddleRebar, out maxLength);
                this.CalculateTotalOffset(
                    totalRebarLength,
                    section,
                    barPosition,
                    remainingOffset,
                    out totalOffset,
                    out remainingLength,
                    out hookLength);

                ArrayList splitRebarSegment = new ArrayList();
                ArrayList rebarPoints       = new ArrayList();
                rebarPoints.Add(originalRebar.Polygon.Points[jj]);
                rebarPoints.Add(originalRebar.Polygon.Points[jj + 1]);

                SingleRebar segmentToSplit = createSingleRebar.GetSingleRebar(rebarPoints);

                if ((previousLength + rebarSegmentLengths[jj]) > maxLength)
                {
                    for (int ii = 0; incrementalLength + this.GetRebarLengthEpsilon() < totalRebarLength; ii++)
                    {
                        if (ii == 0 && jj == 0)
                        {
                            result &= this.CreateStartRebar(segmentToSplit, splitPattern, splitRebarSegment, totalOffset, hookLength, ref incrementalLength);
                        }
                        else if (incrementalLength + maxLength + this.GetRebarLengthEpsilon() < totalRebarLength)
                        {
                            int centralBarsCount = (int)Math.Floor(totalRebarLength / maxLength);

                            if (this.splitData.SpliceSymmetry == 2 &&
                                barPosition == BarPositions.First &&
                                centralBarsCount > 1 &&
                                incrementalLength < totalRebarLength / 2.0 &&
                                incrementalLength + maxLength > totalRebarLength / 2.0)
                            {
                                result &= this.CreateDifferentMiddleRebarInCenterSymmetry(remainingLength, segmentToSplit, ref splitPattern, ref incrementalLength, ref splitRebarSegment);
                            }
                            else
                            {
                                result &= this.CreateMiddleRebar(segmentToSplit, splitPattern, splitRebarSegment, ref incrementalLength);
                            }
                        }
                        else
                        {
                            double lastSegment;
                            double segmentLength;

                            if (incrementalLength < maxLength + DistanceEpsilon)
                            {
                                segmentLength = rebarSegmentLengths[jj] - (maxLength - incrementalLength);
                            }
                            else
                            {
                                int multiplayer = (int)(incrementalLength / maxLength);
                                segmentLength = rebarSegmentLengths[jj] - ((multiplayer + 1) * maxLength - incrementalLength);
                            }

                            result           &= this.CreateEndRebar(segmentToSplit, maxLength, splitPattern, splitRebarSegment, ref segmentLength, out lastSegment);
                            incrementalLength = segmentLength;

                            if (barPosition == BarPositions.First)
                            {
                                remainingOffset = lastSegment;
                            }
                        }
                    }
                }
                else
                {
                    incrementalLength += rebarSegmentLengths[jj];
                    previousLength    += rebarSegmentLengths[jj];
                    this.AddRebarPoint(originalRebar.Polygon.Points[jj] as Point, previousPoints);
                    this.AddRebarPoint(originalRebar.Polygon.Points[jj + 1] as Point, previousPoints);

                    DrawPoint(originalRebar.Polygon.Points[jj] as Point, jj.ToString());
                    DrawPoint(originalRebar.Polygon.Points[jj + 1] as Point, (jj + 1).ToString());
                }

                if (splitRebarSegment.Count != 0 && previousPoints.Count > 0)
                {
                    DrawPoint(((SingleRebar)splitRebarSegment[0]).Polygon.Points[0] as Point, "SP" + jj.ToString());
                    DrawPoint(((SingleRebar)splitRebarSegment[0]).Polygon.Points[1] as Point, "SP" + (jj + 1).ToString());

                    previousPoints.Add(((SingleRebar)splitRebarSegment[0]).Polygon.Points[0]);
                    SingleRebar previousBar = createSingleRebar.GetSingleRebar(previousPoints);
                    splitRebarSegment.Insert(0, previousBar);

                    previousPoints.Clear();
                    previousLength = 0.0;
                }

                splitRebarSet.AddRange(splitRebarSegment);
            }

            return(result);
        }
 /// <summary>The get reinforcement bar vector for single rebar.</summary>
 /// <param name="pointIndex">The point index.</param>
 /// <param name="rebar">The rebar.</param>
 /// <returns>The Tekla.Structures.Geometry3d.Vector.</returns>
 private Vector GetRebarVectorForSingleRebar(int pointIndex, SingleRebar rebar)
 {
     return(pointIndex == 0 ?
            new Vector((Point)rebar.Polygon.Points[1] - (Point)rebar.Polygon.Points[0]) :
            new Vector((Point)rebar.Polygon.Points[0] - (Point)rebar.Polygon.Points[1]));
 }