diff --git a/Examples/Cantilever/Demo1.py b/Examples/Cantilever/Demo1.py index 591a3396..5ad863eb 100644 --- a/Examples/Cantilever/Demo1.py +++ b/Examples/Cantilever/Demo1.py @@ -8,7 +8,7 @@ print('dirname: ', dirName) sys.path.append(dirName + r'/../..') -from RFEM.enums import NodalSupportType, LoadDirectionType +from RFEM.enums import * from RFEM.initModel import Model, Calculate_all from RFEM.BasicObjects.material import Material from RFEM.BasicObjects.section import Section @@ -27,6 +27,7 @@ Model(True, "Demo1") # crete new model called Demo1 Model.clientModel.service.begin_modification() + Material(1, 'S235') Section(1, 'IPE 200') diff --git a/RFEM/TypesForSteelDesign/steelMemberRotationalRestraints.py b/RFEM/TypesForSteelDesign/steelMemberRotationalRestraints.py new file mode 100644 index 00000000..ffa2fe31 --- /dev/null +++ b/RFEM/TypesForSteelDesign/steelMemberRotationalRestraints.py @@ -0,0 +1,137 @@ +from RFEM.initModel import Model, clearAtributes, ConvertToDlString +from RFEM.enums import * + +class SteelMemberRotationalRestraint(): + def __init__(self, + no: int = 1, + user_defined_name: list = [False], + definition_type = SteelMemberRotationalRestraintType.TYPE_CONTINUOUS, + members: str = "", + member_sets: str = "", + categories: list = [], + parameters: list = [], + comment: str = '', + params: dict = {}): + """ + Args: + no (int): Member Rotational Restraint No. + user_defined_name (list): User Defined Name + definition_type (enum): Definition Type Enumeration Item + members (str): Assigned Members + member_sets (str): Assigned Member Sets + + categories (list): + + for definition_type = SteelMemberRotationalRestraintType.TYPE_CONTINUOUS: + categories[0] = Sheeting Material Name + categories[1] = Sheeting Name + categories[2] = Position of Sheeting + categories[3] = Continuous Beam Effect + categories[4] = Section Deformation Option + + for definition_type = SteelMemberRotationalRestraintType.TYPE_DISCRETE: + categories[0] = Section Material Name + categories[1] = Section Name + categories[2] = Rotational Stifness + categories[3] = Continuous Beam Effect + categories[4] = Section Deformation Option + + for definition_type = SteelMemberRotationalRestraintType.TYPE_MANUALLY: + categories = None + + parameters (list): + + for definition_type = SteelMemberRotationalRestraintType.TYPE_CONTINUOUS: + parameters[0] = Modulus of Elasticity + parameters[1] = Sheeting Thickness + parameters[2] = Sheeting Moment of Inertia + parameters[3] = Sheeting Distance of Ribs + parameters[4] = Width of Sheeting Flanges + parameters[5] = Spring Stiffness + parameters[6] = Beam Spacing + + for definition_type = SteelMemberRotationalRestraintType.TYPE_DISCRETE: + parameters[0] = Modulus of Elasticity + parameters[1] = Section Moment of Inertia + parameters[2] = Purlin Spacing + parameters[3] = Beam Spacing + + for definition_type = SteelMemberRotationalRestraintType.TYPE_MANUALLY: + parameters[0] = Rotational Spring Stifness + + comment (str, optional): _description_. Defaults to ''. + params (dict, optional): _description_. Defaults to {}. + """ + + # Client Model / Types For Steel Design Member Rotational Restraints + clientObject = Model.clientModel.factory.create('ns0:steel_member_rotational_restraint') + + # Clears Object Attributes / Sets all the attributes to None + clearAtributes(clientObject) + + # Member Rotational Restraint No. + clientObject.no = no + + # Member Rotational Restraint Assigned Members + clientObject.members = ConvertToDlString(members) + + # Member Rotational Restraint Assigned Member Sets + clientObject.member_sets = ConvertToDlString(member_sets) + + # Member Rotational Restraint Name + if user_defined_name[0]: + clientObject.user_defined_name_enabled = user_defined_name[0] + clientObject.name = user_defined_name[1] + else: + clientObject.user_defined_name_enabled = user_defined_name[0] + + # Member Rotational Restraint Definition Type + clientObject.type = definition_type.name + + # Member Rotational Restraint Categories + if definition_type == SteelMemberRotationalRestraintType.TYPE_CONTINUOUS: + clientObject.material_name = categories[0] + clientObject.sheeting_name = categories[1] + clientObject.position_of_sheeting = categories[2].name + clientObject.continuous_beam_effect = categories[3].name + clientObject.section_deformation_cdb = categories[4] + elif definition_type == SteelMemberRotationalRestraintType.TYPE_DISCRETE: + clientObject.material_name = categories[0] + clientObject.section_name = categories[1] + clientObject.rotational_stiffness = categories[2].name + clientObject.continuous_beam_effect = categories[3].name + clientObject.section_deformation_cdb = categories[4] + + # Member Rotational Restraint Parameters + if definition_type == SteelMemberRotationalRestraintType.TYPE_CONTINUOUS: + clientObject.modulus_of_elasticity = parameters[0] + clientObject.sheeting_thickness = parameters[1] + clientObject.sheeting_moment_of_inertia = parameters[2] + clientObject.sheeting_distance_of_ribs = parameters[3] + clientObject.width_of_section_flange = parameters[4] + clientObject.spring_stiffness = parameters[5] + clientObject.beam_spacing = parameters[6] + + elif definition_type == SteelMemberRotationalRestraintType.TYPE_DISCRETE: + clientObject.modulus_of_elasticity = parameters[0] + clientObject.section_moment_of_inertia = parameters[1] + clientObject.purlin_spacing = parameters[2] + clientObject.beam_spacing = parameters[3] + + elif definition_type == SteelMemberRotationalRestraintType.TYPE_MANUALLY: + clientObject.total_rotational_spring_stiffness = parameters[0] + + #Comment + clientObject.comment = comment + + # Adding optional parameters via dictionary + for key in params: + clientObject[key] = params[key] + + # Adding Steel Member Rotational Restraint to Client Model + Model.clientModel.service.set_steel_member_rotational_restraint(clientObject) + + + + + diff --git a/RFEM/enums.py b/RFEM/enums.py index 25f19b8b..5a65ddd5 100644 --- a/RFEM/enums.py +++ b/RFEM/enums.py @@ -1719,7 +1719,29 @@ class SteelEffectiveLengthsMemberTypeZZ(Enum): ''' MEMBER_TYPE_BEAM, MEMBER_TYPE_CANTILEVER = range(2) +class SteelMemberRotationalRestraintType(Enum): + ''' + Steel Member Rotational Restraint Type + ''' + TYPE_CONTINUOUS, TYPE_DISCRETE, TYPE_MANUALLY = range(3) + +class SteelMemberRotationalRestraintContinuousBeamEffect(Enum): + ''' + Steel Member Rotational Restraint Continuous Beam Effect + ''' + CONTINUOUS_BEAM_EFFECT_END_PANEL, CONTINUOUS_BEAM_EFFECT_INTERNAL_PANEL = range(2) +class SteelMemberRotationalRestraintPositionofSheeting(Enum): + ''' + Steel Member Rotational Restraint Position of Sheeting + ''' + SHEETING_POSITION_NEGATIVE, SHEETING_POSITION_POSITIVE = range(2) + +class SteelMemberRotationalRestraintRotationalStiffness(Enum): + ''' + Steel Member Rotational Restraint Rotational Stiffness + ''' + ROTATIONAL_STIFFNESS_INFINITELY, ROTATIONAL_STIFFNESS_MANUALLY = range(2) class SteelBoundaryConditionsSupportType(Enum): ''' Steel Boundary Conditions Support Type diff --git a/UnitTests/test_steelMemberRotationalRestraint.py b/UnitTests/test_steelMemberRotationalRestraint.py new file mode 100644 index 00000000..eace5fed --- /dev/null +++ b/UnitTests/test_steelMemberRotationalRestraint.py @@ -0,0 +1,40 @@ +import sys +import os +import pytest +PROJECT_ROOT = os.path.abspath(os.path.join( + os.path.dirname(__file__), + os.pardir) +) +sys.path.append(PROJECT_ROOT) + +from RFEM.enums import * +from RFEM.initModel import Model, SetAddonStatus, CheckIfMethodOrTypeExists +from RFEM.TypesForSteelDesign.steelMemberRotationalRestraints import * + +if Model.clientModel is None: + Model() + +@pytest.mark.skipif(CheckIfMethodOrTypeExists(Model.clientModel,'ns0:steel_member_rotational_restraint', True), reason="Type ns0:steel_member_rotational_restraint not in RFEM GM yet") +def test_steelMemberRotationalRestraints(): + + Model.clientModel.service.begin_modification() + + SetAddonStatus(Model.clientModel, AddOn.steel_design_active, True) + + SteelMemberRotationalRestraint(1, [False], SteelMemberRotationalRestraintType.TYPE_CONTINUOUS, "", "", + categories=["Grade S275", "Arval (-) 35/207 - 0.63 (b: 1) | DIN 18807 | Arval", SteelMemberRotationalRestraintPositionofSheeting.SHEETING_POSITION_NEGATIVE, SteelMemberRotationalRestraintContinuousBeamEffect.CONTINUOUS_BEAM_EFFECT_END_PANEL, True], + parameters = [205000000000.0, 0.00063, 7.5e-08, 0.207, 0.106, 5200.0, 3.0]) + + SteelMemberRotationalRestraint(2, [True, 'test_restraint'], SteelMemberRotationalRestraintType.TYPE_DISCRETE, "", "", + categories=["Grade S275", "IPE A 80 | EN 10365:2017 | ArcelorMittal (2018)", SteelMemberRotationalRestraintRotationalStiffness.ROTATIONAL_STIFFNESS_INFINITELY, SteelMemberRotationalRestraintContinuousBeamEffect.CONTINUOUS_BEAM_EFFECT_END_PANEL, True], + parameters=[205000000000.0, 6.44e-07, 1, 3]) + Model.clientModel.service.finish_modification() + + steelMemberRestraint1 = Model.clientModel.service.get_steel_member_rotational_restraint(1) + steelMemberRestraint2 = Model.clientModel.service.get_steel_member_rotational_restraint(2) + + assert steelMemberRestraint1.no == 1 + assert steelMemberRestraint1.material_name == "Grade S275" + + assert steelMemberRestraint2.type == "TYPE_DISCRETE" + assert steelMemberRestraint2.continuous_beam_effect == "CONTINUOUS_BEAM_EFFECT_END_PANEL"