def findReaction( b: Beam, p: Union[Beam, None] ) -> Tuple[Vector3, float]: # tuple float is the beam's angle v: Vector3 = Vector3(0, 0, 0) endFirst: bool for i in range(len(self.beams)): if b == self.beams[i][0]: break if len(b.start[1]) == 0: endFirst = False if b.start[0] != None: v = rotate(b.start[0].reaction, -self.beams[i][2]) elif len(b.end[1]) == 0: endFirst = True if b.end[0] != None: v = rotate(b.end[0].reaction, -self.beams[i][2]) elif p != None: if p in b.start[1]: endFirst = True for c in b.end[1]: r: Tuple[Vector3, float] = findReaction(c, b) v += rotate(r[0], r[1] - self.beams[i][2]) elif p in b.end[1]: endFirst = False for c in b.start[1]: r: Tuple[Vector3, float] = findReaction(c, b) v += rotate(r[0], r[1] - self.beams[i][2]) else: raise Exception('Cannot find parent!') else: raise Exception('Parent not given!') v = b.solve(v, self.beams[i][2], endFirst) solution[i] = b.stress return (v, self.beams[i][2])