- Drawing bodys depending on the selected compo

- Cut working
- Edit sketch working
This commit is contained in:
bklronin 2024-12-31 23:48:20 +01:00
parent 601121dc15
commit f5861b8bd1
3 changed files with 68 additions and 17 deletions

View File

@ -37,6 +37,10 @@ class SketchWidget(QWidget):
self.sketch.id = sketch_in.id self.sketch.id = sketch_in.id
self.sketch.origin = sketch_in.origin self.sketch.origin = sketch_in.origin
def set_sketch(self, sketch_in):
"""Needs to be an already defined Sketch object coming from the widget itself"""
self.sketch = sketch_in
def get_sketch(self): def get_sketch(self):
return self.sketch return self.sketch

View File

@ -31,6 +31,7 @@ class VTKWidget(QtWidgets.QWidget):
self.displayed_normal_actors = [] self.displayed_normal_actors = []
self.body_actors_orig = [] self.body_actors_orig = []
self.projected_mesh_actors = [] self.projected_mesh_actors = []
self.interactor_actors = []
self.flip_toggle = False self.flip_toggle = False
@ -273,6 +274,7 @@ class VTKWidget(QtWidgets.QWidget):
# Add the actor to the scene # Add the actor to the scene
self.renderer.AddActor(actor) self.renderer.AddActor(actor)
self.interactor_actors.append(actor)
mapper.Update() mapper.Update()
self.vtk_widget.GetRenderWindow().Render() self.vtk_widget.GetRenderWindow().Render()
@ -724,6 +726,11 @@ class VTKWidget(QtWidgets.QWidget):
for edge_line in self.picked_edge_actors: for edge_line in self.picked_edge_actors:
self.renderer_indicators.RemoveActor(edge_line) self.renderer_indicators.RemoveActor(edge_line)
def clear_actors_interactor(self):
### Clear the outline of the mesh
for interactor in self.interactor_actors:
self.renderer.RemoveActor(interactor)
def compute_projection(self, direction_invert: bool = False): def compute_projection(self, direction_invert: bool = False):
# Compute the normal from the two selected edges ) # Compute the normal from the two selected edges )

74
main.py
View File

@ -18,7 +18,6 @@ from dataclasses import dataclass, field
# main, draw_widget, gl_widget # main, draw_widget, gl_widget
class ExtrudeDialog(QDialog): class ExtrudeDialog(QDialog):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
@ -255,6 +254,11 @@ class MainWindow(QMainWindow):
""" """
sketch = Sketch() sketch = Sketch()
sketch_from_widget = self.sketchWidget.get_sketch() sketch_from_widget = self.sketchWidget.get_sketch()
#Save original for editing later
sketch.original_sketch = sketch_from_widget
#Get parameters
points = sketch_from_widget.points points = sketch_from_widget.points
sketch.convert_points_for_sdf(points) sketch.convert_points_for_sdf(points)
@ -279,6 +283,9 @@ class MainWindow(QMainWindow):
self.ui.sketch_list.setCurrentItem(items) self.ui.sketch_list.setCurrentItem(items)
def on_compo_change(self): def on_compo_change(self):
self.custom_3D_Widget.clear_body_actors()
self.custom_3D_Widget.clear_actors_interactor()
compo_id = self.get_activated_compo() compo_id = self.get_activated_compo()
if compo_id is not None: if compo_id is not None:
self.ui.sketch_list.clear() self.ui.sketch_list.clear()
@ -294,14 +301,22 @@ class MainWindow(QMainWindow):
for body in self.project.timeline[compo_id].bodies: for body in self.project.timeline[compo_id].bodies:
self.ui.body_list.addItem(body) self.ui.body_list.addItem(body)
def edit_sketch(self): item = self.ui.body_list.findItems(body , Qt.MatchExactly)[0]
name = self.ui.sketch_list.currentItem().text() self.ui.body_list.setCurrentItem(item)
self.draw_mesh()
selected = self.ui.body_list.currentItem()
name = selected.text()
edges = self.project.timeline[compo_id].bodies[name].interactor.edges
offset_vec = self.project.timeline[compo_id].bodies[name].interactor.offset_vector
self.custom_3D_Widget.load_interactor_mesh(edges, offset_vec)
def edit_sketch(self):
selected = self.ui.sketch_list.currentItem() selected = self.ui.sketch_list.currentItem()
name = selected.text() name = selected.text()
# TODO: add selected element from timeline sel_compo = self.project.timeline[self.get_activated_compo()]
sel_compo = self.project.timeline[-1] sketch = sel_compo.sketches[name].original_sketch
sketch = sel_compo.sketches[name]
self.sketchWidget.set_sketch(sketch) self.sketchWidget.set_sketch(sketch)
@ -401,6 +416,7 @@ class MainWindow(QMainWindow):
self.sketchWidget.reset_buffers() self.sketchWidget.reset_buffers()
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)
@ -495,13 +511,13 @@ class MainWindow(QMainWindow):
### Interactor ### Interactor
interactor = Interactor() interactor = Interactor()
interactor.add_lines_for_interactor(sketch.interactor_lines) interactor.add_lines_for_interactor(sketch.interactor_lines)
interactor.invert = invert
if not invert: if not invert:
edges = interactor_mesh.generate_mesh(interactor.lines, 0, length) edges = interactor_mesh.generate_mesh(interactor.lines, 0, length)
else: else:
edges = interactor_mesh.generate_mesh(interactor.lines, 0, -length) edges = interactor_mesh.generate_mesh(interactor.lines, 0, -length)
body.interactor = interactor
sel_compo.bodies[name_op] = body sel_compo.bodies[name_op] = body
offset_vector = interactor.vector_to_centroid(None, centroid, normal) offset_vector = interactor.vector_to_centroid(None, centroid, normal)
@ -509,6 +525,10 @@ class MainWindow(QMainWindow):
if len(offset_vector) == 0 : if len(offset_vector) == 0 :
offset_vector = [0, 0, 0] offset_vector = [0, 0, 0]
interactor.edges = edges
interactor.offset_vector = offset_vector
body.interactor = interactor
self.custom_3D_Widget.load_interactor_mesh(edges, offset_vector) self.custom_3D_Widget.load_interactor_mesh(edges, offset_vector)
self.ui.body_list.addItem(name_op) self.ui.body_list.addItem(name_op)
@ -518,13 +538,23 @@ class MainWindow(QMainWindow):
self.draw_mesh() self.draw_mesh()
def send_cut(self): def send_cut(self):
name = self.ui.body_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) sel_compo = self.project.timeline[self.get_activated_compo()]
points = sel_compo.bodies[].
self.list_selected.append(points)"""
selected = self.ui.body_list.currentItem()
name = selected.text()
sel_compo = self.project.timeline[self.get_activated_compo()]
# print(sel_compo)
body = sel_compo.bodies[name]
# print(sketch)
self.list_selected.append(body.sdf_body)
if len(self.list_selected) == 2: if len(self.list_selected) == 2:
geo = Geometry() f = difference(self.list_selected[0], self.list_selected[1]) # equivalent
f = geo.cut_shapes(self.list_selected[0], self.list_selected[1] )
element = { element = {
'id': name, 'id': name,
@ -532,13 +562,22 @@ class MainWindow(QMainWindow):
'sdf_object': f, 'sdf_object': f,
} }
# Create body element and assign known stuff
name_op = f"cut-{name}" name_op = f"cut-{name}"
self.model['operation'][name_op] = element
body = Body()
body.id = name_op
body.sdf_body = f
## Add to component
sel_compo.bodies[name_op] = body
self.ui.body_list.addItem(name_op) self.ui.body_list.addItem(name_op)
items = self.ui.body_list.findItems(name_op, Qt.MatchExactly) items = self.ui.body_list.findItems(name_op, Qt.MatchExactly)
self.ui.body_list.setCurrentItem(items[-1]) self.ui.body_list.setCurrentItem(items[-1])
self.custom_3D_Widget.clear_body_actors() self.custom_3D_Widget.clear_body_actors()
self.draw_mesh() self.draw_mesh()
elif len(self.list_selected) > 2: elif len(self.list_selected) > 2:
self.list_selected.clear() self.list_selected.clear()
else: else:
@ -612,6 +651,10 @@ class Code:
@dataclass @dataclass
class Sketch: class Sketch:
"""All of the 2D Information of a sketches""" """All of the 2D Information of a sketches"""
# Save the incomng sketch from the 2D widget for late redit
original_sketch = None
id = None id = None
# Space Information # Space Information
@ -761,6 +804,8 @@ class Interactor:
lines = None lines = None
faces = None faces = None
body = None body = None
offset_vector = None
edges = 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
@ -815,11 +860,6 @@ class Body:
return f return f
def cut_shapes(self, sdf_object1, sdf_object2):
f = difference(sdf_object1, sdf_object2) # equivalent
return f
class Output: class Output:
def export_mesh(self, sdf_object): def export_mesh(self, sdf_object):
"""FINAL EXPORT""" """FINAL EXPORT"""