# Schritt 1: Importieren der Bibliotheken
from RFEM.LoadCasesAndCombinations.loadCase import LoadCase
from RFEM.initModel import *
from RFEM.enums import *
from RFEM.BasicObjects.node import Node
from RFEM.BasicObjects.member import Member
from RFEM.BasicObjects.section import Section
from RFEM.BasicObjects.material import Material
from RFEM.TypesForNodes.nodalSupport import NodalSupport
from RFEM.LoadCasesAndCombinations.loadCase import LoadCase
from RFEM.LoadCasesAndCombinations.staticAnalysisSettings import StaticAnalysisSettings
from RFEM.Loads.nodalLoad import NodalLoad

# Schritt 2: Modell initialisieren
Model(new_model= True, model_name='Ebenes Fachwerk', delete= True, delete_all= True)
SetModelType(ModelType.E_MODEL_TYPE_2D_XZ_PLANE_STRESS)
Model.clientModel.service.begin_modification('new')

# Shritt 3: Knoten
l = 6
h = 1.75
n = 7

for i in range(1, n+1):

    x = l * (i-1) / (n-1)
    y = 0
    z = 0

    if i % 2 == 0:
        z = -h

    Node(i, x, y, z)

# Schritt 4: Material
Material(1, 'S235')

# Schritt 5: Querschnit
Section(1, 'MSH QHP 100x5', 1, 'Diagonalen')
Section(2, 'CHS 70x10', 1, 'Obergurt')
Section(3, 'MSH QHP 100x5', 1, 'Untergurt')

# Schritt 6: Stäbe
j = 0

for i in range(1, n+1):
    j += 1

    if i % 2 != 0 and i != 7:
        Member.TrussOnlyN(j, i, i+1, section_no= 2)
        j += 1
        Member.TrussOnlyN(j, i, i+2, section_no= 3)

    elif i % 2 == 0 and i != 6:
        Member.TrussOnlyN(j, i, i+1, section_no= 2)
        j += 1
        Member.TrussOnlyN(j, i, i+2, section_no= 1)

    elif i == 6:
        Member.TrussOnlyN(j, i, i+1, section_no= 2)

# Schritt 7: Knotenlager zuweisen
NodalSupport(1, '1', NodalSupportType.HINGED)
NodalSupport(2, '7', NodalSupportType.ROLLER_IN_X)

# Schritt 8: Lastfall
LoadCase.StaticAnalysis(1, 'Eigengewicht')
LoadCase.StaticAnalysis(2, 'Vertikale Last', action_category=ActionCategoryType.ACTION_CATEGORY_PERMANENT_IMPOSED_GQ, self_weight=[False])
LoadCase.StaticAnalysis(3, 'Horizontale Last', action_category=ActionCategoryType.ACTION_CATEGORY_WIND_QW, self_weight=[False])

# Schritt 9: Knotenlast
Q = 5
NodalLoad(1, 2, '2 4 6', magnitude= Q*1000)
NodalLoad(2, 3, '2', LoadDirectionType.LOAD_DIRECTION_GLOBAL_X_OR_USER_DEFINED_U, 0.1*Q*1000)

# Schritt 10: Analysetyp / Statikanalyse-Einstellungen
StaticAnalysisSettings(1, 'Th. I. O.', StaticAnalysisType.GEOMETRICALLY_LINEAR)

# Schritt 11: Alles berechnen
Calculate_all()

# Schritt 12: Veränderungen beenden und speichern
Model.clientModel.service.finish_modification()