- Bsic sketch to object approach
This commit is contained in:
parent
cebe1b41e7
commit
b80185e93e
@ -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__":
|
||||||
|
@ -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
124
main.py
@ -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):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user