mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-18 22:33:33 +00:00
WIP - More refactor
This commit is contained in:
committed by
Bruno Perdigão
parent
be8b325a83
commit
55df9a42e6
@@ -334,10 +334,13 @@ class PolylineDecorator:
|
|||||||
cls.is_installed = False
|
cls.is_installed = False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def update(cls, event, tool_state, input_ui):
|
def update(cls, event, tool_state, input_ui, snapping_point):
|
||||||
cls.event = event
|
cls.event = event
|
||||||
cls.tool_state = tool_state
|
cls.tool_state = tool_state
|
||||||
cls.input_ui = input_ui
|
cls.input_ui = input_ui
|
||||||
|
cls.snap_info = f"""Snap: {snapping_point[1]}
|
||||||
|
Axis:{tool_state.axis_method}
|
||||||
|
Plane: {tool_state.plane_method}"""
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def set_input_ui(cls, input_ui):
|
def set_input_ui(cls, input_ui):
|
||||||
@@ -356,9 +359,6 @@ class PolylineDecorator:
|
|||||||
def set_tool_state(cls, tool_state):
|
def set_tool_state(cls, tool_state):
|
||||||
cls.tool_state = tool_state
|
cls.tool_state = tool_state
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def set_snap_info(cls, snap_info):
|
|
||||||
cls.snap_info = snap_info
|
|
||||||
|
|
||||||
|
|
||||||
def draw_batch(self, shader_type, content_pos, color, indices=None):
|
def draw_batch(self, shader_type, content_pos, color, indices=None):
|
||||||
|
|||||||
@@ -322,7 +322,6 @@ class DrawPolylineWall(bpy.types.Operator):
|
|||||||
self.number_input = []
|
self.number_input = []
|
||||||
self.number_output = ""
|
self.number_output = ""
|
||||||
self.number_is_negative = False
|
self.number_is_negative = False
|
||||||
self.is_input_on = False
|
|
||||||
self.input_options = ["D", "A", "X", "Y"]
|
self.input_options = ["D", "A", "X", "Y"]
|
||||||
self.input_type = None
|
self.input_type = None
|
||||||
self.input_type = None
|
self.input_type = None
|
||||||
@@ -386,14 +385,14 @@ class DrawPolylineWall(bpy.types.Operator):
|
|||||||
|
|
||||||
def modal(self, context, event):
|
def modal(self, context, event):
|
||||||
|
|
||||||
if not self.is_input_on:
|
if not self.tool_state.is_input_on:
|
||||||
if event.type == "MOUSEMOVE" or event.type == "INBETWEEN_MOUSEMOVE":
|
if event.type == "MOUSEMOVE" or event.type == "INBETWEEN_MOUSEMOVE":
|
||||||
self.mousemove_count += 1
|
self.mousemove_count += 1
|
||||||
self.is_input_on = False
|
self.tool_state.mode = "Mouse"
|
||||||
self.tool_state.is_input_on = False
|
self.tool_state.is_input_on = False
|
||||||
self.input_type = None
|
self.input_type = None
|
||||||
self.tool_state.input_type = None
|
self.tool_state.input_type = None
|
||||||
PolylineDecorator.update(event, self.tool_state, self.input_ui)
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Snap.clear_snapping_ref()
|
tool.Snap.clear_snapping_ref()
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
else:
|
else:
|
||||||
@@ -406,7 +405,8 @@ class DrawPolylineWall(bpy.types.Operator):
|
|||||||
|
|
||||||
if self.mousemove_count > 3:
|
if self.mousemove_count > 3:
|
||||||
detected_snaps = tool.Snap.detect_snapping_points(context, event, self.objs_2d_bbox, self.tool_state)
|
detected_snaps = tool.Snap.detect_snapping_points(context, event, self.objs_2d_bbox, self.tool_state)
|
||||||
self.snapping_points = tool.Snap.select_snapping_points(context, event, detected_snaps)
|
self.snapping_points = tool.Snap.select_snapping_points(context, event, self.tool_state, detected_snaps)
|
||||||
|
print(self.snapping_points)
|
||||||
tool.Polyline.calculate_distance_and_angle(context, self.input_ui, self.tool_state)
|
tool.Polyline.calculate_distance_and_angle(context, self.input_ui, self.tool_state)
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
return {"RUNNING_MODAL"}
|
return {"RUNNING_MODAL"}
|
||||||
@@ -420,35 +420,38 @@ class DrawPolylineWall(bpy.types.Operator):
|
|||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
if event.value == "PRESS" and event.type == "X":
|
if event.value == "PRESS" and event.type == "X":
|
||||||
tool.Snap.set_snap_axis_method("X")
|
self.tool_state.axis_method = "X" if self.tool_state.axis_method != event.type else None
|
||||||
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
if event.value == "PRESS" and event.type == "Y":
|
if event.value == "PRESS" and event.type == "Y":
|
||||||
tool.Snap.set_snap_axis_method("Y")
|
self.tool_state.axis_method = "Y" if self.tool_state.axis_method != event.type else None
|
||||||
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
if event.value == "PRESS" and event.type == "C":
|
if event.value == "PRESS" and event.type == "C":
|
||||||
tool.Snap.close_polyline()
|
tool.Snap.close_polyline()
|
||||||
PolylineDecorator.update(event, self.tool_state, self.input_ui)
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
if self.is_input_on and event.value == "PRESS" and event.type == "TAB":
|
if self.tool_state.is_input_on and event.value == "PRESS" and event.type == "TAB":
|
||||||
self.recalculate_inputs(context)
|
self.recalculate_inputs(context)
|
||||||
index = self.input_options.index(self.input_type)
|
index = self.input_options.index(self.input_type)
|
||||||
size = len(self.input_options)
|
size = len(self.input_options)
|
||||||
self.input_type = self.input_options[((index + 1) % size)]
|
self.input_type = self.input_options[((index + 1) % size)]
|
||||||
self.tool_state.input_type = self.input_options[((index + 1) % size)]
|
self.tool_state.input_type = self.input_options[((index + 1) % size)]
|
||||||
|
self.tool_state.mode = "Select"
|
||||||
self.is_typing = False
|
self.is_typing = False
|
||||||
self.number_input = self.input_ui.get_formatted_value(self.input_type)
|
self.number_input = self.input_ui.get_formatted_value(self.input_type)
|
||||||
self.number_input = list(self.number_input)
|
self.number_input = list(self.number_input)
|
||||||
self.number_output = "".join(self.number_input)
|
self.number_output = "".join(self.number_input)
|
||||||
self.input_ui.set_value(self.input_type, self.number_output)
|
self.input_ui.set_value(self.input_type, self.number_output)
|
||||||
PolylineDecorator.update(event, self.tool_state, self.input_ui)
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
if not self.is_input_on and event.value == "RELEASE" and event.type == "TAB":
|
if not self.tool_state.is_input_on and event.value == "RELEASE" and event.type == "TAB":
|
||||||
self.recalculate_inputs(context)
|
self.recalculate_inputs(context)
|
||||||
self.is_input_on = True
|
self.tool_state.mode = "Select"
|
||||||
self.tool_state.is_input_on = True
|
self.tool_state.is_input_on = True
|
||||||
self.input_type = "D"
|
self.input_type = "D"
|
||||||
self.tool_state.input_type = "D"
|
self.tool_state.input_type = "D"
|
||||||
@@ -457,33 +460,31 @@ class DrawPolylineWall(bpy.types.Operator):
|
|||||||
self.number_input = list(self.number_input)
|
self.number_input = list(self.number_input)
|
||||||
self.number_output = "".join(self.number_input)
|
self.number_output = "".join(self.number_input)
|
||||||
self.input_ui.set_value(self.input_type, self.number_output)
|
self.input_ui.set_value(self.input_type, self.number_output)
|
||||||
PolylineDecorator.update(event, self.tool_state, self.input_ui)
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
if not self.is_input_on and event.ascii in self.number_options:
|
if not self.tool_state.is_input_on and event.ascii in self.number_options:
|
||||||
self.recalculate_inputs(context)
|
self.recalculate_inputs(context)
|
||||||
self.is_input_on = True
|
self.tool_state.mode = "Edit"
|
||||||
self.tool_state.is_input_on = True
|
self.tool_state.is_input_on = True
|
||||||
self.input_type = "D"
|
self.input_type = "D"
|
||||||
self.tool_state.input_type = "D"
|
self.tool_state.input_type = "D"
|
||||||
# PolylineDecorator.set_input_ui(self.input_ui)
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
# PolylineDecorator.set_tool_state(self.tool_state)
|
|
||||||
PolylineDecorator.update(event, self.tool_state, self.input_ui)
|
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
if event.value == "RELEASE" and event.type in {"D", "A"}:
|
if event.value == "RELEASE" and event.type in {"D", "A"}:
|
||||||
self.recalculate_inputs(context)
|
self.recalculate_inputs(context)
|
||||||
self.is_input_on = True
|
self.tool_state.mode = "Edit"
|
||||||
self.tool_state.is_input_on = True
|
self.tool_state.is_input_on = True
|
||||||
self.input_type = event.type
|
self.input_type = event.type
|
||||||
self.tool_state.input_type = event.type
|
self.tool_state.input_type = event.type
|
||||||
self.input_ui.set_value(self.input_type, "")
|
self.input_ui.set_value(self.input_type, "")
|
||||||
PolylineDecorator.update(event, self.tool_state, self.input_ui)
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
if self.input_type in self.input_options:
|
if self.input_type in self.input_options:
|
||||||
if (event.ascii in self.number_options) or (event.value == "RELEASE" and event.type == "BACK_SPACE"):
|
if (event.ascii in self.number_options) or (event.value == "RELEASE" and event.type == "BACK_SPACE"):
|
||||||
if not self.is_typing and not (event.ascii == "=" or event.type == "BACK_SPACE"):
|
if not self.tool_state.mode == "Edit" and not (event.ascii == "=" or event.type == "BACK_SPACE"):
|
||||||
self.number_input = []
|
self.number_input = []
|
||||||
|
|
||||||
if event.type == "BACK_SPACE":
|
if event.type == "BACK_SPACE":
|
||||||
@@ -502,58 +503,60 @@ class DrawPolylineWall(bpy.types.Operator):
|
|||||||
if not self.number_input:
|
if not self.number_input:
|
||||||
self.number_output = "0"
|
self.number_output = "0"
|
||||||
|
|
||||||
|
self.tool_state.mode = "Edit"
|
||||||
self.is_typing = True
|
self.is_typing = True
|
||||||
self.number_output = "".join(self.number_input)
|
self.number_output = "".join(self.number_input)
|
||||||
self.input_ui.set_value(self.input_type, self.number_output)
|
self.input_ui.set_value(self.input_type, self.number_output)
|
||||||
PolylineDecorator.update(event, self.tool_state, self.input_ui)
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
if not self.is_input_on and event.value == "RELEASE" and event.type in {"RET", "NUMPAD_ENTER", "RIGHTMOUSE"}:
|
if not self.tool_state.is_input_on and event.value == "RELEASE" and event.type in {"RET", "NUMPAD_ENTER", "RIGHTMOUSE"}:
|
||||||
self.create_walls_from_polyline(context)
|
self.create_walls_from_polyline(context)
|
||||||
PolylineDecorator.uninstall()
|
PolylineDecorator.uninstall()
|
||||||
tool.Snap.clear_polyline()
|
tool.Snap.clear_polyline()
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
if self.is_input_on and event.value == "RELEASE" and event.type in {"RET", "NUMPAD_ENTER", "RIGHTMOUSE"}:
|
if self.tool_state.is_input_on and event.value == "RELEASE" and event.type in {"RET", "NUMPAD_ENTER", "RIGHTMOUSE"}:
|
||||||
is_valid = self.recalculate_inputs(context)
|
is_valid = self.recalculate_inputs(context)
|
||||||
if is_valid:
|
if is_valid:
|
||||||
tool.Snap.insert_polyline_point(self.input_ui)
|
tool.Snap.insert_polyline_point(self.input_ui)
|
||||||
self.is_input_on = False
|
self.tool_state.mode = "Mouse"
|
||||||
self.tool_state.is_input_on = False
|
self.tool_state.is_input_on = False
|
||||||
self.input_type = None
|
self.input_type = None
|
||||||
self.tool_state.input_type = None
|
self.tool_state.input_type = None
|
||||||
self.number_input = []
|
self.number_input = []
|
||||||
self.number_output = ""
|
self.number_output = ""
|
||||||
PolylineDecorator.update(event, self.tool_state, self.input_ui)
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
if event.value == "PRESS" and event.type == "M":
|
if event.value == "PRESS" and event.type == "M":
|
||||||
self.snapping_points = tool.Snap.modify_snapping_point_selection(self.snapping_points)
|
self.snapping_points = tool.Snap.modify_snapping_point_selection(self.snapping_points)
|
||||||
tool.Polyline.calculate_distance_and_angle(context, self.input_ui, self.tool_state)
|
tool.Polyline.calculate_distance_and_angle(context, self.input_ui, self.tool_state)
|
||||||
PolylineDecorator.update(event, self.tool_state, self.input_ui)
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
|
|
||||||
if event.type in {"MIDDLEMOUSE", "WHEELUPMOUSE", "WHEELDOWNMOUSE"}:
|
if event.type in {"MIDDLEMOUSE", "WHEELUPMOUSE", "WHEELDOWNMOUSE"}:
|
||||||
return {"PASS_THROUGH"}
|
return {"PASS_THROUGH"}
|
||||||
|
|
||||||
if self.is_input_on:
|
if self.tool_state.is_input_on:
|
||||||
if event.value == "RELEASE" and event.type in {"ESC"}:
|
if event.value == "RELEASE" and event.type in {"ESC"}:
|
||||||
self.recalculate_inputs(context)
|
self.recalculate_inputs(context)
|
||||||
self.is_input_on = False
|
self.tool_state.mode = "Mouse"
|
||||||
self.tool_state.is_input_on = False
|
self.tool_state.is_input_on = False
|
||||||
self.input_type = None
|
self.input_type = None
|
||||||
self.tool_state.input_type = None
|
self.tool_state.input_type = None
|
||||||
PolylineDecorator.update(event, self.tool_state, self.input_ui)
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
else:
|
else:
|
||||||
if event.value == "RELEASE" and event.type in {"ESC"}:
|
if event.value == "RELEASE" and event.type in {"ESC"}:
|
||||||
tool.Snap.set_snap_axis_method(None)
|
self.tool_state.axis_method = None
|
||||||
PolylineDecorator.uninstall()
|
PolylineDecorator.uninstall()
|
||||||
tool.Snap.clear_polyline()
|
tool.Snap.clear_polyline()
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
return {"CANCELLED"}
|
return {"CANCELLED"}
|
||||||
|
|
||||||
|
print(">>> ", self.tool_state.mode)
|
||||||
return {"RUNNING_MODAL"}
|
return {"RUNNING_MODAL"}
|
||||||
|
|
||||||
def invoke(self, context, event):
|
def invoke(self, context, event):
|
||||||
@@ -562,18 +565,18 @@ class DrawPolylineWall(bpy.types.Operator):
|
|||||||
tool.Snap.clear_snapping_point()
|
tool.Snap.clear_snapping_point()
|
||||||
|
|
||||||
self.tool_state.use_default_container = True
|
self.tool_state.use_default_container = True
|
||||||
|
self.tool_state.axis_method = None
|
||||||
|
self.tool_state.plane_method = "XY"
|
||||||
|
self.tool_state.mode = "Mouse"
|
||||||
tool.Snap.set_tool_state(self.tool_state)
|
tool.Snap.set_tool_state(self.tool_state)
|
||||||
|
|
||||||
tool.Snap.set_snap_axis_method(None)
|
|
||||||
tool.Snap.set_snap_plane_method("XY")
|
|
||||||
PolylineDecorator.update(event, self.tool_state, self.input_ui)
|
|
||||||
self.visible_objs = tool.Raycast.get_visible_objects(context)
|
self.visible_objs = tool.Raycast.get_visible_objects(context)
|
||||||
for obj in self.visible_objs:
|
for obj in self.visible_objs:
|
||||||
self.objs_2d_bbox.append(tool.Raycast.get_on_screen_2d_bounding_boxes(context, obj))
|
self.objs_2d_bbox.append(tool.Raycast.get_on_screen_2d_bounding_boxes(context, obj))
|
||||||
detected_snaps = tool.Snap.detect_snapping_points(context, event, self.objs_2d_bbox, self.tool_state)
|
detected_snaps = tool.Snap.detect_snapping_points(context, event, self.objs_2d_bbox, self.tool_state)
|
||||||
self.snapping_points = tool.Snap.select_snapping_points(context, event, detected_snaps)
|
self.snapping_points = tool.Snap.select_snapping_points(context, event, self.tool_state, detected_snaps)
|
||||||
tool.Polyline.calculate_distance_and_angle(context, self.input_ui, self.tool_state)
|
tool.Polyline.calculate_distance_and_angle(context, self.input_ui, self.tool_state)
|
||||||
|
|
||||||
|
PolylineDecorator.update(event, self.tool_state, self.input_ui, self.snapping_points[0])
|
||||||
tool.Blender.update_viewport()
|
tool.Blender.update_viewport()
|
||||||
context.window_manager.modal_handler_add(self)
|
context.window_manager.modal_handler_add(self)
|
||||||
return {"RUNNING_MODAL"}
|
return {"RUNNING_MODAL"}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ class ToolState:
|
|||||||
Shift: Lock axis
|
Shift: Lock axis
|
||||||
"""
|
"""
|
||||||
snap_info: str = None
|
snap_info: str = None
|
||||||
# input_state: str = None | "Select" | "Edit"
|
mode: str = None
|
||||||
input_type: str = None
|
input_type: str = None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -27,10 +27,8 @@ from lark import Lark, Transformer
|
|||||||
|
|
||||||
|
|
||||||
class Snap(bonsai.core.tool.Snap):
|
class Snap(bonsai.core.tool.Snap):
|
||||||
snap_angle = None
|
|
||||||
tool_state = None
|
tool_state = None
|
||||||
snap_plane_method = None
|
snap_plane_method = None
|
||||||
snap_axis_method = None
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def set_tool_state(cls, tool_state):
|
def set_tool_state(cls, tool_state):
|
||||||
@@ -40,10 +38,6 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
def set_snap_plane_method(cls, value=True):
|
def set_snap_plane_method(cls, value=True):
|
||||||
cls.snap_plane_method = value
|
cls.snap_plane_method = value
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def clear_snap_angle(cls):
|
|
||||||
cls.snap_angle = None
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def cycle_snap_plane_method(cls, value=True):
|
def cycle_snap_plane_method(cls, value=True):
|
||||||
if cls.snap_plane_method == value:
|
if cls.snap_plane_method == value:
|
||||||
@@ -51,13 +45,6 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
return
|
return
|
||||||
cls.snap_plane_method = value
|
cls.snap_plane_method = value
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def set_snap_axis_method(cls, value=True):
|
|
||||||
if cls.snap_axis_method == value:
|
|
||||||
cls.snap_axis_method = None
|
|
||||||
return
|
|
||||||
cls.snap_axis_method = value
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_snap_points_on_raycasted_face(cls, context, event, obj, face_index):
|
def get_snap_points_on_raycasted_face(cls, context, event, obj, face_index):
|
||||||
matrix = obj.matrix_world.copy()
|
matrix = obj.matrix_world.copy()
|
||||||
@@ -102,11 +89,6 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
except:
|
except:
|
||||||
snap_vertex = bpy.context.scene.BIMModelProperties.snap_mouse_point.add()
|
snap_vertex = bpy.context.scene.BIMModelProperties.snap_mouse_point.add()
|
||||||
|
|
||||||
info = f"""Snap: {snap_type}
|
|
||||||
Axis:{cls.snap_axis_method}
|
|
||||||
Plane:{cls.snap_plane_method}
|
|
||||||
"""
|
|
||||||
PolylineDecorator.set_snap_info(info)
|
|
||||||
snap_vertex.x = snap_point[0]
|
snap_vertex.x = snap_point[0]
|
||||||
snap_vertex.y = snap_point[1]
|
snap_vertex.y = snap_point[1]
|
||||||
snap_vertex.z = snap_point[2]
|
snap_vertex.z = snap_point[2]
|
||||||
@@ -194,12 +176,12 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
polyline_measurement.remove(len(polyline_measurement) - 1)
|
polyline_measurement.remove(len(polyline_measurement) - 1)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def snap_on_axis(cls, intersection, lock_axis=None):
|
def snap_on_axis(cls, intersection, tool_state, lock_angle=False):
|
||||||
|
|
||||||
def create_axis_line_data(rot_mat, origin):
|
def create_axis_line_data(rot_mat, origin):
|
||||||
length = 1000
|
length = 1000
|
||||||
direction = Vector((1, 0, 0))
|
direction = Vector((1, 0, 0))
|
||||||
if cls.snap_plane_method == "YZ" or (not cls.snap_plane_method and cls.snap_axis_method == "Z"):
|
if tool_state.plane_method == "YZ" or (not tool_state.plane_method and tool_state.axis_method == "Z"):
|
||||||
direction = Vector((0, 0, 1))
|
direction = Vector((0, 0, 1))
|
||||||
rot_dir = rot_mat.inverted() @ direction
|
rot_dir = rot_mat.inverted() @ direction
|
||||||
start = origin + rot_dir * length
|
start = origin + rot_dir * length
|
||||||
@@ -210,13 +192,13 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
def create_axis_rectangle_data(origin):
|
def create_axis_rectangle_data(origin):
|
||||||
size = 0.5
|
size = 0.5
|
||||||
direction = Vector((1, 0, 0))
|
direction = Vector((1, 0, 0))
|
||||||
if cls.snap_plane_method == "YZ":
|
if tool_state.plane_method == "YZ":
|
||||||
direction = Vector((0, 0, 1))
|
direction = Vector((0, 0, 1))
|
||||||
rot_mat = Matrix.Rotation(math.radians(360), 3, pivot_axis)
|
rot_mat = Matrix.Rotation(math.radians(360), 3, pivot_axis)
|
||||||
rot_dir = rot_mat.inverted() @ direction
|
rot_dir = rot_mat.inverted() @ direction
|
||||||
v1 = origin + rot_dir * 0
|
v1 = origin + rot_dir * 0
|
||||||
v2 = origin + rot_dir * size
|
v2 = origin + rot_dir * size
|
||||||
if cls.snap_plane_method == "XY":
|
if tool_state.plane_method == "XY":
|
||||||
angle = 270
|
angle = 270
|
||||||
else:
|
else:
|
||||||
angle = 90
|
angle = 90
|
||||||
@@ -238,17 +220,17 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
# Translates intersection point based on last_point
|
# Translates intersection point based on last_point
|
||||||
translated_intersection = intersection - last_point
|
translated_intersection = intersection - last_point
|
||||||
snap_axis = []
|
snap_axis = []
|
||||||
if not lock_axis:
|
if not tool_state.snap_angle:
|
||||||
for i in range(1, 25):
|
for i in range(1, 25):
|
||||||
angle = 15 * i
|
angle = 15 * i
|
||||||
snap_axis.append(angle)
|
snap_axis.append(angle)
|
||||||
else:
|
else:
|
||||||
snap_axis = [lock_axis]
|
snap_axis = [tool_state.snap_angle]
|
||||||
|
|
||||||
pivot_axis = "Z"
|
pivot_axis = "Z"
|
||||||
if cls.snap_plane_method == "XZ":
|
if tool_state.plane_method == "XZ":
|
||||||
pivot_axis = "Y"
|
pivot_axis = "Y"
|
||||||
if cls.snap_plane_method == "YZ":
|
if tool_state.plane_method == "YZ":
|
||||||
pivot_axis = "X"
|
pivot_axis = "X"
|
||||||
|
|
||||||
for axis in snap_axis:
|
for axis in snap_axis:
|
||||||
@@ -256,10 +238,10 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
start, end = create_axis_line_data(rot_mat, last_point)
|
start, end = create_axis_line_data(rot_mat, last_point)
|
||||||
rot_intersection = rot_mat @ translated_intersection
|
rot_intersection = rot_mat @ translated_intersection
|
||||||
proximity = rot_intersection.y
|
proximity = rot_intersection.y
|
||||||
if cls.snap_plane_method == "XZ":
|
if tool_state.plane_method == "XZ":
|
||||||
proximity = rot_intersection.z
|
proximity = rot_intersection.z
|
||||||
PolylineDecorator.set_angle_axis_line(start, end)
|
PolylineDecorator.set_angle_axis_line(start, end)
|
||||||
if lock_axis:
|
if lock_angle:
|
||||||
is_on_rot_axis = True
|
is_on_rot_axis = True
|
||||||
else:
|
else:
|
||||||
is_on_rot_axis = abs(proximity) <= 0.15
|
is_on_rot_axis = abs(proximity) <= 0.15
|
||||||
@@ -267,7 +249,7 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
if is_on_rot_axis:
|
if is_on_rot_axis:
|
||||||
# Snap to axis
|
# Snap to axis
|
||||||
rot_intersection = Vector((rot_intersection.x, 0, rot_intersection.z))
|
rot_intersection = Vector((rot_intersection.x, 0, rot_intersection.z))
|
||||||
if cls.snap_plane_method == "XZ":
|
if tool_state.plane_method == "XZ":
|
||||||
rot_intersection = Vector((rot_intersection.x, rot_intersection.y, 0))
|
rot_intersection = Vector((rot_intersection.x, rot_intersection.y, 0))
|
||||||
# Convert it back
|
# Convert it back
|
||||||
snap_intersection = rot_mat.inverted() @ rot_intersection + last_point
|
snap_intersection = rot_mat.inverted() @ rot_intersection + last_point
|
||||||
@@ -313,13 +295,13 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
plane_origin = Vector((0, 0, 0))
|
plane_origin = Vector((0, 0, 0))
|
||||||
plane_normal = Vector((0, 0, 1))
|
plane_normal = Vector((0, 0, 1))
|
||||||
|
|
||||||
if not cls.snap_plane_method:
|
if not tool_state.plane_method:
|
||||||
camera_rotation = rv3d.view_rotation
|
camera_rotation = rv3d.view_rotation
|
||||||
plane_origin = Vector((0, 0, 0))
|
plane_origin = Vector((0, 0, 0))
|
||||||
view_direction = Vector((0, 0, -1)) @ camera_rotation.to_matrix().transposed()
|
view_direction = Vector((0, 0, -1)) @ camera_rotation.to_matrix().transposed()
|
||||||
plane_normal = view_direction.normalized()
|
plane_normal = view_direction.normalized()
|
||||||
|
|
||||||
if cls.snap_plane_method == "XY" or (not cls.snap_plane_method and cls.snap_axis_method in {"X", "Y"}):
|
if tool_state.plane_method == "XY" or (not tool_state.plane_method and tool_state.axis_method in {"X", "Y"}):
|
||||||
if cls.tool_state.use_default_container:
|
if cls.tool_state.use_default_container:
|
||||||
plane_origin = Vector((0, 0, elevation))
|
plane_origin = Vector((0, 0, elevation))
|
||||||
elif not last_polyline_point:
|
elif not last_polyline_point:
|
||||||
@@ -328,12 +310,12 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
plane_origin = Vector((last_polyline_point.x, last_polyline_point.y, last_polyline_point.z))
|
plane_origin = Vector((last_polyline_point.x, last_polyline_point.y, last_polyline_point.z))
|
||||||
plane_normal = Vector((0, 0, 1))
|
plane_normal = Vector((0, 0, 1))
|
||||||
|
|
||||||
elif cls.snap_plane_method == "XZ" or (not cls.snap_plane_method and cls.snap_axis_method == "Z"):
|
elif tool_state.plane_method == "XZ" or (not tool_state.plane_method and tool_state.axis_method == "Z"):
|
||||||
if last_polyline_point:
|
if last_polyline_point:
|
||||||
plane_origin = Vector((last_polyline_point.x, last_polyline_point.y, last_polyline_point.z))
|
plane_origin = Vector((last_polyline_point.x, last_polyline_point.y, last_polyline_point.z))
|
||||||
plane_normal = Vector((0, 1, 0))
|
plane_normal = Vector((0, 1, 0))
|
||||||
|
|
||||||
elif cls.snap_plane_method == "YZ":
|
elif tool_state.plane_method == "YZ":
|
||||||
if last_polyline_point:
|
if last_polyline_point:
|
||||||
plane_origin = Vector((last_polyline_point.x, last_polyline_point.y, last_polyline_point.z))
|
plane_origin = Vector((last_polyline_point.x, last_polyline_point.y, last_polyline_point.z))
|
||||||
plane_normal = Vector((1, 0, 0))
|
plane_normal = Vector((1, 0, 0))
|
||||||
@@ -419,31 +401,31 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
|
|
||||||
# TODO It only work for XY plane. Make it work also for None plane_method
|
# TODO It only work for XY plane. Make it work also for None plane_method
|
||||||
rot_intersection = None
|
rot_intersection = None
|
||||||
if not cls.snap_plane_method:
|
if not tool_state.plane_method:
|
||||||
if cls.snap_axis_method == "X":
|
if tool_state.axis_method == "X":
|
||||||
tool_state.snap_angle = 180
|
tool_state.snap_angle = 180
|
||||||
if cls.snap_axis_method == "Y":
|
if tool_state.axis_method == "Y":
|
||||||
tool_state.snap_angle = 90
|
tool_state.snap_angle = 90
|
||||||
if cls.snap_axis_method == "Z":
|
if tool_state.axis_method == "Z":
|
||||||
tool_state.snap_angle = 90
|
tool_state.snap_angle = 90
|
||||||
if cls.snap_axis_method:
|
if tool_state.axis_method:
|
||||||
# Doesn't update snap_angle so that it keeps in the same axis
|
# Doesn't update snap_angle so that it keeps in the same axis
|
||||||
rot_intersection, _, axis_start, axis_end = cls.snap_on_axis(intersection, tool_state.snap_angle)
|
rot_intersection, _, axis_start, axis_end = cls.snap_on_axis(intersection, tool_state, True)
|
||||||
|
|
||||||
if cls.snap_plane_method:
|
if tool_state.plane_method:
|
||||||
if cls.snap_plane_method in {"XY", "XZ"} and cls.snap_axis_method == "X":
|
if tool_state.plane_method in {"XY", "XZ"} and tool_state.axis_method == "X":
|
||||||
tool_state.snap_angle = 180
|
tool_state.snap_angle = 180
|
||||||
if cls.snap_plane_method in {"XY", "YZ"} and cls.snap_axis_method == "Y":
|
if tool_state.plane_method in {"XY", "YZ"} and tool_state.axis_method == "Y":
|
||||||
tool_state.snap_angle = 90
|
tool_state.snap_angle = 90
|
||||||
if cls.snap_plane_method in {"YZ"} and cls.snap_axis_method == "Z":
|
if tool_state.plane_method in {"YZ"} and tool_state.axis_method == "Z":
|
||||||
tool_state.snap_angle = 180
|
tool_state.snap_angle = 180
|
||||||
if cls.snap_plane_method in {"XZ"} and cls.snap_axis_method == "Z":
|
if tool_state.plane_method in {"XZ"} and tool_state.axis_method == "Z":
|
||||||
tool_state.snap_angle = 90
|
tool_state.snap_angle = 90
|
||||||
if event.shift or cls.snap_axis_method:
|
if event.shift or tool_state.axis_method:
|
||||||
# Doesn't update snap_angle so that it keeps in the same axis
|
# Doesn't update snap_angle so that it keeps in the same axis
|
||||||
rot_intersection, _, axis_start, axis_end = cls.snap_on_axis(intersection, tool_state.snap_angle)
|
rot_intersection, _, axis_start, axis_end = cls.snap_on_axis(intersection, tool_state, True)
|
||||||
else:
|
else:
|
||||||
rot_intersection, tool_state.snap_angle, axis_start, axis_end = cls.snap_on_axis(intersection, None)
|
rot_intersection, tool_state.snap_angle, axis_start, axis_end = cls.snap_on_axis(intersection, tool_state, False)
|
||||||
if rot_intersection:
|
if rot_intersection:
|
||||||
detected_snaps.append({"Axis": (rot_intersection, axis_start, axis_end)})
|
detected_snaps.append({"Axis": (rot_intersection, axis_start, axis_end)})
|
||||||
|
|
||||||
@@ -452,7 +434,7 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
return detected_snaps
|
return detected_snaps
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def select_snapping_points(cls, context, event, detected_snaps):
|
def select_snapping_points(cls, context, event, tool_state, detected_snaps):
|
||||||
snapping_points = []
|
snapping_points = []
|
||||||
for origin in detected_snaps:
|
for origin in detected_snaps:
|
||||||
if "Object" in list(origin.keys()):
|
if "Object" in list(origin.keys()):
|
||||||
@@ -497,7 +479,7 @@ class Snap(bonsai.core.tool.Snap):
|
|||||||
snapping_points.append((intersection, "Plane"))
|
snapping_points.append((intersection, "Plane"))
|
||||||
|
|
||||||
# Make Axis first priority
|
# Make Axis first priority
|
||||||
if event.shift or cls.snap_axis_method in {"X", "Y", "Z"}:
|
if event.shift or tool_state.axis_method in {"X", "Y", "Z"}:
|
||||||
cls.update_snapping_ref(snapping_points[0][0], snapping_points[0][1])
|
cls.update_snapping_ref(snapping_points[0][0], snapping_points[0][1])
|
||||||
for point in snapping_points:
|
for point in snapping_points:
|
||||||
if point[1] == "Axis":
|
if point[1] == "Axis":
|
||||||
|
|||||||
Reference in New Issue
Block a user