- Transition to functions for entity retrieval

This commit is contained in:
bklronin 2024-06-28 22:52:23 +02:00
parent 24e4d1028b
commit e9098108d2
2 changed files with 191 additions and 198 deletions

View File

@ -12,6 +12,8 @@ class SketchWidget(QWidget):
def __init__(self):
super().__init__()
self.line_draw_buffer = [None, None]
self.drag_buffer = [None, None]
self.main_buffer = [None, None]
self.distance_line = None
@ -190,16 +192,16 @@ class SketchWidget(QWidget):
def mouseReleaseEvent(self, event):
local_event_pos = self.viewport_to_local_coord(event.pos())
if event.button() == Qt.LeftButton and not self.mouse_mode:
self.main_buffer[1] = local_event_pos
print("Le main buffer", self.main_buffer)
if event.button() == Qt.LeftButton and not self.mouse_mode:
self.drag_buffer[1] = local_event_pos
print("Le main buffer", self.drag_buffer)
if len(self.main_buffer) == 2:
entry = self.main_buffer[0]
new_params = [self.main_buffer[1].x(), self.main_buffer[1].y()]
self.solv.set_params(entry.params, new_params )
entry = self.drag_buffer[0]
new_params = self.drag_buffer[1].x(), self.drag_buffer[1].y()
self.solv.set_params(entry.params, new_params)
self.solv.solve()
@ -208,6 +210,7 @@ class SketchWidget(QWidget):
self.check_all_lines_and_update(points_need_update)
self.update()
self.drag_buffer = [None, None]
def mousePressEvent(self, event):
local_event_pos = self.viewport_to_local_coord(event.pos())
@ -227,128 +230,115 @@ class SketchWidget(QWidget):
}
if event.button() == Qt.LeftButton and not self.mouse_mode:
self.main_buffer[0] = self.get_handle_from_ui_point(self.hovered_point)
self.drag_buffer[0] = self.get_handle_from_ui_point(self.hovered_point)
if event.button() == Qt.LeftButton and self.mouse_mode == "line":
clicked_pos = local_event_pos
if not self.line_draw_buffer[0]:
self.line_draw_buffer[0] = clicked_pos
u = clicked_pos.x()
v = clicked_pos.y()
point = self.solv.add_point_2d(u, v, self.wp)
# Track Relationship
# Points
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'] = clicked_pos
# List of points related to the current "figure"
self.points.append(clicked_pos)
# Solverline
if self.line_buffer:
line = self.solv.add_line_2d(self.line_buffer, point, self.wp)
handle_nr_line = self.get_handle_nr(str(line))
relation_line['handle_nr'] = handle_nr_line
relation_line['solv_handle'] = line
relation_line['solv_entity_points'] = (self.line_buffer, point)
relation_line['ui_points'] = [self.points[-2], self.points[-1]]
#track relationship of point in line
relation_point['part_of_entity'] = handle_nr_line
self.slv_lines_main.append(relation_line)
self.line_buffer = None
self.slv_points_main.append(relation_point)
self.line_buffer = point
print("points", self.slv_points_main)
print("lines", self.slv_lines_main)
elif self.line_draw_buffer[0]:
self.line_draw_buffer[1] = clicked_pos
u = clicked_pos.x()
v = clicked_pos.y()
point2 = self.solv.add_point_2d(u, v, self.wp)
relation_point = {} # Reinitialize the dictionary
handle_nr = self.get_handle_nr(str(point2))
relation_point['handle_nr'] = handle_nr
relation_point['solv_handle'] = point2
relation_point['ui_point'] = clicked_pos
self.slv_points_main.append(relation_point)
print("points", self.slv_points_main)
print("lines", self.slv_lines_main)
print("Buffer state", self.line_draw_buffer)
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_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)
relation_line = {} # Reinitialize the dictionary
handle_nr_line = self.get_handle_nr(str(line))
relation_line['handle_nr'] = handle_nr_line
relation_line['solv_handle'] = line
relation_line['solv_entity_points'] = (point_slv1, point_slv2)
relation_line['ui_points'] = [self.line_draw_buffer[0], self.line_draw_buffer[1]]
# Track relationship of point in line
relation_point['part_of_entity'] = handle_nr_line
self.slv_lines_main.append(relation_line)
# Reset the buffer for the next line segment
self.line_draw_buffer[0] = self.line_draw_buffer[1]
self.line_draw_buffer[1] = None
# Track Relationship
# Points
if event.button() == Qt.LeftButton and self.mouse_mode == "pt_pt":
if self.pt_pt_buffer:
for new_id, target_line in enumerate(self.slv_points_main):
if self.hovered_point == target_line['ui_point']:
point_solve_now = target_line['solv_handle']
target_id = new_id
break
else:
point_solve_now = None
if self.hovered_point and not self.main_buffer[0]:
self.main_buffer[0] = self.get_handle_from_ui_point(self.hovered_point)
for old_id, target_line in enumerate(self.slv_points_main):
if self.pt_pt_buffer == target_line['ui_point']:
point_solve_old = target_line['solv_handle']
move_id = old_id
break
else:
point_solve_old = None
elif self.main_buffer[0]:
self.main_buffer[1] = self.get_handle_from_ui_point(self.hovered_point)
if point_solve_old and point_solve_now:
self.solv.coincident(point_solve_now, point_solve_old, self.wp)
if self.main_buffer[0] and self.main_buffer[1]:
print("buf", self.main_buffer)
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:
print("Solve_failed - Converge" )
print("Solve_failed - Converge")
elif self.solv.solve() == ResultFlag.TOO_MANY_UNKNOWNS:
print("Solve_failed - Unknowns" )
print("Solve_failed - Unknowns")
elif self.solv.solve() == ResultFlag.INCONSISTENT:
print("Solve_failed - Incons" )
self.points = []
self.pt_pt_buffer = []
print("Points_all", self.slv_points_main)
self.pt_pt_buffer = self.hovered_point
self.update()
print("Solve_failed - Incons")
self.main_buffer = [None, None]
if event.button() == Qt.LeftButton and self.mouse_mode == "pt_line":
print("ptline")
line_selected = None
if self.hovered_point:
for nr, entry_point in enumerate(self.slv_points_main):
if self.hovered_point == entry_point['ui_point']:
self.pt_line_buffer = entry_point
self.selected_main_idx = nr
print("Point set", self.pt_line_buffer)
break
if self.hovered_point and not self.main_buffer[1]:
self.main_buffer[0] = self.get_handle_from_ui_point(self.hovered_point)
if self.pt_line_buffer:
#Line selection target_line to constrain to
for target_line_con in self.slv_lines_main:
if self.is_point_on_line(local_event_pos, target_line_con['ui_points'][0], target_line_con['ui_points'][1]):
line_selected = target_line_con['solv_handle']
print(line_selected.params)
break
#Update UI Line position ot the line of the selected point
for line_nr, move_line in enumerate(self.slv_lines_main):
#Test what point is going to be moved from the line
if move_line['ui_points'][0] == self.pt_line_buffer['ui_point']:
print("On line", line_nr)
idx = 0
break
elif move_line['ui_points'][1] == self.pt_line_buffer['ui_point']:
print("On line", line_nr)
idx = 1
break
elif self.main_buffer[0]:
self.main_buffer[1] = self.get_line_handle_from_ui_point(local_event_pos)
# Contrain point to line
if line_selected:
self.solv.coincident(self.pt_line_buffer['solv_handle'], line_selected, self.wp)
print(f"1 : {self.pt_line_buffer['solv_handle']}, 2: {line_selected}")
if self.main_buffer[1]:
self.solv.coincident(self.main_buffer[0], self.main_buffer[1], self.wp)
if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah")
@ -364,12 +354,43 @@ class SketchWidget(QWidget):
print("Solve_failed - Incons")
# Clear saved_points after solve attempt
self.pt_line_buffer = None
self.main_buffer = [None, None]
if event.button() == Qt.LeftButton and self.mouse_mode == "pb_con_mid":
print("ptline")
line_selected = None
if self.hovered_point and not self.main_buffer[1]:
self.main_buffer[0] = self.get_handle_from_ui_point(self.hovered_point)
elif self.main_buffer[0]:
self.main_buffer[1] = self.get_line_handle_from_ui_point(local_event_pos)
# Contrain point to line
if self.main_buffer[1]:
self.solv.midpoint(self.main_buffer[0], self.main_buffer[1], self.wp)
if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah")
self.constrain_done.emit()
elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE:
print("Solve_failed - Converge")
elif self.solv.solve() == ResultFlag.TOO_MANY_UNKNOWNS:
print("Solve_failed - Unknowns")
elif self.solv.solve() == ResultFlag.INCONSISTENT:
print("Solve_failed - Incons")
self.main_buffer = [None, None]
if event.button() == Qt.LeftButton and self.mouse_mode == "horiz":
line_selected = self.get_line_handle_from_ui_point(local_event_pos)
if line_selected:
self.solv.horizontal(line_selected, self.wp)
if self.solv.solve() == ResultFlag.OKAY:
@ -386,12 +407,10 @@ class SketchWidget(QWidget):
elif self.solv.solve() == ResultFlag.INCONSISTENT:
print("Solve_failed - Incons")
if event.button() == Qt.LeftButton and self.mouse_mode == "vert":
line_selected = self.get_line_handle_from_ui_point(local_event_pos)
if line_selected:
self.solv.vertical(line_selected, self.wp)
if self.solv.solve() == ResultFlag.OKAY:
@ -408,34 +427,36 @@ class SketchWidget(QWidget):
elif self.solv.solve() == ResultFlag.INCONSISTENT:
print("Solve_failed - Incons")
self.pt_line_buffer = None
if event.button() == Qt.LeftButton and self.mouse_mode == "distance":
# Depending on selected elemnts either point line or line distance
print("distance")
e1 = None
e2 = None
if self.hovered_point:
self.distance_point = self.hovered_point
# Get the point as UI point as buffer
self.main_buffer[0] = self.hovered_point
if self.selected_line:
self.distance_line = 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:
e1 = self.get_handle_from_ui_point(self.distance_point)
e2 = self.get_line_handle_from_ui_point(local_event_pos)
# 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])
elif not self.distance_point:
elif not self.main_buffer[0]:
# Define only line selection
e1, e2 = self.get_point_line_handles_from_ui_point(local_event_pos)
if e1 and e2:
# 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)
self.solv.distance(e1, e2, length, self.wp)
if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah")
self.distance_point = None
self.distance_line = None
self.constrain_done.emit()
elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE:
@ -447,47 +468,12 @@ class SketchWidget(QWidget):
elif self.solv.solve() == ResultFlag.INCONSISTENT:
print("Solve_failed - Incons")
if event.button() == Qt.LeftButton and self.mouse_mode == "pb_con_mid":
for entry_point_mid in self.slv_points_main:
if self.hovered_point == entry_point_mid['ui_point']:
self.point_for_mid = entry_point_mid['solv_handle']
break
if self.point_for_mid:
for target_line_con in self.slv_lines_main:
if self.is_point_on_line(local_event_pos, target_line_con['ui_points'][0], target_line_con['ui_points'][1]):
self.line_selected_mid = target_line_con['solv_handle']
break
print(f"{self.point_for_mid}, {self.line_selected_mid}")
if self.line_selected_mid and self.point_for_mid:
self.solv.midpoint(self.point_for_mid, self.line_selected_mid, self.wp)
if self.solv.solve() == ResultFlag.OKAY:
print("Fuck yeah")
self.constrain_done.emit()
elif self.solv.solve() == ResultFlag.DIDNT_CONVERGE:
print("Solve_failed - Converge")
elif self.solv.solve() == ResultFlag.TOO_MANY_UNKNOWNS:
print("Solve_failed - Unknowns")
elif self.solv.solve() == ResultFlag.INCONSISTENT:
print("Solve_failed - Incons")
self.point_for_mid = None
self.line_selected_mid = None
self.main_buffer = [None, None]
points_need_update = self.check_all_points()
self.update_ui_points(points_need_update)
self.check_all_lines_and_update(points_need_update)
dof = self.solv.dof()
print(dof)
self.update()
def mouseMoveEvent(self, event):

View File

@ -71,8 +71,11 @@ class MainWindow(QMainWindow):
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())
def act_constrain_pt_pt_mode(self):
if not self.ui.pb_con_ptpt.isChecked():
@ -111,9 +114,13 @@ class MainWindow(QMainWindow):
self.sketchWidget.mouse_mode = None
def constrain_finished(self):
# safely disable the line modes
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)
def view_update(self):
print("Update")