diff --git a/scripts/startup/bl_operators/view3d.py b/scripts/startup/bl_operators/view3d.py index aa71b1f710b..bb9318f496e 100644 --- a/scripts/startup/bl_operators/view3d.py +++ b/scripts/startup/bl_operators/view3d.py @@ -80,7 +80,9 @@ class VIEW3D_OT_edit_mesh_extrude_move(Operator): @classmethod def poll(cls, context): obj = context.active_object - return (obj is not None and obj.mode == 'EDIT') + mesh = context.object.data + cls.poll_message_set("Object has no face selected") + return (obj is not None and obj.mode == 'EDIT' and mesh.total_face_sel>=1) @staticmethod def extrude_region(context, use_vert_normals, dissolve_and_intersect): @@ -160,7 +162,9 @@ class VIEW3D_OT_edit_mesh_extrude_shrink_fatten(Operator): @classmethod def poll(cls, context): obj = context.active_object - return (obj is not None and obj.mode == 'EDIT') + mesh = context.object.data + cls.poll_message_set("Object has no face selected") + return (obj is not None and obj.mode == 'EDIT' and mesh.total_face_sel>=1) def execute(self, context): return VIEW3D_OT_edit_mesh_extrude_move.extrude_region(context, True, False) @@ -177,7 +181,9 @@ class VIEW3D_OT_edit_mesh_extrude_manifold_normal(Operator): @classmethod def poll(cls, context): obj = context.active_object - return (obj is not None and obj.mode == 'EDIT') + mesh = context.object.data + cls.poll_message_set("Object has no face selected") + return (obj is not None and obj.mode == 'EDIT' and mesh.total_face_sel>=1) def execute(self, _context): bpy.ops.mesh.extrude_manifold( diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 4ff9c3094fe..2fcae443b96 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -4558,24 +4558,13 @@ class VIEW3D_MT_edit_mesh_extrude(Menu): select_mode = tool_settings.mesh_select_mode mesh = context.object.data - if mesh.total_face_sel: - layout.operator("view3d.edit_mesh_extrude_move_normal", - text="Extrude Faces") - layout.operator("view3d.edit_mesh_extrude_move_shrink_fatten", - text="Extrude Faces Along Normals") - layout.operator( - "mesh.extrude_faces_move", - text="Extrude Individual Faces") - layout.operator("view3d.edit_mesh_extrude_manifold_normal", - text="Extrude Manifold") - - if mesh.total_edge_sel and (select_mode[0] or select_mode[1]): - layout.operator("mesh.extrude_edges_move", - text="Extrude Edges") - - if mesh.total_vert_sel and select_mode[0]: - layout.operator("mesh.extrude_vertices_move", - text="Extrude Vertices") + + layout.operator("view3d.edit_mesh_extrude_move_normal",text="Extrude Faces") + layout.operator("view3d.edit_mesh_extrude_move_shrink_fatten",text="Extrude Faces Along Normals") + layout.operator("mesh.extrude_faces_move",text="Extrude Individual Faces") + layout.operator("view3d.edit_mesh_extrude_manifold_normal",text="Extrude Manifold") + layout.operator("mesh.extrude_edges_move",text="Extrude Edges") + layout.operator("mesh.extrude_vertices_move",text="Extrude Vertices") layout.separator() diff --git a/source/blender/editors/include/ED_screen.hh b/source/blender/editors/include/ED_screen.hh index a67d4ab8b93..a77f7b6e679 100644 --- a/source/blender/editors/include/ED_screen.hh +++ b/source/blender/editors/include/ED_screen.hh @@ -541,6 +541,9 @@ bool ED_operator_object_active_editable_mesh(bContext *C); bool ED_operator_object_active_editable_font(bContext *C); bool ED_operator_editable_mesh(bContext *C); bool ED_operator_editmesh(bContext *C); +bool ED_operator_editmesh_extrude_vertices(bContext *C); +bool ED_operator_editmesh_extrude_edges(bContext *C); +bool ED_operator_editmesh_extrude_faces(bContext *C); bool ED_operator_editmesh_view3d(bContext *C); bool ED_operator_editmesh_region_view3d(bContext *C); bool ED_operator_editarmature(bContext *C); diff --git a/source/blender/editors/mesh/editmesh_extrude.cc b/source/blender/editors/mesh/editmesh_extrude.cc index 8208aa0634d..405070065d2 100644 --- a/source/blender/editors/mesh/editmesh_extrude.cc +++ b/source/blender/editors/mesh/editmesh_extrude.cc @@ -578,7 +578,7 @@ void MESH_OT_extrude_verts_indiv(wmOperatorType *ot) /* api callbacks */ ot->exec = edbm_extrude_verts_exec; - ot->poll = ED_operator_editmesh; + ot->poll = ED_operator_editmesh_extrude_vertices; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -631,7 +631,7 @@ void MESH_OT_extrude_edges_indiv(wmOperatorType *ot) /* api callbacks */ ot->exec = edbm_extrude_edges_exec; - ot->poll = ED_operator_editmesh; + ot->poll = ED_operator_editmesh_extrude_edges; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -684,7 +684,7 @@ void MESH_OT_extrude_faces_indiv(wmOperatorType *ot) /* api callbacks */ ot->exec = edbm_extrude_faces_exec; - ot->poll = ED_operator_editmesh; + ot->poll = ED_operator_editmesh_extrude_faces; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; diff --git a/source/blender/editors/screen/screen_ops.cc b/source/blender/editors/screen/screen_ops.cc index e196750db4b..cf13389671d 100644 --- a/source/blender/editors/screen/screen_ops.cc +++ b/source/blender/editors/screen/screen_ops.cc @@ -467,6 +467,48 @@ bool ED_operator_editmesh(bContext *C) return false; } +bool ED_operator_editmesh_extrude_vertices(bContext *C) +{ + Object *obedit = CTX_data_edit_object(C); + if (obedit && obedit->type == OB_MESH) { + BMEditMesh *mesh = BKE_editmesh_from_object(obedit); + if (mesh->bm->totvertsel == 0 && mesh->bm->selectmode != 0) { + CTX_wm_operator_poll_msg_set(C, "Object has no vertex selected"); + return false; + } + return nullptr != BKE_editmesh_from_object(obedit); + } + return false; +} + +bool ED_operator_editmesh_extrude_edges(bContext *C) +{ + Object *obedit = CTX_data_edit_object(C); + if (obedit && obedit->type == OB_MESH) { + BMEditMesh *mesh = BKE_editmesh_from_object(obedit); + if (mesh->bm->totedgesel == 0 && (mesh->bm->selectmode != 0 || mesh->bm->selectmode != 1)) { + CTX_wm_operator_poll_msg_set(C, "Object has no edge selected"); + return false; + } + return nullptr != BKE_editmesh_from_object(obedit); + } + return false; +} + +bool ED_operator_editmesh_extrude_faces(bContext *C) +{ + Object *obedit = CTX_data_edit_object(C); + if (obedit && obedit->type == OB_MESH) { + BMEditMesh *mesh = BKE_editmesh_from_object(obedit); + if (mesh->bm->totfacesel == 0) { + CTX_wm_operator_poll_msg_set(C, "Object has no face selected"); + return false; + } + return nullptr != BKE_editmesh_from_object(obedit); + } + return false; +} + bool ED_operator_editmesh_view3d(bContext *C) { return ED_operator_editmesh(C) && ED_operator_view3d_active(C);