- 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 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

75
main.py
View File

@ -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()