From fcabe449f8ed13dc5857c43eb70fdb743b82cc97 Mon Sep 17 00:00:00 2001 From: bklronin Date: Mon, 1 Jul 2024 13:34:42 +0200 Subject: [PATCH] - Re enebaled mesh generation - fixed line tool right button break line - implemented main buffer for pt-line distance --- drawing_modules/draw_widget2d.py | 52 +++++++++++----------- main.py | 75 ++++++++++---------------------- 2 files changed, 50 insertions(+), 77 deletions(-) diff --git a/drawing_modules/draw_widget2d.py b/drawing_modules/draw_widget2d.py index afa115a..f7435ed 100644 --- a/drawing_modules/draw_widget2d.py +++ b/drawing_modules/draw_widget2d.py @@ -7,6 +7,11 @@ from PySide6.QtGui import QPainter, QPen, QColor from PySide6.QtCore import Qt, QPoint, QPointF, Signal from python_solvespace import SolverSystem, ResultFlag +class DrawingTools(): + pass +class Costrains(): + pass + class SketchWidget(QWidget): constrain_done = Signal() @@ -16,20 +21,12 @@ class SketchWidget(QWidget): self.drag_buffer = [None, None] self.main_buffer = [None, None] - self.distance_line = None - self.distance_point = None - self.point_for_mid = None - self.line_selected_mid = None - self.zoom = 1 - self.selected_main_idx = None - self.pt_line_buffer = None self.hovered_point = None - self.line_buffer = None - self.pt_pt_buffer = None - - self.points = [] self.selected_line = None + self.snapping_range = 20 # Range in pixels for snapping + self.zoom = 1 + self.setMouseTracking(True) self.mouse_mode = False self.wp = None @@ -38,11 +35,16 @@ class SketchWidget(QWidget): self.slv_points_main = [] self.slv_lines_main = [] + def reset_buffers(self): + self.line_draw_buffer = [None, None] + self.drag_buffer = [None, None] + self.main_buffer = [None, None] + def set_points(self, points: list): self.points = points #self.update() - def create_worplane(self): + def create_workplane(self): self.wp = self.solv.create_2d_base() def get_handle_nr(self, input_str: str) -> int: @@ -177,7 +179,6 @@ class SketchWidget(QWidget): # Update the point in slv_points_main self.slv_points_main[index]['ui_point'] = new_point - # Print updated state # print("Updated slv_points_main:", self.slv_points_main) @@ -232,6 +233,9 @@ class SketchWidget(QWidget): if event.button() == Qt.LeftButton and not self.mouse_mode: self.drag_buffer[0] = self.get_handle_from_ui_point(self.hovered_point) + if event.button() == Qt.RightButton and self.mouse_mode: + self.reset_buffers() + if event.button() == Qt.LeftButton and self.mouse_mode == "line": clicked_pos = local_event_pos @@ -300,7 +304,6 @@ class SketchWidget(QWidget): # Points if event.button() == Qt.LeftButton and self.mouse_mode == "pt_pt": - if self.hovered_point and not self.main_buffer[0]: self.main_buffer[0] = self.get_handle_from_ui_point(self.hovered_point) @@ -313,7 +316,6 @@ class SketchWidget(QWidget): self.solv.coincident(self.main_buffer[0], self.main_buffer[1], self.wp) if self.solv.solve() == ResultFlag.OKAY: - self.constrain_done.emit() print("Fuck yeah") elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: @@ -324,6 +326,7 @@ class SketchWidget(QWidget): elif self.solv.solve() == ResultFlag.INCONSISTENT: print("Solve_failed - Incons") + self.constrain_done.emit() self.main_buffer = [None, None] if event.button() == Qt.LeftButton and self.mouse_mode == "pt_line": @@ -353,6 +356,7 @@ class SketchWidget(QWidget): elif self.solv.solve() == ResultFlag.INCONSISTENT: print("Solve_failed - Incons") + self.constrain_done.emit() # Clear saved_points after solve attempt self.main_buffer = [None, None] @@ -373,8 +377,6 @@ class SketchWidget(QWidget): if self.solv.solve() == ResultFlag.OKAY: print("Fuck yeah") - self.constrain_done.emit() - elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: print("Solve_failed - Converge") @@ -383,6 +385,7 @@ class SketchWidget(QWidget): elif self.solv.solve() == ResultFlag.INCONSISTENT: print("Solve_failed - Incons") + self.constrain_done.emit() self.main_buffer = [None, None] @@ -396,8 +399,6 @@ class SketchWidget(QWidget): if self.solv.solve() == ResultFlag.OKAY: print("Fuck yeah") - self.constrain_done.emit() - elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: print("Solve_failed - Converge") @@ -416,8 +417,6 @@ class SketchWidget(QWidget): if self.solv.solve() == ResultFlag.OKAY: print("Fuck yeah") - self.constrain_done.emit() - elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: print("Solve_failed - Converge") @@ -429,19 +428,20 @@ class SketchWidget(QWidget): if event.button() == Qt.LeftButton and self.mouse_mode == "distance": # Depending on selected elemnts either point line or line distance - print("distance") + #print("distance") e1 = None e2 = None if self.hovered_point: + print("buf point") # Get the point as UI point as buffer self.main_buffer[0] = self.hovered_point - if self.selected_line: + elif 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: + if self.main_buffer[0] and self.main_buffer[1]: # 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]) @@ -457,7 +457,6 @@ class SketchWidget(QWidget): if self.solv.solve() == ResultFlag.OKAY: print("Fuck yeah") - self.constrain_done.emit() elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: print("Solve_failed - Converge") @@ -468,8 +467,10 @@ class SketchWidget(QWidget): elif self.solv.solve() == ResultFlag.INCONSISTENT: print("Solve_failed - Incons") + self.constrain_done.emit() self.main_buffer = [None, None] + # Update the main point list with the new elements and draw them points_need_update = self.check_all_points() self.update_ui_points(points_need_update) self.check_all_lines_and_update(points_need_update) @@ -559,7 +560,6 @@ class SketchWidget(QWidget): painter.setPen(QPen(Qt.red, 4)) painter.drawPoint(middle_x, middle_y) - def to_quadrant_coords(self, point): """Translate linear coordinates to quadrant coordinates.""" center_x = self.width() // 2 diff --git a/main.py b/main.py index c0f04de..4758028 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,7 @@ import uuid import names -from PySide6.QtCore import Qt +from PySide6.QtCore import Qt, QPoint from PySide6.QtWidgets import QApplication, QMainWindow, QSizePolicy, QInputDialog from Gui import Ui_fluencyCAD # Import the generated GUI module from drawing_modules.gl_widget import OpenGLWidget @@ -63,19 +63,18 @@ class MainWindow(QMainWindow): self.ui.pb_cutop.pressed.connect(self.send_cut) self.ui.pb_del_body.pressed.connect(self.del_body) - self.sketchWidget.constrain_done.connect(self.constrain_finished) + self.sketchWidget.constrain_done.connect(self.draw_op_complete) def add_wp_origin(self): - self.sketchWidget.create_worplane() + self.sketchWidget.create_workplane() 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()) + self.sketchWidget.line_draw_buffer = [None, None] + def act_constrain_pt_pt_mode(self): if not self.ui.pb_con_ptpt.isChecked(): @@ -113,14 +112,17 @@ class MainWindow(QMainWindow): else: self.sketchWidget.mouse_mode = None - def constrain_finished(self): + def draw_op_complete(self): # safely disable the line modes + self.ui.pb_linetool.setChecked(False) 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) + self.sketchWidget.mouse_mode = None + self.sketchWidget.reset_buffers() def view_update(self): print("Update") @@ -137,13 +139,15 @@ class MainWindow(QMainWindow): print(f"Selected item: {name}") def add_sketch(self): + points_for_poly = [] name = f"sketch-{str(names.get_first_name())}" - points = self.sketchWidget.points + for point_to_poly in self.sketchWidget.slv_points_main: + points_for_poly.append(self.translate_points_tup(point_to_poly['ui_point'])) element = { 'id': name, 'type': 'polygon', - 'sketch_points': points, + 'sketch_points': points_for_poly, } self.model['sketch'][element['id']] = element @@ -215,42 +219,36 @@ class MainWindow(QMainWindow): print(f"Removed operation: {item_name}") self.openGLWidget.clear_mesh() - def translate_points_tup(self, points): + def translate_points_tup(self, point: QPoint): """QPoints from Display to mesh data input: Qpoints output: Tuple X,Y """ - p_list = [] - - for ps in points: - p_list.append((ps.x(), ps.y())) - - return p_list + if isinstance(point, QPoint): + return point.x(), point.y() def send_extrude(self): selected = self.ui.sketch_list.currentItem() name = selected.text() points = self.model['sketch'][name]['sketch_points'] - # UI to mesh - points = self.translate_points_tup(points) if points[-1] == points[0]: - result = points.pop() - print("removed last point for mesh") + #detect loop that causes problems in mesh generation + del points[-1] - length , ok = QInputDialog.getDouble(self, 'Extrude Length', 'Enter a mm value:', decimals=2) + print(points) + + length, ok = QInputDialog.getDouble(self, 'Extrude Length', 'Enter a mm value:', decimals=2) #TODO : Implement cancel geo = Geometry() f = geo.extrude_shape(points, length) - name_op = f"extrd-{name}" - element = { 'id': name_op, 'type': 'extrude', 'sdf_object': f, } - + print(element) self.model['operation'][name_op] = element @@ -259,9 +257,8 @@ class MainWindow(QMainWindow): self.ui.body_list.setCurrentItem(items) self.view_update() - def send_cut(self): - name = self.ui.sketch_list.currentItem().text() + name = self.ui.body_list.currentItem().text() points = self.model['operation'][name]['sdf_object'] self.list_selected.append(points) print(self.list_selected) @@ -280,9 +277,8 @@ class MainWindow(QMainWindow): self.model['operation'][name_op] = element self.ui.body_list.addItem(name_op) items = self.ui.sketch_list.findItems(name_op, Qt.MatchExactly) - self.ui.body_list.setCurrentItem(items[0]) + self.ui.body_list.setCurrentItem(items[-1]) self.view_update() - else: print("mindestens 2!") @@ -290,24 +286,6 @@ class MainWindow(QMainWindow): self.openGLWidget.load_stl(file) self.openGLWidget.update() - """ def check_current_tab(self): - if self.ui.InputTab.currentIndex() == 0: - geo = Geometry() - geo.generate_mesh_from_draw(self.sketchWidget.points) - self.load_and_render("out.stl") - - elif self.ui.InputTab.currentIndex() == 1: - code_bytes = self.ui.textEdit.toPlainText().encode('utf-8') - code_text = code_bytes.decode('utf-8') - save_string = "\nf.save('out.stl', samples=2**12)" - code_text += save_string - - geo = Geometry() - geo.generate_mesh_from_code(code_text) - self.load_and_render("out.stl")""" - - - class Geometry: def distance(self, p1, p2): """Calculate the distance between two points.""" @@ -317,14 +295,11 @@ class Geometry: def extrude_shape(self, points, length: float): """2D to 3D sdf always first""" - f = polygon(points).extrude(length) - return f def cut_shapes(self, sdf_object1, sdf_object2): f = difference(sdf_object1, sdf_object2) # equivalent - return f def export_mesh(self, sdf_object): @@ -338,7 +313,6 @@ class Geometry: try: print(code_text) exec(code_text, globals(), local_vars) - # Retrieve the result from the captured local variables result = local_vars.get('result') print("Result:", result) @@ -346,7 +320,6 @@ class Geometry: except Exception as e: print("Error executing code:", e) - if __name__ == "__main__": app = QApplication([]) window = MainWindow()