diff --git a/Examples/main.py b/Examples/main.py index b7f0f007..0d6d6f68 100644 --- a/Examples/main.py +++ b/Examples/main.py @@ -289,6 +289,7 @@ def main(hall_width_L, hall_height_h_o, hall_height_h_m, number_frames, frame_sp Calculate_all() print("Done") + sys.exit() if __name__ == '__main__': window(main, modelLst) diff --git a/RFEM/Loads/linesetLoad.py b/RFEM/Loads/linesetLoad.py index 0c314a4c..fb5ed57c 100644 --- a/RFEM/Loads/linesetLoad.py +++ b/RFEM/Loads/linesetLoad.py @@ -10,7 +10,8 @@ def __init__(self, load_direction = LineSetLoadDirection.LOAD_DIRECTION_LOCAL_Z, magnitude: float = 0, comment: str = '', - params: dict = {}): + params: dict = None, + model = Model): ''' Assigns lineset load without any further options. Load type is Force by default. @@ -18,7 +19,7 @@ def __init__(self, ''' # Client model | Lineset Load - clientObject = Model.clientModel.factory.create('ns0:line_set_load') + clientObject = model.clientModel.factory.create('ns0:line_set_load') # Clears object atributes | Sets all atributes to None clearAtributes(clientObject) @@ -50,11 +51,12 @@ def __init__(self, clientObject.comment = comment # Adding optional parameters via dictionary - for key in params: - clientObject[key] = params[key] + if params: + for key in params: + clientObject[key] = params[key] # Add Load Lineset Load to client model - Model.clientModel.service.set_line_set_load(load_case_no, clientObject) + model.clientModel.service.set_line_set_load(load_case_no, clientObject) def Force(self, no: int = 1, @@ -65,7 +67,8 @@ def Force(self, load_parameter = None, list_reference: bool= False, comment: str = '', - params: dict = {}): + params: dict = None, + model = Model): ''' load_parameter: @@ -84,7 +87,7 @@ def Force(self, {''} ''' # Client model | Lineset Load - clientObject = Model.clientModel.factory.create('ns0:line_set_load') + clientObject = model.clientModel.factory.create('ns0:line_set_load') # Clears object attributes | Sets all attributes to None clearAtributes(clientObject) @@ -283,11 +286,12 @@ def Force(self, clientObject.comment = comment # Adding optional parameters via dictionary - for key in params: - clientObject[key] = params[key] + if params: + for key in params: + clientObject[key] = params[key] # Add Load Line Load to client model - Model.clientModel.service.set_line_set_load(load_case_no, clientObject) + model.clientModel.service.set_line_set_load(load_case_no, clientObject) def Moment(self, no: int = 1, @@ -298,7 +302,8 @@ def Moment(self, load_parameter = None, list_reference: bool= False, comment: str = '', - params: dict = {}): + params: dict = None, + model = Model): ''' load_parameter: LOAD_DISTRIBUTION_UNIFORM: load_parameter = magnitude @@ -313,7 +318,7 @@ def Moment(self, LOAD_DISTRIBUTION_VARYING: load_parameter = [[distance, delta_distance, magnitude], ...] ''' # Client model | Lineset Load - clientObject = Model.clientModel.factory.create('ns0:line_set_load') + clientObject = model.clientModel.factory.create('ns0:line_set_load') # Clears object attributes | Sets all attributes to None clearAtributes(clientObject) @@ -512,11 +517,12 @@ def Moment(self, clientObject.comment = comment # Adding optional parameters via dictionary - for key in params: - clientObject[key] = params[key] + if params: + for key in params: + clientObject[key] = params[key] # Add Load Lineset Load to client model - Model.clientModel.service.set_line_set_load(load_case_no, clientObject) + model.clientModel.service.set_line_set_load(load_case_no, clientObject) def Mass(self, no: int = 1, @@ -525,7 +531,8 @@ def Mass(self, individual_mass_components: bool=True, mass_components = None, comment: str = '', - params: dict = {}): + params: dict = None, + model = Model): ''' if individual_mass_components == False: mass_components = [mass_global] @@ -535,7 +542,7 @@ def Mass(self, ''' # Client model | Line Load - clientObject = Model.clientModel.factory.create('ns0:line_set_load') + clientObject = model.clientModel.factory.create('ns0:line_set_load') # Clears object atributes | Sets all atributes to None clearAtributes(clientObject) @@ -578,8 +585,9 @@ def Mass(self, clientObject.comment = comment # Adding optional parameters via dictionary - for key in params: - clientObject[key] = params[key] + if params: + for key in params: + clientObject[key] = params[key] # Add Load Line Load to client model - Model.clientModel.service.set_line_set_load(load_case_no, clientObject) + model.clientModel.service.set_line_set_load(load_case_no, clientObject) diff --git a/RFEM/TypesForSteelDesign/steelMemberRotationalRestraints.py b/RFEM/TypesForSteelDesign/steelMemberRotationalRestraints.py index ffa2fe31..9665bbb4 100644 --- a/RFEM/TypesForSteelDesign/steelMemberRotationalRestraints.py +++ b/RFEM/TypesForSteelDesign/steelMemberRotationalRestraints.py @@ -11,7 +11,8 @@ def __init__(self, categories: list = [], parameters: list = [], comment: str = '', - params: dict = {}): + params: dict = None, + model = Model): """ Args: no (int): Member Rotational Restraint No. @@ -64,7 +65,7 @@ def __init__(self, """ # Client Model / Types For Steel Design Member Rotational Restraints - clientObject = Model.clientModel.factory.create('ns0:steel_member_rotational_restraint') + clientObject = model.clientModel.factory.create('ns0:steel_member_rotational_restraint') # Clears Object Attributes / Sets all the attributes to None clearAtributes(clientObject) @@ -125,11 +126,12 @@ def __init__(self, clientObject.comment = comment # Adding optional parameters via dictionary - for key in params: - clientObject[key] = params[key] + if params: + 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) + model.clientModel.service.set_steel_member_rotational_restraint(clientObject) diff --git a/RFEM/TypesForSteelDesign/steelMemberShearPanel.py b/RFEM/TypesForSteelDesign/steelMemberShearPanel.py new file mode 100644 index 00000000..89e54b4d --- /dev/null +++ b/RFEM/TypesForSteelDesign/steelMemberShearPanel.py @@ -0,0 +1,186 @@ +from http import client +from RFEM.initModel import Model, clearAtributes, ConvertToDlString +from RFEM.enums import * + +class SteelMemberShearPanel(): + def __init__(self, + no: int = 1, + user_defined_name: list = [False], + definition_type = SteelMemberShearPanelDefinitionType.DEFINITION_TYPE_TRAPEZOIDAL_SHEETING, + members: str = "", + member_sets: str = "", + categories = [SteelMemberShearPanelPositionOnSection.POSITION_ON_UPPER_FLANGE, "FI (+) 35/207 - 0.63 (b: 1) | DIN 18807 | Fischer Profil", SteelMemberShearPanelFasteningArrangement.FASTENING_ARRANGEMENT_EVERY_RIB], + parameters = [1, 2, 0.000247, 0.01043], + comment: str = '', + params: dict = None): + """ + Args: + no (int): Member Shear Panel Tag + user_defined_name (list): User Defined Member Shear Panel Name + definition_type (enum): Member Shear Panel Definition Enumeration Type + members (str): Assigned Members + member_sets (str): Assigned Member Sets + categories (list): Positional Categories + + for definition_type == SteelMemberShearPanelDefinitionType.DEFINITION_TYPE_TRAPEZOIDAL_SHEETING: + categories[0] = Section Position Enumeration Type + categories[1] = Sheeting Name + categories[2] = Fastening Arrangment Enumeration Type + + for definition_type == SteelMemberShearPanelDefinitionType.DEFINITION_TYPE_BRACING: + categories[0] = Section Position Enumeration Type + categories[1] = Diagonal Section Name + categories[2] = Post Section Name + + for definition_type == SteelMemberShearPanelDefinitionType.DEFINITION_TYPE_TRAPEZOIDAL_SHEETING_AND_BRACING: + categories[0] = Section Position Enumeration Type + categories[1] = Sheeting Name + categories[2] = Digonal Section Name + categories[3] = Post Section Name + categories[4] = Fastening Arrangment Enumeration Type + + for definition_type == SteelMemberShearPanelDefinitionType.DEFINITION_TYPE_DEFINE_S_PROV: + categories[0] = Section Position Enumeration Type + + parameters (list): Positional Parameters + + for definition_type == SteelMemberShearPanelDefinitionType.DEFINITION_TYPE_TRAPEZOIDAL_SHEETING: + parameters[0] = Panel Length + parameters[1] = Beam Spacing + parameters[2] = K1 Coefficient + parameters[3] = K2 Coefficient + + if categories[0] == "POSITION_DEFINE": + parameters[4] = Position on Section Value + + for definition_type == SteelMemberShearPanelDefinitionType.DEFINITION_TYPE_BRACING: + parameters[0] = Panel Length + parameters[1] = Beam Spacing + parameters[2] = Post Spacing + parameters[3] = Number of Bracings + parameters[4] = Diagonals Section Area + parameters[5] = Post Section Area + + if categories[0] == "POSITION_DEFINE": + parameters[6] = Position on Section Value + + for definition_type == SteelMemberShearPanelDefinitionType.DEFINITION_TYPE_TRAPEZOIDAL_SHEETING_AND_BRACING: + parameters[0] = Panel Length + parameters[1] = Beam Spacing + parameters[2] = K1 Coefficient + parameters[3] = K2 Coefficient + parameters[4] = Post Spacing + parameters[5] = Number of Bracing + parameters[6] = Diagonals Section Area + parameters[7] = Post Section Area + + if categories[0] == "POSITION_DEFINE": + parameters[8] = Position on Section Value + + for definition_type == SteelMemberShearPanelDefinitionType.DEFINITION_TYPE_DEFINE_S_PROV: + parameters[0] = Stifness + + if categories[0] == "POSITION_DEFINE": + parameters[1] = Position on Section Value + + comment (str, optional): Comment + params (dict, optional): Parameters + """ + + # Client Model | Types For Steel Design Member Shear Panel + clientObject = Model.clientModel.factory.create('ns0:steel_member_shear_panel') + + # Clears object atributes | Sets all atributes to None + clearAtributes(clientObject) + + # Member Shear Panel No. + clientObject.no = no + + # Member Shear Panel Assigned Members + clientObject.members = ConvertToDlString(members) + + # Member Shear Panel Assigned Member Sets + clientObject.member_sets = ConvertToDlString(member_sets) + + # Member Shear Panel User Defined 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 Shear Panel Definition Type + clientObject.definition_type = definition_type.name + + # Member Shear Panel Categories + if definition_type.name == "DEFINITION_TYPE_TRAPEZOIDAL_SHEETING": + clientObject.position_on_section = categories[0].name + clientObject.sheeting_name = categories[1] + clientObject.fastening_arrangement = categories[2].name + + elif definition_type.name == "DEFINITION_TYPE_BRACING": + clientObject.position_on_section = categories[0].name + clientObject.diagonals_section_name = categories[1] + clientObject.posts_section_name = categories[2] + + elif definition_type.name == "DEFINITION_TYPE_TRAPEZOIDAL_SHEETING_AND_BRACING": + clientObject.position_on_section = categories[0].name + clientObject.sheeting_name = categories[1] + clientObject.diagonals_section_name = categories[2] + clientObject.posts_section_name = categories[3] + clientObject.fastening_arrangement = categories[4].name + + elif definition_type.name == "DEFINITION_TYPE_DEFINE_S_PROV": + clientObject.position_on_section = categories[0].name + + # Member Shear Panel Parameters + if definition_type.name == "DEFINITION_TYPE_TRAPEZOIDAL_SHEETING": + clientObject.panel_length = parameters[0] + clientObject.beam_spacing = parameters[1] + clientObject.coefficient_k1 = parameters[2] + clientObject.coefficient_k2 = parameters[3] + + if categories[0].name == "POSITION_DEFINE": + clientObject.position_on_section_value = parameters[4] + + elif definition_type.name == "DEFINITION_TYPE_BRACING": + clientObject.panel_length = parameters[0] + clientObject.beam_spacing = parameters[1] + clientObject.post_spacing = parameters[2] + clientObject.number_of_bracings = parameters[3] + clientObject.diagonals_section_area = parameters[4] + clientObject.posts_section_area = parameters[5] + + if categories[0].name == "POSITION_DEFINE": + clientObject.position_on_section_value = parameters[6] + + elif definition_type.name == "DEFINITION_TYPE_TRAPEZOIDAL_SHEETING_AND_BRACING": + clientObject.panel_length = parameters[0] + clientObject.beam_spacing = parameters[1] + clientObject.coefficient_k1 = parameters[2] + clientObject.coefficient_k2 = parameters[3] + clientObject.post_spacing = parameters[4] + clientObject.number_of_bracings = parameters[5] + clientObject.diagonals_section_area = parameters[6] + clientObject.posts_section_area = parameters[7] + + if categories[0].name == "POSITION_DEFINE": + clientObject.position_on_section_value = parameters[8] + + elif definition_type.name == "DEFINITION_TYPE_DEFINE_S_PROV": + clientObject.stiffness = parameters[0] + + if categories[0].name == "POSITION_DEFINE": + clientObject.position_on_section_value = parameters[1] + + # Comment + clientObject.comment = comment + + # Adding optional parameters via dictionary + if params: + for key in params: + clientObject[key] = params[key] + + # Add Steel Effective Lengths to client model + Model.clientModel.service.set_steel_member_shear_panel(clientObject) + diff --git a/RFEM/enums.py b/RFEM/enums.py index e443c64c..990f2815 100644 --- a/RFEM/enums.py +++ b/RFEM/enums.py @@ -1719,6 +1719,24 @@ class SteelEffectiveLengthsMemberTypeZZ(Enum): ''' MEMBER_TYPE_BEAM, MEMBER_TYPE_CANTILEVER = range(2) +class SteelMemberShearPanelDefinitionType(Enum): + ''' + Steel Member Shear Panel Definition Type + ''' + DEFINITION_TYPE_BRACING, DEFINITION_TYPE_DEFINE_S_PROV,\ + DEFINITION_TYPE_TRAPEZOIDAL_SHEETING, DEFINITION_TYPE_TRAPEZOIDAL_SHEETING_AND_BRACING = range(4) + +class SteelMemberShearPanelPositionOnSection(Enum): + ''' + Steel Member Shear Panel Position On Section + ''' + POSITION_DEFINE, POSITION_IN_CENTROID, POSITION_ON_LOWER_FLANGE, POSITION_ON_UPPER_FLANGE = range(4) + +class SteelMemberShearPanelFasteningArrangement(Enum): + ''' + Steel Member Shear Panel Fastening Arrangement + ''' + FASTENING_ARRANGEMENT_EVERY_RIB, FASTENING_ARRANGEMENT_EVERY_SECOND_RIB = range(2) class SteelMemberRotationalRestraintType(Enum): ''' Steel Member Rotational Restraint Type diff --git a/UnitTests/test_steelMemberShearPanel.py b/UnitTests/test_steelMemberShearPanel.py new file mode 100644 index 00000000..2f57bdda --- /dev/null +++ b/UnitTests/test_steelMemberShearPanel.py @@ -0,0 +1,44 @@ +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 SteelMemberShearPanelDefinitionType, SteelMemberShearPanelPositionOnSection, SteelMemberShearPanelFasteningArrangement +from RFEM.initModel import Model, SetAddonStatus, CheckIfMethodOrTypeExists, AddOn +from RFEM.TypesForSteelDesign.steelMemberShearPanel import SteelMemberShearPanel + +if Model.clientModel is None: + Model() + +@pytest.mark.skipif(CheckIfMethodOrTypeExists(Model.clientModel,'ns0:steel_member_shear_panel', True), reason="Type ns0:steel_member_shear_panel not in RFEM GM yet") +def test_steelMemberShearPanel(): + + Model.clientModel.service.begin_modification() + + SetAddonStatus(Model.clientModel, AddOn.steel_design_active, True) + + SteelMemberShearPanel() + + SteelMemberShearPanel(2, [True, "shearPanel"], SteelMemberShearPanelDefinitionType.DEFINITION_TYPE_TRAPEZOIDAL_SHEETING, "1", "", + categories=[SteelMemberShearPanelPositionOnSection.POSITION_DEFINE, "FI (+) 35/207 - 0.63 (b: 1) | DIN 18807 | Fischer Profil", SteelMemberShearPanelFasteningArrangement.FASTENING_ARRANGEMENT_EVERY_SECOND_RIB], + parameters=[2,4, 0.00043, 0.00056, 0.05]) + + SteelMemberShearPanel(3, [False], SteelMemberShearPanelDefinitionType.DEFINITION_TYPE_BRACING, "", "", + [SteelMemberShearPanelPositionOnSection.POSITION_ON_UPPER_FLANGE, "CHS 48.3x4 | EN 10210-2 | Condesa", "CHS 33.7x2.3 | EN 10210-2 | Ferona"], + [2,4,1,1,0.055, 0.224]) + + + shearPanel_1 = Model.clientModel.service.get_steel_member_shear_panel(1) + shearPanel_2 = Model.clientModel.service.get_steel_member_shear_panel(2) + shearPanel_3 = Model.clientModel.service.get_steel_member_shear_panel(3) + + assert shearPanel_1.no == 1 + assert shearPanel_2.definition_type == "DEFINITION_TYPE_TRAPEZOIDAL_SHEETING" + assert shearPanel_3.panel_length == 2.0 + + + Model.clientModel.service.finish_modification()