Frame#

../../_images/frame.png

In this example we will demonstrate:

  • Connecting to RFEM and creating new model

  • Apply loads and generate combinations

  • Read model object data

Read the comments for detailed instructions.

from dlubal.api import rfem


def define_structure() -> list:
    """Define and return a list of structural objects."""

    inf = float('inf')

    return [
        # Define material
        rfem.structure_core.Material(no=1, name='S235'),

        # Define section
        rfem.structure_core.Section(no=1, name='HE 200 A', material=1),

        # Define nodes
        rfem.structure_core.Node(no=1),
        rfem.structure_core.Node(no=2, coordinate_3=-3.0),
        rfem.structure_core.Node(no=3, coordinate_1=4.0, coordinate_3=-3.0),
        rfem.structure_core.Node(no=4, coordinate_1=4.0),

        # Define line
        rfem.structure_core.Line(no=1, definition_nodes=[1, 2]),
        rfem.structure_core.Line(no=2, definition_nodes=[2, 3]),
        rfem.structure_core.Line(no=3, definition_nodes=[3, 4]),

        # Define member
        rfem.structure_core.Member(no=1, line=1, section_start=1),
        rfem.structure_core.Member(no=2, line=2, section_start=1),
        rfem.structure_core.Member(no=3, line=3, section_start=1),

        # Define nodal support at Node 1 (fully fixed)
        rfem.types_for_nodes.NodalSupport(
            no=1,
            nodes=[1,4],
            spring_x=inf, spring_y=inf, spring_z=inf,
            rotational_restraint_x=inf,
            rotational_restraint_y=inf,
            rotational_restraint_z=inf
        ),
    ]


def define_loads() -> list:
    """Define and return a list of loading objects."""

    return [
        # Static analysis settings
        rfem.loading.StaticAnalysisSettings(
            no=1,
            analysis_type=rfem.loading.StaticAnalysisSettings.ANALYSIS_TYPE_GEOMETRICALLY_LINEAR,
        ),

        # Define load cases
        rfem.loading.LoadCase(
            no=1,
            name='Self-weight',
            self_weight_active=True,
            static_analysis_settings=1,
        ),
        rfem.loading.LoadCase(
            no=2,
            name='Snow',
            action_category=rfem.loading.Action.ACTION_CATEGORY_SNOW_ICE_LOADS_H_LESS_OR_EQUAL_TO_1000_M_QS,
            static_analysis_settings=1,
        ),
        rfem.loading.LoadCase(
            no=3,
            name='Wind +x',
            action_category=rfem.loading.Action.ACTION_CATEGORY_WIND_QW,
            static_analysis_settings=1,
        ),
        rfem.loading.LoadCase(
            no=4,
            name='Wind +x, with wind suction',
            action_category=rfem.loading.Action.ACTION_CATEGORY_WIND_QW,
            static_analysis_settings=1,
        ),
        rfem.loading.LoadCase(
            no=5,
            name='Wind -x',
            action_category=rfem.loading.Action.ACTION_CATEGORY_WIND_QW,
            static_analysis_settings=1,
        ),
        rfem.loading.LoadCase(
            no=6,
            name='Wind -x, with wind suction',
            action_category=rfem.loading.Action.ACTION_CATEGORY_WIND_QW,
            static_analysis_settings=1,
        ),

        # Define loads
        rfem.loads.MemberLoad(
            no=1,
            load_case=1,
            members=[2],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=1000
        ),
        rfem.loads.MemberLoad(
            no=2,
            load_case=2,
            members=[2],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=3000
        ),
        rfem.loads.MemberLoad(
            no=3,
            load_case=3,
            members=[1],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=2000,
            load_direction=rfem.loads.MemberLoad.LOAD_DIRECTION_GLOBAL_X_OR_USER_DEFINED_U_TRUE,
        ),
        rfem.loads.MemberLoad(
            no=4,
            load_case=3,
            members=[3],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=1000,
            load_direction=rfem.loads.MemberLoad.LOAD_DIRECTION_GLOBAL_X_OR_USER_DEFINED_U_TRUE,
        ),
        rfem.loads.MemberLoad(
            no=5,
            load_case=4,
            members=[1],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=2000,
            load_direction=rfem.loads.MemberLoad.LOAD_DIRECTION_GLOBAL_X_OR_USER_DEFINED_U_TRUE,
        ),
        rfem.loads.MemberLoad(
            no=6,
            load_case=4,
            members=[3],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=1000,
            load_direction=rfem.loads.MemberLoad.LOAD_DIRECTION_GLOBAL_X_OR_USER_DEFINED_U_TRUE,
        ),
        rfem.loads.MemberLoad(
            no=7,
            load_case=4,
            members=[2],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=-500
        ),
        rfem.loads.MemberLoad(
            no=8,
            load_case=5,
            members=[1],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=-2000,
            load_direction=rfem.loads.MemberLoad.LOAD_DIRECTION_GLOBAL_X_OR_USER_DEFINED_U_TRUE,
        ),
        rfem.loads.MemberLoad(
            no=9,
            load_case=5,
            members=[3],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=-1000,
            load_direction=rfem.loads.MemberLoad.LOAD_DIRECTION_GLOBAL_X_OR_USER_DEFINED_U_TRUE,
        ),
        rfem.loads.MemberLoad(
            no=10,
            load_case=6,
            members=[1],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=-2000,
            load_direction=rfem.loads.MemberLoad.LOAD_DIRECTION_GLOBAL_X_OR_USER_DEFINED_U_TRUE,
        ),
        rfem.loads.MemberLoad(
            no=11,
            load_case=6,
            members=[3],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=-1000,
            load_direction=rfem.loads.MemberLoad.LOAD_DIRECTION_GLOBAL_X_OR_USER_DEFINED_U_TRUE,
        ),
        rfem.loads.MemberLoad(
            no=12,
            load_case=6,
            members=[2],
            load_type=rfem.loads.MemberLoad.LOAD_TYPE_FORCE,
            magnitude=-500
        ),
    ]


with rfem.Application() as rfem_app:

    # Step 1: Create a new model and clear existing objects
    rfem_app.create_model(name='frame')
    rfem_app.delete_all_objects()

    # Step 2: Define and create the structure and load objects
    objects = define_structure() + define_loads()  # Assuming these return lists of objects
    rfem_app.create_object_list(objects)

    # Step 3: Get and print all objects (using All as the filter)
    all_objects = rfem_app.get_object_list([rfem.All()])
    print("All objects in the model:")
    for obj in all_objects:
        print(f" {obj.DESCRIPTOR.name}, no={obj.no}")

    # Step 4: Get and print all objects of type 'Member'
    all_members = rfem_app.get_object_list([rfem.structure_core.Member()])
    print("\nAll members in the model:")
    for member in all_members:
        print(f" Member no={member.no}, length={member.length}")

    # Step 5: Get and print all member loads of a specific load case (load case 4)
    all_member_loads = rfem_app.get_object_list([rfem.loads.MemberLoad(load_case=4)])
    print(f"\nAll member loads for load case 4:\n")
    for member_load in all_member_loads:
        print(member_load)