- Re enebaled mesh generation

- fixed line tool right button break line
- implemented main buffer for pt-line distance
This commit is contained in:
bklronin 2024-07-01 13:34:42 +02:00
parent e9098108d2
commit fcabe449f8
2 changed files with 50 additions and 77 deletions

View File

@ -7,6 +7,11 @@ from PySide6.QtGui import QPainter, QPen, QColor
from PySide6.QtCore import Qt, QPoint, QPointF, Signal from PySide6.QtCore import Qt, QPoint, QPointF, Signal
from python_solvespace import SolverSystem, ResultFlag from python_solvespace import SolverSystem, ResultFlag
class DrawingTools():
pass
class Costrains():
pass
class SketchWidget(QWidget): class SketchWidget(QWidget):
constrain_done = Signal() constrain_done = Signal()
@ -16,20 +21,12 @@ class SketchWidget(QWidget):
self.drag_buffer = [None, None] self.drag_buffer = [None, None]
self.main_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.hovered_point = None
self.line_buffer = None
self.pt_pt_buffer = None
self.points = []
self.selected_line = None self.selected_line = None
self.snapping_range = 20 # Range in pixels for snapping self.snapping_range = 20 # Range in pixels for snapping
self.zoom = 1
self.setMouseTracking(True) self.setMouseTracking(True)
self.mouse_mode = False self.mouse_mode = False
self.wp = None self.wp = None
@ -38,11 +35,16 @@ class SketchWidget(QWidget):
self.slv_points_main = [] self.slv_points_main = []
self.slv_lines_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): def set_points(self, points: list):
self.points = points self.points = points
#self.update() #self.update()
def create_worplane(self): def create_workplane(self):
self.wp = self.solv.create_2d_base() self.wp = self.solv.create_2d_base()
def get_handle_nr(self, input_str: str) -> int: def get_handle_nr(self, input_str: str) -> int:
@ -177,7 +179,6 @@ class SketchWidget(QWidget):
# Update the point in slv_points_main # Update the point in slv_points_main
self.slv_points_main[index]['ui_point'] = new_point self.slv_points_main[index]['ui_point'] = new_point
# Print updated state # Print updated state
# print("Updated slv_points_main:", self.slv_points_main) # 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: if event.button() == Qt.LeftButton and not self.mouse_mode:
self.drag_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.RightButton and self.mouse_mode:
self.reset_buffers()
if event.button() == Qt.LeftButton and self.mouse_mode == "line": if event.button() == Qt.LeftButton and self.mouse_mode == "line":
clicked_pos = local_event_pos clicked_pos = local_event_pos
@ -300,7 +304,6 @@ class SketchWidget(QWidget):
# Points # Points
if event.button() == Qt.LeftButton and self.mouse_mode == "pt_pt": if event.button() == Qt.LeftButton and self.mouse_mode == "pt_pt":
if self.hovered_point and not self.main_buffer[0]: if self.hovered_point and not self.main_buffer[0]:
self.main_buffer[0] = self.get_handle_from_ui_point(self.hovered_point) 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) self.solv.coincident(self.main_buffer[0], self.main_buffer[1], self.wp)
if self.solv.solve() == ResultFlag.OKAY: if self.solv.solve() == ResultFlag.OKAY:
self.constrain_done.emit()
print("Fuck yeah") print("Fuck yeah")
elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE:
@ -324,6 +326,7 @@ class SketchWidget(QWidget):
elif self.solv.solve() == ResultFlag.INCONSISTENT: elif self.solv.solve() == ResultFlag.INCONSISTENT:
print("Solve_failed - Incons") print("Solve_failed - Incons")
self.constrain_done.emit()
self.main_buffer = [None, None] self.main_buffer = [None, None]
if event.button() == Qt.LeftButton and self.mouse_mode == "pt_line": if event.button() == Qt.LeftButton and self.mouse_mode == "pt_line":
@ -353,6 +356,7 @@ class SketchWidget(QWidget):
elif self.solv.solve() == ResultFlag.INCONSISTENT: elif self.solv.solve() == ResultFlag.INCONSISTENT:
print("Solve_failed - Incons") print("Solve_failed - Incons")
self.constrain_done.emit()
# Clear saved_points after solve attempt # Clear saved_points after solve attempt
self.main_buffer = [None, None] self.main_buffer = [None, None]
@ -373,8 +377,6 @@ class SketchWidget(QWidget):
if self.solv.solve() == ResultFlag.OKAY: if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah") print("Fuck yeah")
self.constrain_done.emit()
elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE:
print("Solve_failed - Converge") print("Solve_failed - Converge")
@ -383,6 +385,7 @@ class SketchWidget(QWidget):
elif self.solv.solve() == ResultFlag.INCONSISTENT: elif self.solv.solve() == ResultFlag.INCONSISTENT:
print("Solve_failed - Incons") print("Solve_failed - Incons")
self.constrain_done.emit()
self.main_buffer = [None, None] self.main_buffer = [None, None]
@ -396,8 +399,6 @@ class SketchWidget(QWidget):
if self.solv.solve() == ResultFlag.OKAY: if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah") print("Fuck yeah")
self.constrain_done.emit()
elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE:
print("Solve_failed - Converge") print("Solve_failed - Converge")
@ -416,8 +417,6 @@ class SketchWidget(QWidget):
if self.solv.solve() == ResultFlag.OKAY: if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah") print("Fuck yeah")
self.constrain_done.emit()
elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE:
print("Solve_failed - Converge") print("Solve_failed - Converge")
@ -429,19 +428,20 @@ class SketchWidget(QWidget):
if event.button() == Qt.LeftButton and self.mouse_mode == "distance": if event.button() == Qt.LeftButton and self.mouse_mode == "distance":
# Depending on selected elemnts either point line or line distance # Depending on selected elemnts either point line or line distance
print("distance") #print("distance")
e1 = None e1 = None
e2 = None e2 = None
if self.hovered_point: if self.hovered_point:
print("buf point")
# Get the point as UI point as buffer # Get the point as UI point as buffer
self.main_buffer[0] = self.hovered_point self.main_buffer[0] = self.hovered_point
if self.selected_line: elif self.selected_line:
# Get the point as UI point as buffer # Get the point as UI point as buffer
self.main_buffer[1] = local_event_pos 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 # Define point line combination
e1 = self.get_handle_from_ui_point(self.main_buffer[0]) e1 = self.get_handle_from_ui_point(self.main_buffer[0])
e2 = self.get_line_handle_from_ui_point(self.main_buffer[1]) 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: if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah") print("Fuck yeah")
self.constrain_done.emit()
elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE: elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE:
print("Solve_failed - Converge") print("Solve_failed - Converge")
@ -468,8 +467,10 @@ class SketchWidget(QWidget):
elif self.solv.solve() == ResultFlag.INCONSISTENT: elif self.solv.solve() == ResultFlag.INCONSISTENT:
print("Solve_failed - Incons") print("Solve_failed - Incons")
self.constrain_done.emit()
self.main_buffer = [None, None] self.main_buffer = [None, None]
# Update the main point list with the new elements and draw them
points_need_update = self.check_all_points() points_need_update = self.check_all_points()
self.update_ui_points(points_need_update) self.update_ui_points(points_need_update)
self.check_all_lines_and_update(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.setPen(QPen(Qt.red, 4))
painter.drawPoint(middle_x, middle_y) painter.drawPoint(middle_x, middle_y)
def to_quadrant_coords(self, point): def to_quadrant_coords(self, point):
"""Translate linear coordinates to quadrant coordinates.""" """Translate linear coordinates to quadrant coordinates."""
center_x = self.width() // 2 center_x = self.width() // 2

75
main.py
View File

@ -1,7 +1,7 @@
import uuid import uuid
import names import names
from PySide6.QtCore import Qt from PySide6.QtCore import Qt, QPoint
from PySide6.QtWidgets import QApplication, QMainWindow, QSizePolicy, QInputDialog from PySide6.QtWidgets import QApplication, QMainWindow, QSizePolicy, QInputDialog
from Gui import Ui_fluencyCAD # Import the generated GUI module from Gui import Ui_fluencyCAD # Import the generated GUI module
from drawing_modules.gl_widget import OpenGLWidget 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_cutop.pressed.connect(self.send_cut)
self.ui.pb_del_body.pressed.connect(self.del_body) 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): def add_wp_origin(self):
self.sketchWidget.create_worplane() self.sketchWidget.create_workplane()
def act_line_mode(self): def act_line_mode(self):
if not self.ui.pb_linetool.isChecked(): if not self.ui.pb_linetool.isChecked():
self.sketchWidget.mouse_mode = 'line' self.sketchWidget.mouse_mode = 'line'
print(self.ui.pb_linetool.isChecked())
else: else:
self.sketchWidget.mouse_mode = None self.sketchWidget.mouse_mode = None
self.sketchWidget.line_buffer = [None, None] self.sketchWidget.line_draw_buffer = [None, None]
print(self.ui.pb_linetool.isChecked())
def act_constrain_pt_pt_mode(self): def act_constrain_pt_pt_mode(self):
if not self.ui.pb_con_ptpt.isChecked(): if not self.ui.pb_con_ptpt.isChecked():
@ -113,14 +112,17 @@ class MainWindow(QMainWindow):
else: else:
self.sketchWidget.mouse_mode = None self.sketchWidget.mouse_mode = None
def constrain_finished(self): def draw_op_complete(self):
# safely disable the line modes # safely disable the line modes
self.ui.pb_linetool.setChecked(False)
self.ui.pb_con_ptpt.setChecked(False) self.ui.pb_con_ptpt.setChecked(False)
self.ui.pb_con_line.setChecked(False) self.ui.pb_con_line.setChecked(False)
self.ui.pb_con_dist.setChecked(False) self.ui.pb_con_dist.setChecked(False)
self.ui.pb_con_mid.setChecked(False) self.ui.pb_con_mid.setChecked(False)
self.ui.pb_con_perp.setChecked(False) self.ui.pb_con_perp.setChecked(False)
self.sketchWidget.mouse_mode = None
self.sketchWidget.reset_buffers()
def view_update(self): def view_update(self):
print("Update") print("Update")
@ -137,13 +139,15 @@ class MainWindow(QMainWindow):
print(f"Selected item: {name}") print(f"Selected item: {name}")
def add_sketch(self): def add_sketch(self):
points_for_poly = []
name = f"sketch-{str(names.get_first_name())}" 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 = { element = {
'id': name, 'id': name,
'type': 'polygon', 'type': 'polygon',
'sketch_points': points, 'sketch_points': points_for_poly,
} }
self.model['sketch'][element['id']] = element self.model['sketch'][element['id']] = element
@ -215,42 +219,36 @@ class MainWindow(QMainWindow):
print(f"Removed operation: {item_name}") print(f"Removed operation: {item_name}")
self.openGLWidget.clear_mesh() self.openGLWidget.clear_mesh()
def translate_points_tup(self, points): def translate_points_tup(self, point: QPoint):
"""QPoints from Display to mesh data """QPoints from Display to mesh data
input: Qpoints input: Qpoints
output: Tuple X,Y output: Tuple X,Y
""" """
p_list = [] if isinstance(point, QPoint):
return point.x(), point.y()
for ps in points:
p_list.append((ps.x(), ps.y()))
return p_list
def send_extrude(self): def send_extrude(self):
selected = self.ui.sketch_list.currentItem() selected = self.ui.sketch_list.currentItem()
name = selected.text() name = selected.text()
points = self.model['sketch'][name]['sketch_points'] points = self.model['sketch'][name]['sketch_points']
# UI to mesh
points = self.translate_points_tup(points)
if points[-1] == points[0]: if points[-1] == points[0]:
result = points.pop() #detect loop that causes problems in mesh generation
print("removed last point for mesh") 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 #TODO : Implement cancel
geo = Geometry() geo = Geometry()
f = geo.extrude_shape(points, length) f = geo.extrude_shape(points, length)
name_op = f"extrd-{name}" name_op = f"extrd-{name}"
element = { element = {
'id': name_op, 'id': name_op,
'type': 'extrude', 'type': 'extrude',
'sdf_object': f, 'sdf_object': f,
} }
print(element)
self.model['operation'][name_op] = element self.model['operation'][name_op] = element
@ -259,9 +257,8 @@ class MainWindow(QMainWindow):
self.ui.body_list.setCurrentItem(items) self.ui.body_list.setCurrentItem(items)
self.view_update() self.view_update()
def send_cut(self): 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'] points = self.model['operation'][name]['sdf_object']
self.list_selected.append(points) self.list_selected.append(points)
print(self.list_selected) print(self.list_selected)
@ -280,9 +277,8 @@ class MainWindow(QMainWindow):
self.model['operation'][name_op] = element self.model['operation'][name_op] = element
self.ui.body_list.addItem(name_op) self.ui.body_list.addItem(name_op)
items = self.ui.sketch_list.findItems(name_op, Qt.MatchExactly) 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() self.view_update()
else: else:
print("mindestens 2!") print("mindestens 2!")
@ -290,24 +286,6 @@ class MainWindow(QMainWindow):
self.openGLWidget.load_stl(file) self.openGLWidget.load_stl(file)
self.openGLWidget.update() 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: class Geometry:
def distance(self, p1, p2): def distance(self, p1, p2):
"""Calculate the distance between two points.""" """Calculate the distance between two points."""
@ -317,14 +295,11 @@ class Geometry:
def extrude_shape(self, points, length: float): def extrude_shape(self, points, length: float):
"""2D to 3D sdf always first""" """2D to 3D sdf always first"""
f = polygon(points).extrude(length) f = polygon(points).extrude(length)
return f return f
def cut_shapes(self, sdf_object1, sdf_object2): def cut_shapes(self, sdf_object1, sdf_object2):
f = difference(sdf_object1, sdf_object2) # equivalent f = difference(sdf_object1, sdf_object2) # equivalent
return f return f
def export_mesh(self, sdf_object): def export_mesh(self, sdf_object):
@ -338,7 +313,6 @@ class Geometry:
try: try:
print(code_text) print(code_text)
exec(code_text, globals(), local_vars) exec(code_text, globals(), local_vars)
# Retrieve the result from the captured local variables # Retrieve the result from the captured local variables
result = local_vars.get('result') result = local_vars.get('result')
print("Result:", result) print("Result:", result)
@ -346,7 +320,6 @@ class Geometry:
except Exception as e: except Exception as e:
print("Error executing code:", e) print("Error executing code:", e)
if __name__ == "__main__": if __name__ == "__main__":
app = QApplication([]) app = QApplication([])
window = MainWindow() window = MainWindow()