- Re enebaled mesh generation
- fixed line tool right button break line - implemented main buffer for pt-line distance
This commit is contained in:
parent
e9098108d2
commit
fcabe449f8
@ -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
|
||||
|
73
main.py
73
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]
|
||||
|
||||
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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user