def on_expression_auto_clicked(self): """Auto configure the solutions.""" if not self.driver_list.count(): QMessageBox.information(self, "Auto configure", "Please setting the driver joint(s).") return reply = QMessageBox.question( self, "Auto configure", "This function can detect the structure " + "to configure the solutions.\n" + "The current settings will be cleared.") if ((reply != QMessageBox.Yes) or (not self.on_expression_clear_clicked())): return exprs = vpoints_configure( graph2vpoints(self.PreviewWindow.G, self.PreviewWindow.pos, self.PreviewWindow.cus, self.PreviewWindow.same), [ eval(item.text().replace('P', '')) for item in list_items(self.driver_list) ], self.PreviewWindow.status) for expr in exprs: self.__addSolution(*expr) self.__hasSolution() self.__setWarning(self.expression_list_label, not self.PreviewWindow.isAllLock()) self.PreviewWindow.update()
def getTriangle(self, vpoints: Tuple[VPoint]) -> List[Tuple[str]]: """Update triangle expression here. Special function for VPoints. """ exprs = vpoints_configure(vpoints, tuple(self.InputsWidget.inputPair())) self.Entities_Expr.setExpr(exprs) return exprs
def getTriangle(self, vpoints: Optional[Tuple[VPoint]] = None ) -> List[Tuple[str]]: """Update triangle expression here. Special function for VPoints. """ if vpoints is None: vpoints = self.EntitiesPoint.dataTuple() status = {} exprs = vpoints_configure( vpoints, tuple( (b, d) for b, d, a in self.InputsWidget.inputPairs()), status) data_dict, _ = data_collecting( exprs, {n: f'P{n}' for n in range(len(vpoints))}, vpoints) self.EntitiesExpr.setExpr(exprs, data_dict, tuple(p for p, s in status.items() if not s)) return exprs
def test_solving(self): """Test triangular formula solving. + Jansen's linkage (Single). """ vpoints = [ VPoint("ground, link_1", 0, 0., 'Green', 0., 0.), VPoint("link_1, link_2, link_4", 0, 0., 'Green', 9.61, 11.52), VPoint("ground, link_3, link_5", 0, 0., 'Blue', -38.0, -7.8), VPoint("link_2, link_3", 0, 0., 'Green', -35.24, 33.61), VPoint("link_3, link_6", 0, 0., 'Green', -77.75, -2.54), VPoint("link_4, link_5, link_7", 0, 0., 'Green', -20.1, -42.79), VPoint("link_6, link_7", 0, 0., 'Green', -56.05, -35.42), VPoint("link_7", 0, 0., 'Green', -22.22, -91.74), ] x, y = expr_solving(vpoints_configure(vpoints, [(0, 1)]), {n: 'P{}'.format(n) for n in range(len(vpoints))}, vpoints, [0.])[-1] self.assertTrue(isclose(x, -43.17005515543241)) self.assertTrue(isclose(y, -91.75322590542523))
def __get_path(self, row: int) -> List[List[_Coord]]: """Using result data to generate paths of mechanism.""" result = self.mechanism_data[row] expression: str = result['Expression'] same: Dict[int:int] = result['same'] inputs: List[Tuple[int, int]] = result['input'] input_list = [] for b, d in inputs: for i in range(b): if i in same: b -= 1 for i in range(d): if i in same: d -= 1 input_list.append((b, d)) vpoints = parse_vpoints(expression) expr = vpoints_configure(vpoints, input_list) b, d = input_list[0] base_angle = vpoints[b].slope_angle(vpoints[d]) path = [[] for _ in range(len(vpoints))] for angle in range(360 + 1): try: result_list = expr_solving( expr, {i: f"P{i}" for i in range(len(vpoints))}, vpoints, [base_angle + angle] + [0] * (len(input_list) - 1)) except ValueError: nan = float('nan') for i in range(len(vpoints)): path[i].append((nan, nan)) else: for i in range(len(vpoints)): coord = result_list[i] if type(coord[0]) == tuple: path[i].append(coord[1]) else: path[i].append(coord) return path
def get_triangle(self, vpoints: Optional[Tuple[VPoint]] = None) -> ExpressionStack: """Update triangle expression here. Special function for VPoints. """ if vpoints is None: vpoints = self.entities_point.data_tuple() status = {} exprs = vpoints_configure( vpoints, [(b, d) for b, d, _ in self.inputs_widget.input_pairs()], status ) data_dict, _ = data_collecting( exprs, {n: f'P{n}' for n in range(len(vpoints))}, vpoints ) self.entities_expr.set_expr( exprs, data_dict, tuple(p for p, s in status.items() if not s) ) return exprs