Revision: 15796
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15796
Author:   aligorith
Date:     2008-07-27 06:19:56 +0200 (Sun, 27 Jul 2008)

Log Message:
-----------
Patch #17336: Lock bones in edit mode
Submitted by: Lorenzo Pierfederici (lento) 

This patch adds the ability to lock transformation on bones in edit mode, to 
protect them from accidental editing.

Bones can be locked from the editing buttons, the transform property panel, the 
specials popup menu or the python api.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BIF_editarmature.h
    trunk/blender/source/blender/makesdna/DNA_armature_types.h
    trunk/blender/source/blender/makesdna/DNA_object_types.h
    trunk/blender/source/blender/python/api2_2x/Armature.c
    trunk/blender/source/blender/python/api2_2x/Bone.c
    trunk/blender/source/blender/python/api2_2x/doc/Armature.py
    trunk/blender/source/blender/src/buttons_editing.c
    trunk/blender/source/blender/src/drawview.c
    trunk/blender/source/blender/src/editarmature.c
    trunk/blender/source/blender/src/editobject.c
    trunk/blender/source/blender/src/transform_conversions.c
    trunk/blender/source/blender/src/transform_manipulator.c

Modified: trunk/blender/source/blender/include/BIF_editarmature.h
===================================================================
--- trunk/blender/source/blender/include/BIF_editarmature.h     2008-07-27 
03:40:37 UTC (rev 15795)
+++ trunk/blender/source/blender/include/BIF_editarmature.h     2008-07-27 
04:19:56 UTC (rev 15796)
@@ -134,6 +134,7 @@
 void   hide_selected_armature_bones(void);
 void   hide_unselected_armature_bones(void);
 void   show_all_armature_bones(void);
+void   set_locks_armature_bones(short lock);
 
 #define        BONESEL_ROOT    0x10000000
 #define        BONESEL_TIP             0x20000000

Modified: trunk/blender/source/blender/makesdna/DNA_armature_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_armature_types.h  2008-07-27 
03:40:37 UTC (rev 15795)
+++ trunk/blender/source/blender/makesdna/DNA_armature_types.h  2008-07-27 
04:19:56 UTC (rev 15796)
@@ -154,7 +154,8 @@
        BONE_NO_SCALE                           = (1<<15),      /* No parent 
scale */
        BONE_HIDDEN_PG                          = (1<<16),      /* hidden bone 
when drawing PoseChannels (for ghost drawing) */
        BONE_DRAWWIRE                           = (1<<17),      /* bone should 
be drawn as OB_WIRE, regardless of draw-types of view+armature */
-       BONE_NO_CYCLICOFFSET            = (1<<18)       /* when no parent, bone 
will not get cyclic offset */
+       BONE_NO_CYCLICOFFSET            = (1<<18),      /* when no parent, bone 
will not get cyclic offset */
+       BONE_EDITMODE_LOCKED            = (1<<19),      /* bone transforms are 
locked in EditMode */
 } eBone_Flag;
 
 #endif

Modified: trunk/blender/source/blender/makesdna/DNA_object_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_object_types.h    2008-07-27 
03:40:37 UTC (rev 15795)
+++ trunk/blender/source/blender/makesdna/DNA_object_types.h    2008-07-27 
04:19:56 UTC (rev 15796)
@@ -466,9 +466,11 @@
 #define OB_LOCK_ROTX   8
 #define OB_LOCK_ROTY   16
 #define OB_LOCK_ROTZ   32
+#define OB_LOCK_ROT            56
 #define OB_LOCK_SCALEX 64
 #define OB_LOCK_SCALEY 128
 #define OB_LOCK_SCALEZ 256
+#define OB_LOCK_SCALE  448
 
 /* ob->softflag in DNA_object_force.h */
 

Modified: trunk/blender/source/blender/python/api2_2x/Armature.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Armature.c      2008-07-27 
03:40:37 UTC (rev 15795)
+++ trunk/blender/source/blender/python/api2_2x/Armature.c      2008-07-27 
04:19:56 UTC (rev 15796)
@@ -1469,6 +1469,8 @@
                PyConstant_NewInt("BONE_SELECTED", BONE_SELECTED));
        PyModule_AddObject(module, "TIP_SELECTED", 
                PyConstant_NewInt("TIP_SELECTED", BONE_TIPSEL));
+       PyModule_AddObject(module, "LOCKED_EDIT", 
+               PyConstant_NewInt("LOCKED_EDIT", BONE_EDITMODE_LOCKED));
 
        PyModule_AddObject(module, "OCTAHEDRON", 
                PyConstant_NewInt("OCTAHEDRON", ARM_OCTA));

Modified: trunk/blender/source/blender/python/api2_2x/Bone.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Bone.c  2008-07-27 03:40:37 UTC 
(rev 15795)
+++ trunk/blender/source/blender/python/api2_2x/Bone.c  2008-07-27 04:19:56 UTC 
(rev 15796)
@@ -368,6 +368,10 @@
                        if (PyList_Append(list, 
                                EXPP_GetModuleConstant("Blender.Armature", 
"TIP_SELECTED")) == -1)
                                goto RuntimeError;
+               if(self->editbone->flag & BONE_EDITMODE_LOCKED)
+                       if (PyList_Append(list, 
+                               EXPP_GetModuleConstant("Blender.Armature", 
"LOCKED_EDIT")) == -1)
+                               goto RuntimeError;
        }else{
                if(self->flag & BONE_CONNECTED)
                        if (PyList_Append(list, 
@@ -401,6 +405,10 @@
                        if (PyList_Append(list, 
                                EXPP_GetModuleConstant("Blender.Armature", 
"TIP_SELECTED")) == -1)
                                goto RuntimeError;
+               if(self->flag & BONE_EDITMODE_LOCKED)
+                       if (PyList_Append(list, 
+                               EXPP_GetModuleConstant("Blender.Armature", 
"LOCKED_EDIT")) == -1)
+                               goto RuntimeError;
        }
 
        return list;
@@ -422,7 +430,7 @@
                                return 0;
                        if (!STREQ3(PyString_AsString(name), "CONNECTED", 
"HINGE", "NO_DEFORM") &&
                                !STREQ3(PyString_AsString(name), 
"ROOT_SELECTED", "BONE_SELECTED", "TIP_SELECTED")      &&
-                               !STREQ2(PyString_AsString(name), "MULTIPLY", 
"HIDDEN_EDIT"))
+                               !STREQ3(PyString_AsString(name), "MULTIPLY", 
"HIDDEN_EDIT", "LOCKED_EDIT"))
                                return 0;
                        else
                                return 1;

Modified: trunk/blender/source/blender/python/api2_2x/doc/Armature.py
===================================================================
--- trunk/blender/source/blender/python/api2_2x/doc/Armature.py 2008-07-27 
03:40:37 UTC (rev 15795)
+++ trunk/blender/source/blender/python/api2_2x/doc/Armature.py 2008-07-27 
04:19:56 UTC (rev 15796)
@@ -89,6 +89,8 @@
 @type BONE_SELECTED: Constant
 @var TIP_SELECTED: Tip of the Bone is selected
 @type TIP_SELECTED: Constant
[EMAIL PROTECTED] LOCKED_EDIT: Prevents the bone from being transformed in 
editmode
[EMAIL PROTECTED] LOCKED_EDIT: Constant
 @var OCTAHEDRON: Bones drawn as octahedrons
 @type OCTAHEDRON: Constant
 @var STICK: Bones drawn as a line
@@ -286,6 +288,7 @@
                         - Armature.ROOT_SELECTED: Selection of root ball of 
bone
                         - Armature.BONE_SELECTED: Selection of bone
                         - Armature.TIP_SELECTED: Selection of tip ball of bone
+                        - Armature.LOCKED_EDIT: Prevents the bone from being 
transformed in editmode
        @type options: List of Constants
        @ivar subdivision: The number of bone subdivisions.
        @type subdivision: Int

Modified: trunk/blender/source/blender/src/buttons_editing.c
===================================================================
--- trunk/blender/source/blender/src/buttons_editing.c  2008-07-27 03:40:37 UTC 
(rev 15795)
+++ trunk/blender/source/blender/src/buttons_editing.c  2008-07-27 04:19:56 UTC 
(rev 15796)
@@ -4371,11 +4371,12 @@
                        uiDefButF(block, NUM,B_ARM_RECALCDATA, "Weight:", 225, 
by-19,105, 18, &curBone->weight, 0.0F, 1000.0F, 10.0F, 0.0F, "Bone deformation 
weight");
                        
                        /* bone types */
-                       uiDefButBitI(block, TOG, BONE_HINGE, B_ARM_RECALCDATA, 
"Hinge",         -10,by-38,80,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't 
inherit rotation or scale from parent Bone");
-                       uiDefButBitI(block, TOG, BONE_NO_SCALE, 
B_ARM_RECALCDATA, "S",          70,by-38,20,18, &curBone->flag, 1.0, 32.0, 0.0, 
0.0, "Don't inherit scale from parent Bone");
-                       uiDefButBitI(block, TOGN, BONE_NO_DEFORM, 
B_ARM_RECALCDATA, "Deform",   90, by-38, 80, 18, &curBone->flag, 0.0, 0.0, 0.0, 
0.0, "Indicate if Bone deforms geometry");
-                       uiDefButBitI(block, TOG, BONE_MULT_VG_ENV, 
B_ARM_RECALCDATA, "Mult", 170,by-38,80,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, 
"Multiply Bone Envelope with VertexGroup");
-                       uiDefButBitI(block, TOG, BONE_HIDDEN_A, REDRAWVIEW3D, 
"Hide",   250,by-38,80,18, &curBone->flag, 0, 0, 0, 0, "Toggles display of this 
bone in Edit Mode");
+                       uiDefButBitI(block, TOG, BONE_HINGE, B_ARM_RECALCDATA, 
"Hinge",         -10,by-38,60,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't 
inherit rotation or scale from parent Bone");
+                       uiDefButBitI(block, TOG, BONE_NO_SCALE, 
B_ARM_RECALCDATA, "S",          50,by-38,20,18, &curBone->flag, 1.0, 32.0, 0.0, 
0.0, "Don't inherit scale from parent Bone");
+                       uiDefButBitI(block, TOGN, BONE_NO_DEFORM, 
B_ARM_RECALCDATA, "Deform",   70, by-38, 80, 18, &curBone->flag, 0.0, 0.0, 0.0, 
0.0, "Indicate if Bone deforms geometry");
+                       uiDefButBitI(block, TOG, BONE_MULT_VG_ENV, 
B_ARM_RECALCDATA, "Mult", 150,by-38,60,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, 
"Multiply Bone Envelope with VertexGroup");
+                       uiDefButBitI(block, TOG, BONE_HIDDEN_A, REDRAWVIEW3D, 
"Hide",   210,by-38,60,18, &curBone->flag, 0, 0, 0, 0, "Toggles display of this 
bone in Edit Mode");
+                       uiDefButBitI(block, TOG, BONE_EDITMODE_LOCKED, 
REDRAWVIEW3D, "Lock",    270,by-38,60,18, &curBone->flag, 0, 0, 0, 0, "Prevents 
this bone from being transformed in Edit Mode");
                        
                        /* layers */
                        uiBlockBeginAlign(block);

Modified: trunk/blender/source/blender/src/drawview.c
===================================================================
--- trunk/blender/source/blender/src/drawview.c 2008-07-27 03:40:37 UTC (rev 
15795)
+++ trunk/blender/source/blender/src/drawview.c 2008-07-27 04:19:56 UTC (rev 
15796)
@@ -1995,6 +1995,8 @@
        tfp->ob_eul[0]= 180.0*ebone->roll/M_PI;
        uiDefButF(block, NUM, B_ARMATUREPANEL1, "Roll:",        10, 100, 140, 
19, tfp->ob_eul, -lim, lim, 1000, 3, "");
 
+       uiDefButBitI(block, TOG, BONE_EDITMODE_LOCKED, REDRAWVIEW3D, "Lock", 
160, 100, 140, 19, &(ebone->flag), 0, 0, 0, 0, "Prevents bone from being 
transformed in edit mode");
+       
        uiBlockBeginAlign(block);
        uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailRadius:",  10, 150, 140, 
19, &ebone->rad_tail, 0, lim, 10, 3, "");
        if (ebone->parent && ebone->flag & BONE_CONNECTED )

Modified: trunk/blender/source/blender/src/editarmature.c
===================================================================
--- trunk/blender/source/blender/src/editarmature.c     2008-07-27 03:40:37 UTC 
(rev 15795)
+++ trunk/blender/source/blender/src/editarmature.c     2008-07-27 04:19:56 UTC 
(rev 15796)
@@ -2709,6 +2709,32 @@
        BIF_undo_push("Reveal Bones");
 }
 
+/* Sets editmode transform locks for bones (adds if lock==1, clears otherwise) 
*/
+void set_locks_armature_bones(short lock)
+{
+       bArmature *arm= G.obedit->data;
+       EditBone *ebone;
+       
+       for (ebone = G.edbo.first; ebone; ebone=ebone->next) {
+               if (arm->layer & ebone->layer) {
+                       if (ebone->flag & 
(BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL)) {
+                               if (lock)
+                                       ebone->flag |= BONE_EDITMODE_LOCKED;
+                               else    
+                                       ebone->flag &= ~BONE_EDITMODE_LOCKED;
+                       }
+               }
+       }
+       countall();
+       allqueue(REDRAWVIEW3D, 0);
+       allqueue(REDRAWBUTSEDIT, 0);
+       
+       if (lock)
+               BIF_undo_push("Lock Bones");
+       else
+               BIF_undo_push("Unlock Bones");
+}
+
 /* check for null, before calling! */
 static void bone_connect_to_existing_parent(EditBone *bone)
 {

Modified: trunk/blender/source/blender/src/editobject.c
===================================================================
--- trunk/blender/source/blender/src/editobject.c       2008-07-27 03:40:37 UTC 
(rev 15795)
+++ trunk/blender/source/blender/src/editobject.c       2008-07-27 04:19:56 UTC 
(rev 15796)
@@ -2760,7 +2760,7 @@
                DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
        }
        else if(G.obedit->type==OB_ARMATURE) {
-               nr= pupmenu("Specials%t|Subdivide %x1|Subdivide Multi%x2|Flip 
Left-Right Names%x3|%l|AutoName Left-Right%x4|AutoName Front-Back%x5|AutoName 
Top-Bottom%x6");
+               nr= pupmenu("Specials%t|Subdivide %x1|Subdivide Multi%x2|Flip 
Left-Right Names%x3|%l|AutoName Left-Right%x4|AutoName Front-Back%x5|AutoName 
Top-Bottom%x6|%l|Lock%x7|Unlock%x8");
                if(nr==1)
                        subdivide_armature(1);
                if(nr==2) {

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to