- Bsic sketch to object approach

This commit is contained in:
bklronin 2024-07-28 13:46:55 +02:00
parent cebe1b41e7
commit b80185e93e
3 changed files with 182 additions and 186 deletions

View File

@ -1,6 +1,7 @@
import math import math
import re import re
from copy import copy from copy import copy
from typing import Optional
import numpy as np import numpy as np
from PySide6.QtWidgets import QApplication, QWidget, QMessageBox, QInputDialog from PySide6.QtWidgets import QApplication, QWidget, QMessageBox, QInputDialog
@ -19,9 +20,6 @@ class SketchWidget(QWidget):
self.drag_buffer = [None, None] self.drag_buffer = [None, None]
self.main_buffer = [None, None] self.main_buffer = [None, None]
self.proj_snap_points = []
self.proj_snap_lines = []
self.hovered_point = None self.hovered_point = None
self.selected_line = None self.selected_line = None
@ -30,11 +28,17 @@ class SketchWidget(QWidget):
self.setMouseTracking(True) self.setMouseTracking(True)
self.mouse_mode = False self.mouse_mode = False
self.wp = None
self.solv = SolverSystem() self.solv = SolverSystem()
self.slv_points_main = [] self.sketch = None
self.slv_lines_main = []
def set_sketch(self, sketch) -> None:
print(sketch)
self.sketch = sketch
self.create_workplane()
def get_sketch(self):
return self.sketch
def reset_buffers(self): def reset_buffers(self):
self.line_draw_buffer = [None, None] self.line_draw_buffer = [None, None]
@ -46,44 +50,28 @@ class SketchWidget(QWidget):
#self.update() #self.update()
def create_workplane(self): def create_workplane(self):
self.wp = self.solv.create_2d_base() self.sketch.working_plane = self.solv.create_2d_base()
def create_workplane_projected(self): def create_workplane_projected(self):
self.wp = self.solv.create_2d_base() self.sketch.working_plane = self.solv.create_2d_base()
def create_proj_points(self, proj_points): def convert_proj_points(self):
"""Lines as orientation projected from the sketch""" out_points = []
for point in self.sketch.proj_points:
for point in proj_points:
x, y = point x, y = point
coord = QPoint(x, y) coord = QPoint(x, y)
self.proj_snap_points.append(coord) out_points.append(coord)
"""relation_point = {} # Reinitialize the dictionary self.sketch.proj_points = out_points
#handle_nr = self.get_handle_nr(str(point))
#relation_point['handle_nr'] = handle_nr
#relation_point['solv_handle'] = point
relation_point['ui_point'] = QPoint(x, y)
self.slv_points_main.append(relation_point)"""
def create_proj_lines(self, sel_edges):
"""Lines as orientation projected from the sketch"""
print("Incoming corrd lines", sel_edges)
for line in sel_edges:
def convert_proj_lines(self):
out_lines = []
for line in self.sketch.proj_lines:
start = QPoint(line[0][0], line[0][1]) start = QPoint(line[0][0], line[0][1])
end = QPoint(line[1][0], line[1][1]) end = QPoint(line[1][0], line[1][1])
coord = QLine(start, end) coord = QLine(start, end)
self.proj_snap_lines.append(coord) out_lines.append(coord)
self.sketch.proj_lines = out_lines
"""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'] = QPoint(x, y)
self.slv_points_main.append(relation_point)"""
def find_duplicate_points_2d(self, edges): def find_duplicate_points_2d(self, edges):
points = [] points = []
@ -132,8 +120,8 @@ class SketchWidget(QWidget):
qw, qx, qy, qz = self.normal_to_quaternion(normal) qw, qx, qy, qz = self.normal_to_quaternion(normal)
slv_normal = self.solv.add_normal_3d(qw, qx, qy, qz) slv_normal = self.solv.add_normal_3d(qw, qx, qy, qz)
self.wp = self.solv.add_work_plane(origin_handle, slv_normal) self.sketch.working_plane = self.solv.add_work_plane(origin_handle, slv_normal)
print(self.wp) print(self.sketch.working_plane)
def get_handle_nr(self, input_str: str) -> int: def get_handle_nr(self, input_str: str) -> int:
# Define the regex pattern to extract the handle number # Define the regex pattern to extract the handle number
@ -168,7 +156,7 @@ class SketchWidget(QWidget):
def get_handle_from_ui_point(self, ui_point: QPoint): def get_handle_from_ui_point(self, ui_point: QPoint):
"""Input QPoint and you shall reveive a slvs entity handle!""" """Input QPoint and you shall reveive a slvs entity handle!"""
for point in self.slv_points_main: for point in self.sketch.slv_points:
if ui_point == point['ui_point']: if ui_point == point['ui_point']:
slv_handle = point['solv_handle'] slv_handle = point['solv_handle']
@ -176,7 +164,7 @@ class SketchWidget(QWidget):
def get_line_handle_from_ui_point(self, ui_point: QPoint): def get_line_handle_from_ui_point(self, ui_point: QPoint):
"""Input Qpoint that is on a line and you shall receive the handle of the line!""" """Input Qpoint that is on a line and you shall receive the handle of the line!"""
for target_line_con in self.slv_lines_main: for target_line_con in self.sketch.slv_lines:
if self.is_point_on_line(ui_point, target_line_con['ui_points'][0], target_line_con['ui_points'][1]): if self.is_point_on_line(ui_point, target_line_con['ui_points'][0], target_line_con['ui_points'][1]):
slv_handle = target_line_con['solv_handle'] slv_handle = target_line_con['solv_handle']
@ -184,7 +172,7 @@ class SketchWidget(QWidget):
def get_point_line_handles_from_ui_point(self, ui_point: QPoint) -> tuple: def get_point_line_handles_from_ui_point(self, ui_point: QPoint) -> tuple:
"""Input Qpoint that is on a line and you shall receive the handles of the points of the line!""" """Input Qpoint that is on a line and you shall receive the handles of the points of the line!"""
for target_line_con in self.slv_lines_main: for target_line_con in self.sketch.slv_lines:
if self.is_point_on_line(ui_point, target_line_con['ui_points'][0], target_line_con['ui_points'][1]): if self.is_point_on_line(ui_point, target_line_con['ui_points'][0], target_line_con['ui_points'][1]):
lines_to_cons = target_line_con['solv_entity_points'] lines_to_cons = target_line_con['solv_entity_points']
@ -231,7 +219,7 @@ class SketchWidget(QWidget):
old_points_ui = [] old_points_ui = []
new_points_ui = [] new_points_ui = []
for old_point_ui in self.slv_points_main: for old_point_ui in self.sketch.slv_points:
old_points_ui.append(old_point_ui['ui_point']) old_points_ui.append(old_point_ui['ui_point'])
for i in range(self.solv.entity_len()): for i in range(self.solv.entity_len()):
@ -265,14 +253,14 @@ class SketchWidget(QWidget):
index, old_point, new_point = tbu_points_idx index, old_point, new_point = tbu_points_idx
# Update the point in slv_points_main # Update the point in slv_points_main
self.slv_points_main[index]['ui_point'] = new_point self.sketch.slv_points[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)
def check_all_lines_and_update(self,changed_points: list): def check_all_lines_and_update(self,changed_points: list):
for tbu_points_idx in changed_points: for tbu_points_idx in changed_points:
index, old_point, new_point = tbu_points_idx index, old_point, new_point = tbu_points_idx
for line_needs_update in self.slv_lines_main: for line_needs_update in self.sketch.slv_lines:
if old_point == line_needs_update['ui_points'][0]: if old_point == line_needs_update['ui_points'][0]:
line_needs_update['ui_points'][0] = new_point line_needs_update['ui_points'][0] = new_point
elif old_point == line_needs_update['ui_points'][1]: elif old_point == line_needs_update['ui_points'][1]:
@ -334,7 +322,7 @@ class SketchWidget(QWidget):
u = clicked_pos.x() u = clicked_pos.x()
v = clicked_pos.y() v = clicked_pos.y()
point = self.solv.add_point_2d(u, v, self.wp) point = self.solv.add_point_2d(u, v, self.sketch.working_plane)
relation_point = {} # Reinitialize the dictionary relation_point = {} # Reinitialize the dictionary
handle_nr = self.get_handle_nr(str(point)) handle_nr = self.get_handle_nr(str(point))
@ -342,17 +330,17 @@ class SketchWidget(QWidget):
relation_point['solv_handle'] = point relation_point['solv_handle'] = point
relation_point['ui_point'] = clicked_pos relation_point['ui_point'] = clicked_pos
self.slv_points_main.append(relation_point) self.sketch.slv_points.append(relation_point)
print("points", self.slv_points_main) print("points", self.sketch.slv_points)
print("lines", self.slv_lines_main) print("lines", self.sketch.slv_lines)
elif self.line_draw_buffer[0]: elif self.line_draw_buffer[0]:
self.line_draw_buffer[1] = clicked_pos self.line_draw_buffer[1] = clicked_pos
u = clicked_pos.x() u = clicked_pos.x()
v = clicked_pos.y() v = clicked_pos.y()
point2 = self.solv.add_point_2d(u, v, self.wp) point2 = self.solv.add_point_2d(u, v, self.sketch.working_plane)
relation_point = {} # Reinitialize the dictionary relation_point = {} # Reinitialize the dictionary
handle_nr = self.get_handle_nr(str(point2)) handle_nr = self.get_handle_nr(str(point2))
@ -360,19 +348,18 @@ class SketchWidget(QWidget):
relation_point['solv_handle'] = point2 relation_point['solv_handle'] = point2
relation_point['ui_point'] = clicked_pos relation_point['ui_point'] = clicked_pos
self.slv_points_main.append(relation_point) self.sketch.slv_points.append(relation_point)
print("points", self.slv_points_main) print("points", self.sketch.slv_points)
print("lines", self.slv_lines_main) print("lines", self.sketch.slv_lines)
print("Buffer state", self.line_draw_buffer) print("Buffer state", self.line_draw_buffer)
if self.line_draw_buffer[0] and self.line_draw_buffer[1]: 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_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]) 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) line = self.solv.add_line_2d(point_slv1, point_slv2, self.sketch.working_plane)
relation_line = {} # Reinitialize the dictionary relation_line = {} # Reinitialize the dictionary
handle_nr_line = self.get_handle_nr(str(line)) handle_nr_line = self.get_handle_nr(str(line))
@ -384,7 +371,7 @@ class SketchWidget(QWidget):
# Track relationship of point in line # Track relationship of point in line
relation_point['part_of_entity'] = handle_nr_line relation_point['part_of_entity'] = handle_nr_line
self.slv_lines_main.append(relation_line) self.sketch.slv_lines.append(relation_line)
# Reset the buffer for the next line segment # Reset the buffer for the next line segment
self.line_draw_buffer[0] = self.line_draw_buffer[1] self.line_draw_buffer[0] = self.line_draw_buffer[1]
@ -403,7 +390,7 @@ class SketchWidget(QWidget):
if self.main_buffer[0] and self.main_buffer[1]: if self.main_buffer[0] and self.main_buffer[1]:
print("buf", self.main_buffer) print("buf", self.main_buffer)
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.sketch.working_plane)
if self.solv.solve() == ResultFlag.OKAY: if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah") print("Fuck yeah")
@ -431,7 +418,7 @@ class SketchWidget(QWidget):
# Contrain point to line # Contrain point to line
if self.main_buffer[1]: if self.main_buffer[1]:
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.sketch.working_plane)
if self.solv.solve() == ResultFlag.OKAY: if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah") print("Fuck yeah")
@ -462,7 +449,7 @@ class SketchWidget(QWidget):
# Contrain point to line # Contrain point to line
if self.main_buffer[1]: if self.main_buffer[1]:
self.solv.midpoint(self.main_buffer[0], self.main_buffer[1], self.wp) self.solv.midpoint(self.main_buffer[0], self.main_buffer[1], self.sketch.working_plane)
if self.solv.solve() == ResultFlag.OKAY: if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah") print("Fuck yeah")
@ -484,7 +471,7 @@ class SketchWidget(QWidget):
line_selected = self.get_line_handle_from_ui_point(local_event_pos) line_selected = self.get_line_handle_from_ui_point(local_event_pos)
if line_selected: if line_selected:
self.solv.horizontal(line_selected, self.wp) self.solv.horizontal(line_selected, self.sketch.working_plane)
if self.solv.solve() == ResultFlag.OKAY: if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah") print("Fuck yeah")
@ -502,7 +489,7 @@ class SketchWidget(QWidget):
line_selected = self.get_line_handle_from_ui_point(local_event_pos) line_selected = self.get_line_handle_from_ui_point(local_event_pos)
if line_selected: if line_selected:
self.solv.vertical(line_selected, self.wp) self.solv.vertical(line_selected, self.sketch.working_plane)
if self.solv.solve() == ResultFlag.OKAY: if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah") print("Fuck yeah")
@ -543,7 +530,7 @@ class SketchWidget(QWidget):
if e1 and e2: if e1 and e2:
# Ask fo the dimension and solve if both elements are present # 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) length, ok = QInputDialog.getDouble(self, 'Distance', 'Enter a mm value:', value=100, decimals=2)
self.solv.distance(e1, e2, length, self.wp) self.solv.distance(e1, e2, length, self.sketch.working_plane)
if self.solv.solve() == ResultFlag.OKAY: if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah") print("Fuck yeah")
@ -574,13 +561,15 @@ class SketchWidget(QWidget):
min_distance = float('inf') min_distance = float('inf')
threshold = 10 # Distance threshold for highlighting threshold = 10 # Distance threshold for highlighting
for point in self.slv_points_main: if self.sketch:
for point in self.sketch.slv_points:
distance = (local_event_pos - point['ui_point']).manhattanLength() distance = (local_event_pos - point['ui_point']).manhattanLength()
if distance < threshold and distance < min_distance: if distance < threshold and distance < min_distance:
closest_point = point['ui_point'] closest_point = point['ui_point']
min_distance = distance min_distance = distance
for point in self.proj_snap_points: for point in self.sketch.proj_points:
distance = (local_event_pos - point).manhattanLength() distance = (local_event_pos - point).manhattanLength()
if distance < threshold and distance < min_distance: if distance < threshold and distance < min_distance:
closest_point = point closest_point = point
@ -590,7 +579,7 @@ class SketchWidget(QWidget):
self.hovered_point = closest_point self.hovered_point = closest_point
print(self.hovered_point) print(self.hovered_point)
for dic in self.slv_lines_main: for dic in self.sketch.slv_lines:
p1 = dic['ui_points'][0] p1 = dic['ui_points'][0]
p2 = dic['ui_points'][1] p2 = dic['ui_points'][1]
@ -722,10 +711,11 @@ class SketchWidget(QWidget):
painter.setPen(pen) painter.setPen(pen)
# Draw points # Draw points
for point in self.slv_points_main: if self.sketch:
for point in self.sketch.slv_points:
painter.drawEllipse(point['ui_point'], 3 / self.zoom, 3 / self.zoom) painter.drawEllipse(point['ui_point'], 3 / self.zoom, 3 / self.zoom)
for dic in self.slv_lines_main: for dic in self.sketch.slv_lines:
p1 = dic['ui_points'][0] p1 = dic['ui_points'][0]
p2 = dic['ui_points'][1] p2 = dic['ui_points'][1]
painter.drawLine(p1, p2) painter.drawLine(p1, p2)
@ -759,10 +749,10 @@ class SketchWidget(QWidget):
painter.setPen(QPen(Qt.red, 2 / self.zoom)) painter.setPen(QPen(Qt.red, 2 / self.zoom))
painter.drawLine(p1, p2) painter.drawLine(p1, p2)
for cross in self.proj_snap_points: for cross in self.sketch.proj_points:
self.draw_cross(painter, cross, 10 / self.zoom) self.draw_cross(painter, cross, 10 / self.zoom)
for selected in self.proj_snap_lines: for selected in self.sketch.proj_lines:
pen = QPen(Qt.white, 1, Qt.DashLine) pen = QPen(Qt.white, 1, Qt.DashLine)
painter.setPen(pen) painter.setPen(pen)
painter.drawLine(selected) painter.drawLine(selected)
@ -777,13 +767,6 @@ class SketchWidget(QWidget):
def aspect_ratio(self): def aspect_ratio(self):
return self.width() / self.height() * (1.0 / abs(self.zoom)) return self.width() / self.height() * (1.0 / abs(self.zoom))
def clear_sketch(self):
self.slv_points_main = []
self.slv_lines_main = []
self.proj_snap_lines.clear()
self.proj_snap_points.clear()
self.reset_buffers()
self.solv = SolverSystem()
# Example usage # Example usage
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -146,7 +146,6 @@ class VTKWidget(QtWidgets.QWidget):
self.renderer_indicators.ResetCameraClippingRange() self.renderer_indicators.ResetCameraClippingRange()
self.vtk_widget.GetRenderWindow().Render() self.vtk_widget.GetRenderWindow().Render()
def create_grid(self, size=100, spacing=10): def create_grid(self, size=100, spacing=10):
# Create a vtkPoints object and store the points in it # Create a vtkPoints object and store the points in it
points = vtk.vtkPoints() points = vtk.vtkPoints()

124
main.py
View File

@ -23,6 +23,7 @@ class ExtrudeDialog(QDialog):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.setWindowTitle('Extrude Options') self.setWindowTitle('Extrude Options')
def create_hline(): def create_hline():
line = QLabel() line = QLabel()
line.setStyleSheet("border-top: 1px solid #cccccc;") # Light grey line line.setStyleSheet("border-top: 1px solid #cccccc;") # Light grey line
@ -76,6 +77,7 @@ class ExtrudeDialog(QDialog):
def get_values(self): def get_values(self):
return self.length_input.value(), self.symmetric_checkbox.isChecked() ,self.invert_checkbox.isChecked(), self.cut_checkbox.isChecked(), self.union_checkbox.isChecked(), self.rounded_checkbox.isChecked() return self.length_input.value(), self.symmetric_checkbox.isChecked() ,self.invert_checkbox.isChecked(), self.cut_checkbox.isChecked(), self.union_checkbox.isChecked(), self.rounded_checkbox.isChecked()
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
send_command = Signal(str) send_command = Signal(str)
@ -100,7 +102,7 @@ class MainWindow(QMainWindow):
### Main Model ### Main Model
self.model = { self.model = {
'sketch': {}, 'sketches': {},
'operation': {}, 'operation': {},
} }
self.list_selected = [] self.list_selected = []
@ -145,8 +147,6 @@ class MainWindow(QMainWindow):
"""Project -> Timeline -> Component -> Sketch -> Body / Interactor -> Connector -> Assembly -> PB Render""" """Project -> Timeline -> Component -> Sketch -> Body / Interactor -> Connector -> Assembly -> PB Render"""
def on_flip_face(self): def on_flip_face(self):
self.send_command.emit("flip") self.send_command.emit("flip")
@ -208,7 +208,7 @@ class MainWindow(QMainWindow):
def draw_mesh(self): def draw_mesh(self):
name = self.ui.body_list.currentItem().text() name = self.ui.body_list.currentItem().text()
print("selected_for disp", name) print("selected_for disp", name)
model = self.project.timeline[-1].body.sdf_body model = self.project.timeline[-1].body[name].sdf_body
vesta = vesta_mesh vesta = vesta_mesh
model_data = vesta.generate_mesh_from_sdf(model, resolution=64, threshold=0) model_data = vesta.generate_mesh_from_sdf(model, resolution=64, threshold=0)
@ -234,6 +234,8 @@ class MainWindow(QMainWindow):
compo = Component() compo = Component()
compo.id = "New Compo" compo.id = "New Compo"
compo.descript = "Initial Component" compo.descript = "Initial Component"
compo.sketches = {}
compo.body = {}
self.project.timeline.append(compo) self.project.timeline.append(compo)
# Create a horizontal layout # Create a horizontal layout
@ -257,61 +259,67 @@ class MainWindow(QMainWindow):
horizontal_layout.setAlignment(Qt.AlignLeft) horizontal_layout.setAlignment(Qt.AlignLeft)
def add_new_sketch_origin(self): def add_new_sketch_origin(self):
self.sketchWidget.clear_sketch() name = f"sketches-{str(names.get_first_name())}"
self.sketchWidget.create_workplane() sketch = Sketch()
sketch.id = name
sketch.origin = [0,0,0]
sketch.slv_points = []
sketch.slv_lines = []
sketch.proj_points = []
sketch.proj_lines = []
self.sketchWidget.set_sketch(sketch)
def add_new_sketch_wp(self): def add_new_sketch_wp(self):
self.sketchWidget.clear_sketch() name = f"sketches-{str(names.get_first_name())}"
#edges = [((-158.0, -20.0, -25.0), (286.0, -195.0, -25.0)), ((-158.0, -20.0, 25.0), (-158.0, -20.0, -25.0))] sketch = Sketch()
points = self.custom_3D_Widget.project_tosketch_points sketch.id = name
normal = self.custom_3D_Widget.selected_normal sketch.origin = self.custom_3D_Widget.centroid
selected_lines = self.custom_3D_Widget.project_tosketch_lines sketch.normal = self.custom_3D_Widget.selected_normal
print("Selected lines", selected_lines) sketch.slv_points = []
sketch.slv_lines = []
sketch.proj_points = self.custom_3D_Widget.project_tosketch_points
sketch.proj_lines = self.custom_3D_Widget.project_tosketch_lines
self.sketchWidget.set_sketch(sketch)
self.sketchWidget.create_workplane_projected() self.sketchWidget.create_workplane_projected()
self.sketchWidget.create_proj_points(points) self.sketchWidget.convert_proj_points()
self.sketchWidget.create_proj_lines(selected_lines) self.sketchWidget.convert_proj_lines()
self.sketchWidget.update()
# CLear all selections after it has been projected # CLear all selections after it has been projected
self.custom_3D_Widget.project_tosketch_points.clear() self.custom_3D_Widget.project_tosketch_points.clear()
self.custom_3D_Widget.project_tosketch_lines.clear() self.custom_3D_Widget.project_tosketch_lines.clear()
self.custom_3D_Widget.clear_actors_projection() self.custom_3D_Widget.clear_actors_projection()
self.custom_3D_Widget.clear_actors_normals() self.custom_3D_Widget.clear_actors_normals()
#self.custom_3D_Widget.clear_actors_projection()
#self.sketchWidget.create_workplane_space(edges, normal)
def add_sketch(self): def add_sketch(self):
name = f"sketch-{str(names.get_first_name())}"
sketch = Sketch() sketch = self.sketchWidget.get_sketch()
sketch.id = name
sketch.slv_points = self.sketchWidget.slv_points_main
sketch.slv_lines = self.sketchWidget.slv_lines_main
sketch.convert_points_for_sdf() sketch.convert_points_for_sdf()
self.project.timeline[-1].sketch = sketch self.project.timeline[-1].sketches[sketch.id] = sketch
self.ui.sketch_list.addItem(name) self.ui.sketch_list.addItem(sketch.id)
self.ui.pb_linetool.setChecked(False) self.ui.pb_linetool.setChecked(False)
self.sketchWidget.line_mode = False self.sketchWidget.line_mode = False
items = self.ui.sketch_list.findItems(name, Qt.MatchExactly)[0] items = self.ui.sketch_list.findItems(sketch.id, Qt.MatchExactly)[0]
self.ui.sketch_list.setCurrentItem(items) self.ui.sketch_list.setCurrentItem(items)
def edit_sketch(self): def edit_sketch(self):
name = self.ui.sketch_list.currentItem().text() name = self.ui.sketch_list.currentItem().text()
#self.sketchWidget.clear_sketch()
self.sketchWidget.slv_points_main = self.model['sketch'][name]['point_list'] selected = self.ui.sketch_list.currentItem()
self.sketchWidget.slv_lines_main = self.model['sketch'][name]['line_list'] name = selected.text()
self.sketchWidget.solv = self.model['sketch'][name]['solver'] # TODO: add selected element from timeline
sel_compo = self.project.timeline[-1]
sketch = sel_compo.sketches[name]
self.sketchWidget.set_sketch(sketch)
self.sketchWidget.update() self.sketchWidget.update()
print("model",self.model)
print("widget", self.sketchWidget.slv_points_main)
def del_sketch(self): def del_sketch(self):
# Old
print("Deleting") print("Deleting")
name = self.ui.sketch_list.currentItem() # Get the current item name = self.ui.sketch_list.currentItem() # Get the current item
@ -321,14 +329,14 @@ class MainWindow(QMainWindow):
item_name = name.text() item_name = name.text()
print("obj_name", item_name) print("obj_name", item_name)
# Check if the 'sketch' key exists in the model dictionary # Check if the 'sketches' key exists in the model dictionary
if 'sketch' in self.model and item_name in self.model['sketch']: if 'sketches' in self.model and item_name in self.model['sketches']:
if self.model['sketch'][item_name]['id'] == item_name: if self.model['sketches'][item_name]['id'] == item_name:
row = self.ui.sketch_list.row(name) # Get the row of the current item row = self.ui.sketch_list.row(name) # Get the row of the current item
self.ui.sketch_list.takeItem(row) # Remove the item from the list widget self.ui.sketch_list.takeItem(row) # Remove the item from the list widget
self.sketchWidget.clear_sketch() self.sketchWidget.clear_sketch()
self.model['sketch'].pop(item_name) # Remove the item from the sketch dictionary self.model['sketches'].pop(item_name) # Remove the item from the sketches dictionary
print(f"Removed sketch: {item_name}") print(f"Removed sketches: {item_name}")
# Check if the 'operation' key exists in the model dictionary # Check if the 'operation' key exists in the model dictionary
elif 'operation' in self.model and item_name in self.model['operation']: elif 'operation' in self.model and item_name in self.model['operation']:
@ -340,7 +348,7 @@ class MainWindow(QMainWindow):
print(f"Removed operation: {item_name}") print(f"Removed operation: {item_name}")
else: else:
print(f"Item '{item_name}' not found in either 'sketch' or 'operation' dictionary.") print(f"Item '{item_name}' not found in either 'sketches' or 'operation' dictionary.")
else: else:
print("No item selected.") print("No item selected.")
@ -374,7 +382,7 @@ class MainWindow(QMainWindow):
name = selected.text() name = selected.text()
# TODO: add selected element from timeline # TODO: add selected element from timeline
sel_compo = self.project.timeline[-1] sel_compo = self.project.timeline[-1]
sketch = sel_compo.sketch sketch = sel_compo.sketches[name]
points = sketch.sdf_points points = sketch.sdf_points
if points[-1] == points[0]: if points[-1] == points[0]:
@ -389,7 +397,6 @@ class MainWindow(QMainWindow):
length = 0 length = 0
print("Extrude cancelled") print("Extrude cancelled")
normal = self.custom_3D_Widget.selected_normal normal = self.custom_3D_Widget.selected_normal
#print("Normie enter", normal) #print("Normie enter", normal)
if normal is None: if normal is None:
@ -408,21 +415,25 @@ class MainWindow(QMainWindow):
f = sketch.extrude(length, is_symmetric, invert, 0) f = sketch.extrude(length, is_symmetric, invert, 0)
name_op = f"extrd-{name}" name_op = f"extrd-{name}"
sel_compo.body = Body() sel_compo.body
sel_compo.body.sketch = sketch #we add the sketch for reference here body = Body()
sel_compo.body.id = name_op body.sketch = sketch #we add the sketches for reference here
sel_compo.body.sdf_body = f body.id = name_op
body.sdf_body = f
### Interactor ### Interactor
sel_compo.interactor = Interactor() interactor = Interactor()
sel_compo.interactor.add_lines_for_interactor(sketch.slv_lines) interactor.add_lines_for_interactor(sketch.slv_lines)
if not invert: if not invert:
edges = interactor_mesh.generate_mesh(sel_compo.interactor.lines, 0, length) edges = interactor_mesh.generate_mesh(interactor.lines, 0, length)
else: else:
edges = interactor_mesh.generate_mesh(sel_compo.interactor.lines, 0, -length) edges = interactor_mesh.generate_mesh(interactor.lines, 0, -length)
offset_vector = sel_compo.interactor.vector_to_centroid(None, centroid, normal) body.interactor = interactor
sel_compo.body[name_op] = body
offset_vector = interactor.vector_to_centroid(None, centroid, normal)
#print("off_ved", offset_vector) #print("off_ved", offset_vector)
if len(offset_vector) == 0 : if len(offset_vector) == 0 :
offset_vector = [0, 0, 0] offset_vector = [0, 0, 0]
@ -483,7 +494,7 @@ class Assembly:
class Component: class Component:
"""The base container combining all related elements """The base container combining all related elements
id : The unique ID id : The unique ID
sketch : the base sketch, bodys can contain additonal sketches for features sketches : the base sketches, bodys can contain additonal sketches for features
interactor : A smiplified model used as interactor interactor : A smiplified model used as interactor
body : The body class that contains the actual 3d information body : The body class that contains the actual 3d information
connector : Vector and Nomral information for assembly connector : Vector and Nomral information for assembly
@ -491,9 +502,8 @@ class Component:
materil : Speicfy a material for pbr rendering materil : Speicfy a material for pbr rendering
""" """
id = None id = None
sketch = None sketches: dict = None
interactor = None body: dict = None
body = None
connector = None connector = None
# Description # Description
@ -531,7 +541,7 @@ class Code:
@dataclass @dataclass
class Sketch: class Sketch:
"""All of the 2D Information of a sketch""" """All of the 2D Information of a sketches"""
id = None id = None
# Space Information # Space Information
@ -539,7 +549,7 @@ class Sketch:
slv_plane = None slv_plane = None
normal = None normal = None
# Points in UI form the sketch widget # Points in UI form the sketches widget
ui_points: list = None ui_points: list = None
ui_lines: list = None ui_lines: list = None
@ -553,6 +563,9 @@ class Sketch:
proj_points: list = None proj_points: list = None
proj_lines: list = None proj_lines: list = None
# Workingplane
working_plane = None
def translate_points_tup(self, point: QPoint): def translate_points_tup(self, point: QPoint):
"""QPoints from Display to mesh data """QPoints from Display to mesh data
input: Qpoints input: Qpoints
@ -712,6 +725,7 @@ class Body:
id = None id = None
sketch = None sketch = None
height = None height = None
interactor = None
sdf_body = None sdf_body = None
def mirror_body(self, sdf_object3d): def mirror_body(self, sdf_object3d):