165 lines
5.4 KiB
Python
165 lines
5.4 KiB
Python
bl_info = {
|
|
"name": "EdgeFlow",
|
|
"category": "Mesh",
|
|
"author": "Benjamin Sauder",
|
|
"description": "Helps adjusting geometry to curved surfaces",
|
|
"version": (1, 1, 2),
|
|
"location": "Mesh > Edge > Set Edge Flow",
|
|
"blender": (3, 5, 1),
|
|
"tracker_url": "https://github.com/BenjaminSauder/EdgeFlow/issues",
|
|
"wiki_url": "https://github.com/BenjaminSauder/EdgeFlow" ,
|
|
}
|
|
|
|
|
|
if "bpy" in locals():
|
|
import importlib
|
|
|
|
importlib.reload(util)
|
|
importlib.reload(edgeloop)
|
|
importlib.reload(interpolate)
|
|
importlib.reload(op_set_edge_flow)
|
|
importlib.reload(op_set_edge_linear)
|
|
importlib.reload(op_set_edge_curve)
|
|
importlib.reload(op_set_vertex_curve)
|
|
else:
|
|
from . import (
|
|
util,
|
|
interpolate,
|
|
edgeloop,
|
|
op_set_edge_flow,
|
|
op_set_edge_linear,
|
|
op_set_edge_curve,
|
|
op_set_vertex_curve,
|
|
)
|
|
|
|
|
|
|
|
import bpy
|
|
from bpy.types import Menu
|
|
from bpy.props import BoolProperty, EnumProperty
|
|
|
|
|
|
def menu_func_edges(self, context):
|
|
layout = self.layout
|
|
layout.separator()
|
|
layout.operator_context = "INVOKE_DEFAULT"
|
|
|
|
layout.operator(op_set_edge_flow.SetEdgeFlowOP.bl_idname, text='Set Flow')
|
|
layout.operator(op_set_edge_curve.SetEdgeCurveOP.bl_idname, text='Set Curve')
|
|
layout.operator(op_set_edge_linear.SetEdgeLinearOP.bl_idname, text='Set Linear')
|
|
|
|
def menu_func_vertices(self, context):
|
|
layout = self.layout
|
|
layout.separator()
|
|
layout.operator_context = "INVOKE_DEFAULT"
|
|
|
|
layout.operator(op_set_vertex_curve.SetVertexCurveOp.bl_idname, text='Set Vertex Curve')
|
|
|
|
|
|
list_insertion_options = [
|
|
("BOTTOM", "Bottom of Menu", "", 1),
|
|
("TOP", "Top of menu", "", 2),
|
|
]
|
|
|
|
def on_preferences_update(self, context):
|
|
preferences = bpy.context.preferences.addons[__package__].preferences
|
|
|
|
bpy.types.VIEW3D_MT_edit_mesh_context_menu.remove(menu_func_context_menu)
|
|
|
|
if preferences.add_to_rightclick_menu:
|
|
if preferences.list_insertion_choice == 'BOTTOM':
|
|
bpy.types.VIEW3D_MT_edit_mesh_context_menu.append(menu_func_context_menu)
|
|
else:
|
|
bpy.types.VIEW3D_MT_edit_mesh_context_menu.prepend(menu_func_context_menu)
|
|
|
|
|
|
class Preferences(bpy.types.AddonPreferences):
|
|
bl_idname = __package__
|
|
|
|
add_to_rightclick_menu: BoolProperty(name="Extend rightlick menu", default=True, update=on_preferences_update)
|
|
list_insertion_choice: EnumProperty(name="Add at", items=list_insertion_options, default=2, update=on_preferences_update)
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.use_property_split = True
|
|
layout.use_property_decorate = False # No animation.
|
|
|
|
layout.label(text="UI Options")
|
|
|
|
col = layout.column(heading="Add commands to rightlick menu")
|
|
col.prop(self, "add_to_rightclick_menu", text="")
|
|
|
|
row = col.row()
|
|
row.prop(self, "list_insertion_choice")
|
|
row.enabled = self.add_to_rightclick_menu
|
|
|
|
class VIEW3D_MT_edit_mesh_set_flow(Menu):
|
|
bl_label = "Set Flow"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
mesh_select_mode = context.scene.tool_settings.mesh_select_mode[:3]
|
|
if mesh_select_mode == (True, False, False):
|
|
layout.operator(op_set_vertex_curve.SetVertexCurveOp.bl_idname, text='Set Vertex Curve')
|
|
elif mesh_select_mode == (False, True, False):
|
|
layout.operator(op_set_edge_flow.SetEdgeFlowOP.bl_idname, text='Set Flow')
|
|
layout.operator(op_set_edge_curve.SetEdgeCurveOP.bl_idname, text='Set Curve')
|
|
layout.operator(op_set_edge_linear.SetEdgeLinearOP.bl_idname, text='Set Linear')
|
|
|
|
def menu_func_context_menu(self, context):
|
|
preferences = bpy.context.preferences.addons[__package__].preferences
|
|
|
|
mesh_select_mode = context.scene.tool_settings.mesh_select_mode[:3]
|
|
if mesh_select_mode == (True, False, False) or mesh_select_mode == (False, True, False):
|
|
|
|
if preferences.list_insertion_choice == 'BOTTOM':
|
|
self.layout.separator()
|
|
|
|
self.layout.menu("VIEW3D_MT_edit_mesh_set_flow")
|
|
|
|
if preferences.list_insertion_choice == 'TOP':
|
|
self.layout.separator()
|
|
|
|
|
|
# stuff which needs to be registered in blender
|
|
classes = [
|
|
Preferences,
|
|
op_set_edge_flow.SetEdgeFlowOP,
|
|
op_set_edge_linear.SetEdgeLinearOP,
|
|
op_set_edge_curve.SetEdgeCurveOP,
|
|
op_set_vertex_curve.SetVertexCurveOp,
|
|
VIEW3D_MT_edit_mesh_set_flow,
|
|
]
|
|
|
|
def register():
|
|
for c in classes:
|
|
bpy.utils.register_class(c)
|
|
|
|
preferences = bpy.context.preferences.addons[__package__].preferences
|
|
|
|
bpy.types.VIEW3D_MT_edit_mesh_edges.append(menu_func_edges)
|
|
bpy.types.VIEW3D_MT_edit_mesh_vertices.append(menu_func_vertices)
|
|
|
|
if preferences.add_to_rightclick_menu:
|
|
if preferences.list_insertion_choice == 'BOTTOM':
|
|
bpy.types.VIEW3D_MT_edit_mesh_context_menu.append(menu_func_context_menu)
|
|
else:
|
|
bpy.types.VIEW3D_MT_edit_mesh_context_menu.prepend(menu_func_context_menu)
|
|
|
|
def unregister():
|
|
preferences = bpy.context.preferences.addons[__package__].preferences
|
|
|
|
if preferences.add_to_rightclick_menu:
|
|
bpy.types.VIEW3D_MT_edit_mesh_context_menu.remove(menu_func_context_menu)
|
|
|
|
bpy.types.VIEW3D_MT_edit_mesh_edges.remove(menu_func_edges)
|
|
bpy.types.VIEW3D_MT_edit_mesh_vertices.remove(menu_func_vertices)
|
|
|
|
for c in classes:
|
|
bpy.utils.unregister_class(c)
|
|
|
|
|
|
|
|
|