From e9098108d261f4997a1bbceedb1ac26edef059e7 Mon Sep 17 00:00:00 2001 From: bklronin Date: Fri, 28 Jun 2024 22:52:23 +0200 Subject: [PATCH] - Transition to functions for entity retrieval --- drawing_modules/draw_widget2d.py | 382 +++++++++++++++---------------- main.py | 7 + 2 files changed, 191 insertions(+), 198 deletions(-) diff --git a/drawing_modules/draw_widget2d.py b/drawing_modules/draw_widget2d.py index 75dafce..afa115a 100644 --- a/drawing_modules/draw_widget2d.py +++ b/drawing_modules/draw_widget2d.py @@ -12,6 +12,8 @@ class SketchWidget(QWidget): def __init__(self): super().__init__() + self.line_draw_buffer = [None, None] + self.drag_buffer = [None, None] self.main_buffer = [None, None] self.distance_line = None @@ -190,24 +192,25 @@ class SketchWidget(QWidget): def mouseReleaseEvent(self, event): local_event_pos = self.viewport_to_local_coord(event.pos()) - if event.button() == Qt.LeftButton and not self.mouse_mode: - self.main_buffer[1] = local_event_pos - print("Le main buffer", self.main_buffer) + if event.button() == Qt.LeftButton and not self.mouse_mode: + self.drag_buffer[1] = local_event_pos + + print("Le main buffer", self.drag_buffer) if len(self.main_buffer) == 2: + entry = self.drag_buffer[0] + new_params = self.drag_buffer[1].x(), self.drag_buffer[1].y() + self.solv.set_params(entry.params, new_params) - entry = self.main_buffer[0] - new_params = [self.main_buffer[1].x(), self.main_buffer[1].y()] - self.solv.set_params(entry.params, new_params ) + self.solv.solve() - self.solv.solve() + points_need_update = self.check_all_points() + self.update_ui_points(points_need_update) + self.check_all_lines_and_update(points_need_update) - points_need_update = self.check_all_points() - self.update_ui_points(points_need_update) - self.check_all_lines_and_update(points_need_update) - - self.update() + self.update() + self.drag_buffer = [None, None] def mousePressEvent(self, event): local_event_pos = self.viewport_to_local_coord(event.pos()) @@ -227,128 +230,115 @@ class SketchWidget(QWidget): } if event.button() == Qt.LeftButton and not self.mouse_mode: - self.main_buffer[0] = self.get_handle_from_ui_point(self.hovered_point) + self.drag_buffer[0] = self.get_handle_from_ui_point(self.hovered_point) if event.button() == Qt.LeftButton and self.mouse_mode == "line": clicked_pos = local_event_pos - u = clicked_pos.x() - v = clicked_pos.y() + if not self.line_draw_buffer[0]: + self.line_draw_buffer[0] = clicked_pos + u = clicked_pos.x() + v = clicked_pos.y() - point = self.solv.add_point_2d(u, v, self.wp) + point = self.solv.add_point_2d(u, v, self.wp) - # Track Relationship - # Points - handle_nr = self.get_handle_nr(str(point)) - relation_point['handle_nr'] = handle_nr - relation_point['solv_handle'] = point - relation_point['ui_point'] = clicked_pos + relation_point = {} # Reinitialize the dictionary + handle_nr = self.get_handle_nr(str(point)) + relation_point['handle_nr'] = handle_nr + relation_point['solv_handle'] = point + relation_point['ui_point'] = clicked_pos - # List of points related to the current "figure" - self.points.append(clicked_pos) + self.slv_points_main.append(relation_point) - # Solverline - if self.line_buffer: - line = self.solv.add_line_2d(self.line_buffer, point, self.wp) + print("points", self.slv_points_main) + print("lines", self.slv_lines_main) + + elif self.line_draw_buffer[0]: + self.line_draw_buffer[1] = clicked_pos + u = clicked_pos.x() + v = clicked_pos.y() + + point2 = self.solv.add_point_2d(u, v, self.wp) + + relation_point = {} # Reinitialize the dictionary + handle_nr = self.get_handle_nr(str(point2)) + relation_point['handle_nr'] = handle_nr + relation_point['solv_handle'] = point2 + relation_point['ui_point'] = clicked_pos + + self.slv_points_main.append(relation_point) + + print("points", self.slv_points_main) + print("lines", self.slv_lines_main) + + print("Buffer state", self.line_draw_buffer) + if self.line_draw_buffer[0] and self.line_draw_buffer[1]: + point_slv1 = self.get_handle_from_ui_point(self.line_draw_buffer[0]) + point_slv2 = self.get_handle_from_ui_point(self.line_draw_buffer[1]) + print(point_slv1) + print(point_slv2) + + line = self.solv.add_line_2d(point_slv1, point_slv2, self.wp) + + relation_line = {} # Reinitialize the dictionary handle_nr_line = self.get_handle_nr(str(line)) relation_line['handle_nr'] = handle_nr_line relation_line['solv_handle'] = line - relation_line['solv_entity_points'] = (self.line_buffer, point) - relation_line['ui_points'] = [self.points[-2], self.points[-1]] + relation_line['solv_entity_points'] = (point_slv1, point_slv2) + relation_line['ui_points'] = [self.line_draw_buffer[0], self.line_draw_buffer[1]] - #track relationship of point in line + # Track relationship of point in line relation_point['part_of_entity'] = handle_nr_line self.slv_lines_main.append(relation_line) - self.line_buffer = None - self.slv_points_main.append(relation_point) + # Reset the buffer for the next line segment + self.line_draw_buffer[0] = self.line_draw_buffer[1] + self.line_draw_buffer[1] = None - self.line_buffer = point - - print("points", self.slv_points_main) - print("lines", self.slv_lines_main) + # Track Relationship + # Points if event.button() == Qt.LeftButton and self.mouse_mode == "pt_pt": - if self.pt_pt_buffer: - for new_id, target_line in enumerate(self.slv_points_main): - if self.hovered_point == target_line['ui_point']: - point_solve_now = target_line['solv_handle'] - target_id = new_id - break - else: - point_solve_now = None + if self.hovered_point and not self.main_buffer[0]: + self.main_buffer[0] = self.get_handle_from_ui_point(self.hovered_point) - for old_id, target_line in enumerate(self.slv_points_main): - if self.pt_pt_buffer == target_line['ui_point']: - point_solve_old = target_line['solv_handle'] - move_id = old_id - break - else: - point_solve_old = None + elif self.main_buffer[0]: + self.main_buffer[1] = self.get_handle_from_ui_point(self.hovered_point) - if point_solve_old and point_solve_now: - self.solv.coincident(point_solve_now, point_solve_old, self.wp) + if self.main_buffer[0] and self.main_buffer[1]: + print("buf", self.main_buffer) - if self.solv.solve() == ResultFlag.OKAY: - self.constrain_done.emit() - print("Fuck yeah") + self.solv.coincident(self.main_buffer[0], self.main_buffer[1], self.wp) - elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: - print("Solve_failed - Converge" ) + if self.solv.solve() == ResultFlag.OKAY: + self.constrain_done.emit() + print("Fuck yeah") - elif self.solv.solve() == ResultFlag.TOO_MANY_UNKNOWNS: - print("Solve_failed - Unknowns" ) + elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: + print("Solve_failed - Converge") - elif self.solv.solve() == ResultFlag.INCONSISTENT: - print("Solve_failed - Incons" ) + elif self.solv.solve() == ResultFlag.TOO_MANY_UNKNOWNS: + print("Solve_failed - Unknowns") - self.points = [] - self.pt_pt_buffer = [] - - print("Points_all", self.slv_points_main) - - self.pt_pt_buffer = self.hovered_point - self.update() + elif self.solv.solve() == ResultFlag.INCONSISTENT: + print("Solve_failed - Incons") + self.main_buffer = [None, None] if event.button() == Qt.LeftButton and self.mouse_mode == "pt_line": print("ptline") line_selected = None - if self.hovered_point: - for nr, entry_point in enumerate(self.slv_points_main): - if self.hovered_point == entry_point['ui_point']: - self.pt_line_buffer = entry_point - self.selected_main_idx = nr - print("Point set", self.pt_line_buffer) - break + if self.hovered_point and not self.main_buffer[1]: + self.main_buffer[0] = self.get_handle_from_ui_point(self.hovered_point) - if self.pt_line_buffer: - #Line selection target_line to constrain to - for target_line_con in self.slv_lines_main: - if self.is_point_on_line(local_event_pos, target_line_con['ui_points'][0], target_line_con['ui_points'][1]): - line_selected = target_line_con['solv_handle'] - print(line_selected.params) - break - - #Update UI Line position ot the line of the selected point - for line_nr, move_line in enumerate(self.slv_lines_main): - #Test what point is going to be moved from the line - if move_line['ui_points'][0] == self.pt_line_buffer['ui_point']: - print("On line", line_nr) - idx = 0 - break - - elif move_line['ui_points'][1] == self.pt_line_buffer['ui_point']: - print("On line", line_nr) - idx = 1 - break + elif self.main_buffer[0]: + self.main_buffer[1] = self.get_line_handle_from_ui_point(local_event_pos) # Contrain point to line - if line_selected: - self.solv.coincident(self.pt_line_buffer['solv_handle'], line_selected, self.wp) - print(f"1 : {self.pt_line_buffer['solv_handle']}, 2: {line_selected}") + if self.main_buffer[1]: + self.solv.coincident(self.main_buffer[0], self.main_buffer[1], self.wp) if self.solv.solve() == ResultFlag.OKAY: print("Fuck yeah") @@ -364,105 +354,21 @@ class SketchWidget(QWidget): print("Solve_failed - Incons") # Clear saved_points after solve attempt - self.pt_line_buffer = None - - if event.button() == Qt.LeftButton and self.mouse_mode == "horiz": - - line_selected = self.get_line_handle_from_ui_point(local_event_pos) - - self.solv.horizontal(line_selected, self.wp) - - if self.solv.solve() == ResultFlag.OKAY: - print("Fuck yeah") - - self.constrain_done.emit() - - elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: - print("Solve_failed - Converge") - - elif self.solv.solve() == ResultFlag.TOO_MANY_UNKNOWNS: - print("Solve_failed - Unknowns") - - elif self.solv.solve() == ResultFlag.INCONSISTENT: - print("Solve_failed - Incons") - - - - if event.button() == Qt.LeftButton and self.mouse_mode == "vert": - - line_selected = self.get_line_handle_from_ui_point(local_event_pos) - - self.solv.vertical(line_selected, self.wp) - - if self.solv.solve() == ResultFlag.OKAY: - print("Fuck yeah") - - self.constrain_done.emit() - - elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: - print("Solve_failed - Converge") - - elif self.solv.solve() == ResultFlag.TOO_MANY_UNKNOWNS: - print("Solve_failed - Unknowns") - - elif self.solv.solve() == ResultFlag.INCONSISTENT: - print("Solve_failed - Incons") - - self.pt_line_buffer = None - - if event.button() == Qt.LeftButton and self.mouse_mode == "distance": - print("distance") - e1 = None - e2 = None - - if self.hovered_point: - self.distance_point = self.hovered_point - - if self.selected_line: - self.distance_line = self.selected_line - - if self.distance_point and self.distance_line: - e1 = self.get_handle_from_ui_point(self.distance_point) - e2 = self.get_line_handle_from_ui_point(local_event_pos) - - elif not self.distance_point: - e1, e2 = self.get_point_line_handles_from_ui_point(local_event_pos) - - if e1 and e2: - length, ok = QInputDialog.getDouble(self, 'Distance', 'Enter a mm value:', value=100, decimals=2) - self.solv.distance(e1, e2, length, self.wp) - - if self.solv.solve() == ResultFlag.OKAY: - print("Fuck yeah") - self.distance_point = None - self.distance_line = None - self.constrain_done.emit() - - elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: - print("Solve_failed - Converge") - - elif self.solv.solve() == ResultFlag.TOO_MANY_UNKNOWNS: - print("Solve_failed - Unknowns") - - elif self.solv.solve() == ResultFlag.INCONSISTENT: - print("Solve_failed - Incons") + self.main_buffer = [None, None] if event.button() == Qt.LeftButton and self.mouse_mode == "pb_con_mid": + print("ptline") + line_selected = None - for entry_point_mid in self.slv_points_main: - if self.hovered_point == entry_point_mid['ui_point']: - self.point_for_mid = entry_point_mid['solv_handle'] - break + if self.hovered_point and not self.main_buffer[1]: + self.main_buffer[0] = self.get_handle_from_ui_point(self.hovered_point) - if self.point_for_mid: - for target_line_con in self.slv_lines_main: - if self.is_point_on_line(local_event_pos, target_line_con['ui_points'][0], target_line_con['ui_points'][1]): - self.line_selected_mid = target_line_con['solv_handle'] - break + elif self.main_buffer[0]: + self.main_buffer[1] = self.get_line_handle_from_ui_point(local_event_pos) - print(f"{self.point_for_mid}, {self.line_selected_mid}") - if self.line_selected_mid and self.point_for_mid: - self.solv.midpoint(self.point_for_mid, self.line_selected_mid, self.wp) + # Contrain point to line + if self.main_buffer[1]: + self.solv.midpoint(self.main_buffer[0], self.main_buffer[1], self.wp) if self.solv.solve() == ResultFlag.OKAY: print("Fuck yeah") @@ -478,16 +384,96 @@ class SketchWidget(QWidget): elif self.solv.solve() == ResultFlag.INCONSISTENT: print("Solve_failed - Incons") - self.point_for_mid = None - self.line_selected_mid = None + self.main_buffer = [None, None] + + if event.button() == Qt.LeftButton and self.mouse_mode == "horiz": + + line_selected = self.get_line_handle_from_ui_point(local_event_pos) + + if line_selected: + self.solv.horizontal(line_selected, self.wp) + + if self.solv.solve() == ResultFlag.OKAY: + print("Fuck yeah") + + self.constrain_done.emit() + + elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: + print("Solve_failed - Converge") + + elif self.solv.solve() == ResultFlag.TOO_MANY_UNKNOWNS: + print("Solve_failed - Unknowns") + + elif self.solv.solve() == ResultFlag.INCONSISTENT: + print("Solve_failed - Incons") + + if event.button() == Qt.LeftButton and self.mouse_mode == "vert": + line_selected = self.get_line_handle_from_ui_point(local_event_pos) + + if line_selected: + self.solv.vertical(line_selected, self.wp) + + if self.solv.solve() == ResultFlag.OKAY: + print("Fuck yeah") + + self.constrain_done.emit() + + elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: + print("Solve_failed - Converge") + + elif self.solv.solve() == ResultFlag.TOO_MANY_UNKNOWNS: + print("Solve_failed - Unknowns") + + elif self.solv.solve() == ResultFlag.INCONSISTENT: + print("Solve_failed - Incons") + + if event.button() == Qt.LeftButton and self.mouse_mode == "distance": + # Depending on selected elemnts either point line or line distance + print("distance") + e1 = None + e2 = None + + if self.hovered_point: + # Get the point as UI point as buffer + self.main_buffer[0] = self.hovered_point + + if self.selected_line: + # Get the point as UI point as buffer + self.main_buffer[1] = local_event_pos + + if self.distance_point and self.distance_line: + # Define point line combination + e1 = self.get_handle_from_ui_point(self.main_buffer[0]) + e2 = self.get_line_handle_from_ui_point(self.main_buffer[1]) + + elif not self.main_buffer[0]: + # Define only line selection + e1, e2 = self.get_point_line_handles_from_ui_point(local_event_pos) + + if e1 and e2: + # Ask fo the dimension and solve if both elements are present + length, ok = QInputDialog.getDouble(self, 'Distance', 'Enter a mm value:', value=100, decimals=2) + self.solv.distance(e1, e2, length, self.wp) + + if self.solv.solve() == ResultFlag.OKAY: + print("Fuck yeah") + self.constrain_done.emit() + + elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: + print("Solve_failed - Converge") + + elif self.solv.solve() == ResultFlag.TOO_MANY_UNKNOWNS: + print("Solve_failed - Unknowns") + + elif self.solv.solve() == ResultFlag.INCONSISTENT: + print("Solve_failed - Incons") + + self.main_buffer = [None, None] points_need_update = self.check_all_points() self.update_ui_points(points_need_update) self.check_all_lines_and_update(points_need_update) - dof = self.solv.dof() - print(dof) - self.update() def mouseMoveEvent(self, event): diff --git a/main.py b/main.py index 4934e13..c0f04de 100644 --- a/main.py +++ b/main.py @@ -71,8 +71,11 @@ class MainWindow(QMainWindow): def act_line_mode(self): if not self.ui.pb_linetool.isChecked(): self.sketchWidget.mouse_mode = 'line' + print(self.ui.pb_linetool.isChecked()) else: self.sketchWidget.mouse_mode = None + self.sketchWidget.line_buffer = [None, None] + print(self.ui.pb_linetool.isChecked()) def act_constrain_pt_pt_mode(self): if not self.ui.pb_con_ptpt.isChecked(): @@ -111,9 +114,13 @@ class MainWindow(QMainWindow): self.sketchWidget.mouse_mode = None def constrain_finished(self): + # safely disable the line modes self.ui.pb_con_ptpt.setChecked(False) self.ui.pb_con_line.setChecked(False) self.ui.pb_con_dist.setChecked(False) + self.ui.pb_con_mid.setChecked(False) + self.ui.pb_con_perp.setChecked(False) + def view_update(self): print("Update")