def results(): # add section data and loads of the dialog E = float(ui.editE.text()) I = float(ui.editI.text()) A = float(ui.editA.text()) ss = SystemElements() frame = FreeCAD.ActiveDocument.getObjectsByLabel( ui.comboBox.currentText())[0] sk = frame.Base for l in sk.Geometry: sp = [i * 1e-3 for i in list(l.StartPoint)[:2]] ep = [i * 1e-3 for i in list(l.EndPoint)[:2]] ss.add_element([sp, ep], EA=E * A, EI=E * I) for i in list(range(len(sk.Geometry))): if ui.table.item(i, 1): item = ui.table.item(i, 1) try: load = float(item.text()) ss.q_load(element_id=(i + 1), q=load) except: pass for i in list(range(ss.id_last_node)): if ui.table_2.item(i, 1): if ui.table_2.item(i, 1).text() == 'fix': ss.add_support_fixed(node_id=i + 1) elif ui.table_2.item(i, 1).text() == 'hinge': ss.add_support_hinged(node_id=i + 1) elif ui.table_2.item(i, 1).text() == 'roll': ss.add_support_roll(node_id=i + 1) ss.solve() ss.show_results()
def test_timoshenko_discrete(): system = SystemElements() system.add_element(location=[[0.25, 0]], EA=1.4e8, EI=1.167e5, GA=0.8333 * 8.75e6) system.add_element(location=[[0.5, 0]], EA=1.4e8, EI=1.167e5, GA=0.8333 * 8.75e6) system.add_element(location=[[0.75, 0]], EA=1.4e8, EI=1.167e5, GA=0.8333 * 8.75e6) system.add_element(location=[[1, 0]], EA=1.4e8, EI=1.167e5, GA=0.8333 * 8.75e6) system.q_load(element_id=1, q=5000, direction="y") system.q_load(element_id=2, q=5000, direction="y") system.q_load(element_id=3, q=5000, direction="y") system.q_load(element_id=4, q=5000, direction="y") system.add_support_hinged(node_id=1) system.add_support_roll(node_id=5) system.solve() assert np.isclose(abs(system.system_displacement_vector[7]), 6.44e-4, rtol=1e-2)
def redraw(): frame = FreeCAD.ActiveDocument.getObjectsByLabel( ui.comboBox.currentText())[0] print(frame.Label) sk = frame.Base print('\tBase: ' + sk.Label) A = frame.Profile.Shape.Area * 1e-6 I = frame.Profile.Shape.MatrixOfInertia.multiply(X).dot(X) * 1e-12 ss = SystemElements() for l in sk.Geometry: sp = [i * 1e-3 for i in list(l.StartPoint)[:2]] ep = [i * 1e-3 for i in list(l.EndPoint)[:2]] ss.add_element([sp, ep], EA=E * A, EI=E * I) print('\tNodes: %i\n\tElements: %i\n\n' % (ss.id_last_node, ss.id_last_element)) ss.show_structure() ui.editE.setText(str(E)) ui.editA.setText(str(A)) ui.editI.setText(str(I)) n = len(sk.Geometry) ui.table.setRowCount(n) for i in list(range(n)): item = QtGui.QTableWidgetItem('%.1f m' % (sk.Geometry[i].length() / 1000)) ui.table.setItem(i, 0, item) ui.table.setItem(3, 1, QtGui.QTableWidgetItem('-2000')) #for test ui.table.setItem(4, 1, QtGui.QTableWidgetItem('-1000')) #for test ui.table_2.setRowCount(ss.id_last_node) for i in list(range(ss.id_last_node)): ui.table_2.setItem( i, 0, QtGui.QTableWidgetItem('%.2f, %.2f' % ss.nodes_range('both')[i])) ui.table_2.setItem(0, 1, QtGui.QTableWidgetItem('fix')) #for test ui.table_2.setItem(3, 1, QtGui.QTableWidgetItem('roll')) #for test ui.table_2.setItem(5, 1, QtGui.QTableWidgetItem('hinge')) #for test
def solve(self): from anastruct import SystemElements ss = SystemElements() ss.solve() ss.show_structure() ss.show_reaction_force() ss.show_bending_moment()
def __init__(self, main_window, main_window_functions): self.mw = main_window self.fn = main_window_functions self.ss = SystemElements() self.ss.color_scheme = "dark" self.was_solved = False self.states = []
def makestructure(nodes, segs, fixednodes, loadnodes, thicknesses, tensile=tensilePLA, totalload=100): ss = SystemElements() #loop through segments and create them for s, thickness in zip(segs, thicknesses): ss.add_truss_element(location=[nodes[s[0]], nodes[s[1]]], EA=tensile * thickness * strutwidth, g=0, spring={ 1: 0.0001, 2: 0.0001 }) # for f, supporttype in fixednodes: if supporttype == 'hinged': ss.add_support_hinged(node_id=f + 1) elif supporttype == 'roll': ss.add_support_roll(node_id=f + 1, direction='x') elif supporttype == 'fixed': ss.add_support_fixed(node_id=f + 1) #add in other types of supports here for l in loadnodes: ss.point_load(l + 1, Fx=0, Fy=-totalload / len(loadnodes)) return ss
def generate_truss_by_grid(grid, enabled): """ enabled is a list of booleans indicating which members in the grid are enabled. Length must match the total possible members in the grid """ enabled = np.array(enabled) width = MIN_WIDTH / 2 height = MAX_HEIGHT all_possible_members = grid # print(f"number of possible members: {len(all_possible_members)}") assert len(all_possible_members) == len(enabled) members = all_possible_members[enabled] print(f"members selected: {len(members)}") # mirror the members to the right side members_mirror = np.copy(members) for member in members_mirror: for point in member: point[0] *= -1 point[0] += width * 2 members = np.append(members, members_mirror, axis=0) truss = SystemElements(EA=MODULUS_OF_ELASTICITY * BRASS_CROSS_SECTION_AREA, EI=MODULUS_OF_ELASTICITY * MOMENT_OF_INERTIA) for member in members: truss.add_truss_element(member) try: truss.add_support_hinged(node_id=truss.find_node_id(vertex=[0, 0])) truss.add_support_hinged(node_id=truss.find_node_id( vertex=[width * 2, 0])) return truss except: return None
def redraw(self): for l in self.labNodes + self.labEl: l.removeLabel() if self.form.comboBox.currentText(): frame = FreeCAD.ActiveDocument.getObjectsByLabel( self.form.comboBox.currentText())[0] sk = frame.Base A = frame.Profile.Shape.Area I = frame.Profile.Shape.MatrixOfInertia.multiply(X).dot(X) ss = SystemElements() i = 1 for l in sk.Geometry: sp = [i * 1e-3 for i in list(l.StartPoint)[:2]] ep = [i * 1e-3 for i in list(l.EndPoint)[:2]] ss.add_element([sp, ep], EA=E * A * 1e-3, EI=E * I * 1e-9) p2 = FreeCAD.Placement() p2.Base = sk.Placement.multVec((l.StartPoint + l.EndPoint) / 2) self.labNodes.append( label3D(pl=p2, color=(0, 0.8, 0), text='____beam' + str(i))) i += 1 nodes = ss.nodes_range('both') coords = [ FreeCAD.Vector(n[0] * 1000, n[1] * 1000, 0) for n in nodes ] globalCoords = [sk.Placement.multVec(c) for c in coords] i = 1 for gc in globalCoords: self.labNodes.append( label3D(pl=FreeCAD.Placement(gc, FreeCAD.Rotation()), text='____node' + str(i))) i += 1 self.form.editE.setText(str(E)) self.form.editA.setText(str(A)) self.form.editI.setText(str(I)) n = len(sk.Geometry) self.form.tableDistrib.setRowCount(n) self.combotypes.clear() for i in list(range(n)): item = QTableWidgetItem('%.1f m' % (sk.Geometry[i].length() / 1000)) self.form.tableDistrib.setItem(i, 0, item) self.combotypes.append(QComboBox()) self.combotypes[-1].addItems(['beam', 'brace']) self.form.tableDistrib.setCellWidget(i, 1, self.combotypes[-1]) #self.form. tableDistrib.setItem(0,1,QTableWidgetItem('1000')) #for test self.form.table_2.setRowCount(ss.id_last_node) self.form.tableConc.setRowCount(ss.id_last_node) self.combos.clear() for i in list(range(ss.id_last_node)): self.form.table_2.setItem( i, 0, QTableWidgetItem('%.2f, %.2f' % ss.nodes_range('both')[i])) self.combos.append(QComboBox()) self.combos[-1].addItems(['-', 'fix', 'hinge', 'roll']) self.form.table_2.setCellWidget(i, 1, self.combos[-1]) self.form.tableConc.setItem( i, 0, QTableWidgetItem('%.2f, %.2f' % ss.nodes_range('both')[i]))
def element(self): x1 = float(self.x1value.text()) x2 = float(self.x2value.text()) y1 = float(self.y1value.text()) y2 = float(self.y2value.text()) from anastruct import SystemElements ss = SystemElements() ss.add_element(location=[[x1, y1], [x2, y2]]) ss.show_structure()
def reset_struct_elems(self): self.ss = SystemElements() self.ss.color_scheme = "dark" self.states.clear() self.mw.MplWidget.plot(has_grid=self.mw.gridBox.isChecked()) self.mw.MplWidget.set_background_alpha() self.mw.MplWidget.set_subplot_alpha() self.fn.figurefix() self.was_solved = False self.fn.disable_buttons()
def test_parallel_q_load(): system = SystemElements() system.add_element(location=[[0, 0], [1, 0]], EA=5e9, EI=8000) system.q_load(element_id=1, q=-10, direction="x") system.add_support_hinged(node_id=1) system.add_support_roll(node_id=2) system.solve() assert system.element_map[1].N_1 == -10 assert system.element_map[1].N_2 == 0
def __init__( self, system_elements, node_order=None, assemble_order=None, target_dir="tmp", ): self.ss = system_elements self.branch_ss = SystemElements() self.assemble_order = assemble_order self.node_order = node_order self.target_dir = target_dir
def test_linear_parallel_q_load(): system = SystemElements() system.add_element(location=[[0, 0], [1, 0]], EA=5e2, EI=800) system.add_element(location=[[1, 0], [2, 0]], EA=5e2, EI=800) system.q_load(element_id=1, q=10, q2=20, direction="x") system.add_support_hinged(node_id=1) system.add_support_roll(node_id=3) system.solve() assert np.isclose(system.reaction_forces[1].Fx, -15) assert np.isclose(np.max(system.system_displacement_vector), 0.01666667)
def test_bernoulli(): system = SystemElements() system.add_element(location=[[0, 0], [1, 0]], EA=1.4e8, EI=1.167e5) system.q_load(element_id=1, q=5000, direction="y") system.add_support_hinged(node_id=1) system.add_support_roll(node_id=2) system.solve() assert np.isclose(np.max(abs(system.element_map[1].deflection)), 5.58e-4, rtol=1e-2)
def test_linear_q_load(): system = SystemElements() system.add_element(location=[[0, 0], [1, 0]], EA=5e8, EI=800) system.add_element(location=[[1, 0], [2, 0]], EA=5e8, EI=800) system.q_load(element_id=1, q=-10, q2=-20, direction="y") system.add_support_hinged(node_id=1) system.add_support_roll(node_id=3) system.solve() assert np.isclose(np.max(abs(system.element_map[1].shear_force)), 10.87, rtol=1e-2) assert np.isclose(np.max(abs(system.element_map[2].shear_force)), 4.17, rtol=1e-2) assert np.isclose(np.max(abs(system.element_map[1].bending_moment)), 4.62, rtol=1e-2) assert np.isclose(np.max(abs(system.system_displacement_vector)), 3.7673e-3, rtol=1e-2)
def support(self): apoio = str(self.apoiobox.currentText()) pos = int(self.apoiopos.text()) from anastruct import SystemElements ss = SystemElements() if apoio == 'Fixo': ss.add_support_hinged(node_id=pos) elif apoio == 'Móvel': ss.add_support_roll(node_id=pos) elif apoio == 'Engaste': ss.add_support_fixed(node_id=pos) elif apoio == 'Mola': ss.add_support_spring(node_id=pos) ss.show_structure()
def build_struct(nodes): ss = SystemElements() for i in range(len(nodes) - 1): ss.add_element(location=[nodes[i], nodes[i + 1]]) ss.add_support_fixed(node_id=1) if nodes.count(end_xy) > 0: print("End point reached") ss.add_support_fixed(node_id=nodes.index(end_xy) + 1) ss.q_load(element_id=1, q=-1) ss.solve() ss.show_structure() ss.show_displacement()
def Beam_objective_funciton_BD(depths): #def fn(*args): #beam1 = Beam(depth,breadth,Asc,Ast,15,415,415,3.14*10**2/4,spacing); #beam1.moment_capcity() #beam1.min_spacing() #beam1.max_spacing() FS = SystemElements() # Add beams to the system. FS.add_element(location=[0, 5], EA=15000, EI=5000) FS.add_element(location=[[0, 5], [5, 5]], EA=15000, EI=5000) FS.add_element(location=[[5, 5], [5, 0]], EA=15000, EI=5000) # Add a fixed support at node 1. FS.add_support_fixed(node_id=1) # Add a rotational spring support at node 4. FS.add_support_spring(node_id=4, translation=3, k=4000) # Add loads. FS.point_load(Fx=30, node_id=2) FS.q_load(q=-10, element_id=2) FS.q_load(q=-10, element_id=1) #ss.q_load(q=-10, element_id=4) #print(ss.node_ranges()) # Solve FS.solve() FS.get_element_results(element_id=1)['length'] FS.get_element_results(element_id=1)['Mmin'] deno = FS.get_element_results(element_id=1)['Mmax'] #breadth = randgen(300,600) #Asc = 0 #Ast = 0 #spacing = 150 #beam = Beam(depth,breadth,Asc,Ast,15,415,415,3.14*10**2/4,spacing) #Asc = beam.p_min() #Ast = beam.p_min() #beam1 = Beam(depth,breadth,Asc,Ast,15,415,415,3.14*10**2/4,spacing) #beam1.moment_capcity() #beam1.min_spacing() #beam1.max_spacing() #print(beam1.moment_capcity()*10**(-3)) #print(FS.get_element_results(element_id=1)['Mmax']) res, depth_f = Beam_gene(depths, deno) C_D = res / deno #print() return C_D
def test_timoshenko_continuous(): system = SystemElements() system.add_element(location=[[0, 0], [1, 0]], EA=1.4e8, EI=1.167e5, GA=0.8333 * 8.75e6) system.q_load(element_id=1, q=5000, direction="y") system.add_support_hinged(node_id=1) system.add_support_roll(node_id=2) system.solve() assert np.isclose(np.max(abs(system.element_map[1].deflection)), 6.44e-4, rtol=1e-2)
def pressed(self): x1 = int(self.x1value.text()) x2 = int(self.x2value.text()) y1 = int(self.y1value.text()) y2 = int(self.y2value.text()) movel = (int(self.movelvalue.text())) fixo = (int(self.fixovalue.text())) from anastruct import SystemElements ss = SystemElements() ss.add_element(location=[[x1, y1], [x2, y2]]) ss.add_support_hinged(node_id=movel) ss.add_support_fixed(node_id=fixo) ss.q_load(element_id=1, q=-10) ss.solve() ss.show_structure() ss.show_reaction_force()
def test_moment_q_load(): system = SystemElements() start=0 step = 0.1 for i in range(20): system.add_element(location=[[start, 0], [start+step, 0]], EA=5e2, EI=800) start+=step system.q_moment(element_id=1+i, Ty=10) system.add_support_hinged(node_id=1) system.add_support_roll(node_id=21) system.solve() assert np.isclose(system.reaction_forces[1].Fz, 10)
def test_example(): system = SystemElements() system.add_element(location=[[0, 0], [3, 4]], EA=5e9, EI=8000) system.add_element(location=[[3, 4], [8, 4]], EA=5e9, EI=4000) system.q_load(element_id=2, q=-10) system.add_support_hinged(node_id=1) system.add_support_fixed(node_id=3) sol = np.fromstring( """0.00000000e+00 0.00000000e+00 1.30206878e-03 1.99999732e-08 5.24999402e-08 -2.60416607e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00""", float, sep=" ", ) system.solve assert np.allclose(system.solve(), sol)
def Beam_objective_funciton(breadth): depth = randgen(300,600) Asc = 0 Ast = 0 spacing = 150 beam = Beam(depth,breadth,Asc,Ast,15,415,415,3.14*10**2/4,spacing); Asc = beam.p_min Ast = beam.p_min beam1 = Beam(depth,breadth,Asc,Ast,15,415,415,3.14*10**2/4,spacing); beam1.moment_capcity() beam1.min_spacing() beam1.max_spacing() FS = SystemElements() # Add beams to the system. FS.add_element(location=[0, 5],EA=15000, EI=5000) FS.add_element(location=[[0, 5], [5, 5]],EA=15000, EI=5000) FS.add_element(location=[[5, 5], [5, 0]],EA=15000, EI=5000) # Add a fixed support at node 1. FS.add_support_fixed(node_id=1) # Add a rotational spring support at node 4. FS.add_support_spring(node_id=4, translation=3, k=4000) # Add loads. FS.point_load(Fx=30, node_id=2) FS.q_load(q=-10, element_id=2) FS.q_load(q=-10, element_id=1) #ss.q_load(q=-10, element_id=4) #print(ss.node_ranges()) # Solve FS.solve() FS.get_element_results(element_id=1)['length'] FS.get_element_results(element_id=1)['Mmin'] FS.get_element_results(element_id=1)['Mmax'] print(beam1.moment_capcity()*10**(-3)) print(FS.get_element_results(element_id=1)['Mmax'])
def test_moment_load_benchmark(): system = SystemElements() system.add_element(location=[[3.75, 0]], EA=5e12, EI=5e12) system.add_element(location=[[7.5,0]], EA=5e12, EI=5e12) system.q_moment(element_id=1, Ty=1.91) system.q_moment(element_id=2, Ty=1.91) system.q_load(element_id=1, q=3.62, direction="y") system.q_load(element_id=2, q=3.62, direction="y") system.add_support_spring(1, 2, 5) system.add_support_spring(2, 2, 2.5) system.add_support_spring(3, 2, 2.5) system.solve() assert np.isclose(np.max(abs(system.element_map[1].bending_moment)), 13.89,rtol=1e-2) assert np.isclose(system.reaction_forces[1].Fz, 11.93,rtol=1e-2)
def test_solve_modal_analysis(): system = SystemElements() l = 10 n = 50 subd = l / n for i in range(n): system.add_element(location=[[subd * i, 0], [subd * (i + 1), 0]], EA=5e8, EI=800, linear_density=10) system.add_support_hinged(node_id=1) system.add_support_roll(node_id=n + 1) natural_frequencies = system.solve_modal_analysis() def analytical_natural_frequencies(linear_density, l, EI, n): # See Rao, Singiresu S. - Vibration of continuous Systems - John Wiley & Sons (2019) - Section 11.5.1 return (n ** 2) * (np.pi ** 2) * np.sqrt(EI / (linear_density * l ** 4)) # retrieve fist four eigenvalues, as error incr6eases for higher eigenvalues for i in range(4): assert np.isclose(natural_frequencies[i], analytical_natural_frequencies(10, 10, 800, i + 1), rtol=1e-2)
def __init__(self, x, y, connections, loads, supports, density=880, unit='m', width=0.95 / 100, thick=1.8 / 1000, pop_compressive_strength=18100, pop_tensile_strength=70000): pop_cross_area = width * thick pop_mpl = pop_cross_area * density g = pop_mpl * 9.81 / 1000 unit_conv = 1 if (unit == 'cm'): unit_conv = (1 / 100) nodes = [[x[i] * unit_conv, y[i] * unit_conv] for i in range(len(x))] ss = SystemElements(EA=pop_cross_area * 8600000) for node1, node2 in connections: ss.add_element([nodes[node1], nodes[node2]], element_type='truss', g=g) for node in supports: id = ss.find_node_id(nodes[node]) ss.add_support_fixed(id) for node, load in loads: id = ss.find_node_id(nodes[node]) ss.point_load(id, Fy=-9.81 * load / 1000) ss.solve() self.ss = ss self.nodes = nodes self.connections = connections self.loads = loads self.supports = supports self.pop_mpl = pop_mpl self.cross_area = pop_cross_area self.compress = pop_compressive_strength self.tensile = pop_tensile_strength
def test_moment_load_benchmark_2(): system = SystemElements() system.add_element(location=[[3.125, 0]], EA=5e12, EI=5e12) system.add_element(location=[[5.625+3.125,0]], EA=5e12, EI=5e12) system.q_moment(element_id=1, Ty=1.836) system.q_moment(element_id=2, Ty=1.836) system.q_load(element_id=1, q=4.08, direction="y") system.q_load(element_id=2, q=4.08, direction="y") system.add_support_spring(1, 2, 3.75) system.add_support_spring(2, 2, 2.5) system.add_support_spring(3, 2, 2.5) #system.add_support_hinged(1) #system.add_support_hinged(2) #system.add_support_hinged(3) system.solve() assert np.isclose(np.max(abs(system.element_map[2].bending_moment)), 24.87,rtol=1e-2) assert np.isclose(np.max(abs(system.element_map[1].shear_force)), 13.2,rtol=1e-2)
def test_struct1(): ss = SystemElements() ss.add_element([[-2, 2], [-1, 0]]) ss.add_element([[-2, 3], [-2, 2]]) ss.add_element([[-1, 4], [-2, 3]]) # ss.add_element([[-1, 4], [0, 5]]) # ss.add_element([[0, 5], [1, 5]]) # ss.add_element([[1, 5], [2, 5]]) # ss.add_element([[2, 5], [3, 5]]) # ss.add_element([[3, 5], [5, 2]]) ss.add_element([[-3, 4], [-2, 3]]) ss.add_element([[-4, 4], [-3, 4]]) ss.add_element([[-3, 5], [-3, 4]]) ss.add_element([[-2, 0], [-1, 0]]) ss.add_element([[-2, 1], [-2, 0]]) ss.add_element([[-2, -1], [-2, 0]]) ss.add_element([[-3, 0], [-2, 0]]) ss.add_element([[-4, 1], [-3, 0]]) ss.add_element([[-5, 2], [-4, 1]]) ss.add_element([[-4, -1], [-3, 0]]) ss.add_element([[-5, -2], [-4, -1]]) ss.add_element([[-1, 0], [0, 0]]) ss.add_element([[0, 0], [1, 0]]) ss.add_element([[2, 0], [3, 0]]) ss.add_element([[1, 0], [2, 0]]) ss.add_element([[2, 0], [3, 1]]) ss.point_load(10, 5) ss.moment_load(1, 15) # ss.add_element([[3, 1], [4, 1]]) # ss.add_element([[3, 1], [3, 2]]) # ss.add_element([[4, 1], [5, 2]]) # ss.add_element([[4, 1], [6, 2]]) ss.add_element([[1, 0], [-1, 1]]) ss.show_structure() ass = Assembler(ss) ass.assemble_structure(main_path=(15, 20)) # ass.assemble_structure(main_path=(7, 13)) # ass.plot_solve_order(ass.plot_order, show=True, save_figure=False, plotting_start_node=15) [[print(f"section {index + 1}-{sub_index + 1}: {sympify(sub_string, evaluate=False)}") for sub_index, sub_string in enumerate(string)] for index, string in enumerate(ass.sections_strings)]
def test_struct(): ss = SystemElements() ss.add_element([[0, 0], [1, 0]]) ss.add_element([[1, 0], [1, 1]]) ss.add_element([[1, 0], [2, 0]]) ss.add_element([[2, 0], [3, 0]]) ss.add_element([[3, 0], [4, 1]]) ss.add_element([[4, 1], [5, 1]]) ss.point_load(2, Fy=10) ss.point_load(3, Fy=-20, Fx=5) ss.point_load(4, Fy=-30) ss.point_load(5, Fx=-40) ss.moment_load(2, Ty=-9) ss.moment_load(1, 7) ss.moment_load(3, 3) ss.q_load(element_id=3, q=(-10, -20)) ss.q_load(element_id=5, q=(-10, -20)) ss.add_support_roll(4) ss.add_support_hinged(5) # ss.add_support_fixed(3) mn = Manager(ss) mn.generate_pdf(pdf_path=r"C:\testfolder")
def test_struct2(): ss = SystemElements() ss.add_element([[0, 0], [1, 0]]) ss.add_element([[1, 0], [1, 1]]) ss.add_element([[1, 0], [2, 0]]) ss.add_element([[2, 0], [3, 0]]) ss.add_element([[3, 0], [4, 1]]) ss.add_element([[4, 1], [5, 1]]) ss.point_load(2, Fy=10) ss.point_load(3, Fy=-20) ss.point_load(4, Fy=-30) ss.point_load(5, Fx=-40) ss.moment_load(2, Ty=-9) ss.moment_load(1, 7) ss.moment_load(3, 3) ss.q_load(element_id=3, q=(-10, -20)) ss.add_support_roll(4) ss.add_support_hinged(5) # ss.show_structure() ss.solve() ss.show_reaction_force(show=False) ass = Assembler(ss) ass.assemble_structure(main_path=Setting.longest) [print(element.id, values) for element, values in ass.internal_stresses_dict.items()]