Revision: 51689
          http://brlcad.svn.sourceforge.net/brlcad/?rev=51689&view=rev
Author:   bob1961
Date:     2012-07-27 12:04:25 +0000 (Fri, 27 Jul 2012)
Log Message:
-----------
Added a mechanism for using mouse interactions to edit the matrix above some 
member of a combination. Previously, mouse interactions resulted in edits 
getting pushed into the selected object. That is if the selected object was a 
combination, the edits wound up as matrices above all members in the 
combination. And if the selected object was a primitive, the edits were pushed 
into the primitive. Archer has another mode button in the toolbar for deciding 
how mouse interactions are applied to the select object.

Modified Paths:
--------------
    brlcad/trunk/include/tclcad.h
    brlcad/trunk/src/libtclcad/tclcad_obj.c
    brlcad/trunk/src/tclscripts/archer/Archer.tcl
    brlcad/trunk/src/tclscripts/archer/ArcherCore.tcl
    brlcad/trunk/src/tclscripts/archer/images/CMakeLists.txt
    brlcad/trunk/src/tclscripts/lib/Ged.tcl

Added Paths:
-----------
    brlcad/trunk/src/tclscripts/archer/images/matrixModeAbove.png
    brlcad/trunk/src/tclscripts/archer/images/matrixModeBelow.png

Modified: brlcad/trunk/include/tclcad.h
===================================================================
--- brlcad/trunk/include/tclcad.h       2012-07-27 02:44:15 UTC (rev 51688)
+++ brlcad/trunk/include/tclcad.h       2012-07-27 12:04:25 UTC (rev 51689)
@@ -85,6 +85,7 @@
 struct ged_dm_view {
     struct bu_list             l;
     struct bu_vls              gdv_callback;
+    struct bu_vls              gdv_edit_motion_delta_callback;
     struct bu_vls              gdv_name;
     struct ged_view            *gdv_view;
     struct dm                  *gdv_dmp;

Modified: brlcad/trunk/src/libtclcad/tclcad_obj.c
===================================================================
--- brlcad/trunk/src/libtclcad/tclcad_obj.c     2012-07-27 02:44:15 UTC (rev 
51688)
+++ brlcad/trunk/src/libtclcad/tclcad_obj.c     2012-07-27 12:04:25 UTC (rev 
51689)
@@ -308,6 +308,12 @@
                         ged_func_ptr func,
                         const char *usage,
                         int maxargs);
+HIDDEN int to_edit_motion_delta_callback(struct ged *gedp,
+                                        int argc,
+                                        const char *argv[],
+                                        ged_func_ptr func,
+                                        const char *usage,
+                                        int maxargs);
 HIDDEN int to_more_args_callback(struct ged *gedp,
                                 int argc,
                                 const char *argv[],
@@ -954,6 +960,7 @@
     {"mirror", (char *)0, TO_UNLIMITED, to_mirror, GED_FUNC_PTR_NULL},
     {"model2view",     "vname", 2, to_view_func, ged_model2view},
     {"model_axes",     "???", TO_UNLIMITED, to_model_axes, GED_FUNC_PTR_NULL},
+    {"edit_motion_delta_callback",     "vname [args]", TO_UNLIMITED, 
to_edit_motion_delta_callback, GED_FUNC_PTR_NULL},
     {"more_args_callback",     "set/get the \"more args\" callback", 
TO_UNLIMITED, to_more_args_callback, GED_FUNC_PTR_NULL},
     {"move_arb_edge",  (char *)0, TO_UNLIMITED, to_pass_through_func, 
ged_move_arb_edge},
     {"move_arb_edge_mode",     "obj edge x y", TO_UNLIMITED, 
to_move_arb_edge_mode, GED_FUNC_PTR_NULL},
@@ -1262,6 +1269,7 @@
        BU_LIST_DEQUEUE(&(gdvp->l));
        bu_vls_free(&gdvp->gdv_name);
        bu_vls_free(&gdvp->gdv_callback);
+       bu_vls_free(&gdvp->gdv_edit_motion_delta_callback);
        DM_CLOSE(gdvp->gdv_dmp);
        bu_free((genptr_t)gdvp->gdv_view, "ged_view");
 
@@ -4908,6 +4916,7 @@
     BU_LIST_DEQUEUE(&(gdvp->l));
     bu_vls_free(&gdvp->gdv_name);
     bu_vls_free(&gdvp->gdv_callback);
+    bu_vls_free(&gdvp->gdv_edit_motion_delta_callback);
     DM_CLOSE(gdvp->gdv_dmp);
     bu_free((genptr_t)gdvp->gdv_view, "ged_view");
     bu_free((genptr_t)gdvp, "ged_dm_view");
@@ -5962,7 +5971,54 @@
     return to_axes(gedp, gdvp, &gdvp->gdv_view->gv_model_axes, argc, argv, 
usage);
 }
 
+
 HIDDEN int
+to_edit_motion_delta_callback(struct ged *gedp,
+                             int argc,
+                             const char *argv[],
+                             ged_func_ptr UNUSED(func),
+                             const char *usage,
+                             int UNUSED(maxargs))
+{
+    register int i;
+    struct ged_dm_view *gdvp;
+
+    /* initialize result */
+    bu_vls_trunc(gedp->ged_result_str, 0);
+
+    /* must be wanting help */
+    if (argc == 1) {
+       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return GED_HELP;
+    }
+
+    for (BU_LIST_FOR(gdvp, ged_dm_view, 
&current_top->to_gop->go_head_views.l)) {
+       if (BU_STR_EQUAL(bu_vls_addr(&gdvp->gdv_name), argv[1]))
+           break;
+    }
+
+    if (BU_LIST_IS_HEAD(&gdvp->l, &current_top->to_gop->go_head_views.l)) {
+       bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]);
+       return GED_ERROR;
+    }
+
+    /* get the callback string */
+    if (argc == 2) {
+       bu_vls_printf(gedp->ged_result_str, "%s", 
bu_vls_addr(&gdvp->gdv_edit_motion_delta_callback));
+       
+       return GED_OK;
+    }
+
+    /* set the callback string */
+    bu_vls_trunc(&gdvp->gdv_edit_motion_delta_callback, 0);
+    for (i = 2; i < argc; ++i)
+       bu_vls_printf(&gdvp->gdv_edit_motion_delta_callback, "%s ", argv[i]);
+
+    return GED_OK;
+}
+
+
+HIDDEN int
 to_more_args_callback(struct ged *gedp,
                      int argc,
                      const char *argv[],
@@ -6657,8 +6713,6 @@
                 const char *usage,
                 int UNUSED(maxargs))
 {
-    int ret;
-    char *av[6];
     fastf_t x, y;
     fastf_t dx, dy;
     point_t model;
@@ -6727,25 +6781,36 @@
     bu_vls_printf(&rot_z_vls, "%lf", model[Z]);
 
     gedp->ged_gvp = gdvp->gdv_view;
-    av[0] = "orotate";
-    av[1] = (char *)argv[2];
-    av[2] = bu_vls_addr(&rot_x_vls);
-    av[3] = bu_vls_addr(&rot_y_vls);
-    av[4] = bu_vls_addr(&rot_z_vls);
-    av[5] = (char *)0;
 
-    ret = ged_orotate(gedp, 5, (const char **)av);
+    if (0 < bu_vls_strlen(&gdvp->gdv_edit_motion_delta_callback)) {
+       struct bu_vls tcl_cmd;
+
+       bu_vls_init(&tcl_cmd);
+       bu_vls_printf(&tcl_cmd, "%V orotate %V %V %V", 
&gdvp->gdv_edit_motion_delta_callback, &rot_x_vls, &rot_y_vls, &rot_z_vls);
+       Tcl_Eval(current_top->to_interp, bu_vls_addr(&tcl_cmd));
+       bu_vls_free(&tcl_cmd);
+    } else {
+       char *av[6];
+
+       av[0] = "orotate";
+       av[1] = (char *)argv[2];
+       av[2] = bu_vls_addr(&rot_x_vls);
+       av[3] = bu_vls_addr(&rot_y_vls);
+       av[4] = bu_vls_addr(&rot_z_vls);
+       av[5] = (char *)0;
+
+       if (ged_orotate(gedp, 5, (const char **)av) == GED_OK) {
+           av[0] = "draw";
+           av[1] = (char *)argv[2];
+           av[2] = (char *)0;
+           to_edit_redraw(gedp, 2, (const char **)av);
+       }
+    }
+
     bu_vls_free(&rot_x_vls);
     bu_vls_free(&rot_y_vls);
     bu_vls_free(&rot_z_vls);
 
-    if (ret == GED_OK) {
-       av[0] = "draw";
-       av[1] = (char *)argv[2];
-       av[2] = (char *)0;
-       to_edit_redraw(gedp, 2, (const char **)av);
-    }
-
     return GED_OK;
 }
 
@@ -6757,8 +6822,6 @@
                const char *usage,
                int UNUSED(maxargs))
 {
-    int ret;
-    char *av[6];
     fastf_t x, y;
     fastf_t dx, dy;
     fastf_t sf;
@@ -6824,21 +6887,32 @@
     bu_vls_printf(&sf_vls, "%lf", sf);
 
     gedp->ged_gvp = gdvp->gdv_view;
-    av[0] = "oscale";
-    av[1] = (char *)argv[2];
-    av[2] = bu_vls_addr(&sf_vls);
-    av[3] = (char *)0;
 
-    ret = ged_oscale(gedp, 3, (const char **)av);
-    bu_vls_free(&sf_vls);
+    if (0 < bu_vls_strlen(&gdvp->gdv_edit_motion_delta_callback)) {
+       struct bu_vls tcl_cmd;
 
-    if (ret == GED_OK) {
-       av[0] = "draw";
+       bu_vls_init(&tcl_cmd);
+       bu_vls_printf(&tcl_cmd, "%V oscale %V", 
&gdvp->gdv_edit_motion_delta_callback, &sf_vls);
+       Tcl_Eval(current_top->to_interp, bu_vls_addr(&tcl_cmd));
+       bu_vls_free(&tcl_cmd);
+    } else {
+       char *av[6];
+
+       av[0] = "oscale";
        av[1] = (char *)argv[2];
-       av[2] = (char *)0;
-       to_edit_redraw(gedp, 2, (const char **)av);
+       av[2] = bu_vls_addr(&sf_vls);
+       av[3] = (char *)0;
+
+       if (ged_oscale(gedp, 3, (const char **)av) == GED_OK) {
+           av[0] = "draw";
+           av[1] = (char *)argv[2];
+           av[2] = (char *)0;
+           to_edit_redraw(gedp, 2, (const char **)av);
+       }
     }
 
+    bu_vls_free(&sf_vls);
+
     return GED_OK;
 }
 
@@ -6850,8 +6924,6 @@
                    const char *usage,
                    int UNUSED(maxargs))
 {
-    int ret;
-    char *av[6];
     fastf_t x, y;
     fastf_t dx, dy;
     fastf_t inv_width;
@@ -6922,25 +6994,36 @@
     bu_vls_printf(&tran_z_vls, "%lf", model[Z]);
 
     gedp->ged_gvp = gdvp->gdv_view;
-    av[0] = "otranslate";
-    av[1] = (char *)argv[2];
-    av[2] = bu_vls_addr(&tran_x_vls);
-    av[3] = bu_vls_addr(&tran_y_vls);
-    av[4] = bu_vls_addr(&tran_z_vls);
-    av[5] = (char *)0;
 
-    ret = ged_otranslate(gedp, 5, (const char **)av);
+    if (0 < bu_vls_strlen(&gdvp->gdv_edit_motion_delta_callback)) {
+       struct bu_vls tcl_cmd;
+
+       bu_vls_init(&tcl_cmd);
+       bu_vls_printf(&tcl_cmd, "%V otranslate %V %V %V", 
&gdvp->gdv_edit_motion_delta_callback, &tran_x_vls, &tran_y_vls, &tran_z_vls);
+       Tcl_Eval(current_top->to_interp, bu_vls_addr(&tcl_cmd));
+       bu_vls_free(&tcl_cmd);
+    } else {
+       char *av[6];
+
+       av[0] = "otranslate";
+       av[1] = (char *)argv[2];
+       av[2] = bu_vls_addr(&tran_x_vls);
+       av[3] = bu_vls_addr(&tran_y_vls);
+       av[4] = bu_vls_addr(&tran_z_vls);
+       av[5] = (char *)0;
+
+       if (ged_otranslate(gedp, 5, (const char **)av) == GED_OK) {
+           av[0] = "draw";
+           av[1] = (char *)argv[2];
+           av[2] = (char *)0;
+           to_edit_redraw(gedp, 2, (const char **)av);
+       }
+    }
+
     bu_vls_free(&tran_x_vls);
     bu_vls_free(&tran_y_vls);
     bu_vls_free(&tran_z_vls);
 
-    if (ret == GED_OK) {
-       av[0] = "draw";
-       av[1] = (char *)argv[2];
-       av[2] = (char *)0;
-       to_edit_redraw(gedp, 2, (const char **)av);
-    }
-
     return GED_OK;
 }
 
@@ -8462,6 +8545,7 @@
     new_gdvp->gdv_gop = current_top->to_gop;
     bu_vls_init(&new_gdvp->gdv_name);
     bu_vls_init(&new_gdvp->gdv_callback);
+    bu_vls_init(&new_gdvp->gdv_edit_motion_delta_callback);
     bu_vls_printf(&new_gdvp->gdv_name, argv[name_index]);
     ged_view_init(new_gdvp->gdv_view);
     BU_LIST_INSERT(&current_top->to_gop->go_head_views.l, &new_gdvp->l);
@@ -8611,6 +8695,8 @@
     return GED_OK;
 }
 
+
+/* to_model_delta_mode */
 HIDDEN int
 to_otranslate_mode(struct ged *gedp,
                   int argc,
@@ -8668,6 +8754,7 @@
     return GED_OK;
 }
 
+
 HIDDEN int
 to_paint_rect_area(struct ged *gedp,
                   int argc,
@@ -10563,6 +10650,7 @@
     return to_axes(gedp, gdvp, &gdvp->gdv_view->gv_view_axes, argc, argv, 
usage);
 }
 
+
 HIDDEN int
 to_view_callback(struct ged *gedp,
                 int argc,
@@ -10608,6 +10696,7 @@
     return GED_OK;
 }
 
+
 HIDDEN int
 to_view_win_size(struct ged *gedp,
                 int argc,

Modified: brlcad/trunk/src/tclscripts/archer/Archer.tcl
===================================================================
--- brlcad/trunk/src/tclscripts/archer/Archer.tcl       2012-07-27 02:44:15 UTC 
(rev 51688)
+++ brlcad/trunk/src/tclscripts/archer/Archer.tcl       2012-07-27 12:04:25 UTC 
(rev 51689)
@@ -182,8 +182,9 @@
        method Load                {_target}
        method saveDb              {}
        method units               {args}
+       method initCombImages          {}
+       method initFbImages        {}
        method initImages          {}
-       method initFbImages        {}
        method setDefaultBindingMode {_mode}
 
        # Object Edit Management
@@ -242,6 +243,8 @@
        method fbToggle {}
        method rtEndCallback {_aborted}
        method getRayBotNormalCos {_start _target _bot}
+       method editMotionDeltaCallback {args}
+       method toggleMatrixMode {}
 
        #XXX Need to split up menuStatusCB into one method per menu
        method menuStatusCB {_w}
@@ -1631,6 +1634,7 @@
     set mSavedViewEyePt ""
     set mSavedSize ""
 
+    $itk_component(ged) edit_motion_delta_callback_all [::itcl::code $this 
editMotionDeltaCallback]
     $itk_component(ged) refresh_on
     $itk_component(ged) refresh_all
     SetNormalCursor $this
@@ -1667,6 +1671,47 @@
 }
 
 
+::itcl::body Archer::initCombImages {} {
+    set mImage_matrixModeAbove [image create photo \
+                                   -file [file join $mImgDir 
matrixModeAbove.png]]
+    set mImage_matrixModeBelow [image create photo \
+                                   -file [file join $mImgDir 
matrixModeBelow.png]]
+
+    $itk_component(primaryToolbar) itemconfigure comb \
+       -image [image create photo \
+                   -file [file join $mImgDir combination.png]]
+
+    if {$mObjMatrixMode == $MATRIX_ABOVE_MODE} {
+       $itk_component(primaryToolbar) itemconfigure matrixmode \
+           -image $mImage_matrixModeAbove
+    } else {
+       $itk_component(primaryToolbar) itemconfigure matrixmode \
+           -image $mImage_matrixModeBelow
+    }
+}
+
+
+::itcl::body Archer::initFbImages {} {
+    set mImage_fbOff [image create photo -file [file join $mImgDir 
framebuffer_off.png]]
+    set mImage_fbOn [image create photo -file [file join $mImgDir 
framebuffer.png]]
+    set mImage_fbInterlay [image create photo -file [file join $mImgDir 
framebuffer_interlay.png]]
+    set mImage_fbOverlay [image create photo -file [file join $mImgDir 
framebuffer_overlay.png]]
+    set mImage_fbUnderlay [image create photo -file [file join $mImgDir 
framebuffer_underlay.png]]
+    set mImage_rt [image create photo -file [file join $mImgDir raytrace.png]]
+    set mImage_rtAbort [image create photo -file [file join $mImgDir 
raytrace_abort.png]]
+
+    $itk_component(primaryToolbar) itemconfigure toggle_fb \
+       -image $mImage_fbOn
+    $itk_component(primaryToolbar) itemconfigure toggle_fb_mode \
+       -image $mImage_fbUnderlay
+    $itk_component(primaryToolbar) itemconfigure raytrace \
+       -image $mImage_rt
+    $itk_component(primaryToolbar) itemconfigure clear_fb \
+       -image [image create photo \
+                   -file [file join $mImgDir framebuffer_clear.png]]
+}
+
+
 ::itcl::body Archer::initImages {} {
     if {$mInstanceInit} {
        return
@@ -1694,9 +1739,6 @@
        $itk_component(primaryToolbar) itemconfigure preferences \
            -image [image create photo \
                        -file [file join $mImgDir configure.png]]
-       $itk_component(primaryToolbar) itemconfigure comb \
-           -image [image create photo \
-                       -file [file join $mImgDir combination.png]]
        #       $itk_component(primaryToolbar) itemconfigure arb6 \
            -image [image create photo \
                        -file [file join $mImgDir primitive_arb6.png]]
@@ -1820,31 +1862,11 @@
                        -file [file join $mImgDir rtimage.png]]
     }
 
+    initCombImages
     initFbImages
 }
 
 
-::itcl::body Archer::initFbImages {} {
-    set mImage_fbOff [image create photo -file [file join $mImgDir 
framebuffer_off.png]]
-    set mImage_fbOn [image create photo -file [file join $mImgDir 
framebuffer.png]]
-    set mImage_fbInterlay [image create photo -file [file join $mImgDir 
framebuffer_interlay.png]]
-    set mImage_fbOverlay [image create photo -file [file join $mImgDir 
framebuffer_overlay.png]]
-    set mImage_fbUnderlay [image create photo -file [file join $mImgDir 
framebuffer_underlay.png]]
-    set mImage_rt [image create photo -file [file join $mImgDir raytrace.png]]
-    set mImage_rtAbort [image create photo -file [file join $mImgDir 
raytrace_abort.png]]
-
-    $itk_component(primaryToolbar) itemconfigure toggle_fb \
-       -image $mImage_fbOn
-    $itk_component(primaryToolbar) itemconfigure toggle_fb_mode \
-       -image $mImage_fbUnderlay
-    $itk_component(primaryToolbar) itemconfigure raytrace \
-       -image $mImage_rt
-    $itk_component(primaryToolbar) itemconfigure clear_fb \
-       -image [image create photo \
-                   -file [file join $mImgDir framebuffer_clear.png]]
-}
-
-
 ::itcl::body Archer::setDefaultBindingMode {_mode} {
     set saved_mode $mDefaultBindingMode
 
@@ -3956,6 +3978,129 @@
 }
 
 
+::itcl::body Archer::editMotionDeltaCallback {args} {
+    set argslen [llength $args]
+    if {$argslen < 2} {
+       return
+    }
+
+    if {$mObjMatrixMode == $MATRIX_ABOVE_MODE && $mSelectedObjPath != 
$mSelectedObj} {
+       set plist [split $mSelectedObjPath /]
+       set pobj [lindex $plist end-1]
+    } else {
+       set pobj $mSelectedObjPath
+    }
+
+    switch -- [lindex $args 0] {
+       "orotate" {
+           if {$argslen != 4} {
+               return
+           }
+
+           set rx [lindex $args 1]
+           set ry [lindex $args 2]
+           set rz [lindex $args 3]
+
+           if {$mObjMatrixMode == $MATRIX_ABOVE_MODE && $mSelectedObjPath != 
$mSelectedObj} {
+               set ocenter [gedCmd ocenter $mSelectedObjPath]
+               set cx [lindex $ocenter 0]
+               set cy [lindex $ocenter 1]
+               set cz [lindex $ocenter 2]
+
+               set cmd "$itk_component(ged) combmem -r 3 $pobj "
+               foreach item [split [$itk_component(ged) combmem -i 3 $pobj] 
"\n"] {
+                   set obj [lindex $item 1]
+
+                   if {$obj == $mSelectedObj} {
+                       set item [lreplace $item 2 end $rx $ry $rz $cx $cy $cz]
+                   }
+
+                   append cmd " $item"
+               }
+           } else {
+               set cmd "orotate $pobj $rx $ry $rz"
+           }
+       }
+       "otranslate" {
+           if {$argslen != 4} {
+               return
+           }
+
+           set dx [lindex $args 1]
+           set dy [lindex $args 2]
+           set dz [lindex $args 3]
+
+           if {$mObjMatrixMode == $MATRIX_ABOVE_MODE && $mSelectedObjPath != 
$mSelectedObj} {
+               set cmd "$itk_component(ged) combmem -r 5 $pobj "
+               foreach item [split [$itk_component(ged) combmem -i 5 $pobj] 
"\n"] {
+                   set obj [lindex $item 1]
+
+                   if {$obj == $mSelectedObj} {
+                       set item [lreplace $item 2 end $dx $dy $dz]
+                   }
+
+                   append cmd " $item"
+               }
+           } else {
+               set cmd "otranslate $pobj $dx $dy $dz"
+           }
+       }
+       "oscale" {
+           if {$argslen != 2} {
+               return
+           }
+
+           set sf [lindex $args 1]
+
+           if {$mObjMatrixMode == $MATRIX_ABOVE_MODE && $mSelectedObjPath != 
$mSelectedObj} {
+               set ocenter [gedCmd ocenter $mSelectedObjPath]
+               set cx [lindex $ocenter 0]
+               set cy [lindex $ocenter 1]
+               set cz [lindex $ocenter 2]
+
+               set cmd "$itk_component(ged) combmem -r 6 $pobj "
+               foreach item [split [$itk_component(ged) combmem -i 6 $pobj] 
"\n"] {
+                   set obj [lindex $item 1]
+
+                   if {$obj == $mSelectedObj} {
+                       set item [lreplace $item 2 end $sf 1 1 1 $cx $cy $cz]
+                   }
+
+                   append cmd " $item"
+               }
+           } else {
+               set cmd "oscale $pobj $sf"
+           }
+       }
+       default {
+           return
+       }
+    }
+
+    eval $cmd
+    redrawObj $pobj 0
+}
+
+
+::itcl::body Archer::toggleMatrixMode {} {
+    if {$mObjMatrixMode == $MATRIX_ABOVE_MODE} {
+       set mObjMatrixMode $MATRIX_BELOW_MODE
+       set mStatusStr "Toggle matrix mode. Currently set to \"Below\""
+       $itk_component(primaryToolbar) itemconfigure matrixmode \
+           -image $mImage_matrixModeBelow \
+           -balloonstr "Toggle matrix mode. Currently set to \"Below\"" \
+           -helpstr "Toggle matrix mode. Currently set to \"Below\""
+    } else {
+       set mObjMatrixMode $MATRIX_ABOVE_MODE
+       set mStatusStr "Toggle matrix mode. Currently set to \"Aove\""
+       $itk_component(primaryToolbar) itemconfigure matrixmode \
+           -image $mImage_matrixModeAbove \
+           -balloonstr "Toggle matrix mode. Currently set to \"Above\"" \
+           -helpstr "Toggle matrix mode. Currently set to \"Above\""
+    }
+}
+
+
 ::itcl::body Archer::menuStatusCB {_w} {
     if {$mDoStatus} {
        # entry might not support -label (i.e. tearoffs)
@@ -4258,9 +4403,11 @@
     if {$_on} {
        $itk_component(primaryToolbar) itemconfigure other -state normal
        $itk_component(primaryToolbar) itemconfigure comb -state normal
+       $itk_component(primaryToolbar) itemconfigure matrixmode -state normal
     } else {
        $itk_component(primaryToolbar) itemconfigure other -state disabled
        $itk_component(primaryToolbar) itemconfigure comb -state disabled
+       $itk_component(primaryToolbar) itemconfigure matrixmode -state disabled
     }
 }
 
@@ -4365,13 +4512,13 @@
 
     buildWizardMenu
     
-    $itk_component(primaryToolbar) insert rotate frame fill4 \
+#    $itk_component(primaryToolbar) insert rotate frame fill4 \
        -relief flat \
        -width 3
-    $itk_component(primaryToolbar) insert rotate frame sep2 \
+#    $itk_component(primaryToolbar) insert rotate frame sep2 \
        -relief sunken \
        -width 2
-    $itk_component(primaryToolbar) insert rotate frame fill5 \
+#    $itk_component(primaryToolbar) insert rotate frame fill5 \
        -relief flat \
        -width 3
 
@@ -4423,13 +4570,13 @@
        -relief flat
 
     # half-size spacer
-    $itk_component(primaryToolbar) insert rotate frame fill6 \
+#    $itk_component(primaryToolbar) insert rotate frame fill6 \
        -relief flat \
        -width 3
-    $itk_component(primaryToolbar) insert rotate frame sep3 \
+#    $itk_component(primaryToolbar) insert rotate frame sep3 \
        -relief sunken \
        -width 2
-    $itk_component(primaryToolbar) insert rotate frame fill7 \
+#    $itk_component(primaryToolbar) insert rotate frame fill7 \
        -relief flat \
        -width 3
 
@@ -4441,7 +4588,22 @@
        -overrelief raised \
        -command [::itcl::code $this createObj comb]
 
+    $itk_component(primaryToolbar) insert rotate button matrixmode \
+       -state disabled \
+       -relief flat \
+       -overrelief raised \
+       -command [::itcl::code $this toggleMatrixMode]
 
+    if {$mObjMatrixMode == $MATRIX_ABOVE_MODE} {
+       $itk_component(primaryToolbar) itemconfigure matrixmode \
+           -balloonstr "Toggle matrix mode. Currently set to \"Above\"" \
+           -helpstr "Toggle matrix mode. Currently set to \"Above\""
+    } else {
+       $itk_component(primaryToolbar) itemconfigure matrixmode \
+           -balloonstr "Toggle matrix mode. Currently set to \"Below\"" \
+           -helpstr "Toggle matrix mode. Currently set to \"Below\""
+    }
+
     set parent [$itk_component(primaryToolbar) component other]
     itk_component add primitiveMenu {
        ::menu $parent.menu \
@@ -5975,17 +6137,24 @@
     set vy [lindex $vl 1]
     set vcenter [list $vx $vy [lindex $ovcenter 2]]
 
-    set ocenter [vscale [eval gedCmd pane_v2m_point $_dm $vcenter] [gedCmd 
base2local]]
+    set new_ocenter [vscale [eval gedCmd pane_v2m_point $_dm $vcenter] [gedCmd 
base2local]]
 
     set ret [catch {
-       if {$GeometryEditFrame::mEditCommand != ""} {
-           gedCmd $GeometryEditFrame::mEditCommand $_obj 
$GeometryEditFrame::mEditParam1 $ocenter
+       # The value of _obj is expected to be the same as mSelectedObjPath
+       if {$mObjMatrixMode == $MATRIX_ABOVE_MODE && $mSelectedObjPath != 
$mSelectedObj} {
+           set diff [vsub2 $new_ocenter $ocenter]
+           eval editMotionDeltaCallback otranslate $diff
        } else {
-           eval gedCmd ocenter $_obj $ocenter
+           if {$GeometryEditFrame::mEditCommand != ""} {
+               gedCmd $GeometryEditFrame::mEditCommand $_obj 
$GeometryEditFrame::mEditParam1 $new_ocenter
+           } else {
+               eval gedCmd ocenter $_obj $new_ocenter
+           }
+
+           redrawObj $_obj 0
        }
     } msg]
 
-    redrawObj $_obj 0
     initEdit 0
 
     if {$ret} {
@@ -8793,7 +8962,7 @@
        }
     }
 
-    if {$mTreeMode == $TREE_MODE_LIST} {
+    if {$mEnableListView} {
        fillTree {} $name 1
     } else {
        fillTree {} $name 0

Modified: brlcad/trunk/src/tclscripts/archer/ArcherCore.tcl
===================================================================
--- brlcad/trunk/src/tclscripts/archer/ArcherCore.tcl   2012-07-27 02:44:15 UTC 
(rev 51688)
+++ brlcad/trunk/src/tclscripts/archer/ArcherCore.tcl   2012-07-27 12:04:25 UTC 
(rev 51689)
@@ -75,6 +75,9 @@
        common OBJECT_CENTER_MODE 10
        common FIRST_FREE_BINDING_MODE 11
 
+       common MATRIX_ABOVE_MODE 0
+       common MATRIX_BELOW_MODE 1
+
        common OBJ_EDIT_VIEW_MODE 0
        common OBJ_ATTR_VIEW_MODE 1
        common OBJ_TOOL_VIEW_MODE 2
@@ -512,6 +515,7 @@
        variable mDefaultBindingMode 0
        variable mPrevObjViewMode 0
        variable mObjViewMode 0
+       variable mObjMatrixMode $MATRIX_BELOW_MODE
 
        # This is mostly a list of wrapped Ged commands. However, it also 
contains
        # a few commands that are implemented here in ArcherCore.
@@ -752,6 +756,9 @@
        variable mImage_rt ""
        variable mImage_rtAbort ""
 
+       variable mImage_matrixModeAbove ""
+       variable mImage_matrixModeBelow ""
+
        # variables for the new tree
        variable mCNode2PList
        variable mPNode2CList

Modified: brlcad/trunk/src/tclscripts/archer/images/CMakeLists.txt
===================================================================
--- brlcad/trunk/src/tclscripts/archer/images/CMakeLists.txt    2012-07-27 
02:44:15 UTC (rev 51688)
+++ brlcad/trunk/src/tclscripts/archer/images/CMakeLists.txt    2012-07-27 
12:04:25 UTC (rev 51689)
@@ -152,6 +152,8 @@
   invalid_intersect.png
   invalid_subtract.png
   invalid_union.png
+  matrixModeAbove.png
+  matrixModeBelow.png
   measure.png
   metaball.png
   metaball_intersect.png

Added: brlcad/trunk/src/tclscripts/archer/images/matrixModeAbove.png
===================================================================
(Binary files differ)


Property changes on: 
brlcad/trunk/src/tclscripts/archer/images/matrixModeAbove.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Added: brlcad/trunk/src/tclscripts/archer/images/matrixModeBelow.png
===================================================================
(Binary files differ)


Property changes on: 
brlcad/trunk/src/tclscripts/archer/images/matrixModeBelow.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Modified: brlcad/trunk/src/tclscripts/lib/Ged.tcl
===================================================================
--- brlcad/trunk/src/tclscripts/lib/Ged.tcl     2012-07-27 02:44:15 UTC (rev 
51688)
+++ brlcad/trunk/src/tclscripts/lib/Ged.tcl     2012-07-27 12:04:25 UTC (rev 
51689)
@@ -248,6 +248,8 @@
        method mirror {args}
        method model2view {args}
        method model_axes {args}
+       method edit_motion_delta_callback {args}
+       method edit_motion_delta_callback_all {args}
        method more_args_callback {args}
        method mouse_append_pipept {args}
        method mouse_constrain_rot {args}
@@ -319,6 +321,7 @@
        method pane_lookat {_pane args}
        method pane_m2v_point {_pane args}
        method pane_model2view {_pane args}
+       method pane_edit_motion_delta_callback {_pane args}
        method pane_move_arb_edge_mode {_pane args}
        method pane_move_arb_face_mode {_pane args}
        method pane_move_pipept_mode {_pane args}
@@ -1716,6 +1719,16 @@
     return $ret
 }
 
+::itcl::body cadwidgets::Ged::edit_motion_delta_callback {args} {
+    eval $mGed edit_motion_delta_callback $args
+}
+
+::itcl::body cadwidgets::Ged::edit_motion_delta_callback_all {args} {
+    foreach dm {ur ul ll lr} {
+       eval $mGed edit_motion_delta_callback $itk_component($dm) $args
+    }
+}
+
 ::itcl::body cadwidgets::Ged::more_args_callback {args} {
     eval $mGed more_args_callback $args
 }
@@ -2005,6 +2018,10 @@
     eval $mGed model2view $itk_component($_pane) $args
 }
 
+::itcl::body cadwidgets::Ged::pane_edit_motion_delta_callback {_pane args} {
+    eval $mGed edit_motion_delta_callback $itk_component($_pane) $args
+}
+
 ::itcl::body cadwidgets::Ged::pane_move_arb_edge_mode {_pane args} {
     eval $mGed move_arb_edge_mode $itk_component($_pane) $args
 }

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to