Revision: 37834 http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37834 Author: briggs Date: 2011-06-26 20:23:27 +0000 (Sun, 26 Jun 2011) Log Message: ----------- Brought back select by number of vertices and select loose verts/edges: ---------------------------------------------- Split select by number of vertices and select loose verts/edges into seperate functions.
Previously select by number of vertices was also accessed through two different UI items, "Select Quads" and "Select Triangles". Now it is one function with a integer property for selecting the size of the face you want selected. Also added an option to modify the behavior of the selection. Can now select whether you want to select faces that have vertices equal to, less than or greater than the number of vertices in operator property. Modified Paths: -------------- branches/bmesh/blender/release/scripts/startup/bl_ui/space_view3d.py branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c Modified: branches/bmesh/blender/release/scripts/startup/bl_ui/space_view3d.py =================================================================== --- branches/bmesh/blender/release/scripts/startup/bl_ui/space_view3d.py 2011-06-26 19:54:29 UTC (rev 37833) +++ branches/bmesh/blender/release/scripts/startup/bl_ui/space_view3d.py 2011-06-26 20:23:27 UTC (rev 37834) @@ -519,11 +519,10 @@ layout.separator() - layout.operator("mesh.select_by_number_vertices", text="Triangles").type = 'TRIANGLES' - layout.operator("mesh.select_by_number_vertices", text="Quads").type = 'QUADS' + layout.operator("mesh.select_by_number_vertices", text = "By Number of Verts") if context.scene.tool_settings.mesh_select_mode[2] == False: layout.operator("mesh.select_non_manifold", text="Non Manifold") - layout.operator("mesh.select_by_number_vertices", text="Loose Verts/Edges").type = 'OTHER' + layout.operator("mesh.select_loose_verts", text = "Loose Verts/Edges") layout.operator("mesh.select_similar", text="Similar") layout.separator() Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c =================================================================== --- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c 2011-06-26 19:54:29 UTC (rev 37833) +++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c 2011-06-26 20:23:27 UTC (rev 37834) @@ -4073,48 +4073,47 @@ RNA_def_float_vector(ot->srna, "axis", 3, NULL, -1.0f, 1.0f, "Axis", "Axis in global view space", -FLT_MAX, FLT_MAX); } -static int select_by_number_vertices_exec(bContext *UNUSED(C), wmOperator *UNUSED(op)) +static int select_by_number_vertices_exec(bContext *C, wmOperator *op) { -#if 0 Object *obedit= CTX_data_edit_object(C); - EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); - EditFace *efa; - int numverts= RNA_enum_get(op->ptr, "type"); + BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh; + BMFace *efa; + BMIter iter; + int numverts= RNA_int_get(op->ptr, "number"); + int type = RNA_enum_get(op->ptr, "type"); - /* Selects trias/qiads or isolated verts, and edges that do not have 2 neighboring - * faces - */ + for(efa = BMIter_New(&iter, em->bm, BM_FACES_OF_MESH, NULL); + efa; efa = BMIter_Step(&iter)){ - /* for loose vertices/edges, we first select all, loop below will deselect */ - if(numverts==5) { - EM_set_flag_all(em, SELECT); - } - else if(em->selectmode!=SCE_SELECT_FACE) { - BKE_report(op->reports, RPT_ERROR, "Only works in face selection mode"); - return OPERATOR_CANCELLED; - } - - for(efa= em->faces.first; efa; efa= efa->next) { - if (efa->e4) { - EM_select_face(efa, (numverts==4) ); + int select = 0; + + if(type == 0 && efa->len < numverts){ + select = 1; + }else if(type == 1 && efa->len == numverts){ + select = 1; + }else if(type == 2 && efa->len > numverts){ + select = 1; } - else { - EM_select_face(efa, (numverts==3) ); + + if(select){ + BM_Select(em->bm, efa, 1); } } + EDBM_selectmode_flush(em); + WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); -#endif return OPERATOR_FINISHED; } void MESH_OT_select_by_number_vertices(wmOperatorType *ot) { - static const EnumPropertyItem type_items[]= { - {3, "TRIANGLES", 0, "Triangles", NULL}, - {4, "QUADS", 0, "Triangles", NULL}, - {5, "OTHER", 0, "Other", NULL}, - {0, NULL, 0, NULL, NULL}}; + static const EnumPropertyItem type_items[] = { + {0, "LESS", 0, "Less Than", ""}, + {1, "EQUAL", 0, "Equal To", ""}, + {2, "GREATER", 0, "Greater Than", ""}, + {0, NULL, 0, NULL, NULL} + }; /* identifiers */ ot->name= "Select by Number of Vertices"; @@ -4127,12 +4126,57 @@ /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; - - /* props */ - RNA_def_enum(ot->srna, "type", type_items, 3, "Type", "Type of elements to select."); + + /* properties */ + RNA_def_int(ot->srna, "number", 4, 3, INT_MAX, "Number of Vertices", "", 3, INT_MAX); + RNA_def_enum(ot->srna, "type", type_items, 1, "Type", "Type of comparison to make"); } +static int select_loose_verts_exec(bContext *C, wmOperator *op) +{ + Object *obedit = CTX_data_edit_object(C); + BMEditMesh *em = ((Mesh*)obedit->data)->edit_btmesh; + BMVert *eve; + BMEdge *eed; + BMIter iter; + for(eve = BMIter_New(&iter, em->bm, BM_VERTS_OF_MESH, NULL); + eve; eve = BMIter_Step(&iter)){ + + if(!eve->e){ + BM_Select(em->bm, eve, 1); + } + } + + for(eed = BMIter_New(&iter, em->bm, BM_EDGES_OF_MESH, NULL); + eed; eed = BMIter_Step(&iter)){ + + if(!eed->l){ + BM_Select(em->bm, eed, 1); + } + } + + EDBM_selectmode_flush(em); + + WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); + return OPERATOR_FINISHED; +} + +void MESH_OT_select_loose_verts(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Select Loose Vertices/Edges"; + ot->description = "Select vertices with edges or faces and edges with no faces"; + ot->idname = "MESH_OT_select_loose_verts"; + + /* api callbacks */ + ot->exec = select_loose_verts_exec; + ot->poll = ED_operator_editmesh; + + /* flags */ + ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO; +} + #define MIRROR_THRESH 1.0f static int select_mirror_exec(bContext *C, wmOperator *op) Modified: branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h =================================================================== --- branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h 2011-06-26 19:54:29 UTC (rev 37833) +++ branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h 2011-06-26 20:23:27 UTC (rev 37834) @@ -216,6 +216,7 @@ void MESH_OT_hide(struct wmOperatorType *ot); void MESH_OT_reveal(struct wmOperatorType *ot); void MESH_OT_select_by_number_vertices(struct wmOperatorType *ot); +void MESH_OT_select_loose_verts(struct wmOperatorType *ot); void MESH_OT_select_mirror(struct wmOperatorType *ot); void MESH_OT_normals_make_consistent(struct wmOperatorType *ot); void MESH_OT_faces_select_linked_flat(struct wmOperatorType *ot); Modified: branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c =================================================================== --- branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c 2011-06-26 19:54:29 UTC (rev 37833) +++ branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c 2011-06-26 20:23:27 UTC (rev 37834) @@ -73,6 +73,7 @@ WM_operatortype_append(MESH_OT_hide); WM_operatortype_append(MESH_OT_reveal); WM_operatortype_append(MESH_OT_select_by_number_vertices); + WM_operatortype_append(MESH_OT_select_loose_verts); WM_operatortype_append(MESH_OT_select_mirror); WM_operatortype_append(MESH_OT_normals_make_consistent); WM_operatortype_append(MESH_OT_merge); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs