From d9045c860bbb8c31c82938bba47e54b9ff31a7bf Mon Sep 17 00:00:00 2001 From: Ken Hughes Date: Sun, 14 May 2006 14:12:45 +0000 Subject: [PATCH] ===Python API=== Make me.faces.sel and me.edges.sel behave like EM_select_face() and EM_select_edge() in source/blender/src/editmesh_lib.c. Script users should note that if they change ANY of the selection states (vertex, edge, face) and then call a mesh "tool" method (like me.remDoubles) that the selection states of the mesh MAY change, since these tools use the edit mode (which updates select states). --- source/blender/python/api2_2x/Mesh.c | 148 ++++++---------------- source/blender/python/api2_2x/doc/Mesh.py | 9 +- 2 files changed, 46 insertions(+), 111 deletions(-) diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c index c4805f04549..76183c75a68 100644 --- a/source/blender/python/api2_2x/Mesh.c +++ b/source/blender/python/api2_2x/Mesh.c @@ -696,90 +696,6 @@ static unsigned int make_vertex_table( unsigned int *vert_table, int count ) return to_delete; } -void recalc_selected_edges( Mesh *mesh, MEdge *edge ); -void recalc_selected_faces( Mesh *mesh, MFace *face ); - -/* - * select or deselect vert based on face select setting - */ - -void faceselect( MVert *mvert, MFace *face ) -{ - if( face->flag & ME_FACE_SEL ) { - mvert[face->v1].flag |= SELECT; - mvert[face->v2].flag |= SELECT; - mvert[face->v3].flag |= SELECT; - if ( face->v4 ) - mvert[face->v4].flag |= SELECT; - } else { - mvert[face->v1].flag &= ~SELECT; - mvert[face->v2].flag &= ~SELECT; - mvert[face->v3].flag &= ~SELECT; - if ( face->v4 ) - mvert[face->v4].flag &= ~SELECT; - } -} - -/* - * determine all selected faces based on change in one face - */ - -void recalc_selected_faces( Mesh *mesh, MFace *face ) -{ - int i; - - if( face ) { - /* set/clear face's verts */ - faceselect( mesh->mvert, face ); - /* set edges based on selected verts */ - recalc_selected_edges( mesh, NULL ); - } - - /* set vert selection based on selected faces */ - for( face = mesh->mface, i = 0; i < mesh->totface; ++i, ++face ) { - int flag = mesh->mvert[face->v1].flag; - flag &= mesh->mvert[face->v2].flag; - flag &= mesh->mvert[face->v3].flag; - if ( face->v4 ) - flag &= mesh->mvert[face->v4].flag; - if( flag & SELECT ) - face->flag |= ME_FACE_SEL; - else - face->flag &= ~ME_FACE_SEL; - } -} - -/* - * determine all selected edges based on change in one edge - */ - -void recalc_selected_edges( Mesh *mesh, MEdge *edge ) -{ - int i; - - if( edge ) { - /* clear selection on all vertices */ - if( edge->flag & SELECT ) { - mesh->mvert[edge->v1].flag |= SELECT; - mesh->mvert[edge->v2].flag |= SELECT; - } else { - mesh->mvert[edge->v1].flag &= ~SELECT; - mesh->mvert[edge->v2].flag &= ~SELECT; - } - - recalc_selected_faces( mesh, NULL ); - } - - /* set edges based on selected verts */ - for( edge = mesh->medge, i = 0; i < mesh->totedge; ++i, ++edge ) { - if( mesh->mvert[edge->v1].flag & - mesh->mvert[edge->v2].flag & SELECT ) - edge->flag |= SELECT; - else - edge->flag &= ~SELECT; - } -} - /************************************************************************ * @@ -1108,9 +1024,9 @@ static int MVert_setMFlagBits( BPy_MVert * self, PyObject * value, MVert *v; v = MVert_get_pointer( self ); - + if( self->index >= ((Mesh *)self->data)->totvert ) - return EXPP_ReturnPyObjError( PyExc_RuntimeError, + return EXPP_ReturnIntError( PyExc_RuntimeError, "MVert is no longer valid" ); return EXPP_setBitfield( value, &v->flag, @@ -1193,14 +1109,12 @@ static int MVert_setSel( BPy_MVert *self, PyObject *value ) Mesh *me = (Mesh *)self->data; /* - * if vertex exists and setting status is OK, update the select states + * if vertex exists and setting status is OK, delete select storage * of the edges and faces as well */ if( v && !EXPP_setBitfield( value, &v->flag, SELECT, 'b' ) ) { - recalc_selected_edges( me, NULL ); - recalc_selected_faces( me, NULL ); - if( me->mselect ) { + if( me && me->mselect ) { MEM_freeN( me->mselect ); me->mselect = NULL; } @@ -2319,8 +2233,6 @@ static int MEdge_setFlag( BPy_MEdge * self, PyObject * value ) edge->flag = param; - recalc_selected_edges( self->mesh, edge ); - return 0; } @@ -2424,26 +2336,26 @@ static PyObject *MEdge_getMFlagBits( BPy_MEdge * self, void * type ) * get an edge's select state */ -static PyObject *MEdge_getLength( BPy_MEdge * self, void * type ) +static PyObject *MEdge_getLength( BPy_MEdge * self ) { MEdge *edge = MEdge_get_pointer( self ); double dot = 0.0f; float tmpf; int i; float *v1, *v2; - + /* get the 2 edges vert locations */ v1= (&((Mesh *)self->mesh)->mvert[edge->v1])->co; v2= (&((Mesh *)self->mesh)->mvert[edge->v2])->co; - + if( !edge ) return NULL; - - for(i = 0; i < 3; i++){ - tmpf= v1[i] - v2[i]; + + for( i = 0; i < 3; i++ ) { + tmpf = v1[i] - v2[i]; dot += tmpf*tmpf; } - return PyFloat_FromDouble(sqrt(dot)); + return PyFloat_FromDouble( sqrt( dot ) ); } /* @@ -2455,6 +2367,7 @@ static int MEdge_setSel( BPy_MEdge * self,PyObject * value, { MEdge *edge = MEdge_get_pointer( self ); int param = PyObject_IsTrue( value ); + Mesh *me; if( !edge ) return -1; @@ -2463,12 +2376,19 @@ static int MEdge_setSel( BPy_MEdge * self,PyObject * value, return EXPP_ReturnIntError( PyExc_TypeError, "expected true/false argument" ); - if( param ) - edge->flag |= SELECT; - else - edge->flag &= ~SELECT; + me = self->mesh; + + if( param ) { + edge->flag |= SELECT; + me->mvert[edge->v1].flag |= SELECT; + me->mvert[edge->v2].flag |= SELECT; + } + else { + edge->flag &= ~SELECT; + me->mvert[edge->v1].flag &= ~SELECT; + me->mvert[edge->v2].flag &= ~SELECT; + } - recalc_selected_edges( self->mesh, edge ); if( self->mesh->mselect ) { MEM_freeN( self->mesh->mselect ); self->mesh->mselect = NULL; @@ -3795,6 +3715,7 @@ static int MFace_setSelect( BPy_MFace * self, PyObject * value, { MFace *face = MFace_get_pointer( self ); int param = PyObject_IsTrue( value ); + Mesh *me; if( !face ) return -1; @@ -3803,19 +3724,30 @@ static int MFace_setSelect( BPy_MFace * self, PyObject * value, return EXPP_ReturnIntError( PyExc_TypeError, "expected true/false argument" ); - if( param ) + me = self->mesh; + if( param ) { face->flag |= ME_FACE_SEL; - else + me->mvert[face->v1].flag |= SELECT; + me->mvert[face->v2].flag |= SELECT; + me->mvert[face->v3].flag |= SELECT; + if( face->v4 ) + me->mvert[face->v4].flag |= SELECT; + } + else { face->flag &= ~ME_FACE_SEL; + me->mvert[face->v1].flag &= ~SELECT; + me->mvert[face->v2].flag &= ~SELECT; + me->mvert[face->v3].flag &= ~SELECT; + if( face->v4 ) + me->mvert[face->v4].flag &= ~SELECT; + } - recalc_selected_faces( self->mesh, face ); if( self->mesh->mselect ) { MEM_freeN( self->mesh->mselect ); self->mesh->mselect = NULL; } return 0; - } /* diff --git a/source/blender/python/api2_2x/doc/Mesh.py b/source/blender/python/api2_2x/doc/Mesh.py index 93d989dca7c..ab182dbddb5 100644 --- a/source/blender/python/api2_2x/doc/Mesh.py +++ b/source/blender/python/api2_2x/doc/Mesh.py @@ -357,7 +357,9 @@ class MEdge: @type flag: int @ivar index: The edge's index within the mesh. Read-only. @type index: int - @ivar sel: The edge's B{edit mode} selection state (selected=1). + @ivar sel: The edge's B{edit mode} selection state (selected=1). B{Note}: + changing the select state of an edge changes the select state of the edge's + vertices. @type sel: int """ @@ -468,8 +470,9 @@ class MFace: @ivar v: Same as L{verts}. This attribute is only for compatibility with NMesh scripts and will probably be deprecated in the future. @ivar sel: The face's B{edit mode} selection state (selected=1). - This is not the same as the selection state of - the textured faces (see L{flag}). + This is not the same as the selection state of the textured faces + (see L{flag}). B{Note}: changing the select state of a face changes + the select state of the face's vertices. @type sel: int @ivar hide: The face's B{edit mode} visibility state (hidden=1). This is not the same as the visibility state of