public double GetGeometryFactor(LoadToGrainDirection LoadToGrainDirection, FastenerEdgeBearingType FastenerEdgeBearingType, double L_end,
                                        double L_spacing,
                                        double l_m, double l_s, bool IsLoadedEdge, bool IsSoftwood, bool IsLoadedAtAngle)
        {
            double C_Delta = 0;

            this.l_m          = l_m;
            this.l_s          = l_s;
            this.IsLoadedEdge = IsLoadedEdge;

            throw new NotImplementedException();
            if (this.D <= 0.25)
            {
                C_Delta = 1.0;
            }
            else
            {
                //End distance C_Delta
                double C_DeltaEnd     = GetEndDistanceC_Delta(LoadToGrainDirection, FastenerEdgeBearingType, L_end, IsSoftwood, IsLoadedAtAngle);
                double C_DeltaSpacing = GetSpacingC_Delta(LoadToGrainDirection, L_spacing);
                //Add edge disstance here
            }

            return(C_Delta);
        }
        //Table 12.5.1A End Distance Requirements
        public double GetMinimumEndDistanceForMaximumStrength(LoadToGrainDirection LoadToGrainDirection, FastenerEdgeBearingType FastenerEdgeBearingType, bool IsSoftwood)
        {
            switch (LoadToGrainDirection)
            {
            case LoadToGrainDirection.ParallelToGrain:
                if (FastenerEdgeBearingType == Kodestruct.Wood.NDS.Entities.FastenerEdgeBearingType.CompressionBearingAwayFromEdge)
                {
                    return(4.0 * D);
                }
                else
                {
                    if (IsSoftwood)
                    {
                        return(7.0 * D);
                    }
                    else
                    {
                        return(5.0 * D);
                    }
                }
                break;

            case LoadToGrainDirection.PerpendicularToGrain:
                return(4.0 * D);

                break;

            default:
                throw new Exception("LoadToGrainDirection not recognized");
                break;
            }
        }
        private double GetSpacingC_Delta(LoadToGrainDirection LoadToGrainDirection, double L_spacing)
        {
            double L_spaceC_delta05 = GetMinimumSpacingOfFastenersWithinRow(LoadToGrainDirection);

            if (L_spacing < L_spaceC_delta05)
            {
                throw new Exception("End distance is smaller than minimum permitted. Revise design.");
            }
            double L_spaceC_delta1 = GetMinimumSpacingOfFastenersWithinRowForMaximumStrength(LoadToGrainDirection);

            double C_Delta = L_spacing / (L_spaceC_delta1);

            return(C_Delta);
        }
        private double GetEndDistanceC_Delta(LoadToGrainDirection LoadToGrainDirection, FastenerEdgeBearingType FastenerEdgeBearingType,
                                             double L_end, bool IsSoftwood, bool IsLoadedAtAngle)
        {
            if (IsLoadedAtAngle == true)
            {
                throw new Exception("Loading at angle to the fastener is not supported.");
            }
            double L_endC_delta05 = GetMinimumEndDistance(LoadToGrainDirection, FastenerEdgeBearingType);

            if (L_end < L_endC_delta05)
            {
                throw new Exception("End distance is smaller than minimum permitted. Revise design.");
            }
            double L_endC_delta1 = GetMinimumEndDistanceForMaximumStrength(LoadToGrainDirection, FastenerEdgeBearingType, IsSoftwood);
            double C_Delta       = L_end / (L_endC_delta1);

            return(C_Delta);
        }
 //Table 12.5.1B Spacing Requirements for fasteners in a Row
 public double GetMinimumSpacingOfFastenersWithinRow(LoadToGrainDirection LoadToGrainDirection)
 {
     return(3.0 * D);
 }
 public double GetMinimumEdgeDistance(LoadToGrainDirection LoadToGrainDirection)
 {
     throw new NotImplementedException();
 }
 //Table 12.5.1B Spacing Requirements for fasteners in a Row
 public double GetMinimumSpacingOfFastenersWithinRowForMaximumStrength(LoadToGrainDirection LoadToGrainDirection)
 {
     return(4.0 * D);
     //For Perpendicular to Grain  load => Required spacing for attached members
 }