Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3,574 changes: 3,574 additions & 0 deletions src/drawing1.dxf

Large diffs are not rendered by default.

3,574 changes: 3,574 additions & 0 deletions src/drawing2.dxf

Large diffs are not rendered by default.

Empty file added src/flamegraph.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
62 changes: 56 additions & 6 deletions src/osdag/Common.py
Original file line number Diff line number Diff line change
Expand Up @@ -422,9 +422,9 @@ def is_valid_custom(self):
KEY_SR_FACTOR_YY = 'MinorSRF'
KEY_DISP_SR_FACTOR_YY = 'Stress Reduction Factor'
KEY_NON_DIM_ESR_ZZ = 'MajorNDESR'
KEY_DISP_NON_DIM_ESR_ZZ = 'Non-dimensional Effective SR'
KEY_DISP_NON_DIM_ESR_ZZ = 'Non-dimensional Effective SR (z-z)'
KEY_NON_DIM_ESR_YY = 'MinorNDESR'
KEY_DISP_NON_DIM_ESR_YY = 'Non-dimensional Effective SR'
KEY_DISP_NON_DIM_ESR_YY = 'Non-dimensional Effective SR (y-y)'
KEY_EFF_SEC_AREA_ZZ = 'MajorEffSecArea'
KEY_DISP_EFF_SEC_AREA_ZZ = 'Effective Sectional Area (mm2)'
KEY_EFF_SEC_AREA_YY = 'MinorEffSecArea'
Expand All @@ -440,11 +440,23 @@ def is_valid_custom(self):
##Strut Design
###################################
KEY_SHEAR_STRENGTH = 'Shear.Strength'
KEY_SHEAR_STRENGTH_YY = 'Shear.Strength_YY'
KEY_SHEAR_STRENGTH_ZZ = 'Shear.Strength_ZZ'
KEY_MOMENT_STRENGTH = 'Moment.Strength'
KEY_MOMENT_STRENGTH_YY = 'Moment.Strength_YY'
KEY_MOMENT_STRENGTH_ZZ = 'Moment.Strength_ZZ'
KEY_DISP_HIGH_SHEAR= 'High Shear Check'
KEY_DISP_HIGH_SHEAR_YY= 'High Shear Check (y-y)'
KEY_DISP_HIGH_SHEAR_ZZ= 'High Shear Check (z-z)'
KEY_HIGH_SHEAR = 'Shear.High'
KEY_HIGH_SHEAR_YY = 'Shear.High_YY'
KEY_HIGH_SHEAR_ZZ = 'Shear.High_ZZ'
KEY_DISP_DESIGN_STRENGTH_SHEAR = 'Shear Strength (kN)' # Design
KEY_DISP_DESIGN_STRENGTH_MOMENT = 'Moment Strength (kNm)' # Design
KEY_DISP_DESIGN_STRENGTH_SHEAR_YY = 'Shear Strength (y-y) (kN)'
KEY_DISP_DESIGN_STRENGTH_SHEAR_ZZ = 'Shear Strength (z-z) (kN)'
KEY_DISP_DESIGN_STRENGTH_MOMENT = 'Moment Strength (kNm)' # Design
KEY_DISP_DESIGN_STRENGTH_MOMENT_YY = 'Moment Strength (y-y) (kNm)'
KEY_DISP_DESIGN_STRENGTH_MOMENT_ZZ = 'Moment Strength (z-z) (kNm)'
KEY_DISP_REDUCE_STRENGTH_MOMENT = 'Reduced Moment Strength (kNm)'
KEY_EULER_BUCKLING_STRESS = 'MajorBucklingStress'
KEY_DISP_EULER_BUCKLING_STRESS = 'Buckling Stress (MPa)' # Euler
Expand Down Expand Up @@ -529,6 +541,7 @@ def is_valid_custom(self):
KEY_DISP_FLEXURE = 'Flexural Members - Simply Supported'
KEY_DISP_FLEXURE2 = 'Flexural Members - Cantilever'
KEY_DISP_FLEXURE3 = 'Flexural Members'
KEY_DISP_FLEXURE4 = 'Flexural Members - Purlins'

KEY_DISP_PLASTIC_STRENGTH_MOMENT = 'Plastic Strength (kNm)'
KEY_DISP_Bending_STRENGTH_MOMENT = 'Bending Strength (kNm)'
Expand All @@ -541,28 +554,51 @@ def is_valid_custom(self):
KEY_WEB_CRIPPLING= 'Crippling.Strength'
KEY_DISP_CRIPPLING_STRENGTH = 'Crippling Strength (kN)'
KEY_DISP_LTB= 'Lateral Torsional Buckling Details'
KEY_DISP_Elastic_CM= 'Critical Moment (M<sub>cr</sub>)' # Elastic
KEY_DISP_Elastic_CM_latex= 'Elastic Critical Moment(kNm)' #
KEY_DISP_Elastic_CM= 'Critical Moment (M<sub>cr</sub>)'# Elastic
KEY_DISP_Elastic_CM_YY= 'Critical Moment (y-y) (M<sub>cr</sub>)'
KEY_DISP_Elastic_CM_ZZ= 'Critical Moment (z-z) (M<sub>cr</sub>)'
KEY_DISP_Elastic_CM_latex= 'Elastic Critical Moment(kNm)' #
KEY_DISP_T_constatnt= 'Torsional Constant (mm<sup>4</sup>)' # (I<sub>t</sub>)
KEY_DISP_W_constatnt= 'Warping Constant (mm<sup>6</sup>)' # (I<sub>w</sub>)
KEY_LTB= 'L.T.B.Details'
KEY_Elastic_CM= 'Elastic.Moment'
KEY_Elastic_CM_YY = 'Elastic.Moment_YY'
KEY_Elastic_CM_ZZ = 'Elastic.Moment_ZZ'
KEY_T_constatnt= 'T.Constant'
KEY_W_constatnt= 'W.Constant'
KEY_IMPERFECTION_FACTOR_LTB = 'Imperfection.LTB'
KEY_SR_FACTOR_LTB = 'SR.LTB'
KEY_NON_DIM_ESR_LTB = 'NDESR.LTB'
# KEY_LTB= 'Lateral Torsional Buckling Details'
KEY_WEB_BUCKLING= 'Web Buckling Details'
KEY_WEB_RESISTANCE= 'Web Resistance Details'
KEY_BEARING_LENGTH = 'Bearing.Length'
Simply_Supported_img = str(files("osdag.data.ResourceFiles.images").joinpath("ss_beam.png"))
Cantilever_img = str(files("osdag.data.ResourceFiles.images").joinpath("c_beam.png"))
Purlin_img = str(files("osdag.data.ResourceFiles.images").joinpath("purlin.jpg"))
KEY_LENGTH_OVERWRITE = 'Length.Overwrite'
KEY_DISPP_LENGTH_OVERWRITE = 'Effective Length Parameter'
KEY_DISP_BEAM_MOMENT = 'Bending Moment (kNm)(M<sub>z-z</sub>)'
KEY_DISP_BEAM_MOMENT_Latex = 'Bending Moment (kNm)' # ($M_{z-z}$)
KEY_SUPP_TYPE = 'Member.Type'
DISP_TITLE_ISECTION = 'I Sections'
KEY_DISP_CLADDING = 'Cladding (For Deflection)'

#Web Resistance Values
KEY_BENDING_COMPRESSIVE_STRESS_YY = 'Resistance.Bending_Cmp_Stress_yy'
KEY_BENDING_COMPRESSIVE_STRESS_ZZ = 'Resistance.Bending_Cmp_Stress_zz'
KEY_DISP_BENDING_COMPRESSIVE_STRESS_YY = 'Bending Compressive Stress (y-y)'
KEY_DISP_BENDING_COMPRESSIVE_STRESS_ZZ = 'Bending Compressive Stress (z-z)'
KEY_BENDING_STRESS_RF_YY = 'Resistance.Bending_Stress_RF_yy'
KEY_BENDING_STRESS_RF_ZZ = 'Resistance.Bending_Stress_RF_zz'
KEY_DISP_BENDING_STRESS_RF_YY = 'Bending Stress Reduction Factor (y-y)'
KEY_DISP_BENDING_STRESS_RF_ZZ = 'Bending Stress Reduction Factor (z-z)'
KEY_RESISTANCE_MOMENT_YY = 'Resistance.Moment_YY'
KEY_RESISTANCE_MOMENT_ZZ = 'Resistance.Moment_ZZ'
KEY_DISP_RESISTANCE_MOMENT_YY = 'Moment (y-y)'
KEY_DISP_RESISTANCE_MOMENT_ZZ = 'Moment (z-z)'
KEY_BUCKLING_CLASS = "Buckling Class"
KEY_DISP_BUCKLING_CLASS = "Buckling Class"

KEY_DISP_DESIGN_TYPE_FLEXURE = 'Laterally Supported'
KEY_DESIGN_TYPE_FLEXURE = 'Flexure.Type'
Expand All @@ -581,9 +617,14 @@ def is_valid_custom(self):
KEY_DISP_SUPPORT = 'End Conditions'
KEY_DISP_SUPPORT1 = 'Simply Supported'
KEY_DISP_SUPPORT2 = 'Cantilever'
KEY_DISP_SUPPORT_LIST = list((KEY_DISP_SUPPORT1, KEY_DISP_SUPPORT2)) #[KEY_DISP_SUPPORT1, KEY_DISP_SUPPORT2]
KEY_DISP_SUPPORT3 = 'Purlins'
KEY_DISP_SUPPORT_LIST = list((KEY_DISP_SUPPORT1, KEY_DISP_SUPPORT2, KEY_DISP_SUPPORT3)) #[KEY_DISP_SUPPORT1, KEY_DISP_SUPPORT2]
# KEY_SUPPORT1 = 'SimpSupport.Torsional'
# KEY_SUPPORT2 = 'SimpSupport.Warping'
KEY_CLADDING_TYPE1 = 'Brittle Cladding'
KEY_CLADDING_TYPE2 = 'Elastic Cladding'
KEY_CLADDING = 'Cladding.type'
VALUES_CLADDING = list((KEY_CLADDING_TYPE1, KEY_CLADDING_TYPE2))
KEY_DISP_LENGTH_BEAM = 'Effective Span (m)*'
KEY_LOAD = 'Loading.Condition'
KEY_DISP_LOAD = 'Loading Condition'
Expand Down Expand Up @@ -702,8 +743,12 @@ def is_valid_custom(self):
KEY_SEC_TYPE = 'Member.Type'

KEY_SHEAR = 'Load.Shear'
KEY_SHEAR_YY = 'Load.Shear.YY'
KEY_SHEAR_ZZ = 'Load.Shear.ZZ'
KEY_AXIAL = 'Load.Axial'
KEY_MOMENT = 'Load.Moment'
KEY_MOMENT_YY = 'Load.Moment_YY'
KEY_MOMENT_ZZ = 'Load.Moment_ZZ'

KEY_D = 'Bolt.Diameter'
KEY_TYP = 'Bolt.Type'
Expand Down Expand Up @@ -954,6 +999,8 @@ def is_valid_custom(self):
KEY_DISP_SECBM = 'Secondary Beam *'
DISP_TITLE_FSL = 'Factored Loads'
KEY_DISP_MOMENT = 'Bending Moment (kNm) *'
KEY_DISP_MOMENT_ZZ = 'Bending Moment (z-z) (kNm)'
KEY_DISP_MOMENT_YY = 'Bending Moment (y-y) (kNm)'

KEY_DISP_TOP_ANGLE = 'Top Angle'

Expand Down Expand Up @@ -999,6 +1046,8 @@ def is_valid_custom(self):

KEY_DISP_D = 'Diameter (mm) *'
KEY_DISP_SHEAR = 'Shear Force (kN) *'
KEY_DISP_SHEAR_YY = 'Shear Force (y-y) (kN)'
KEY_DISP_SHEAR_ZZ = 'Shear Force (z-z) (kN)'
KEY_DISP_AXIAL = 'Axial Force (kN)'
KEY_DISP_AXIAL_STAR = 'Axial Force (kN)* '
DISP_TITLE_PLATE = 'Plate'
Expand Down Expand Up @@ -2225,6 +2274,7 @@ def is_valid_custom(self):
VALUES_SEC_PROFILE_2 = ['Angles', 'Back to Back Angles', 'Star Angles', 'Channels', 'Back to Back Channels']
#, 'Channels', 'Back to Back Channels'
VALUES_SEC_PROFILE3 = ['Beams and Columns'] #,'Channels', 'Back to Back Channels'
VALUES_SEC_PROFILE4 = ['Channels']
KEY_LENZZ = 'Member.Length_zz'
KEY_DISP_LENZZ = 'Length (z-z)(mm)*'

Expand Down
2 changes: 1 addition & 1 deletion src/osdag/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "2021.02.a.a12f"
__version__ = "2025.01.a.2"
178 changes: 133 additions & 45 deletions src/osdag/cad/BBCad/BBCoverPlateBoltedCAD.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,37 +254,73 @@ def get_nutboltmodelsAF(self):
Getting the bolt arrangement of top flange and forming a group or array out of it.
'''
nut_bolts = self.nut_bolt_array_AF.get_modelsAF()
if not nut_bolts:
return None

# Use a more efficient approach to fuse multiple shapes
array = nut_bolts[0]
for comp in nut_bolts:
array = BRepAlgoAPI_Fuse(comp, array).Shape()

if len(nut_bolts) > 1:
# Create a compound first, then fuse only once
from OCC.Core.TopoDS import TopoDS_Compound
from OCC.Core.BRep import BRep_Builder

compound = TopoDS_Compound()
builder = BRep_Builder()
builder.MakeCompound(compound)

for comp in nut_bolts:
builder.Add(compound, comp)

array = BRepAlgoAPI_Fuse(nut_bolts[0], compound).Shape()

return array

def get_nutboltmodelsBF(self):
'''
Getting the bolt arrangement of bottom flange and forming a group or array out of it.
'''
nut_bolts = self.nut_bolt_array_BF.get_modelsBF()
array = nut_bolts[0]
for comp in nut_bolts:
array = BRepAlgoAPI_Fuse(comp, array).Shape()

if not nut_bolts:
return None

# Use a more efficient approach to fuse multiple shapes
from OCC.Core.TopoDS import TopoDS_Compound
from OCC.Core.BRep import BRep_Builder

compound = TopoDS_Compound()
builder = BRep_Builder()
builder.MakeCompound(compound)

for comp in nut_bolts[1:]: # Add all but the first to compound
builder.Add(compound, comp)

array = BRepAlgoAPI_Fuse(nut_bolts[0], compound).Shape()

return array



def get_nutboltmodelsWeb(self):
'''
Getting the bolt arrangement of web and forming a group or array out of it.
'''
nut_bolts = self.nut_bolt_array_Web.get_modelsW()
array = nut_bolts[0]
for comp in nut_bolts:
array = BRepAlgoAPI_Fuse(comp, array).Shape()

if not nut_bolts:
return None

# Use a more efficient approach to fuse multiple shapes
from OCC.Core.TopoDS import TopoDS_Compound
from OCC.Core.BRep import BRep_Builder

compound = TopoDS_Compound()
builder = BRep_Builder()
builder.MakeCompound(compound)

for comp in nut_bolts[1:]: # Add all but the first to compound
builder.Add(compound, comp)

array = BRepAlgoAPI_Fuse(nut_bolts[0], compound).Shape()

return array



# Below methods are for creating holes in flange and web
def get_beam_models(self):
'''
Expand Down Expand Up @@ -312,19 +348,37 @@ def get_connector_models(self):

def get_models(self):
'''

Returns: Returns model related to complete model (beams, plates and bolts)

'''

# First collect all models
models = []

# Add beam models
models.append(self.beamLModel)
models.append(self.beamRModel)

# Add plate models
models.append(self.WebPlateLeftModel)
models.append(self.WebPlateRightModel)
models.append(self.plateAbvFlangeModel)
models.append(self.plateBelwFlangeModel)

# Add inner plate models if needed
if self.flange_splice_preference != 'Outside':
return [self.beamLModel, self.beamRModel, self.WebPlateLeftModel, self.WebPlateRightModel,
self.innerplateAbvFlangeBackModel, self.innerplateAbvFlangeFrontModel,
self.innerplateBelwFlangeBackModel, self.innerplateBelwFlangeFrontModel, self.plateAbvFlangeModel,
self.plateBelwFlangeModel] + self.nut_bolt_array_AF.get_modelsAF() + self.nut_bolt_array_BF.get_modelsBF() + self.nut_bolt_array_Web.get_modelsW()
else:
return [self.beamLModel, self.beamRModel, self.WebPlateLeftModel, self.WebPlateRightModel,
self.plateAbvFlangeModel, self.plateBelwFlangeModel] + self.nut_bolt_array_AF.get_modelsAF() + self.nut_bolt_array_BF.get_modelsBF() + self.nut_bolt_array_Web.get_modelsW()
models.append(self.innerplateAbvFlangeBackModel)
models.append(self.innerplateAbvFlangeFrontModel)
models.append(self.innerplateBelwFlangeBackModel)
models.append(self.innerplateBelwFlangeFrontModel)

# Add bolt models
models.extend(self.nut_bolt_array_AF.get_modelsAF())
models.extend(self.nut_bolt_array_BF.get_modelsBF())
models.extend(self.nut_bolt_array_Web.get_modelsW())

# Filter out None values
models = [model for model in models if model]

return models


def get_beamLModel(self):
Expand Down Expand Up @@ -437,12 +491,21 @@ def get_flangewebplatesModel(self):
WebPlateLeft = self.get_WebPlateLeftModel()
WebPlateRight = self.get_WebPlateRightModel()

CAD_list = [plateAbvFlange, plateBelwFlange, WebPlateLeft, WebPlateRight]
CAD = CAD_list[0]

for model in CAD_list[1:]:
CAD = BRepAlgoAPI_Fuse(CAD, model).Shape()

# Create a compound of all plates
from OCC.Core.TopoDS import TopoDS_Compound
from OCC.Core.BRep import BRep_Builder

compound = TopoDS_Compound()
builder = BRep_Builder()
builder.MakeCompound(compound)

for model in [plateAbvFlange, plateBelwFlange, WebPlateLeft, WebPlateRight]:
if model:
builder.Add(compound, model)

# Perform a single fuse operation
CAD = BRepAlgoAPI_Fuse(plateAbvFlange, compound).Shape()

return CAD

def get_innetplatesModels(self):
Expand All @@ -454,12 +517,23 @@ def get_innetplatesModels(self):
plateBelwFlangeFront = self.get_innerplateBelwFlangeFront()
plateBelwFlangeBack = self.get_innerplateBelwFlangeBack()

CAD_list = [plateAbvFlangeFront, plateAbvFlangeBack, plateBelwFlangeFront, plateBelwFlangeBack]
CAD = CAD_list[0]

for model in CAD_list[1:]:
CAD = BRepAlgoAPI_Fuse(CAD, model).Shape()

# Create a compound
from OCC.Core.TopoDS import TopoDS_Compound
from OCC.Core.BRep import BRep_Builder

compound = TopoDS_Compound()
builder = BRep_Builder()
builder.MakeCompound(compound)

# Add all but the first model to the compound
models = [plateAbvFlangeBack, plateBelwFlangeFront, plateBelwFlangeBack]
for model in models:
if model:
builder.Add(compound, model)

# Perform a single fuse operation
CAD = BRepAlgoAPI_Fuse(plateAbvFlangeFront, compound).Shape()

return CAD

def get_nut_bolt_arrayModels(self):
Expand All @@ -468,14 +542,28 @@ def get_nut_bolt_arrayModels(self):
'''
nutboltmodelsAF = self.get_nutboltmodelsAF()
nutboltmodelsBF = self.get_nutboltmodelsBF()
nutboltmodelsWeb = self.get_nutboltmodelsWeb()

CAD_list = [nutboltmodelsAF, nutboltmodelsBF, nutboltmodelsWeb]
CAD = CAD_list[0]

for model in CAD_list[1:]:
CAD = BRepAlgoAPI_Fuse(CAD, model).Shape()

nutboltmodelsWeb = self.get_nutboltmodelsWeb()

if not nutboltmodelsAF or not nutboltmodelsBF or not nutboltmodelsWeb:
return None

# Create a compound
from OCC.Core.TopoDS import TopoDS_Compound
from OCC.Core.BRep import BRep_Builder

compound = TopoDS_Compound()
builder = BRep_Builder()
builder.MakeCompound(compound)

# Add other models to the compound
models = [nutboltmodelsBF, nutboltmodelsWeb]
for model in models:
if model:
builder.Add(compound, model)

# Perform a single fuse operation
CAD = BRepAlgoAPI_Fuse(nutboltmodelsAF, compound).Shape()

return CAD

def get_only_beams_Models(self):
Expand Down
Loading