public ChsTrussTConnection(SteelChsSection Chord, SteelChsSection MainBranch, double thetaMain, AxialForceType ForceTypeMain, 
 SteelChsSection SecondBranch, double thetaSecond, AxialForceType ForceTypeSecond, bool IsTensionChord,
 double P_uChord, double M_uChord): base( Chord,  MainBranch,  thetaMain,  ForceTypeMain, 
 SecondBranch,  thetaSecond,  ForceTypeSecond,  IsTensionChord,
 P_uChord,  M_uChord)
 {
 }
        public ChsTrussBranchConnection(SteelChsSection Chord, bool IsTensionChord,
    double P_uChord, double M_uChord)
            : base(IsTensionChord, P_uChord, M_uChord)
        {
            this.Chord = Chord;

        }
 public ChsTransversePlate(SteelChsSection Hss, SteelPlateSection Plate, ICalcLog CalcLog, bool IsTensionHss,
     double P_uHss, double M_uHss)
     : base(Hss, Plate, CalcLog, IsTensionHss, P_uHss, M_uHss)
 {
    //assume 90 degrees for plate angle
     Angle = 90.0;
 }
 public ChsTrussBranchConnection(SteelChsSection Chord, SteelChsSection MainBranch, double thetaMain, AxialForceType ForceTypeMain, 
     SteelChsSection SecondBranch, double thetaSecond, AxialForceType ForceTypeSecond, bool IsTensionChord,
     double P_uChord, double M_uChord): base(IsTensionChord,P_uChord,M_uChord)
 {
     this.Chord = Chord;
     this.MainBranch       =MainBranch   ;
     this.thetaMain        =thetaMain    ;             
 }
        /// <summary>
        /// K-connection base class
        /// NOTE THAT IT IS CRITICAL TO SPECIFY MAIN BRANCH AS COMPRESSION BRANCH
        /// </summary>
        /// <param name="Chord">Chord object instance</param>
        /// <param name="MainBranch">Branch object instance</param>
        /// <param name="thetaMain">Main branch angle</param>
        /// <param name="ForceTypeMain">Main branch force type</param>
        /// <param name="SecondBranch">Branch object instance</param>
        /// <param name="thetaSecond">Secondary branch angle</param>
        /// <param name="ForceTypeSecond">Secondary branch force type</param>
        /// <param name="IsTensionChord">Identifies if branch is in tension</param>
        /// <param name="P_uChord">Design axial force in chord</param>
        /// <param name="M_uChord">Design moment in chord</param>
        /// <param name="g">Gap</param>
        public ChsTrussKConnection(SteelChsSection Chord, SteelChsSection MainBranch, double thetaMain, AxialForceType ForceTypeMain, 
            SteelChsSection SecondBranch, double thetaSecond, AxialForceType ForceTypeSecond, bool IsTensionChord,
            double P_uChord, double M_uChord, double g): base( Chord,  IsTensionChord,
             P_uChord,  M_uChord)
       {
           this.g = g;
           
            #region Assign chord sections based on forces
           if (ForceTypeMain == AxialForceType.Compression && ForceTypeSecond == AxialForceType.Compression)
           {
               throw new Exception("Branch force types need to be specified to have opposite signs for K conncection");
           }
           if (ForceTypeMain == AxialForceType.Tension && ForceTypeSecond == AxialForceType.Tension)
           {
               throw new Exception("Branch force types need to be specified to have opposite signs for K conncection");
           }
           //if (ForceTypeMain == AxialForceType.Reversible && ForceTypeSecond == AxialForceType.Reversible)
           //{
           //    this.MainBranch = MainBranch;
           //    this.thetaMain = thetaMain;
           //    this.ForceTypeMain = ForceTypeMain;
           //    this.SecondBranch = SecondBranch;
           //    this.thetaSecond = thetaSecond;
           //    this.ForceTypeSecond = ForceTypeSecond;
           //}
           //if (ForceTypeMain == AxialForceType.Compression && ForceTypeSecond == AxialForceType.Reversible)
           //{
               this.MainBranch = MainBranch;
               this.thetaMain = thetaMain;
               this.ForceTypeMain = ForceTypeMain;
               this.SecondBranch = SecondBranch;
               this.thetaSecond = thetaSecond;
               this.ForceTypeSecond = ForceTypeSecond;
           //}
           //if (ForceTypeMain == AxialForceType.Tension && ForceTypeSecond == AxialForceType.Reversible)
           //{

           //    this.MainBranch = SecondBranch;
           //    this.thetaMain = thetaSecond;
           //    this.ForceTypeMain = ForceTypeSecond;
           //    this.SecondBranch = MainBranch;
           //    this.thetaSecond = thetaMain;
           //    this.ForceTypeSecond = ForceTypeMain;
           //} 
           #endregion

       }
 public ChsToPlateConnection(SteelChsSection Hss, SteelPlateSection Plate, ICalcLog CalcLog, bool IsTensionHss,double P_uHss, double M_uHss)
     :base(IsTensionHss,P_uHss, M_uHss, CalcLog)
 {
     this.hss = Hss;
     this.plate = Plate;
 }
        public static Dictionary<string, object> HssToTransversePlateLocalPunchingStrengthOfPlate(CustomProfile HssSection,CustomProfile PlateSection,
            double theta, string HssTransversePlateType, double F_y, double F_yp, bool IsTensionHss, double P_uHss, double M_uHss)
        {
            //Default values
            double phiR_n = 0;
            bool IsApplicableLimitState = false;


            //Calculation logic:
            CalcLog log = new CalcLog();
            SteelLimitStateValue limitState = null;

            //PLATE

            SteelPlateSection pl = null;

            if (!(PlateSection.Section is ISectionRectangular))
            {
                throw new Exception("Failed to convert section. Section needs to be either a Pipe or a Tube. Please check input.");
            }
            else
            {
                SteelMaterial mat = new SteelMaterial(F_y);
                ISectionRectangular rect = PlateSection.Section as ISectionRectangular;
                double t_pl, b_pl = 0.0;
                WosadSection.SectionRectangular rSect;
                if (rect.B <= rect.H)
                {
                    rSect = new WosadSection.SectionRectangular(rect.B, rect.H);
                }
                else
                {
                    rSect = new WosadSection.SectionRectangular(rect.H, rect.B);
                }
                pl = new SteelPlateSection(rSect, mat);

            }

            TransversePlateType transvPlateType;
            bool IsValidTransvPlate = Enum.TryParse(HssTransversePlateType, true, out transvPlateType);
            if (IsValidTransvPlate == false)
            {
                throw new Exception("Failed to convert string. Transverse plate type must be TConnection or XConnection. Please check input");
            }

            //HSS

            if (!(HssSection.Section is ISectionHollow))
            {
                throw new Exception("Failed to convert section. Section needs to be either a Pipe or a Tube. Please check input.");
            }
            else
            {
                SteelMaterial mat = new SteelMaterial(F_y);
                if (HssSection.Section is ISectionPipe)
                {
                    SteelChsSection sec = new SteelChsSection(HssSection.Section as ISectionPipe, mat);
                    ChsTransversePlate transversePlateChs = new ChsTransversePlate(sec, pl, log, IsTensionHss, P_uHss, M_uHss);

                    limitState = transversePlateChs.GetLocalPunchingStrengthOfPlate();
                    phiR_n = limitState.Value;
                    IsApplicableLimitState = limitState.IsApplicable;


                }
                else if (HssSection.Section is ISectionTube)
                {
                    SteelRhsSection sec = new SteelRhsSection(HssSection.Section as ISectionTube, mat);
                    RhsTransversePlate transversePlateRhs = new RhsTransversePlate(sec, pl, log, IsTensionHss, transvPlateType, P_uHss, M_uHss);

                    limitState = transversePlateRhs.GetLocalPunchingStrengthOfPlate();
                    phiR_n = limitState.Value;
                    IsApplicableLimitState = limitState.IsApplicable;

                }
                else
                {
                    throw new Exception("Unsupported type of hollow section. Please use Tube or Pipe.");
                }
            }
          



            return new Dictionary<string, object>
            {
                { "phiR_n", phiR_n }
,{ "IsApplicableLimitState", IsApplicableLimitState }
 
            };
        }
        public static Dictionary<string, object> HssToLongitudinalPlateMaximumPlateThicknessForShear(CustomProfile HssSection,CustomProfile PlateSection,
            double F_y,double F_yp,bool IsTensionHss,double P_uHss,double M_uHss)
        {
            //Default values
            double t_max = 0;


            //Calculation logic:
            CalcLog log = new CalcLog();
            SteelLimitStateValue limitState = null;

            //PLATE

            SteelPlateSection pl = null;

            if (!(PlateSection.Section is ISectionRectangular))
            {
                throw new Exception("Failed to convert section. Section needs to be either a Pipe or a Tube. Please check input.");
            }
            else
            {
                SteelMaterial mat = new SteelMaterial(F_y);
                ISectionRectangular rect = PlateSection.Section as ISectionRectangular;
                double t_pl, b_pl = 0.0;
                SectionRectangular rSect;
                if (rect.B <= rect.H)
                {
                    rSect = new SectionRectangular(rect.B, rect.H);
                }
                else
                {
                    rSect = new SectionRectangular(rect.H, rect.B);
                }
                pl = new SteelPlateSection(rSect, mat);

            }


            //HSS

            if (!(HssSection.Section is ISectionHollow))
            {
                throw new Exception("Failed to convert section. Section needs to be either a Pipe or a Tube. Please check input.");
            }
            else
            {
                SteelMaterial mat = new SteelMaterial(F_y);
                if (HssSection.Section is ISectionPipe)
                {
                    SteelChsSection sec = new SteelChsSection(HssSection.Section as ISectionPipe, mat);
                    ChsLongitudinalPlate longitudinalPlateChs = new ChsLongitudinalPlate(sec, pl, log, IsTensionHss,90.0, P_uHss, M_uHss);

                    //limitState = longitudinalPlateChs.ge
                    //phiR_n = limitState.Value;
                    //IsApplicableLimitState = limitState.IsApplicable;
                    t_max = longitudinalPlateChs.GetHssMaximumPlateThicknessForShearLoad().Value;

                }
                else if (HssSection.Section is ISectionTube)
                {
                    SteelRhsSection sec = new SteelRhsSection(HssSection.Section as ISectionTube, mat);
                    RhsLongitudinalPlate longitudinalPlateRhs = new RhsLongitudinalPlate(sec, pl, log, IsTensionHss,90.0, P_uHss, M_uHss);

                    //limitState = longitudinalPlateRhs.GetHssYieldingOrCrippling();
                    //phiR_n = limitState.Value;
                    //IsApplicableLimitState = limitState.IsApplicable;
                    t_max = longitudinalPlateRhs.GetHssMaximumPlateThicknessForShearLoad().Value;
                }
                else
                {
                    throw new Exception("Unsupported type of hollow section. Please use Tube or Pipe.");
                }
            }

            return new Dictionary<string, object>
            {
                { "t_max", t_max }
 
            };
        }
        public static Dictionary<string, object> HssToLongitudinalPlateWallPlastification(CustomProfile HssSection,CustomProfile PlateSection,
            double F_y,double F_yp, double P_uHss,  double M_uHss,double theta=90.0, bool IsTensionHss=false, bool IsThroughPlate=false)
        {
            //Default values
            double phiR_n = 0;
            bool IsApplicableLimitState = false;


            //Calculation logic:
            CalcLog log = new CalcLog();
            SteelLimitStateValue limitState = null;

            //PLATE

            SteelPlateSection pl = null;

            if (!(PlateSection.Section is ISectionRectangular))
            {
                throw new Exception("Failed to convert section. Section needs to be either a Pipe or a Tube. Please check input.");
            }
            else
            {
                SteelMaterial mat = new SteelMaterial(F_y);
                ISectionRectangular rect = PlateSection.Section as ISectionRectangular;
                double t_pl, b_pl = 0.0;
                WosadSection.SectionRectangular rSect;
                if (rect.B <= rect.H)
                {
                    rSect = new WosadSection.SectionRectangular(rect.B, rect.H);
                }
                else
                {
                    rSect = new WosadSection.SectionRectangular(rect.H, rect.B);
                }
                pl = new SteelPlateSection(rSect, mat);

            }


            //HSS

            if (!(HssSection.Section is ISectionHollow))
            {
                throw new Exception("Failed to convert section. Section needs to be either a Pipe or a Tube. Please check input.");
            }
            else
            {
                SteelMaterial mat = new SteelMaterial(F_y);
                if (HssSection.Section is ISectionPipe)
                {
                    SteelChsSection sec = new SteelChsSection(HssSection.Section as ISectionPipe, mat);
                    ChsLongitudinalPlate longitudinalPlateChs = new ChsLongitudinalPlate(sec, pl, log, IsTensionHss,theta, P_uHss, M_uHss);

                    limitState = longitudinalPlateChs.GetHssWallPlastificationStrengthUnderAxialLoad();
                    if (IsThroughPlate == false)
                    {
                        phiR_n = limitState.Value;
                    }
                    else
                    {
                        phiR_n = 2.0* limitState.Value; //analogous to Rectangular HSS provsions
                    }
                    
                    IsApplicableLimitState = limitState.IsApplicable;
                    

                }
                else if (HssSection.Section is ISectionTube)
                {
                    SteelRhsSection sec = new SteelRhsSection(HssSection.Section as ISectionTube, mat);
                    if (IsThroughPlate == false)
                    {
                        RhsLongitudinalPlate longitudinalPlateRhs = new RhsLongitudinalPlate(sec, pl,  log, IsTensionHss,theta, P_uHss, M_uHss);

                        limitState = longitudinalPlateRhs.GetHssWallPlastificationStrengthUnderAxialLoad();
                        phiR_n = limitState.Value;
                        IsApplicableLimitState = limitState.IsApplicable;  
                    }
                    else
                    {
                        RhsLongitudinalThroughPlate longitudinalPlateRhs = new RhsLongitudinalThroughPlate(sec, pl, log, IsTensionHss,theta, P_uHss, M_uHss);

                        limitState = longitudinalPlateRhs.GetHssWallPlastificationStrengthUnderAxialLoad();
                        phiR_n = limitState.Value;
                        IsApplicableLimitState = limitState.IsApplicable;
                    }
                   
                }
                else
                {
                    throw new Exception("Unsupported type of hollow section. Please use Tube or Pipe.");
                }
            }

            return new Dictionary<string, object>
            {
                { "phiR_n", phiR_n }
,{ "IsApplicableLimitState", IsApplicableLimitState }
 
            };
        }
        public static Dictionary<string, object> HssCapPlateLocalYieldingOrCripplingOfHss(CustomProfile HssSection,CustomProfile PlateSection,double t_pCap,double F_y,double F_yp,bool IsTensionHss,double P_uHss,double M_uHss)
        {
            //Default values
            double phiR_n = 0;
            bool IsApplicableLimitState = false;


            //Calculation logic:
            CalcLog log = new CalcLog();
            SteelLimitStateValue limitState = null;

            //PLATE

            SteelPlateSection pl = null;

            if (!(PlateSection.Section is ISectionRectangular))
            {
                throw new Exception("Failed to convert section. Section needs to be either a Pipe or a Tube. Please check input.");
            }
            else
	        {
                SteelMaterial mat = new SteelMaterial(F_y);
                ISectionRectangular rect = PlateSection.Section as ISectionRectangular;
                double t_pl, b_pl = 0.0;
                SectionRectangular rSect;
                if (rect.B<=rect.H)
                {
                    rSect = new SectionRectangular(rect.B, rect.H);
                }
                else
                {
                    rSect = new SectionRectangular(rect.H, rect.B);
                }
                pl = new SteelPlateSection(rSect, mat);

	        }


            //HSS

            if (!(HssSection.Section is ISectionHollow))
            {
                throw new Exception("Failed to convert section. Section needs to be either a Pipe or a Tube. Please check input.");
            }
            else
            {
                SteelMaterial mat = new SteelMaterial(F_y);
                if (HssSection.Section is ISectionPipe)
                {
                    SteelChsSection sec = new SteelChsSection(HssSection.Section as ISectionPipe, mat);
                    ChsCapPlate capRhs = new ChsCapPlate(sec, pl, t_pCap, log, IsTensionHss, P_uHss, M_uHss);

                    limitState = capRhs.GetHssYieldingOrCrippling();
                    phiR_n = limitState.Value;
                    IsApplicableLimitState = limitState.IsApplicable;

                }
                else if (HssSection.Section is ISectionTube)
                {
                    SteelRhsSection sec = new SteelRhsSection(HssSection.Section as ISectionTube, mat);
                    RhsCapPlate capRhs = new RhsCapPlate(sec, pl, t_pCap, log, IsTensionHss, P_uHss, M_uHss);
                    
                    limitState = capRhs.GetHssYieldingOrCrippling();
                    phiR_n = limitState.Value;
                    IsApplicableLimitState = limitState.IsApplicable;
                }
                else
                {
                    throw new Exception("Unsupported type of hollow section. Please use Tube or Pipe.");
                }
            }



            return new Dictionary<string, object>
            {
                { "phiR_n", phiR_n }
                ,{ "IsApplicableLimitState", IsApplicableLimitState }
 
            };
        }
 public ChsLongitudinalPlate(SteelChsSection Hss, SteelPlateSection Plate, ICalcLog CalcLog, bool IsTensionHss, double Angle,
     double P_uHss, double M_uHss)
     : base(Hss, Plate, CalcLog, IsTensionHss, P_uHss,  M_uHss)
 {
     this.Angle = Angle;
 }
Beispiel #12
0
 public ChsCapPlate(SteelChsSection Hss, SteelPlateSection Plate, double t_plCap, ICalcLog CalcLog, bool IsTensionHss, double P_uHss, double M_uHss)
     : base(Hss, Plate, CalcLog, IsTensionHss,P_uHss,M_uHss)
 {
     this.t_plCap = t_plCap;
 }