View3D: New tool 'Extrude, Dissolve and Intersect'
Basically this new tool constitutes a macro that uses the parameters of the Extrude and Translate operators that were recently implemented. Thanks to @CandleComet for initial implementation. Differential Revision: https://developer.blender.org/D7222
This commit is contained in:
@@ -5868,6 +5868,23 @@ def km_3d_view_tool_edit_mesh_extrude_region(params):
|
|||||||
]},
|
]},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def km_3d_view_tool_edit_mesh_extrude_dissolve_and_intersect(params):
|
||||||
|
return (
|
||||||
|
"3D View Tool: Edit Mesh, Extrude Dissolve and Intersect",
|
||||||
|
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
|
||||||
|
{"items": [
|
||||||
|
("mesh.extrude_region_dissolve_move_intersect", {"type": params.tool_tweak, "value": 'ANY'},
|
||||||
|
{"properties": [
|
||||||
|
("MESH_OT_extrude_region", [("use_dissolve_ortho_edges", True)]),
|
||||||
|
("TRANSFORM_OT_translate", [
|
||||||
|
("release_confirm", True),
|
||||||
|
("use_automerge_and_split", True),
|
||||||
|
("constraint_axis", (False, False, True)),
|
||||||
|
("orient_type", 'NORMAL'),
|
||||||
|
]),
|
||||||
|
]}),
|
||||||
|
]},
|
||||||
|
)
|
||||||
|
|
||||||
def km_3d_view_tool_edit_mesh_extrude_along_normals(params):
|
def km_3d_view_tool_edit_mesh_extrude_along_normals(params):
|
||||||
return (
|
return (
|
||||||
@@ -6712,6 +6729,7 @@ def generate_keymaps(params=None):
|
|||||||
km_3d_view_tool_edit_armature_extrude_to_cursor(params),
|
km_3d_view_tool_edit_armature_extrude_to_cursor(params),
|
||||||
km_3d_view_tool_edit_mesh_add_cube(params),
|
km_3d_view_tool_edit_mesh_add_cube(params),
|
||||||
km_3d_view_tool_edit_mesh_extrude_region(params),
|
km_3d_view_tool_edit_mesh_extrude_region(params),
|
||||||
|
km_3d_view_tool_edit_mesh_extrude_dissolve_and_intersect(params),
|
||||||
km_3d_view_tool_edit_mesh_extrude_along_normals(params),
|
km_3d_view_tool_edit_mesh_extrude_along_normals(params),
|
||||||
km_3d_view_tool_edit_mesh_extrude_individual(params),
|
km_3d_view_tool_edit_mesh_extrude_individual(params),
|
||||||
km_3d_view_tool_edit_mesh_extrude_to_cursor(params),
|
km_3d_view_tool_edit_mesh_extrude_to_cursor(params),
|
||||||
|
|||||||
@@ -125,6 +125,68 @@ class VIEW3D_OT_edit_mesh_extrude_move(Operator):
|
|||||||
return self.execute(context)
|
return self.execute(context)
|
||||||
|
|
||||||
|
|
||||||
|
class VIEW3D_OT_edit_mesh_extrude_dissolve_and_intersect(Operator):
|
||||||
|
"""Extrude region together along the average normal"""
|
||||||
|
bl_label = "Extrude, Dissolve, Move and Intersect"
|
||||||
|
bl_idname = "view3d.edit_mesh_extrude_dissolve_and_intersect"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
obj = context.active_object
|
||||||
|
return (obj is not None and obj.mode == 'EDIT')
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def extrude_region(context, use_vert_normals):
|
||||||
|
mesh = context.object.data
|
||||||
|
|
||||||
|
totface = mesh.total_face_sel
|
||||||
|
totedge = mesh.total_edge_sel
|
||||||
|
# totvert = mesh.total_vert_sel
|
||||||
|
|
||||||
|
if totface >= 1:
|
||||||
|
if use_vert_normals:
|
||||||
|
bpy.ops.mesh.extrude_region_shrink_fatten(
|
||||||
|
'INVOKE_REGION_WIN',
|
||||||
|
TRANSFORM_OT_shrink_fatten={},
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
bpy.ops.mesh.extrude_region_dissolve_move_intersect(
|
||||||
|
'INVOKE_REGION_WIN',
|
||||||
|
MESH_OT_extrude_region_move={
|
||||||
|
"use_dissolve_ortho_edges": True,
|
||||||
|
},
|
||||||
|
TRANSFORM_OT_translate={
|
||||||
|
"orient_type": 'NORMAL',
|
||||||
|
"constraint_axis": (False, False, True),
|
||||||
|
"use_automerge_and_split": True,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
elif totedge == 1:
|
||||||
|
bpy.ops.mesh.extrude_region_move(
|
||||||
|
'INVOKE_REGION_WIN',
|
||||||
|
TRANSFORM_OT_translate={
|
||||||
|
# Don't set the constraint axis since users will expect MMB
|
||||||
|
# to use the user setting, see: T61637
|
||||||
|
# "orient_type": 'NORMAL',
|
||||||
|
# Not a popular choice, too restrictive for retopo.
|
||||||
|
# "constraint_axis": (True, True, False)})
|
||||||
|
"constraint_axis": (False, False, False),
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
bpy.ops.mesh.extrude_region_move('INVOKE_REGION_WIN')
|
||||||
|
|
||||||
|
# ignore return from operators above because they are 'RUNNING_MODAL',
|
||||||
|
# and cause this one not to be freed. [#24671]
|
||||||
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
return VIEW3D_OT_edit_mesh_extrude_dissolve_and_intersect.extrude_region(context, False)
|
||||||
|
|
||||||
|
def invoke(self, context, _event):
|
||||||
|
return self.execute(context)
|
||||||
|
|
||||||
|
|
||||||
class VIEW3D_OT_edit_mesh_extrude_shrink_fatten(Operator):
|
class VIEW3D_OT_edit_mesh_extrude_shrink_fatten(Operator):
|
||||||
"""Extrude region together along local normals"""
|
"""Extrude region together along local normals"""
|
||||||
bl_label = "Extrude and Move on Individual Normals"
|
bl_label = "Extrude and Move on Individual Normals"
|
||||||
@@ -190,6 +252,7 @@ class VIEW3D_OT_transform_gizmo_set(Operator):
|
|||||||
classes = (
|
classes = (
|
||||||
VIEW3D_OT_edit_mesh_extrude_individual_move,
|
VIEW3D_OT_edit_mesh_extrude_individual_move,
|
||||||
VIEW3D_OT_edit_mesh_extrude_move,
|
VIEW3D_OT_edit_mesh_extrude_move,
|
||||||
|
VIEW3D_OT_edit_mesh_extrude_dissolve_and_intersect,
|
||||||
VIEW3D_OT_edit_mesh_extrude_shrink_fatten,
|
VIEW3D_OT_edit_mesh_extrude_shrink_fatten,
|
||||||
VIEW3D_OT_transform_gizmo_set,
|
VIEW3D_OT_transform_gizmo_set,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -670,6 +670,20 @@ class _defs_edit_mesh:
|
|||||||
draw_settings=_template_widget.VIEW3D_GGT_xform_extrude.draw_settings,
|
draw_settings=_template_widget.VIEW3D_GGT_xform_extrude.draw_settings,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ToolDef.from_fn
|
||||||
|
def extrude_dissolve_and_intersect():
|
||||||
|
return dict(
|
||||||
|
idname="builtin.extrude_dissolve_and_intersect",
|
||||||
|
label="Extrude Dissolve and Intersect",
|
||||||
|
description=(
|
||||||
|
"Extrude, dissolves edges whose faces form a flat surface and intersect new edges"
|
||||||
|
),
|
||||||
|
icon="none",
|
||||||
|
widget="VIEW3D_GGT_tool_generic_handle_normal",
|
||||||
|
operator="view3d.edit_mesh_extrude_dissolve_and_intersect",
|
||||||
|
keymap=(),
|
||||||
|
)
|
||||||
|
|
||||||
@ToolDef.from_fn
|
@ToolDef.from_fn
|
||||||
def extrude_normals():
|
def extrude_normals():
|
||||||
def draw_settings(_context, layout, tool):
|
def draw_settings(_context, layout, tool):
|
||||||
@@ -2114,6 +2128,7 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
|
|||||||
None,
|
None,
|
||||||
(
|
(
|
||||||
_defs_edit_mesh.extrude,
|
_defs_edit_mesh.extrude,
|
||||||
|
_defs_edit_mesh.extrude_dissolve_and_intersect,
|
||||||
_defs_edit_mesh.extrude_normals,
|
_defs_edit_mesh.extrude_normals,
|
||||||
_defs_edit_mesh.extrude_individual,
|
_defs_edit_mesh.extrude_individual,
|
||||||
_defs_edit_mesh.extrude_cursor,
|
_defs_edit_mesh.extrude_cursor,
|
||||||
|
|||||||
@@ -277,6 +277,18 @@ void ED_operatormacros_mesh(void)
|
|||||||
RNA_boolean_set(otmacro->ptr, "use_proportional_edit", false);
|
RNA_boolean_set(otmacro->ptr, "use_proportional_edit", false);
|
||||||
RNA_boolean_set(otmacro->ptr, "mirror", false);
|
RNA_boolean_set(otmacro->ptr, "mirror", false);
|
||||||
|
|
||||||
|
ot = WM_operatortype_append_macro(
|
||||||
|
"MESH_OT_extrude_region_dissolve_move_intersect",
|
||||||
|
"Extrude, Dissolve, Move and Intersect",
|
||||||
|
"Extrude, dissolves edges whose faces form a flat surface and intersect new edges",
|
||||||
|
OPTYPE_UNDO | OPTYPE_REGISTER);
|
||||||
|
otmacro = WM_operatortype_macro_define(ot, "MESH_OT_extrude_region");
|
||||||
|
RNA_boolean_set(otmacro->ptr, "use_dissolve_ortho_edges", true);
|
||||||
|
otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
|
||||||
|
RNA_boolean_set(otmacro->ptr, "use_proportional_edit", false);
|
||||||
|
RNA_boolean_set(otmacro->ptr, "mirror", false);
|
||||||
|
RNA_boolean_set(otmacro->ptr, "use_automerge_and_split", true);
|
||||||
|
|
||||||
ot = WM_operatortype_append_macro("MESH_OT_extrude_context_move",
|
ot = WM_operatortype_append_macro("MESH_OT_extrude_context_move",
|
||||||
"Extrude Region and Move",
|
"Extrude Region and Move",
|
||||||
"Extrude region together along the average normal",
|
"Extrude region together along the average normal",
|
||||||
|
|||||||
Reference in New Issue
Block a user