Esempio n. 1
0
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()
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
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)
Esempio n. 5
0
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
Esempio n. 6
0
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)
Esempio n. 7
0
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)
Esempio n. 8
0
 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()
Esempio n. 9
0
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)
Esempio n. 10
0
 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()
Esempio n. 11
0
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)
Esempio n. 12
0
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)
Esempio n. 13
0
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)
Esempio n. 14
0
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)
Esempio n. 15
0
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")
Esempio n. 16
0
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()]
def trussbridge(Ediag,
                Adiag,
                Ebot,
                Abot,
                Etop,
                Atop,
                p,
                w_tri=4,
                h_tri=2,
                num_tri=6,
                disp=False):
    """
    Calculate displacement of middle point in bridge truss

    Args:
         Ediag (list): list of Young's modulus for each pair of diagonal trusses (Pa)
         Adiag (list): list of cross-sectional area for each pair of diagonal trusses (m2)
         Ebot (list): list of Young's modulus for each bottom truss (Pa)
         Abot (list): list of cross-sectional area for each bottom truss (m2)
         Etop (list): list of Young's modulus for each top truss (Pa)
         Atop (list): list of cross-sectional area for each top truss (m2)t
         p (list): list of force applied on the top nodes (N)
         num_tri (int): number of triangles
         disp (bool): display image or not

    """
    Ediag = np.array(Ediag)
    Adiag = np.array(Adiag)
    Ebot = np.array(Ebot)
    Abot = np.array(Abot)
    Etop = np.array(Etop)
    Atop = np.array(Atop)
    EAdiag = Ediag * Adiag
    EAbot = Ebot * Abot
    EAtop = Etop * Atop

    ss = SystemElements()

    # Triangle coord
    x_base = np.arange(0, num_tri + 1) * w_tri
    x_top = np.arange(0, num_tri) * w_tri + h_tri
    y = np.ones(num_tri) * h_tri

    # Create 6 triangles
    for i in range(num_tri):
        p1 = [x_base[i], 0]
        p2 = [x_top[i], y[i]]
        p3 = [x_base[i + 1], 0]
        ss.add_truss_element(location=[p1, p2], EA=EAdiag[i])
        ss.add_truss_element(location=[p2, p3], EA=EAdiag[i])
        ss.add_truss_element(location=[p1, p3], EA=EAbot[i])

    # Create 5 horizontal trusses
    for i in range(num_tri - 1):
        ss.add_truss_element(location=[[x_top[i], y[i]],
                                       [x_top[i + 1], y[i + 1]]],
                             EA=EAtop[i])

    # Create support
    ss.add_support_hinged(node_id=1)
    ss.add_support_roll(node_id=13, direction=2)

    # Create Load
    loadnode = [2, 4, 6, 8, 12]
    for index, point in enumerate(loadnode):
        ss.point_load(node_id=point, Fy=p[index])
        ss.point_load(node_id=point, Fy=p[index])
        ss.point_load(node_id=point, Fy=p[index])
        ss.point_load(node_id=point, Fy=p[index])

    ss.solve()
    disp7 = ss.get_node_displacements(node_id=7)

    if disp is True:
        ss.show_axial_force()
        ss.show_displacement(factor=10)

    return disp7
Esempio n. 18
0
class connections:
    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 add_beam(self):
        try:
            self.workaround()
            e = self.mw.elementtype.currentIndex()

            if self.mw.utilizeinfo.isChecked():
                EI = float(self.fn.filter(self.mw.beam_E.text())) * float(
                    self.fn.filter(self.mw.beam_I.text()))
                EA = float(self.fn.filter(self.mw.beam_E.text())) * float(
                    self.fn.filter(self.mw.beam_A.text()))
                element_types = ["beam", "truss"]
                self.ss.add_element(location=[
                    [
                        float(self.fn.filter(self.mw.beam_x1.text())),
                        float(self.fn.filter(self.mw.beam_y1.text()))
                    ],
                    [
                        float(self.fn.filter(self.mw.beam_x2.text())),
                        float(self.fn.filter(self.mw.beam_y2.text()))
                    ]
                ],
                                    EI=EI,
                                    EA=EA,
                                    element_type=element_types[e])

            else:
                self.ss.add_element(
                    location=[[
                        float(self.fn.filter(self.mw.beam_x1.text())),
                        float(self.fn.filter(self.mw.beam_y1.text()))
                    ],
                              [
                                  float(self.fn.filter(
                                      self.mw.beam_x2.text())),
                                  float(self.fn.filter(self.mw.beam_y2.text()))
                              ]])

            self.visualize_structure()
            self.states.append(pickle.dumps(self.ss))
        except:
            self.fn.warning()

    def beam_info(self):
        if self.mw.utilizeinfo.isChecked():
            self.mw.frame_4.setHidden(False)
        else:
            self.mw.frame_4.setHidden(True)

    def element_type_list(self):
        if self.mw.elementtype.currentIndex() == 1:
            self.mw.beam_I.setEnabled(False)
        elif self.mw.elementtype.currentIndex() == 0:
            self.mw.beam_I.setEnabled(True)

    def add_node(self):
        try:
            if int(self.mw.node_id.text()) in self.ss.node_map.keys():
                self.workaround()
                self.ss.insert_node(element_id=int(self.mw.node_id.text()),
                                    location=[
                                        self.fn.filter(self.mw.node_x.text()),
                                        self.fn.filter(self.mw.node_y.text())
                                    ])
                self.mw.last_figure.click()
                self.states.append(pickle.dumps(self.ss))
            else:
                self.fn.invalid_id_warning()
        except:
            self.fn.warning()

    def add_support(self):
        try:
            if int(self.mw.support_pos.text()) in self.ss.node_map.keys():
                self.workaround()
                if self.mw.support_hinged.isChecked():
                    self.ss.add_support_hinged(
                        node_id=int(self.mw.support_pos.text()))
                elif self.mw.support_roll.isChecked():
                    self.ss.add_support_roll(
                        node_id=int(self.mw.support_pos.text()),
                        angle=float(
                            self.fn.filter(self.mw.support_angle.text())))
                elif self.mw.support_fixed.isChecked():
                    self.ss.add_support_fixed(
                        node_id=int(self.mw.support_pos.text()))
                elif self.mw.support_spring.isChecked():
                    self.ss.add_support_spring(
                        node_id=int(self.mw.support_pos.text()),
                        translation=self.mw.spring_translation.text(),
                        k=self.mw.spring_k.text())
                elif self.mw.support_internal_hinge.isChecked():
                    pass

                self.mw.last_figure.click()
                self.states.append(pickle.dumps(self.ss))
                self.fn.enable_buttons()
            else:
                self.fn.invalid_id_warning()

        except:
            self.fn.warning()

    def show_support_stuff(self):
        if self.mw.support_roll.isChecked():
            self.mw.support_angle.setHidden(
                True)  # Always true due to anaStruct bug
            self.mw.label_113.setHidden(
                True)  # Always true due to anaStruct bug
            self.mw.label_27.setHidden(
                True)  # Always true due to anaStruct bug
            self.mw.label_71.setHidden(True)
            self.mw.label_73.setHidden(True)
            self.mw.spring_k.setHidden(True)
            self.mw.spring_translation.setHidden(True)
        elif self.mw.support_spring.isChecked():
            self.mw.label_71.setHidden(False)
            self.mw.label_73.setHidden(False)
            self.mw.spring_k.setHidden(False)
            self.mw.spring_translation.setHidden(False)
            self.mw.support_angle.setHidden(
                True)  # Always true due to anaStruct bug
            self.mw.label_27.setHidden(True)
            self.mw.label_127.setHidden(False)
        else:
            self.mw.support_angle.setHidden(
                True)  # Always true due to anaStruct bug
            self.mw.label_27.setHidden(True)
            self.mw.label_71.setHidden(True)
            self.mw.label_73.setHidden(True)
            self.mw.spring_k.setHidden(True)
            self.mw.label_113.setHidden(True)
            self.mw.label_127.setHidden(True)
            self.mw.spring_translation.setHidden(True)

    def add_point_load(self):
        try:
            if int(self.mw.load_pos.text()) in self.ss.node_map.keys():
                self.workaround()
                if self.mw.load_moment.text() != '' and float(
                        self.mw.load_moment.text()) != 0:
                    self.ss.moment_load(
                        node_id=int(self.mw.load_pos.text()),
                        Ty=float(self.fn.filter(self.mw.load_moment.text())))

                if float(self.mw.load_y.text()) == 0 and float(
                        self.mw.load_x.text()) == 0 and float(
                            self.mw.load_angle.text()) == 0:
                    pass
                elif self.mw.load_y.text() != '' and self.mw.load_x.text(
                ) != '' and self.mw.load_angle.text() != '':
                    self.ss.point_load(
                        node_id=int(self.mw.load_pos.text()),
                        Fy=float(self.fn.filter(self.mw.load_y.text())),
                        Fx=float(self.fn.filter(self.mw.load_x.text())),
                        rotation=float(
                            self.fn.filter(self.mw.load_angle.text())))
                self.mw.last_figure.click()
                self.states.append(pickle.dumps(self.ss))
                self.fn.enable_buttons()
            else:
                self.fn.invalid_id_warning()
        except:
            self.fn.warning()

    def add_q_load(self):
        try:
            if int(self.mw.qload_pos.text()) in self.ss.node_map.keys():
                if float(self.mw.qload_initial.text()) >= 0 and float(self.mw.qload_final.text()) >= 0 or \
                        float(self.mw.qload_initial.text()) <= 0 and float(self.mw.qload_final.text()) <= 0:
                    self.workaround()
                    if self.mw.qload_initial.text() == '':
                        self.mw.qload_final.setText(
                            self.fn.filter(self.mw.qload_final.text()))
                    if self.mw.qload_final.text() == '':
                        self.mw.qload_final.setText(
                            self.fn.filter(self.mw.qload_initial.text()))
                    self.ss.q_load(
                        element_id=int(self.mw.qload_pos.text()),
                        q=(float(self.fn.filter(self.mw.qload_initial.text())),
                           float(self.fn.filter(self.mw.qload_final.text()))))
                    self.mw.last_figure.click()
                    self.states.append(pickle.dumps(self.ss))
                    self.fn.enable_buttons()
                else:
                    msg = QMessageBox()
                    msg.setWindowTitle(self.mw.warning_title)
                    msg.setText(self.mw.qload_warning)
                    msg.setIcon(QMessageBox.Warning)
                    x = msg.exec_()
            else:
                self.fn.invalid_id_warning()
        except:
            self.fn.warning()

    def visualize_structure(self):
        if self.ss.element_map:
            self.mw.MplWidget.canvas.figure.clear()
            ax = self.mw.MplWidget.canvas.figure.add_subplot(111)
            self.fn.visualize(
                self.ss.show_structure(show=False,
                                       figure=(self.mw.MplWidget.canvas.figure,
                                               ax)))
            ax.patch.set_alpha(0.2)
            self.mw.last_figure = self.mw.show_structure
        else:
            self.mw.MplWidget.plot(has_grid=self.mw.gridBox.isChecked())
            self.fn.figurefix()
            self.mw.last_figure = None

    def visualize_diagram(self):
        self.solve()
        self.mw.MplWidget.canvas.figure.clear()
        ax = self.mw.MplWidget.canvas.figure.add_subplot(111)
        ax.patch.set_alpha(0.2)
        self.fn.visualize(
            self.ss.show_structure(show=False,
                                   free_body_diagram=1,
                                   figure=(self.mw.MplWidget.canvas.figure,
                                           ax)))
        self.mw.last_figure = self.mw.show_diagram

    def visualize_supports(self):
        self.solve()
        self.mw.MplWidget.canvas.figure.clear()
        ax = self.mw.MplWidget.canvas.figure.add_subplot(111)
        ax.patch.set_alpha(0.2)
        self.fn.visualize(
            self.ss.show_reaction_force(
                show=False, figure=(self.mw.MplWidget.canvas.figure, ax)))
        self.mw.last_figure = self.mw.show_supports

    def visualize_normal(self):
        self.solve()
        self.mw.MplWidget.canvas.figure.clear()
        ax = self.mw.MplWidget.canvas.figure.add_subplot(111)
        ax.patch.set_alpha(0.2)
        self.fn.visualize(
            self.ss.show_axial_force(show=False,
                                     figure=(self.mw.MplWidget.canvas.figure,
                                             ax)))
        self.mw.last_figure = self.mw.show_normal

    def visualize_shear(self):
        self.solve()
        self.mw.MplWidget.canvas.figure.clear()
        ax = self.mw.MplWidget.canvas.figure.add_subplot(111)
        ax.patch.set_alpha(0.2)
        self.fn.visualize(
            self.ss.show_shear_force(show=False,
                                     figure=(self.mw.MplWidget.canvas.figure,
                                             ax)))
        self.mw.last_figure = self.mw.show_shear

    def visualize_moment(self):
        self.solve()
        self.mw.MplWidget.canvas.figure.clear()
        ax = self.mw.MplWidget.canvas.figure.add_subplot(111)
        ax.patch.set_alpha(0.2)
        self.fn.visualize(
            self.ss.show_bending_moment(
                show=False, figure=(self.mw.MplWidget.canvas.figure, ax)))
        self.mw.last_figure = self.mw.show_moment

    def visualize_displacement(self):
        self.solve()
        self.mw.MplWidget.canvas.figure.clear()
        ax = self.mw.MplWidget.canvas.figure.add_subplot(111)
        ax.patch.set_alpha(0.2)
        self.fn.visualize(
            self.ss.show_displacement(show=False,
                                      figure=(self.mw.MplWidget.canvas.figure,
                                              ax)))
        self.mw.last_figure = self.mw.show_displacement

    def solve(self):
        self.was_solved = True
        self.ss.solve()

    def static_solver(self, clean=True):
        if find_executable('latex'):
            if self.mw.show_moment.isEnabled():
                if (len(self.ss.supports_roll) == 1 and len(self.ss.supports_hinged) == 1) \
                        or (len(self.ss.supports_fixed) == 1):
                    dialog = QDialog()
                    prompt = PathPrompt(self.mw.language, dialog)
                    dialog.exec_()
                    if not prompt.userTerminated:
                        solve_path = prompt.path
                        file, ok = QFileDialog.getSaveFileName(
                            self.mw, self.mw.pdf_title, self.mw.pdf_text,
                            "PDF (*.pdf)")
                        if ok:
                            try:
                                self.mw.toolBox.setCurrentIndex(0)
                                pdf_dir, filename = split_dir_filename(file)
                                make_pdf_folders(pdf_dir)

                                self.ss.color_scheme = "bright"
                                plt.style.use('default')

                                mn = Manager(self.ss)

                                pdf_generator_thread = PDFGeneratorThread(
                                    mn.generate_pdf,
                                    self.mw.language,
                                    pdf_path=pdf_dir,
                                    filename=filename,
                                    solve_path=solve_path,
                                    path_warning=self.fn.path_warning,
                                )

                                self.fn.setupLoading(pdf_generator_thread)

                                pdf_generator_thread.finished.connect(
                                    self.on_finished)

                                pdf_generator_thread.start()
                                self.mw.loadingScreen.exec_()

                                if not self.mw.loadingUi.userTerminated:
                                    self.fn.pdf_generated_prompt()
                                if clean:
                                    delete_folder(pdf_dir)
                                self.ss.color_scheme = "dark"
                                plt.style.use('dark_background')

                            except:
                                self.fn.latex_packages_warning()
                else:
                    self.fn.static_warning()
            else:
                self.fn.warning()
        else:
            self.fn.latex_warning()

    def on_finished(self):
        self.mw.loadingScreen.close()

    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 load_structure_aux(self, file):
        with open(f'{file}', 'rb') as f:
            self.ss, _, _ = pickle.load(f)
        self.mw.struct_loaded = True

    def workaround(self):
        if self.was_solved:
            self.ss = pickle.loads(self.states[-1])
            self.was_solved = False

    def reset(self):
        self.workaround()
        self.ss.remove_loads()
        self.mw.MplWidget.canvas.figure.clear()
        ax = self.mw.MplWidget.canvas.figure.add_subplot(111)
        ax.patch.set_alpha(0.2)
        self.fn.visualize(
            self.ss.show_structure(show=False,
                                   figure=(self.mw.MplWidget.canvas.figure,
                                           ax)))
        self.states.append(pickle.dumps(self.ss))
        self.fn.disable_buttons()
Esempio n. 19
0
from StructuresExplained.solutions.structure.reactions.assembler import Assembler

if __name__ == "__main__":
    from anastruct import SystemElements
    from sympy import sympify

    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.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.solve()
    ass = Assembler(ss)
    ass.assemble_structure()
    print(
        f"{sympify(ass.res.point_sum_y, evaluate=False)}\n{sympify(ass.res.point_sum_x, evaluate=False)}\n{ass.res.moments_sum}\n")
Esempio n. 20
0
def get_diagram():
    '''
    Recebe um parâmetro numerico que identifica o tipo de diagrama a ser retornado
        0 = Estrutural
        1 = Forças de reação
        2 = Axial
        3 = Cortante
        4 = Fletor
        5 = Displacement ?
    Requisita os parâmetros, via json:
        apoio1 e apoio2, que são os tipos dos apoios
        apoio1pos e apoio2pos, que são as posições dos dois apoios
        cargap, que é a posição da carga
        cargam, que é o módulo da carga
    Tipo dos apoios:
        0 = Primeiro gênerio (roll)
        1 = Segundo gênero (hinged)
        2 = Tercêiro Gênero (fixed)
    '''
    tipo = int(request.args.get('tipo'))

    r = requests.get('https://calculusapi.herokuapp.com/test')
    
    apoio1tipo, apoio2tipo  = r.json().get('apoio1'), r.json().get('apoio2')
    apoio1pos, apoio2pos = r.json().get('apoio1p'), r.json().get('apoio2p')

    cargapos  = r.json().get('cargap')
    cargamod = r.json().get('cargam')

  
    ss = SystemElements()

    #criação da barra
    ss.add_element(location=[[0, 0], [3, 0]])
    ss.add_element(location=[[3, 0], [8, 0]])
    
    #adição do primeiro apoio
    if apoio1tipo == 0:
        ss.add_support_roll(node_id=apoio1pos)
    elif apoio1tipo == 1:
        ss.add_support_hinged(node_id=apoio1pos)
    else:
        ss.add_support_fixed(node_id=apoio1pos)

    
    #adição do segundo apoio
    if apoio2tipo == 0:
        ss.add_support_roll(node_id=apoio2pos)
    elif apoio2tipo == 1:
        ss.add_support_hinged(node_id=apoio2pos)
    else:
        ss.add_support_fixed(node_id=apoio2pos)

    
    #adição da carga
    ss.q_load(element_id=cargapos, q=cargamod)
    
    #geração dos diagramas
    ss.solve()
    img = io.BytesIO()
    if tipo == 0:
        ss.show_structure(show=False).savefig(img)
    elif tipo == 1:
    	ss.show_reaction_force(show=False).savefig(img)
    elif tipo == 2:
    	ss.show_axial_force(show=False).savefig(img)
    elif tipo == 3:
    	ss.show_shear_force(show=False).savefig(img)
    elif tipo == 4:
    	ss.show_bending_moment(show=False).savefig(img)
    elif tipo == 5:
    	ss.show_displacement(show=False).savefig(img) 	
    img.seek(0)
    return send_file(img, mimetype='image/png')
Esempio n. 21
0
 def accept(self):
     try:
         E = float(self.form.editE.text())  # N/mm2
         I = float(self.form.editI.text())  # mm4
         A = float(self.form.editA.text())  # mm2
         ss = SystemElements()
         frame = FreeCAD.ActiveDocument.getObjectsByLabel(
             self.form.comboBox.currentText())[0]
         sk = frame.Base
         j = 0
         # CREATE MEMBERS OF STRUCTURE
         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]]
             if self.combotypes[j].currentText() == 'beam':
                 ss.add_element([sp, ep], EA=E * A * 1e-3, EI=E * I * 1e-9)
             elif self.combotypes[j].currentText() == 'brace':
                 ss.add_truss_element([sp, ep], EA=E * A * 1e-3)
             j += 1
         # SET DISTRIBUTED LOADS
         if self.form.radioFrame.isChecked():
             for i in list(range(len(sk.Geometry))):
                 if self.form.tableDistrib.item(i, 2):
                     item = self.form.tableDistrib.item(i, 2)
                     try:
                         load = float(item.text())  # kN/m
                         ss.q_load(element_id=(i + 1), q=load)
                     except:
                         pass
         for c in self.combos:
             i = self.combos.index(c) + 1
             # SET NODE CONSTRAINTS
             if c.currentText() == 'fix': ss.add_support_fixed(node_id=i)
             elif c.currentText() == 'hinge':
                 ss.add_support_hinged(node_id=i)
             elif c.currentText() == 'roll':
                 ss.add_support_roll(node_id=i)
             # SET NODE FORCES
             if self.form.tableConc.item(
                     i - 1, 1) or self.form.tableConc.item(i - 1, 2):
                 itemX = self.form.tableConc.item(i - 1, 1)
                 try:
                     loadX = float(itemX.text())  # kN
                 except:
                     loadX = 0
                 itemY = self.form.tableConc.item(i - 1, 2)  # kN
                 try:
                     loadY = float(itemY.text())
                 except:
                     loadY = 0
                 ss.point_load(node_id=(i), Fx=loadX, Fy=loadY)
         # SOLVE AND VALIDATE
         ss.solve()
         # stable=ss.validate(.0000001)
         # SHOW RESULTS ACCORDING THE CALC TYPE
         if True:  #stable:
             if self.form.radioFrame.isChecked():
                 ss.show_results()
             elif self.form.radioTruss.isChecked():
                 ss.show_axial_force()
         else:
             FreeCAD.Console.PrintError('The structure is not stable.\n')
     except:
         FreeCAD.Console.PrintError('Invalid input\n')
         for l in self.labNodes + self.labEl:
             l.removeLabel()
Esempio n. 22
0
def generate_truss(subdivide_mode=None, subdivides=None):
    """
	Randomly generate a valid truss
	"""
    ss = SystemElements(EA=MODULUS_OF_ELASTICITY * BRASS_CROSS_SECTION_AREA,
                        EI=MODULUS_OF_ELASTICITY * MOMENT_OF_INERTIA)
    width = MIN_WIDTH
    height = MAX_HEIGHT
    if not subdivide_mode:
        subdivide_mode = random.choice(
            ["triangle_subdivide", "radial_subdivide", "pillar_subdivide"])
    if subdivide_mode == "triangle_subdivide":
        if not subdivides:
            subdivides = random.randint(1, 2)
        triangles = [
            [
                [[0, 0], [width, 0]],
                [[width, 0], [width / 2, height]],
                [[width / 2, height], [0, 0]],
            ],
        ]
        for _ in range(subdivides):
            new_triangles = []
            for triangle in triangles:
                mids = [midpoint(*line) for line in triangle]
                new_triangles += [
                    [
                        [triangle[0][0], mids[0]],
                        [mids[0], mids[2]],
                        [mids[2], triangle[0][0]],
                    ],
                    [
                        [mids[2], mids[1]],
                        [mids[1], triangle[2][0]],
                        [triangle[2][0], mids[2]],
                    ],
                    [
                        [mids[0], triangle[1][0]],
                        [triangle[1][0], mids[1]],
                        [mids[1], mids[0]],
                    ],
                    [
                        [mids[2], mids[0]],
                        [mids[0], mids[1]],
                        [mids[1], mids[2]],
                    ],
                ]
            triangles = new_triangles
        raw_lines = np.reshape(triangles, (-1, 2, 2))
        # sort coordinates in each line
        raw_lines = [sorted(line, key=lambda p: p[0]) for line in raw_lines]
        # sort lines by first point's x value
        raw_lines = sorted(raw_lines, key=lambda l: l[0][0])
        # remove duplicate lines
        lines = []
        for line in raw_lines:
            is_duplicate = False
            for l in lines:
                if np.array_equal(line, l):
                    is_duplicate = True
            if not is_duplicate:
                lines.append(line)
        for line in lines:
            ss.add_truss_element(location=line)
    elif subdivide_mode == "radial_subdivide":
        if not subdivides:
            subdivides = random.randint(1, 4)
        step_size = width / 2 / subdivides
        bottom_midpoint = midpoint([0, 0], [width, 0])
        lines = []
        for x in np.arange(0, width + 0.1, step_size):
            lines += [
                [
                    bottom_midpoint,
                    [
                        x,
                        valmap(x, 0, width / 2, 0, height) if x <= width / 2
                        else valmap(x, width / 2, width, height, 0)
                    ]
                ],
            ]
        lines[-1][1][1] = 0  # HACK: set last y value to 0
        top_points = [p[1] for p in lines]
        top_lines = []
        for i in range(1, len(top_points)):
            top_lines += [[top_points[i - 1], top_points[i]]]
        lines += top_lines
        for line in lines:
            ss.add_truss_element(location=line)
    elif subdivide_mode == "pillar_subdivide":
        if not subdivides:
            subdivides = random.randint(1, 4)
        step_size = width / 2 / subdivides
        lines = []
        for x in np.arange(step_size, width, step_size):
            lines += [
                [[x, 0],
                 [
                     x,
                     valmap(x, 0, width / 2, 0, height) if x <= width / 2 else
                     valmap(x, width / 2, width, height, 0)
                 ]],
            ]
        top_points = [p[1] for p in lines]
        edge_lines = []
        for i in range(1, len(top_points)):
            edge_lines += [
                [top_points[i - 1], top_points[i]],
                [[top_points[i - 1][0], 0], [top_points[i][0], 0]],
            ]
            if i < len(top_points) / 2:
                edge_lines += [
                    [[top_points[i - 1][0], 0], top_points[i]],
                ]
            else:
                edge_lines += [
                    [top_points[i - 1], [top_points[i][0], 0]],
                ]
        lines += [
            [[0, 0], top_points[0]],
            [[0, 0], [top_points[0][0], 0]],
            [[width, 0], top_points[-1]],
            [[width, 0], [top_points[-1][0], 0]],
        ]
        lines += edge_lines
        for line in lines:
            ss.add_truss_element(location=line)

    ss.add_support_hinged(node_id=ss.find_node_id(vertex=[0, 0]))
    ss.add_support_hinged(node_id=ss.find_node_id(vertex=[width, 0]))
    return ss