From c05f6f1a935dfc3ecac8e699932dd832450c7be9 Mon Sep 17 00:00:00 2001 From: KaratasD Date: Mon, 28 Mar 2022 15:12:38 +0200 Subject: [PATCH 1/2] added steelMemberRotationalRestraints --- Examples/Cantilever/Demo1.py | 45 +++--- .../steelMemberRotationalRestraints.py | 137 ++++++++++++++++++ RFEM/enums.py | 23 +++ .../test_steelMemberRotationalRestraint.py | 44 ++++++ 4 files changed, 230 insertions(+), 19 deletions(-) create mode 100644 RFEM/TypesForSteelDesign/steelMemberRotationalRestraints.py create mode 100644 UnitTests/test_steelMemberRotationalRestraint.py diff --git a/Examples/Cantilever/Demo1.py b/Examples/Cantilever/Demo1.py index 591a3396..1325f421 100644 --- a/Examples/Cantilever/Demo1.py +++ b/Examples/Cantilever/Demo1.py @@ -8,8 +8,8 @@ print('dirname: ', dirName) sys.path.append(dirName + r'/../..') -from RFEM.enums import NodalSupportType, LoadDirectionType -from RFEM.initModel import Model, Calculate_all +from RFEM.enums import * +from RFEM.initModel import Model, Calculate_all, SetAddonStatus, AddOn from RFEM.BasicObjects.material import Material from RFEM.BasicObjects.section import Section from RFEM.BasicObjects.node import Node @@ -19,6 +19,7 @@ from RFEM.LoadCasesAndCombinations.loadCase import LoadCase from RFEM.Loads.nodalLoad import NodalLoad from RFEM.Calculate.meshSettings import GetModelInfo +from RFEM.TypesForSteelDesign.steelMemberRotationalRestraints import SteelMemberRotationalRestraint if __name__ == '__main__': l = float(input('Length of the cantilever in m: ')) @@ -27,6 +28,12 @@ Model(True, "Demo1") # crete new model called Demo1 Model.clientModel.service.begin_modification() + SetAddonStatus(Model.clientModel, AddOn.steel_design_active, True) + + SteelMemberRotationalRestraint(1, [False], SteelMemberRotationalRestraintType.TYPE_CONTINUOUS, "1", "", + 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]) + Material(1, 'S235') Section(1, 'IPE 200') @@ -47,21 +54,21 @@ NodalLoad(1, 1, '2', LoadDirectionType.LOAD_DIRECTION_GLOBAL_Z_OR_USER_DEFINED_W, f*1000) Model.clientModel.service.finish_modification() - Calculate_all() + #Calculate_all() - # model status - modelStatus = GetModelInfo() - print("Model is calculated" if modelStatus.property_has_results else "Model is not calculated") - print("Model contains printout report" if modelStatus.property_has_printout_report else "Model has not printout report") - print ("Model contains " + str(modelStatus.property_node_count) + " nodes") - print ("Model contains " + str(modelStatus.property_line_count) + " lines") - print ("Model contains " + str(modelStatus.property_member_count) + " members") - print ("Model contains " + str(modelStatus.property_surface_count) + " surfaces") - print ("Model contains " + str(modelStatus.property_solid_count) + " solids") - print ("Model contains " + str(modelStatus.property_lc_count) + " load cases") - print ("Model contains " + str(modelStatus.property_co_count) + " load combinations") - print ("Model contains " + str(modelStatus.property_rc_count) + " result classes") - print ("Model weight " + str(modelStatus.property_weight)) - print ("Model dimension x " + str(modelStatus.property_dimensions.x)) - print ("Model dimension y " + str(modelStatus.property_dimensions.y)) - print ("Model dimension z " + str(modelStatus.property_dimensions.z)) + # # model status + # modelStatus = GetModelInfo() + # print("Model is calculated" if modelStatus.property_has_results else "Model is not calculated") + # print("Model contains printout report" if modelStatus.property_has_printout_report else "Model has not printout report") + # print ("Model contains " + str(modelStatus.property_node_count) + " nodes") + # print ("Model contains " + str(modelStatus.property_line_count) + " lines") + # print ("Model contains " + str(modelStatus.property_member_count) + " members") + # print ("Model contains " + str(modelStatus.property_surface_count) + " surfaces") + # print ("Model contains " + str(modelStatus.property_solid_count) + " solids") + # print ("Model contains " + str(modelStatus.property_lc_count) + " load cases") + # print ("Model contains " + str(modelStatus.property_co_count) + " load combinations") + # print ("Model contains " + str(modelStatus.property_rc_count) + " result classes") + # print ("Model weight " + str(modelStatus.property_weight)) + # print ("Model dimension x " + str(modelStatus.property_dimensions.x)) + # print ("Model dimension y " + str(modelStatus.property_dimensions.y)) + # print ("Model dimension z " + str(modelStatus.property_dimensions.z)) 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 cd2a4577..3a98e46a 100644 --- a/RFEM/enums.py +++ b/RFEM/enums.py @@ -1372,3 +1372,26 @@ 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) \ No newline at end of file diff --git a/UnitTests/test_steelMemberRotationalRestraint.py b/UnitTests/test_steelMemberRotationalRestraint.py new file mode 100644 index 00000000..66284bab --- /dev/null +++ b/UnitTests/test_steelMemberRotationalRestraint.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 * +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]) + + + + 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" + + Model.clientModel.service.finish_modification() \ No newline at end of file From 8c33015e725fff418f60e3d12f9ac4e343c639de Mon Sep 17 00:00:00 2001 From: KaratasD Date: Mon, 28 Mar 2022 15:37:33 +0200 Subject: [PATCH 2/2] deleted unnecessary changes --- Examples/Cantilever/Demo1.py | 42 ++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/Examples/Cantilever/Demo1.py b/Examples/Cantilever/Demo1.py index 1325f421..5ad863eb 100644 --- a/Examples/Cantilever/Demo1.py +++ b/Examples/Cantilever/Demo1.py @@ -9,7 +9,7 @@ sys.path.append(dirName + r'/../..') from RFEM.enums import * -from RFEM.initModel import Model, Calculate_all, SetAddonStatus, AddOn +from RFEM.initModel import Model, Calculate_all from RFEM.BasicObjects.material import Material from RFEM.BasicObjects.section import Section from RFEM.BasicObjects.node import Node @@ -19,7 +19,6 @@ from RFEM.LoadCasesAndCombinations.loadCase import LoadCase from RFEM.Loads.nodalLoad import NodalLoad from RFEM.Calculate.meshSettings import GetModelInfo -from RFEM.TypesForSteelDesign.steelMemberRotationalRestraints import SteelMemberRotationalRestraint if __name__ == '__main__': l = float(input('Length of the cantilever in m: ')) @@ -28,11 +27,6 @@ Model(True, "Demo1") # crete new model called Demo1 Model.clientModel.service.begin_modification() - SetAddonStatus(Model.clientModel, AddOn.steel_design_active, True) - - SteelMemberRotationalRestraint(1, [False], SteelMemberRotationalRestraintType.TYPE_CONTINUOUS, "1", "", - 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]) Material(1, 'S235') @@ -54,21 +48,21 @@ NodalLoad(1, 1, '2', LoadDirectionType.LOAD_DIRECTION_GLOBAL_Z_OR_USER_DEFINED_W, f*1000) Model.clientModel.service.finish_modification() - #Calculate_all() + Calculate_all() - # # model status - # modelStatus = GetModelInfo() - # print("Model is calculated" if modelStatus.property_has_results else "Model is not calculated") - # print("Model contains printout report" if modelStatus.property_has_printout_report else "Model has not printout report") - # print ("Model contains " + str(modelStatus.property_node_count) + " nodes") - # print ("Model contains " + str(modelStatus.property_line_count) + " lines") - # print ("Model contains " + str(modelStatus.property_member_count) + " members") - # print ("Model contains " + str(modelStatus.property_surface_count) + " surfaces") - # print ("Model contains " + str(modelStatus.property_solid_count) + " solids") - # print ("Model contains " + str(modelStatus.property_lc_count) + " load cases") - # print ("Model contains " + str(modelStatus.property_co_count) + " load combinations") - # print ("Model contains " + str(modelStatus.property_rc_count) + " result classes") - # print ("Model weight " + str(modelStatus.property_weight)) - # print ("Model dimension x " + str(modelStatus.property_dimensions.x)) - # print ("Model dimension y " + str(modelStatus.property_dimensions.y)) - # print ("Model dimension z " + str(modelStatus.property_dimensions.z)) + # model status + modelStatus = GetModelInfo() + print("Model is calculated" if modelStatus.property_has_results else "Model is not calculated") + print("Model contains printout report" if modelStatus.property_has_printout_report else "Model has not printout report") + print ("Model contains " + str(modelStatus.property_node_count) + " nodes") + print ("Model contains " + str(modelStatus.property_line_count) + " lines") + print ("Model contains " + str(modelStatus.property_member_count) + " members") + print ("Model contains " + str(modelStatus.property_surface_count) + " surfaces") + print ("Model contains " + str(modelStatus.property_solid_count) + " solids") + print ("Model contains " + str(modelStatus.property_lc_count) + " load cases") + print ("Model contains " + str(modelStatus.property_co_count) + " load combinations") + print ("Model contains " + str(modelStatus.property_rc_count) + " result classes") + print ("Model weight " + str(modelStatus.property_weight)) + print ("Model dimension x " + str(modelStatus.property_dimensions.x)) + print ("Model dimension y " + str(modelStatus.property_dimensions.y)) + print ("Model dimension z " + str(modelStatus.property_dimensions.z))