diff --git a/RFEM/TypesForMembers/memberEccentricity.py b/RFEM/TypesForMembers/memberEccentricity.py index f0139888..0f642e54 100644 --- a/RFEM/TypesForMembers/memberEccentricity.py +++ b/RFEM/TypesForMembers/memberEccentricity.py @@ -1,11 +1,44 @@ +from http import client from RFEM.initModel import Model, clearAtributes +from RFEM.enums import * class MemberEccentricity(): def __init__(self, no: int = 1, + name: list = [False], + eccentricity_type = MemberEccentricitySpecificationType.TYPE_RELATIVE, + eccentricity_parameters = [MemberEccentricityHorizontalSectionAlignment.ALIGN_MIDDLE, MemberEccentricityVerticalSectionAlignment.ALIGN_MIDDLE], + transverse_offset_type = MemberEccentricityTransverseOffsetType.TRANSVERSE_OFFSET_TYPE_NONE, + transverse_offset_parameters = None, + axial_offset_active: bool = False, + hinge_location_at_node: bool = False, comment: str = '', params: dict = None, model = Model): + """ + Args: + no (int): Eccentricity Tag + name (list): User Defined Name + eccentricity_type (enum): Eccentricity Type Enumeration Item + if eccentricity_type == MemberEccentricitySpecificationType.TYPE_RELATIVE: + eccentricity_parameters (list): [horizontal_section_alignment, vertical_section_alignment] + elif eccentricity_type == MemberEccentricitySpecificationType.TYPE_ABSOLUTE: + eccentricity_parameters (list): [coordinate_system, offset_x, offset_y, offset_z] + elif eccentricity_type == MemberEccentricitySpecificationType.TYPE_RELATIVE_AND_ABSOLUTE: + eccentricity_parameters (list): [coordinate_system, offset_x, offset_y, offset_z, horizontal_section_alignment, vertical_section_alignment] + transverse_offset_type (enum): Transverse Offset Type Enumeration Item + if transverse_offset_type == MemberEccentricityTransverseOffsetType.TRANSVERSE_OFFSET_TYPE_NONE: + transverse_offset_parameters (list): None + elif transverse_offset_type == MemberEccentricityTransverseOffsetType.TRANSVERSE_OFFSET_TYPE_FROM_SURFACE_THICKNESS: + transverse_offset_parameters (list): [transverse_offset_reference_surface, transverse_offset_vertical_alignment] + elif transverse_offset_type == MemberEccentricityTransverseOffsetType.TRANSVERSE_OFFSET_TYPE_FROM_MEMBER_SECTION: + transverse_offset_parameters (list): [transverse_offset_reference_member, transverse_offset_member_reference_node, + transverse_offset_horizontal_alignment, transverse_offset_vertical_alignment] + axial_offset_active (bool): Axial Offset Option + hinge_location_at_node (bool): Hinge Location at Node Option + comment (str, optional): Comment + params (dict, optional): Parameters + """ # Client model | Member Eccentricity clientObject = model.clientModel.factory.create('ns0:member_eccentricity') @@ -16,6 +49,62 @@ def __init__(self, # Member Eccentricity No. clientObject.no = no + # User Defined Name + if name[0]: + clientObject.user_defined_name_enabled = True + clientObject.name = name[1] + else: + clientObject.user_defined_name_enabled = False + + + # Eccentricity Specification Type + clientObject.specification_type = eccentricity_type.name + + if eccentricity_type.name == "TYPE_RELATIVE": + clientObject.horizontal_section_alignment = eccentricity_parameters[0].name + clientObject.vertical_section_alignment = eccentricity_parameters[1].name + + elif eccentricity_type.name == "TYPE_ABSOLUTE": + clientObject.coordinate_system = eccentricity_parameters[0] + clientObject.offset_x = eccentricity_parameters[1] + clientObject.offset_y = eccentricity_parameters[2] + clientObject.offset_z = eccentricity_parameters[3] + + elif eccentricity_parameters.name == "TYPE_RELATIVE_AND_ABSOLUTE": + clientObject.coordinate_system = eccentricity_parameters[0] + clientObject.offset_x = eccentricity_parameters[1] + clientObject.offset_y = eccentricity_parameters[2] + clientObject.offset_z = eccentricity_parameters[3] + clientObject.horizontal_section_alignment = eccentricity_parameters[4].name + clientObject.vertical_section_alignment = eccentricity_parameters[5].name + + else: + print("WARNING: Invalid eccentricity type.") + + # Transverse Offset Reference Type + clientObject.transverse_offset_reference_type = transverse_offset_type.name + + if transverse_offset_type.name == "TRANSVERSE_OFFSET_TYPE_NONE": + pass + + elif transverse_offset_type.name == "TRANSVERSE_OFFSET_TYPE_FROM_SURFACE_THICKNESS": + clientObject.transverse_offset_reference_surface = transverse_offset_parameters[0] + clientObject.transverse_offset_vertical_alignment = transverse_offset_parameters[1].name + + elif transverse_offset_type.name == "TRANSVERSE_OFFSET_TYPE_FROM_MEMBER_SECTION": + clientObject.transverse_offset_reference_member = transverse_offset_parameters[0] + clientObject.transverse_offset_member_reference_node = transverse_offset_parameters[1] + clientObject.transverse_offset_horizontal_alignment = transverse_offset_parameters[2].name + clientObject.transverse_offset_vertical_alignment = transverse_offset_parameters[3].name + else: + print("WARNING: Invalid transverse offset type.") + + # Axial Offset Option + clientObject.axial_offset_active = axial_offset_active + + # Hinge Location at Node Option + clientObject.hinge_location_at_node = hinge_location_at_node + # Comment clientObject.comment = comment diff --git a/RFEM/TypesForMembers/memberHinge.py b/RFEM/TypesForMembers/memberHinge.py index fee6a567..bebd2d85 100644 --- a/RFEM/TypesForMembers/memberHinge.py +++ b/RFEM/TypesForMembers/memberHinge.py @@ -1,57 +1,487 @@ -from RFEM.initModel import Model, clearAtributes -from RFEM.dataTypes import inf - -class MemberHinge(): - def __init__(self, - no: int = 1, - coordinate_system: str = "Local", - translational_release_n: float = inf, - translational_release_vy: float = inf, - translational_release_vz: float = inf, - rotational_release_mt: float = inf, - rotational_release_my: float = 0.0, - rotational_release_mz: float = inf, - comment: str = 'Rotational Release My', - params: dict = None, - model = Model): - - # Client model | Member Hinge - clientObject = model.clientModel.factory.create('ns0:member_hinge') - - # Clears object atributes | Sets all atributes to None - clearAtributes(clientObject) - - # Memeber Hinge No. - clientObject.no = no - - # Coordinate System - clientObject.coordinate_system = coordinate_system - - # Translational Release/Spring [kN/m] N - clientObject.axial_release_n = translational_release_n - - # Translational Release/Spring [kN/m] Vy - clientObject.axial_release_vy = translational_release_vy - - # Translational Release/Spring [kN/m] Vz - clientObject.axial_release_vz = translational_release_vz - - # Rotational Release/Spring [kNm/rad] Mt - clientObject.moment_release_mt = rotational_release_mt - - # Rotational Release/Spring [kNm/rad] My - clientObject.moment_release_my = rotational_release_my - - # Rotational Release/Spring [kNm/rad] Mz - clientObject.moment_release_mz = rotational_release_mz - - # Comment - clientObject.comment = comment - - # Adding optional parameters via dictionary - if params: - for key in params: - clientObject[key] = params[key] - - # Add Line to client model - model.clientModel.service.set_member_hinge(clientObject) +from RFEM.enums import MemberHingeNonlineartiy +from RFEM.initModel import ConvertToDlString, Model, clearAtributes +from RFEM.dataTypes import inf + +class MemberHinge(): + def __init__(self, + no: int = 1, + coordinate_system: str = "Local", + member : str = "", + translational_release_n: float = inf, + translational_release_vy: float = inf, + translational_release_vz: float = inf, + rotational_release_mt: float = inf, + rotational_release_my: float = 0.0, + rotational_release_mz: float = 0.0, + translational_release_n_nonlinearity = [MemberHingeNonlineartiy.NONLINEARITY_TYPE_NONE], + translational_release_vy_nonlinearity = [MemberHingeNonlineartiy.NONLINEARITY_TYPE_NONE], + translational_release_vz_nonlinearity = [MemberHingeNonlineartiy.NONLINEARITY_TYPE_NONE], + rotational_release_mt_nonlinearity = [MemberHingeNonlineartiy.NONLINEARITY_TYPE_NONE], + rotational_release_my_nonlinearity = [MemberHingeNonlineartiy.NONLINEARITY_TYPE_NONE], + rotational_release_mz_nonlinearity = [MemberHingeNonlineartiy.NONLINEARITY_TYPE_NONE], + comment: str = '', + params: dict = None, + model = Model): + """ + Args: + no (int): Member Hinge Tag + coordinate_system (str): Coordinate System Selection + member (str): Assigned Members + translational_release_n (float): Translational Spring Constant X + translational_release_vy (float): Translational Spring Constant Y + translational_release_vz (float): Translational Spring Constant Z + rotational_release_mt (float): Rotational Spring Constant X + rotational_release_my (float): Rotational Spring Constant Y + rotational_release_mz (float): Rotational Spring Constant Z + translational_release_n_nonlinearity (list): Nonlinearity Options Translational X + translational_release_vy_nonlinearity (list): Nonlinearity Options Translational Y + translational_release_vz_nonlinearity (list): Nonlinearity Options Translational Z + rotational_release_mt_nonlinearity (list): Nonlinearity Options Rotational X + rotational_release_my_nonlinearity (list): Nonlinearity Options Rotational Y + rotational_release_mz_nonlinearity (list): Nonlinearity Options Rotational Z + comment (str, optional): Comment + params (dict, optional): Parameters + """ + + # Client model | Member Hinge + clientObject = model.clientModel.factory.create('ns0:member_hinge') + + # Clears object atributes | Sets all atributes to None + clearAtributes(clientObject) + + # Member Hinge No. + clientObject.no = no + + # Assigned Member + clientObject.members = ConvertToDlString(member) + + # Coordinate System + clientObject.coordinate_system = coordinate_system + + # Translational Release/Spring [kN/m] N + clientObject.axial_release_n = translational_release_n + + # Translational Release/Spring [kN/m] Vy + clientObject.axial_release_vy = translational_release_vy + + # Translational Release/Spring [kN/m] Vz + clientObject.axial_release_vz = translational_release_vz + + # Rotational Release/Spring [kNm/rad] Mt + clientObject.moment_release_mt = rotational_release_mt + + # Rotational Release/Spring [kNm/rad] My + clientObject.moment_release_my = rotational_release_my + + # Rotational Release/Spring [kNm/rad] Mz + clientObject.moment_release_mz = rotational_release_mz + + # Translational Release N Nonlinearity + + # Nonlinearity Types None, Fixed if Negative N, Fixed if Positive N + if translational_release_n_nonlinearity[0].name == "NONLINEARITY_TYPE_NONE" \ + or translational_release_n_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_NEGATIVE" \ + or translational_release_n_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_POSITIVE" : + clientObject.axial_release_n_nonlinearity = translational_release_n_nonlinearity[0].name + + # Partial Activity + elif translational_release_n_nonlinearity[0].name == "NONLINEARITY_TYPE_PARTIAL_ACTIVITY": + clientObject.axial_release_n_nonlinearity = translational_release_n_nonlinearity[0].name + + # Negative Zone + clientObject.partial_activity_along_x_negative_type = translational_release_n_nonlinearity[1][0].name + + if translational_release_n_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_along_x_negative_slippage = translational_release_n_nonlinearity[1][1] + + elif translational_release_n_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_along_x_negative_displacement = translational_release_n_nonlinearity[1][1] + + elif translational_release_n_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_along_x_negative_force = translational_release_n_nonlinearity[1][1] + clientObject.partial_activity_along_x_negative_slippage = translational_release_n_nonlinearity[1][2] + + elif translational_release_n_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_along_x_negative_force = translational_release_n_nonlinearity[1][1] + clientObject.partial_activity_along_x_negative_slippage = translational_release_n_nonlinearity[1][2] + + # Positive Zone + clientObject.partial_activity_along_x_positive_type = translational_release_n_nonlinearity[2][0].name + + if translational_release_n_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_along_x_positive_slippage = translational_release_n_nonlinearity[2][1] + + elif translational_release_n_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_along_x_positive_displacement = translational_release_n_nonlinearity[2][1] + + elif translational_release_n_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_along_x_positive_force = translational_release_n_nonlinearity[2][1] + clientObject.partial_activity_along_x_positive_slippage = translational_release_n_nonlinearity[2][2] + + elif translational_release_n_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_along_x_positive_force = translational_release_n_nonlinearity[2][1] + clientObject.partial_activity_along_x_positive_slippage = translational_release_n_nonlinearity[2][2] + + elif translational_release_n_nonlinearity[0].name == "NONLINEARITY_TYPE_DIAGRAM": + clientObject.axial_release_n_nonlinearity = translational_release_n_nonlinearity[0].name + clientObject.diagram_along_x_start = translational_release_n_nonlinearity[1][0].name + clientObject.diagram_along_x_end = translational_release_n_nonlinearity[1][1].name + + clientObject.diagram_along_x_table = Model.clientModel.factory.create('ns0:member_hinge.diagram_along_x_table') + + for i,j in enumerate(translational_release_n_nonlinearity[1][2]): + mlvlp = Model.clientModel.factory.create('ns0:member_hinge_diagram_along_x_table') + mlvlp.no = i+1 + mlvlp.displacement = translational_release_n_nonlinearity[1][2][i][0] + mlvlp.force = translational_release_n_nonlinearity[1][2][i][1] + mlvlp.spring = translational_release_n_nonlinearity[1][2][i][2] + mlvlp.note = None + + clientObject.diagram_along_x_table.member_hinge_diagram_along_x_table.append(mlvlp) + + elif translational_release_n_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_1" \ + or translational_release_n_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_2" \ + or translational_release_n_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_1_2": + clientObject.axial_release_n_nonlinearity = translational_release_n_nonlinearity[0].name + clientObject.friction_coefficient_x = translational_release_n_nonlinearity[1][0] + + elif translational_release_n_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_1_PLUS_2": + clientObject.axial_release_n_nonlinearity = translational_release_n_nonlinearity[0].name + clientObject.friction_coefficient_xy = translational_release_n_nonlinearity[1][0] + clientObject.friction_coefficient_xz = translational_release_n_nonlinearity[1][1] + + # Translational Release Vy Nonlinearity + if translational_release_vy_nonlinearity[0].name == "NONLINEARITY_TYPE_NONE" \ + or translational_release_vy_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_NEGATIVE" \ + or translational_release_vy_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_POSITIVE" : + clientObject.axial_release_vy_nonlinearity = translational_release_vy_nonlinearity[0].name + + # Partial Activity + elif translational_release_vy_nonlinearity[0].name == "NONLINEARITY_TYPE_PARTIAL_ACTIVITY": + clientObject.axial_release_vy_nonlinearity = translational_release_vy_nonlinearity[0].name + + # Negative Zone + clientObject.partial_activity_along_y_negative_type = translational_release_vy_nonlinearity[1][0].name + + if translational_release_vy_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_along_y_negative_slippage = translational_release_vy_nonlinearity[1][1] + + elif translational_release_vy_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_along_y_negative_displacement = translational_release_vy_nonlinearity[1][1] + + elif translational_release_vy_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_along_y_negative_force = translational_release_vy_nonlinearity[1][1] + clientObject.partial_activity_along_y_negative_slippage = translational_release_vy_nonlinearity[1][2] + + elif translational_release_vy_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_along_y_negative_force = translational_release_vy_nonlinearity[1][1] + clientObject.partial_activity_along_y_negative_slippage = translational_release_vy_nonlinearity[1][2] + + # Positive Zone + clientObject.partial_activity_along_y_positive_type = translational_release_vy_nonlinearity[2][0].name + + if translational_release_vy_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_along_y_positive_slippage = translational_release_vy_nonlinearity[2][1] + + elif translational_release_vy_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_along_y_positive_displacement = translational_release_vy_nonlinearity[2][1] + + elif translational_release_vy_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_along_y_positive_force = translational_release_vy_nonlinearity[2][1] + clientObject.partial_activity_along_y_positive_slippage = translational_release_vy_nonlinearity[2][2] + + elif translational_release_vy_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_along_y_positive_force = translational_release_vy_nonlinearity[2][1] + clientObject.partial_activity_along_y_positive_slippage = translational_release_vy_nonlinearity[2][2] + + elif translational_release_vy_nonlinearity[0].name == "NONLINEARITY_TYPE_DIAGRAM": + clientObject.axial_release_vy_nonlinearity = translational_release_vy_nonlinearity[0].name + clientObject.diagram_along_y_start = translational_release_vy_nonlinearity[1][0].name + clientObject.diagram_along_y_end = translational_release_vy_nonlinearity[1][1].name + + clientObject.diagram_along_y_table = Model.clientModel.factory.create('ns0:member_hinge.diagram_along_y_table') + + for i,j in enumerate(translational_release_vy_nonlinearity[1][2]): + mlvlp = Model.clientModel.factory.create('ns0:member_hinge_diagram_along_y_table') + mlvlp.no = i+1 + mlvlp.displacement = translational_release_vy_nonlinearity[1][2][i][0] + mlvlp.force = translational_release_vy_nonlinearity[1][2][i][1] + mlvlp.spring = translational_release_vy_nonlinearity[1][2][i][2] + mlvlp.note = None + + clientObject.diagram_along_y_table.member_hinge_diagram_along_y_table.append(mlvlp) + + elif translational_release_vy_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_1" \ + or translational_release_vy_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_2" \ + or translational_release_vy_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_1_2": + clientObject.axial_release_vy_nonlinearity = translational_release_vy_nonlinearity[0].name + clientObject.friction_coefficient_y = translational_release_vy_nonlinearity[1][0] + + elif translational_release_vy_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_1_PLUS_2": + clientObject.axial_release_vy_nonlinearity = translational_release_vy_nonlinearity[0].name + clientObject.friction_coefficient_yx = translational_release_vy_nonlinearity[1][0] + clientObject.friction_coefficient_yz = translational_release_vy_nonlinearity[1][1] + + # Translational Release Vz Nonlinearity + if translational_release_vz_nonlinearity[0].name == "NONLINEARITY_TYPE_NONE" \ + or translational_release_vz_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_NEGATIVE" \ + or translational_release_vz_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_POSITIVE" : + clientObject.axial_release_vz_nonlinearity = translational_release_vz_nonlinearity[0].name + + # Partial Activity + elif translational_release_vz_nonlinearity[0].name == "NONLINEARITY_TYPE_PARTIAL_ACTIVITY": + clientObject.axial_release_vz_nonlinearity = translational_release_vz_nonlinearity[0].name + + # Negative Zone + clientObject.partial_activity_along_z_negative_type = translational_release_vz_nonlinearity[1][0].name + + if translational_release_vz_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_along_z_negative_slippage = translational_release_vz_nonlinearity[1][1] + + elif translational_release_vz_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_along_z_negative_displacement = translational_release_vz_nonlinearity[1][1] + + elif translational_release_vz_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_along_z_negative_force = translational_release_vz_nonlinearity[1][1] + clientObject.partial_activity_along_z_negative_slippage = translational_release_vz_nonlinearity[1][2] + + elif translational_release_vz_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_along_z_negative_force = translational_release_vz_nonlinearity[1][1] + clientObject.partial_activity_along_z_negative_slippage = translational_release_vz_nonlinearity[1][2] + + # Positive Zone + clientObject.partial_activity_along_z_positive_type = translational_release_vz_nonlinearity[2][0].name + + if translational_release_vz_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_along_z_positive_slippage = translational_release_vz_nonlinearity[2][1] + + elif translational_release_vz_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_along_z_positive_displacement = translational_release_vz_nonlinearity[2][1] + + elif translational_release_vz_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_along_z_positive_force = translational_release_vz_nonlinearity[2][1] + clientObject.partial_activity_along_z_positive_slippage = translational_release_vz_nonlinearity[2][2] + + elif translational_release_vz_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_along_z_positive_force = translational_release_vz_nonlinearity[2][1] + clientObject.partial_activity_along_z_positive_slippage = translational_release_vz_nonlinearity[2][2] + + elif translational_release_vz_nonlinearity[0].name == "NONLINEARITY_TYPE_DIAGRAM": + clientObject.axial_release_vz_nonlinearity = translational_release_vz_nonlinearity[0].name + clientObject.diagram_along_z_start = translational_release_vz_nonlinearity[1][0].name + clientObject.diagram_along_z_end = translational_release_vz_nonlinearity[1][1].name + + clientObject.diagram_along_z_table = Model.clientModel.factory.create('ns0:member_hinge.diagram_along_z_table') + + for i,j in enumerate(translational_release_vz_nonlinearity[1][2]): + mlvlp = Model.clientModel.factory.create('ns0:member_hinge_diagram_along_z_table') + mlvlp.no = i+1 + mlvlp.displacement = translational_release_vz_nonlinearity[1][2][i][0] + mlvlp.force = translational_release_vz_nonlinearity[1][2][i][1] + mlvlp.spring = translational_release_vz_nonlinearity[1][2][i][2] + mlvlp.note = None + + clientObject.diagram_along_z_table.member_hinge_diagram_along_z_table.append(mlvlp) + + elif translational_release_vz_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_1" \ + or translational_release_vz_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_2" \ + or translational_release_vz_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_1_2": + clientObject.axial_release_vz_nonlinearity = translational_release_vz_nonlinearity[0].name + clientObject.friction_coefficient_z = translational_release_vz_nonlinearity[1][0] + + elif translational_release_vz_nonlinearity[0].name == "NONLINEARITY_TYPE_FRICTION_DIRECTION_1_PLUS_2": + clientObject.axial_release_vz_nonlinearity = translational_release_vz_nonlinearity[0].name + clientObject.friction_coefficient_zx = translational_release_vz_nonlinearity[1][0] + clientObject.friction_coefficient_zy = translational_release_vz_nonlinearity[1][1] + + # Rotational Release Mt Nonlinearity + if rotational_release_mt_nonlinearity[0].name == "NONLINEARITY_TYPE_NONE" \ + or rotational_release_mt_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_NEGATIVE" \ + or rotational_release_mt_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_POSITIVE" : + clientObject.moment_release_mt_nonlinearity = rotational_release_mt_nonlinearity[0].name + + # Partial Activity + elif rotational_release_mt_nonlinearity[0].name == "NONLINEARITY_TYPE_PARTIAL_ACTIVITY": + clientObject.moment_release_mt_nonlinearity = rotational_release_mt_nonlinearity[0].name + + # Negative Zone + clientObject.partial_activity_around_x_negative_type = rotational_release_mt_nonlinearity[1][0].name + + if rotational_release_mt_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_around_x_negative_slippage = rotational_release_mt_nonlinearity[1][1] + + elif rotational_release_mt_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_around_x_negative_displacement = rotational_release_mt_nonlinearity[1][1] + + elif rotational_release_mt_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_around_x_negative_force = rotational_release_mt_nonlinearity[1][1] + clientObject.partial_activity_around_x_negative_slippage = rotational_release_mt_nonlinearity[1][2] + + elif rotational_release_mt_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_around_x_negative_force = rotational_release_mt_nonlinearity[1][1] + clientObject.partial_activity_around_x_negative_slippage = rotational_release_mt_nonlinearity[1][2] + + # Positive Zone + clientObject.partial_activity_around_x_positive_type = rotational_release_mt_nonlinearity[2][0].name + + if rotational_release_mt_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_around_x_positive_slippage = rotational_release_mt_nonlinearity[2][1] + + elif rotational_release_mt_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_around_x_positive_displacement = rotational_release_mt_nonlinearity[2][1] + + elif rotational_release_mt_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_around_x_positive_force = rotational_release_mt_nonlinearity[2][1] + clientObject.partial_activity_around_x_positive_slippage = rotational_release_mt_nonlinearity[2][2] + + elif rotational_release_mt_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_around_x_positive_force = rotational_release_mt_nonlinearity[2][1] + clientObject.partial_activity_around_x_positive_slippage = rotational_release_mt_nonlinearity[2][2] + + elif rotational_release_mt_nonlinearity[0].name == "NONLINEARITY_TYPE_DIAGRAM": + clientObject.moment_release_mt_nonlinearity = rotational_release_mt_nonlinearity[0].name + clientObject.diagram_around_x_start = rotational_release_mt_nonlinearity[1][0].name + clientObject.diagram_around_x_end = rotational_release_mt_nonlinearity[1][1].name + + clientObject.diagram_around_x_table = Model.clientModel.factory.create('ns0:member_hinge.diagram_around_x_table') + + for i,j in enumerate(rotational_release_mt_nonlinearity[1][2]): + mlvlp = Model.clientModel.factory.create('ns0:member_hinge_diagram_around_x_table') + mlvlp.no = i+1 + mlvlp.displacement = rotational_release_mt_nonlinearity[1][2][i][0] + mlvlp.force = rotational_release_mt_nonlinearity[1][2][i][1] + mlvlp.spring = rotational_release_mt_nonlinearity[1][2][i][2] + mlvlp.note = None + + clientObject.diagram_around_x_table.member_hinge_diagram_around_x_table.append(mlvlp) + + # Rotational Release My Nonlinearity + if rotational_release_my_nonlinearity[0].name == "NONLINEARITY_TYPE_NONE" \ + or rotational_release_my_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_NEGATIVE" \ + or rotational_release_my_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_POSITIVE" : + clientObject.moment_release_my_nonlinearity = rotational_release_my_nonlinearity[0].name + + # Partial Activity + elif rotational_release_my_nonlinearity[0].name == "NONLINEARITY_TYPE_PARTIAL_ACTIVITY": + clientObject.moment_release_my_nonlinearity = rotational_release_my_nonlinearity[0].name + + # Negative Zone + clientObject.partial_activity_around_y_negative_type = rotational_release_my_nonlinearity[1][0].name + + if rotational_release_my_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_around_y_negative_slippage = rotational_release_my_nonlinearity[1][1] + + elif rotational_release_my_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_around_y_negative_displacement = rotational_release_my_nonlinearity[1][1] + + elif rotational_release_my_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_around_y_negative_force = rotational_release_my_nonlinearity[1][1] + clientObject.partial_activity_around_y_negative_slippage = rotational_release_my_nonlinearity[1][2] + + elif rotational_release_my_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_around_y_negative_force = rotational_release_my_nonlinearity[1][1] + clientObject.partial_activity_around_y_negative_slippage = rotational_release_my_nonlinearity[1][2] + + # Positive Zone + clientObject.partial_activity_around_y_positive_type = rotational_release_my_nonlinearity[2][0].name + + if rotational_release_my_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_around_y_positive_slippage = rotational_release_my_nonlinearity[2][1] + + elif rotational_release_my_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_around_y_positive_displacement = rotational_release_my_nonlinearity[2][1] + + elif rotational_release_my_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_around_y_positive_force = rotational_release_my_nonlinearity[2][1] + clientObject.partial_activity_around_y_positive_slippage = rotational_release_my_nonlinearity[2][2] + + elif rotational_release_my_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_around_y_positive_force = rotational_release_my_nonlinearity[2][1] + clientObject.partial_activity_around_y_positive_slippage = rotational_release_my_nonlinearity[2][2] + + clientObject.diagram_around_y_table = Model.clientModel.factory.create('ns0:member_hinge.diagram_around_y_table') + + elif rotational_release_my_nonlinearity[0].name == "NONLINEARITY_TYPE_DIAGRAM": + clientObject.moment_release_my_nonlinearity = rotational_release_my_nonlinearity[0].name + clientObject.diagram_around_y_start = rotational_release_my_nonlinearity[1][0].name + clientObject.diagram_around_y_end = rotational_release_my_nonlinearity[1][1].name + + for i,j in enumerate(rotational_release_my_nonlinearity[1][2]): + mlvlp = Model.clientModel.factory.create('ns0:member_hinge_diagram_around_y_table') + mlvlp.no = i+1 + mlvlp.displacement = rotational_release_my_nonlinearity[1][2][i][0] + mlvlp.force = rotational_release_my_nonlinearity[1][2][i][1] + mlvlp.spring = rotational_release_my_nonlinearity[1][2][i][2] + mlvlp.note = None + + clientObject.diagram_around_y_table.member_hinge_diagram_around_y_table.append(mlvlp) + + # Rotational Release Mz Nonlinearity + if rotational_release_mz_nonlinearity[0].name == "NONLINEARITY_TYPE_NONE" \ + or rotational_release_mz_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_NEGATIVE" \ + or rotational_release_mz_nonlinearity[0].name == "NONLINEARITY_TYPE_FAILURE_IF_POSITIVE" : + clientObject.moment_release_mz_nonlinearity = rotational_release_mz_nonlinearity[0].name + + # Partial Activity + elif rotational_release_mz_nonlinearity[0].name == "NONLINEARITY_TYPE_PARTIAL_ACTIVITY": + clientObject.moment_release_mz_nonlinearity = rotational_release_mz_nonlinearity[0].name + + # Negative Zone + clientObject.partial_activity_around_z_negative_type = rotational_release_mz_nonlinearity[1][0].name + + if rotational_release_mz_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_around_z_negative_slippage = rotational_release_mz_nonlinearity[1][1] + + elif rotational_release_mz_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_around_z_negative_displacement = rotational_release_mz_nonlinearity[1][1] + + elif rotational_release_mz_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_around_z_negative_force = rotational_release_mz_nonlinearity[1][1] + clientObject.partial_activity_around_z_negative_slippage = rotational_release_mz_nonlinearity[1][2] + + elif rotational_release_mz_nonlinearity[1][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_around_z_negative_force = rotational_release_mz_nonlinearity[1][1] + clientObject.partial_activity_around_z_negative_slippage = rotational_release_mz_nonlinearity[1][2] + + # Positive Zone + clientObject.partial_activity_around_z_positive_type = rotational_release_mz_nonlinearity[2][0].name + + if rotational_release_mz_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_COMPLETE": + clientObject.partial_activity_around_z_positive_slippage = rotational_release_mz_nonlinearity[2][1] + + elif rotational_release_mz_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_FIXED": + clientObject.partial_activity_around_z_positive_displacement = rotational_release_mz_nonlinearity[2][1] + + elif rotational_release_mz_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_TEARING": + clientObject.partial_activity_around_z_positive_force = rotational_release_mz_nonlinearity[2][1] + clientObject.partial_activity_around_z_positive_slippage = rotational_release_mz_nonlinearity[2][2] + + elif rotational_release_mz_nonlinearity[2][0].name == "PARTIAL_ACTIVITY_TYPE_YIELDING": + clientObject.partial_activity_around_z_positive_force = rotational_release_mz_nonlinearity[2][1] + clientObject.partial_activity_around_z_positive_slippage = rotational_release_mz_nonlinearity[2][2] + + elif rotational_release_mz_nonlinearity[0].name == "NONLINEARITY_TYPE_DIAGRAM": + clientObject.moment_release_my_nonlinearity = rotational_release_mz_nonlinearity[0].name + clientObject.diagram_around_z_start = rotational_release_mz_nonlinearity[1][0].name + clientObject.diagram_around_z_end = rotational_release_mz_nonlinearity[1][1].name + + for i,j in enumerate(rotational_release_mz_nonlinearity[1][2]): + mlvlp = Model.clientModel.factory.create('ns0:member_hinge_diagram_around_z_table') + mlvlp.no = i+1 + mlvlp.displacement = rotational_release_mz_nonlinearity[1][2][i][0] + mlvlp.force = rotational_release_mz_nonlinearity[1][2][i][1] + mlvlp.spring = rotational_release_mz_nonlinearity[1][2][i][2] + mlvlp.note = None + + clientObject.diagram_around_z_table.member_hinge_diagram_around_z_table.append(mlvlp) + + # Comment + clientObject.comment = comment + + # Adding optional parameters via dictionary + if params: + for key in params: + clientObject[key] = params[key] + + # Add Line to client model + model.clientModel.service.set_member_hinge(clientObject) diff --git a/RFEM/TypesForMembers/memberNonlinearity.py b/RFEM/TypesForMembers/memberNonlinearity.py index a091afb8..e8ff931f 100644 --- a/RFEM/TypesForMembers/memberNonlinearity.py +++ b/RFEM/TypesForMembers/memberNonlinearity.py @@ -1,11 +1,25 @@ -from RFEM.initModel import Model, clearAtributes +from pytest import param +from RFEM.enums import MemberNonlinearityType +from RFEM.initModel import ConvertToDlString, Model, clearAtributes class MemberNonlinearity(): def __init__(self, no: int = 1, + members: str = "", + nonlinearity_type = MemberNonlinearityType.TYPE_FAILURE_IF_TENSION, + parameters = None, comment: str = '', params: dict = None, model = Model): + """ + Args: + no (int): Member Nonlinearity Tag + members (str): Assigned Members + nonlinearity_type (enum): Nonlinearity Type Enumeration Item + parameters (list): Nonlinearity Parameters + comment (str, optional): Comment + params (dict, optional): Parameters + """ # Client model | Member Nonlinearity clientObject = model.clientModel.factory.create('ns0:member_nonlinearity') @@ -16,6 +30,25 @@ def __init__(self, # Member Nonlinearity No. clientObject.no = no + # Assigned Members + clientObject.assigned_to = ConvertToDlString(members) + + # Nonlinearity Type and Parameters + clientObject.type = nonlinearity_type.name + + if nonlinearity_type.name == "TYPE_FAILURE_IF_TENSION_WITH_SLIPPAGE" or nonlinearity_type.name == "TYPE_FAILURE_IF_COMPRESSION_WITH_SLIPPAGE" or nonlinearity_type.name == "TYPE_SLIPPAGE": + clientObject.slippage = parameters[0] + + elif nonlinearity_type.name == "TYPE_TEARING_IF_TENSION" or nonlinearity_type.name == "TYPE_YIELDING_IF_TENSION": + clientObject.tension_force = parameters[0] + + elif nonlinearity_type.name == "TYPE_TEARING_IF_COMPRESSION" or nonlinearity_type.name == "TYPE_YIELDING_IF_COMPRESSION": + clientObject.compression_force = parameters[0] + + elif nonlinearity_type.name == "TYPE_TEARING" or nonlinearity_type.name == "TYPE_YIELDING": + clientObject.compression_force = parameters[0] + clientObject.tension_force = parameters[1] + # Comment clientObject.comment = comment diff --git a/RFEM/TypesForMembers/memberResultIntermediatePoints.py b/RFEM/TypesForMembers/memberResultIntermediatePoints.py index d9359dc4..e5ae9ba5 100644 --- a/RFEM/TypesForMembers/memberResultIntermediatePoints.py +++ b/RFEM/TypesForMembers/memberResultIntermediatePoints.py @@ -1,11 +1,25 @@ -from RFEM.initModel import Model, clearAtributes +from RFEM.initModel import ConvertToDlString, Model, clearAtributes class MemberResultIntermediatePoint(): def __init__(self, no: int = 1, + members: str = "", + point_count: int = 2, + uniform_distribution: bool = True, + distances = None, comment: str = '', params: dict = None, model = Model): + """ + Args: + no (int): Member Result Intermediate Point Tag + members (str): Assigned Members + point_count (int): Assigned Point Number + uniform_distribution (bool): Uniform Distrubition Option + distances (list): Distances Table + comment (str, optional): Comment + params (dict, optional): Parameters + """ # Client model | Member Result Intermediate Point clientObject = model.clientModel.factory.create('ns0:member_result_intermediate_point') @@ -16,6 +30,25 @@ def __init__(self, # Member Result Intermediate Point No. clientObject.no = no + # Assigned Members + clientObject.members = ConvertToDlString(members) + + # Point Count + clientObject.uniform_distribution = uniform_distribution + if uniform_distribution: + clientObject.point_count = point_count + + else: + clientObject.distances = Model.clientModel.factory.create('ns0:member_result_intermediate_point.distances') + + for i,j in enumerate(distances): + mlvlp = Model.clientModel.factory.create('ns0:member_result_intermediate_point_distances') + mlvlp.no = i+1 + mlvlp.value = distances[i][0] + mlvlp.note = None + + clientObject.distances.member_result_intermediate_point_distances.append(mlvlp) + # Comment clientObject.comment = comment diff --git a/RFEM/TypesForMembers/memberStiffnessModification.py b/RFEM/TypesForMembers/memberStiffnessModification.py index d44047d2..e5ae4e4b 100644 --- a/RFEM/TypesForMembers/memberStiffnessModification.py +++ b/RFEM/TypesForMembers/memberStiffnessModification.py @@ -1,14 +1,46 @@ -from RFEM.initModel import Model, clearAtributes +from pytest import param +from RFEM.enums import MemberStiffnessModificationType +from RFEM.initModel import ConvertToDlString, Model, clearAtributes class MemberStiffnessModification(): def __init__(self, no: int = 1, + assigned_structure_modification: str = "", + modification_type = MemberStiffnessModificationType.TYPE_TOTAL_STIFFNESSES_FACTORS, + parameters = [1.0], comment: str = '', params: dict = None, model = Model): + """ + Args: + no (int): Modification Tag + assigned_structure_modification (str): Assigned Structure Modification + modification_type (enum): Member Stiffness Modification Type Enumeration Item + parameters (list): + if modification_type == "TYPE_TOTAL_STIFFNESSES_FACTORS": + parameters = [total_stiffness_factor] + elif modification_type == "TYPE_PARTIAL_STIFFNESSES_FACTORS": + parameters = [factor_of_axial_stiffness, factor_of_bending_y_stiffness, factor_of_bending_z_stiffness, + partial_stiffness_factor_of_shear_y_stiffness, partial_stiffness_factor_of_shear_z_stiffness, + partial_stiffness_factor_of_torsion_stiffness, partial_stiffness_factor_of_weight] + elif modification_type == "TYPE_CONCRETE_STRUCTURES_ACI": + parameters = [concrete_structure_component_type, factor_of_axial_stiffness, + factor_of_bending_y_stiffness, factor_of_bending_z_stiffness] + elif modification_type == "TYPE_CONCRETE_STRUCTURES_CSA": + parameters = [concrete_structure_component_type, factor_of_axial_stiffness, + factor_of_bending_y_stiffness, factor_of_bending_z_stiffness] + elif modification_type = "TYPE_STEEL_STRUCTURES": + parameters = [steel_structure_determine_tau_b, steel_structure_design_method] + elif modification_type = "TYPE_STEEL_STRUCTURES_CSA": + parameters = [steel_structure_csa_determine_tau_b, factor_of_axial_stiffness, factor_of_bending_z_stiffness, + steel_structure_csa_stiffness_factor_of_shear_y_stiffness, steel_structure_csa_stiffness_factor_of_shear_z_stiffness, + steel_structure_csa_stiffness_factor_of_torsion_stiffness] + comment (str, optional): Comments + params (dict, optional): Parameters + """ # Client model | Member Stiffness Modification - clientObject = model.clientModel.factory.create('ns0:smember_stiffness_modification') + clientObject = model.clientModel.factory.create('ns0:member_stiffness_modification') # Clears object atributes | Sets all atributes to None clearAtributes(clientObject) @@ -16,6 +48,54 @@ def __init__(self, # Member Stiffness Modification No. clientObject.no = no + # Structure Modification Assignment + clientObject.assigned_to_structure_modification = ConvertToDlString(assigned_structure_modification) + + # Stiffness Modification Type + clientObject.type = modification_type.name + + if modification_type.name == "TYPE_TOTAL_STIFFNESSES_FACTORS": + clientObject.factor_of_axial_stiffness = parameters[0] + clientObject.factor_of_bending_y_stiffness = parameters[0] + clientObject.factor_of_bending_z_stiffness = parameters[0] + clientObject.total_stiffness_factor_of_total_stiffness = parameters[0] + + elif modification_type.name == "TYPE_PARTIAL_STIFFNESSES_FACTORS": + clientObject.factor_of_axial_stiffness = parameters [0] + clientObject.factor_of_bending_y_stiffness = parameters [2] + clientObject.factor_of_bending_z_stiffness = parameters [3] + clientObject.partial_stiffness_factor_of_shear_y_stiffness = parameters [4] + clientObject.partial_stiffness_factor_of_shear_z_stiffness = parameters [5] + clientObject.partial_stiffness_factor_of_torsion_stiffness = parameters [6] + clientObject.partial_stiffness_factor_of_weight = parameters [7] + + elif modification_type.name == "TYPE_CONCRETE_STRUCTURES_ACI": + clientObject.concrete_structure_component_type = parameters[0].name + clientObject.factor_of_axial_stiffness = parameters[1] + clientObject.factor_of_bending_y_stiffness = parameters[2] + clientObject.factor_of_bending_z_stiffness = parameters[3] + + elif modification_type.name == "TYPE_CONCRETE_STRUCTURES_CSA": + clientObject.concrete_structure_component_type = parameters[0].name + clientObject.factor_of_axial_stiffness = parameters[1] + clientObject.factor_of_bending_y_stiffness = parameters[2] + clientObject.factor_of_bending_z_stiffness = parameters[3] + + elif modification_type.name == "TYPE_STEEL_STRUCTURES": + clientObject.steel_structure_determine_tau_b = parameters[0] + + if parameters[0] == "ITERATIVE": + clientObject.steel_structure_design_method = parameters[1] + + elif modification_type.name == "TYPE_STEEL_STRUCTURES_CSA": + clientObject.steel_structure_csa_determine_tau_b = parameters[0].name + clientObject.factor_of_axial_stiffness = parameters[1] + clientObject.factor_of_bending_y_stiffness = parameters[2] + clientObject.factor_of_bending_z_stiffness = parameters[3] + clientObject.steel_structure_csa_stiffness_factor_of_shear_y_stiffness = parameters[4] + clientObject.steel_structure_csa_stiffness_factor_of_shear_z_stiffness = parameters[5] + clientObject.steel_structure_csa_stiffness_factor_of_torsion_stiffness = parameters[6] + # Comment clientObject.comment = comment diff --git a/RFEM/TypesForMembers/memberSupport.py b/RFEM/TypesForMembers/memberSupport.py index 63576646..19a1fb9d 100644 --- a/RFEM/TypesForMembers/memberSupport.py +++ b/RFEM/TypesForMembers/memberSupport.py @@ -1,11 +1,35 @@ -from RFEM.initModel import Model, clearAtributes +from RFEM.enums import MemberSupportNonlinearity +from RFEM.initModel import ConvertToDlString, Model, clearAtributes +from RFEM.dataTypes import inf class MemberSupport(): def __init__(self, no: int = 1, + members: str = '', + spring_translation_x = 0.0, + spring_translation_y = 0.0, + spring_translation_z = [inf, MemberSupportNonlinearity.NONLINEARITY_NONE], + spring_rotation = 0.0, + spring_shear_x = 0.0, + spring_shear_y = 0.0, + spring_shear_z = 0.0, comment: str = '', params: dict = None, model = Model): + """ + Args: + no (int): Member Support Tag + members (str): Assigned Members + spring_translation_x (float): Translational X Spring Constant + spring_translation_y (float): Translational Y Spring Constant + spring_translation_z (list): [Translational Z Spring Constant, Nonlinearity Type] + spring_rotation (float): Rotational Spring Constant + spring_shear_x (float): Shear X Spring Constant + spring_shear_y (float): Shear Y Spring Constant + spring_shear_z (float): Shear Z Spring Constant + comment (str, optional): Comment + params (dict, optional): Parameters + """ # Client model | Member Support clientObject = model.clientModel.factory.create('ns0:member_support') @@ -16,6 +40,21 @@ def __init__(self, # Member Support No. clientObject.no = no + # Assigned Members + clientObject.members = ConvertToDlString(members) + + # Spring Translation + clientObject.spring_rotation = spring_rotation + clientObject.spring_translation_x = spring_translation_x + clientObject.spring_translation_y = spring_translation_y + clientObject.spring_translation_z = spring_translation_z[0] + clientObject.nonlinearity = spring_translation_z[1].name + + # Spring Shear + clientObject.spring_shear_x = spring_shear_x + clientObject.spring_shear_y = spring_shear_y + clientObject.spring_shear_z = spring_shear_z + # Comment clientObject.comment = comment diff --git a/RFEM/enums.py b/RFEM/enums.py index 990f2815..cc993d3b 100644 --- a/RFEM/enums.py +++ b/RFEM/enums.py @@ -1942,3 +1942,98 @@ class DesignSituationType(Enum): DESIGN_SITUATION_TYPE_ULS_STR_GEO_PERMANENT_AND_TRANSIENT, DESIGN_SITUATION_TYPE_ULTIMATE_LIMIT_STATE, DESIGN_SITUATION_TYPE_ULTIMATE_LIMIT_STATE_1, DESIGN_SITUATION_TYPE_ULTIMATE_LIMIT_STATE_2, DESIGN_SITUATION_TYPE_ULTIMATE_LIMIT_STATE_3, DESIGN_SITUATION_TYPE_ULTIMATE_LIMIT_STATE_4, DESIGN_SITUATION_TYPE_ULTIMATE_LIMIT_STATE_5, \ DESIGN_SITUATION_TYPE_UPL_ACCIDENTAL_PSI_1_1, DESIGN_SITUATION_TYPE_UPL_ACCIDENTAL_PSI_2_1, DESIGN_SITUATION_TYPE_UPL_PERMANENT_AND_TRANSIENT, DESIGN_SITUATION_TYPE_UPL_SEISMIC = range( 387) + +class MemberEccentricityHorizontalSectionAlignment(Enum): + ''' + Member Eccentricity Horizontal Section Alignment + ''' + ALIGN_LEFT, ALIGN_MIDDLE, ALIGN_RIGHT = range(3) + +class MemberEccentricitySpecificationType(Enum): + ''' + Member Eccentricity Specification Type + ''' + TYPE_ABSOLUTE, TYPE_RELATIVE, TYPE_RELATIVE_AND_ABSOLUTE = range(3) + +class MemberEccentricityTransverseOffsetType(Enum): + ''' + Member Eccentricity Transverse Offset Reference Type + ''' + TRANSVERSE_OFFSET_TYPE_FROM_MEMBER_SECTION, TRANSVERSE_OFFSET_TYPE_FROM_SURFACE_THICKNESS, TRANSVERSE_OFFSET_TYPE_NONE = range(3) + +class MemberEccentricityTransverseOffsetHorizontalAlignment(Enum): + ''' + Member Eccentricity Transverse Offset Horizontal Alignment + ''' + ALIGN_LEFT, ALIGN_MIDDLE, ALIGN_RIGHT = range(3) + +class MemberEccentricityTransverseOffsetVerticalAlignment(Enum): + ''' + Member Eccentricity Transverse Vertical Alignment + ''' + ALIGN_BOTTOM, ALIGN_MIDDLE, ALIGN_TOP = range(3) + +class MemberEccentricityVerticalSectionAlignment(Enum): + ''' + Member Eccentricity Vertical Section Alignment + ''' + ALIGN_BOTTOM, ALIGN_MIDDLE, ALIGN_TOP = range(3) + +class MemberHingeNonlineartiy(Enum): + ''' + Member Hinge Nonlineartiy + ''' + NONLINEARITY_TYPE_DIAGRAM, NONLINEARITY_TYPE_FAILURE_ALL_IF_NEGATIVE, NONLINEARITY_TYPE_FAILURE_ALL_IF_POSITIVE, NONLINEARITY_TYPE_FAILURE_IF_NEGATIVE, \ + NONLINEARITY_TYPE_FAILURE_IF_POSITIVE, NONLINEARITY_TYPE_FORCE_MOMENT_DIAGRAM, NONLINEARITY_TYPE_FRICTION_DIRECTION_1, NONLINEARITY_TYPE_FRICTION_DIRECTION_1_2, \ + NONLINEARITY_TYPE_FRICTION_DIRECTION_1_PLUS_2, NONLINEARITY_TYPE_FRICTION_DIRECTION_2, NONLINEARITY_TYPE_NONE, NONLINEARITY_TYPE_PARTIAL_ACTIVITY, \ + NONLINEARITY_TYPE_PLASTIC_BILINEAR, NONLINEARITY_TYPE_PLASTIC_DIAGRAM, NONLINEARITY_TYPE_PLASTIC_FEMA_356_ELASTIC, NONLINEARITY_TYPE_PLASTIC_FEMA_356_RIGID, \ + NONLINEARITY_TYPE_STIFFNESS_DIAGRAM = range(17) + +class MemberHingeDiagramType(Enum): + ''' + Member Hinge Diagram Type + ''' + DIAGRAM_ENDING_TYPE_CONTINUOUS, DIAGRAM_ENDING_TYPE_STOP, DIAGRAM_ENDING_TYPE_TEARING, DIAGRAM_ENDING_TYPE_YIELDING = range(4) + +class MemberHingePartialActivityType(Enum): + ''' + Member Hinge Partial Activity Type + ''' + PARTIAL_ACTIVITY_TYPE_COMPLETE, PARTIAL_ACTIVITY_TYPE_FIXED, PARTIAL_ACTIVITY_TYPE_INEFFECTIVNESS, PARTIAL_ACTIVITY_TYPE_TEARING, PARTIAL_ACTIVITY_TYPE_YIELDING = range(5) + +class MemberNonlinearityType(Enum): + ''' + Member Nonlinearity Type + ''' + TYPE_FAILURE_IF_COMPRESSION, TYPE_FAILURE_IF_COMPRESSION_WITH_SLIPPAGE, TYPE_FAILURE_IF_TENSION, TYPE_FAILURE_IF_TENSION_WITH_SLIPPAGE, \ + TYPE_SLIPPAGE, TYPE_TEARING, TYPE_TEARING_IF_COMPRESSION, TYPE_TEARING_IF_TENSION, TYPE_YIELDING, TYPE_YIELDING_IF_COMPRESSION, TYPE_YIELDING_IF_TENSION = range(11) + +class MemberStiffnessModificationType(Enum): + ''' + Member Stiffness Modification Type + ''' + TYPE_CONCRETE_STRUCTURES_ACI, TYPE_CONCRETE_STRUCTURES_CSA, TYPE_PARTIAL_STIFFNESSES_FACTORS, TYPE_STEEL_STRUCTURES, TYPE_STEEL_STRUCTURES_CSA, TYPE_TOTAL_STIFFNESSES_FACTORS = range(6) + +class MemberStiffnessModificationSteelTaub(Enum): + ''' + Member Stiffness Modification Steel Structure tau_b Determination + ''' + ITERATIVE, SET_TO_1 = range(2) + +class MemberStiffnessModificationSteelDesignMethod(Enum): + ''' + Member Stiffness Modification Steel Structure Design Method + ''' + ASD, LRFD = range(2) + +class MemberStiffnessModificationConcreteComponentType(Enum): + ''' + Member Stiffness Modification Concrete Structure Component Type + ''' + COMPONENT_TYPE_BEAMS, COMPONENT_TYPE_COLUMNS = range(2) + +class MemberSupportNonlinearity(Enum): + ''' + Member Support Nonlinearity + ''' + NONLINEARITY_FAILURE_IF_NEGATIVE_CONTACT_STRESS_Z, NONLINEARITY_FAILURE_IF_POSITIVE_CONTACT_STRESS_Z, NONLINEARITY_NONE = range(3) diff --git a/UnitTests/test_typesForMembers.py b/UnitTests/test_typesForMembers.py new file mode 100644 index 00000000..f9779e71 --- /dev/null +++ b/UnitTests/test_typesForMembers.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sys +import os +PROJECT_ROOT = os.path.abspath(os.path.join( + os.path.dirname(__file__), + os.pardir) +) +sys.path.append(PROJECT_ROOT) + +## Import the relevant Libraries +from RFEM.enums import * +from RFEM.initModel import Model +from RFEM.TypesForMembers.memberHinge import MemberHinge +from RFEM.TypesForMembers.memberResultIntermediatePoints import MemberResultIntermediatePoint +from RFEM.TypesForMembers.memberSupport import MemberSupport +from RFEM.dataTypes import inf +from RFEM.TypesForMembers.memberDefinableStiffness import MemberDefinableStiffness +from RFEM.TypesForMembers.memberEccentricity import MemberEccentricity +from RFEM.TypesForMembers.memberNonlinearity import MemberNonlinearity +from RFEM.TypesForMembers.memberStiffnessModification import MemberStiffnessModification + +if Model.clientModel is None: + Model() + +def test_memberDefinableStiffness(): + + Model.clientModel.service.delete_all() + Model.clientModel.service.begin_modification() + + MemberDefinableStiffness(1, [False], "", 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12) + + memberStiffness_1 = Model.clientModel.service.get_member_definable_stiffness(1) + + assert memberStiffness_1.torsional_stiffness == 1 + Model.clientModel.service.finish_modification() + +def test_memberEccentricity(): + + Model.clientModel.service.delete_all() + Model.clientModel.service.begin_modification() + + MemberEccentricity() + + memberEccentricitiy_1 = Model.clientModel.service.get_member_eccentricity(1) + + assert memberEccentricitiy_1.specification_type == "TYPE_RELATIVE" + Model.clientModel.service.finish_modification() + +def test_memberHinge(): + + Model.clientModel.service.delete_all() + Model.clientModel.service.begin_modification() + + MemberHinge(1, "Local", "", 4000, translational_release_n_nonlinearity=[MemberHingeNonlineartiy.NONLINEARITY_TYPE_PARTIAL_ACTIVITY, [MemberHingePartialActivityType.PARTIAL_ACTIVITY_TYPE_COMPLETE, 8000], [MemberHingePartialActivityType.PARTIAL_ACTIVITY_TYPE_COMPLETE, 9000]]) + MemberHinge(2, "Local", "", 2000, translational_release_n_nonlinearity=[MemberHingeNonlineartiy.NONLINEARITY_TYPE_FRICTION_DIRECTION_1, [0.5]]) + MemberHinge(3, "Local", "", translational_release_vy=0, translational_release_vy_nonlinearity=[MemberHingeNonlineartiy.NONLINEARITY_TYPE_DIAGRAM, [MemberHingeDiagramType.DIAGRAM_ENDING_TYPE_CONTINUOUS, MemberHingeDiagramType.DIAGRAM_ENDING_TYPE_CONTINUOUS, [[1,2, 3], [3,4, 5]]]]) + MemberHinge(4, "Local", "", translational_release_vz=0, translational_release_vz_nonlinearity=[MemberHingeNonlineartiy.NONLINEARITY_TYPE_PARTIAL_ACTIVITY, [MemberHingePartialActivityType.PARTIAL_ACTIVITY_TYPE_FIXED, 0.004], [MemberHingePartialActivityType.PARTIAL_ACTIVITY_TYPE_FIXED, 0.005]]) + + memberHinge_1 = Model.clientModel.service.get_member_hinge(1) + memberHinge_2 = Model.clientModel.service.get_member_hinge(2) + memberHinge_3 = Model.clientModel.service.get_member_hinge(3) + memberHinge_4 = Model.clientModel.service.get_member_hinge(4) + + assert memberHinge_1.no == 1 + assert memberHinge_2.axial_release_n == 2000 + assert memberHinge_3.axial_release_vy_nonlinearity == "NONLINEARITY_TYPE_DIAGRAM" + assert memberHinge_4.axial_release_vy == inf + + Model.clientModel.service.finish_modification() + +def test_memberNonlinearity(): + + Model.clientModel.service.delete_all() + Model.clientModel.service.begin_modification() + + MemberNonlinearity() + + memberNonlinearity_1 = Model.clientModel.service.get_member_nonlinearity(1) + + assert memberNonlinearity_1.type == "TYPE_FAILURE_IF_TENSION" + Model.clientModel.service.finish_modification() + +def test_memberResultIntermediatePoint(): + + Model.clientModel.service.delete_all() + Model.clientModel.service.begin_modification() + + MemberResultIntermediatePoint(1, "", 5) + + memberResultIntermediatePoint_1 = Model.clientModel.service.get_member_result_intermediate_point(1) + + assert memberResultIntermediatePoint_1.point_count == 5 + Model.clientModel.service.finish_modification() + +def test_memberStiffnessModification(): + + Model.clientModel.service.delete_all() + Model.clientModel.service.begin_modification() + + MemberStiffnessModification() + + memberStiffnessModification_1 = Model.clientModel.service.get_member_stiffness_modification(1) + + assert memberStiffnessModification_1.factor_of_bending_z_stiffness == 1 + Model.clientModel.service.finish_modification() + +def test_memberSupport(): + + Model.clientModel.service.delete_all() + Model.clientModel.service.begin_modification() + + MemberSupport() + MemberSupport(2, '', 1,2, [inf, MemberSupportNonlinearity.NONLINEARITY_FAILURE_IF_NEGATIVE_CONTACT_STRESS_Z], 3, 4, 5, 6) + + memberSupport_1 = Model.clientModel.service.get_member_support(1) + memberSupport_2 = Model.clientModel.service.get_member_support(2) + + assert memberSupport_1.no == 1 + assert memberSupport_2.spring_translation_y == 2 + + Model.clientModel.service.finish_modification() +