Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'space_view3d_spacebar_menu/snap_origin_cursor.py')
-rw-r--r--space_view3d_spacebar_menu/snap_origin_cursor.py406
1 files changed, 203 insertions, 203 deletions
diff --git a/space_view3d_spacebar_menu/snap_origin_cursor.py b/space_view3d_spacebar_menu/snap_origin_cursor.py
index f10f2dfc..b150a492 100644
--- a/space_view3d_spacebar_menu/snap_origin_cursor.py
+++ b/space_view3d_spacebar_menu/snap_origin_cursor.py
@@ -20,283 +20,283 @@
import bpy
from bpy.types import (
- Operator,
- Menu,
- )
+ Operator,
+ Menu,
+)
from bpy.props import (
- BoolProperty,
- StringProperty,
- )
+ BoolProperty,
+ StringProperty,
+)
from .object_menus import *
# ********** Object Snap Cursor **********
class VIEW3D_MT_Snap_Context(Menu):
- bl_label = "Snapping"
+ bl_label = "Snapping"
- def draw(self, context):
- layout = self.layout
- toolsettings = context.tool_settings
- layout.prop(toolsettings, "use_snap")
- layout.prop(toolsettings, "snap_elements", expand=True)
+ def draw(self, context):
+ layout = self.layout
+ toolsettings = context.tool_settings
+ layout.prop(toolsettings, "use_snap")
+ layout.prop(toolsettings, "snap_elements", expand=True)
class VIEW3D_MT_Snap_Origin(Menu):
- bl_label = "Snap Origin"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'EXEC_AREA'
- layout.operator("object.origin_set",
- text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
- layout.separator()
- layout.operator("object.origin_set",
- text="Origin to Geometry").type = 'ORIGIN_GEOMETRY'
- layout.operator("object.origin_set",
- text="Origin to 3D Cursor").type = 'ORIGIN_CURSOR'
- layout.operator("object.origin_set",
- text="Origin to Center of Mass").type = 'ORIGIN_CENTER_OF_MASS'
+ bl_label = "Snap Origin"
+
+ def draw(self, context):
+ layout = self.layout
+ layout.operator_context = 'EXEC_AREA'
+ layout.operator("object.origin_set",
+ text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
+ layout.separator()
+ layout.operator("object.origin_set",
+ text="Origin to Geometry").type = 'ORIGIN_GEOMETRY'
+ layout.operator("object.origin_set",
+ text="Origin to 3D Cursor").type = 'ORIGIN_CURSOR'
+ layout.operator("object.origin_set",
+ text="Origin to Center of Mass").type = 'ORIGIN_CENTER_OF_MASS'
class VIEW3D_MT_CursorMenu(Menu):
- bl_label = "Snap To"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
- layout.menu("VIEW3D_MT_Snap_Origin")
- layout.menu("VIEW3D_MT_Snap_Context")
- layout.separator()
- layout.operator("view3d.snap_cursor_to_selected",
- text="Cursor to Selected")
- layout.operator("view3d.snap_cursor_to_center",
- text="Cursor to World Origin")
- layout.operator("view3d.snap_cursor_to_grid",
- text="Cursor to Grid")
- layout.operator("view3d.snap_cursor_to_active",
- text="Cursor to Active")
- layout.separator()
- layout.operator("view3d.snap_selected_to_cursor",
- text="Selection to Cursor").use_offset = False
- layout.operator("view3d.snap_selected_to_cursor",
- text="Selection to Cursor (Keep Offset)").use_offset = True
- layout.operator("view3d.snap_selected_to_grid",
- text="Selection to Grid")
- layout.operator("view3d.snap_cursor_selected_to_center",
- text="Selection and Cursor to World Origin")
+ bl_label = "Snap To"
+
+ def draw(self, context):
+ layout = self.layout
+ layout.operator_context = 'INVOKE_REGION_WIN'
+ layout.menu("VIEW3D_MT_Snap_Origin")
+ layout.menu("VIEW3D_MT_Snap_Context")
+ layout.separator()
+ layout.operator("view3d.snap_cursor_to_selected",
+ text="Cursor to Selected")
+ layout.operator("view3d.snap_cursor_to_center",
+ text="Cursor to World Origin")
+ layout.operator("view3d.snap_cursor_to_grid",
+ text="Cursor to Grid")
+ layout.operator("view3d.snap_cursor_to_active",
+ text="Cursor to Active")
+ layout.separator()
+ layout.operator("view3d.snap_selected_to_cursor",
+ text="Selection to Cursor").use_offset = False
+ layout.operator("view3d.snap_selected_to_cursor",
+ text="Selection to Cursor (Keep Offset)").use_offset = True
+ layout.operator("view3d.snap_selected_to_grid",
+ text="Selection to Grid")
+ layout.operator("view3d.snap_cursor_selected_to_center",
+ text="Selection and Cursor to World Origin")
class VIEW3D_MT_CursorMenuLite(Menu):
- bl_label = "Snap to"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
- layout.menu("VIEW3D_MT_Snap_Origin")
- layout.separator()
- layout.operator("view3d.snap_cursor_to_selected",
- text="Cursor to Selected")
- layout.operator("view3d.snap_cursor_to_center",
- text="Cursor to World Origin")
- layout.operator("view3d.snap_cursor_to_grid",
- text="Cursor to Grid")
- layout.operator("view3d.snap_cursor_to_active",
- text="Cursor to Active")
- layout.separator()
- layout.operator("view3d.snap_selected_to_cursor",
- text="Selection to Cursor").use_offset = False
- layout.operator("view3d.snap_selected_to_cursor",
- text="Selection to Cursor (Keep Offset)").use_offset = True
- layout.operator("view3d.snap_selected_to_grid",
- text="Selection to Grid")
- layout.operator("view3d.snap_cursor_selected_to_center",
- text="Selection and Cursor to World Origin")
+ bl_label = "Snap to"
+
+ def draw(self, context):
+ layout = self.layout
+ layout.operator_context = 'INVOKE_REGION_WIN'
+ layout.menu("VIEW3D_MT_Snap_Origin")
+ layout.separator()
+ layout.operator("view3d.snap_cursor_to_selected",
+ text="Cursor to Selected")
+ layout.operator("view3d.snap_cursor_to_center",
+ text="Cursor to World Origin")
+ layout.operator("view3d.snap_cursor_to_grid",
+ text="Cursor to Grid")
+ layout.operator("view3d.snap_cursor_to_active",
+ text="Cursor to Active")
+ layout.separator()
+ layout.operator("view3d.snap_selected_to_cursor",
+ text="Selection to Cursor").use_offset = False
+ layout.operator("view3d.snap_selected_to_cursor",
+ text="Selection to Cursor (Keep Offset)").use_offset = True
+ layout.operator("view3d.snap_selected_to_grid",
+ text="Selection to Grid")
+ layout.operator("view3d.snap_cursor_selected_to_center",
+ text="Selection and Cursor to World Origin")
# Code thanks to Isaac Weaver (wisaac) D1963
class VIEW3D_OT_SnapCursSelToCenter(Operator):
- bl_idname = "view3d.snap_cursor_selected_to_center"
- bl_label = "Snap Cursor & Selection to World Origin"
- bl_description = ("Snap 3D cursor and selected objects to the center \n"
- "Works only in Object Mode")
+ bl_idname = "view3d.snap_cursor_selected_to_center"
+ bl_label = "Snap Cursor & Selection to World Origin"
+ bl_description = ("Snap 3D cursor and selected objects to the center \n"
+ "Works only in Object Mode")
- @classmethod
- def poll(cls, context):
- return (context.area.type == "VIEW_3D" and context.mode == "OBJECT")
+ @classmethod
+ def poll(cls, context):
+ return (context.area.type == "VIEW_3D" and context.mode == "OBJECT")
- def execute(self, context):
- context.scene.cursor.location = (0, 0, 0)
- for obj in context.selected_objects:
- obj.location = (0, 0, 0)
- return {'FINISHED'}
+ def execute(self, context):
+ context.scene.cursor.location = (0, 0, 0)
+ for obj in context.selected_objects:
+ obj.location = (0, 0, 0)
+ return {'FINISHED'}
# Cursor Edge Intersection Defs #
def abs(val):
- if val > 0:
- return val
- return -val
+ if val > 0:
+ return val
+ return -val
def edgeIntersect(context, operator):
- from mathutils.geometry import intersect_line_line
+ from mathutils.geometry import intersect_line_line
- obj = context.active_object
+ obj = context.active_object
- if (obj.type != "MESH"):
- operator.report({'ERROR'}, "Object must be a mesh")
- return None
+ if (obj.type != "MESH"):
+ operator.report({'ERROR'}, "Object must be a mesh")
+ return None
- edges = []
- mesh = obj.data
- verts = mesh.vertices
+ edges = []
+ mesh = obj.data
+ verts = mesh.vertices
- is_editmode = (obj.mode == 'EDIT')
- if is_editmode:
- bpy.ops.object.mode_set(mode='OBJECT')
+ is_editmode = (obj.mode == 'EDIT')
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='OBJECT')
- for e in mesh.edges:
- if e.select:
- edges.append(e)
+ for e in mesh.edges:
+ if e.select:
+ edges.append(e)
- if len(edges) > 2:
- break
+ if len(edges) > 2:
+ break
- if is_editmode:
- bpy.ops.object.mode_set(mode='EDIT')
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='EDIT')
- if len(edges) != 2:
- operator.report({'ERROR'},
- "Operator requires exactly 2 edges to be selected")
- return
+ if len(edges) != 2:
+ operator.report({'ERROR'},
+ "Operator requires exactly 2 edges to be selected")
+ return
- line = intersect_line_line(verts[edges[0].vertices[0]].co,
- verts[edges[0].vertices[1]].co,
- verts[edges[1].vertices[0]].co,
- verts[edges[1].vertices[1]].co)
+ line = intersect_line_line(verts[edges[0].vertices[0]].co,
+ verts[edges[0].vertices[1]].co,
+ verts[edges[1].vertices[0]].co,
+ verts[edges[1].vertices[1]].co)
- if line is None:
- operator.report({'ERROR'}, "Selected edges do not intersect")
- return
+ if line is None:
+ operator.report({'ERROR'}, "Selected edges do not intersect")
+ return
- point = line[0].lerp(line[1], 0.5)
- context.scene.cursor.location = obj.matrix_world @ point
+ point = line[0].lerp(line[1], 0.5)
+ context.scene.cursor.location = obj.matrix_world @ point
# Cursor Edge Intersection Operator #
class VIEW3D_OT_CursorToEdgeIntersection(Operator):
- bl_idname = "view3d.snap_cursor_to_edge_intersection"
- bl_label = "Cursor to Edge Intersection"
- bl_description = "Finds the mid-point of the shortest distance between two edges"
+ bl_idname = "view3d.snap_cursor_to_edge_intersection"
+ bl_label = "Cursor to Edge Intersection"
+ bl_description = "Finds the mid-point of the shortest distance between two edges"
- @classmethod
- def poll(cls, context):
- obj = context.active_object
- return (obj is not None and obj.type == 'MESH')
+ @classmethod
+ def poll(cls, context):
+ obj = context.active_object
+ return (obj is not None and obj.type == 'MESH')
- def execute(self, context):
- # Prevent unsupported Execution in Local View modes
- space = bpy.context.space_data
- if space.local_view:
- self.report({'INFO'}, 'Global Perspective modes only unable to continue.')
- return {'FINISHED'}
- edgeIntersect(context, self)
- return {'FINISHED'}
+ def execute(self, context):
+ # Prevent unsupported Execution in Local View modes
+ space = bpy.context.space_data
+ if space.local_view:
+ self.report({'INFO'}, 'Global Perspective modes only unable to continue.')
+ return {'FINISHED'}
+ edgeIntersect(context, self)
+ return {'FINISHED'}
# Origin To Selected Edit Mode #
def vfeOrigin(context):
- try:
- cursorPositionX = context.scene.cursor.location[0]
- cursorPositionY = context.scene.cursor.location[1]
- cursorPositionZ = context.scene.cursor.location[2]
- bpy.ops.view3d.snap_cursor_to_selected()
- bpy.ops.object.mode_set()
- bpy.ops.object.origin_set(type='ORIGIN_CURSOR', center='MEDIAN')
- bpy.ops.object.mode_set(mode='EDIT')
- context.scene.cursor.location[0] = cursorPositionX
- context.scene.cursor.location[1] = cursorPositionY
- context.scene.cursor.location[2] = cursorPositionZ
- return True
- except:
- return False
+ try:
+ cursorPositionX = context.scene.cursor.location[0]
+ cursorPositionY = context.scene.cursor.location[1]
+ cursorPositionZ = context.scene.cursor.location[2]
+ bpy.ops.view3d.snap_cursor_to_selected()
+ bpy.ops.object.mode_set()
+ bpy.ops.object.origin_set(type='ORIGIN_CURSOR', center='MEDIAN')
+ bpy.ops.object.mode_set(mode='EDIT')
+ context.scene.cursor.location[0] = cursorPositionX
+ context.scene.cursor.location[1] = cursorPositionY
+ context.scene.cursor.location[2] = cursorPositionZ
+ return True
+ except:
+ return False
class VIEW3D_OT_SetOriginToSelected(Operator):
- bl_idname = "object.setorigintoselected"
- bl_label = "Set Origin to Selected"
- bl_description = "Set Origin to Selected"
+ bl_idname = "object.setorigintoselected"
+ bl_label = "Set Origin to Selected"
+ bl_description = "Set Origin to Selected"
- @classmethod
- def poll(cls, context):
- return (context.area.type == "VIEW_3D" and context.active_object is not None)
+ @classmethod
+ def poll(cls, context):
+ return (context.area.type == "VIEW_3D" and context.active_object is not None)
- def execute(self, context):
- check = vfeOrigin(context)
- if not check:
- self.report({"ERROR"}, "Set Origin to Selected could not be performed")
- return {'CANCELLED'}
+ def execute(self, context):
+ check = vfeOrigin(context)
+ if not check:
+ self.report({"ERROR"}, "Set Origin to Selected could not be performed")
+ return {'CANCELLED'}
- return {'FINISHED'}
+ return {'FINISHED'}
# ********** Edit Mesh Cursor **********
class VIEW3D_MT_EditCursorMenu(Menu):
- bl_label = "Snap To"
-
- def draw(self, context):
- layout = self.layout
- layout.operator_context = 'INVOKE_REGION_WIN'
- layout.operator("object.setorigintoselected",
- text="Origin to Selected V/F/E")
- layout.separator()
- layout.menu("VIEW3D_MT_Snap_Origin")
- layout.menu("VIEW3D_MT_Snap_Context")
- layout.separator()
- layout.operator("view3d.snap_cursor_to_selected",
- text="Cursor to Selected")
- layout.operator("view3d.snap_cursor_to_center",
- text="Cursor to World Origin")
- layout.operator("view3d.snap_cursor_to_grid",
- text="Cursor to Grid")
- layout.operator("view3d.snap_cursor_to_active",
- text="Cursor to Active")
- layout.operator("view3d.snap_cursor_to_edge_intersection",
- text="Cursor to Edge Intersection")
- layout.separator()
- layout.operator("view3d.snap_selected_to_cursor",
- text="Selection to Cursor").use_offset = False
- layout.operator("view3d.snap_selected_to_cursor",
- text="Selection to Cursor (Keep Offset)").use_offset = True
- layout.operator("view3d.snap_selected_to_grid",
- text="Selection to Grid")
+ bl_label = "Snap To"
+
+ def draw(self, context):
+ layout = self.layout
+ layout.operator_context = 'INVOKE_REGION_WIN'
+ layout.operator("object.setorigintoselected",
+ text="Origin to Selected V/F/E")
+ layout.separator()
+ layout.menu("VIEW3D_MT_Snap_Origin")
+ layout.menu("VIEW3D_MT_Snap_Context")
+ layout.separator()
+ layout.operator("view3d.snap_cursor_to_selected",
+ text="Cursor to Selected")
+ layout.operator("view3d.snap_cursor_to_center",
+ text="Cursor to World Origin")
+ layout.operator("view3d.snap_cursor_to_grid",
+ text="Cursor to Grid")
+ layout.operator("view3d.snap_cursor_to_active",
+ text="Cursor to Active")
+ layout.operator("view3d.snap_cursor_to_edge_intersection",
+ text="Cursor to Edge Intersection")
+ layout.separator()
+ layout.operator("view3d.snap_selected_to_cursor",
+ text="Selection to Cursor").use_offset = False
+ layout.operator("view3d.snap_selected_to_cursor",
+ text="Selection to Cursor (Keep Offset)").use_offset = True
+ layout.operator("view3d.snap_selected_to_grid",
+ text="Selection to Grid")
# List The Classes #
classes = (
- VIEW3D_MT_CursorMenu,
- VIEW3D_MT_CursorMenuLite,
- VIEW3D_MT_Snap_Context,
- VIEW3D_MT_Snap_Origin,
- VIEW3D_OT_SnapCursSelToCenter,
- VIEW3D_OT_CursorToEdgeIntersection,
- VIEW3D_OT_SetOriginToSelected,
- VIEW3D_MT_EditCursorMenu,
+ VIEW3D_MT_CursorMenu,
+ VIEW3D_MT_CursorMenuLite,
+ VIEW3D_MT_Snap_Context,
+ VIEW3D_MT_Snap_Origin,
+ VIEW3D_OT_SnapCursSelToCenter,
+ VIEW3D_OT_CursorToEdgeIntersection,
+ VIEW3D_OT_SetOriginToSelected,
+ VIEW3D_MT_EditCursorMenu,
)
# Register Classes & Hotkeys #
def register():
- for cls in classes:
- bpy.utils.register_class(cls)
+ for cls in classes:
+ bpy.utils.register_class(cls)
# Unregister Classes & Hotkeys #
def unregister():
- for cls in reversed(classes):
- bpy.utils.unregister_class(cls)
+ for cls in reversed(classes):
+ bpy.utils.unregister_class(cls)
if __name__ == "__main__":
- register()
+ register()