Revision: 33270
          http://brlcad.svn.sourceforge.net/brlcad/?rev=33270&view=rev
Author:   bob1961
Date:     2008-12-03 21:00:43 +0000 (Wed, 03 Dec 2008)

Log Message:
-----------
Activate Archer's wizard menu and primitive edit toolbar. Added commands for 
editing primitives via the mouse to libtclcad's Ged object.

Modified Paths:
--------------
    brlcad/trunk/include/ged.h
    brlcad/trunk/src/libtclcad/ged_obj.c
    brlcad/trunk/src/tclscripts/archer/Archer.tcl
    brlcad/trunk/src/tclscripts/lib/Ged.tcl

Modified: brlcad/trunk/include/ged.h
===================================================================
--- brlcad/trunk/include/ged.h  2008-12-02 16:38:21 UTC (rev 33269)
+++ brlcad/trunk/include/ged.h  2008-12-03 21:00:43 UTC (rev 33270)
@@ -74,6 +74,9 @@
 #define GED_SCALE_MODE 3
 #define GED_CONSTRAINED_ROTATE_MODE 4
 #define GED_CONSTRAINED_TRANSLATE_MODE 5
+#define GED_OROTATE_MODE 6
+#define GED_OSCALE_MODE 7
+#define GED_OTRANSLATE_MODE 8
 
 /**
  * S E M A P H O R E S

Modified: brlcad/trunk/src/libtclcad/ged_obj.c
===================================================================
--- brlcad/trunk/src/libtclcad/ged_obj.c        2008-12-02 16:38:21 UTC (rev 
33269)
+++ brlcad/trunk/src/libtclcad/ged_obj.c        2008-12-03 21:00:43 UTC (rev 
33270)
@@ -218,6 +218,30 @@
                                    ged_func_ptr        func,
                                    const char          *usage,
                                    int                 maxargs);
+static int go_mouse_orotate(struct ged *gedp,
+                           int         argc,
+                           const char  *argv[],
+                           ged_func_ptr func,
+                           const char  *usage,
+                           int         maxargs);
+static int go_mouse_oscale(struct ged  *gedp,
+                          int          argc,
+                          const char   *argv[],
+                          ged_func_ptr func,
+                          const char   *usage,
+                          int          maxargs);
+static int go_mouse_otranslate(struct ged      *gedp,
+                              int              argc,
+                              const char       *argv[],
+                              ged_func_ptr     func,
+                              const char       *usage,
+                              int              maxargs);
+static int go_mouse_translate(struct ged       *gedp,
+                             int               argc,
+                             const char        *argv[],
+                             ged_func_ptr      func,
+                             const char        *usage,
+                             int               maxargs);
 static int go_mouse_ray(struct ged     *gedp,
                        int             argc,
                        const char      *argv[],
@@ -248,6 +272,24 @@
                       ged_func_ptr     func,
                       const char       *usage,
                       int              maxargs);
+static int go_orotate_mode(struct ged  *gedp,
+                          int          argc,
+                          const char   *argv[],
+                          ged_func_ptr func,
+                          const char   *usage,
+                          int          maxargs);
+static int go_oscale_mode(struct ged   *gedp,
+                         int           argc,
+                         const char    *argv[],
+                         ged_func_ptr  func,
+                         const char    *usage,
+                         int           maxargs);
+static int go_otranslate_mode(struct ged       *gedp,
+                             int               argc,
+                             const char        *argv[],
+                             ged_func_ptr      func,
+                             const char        *usage,
+                             int               maxargs);
 static int go_paint_rect_area(struct ged       *gedp,
                              int               argc,
                              const char        *argv[],
@@ -552,6 +594,9 @@
     {"move_arb_face",  (char *)0, MAXARGS, go_pass_through_func, 
ged_move_arb_face},
     {"mouse_constrain_rot",    "vname coord x y", MAXARGS, 
go_mouse_constrain_rot, GED_FUNC_PTR_NULL},
     {"mouse_constrain_trans",  "vname coord x y", MAXARGS, 
go_mouse_constrain_trans, GED_FUNC_PTR_NULL},
+    {"mouse_orotate",  "vname obj x y", MAXARGS, go_mouse_orotate, 
GED_FUNC_PTR_NULL},
+    {"mouse_oscale",   "vname obj x y", MAXARGS, go_mouse_oscale, 
GED_FUNC_PTR_NULL},
+    {"mouse_otranslate",       "vname obj x y", MAXARGS, go_mouse_otranslate, 
GED_FUNC_PTR_NULL},
     {"mouse_ray",      "vname x y", MAXARGS, go_mouse_ray, GED_FUNC_PTR_NULL},
     {"mouse_rot",      "vname x y", MAXARGS, go_mouse_rot, GED_FUNC_PTR_NULL},
     {"mouse_scale",    "vname x y", MAXARGS, go_mouse_scale, 
GED_FUNC_PTR_NULL},
@@ -566,8 +611,11 @@
     {"open",   (char *)0, MAXARGS, go_pass_through_and_refresh_func, 
ged_reopen},
     {"orient", "vname quat", 6, go_view_func, ged_orient},
     {"orotate",        (char *)0, MAXARGS, go_pass_through_func, ged_orotate},
+    {"orotate_mode",   "vname obj x y", MAXARGS, go_orotate_mode, 
GED_FUNC_PTR_NULL},
     {"oscale", (char *)0, MAXARGS, go_pass_through_func, ged_oscale},
+    {"oscale_mode",    "vname obj x y", MAXARGS, go_oscale_mode, 
GED_FUNC_PTR_NULL},
     {"otranslate",     (char *)0, MAXARGS, go_pass_through_func, 
ged_otranslate},
+    {"otranslate_mode",        "vname obj x y", MAXARGS, go_otranslate_mode, 
GED_FUNC_PTR_NULL},
     {"overlay",        (char *)0, MAXARGS, go_autoview_func, ged_overlay},
     {"paint_rect_area",        "vname", MAXARGS, go_paint_rect_area, 
GED_FUNC_PTR_NULL},
     {"pathlist",       (char *)0, MAXARGS, go_pass_through_func, ged_pathlist},
@@ -2760,7 +2808,7 @@
     else if (gdvp->gdv_view->gv_maxMouseDelta < dy)
        dy = gdvp->gdv_view->gv_maxMouseDelta;
 
-    inv_width = 1.0 / gdvp->gdv_dmp->dm_width;
+    inv_width = 1.0 / (fastf_t)gdvp->gdv_dmp->dm_width;
     dx *= inv_width * gdvp->gdv_view->gv_size * 
gedp->ged_wdbp->dbip->dbi_local2base;
     dy *= inv_width * gdvp->gdv_view->gv_size * 
gedp->ged_wdbp->dbip->dbi_local2base;
 
@@ -2795,6 +2843,307 @@
 }
 
 static int
+go_mouse_orotate(struct ged    *gedp,
+                int            argc,
+                const char     *argv[],
+                ged_func_ptr   func,
+                const char     *usage,
+                int            maxargs)
+{
+    int ret;
+    char *av[6];
+    fastf_t x, y;
+    fastf_t dx, dy;
+    point_t model;
+    point_t view;
+    mat_t inv_rot;
+    struct bu_vls rot_x_vls;
+    struct bu_vls rot_y_vls;
+    struct bu_vls rot_z_vls;
+    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 BRLCAD_HELP;
+    }
+
+    if (argc != 5) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    for (BU_LIST_FOR(gdvp, ged_dm_view, &go_current_gop->go_head_views.l)) {
+       if (!strcmp(bu_vls_addr(&gdvp->gdv_name), argv[1]))
+           break;
+    }
+
+    if (BU_LIST_IS_HEAD(&gdvp->l, &go_current_gop->go_head_views.l)) {
+       bu_vls_printf(&gedp->ged_result_str, "View not found - %s", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    if (sscanf(argv[3], "%lf", &x) != 1 ||
+       sscanf(argv[4], "%lf", &y) != 1) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    dx = y - gdvp->gdv_view->gv_prevMouseY;
+    dy = x - gdvp->gdv_view->gv_prevMouseX;
+
+    gdvp->gdv_view->gv_prevMouseX = x;
+    gdvp->gdv_view->gv_prevMouseY = y;
+
+    if (dx < gdvp->gdv_view->gv_minMouseDelta)
+       dx = gdvp->gdv_view->gv_minMouseDelta;
+    else if (gdvp->gdv_view->gv_maxMouseDelta < dx)
+       dx = gdvp->gdv_view->gv_maxMouseDelta;
+
+    if (dy < gdvp->gdv_view->gv_minMouseDelta)
+       dy = gdvp->gdv_view->gv_minMouseDelta;
+    else if (gdvp->gdv_view->gv_maxMouseDelta < dy)
+       dy = gdvp->gdv_view->gv_maxMouseDelta;
+
+    dx *= gdvp->gdv_view->gv_rscale;
+    dy *= gdvp->gdv_view->gv_rscale;
+
+    VSET(view, dx, dy, 0.0);
+    bn_mat_inv(inv_rot, gdvp->gdv_view->gv_rotation);
+    MAT4X3PNT(model, inv_rot, view);
+
+    bu_vls_init(&rot_x_vls);
+    bu_vls_init(&rot_y_vls);
+    bu_vls_init(&rot_z_vls);
+    bu_vls_printf(&rot_x_vls, "%lf", model[X]);
+    bu_vls_printf(&rot_y_vls, "%lf", model[Y]);
+    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);
+    bu_vls_free(&rot_x_vls);
+    bu_vls_free(&rot_y_vls);
+    bu_vls_free(&rot_z_vls);
+
+    if (ret == BRLCAD_OK) {
+       av[0] = "draw";
+       av[1] = (char *)argv[2];
+       av[2] = (char *)0;
+       go_autoview_func(gedp, 2, (const char **)av, ged_draw, (char *)0, 
MAXARGS);
+    }
+
+    return BRLCAD_OK;
+}
+
+static int
+go_mouse_oscale(struct ged     *gedp,
+               int             argc,
+               const char      *argv[],
+               ged_func_ptr    func,
+               const char      *usage,
+               int             maxargs)
+{
+    int ret;
+    char *av[6];
+    fastf_t x, y;
+    fastf_t dx, dy;
+    fastf_t sf;
+    fastf_t inv_width;
+    struct bu_vls sf_vls;
+    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 BRLCAD_HELP;
+    }
+
+    if (argc != 5) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    for (BU_LIST_FOR(gdvp, ged_dm_view, &go_current_gop->go_head_views.l)) {
+       if (!strcmp(bu_vls_addr(&gdvp->gdv_name), argv[1]))
+           break;
+    }
+
+    if (BU_LIST_IS_HEAD(&gdvp->l, &go_current_gop->go_head_views.l)) {
+       bu_vls_printf(&gedp->ged_result_str, "View not found - %s", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    if (sscanf(argv[3], "%lf", &x) != 1 ||
+       sscanf(argv[4], "%lf", &y) != 1) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    dx = x - gdvp->gdv_view->gv_prevMouseX;
+    dy = gdvp->gdv_view->gv_prevMouseY - y;
+
+    gdvp->gdv_view->gv_prevMouseX = x;
+    gdvp->gdv_view->gv_prevMouseY = y;
+
+    if (dx < gdvp->gdv_view->gv_minMouseDelta)
+       dx = gdvp->gdv_view->gv_minMouseDelta;
+    else if (gdvp->gdv_view->gv_maxMouseDelta < dx)
+       dx = gdvp->gdv_view->gv_maxMouseDelta;
+
+    if (dy < gdvp->gdv_view->gv_minMouseDelta)
+       dy = gdvp->gdv_view->gv_minMouseDelta;
+    else if (gdvp->gdv_view->gv_maxMouseDelta < dy)
+       dy = gdvp->gdv_view->gv_maxMouseDelta;
+
+    inv_width = 1.0 / (fastf_t)gdvp->gdv_dmp->dm_width;
+    dx *= inv_width * gdvp->gdv_view->gv_sscale;
+    dy *= inv_width * gdvp->gdv_view->gv_sscale;
+
+    if (fabs(dx) < fabs(dy))
+      sf = 1.0 + dy;
+    else
+      sf = 1.0 + dx;
+
+    bu_vls_init(&sf_vls);
+    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 (ret == BRLCAD_OK) {
+       av[0] = "draw";
+       av[1] = (char *)argv[2];
+       av[2] = (char *)0;
+       go_autoview_func(gedp, 2, (const char **)av, ged_draw, (char *)0, 
MAXARGS);
+    }
+
+    return BRLCAD_OK;
+}
+
+static int
+go_mouse_otranslate(struct ged         *gedp,
+                   int                 argc,
+                   const char          *argv[],
+                   ged_func_ptr        func,
+                   const char          *usage,
+                   int                 maxargs)
+{
+    int ret;
+    char *av[6];
+    fastf_t x, y;
+    fastf_t dx, dy;
+    fastf_t inv_width;
+    point_t model;
+    point_t view;
+    mat_t inv_rot;
+    struct bu_vls tran_x_vls;
+    struct bu_vls tran_y_vls;
+    struct bu_vls tran_z_vls;
+    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 BRLCAD_HELP;
+    }
+
+    if (argc != 5) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    for (BU_LIST_FOR(gdvp, ged_dm_view, &go_current_gop->go_head_views.l)) {
+       if (!strcmp(bu_vls_addr(&gdvp->gdv_name), argv[1]))
+           break;
+    }
+
+    if (BU_LIST_IS_HEAD(&gdvp->l, &go_current_gop->go_head_views.l)) {
+       bu_vls_printf(&gedp->ged_result_str, "View not found - %s", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    if (sscanf(argv[3], "%lf", &x) != 1 ||
+       sscanf(argv[4], "%lf", &y) != 1) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    dx = x - gdvp->gdv_view->gv_prevMouseX;
+    dy = gdvp->gdv_view->gv_prevMouseY - y;
+
+    gdvp->gdv_view->gv_prevMouseX = x;
+    gdvp->gdv_view->gv_prevMouseY = y;
+
+    if (dx < gdvp->gdv_view->gv_minMouseDelta)
+       dx = gdvp->gdv_view->gv_minMouseDelta;
+    else if (gdvp->gdv_view->gv_maxMouseDelta < dx)
+       dx = gdvp->gdv_view->gv_maxMouseDelta;
+
+    if (dy < gdvp->gdv_view->gv_minMouseDelta)
+       dy = gdvp->gdv_view->gv_minMouseDelta;
+    else if (gdvp->gdv_view->gv_maxMouseDelta < dy)
+       dy = gdvp->gdv_view->gv_maxMouseDelta;
+
+    inv_width = 1.0 / (fastf_t)gdvp->gdv_dmp->dm_width;
+    dx *= inv_width * gdvp->gdv_view->gv_size;
+    dy *= inv_width * gdvp->gdv_view->gv_size;
+    VSET(view, dx, dy, 0.0);
+    bn_mat_inv(inv_rot, gdvp->gdv_view->gv_rotation);
+    MAT4X3PNT(model, inv_rot, view);
+
+    bu_vls_init(&tran_x_vls);
+    bu_vls_init(&tran_y_vls);
+    bu_vls_init(&tran_z_vls);
+    bu_vls_printf(&tran_x_vls, "%lf", model[X]);
+    bu_vls_printf(&tran_y_vls, "%lf", model[Y]);
+    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);
+    bu_vls_free(&tran_x_vls);
+    bu_vls_free(&tran_y_vls);
+    bu_vls_free(&tran_z_vls);
+
+    if (ret == BRLCAD_OK) {
+       av[0] = "draw";
+       av[1] = (char *)argv[2];
+       av[2] = (char *)0;
+       go_autoview_func(gedp, 2, (const char **)av, ged_draw, (char *)0, 
MAXARGS);
+    }
+
+    return BRLCAD_OK;
+}
+
+static int
 go_mouse_ray(struct ged                *gedp,
             int                argc,
             const char         *argv[],
@@ -2846,7 +3195,7 @@
        return BRLCAD_ERROR;
     }
 
-    inv_width = 1.0 / gdvp->gdv_dmp->dm_width;
+    inv_width = 1.0 / (fastf_t)gdvp->gdv_dmp->dm_width;
     x *= inv_width * 2.0 - 1.0;
     y *= inv_width * -2.0 + 1.0;
     VSET(view, x, y, -1.0);
@@ -3024,7 +3373,7 @@
     else if (gdvp->gdv_view->gv_maxMouseDelta < dy)
        dy = gdvp->gdv_view->gv_maxMouseDelta;
 
-    inv_width = 1.0 / gdvp->gdv_dmp->dm_width;
+    inv_width = 1.0 / (fastf_t)gdvp->gdv_dmp->dm_width;
     dx *= inv_width * gdvp->gdv_view->gv_sscale;
     dy *= inv_width * gdvp->gdv_view->gv_sscale;
 
@@ -3114,7 +3463,7 @@
     else if (gdvp->gdv_view->gv_maxMouseDelta < dy)
        dy = gdvp->gdv_view->gv_maxMouseDelta;
 
-    inv_width = 1.0 / gdvp->gdv_dmp->dm_width;
+    inv_width = 1.0 / (fastf_t)gdvp->gdv_dmp->dm_width;
     dx *= inv_width * gdvp->gdv_view->gv_size * 
gedp->ged_wdbp->dbip->dbi_local2base;
     dy *= inv_width * gdvp->gdv_view->gv_size * 
gedp->ged_wdbp->dbip->dbi_local2base;
 
@@ -3337,6 +3686,180 @@
 }
 
 static int
+go_orotate_mode(struct ged     *gedp,
+               int             argc,
+               const char      *argv[],
+               ged_func_ptr    func,
+               const char      *usage,
+               int             maxargs)
+{
+    fastf_t x, y;
+    struct bu_vls bindings;
+    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 BRLCAD_HELP;
+    }
+
+    if (argc != 5) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    for (BU_LIST_FOR(gdvp, ged_dm_view, &go_current_gop->go_head_views.l)) {
+       if (!strcmp(bu_vls_addr(&gdvp->gdv_name), argv[1]))
+           break;
+    }
+
+    if (BU_LIST_IS_HEAD(&gdvp->l, &go_current_gop->go_head_views.l)) {
+       bu_vls_printf(&gedp->ged_result_str, "View not found - %s", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    if (sscanf(argv[3], "%lf", &x) != 1 ||
+       sscanf(argv[4], "%lf", &y) != 1) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    gdvp->gdv_view->gv_prevMouseX = x;
+    gdvp->gdv_view->gv_prevMouseY = y;
+    gdvp->gdv_view->gv_mode = GED_OROTATE_MODE;
+
+    bu_vls_init(&bindings);
+    bu_vls_printf(&bindings, "bind %V <Motion> {%V mouse_orotate %V %s %%x 
%%y}",
+                 &gdvp->gdv_dmp->dm_pathName,
+                 &go_current_gop->go_name,
+                 &gdvp->gdv_name,
+                 argv[2]);
+    Tcl_Eval(go_current_gop->go_interp, bu_vls_addr(&bindings));
+    bu_vls_free(&bindings);
+
+    return BRLCAD_OK;
+}
+
+static int
+go_oscale_mode(struct ged      *gedp,
+              int              argc,
+              const char       *argv[],
+              ged_func_ptr     func,
+              const char       *usage,
+              int              maxargs)
+{
+    fastf_t x, y;
+    struct bu_vls bindings;
+    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 BRLCAD_HELP;
+    }
+
+    if (argc != 5) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    for (BU_LIST_FOR(gdvp, ged_dm_view, &go_current_gop->go_head_views.l)) {
+       if (!strcmp(bu_vls_addr(&gdvp->gdv_name), argv[1]))
+           break;
+    }
+
+    if (BU_LIST_IS_HEAD(&gdvp->l, &go_current_gop->go_head_views.l)) {
+       bu_vls_printf(&gedp->ged_result_str, "View not found - %s", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    if (sscanf(argv[3], "%lf", &x) != 1 ||
+       sscanf(argv[4], "%lf", &y) != 1) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    gdvp->gdv_view->gv_prevMouseX = x;
+    gdvp->gdv_view->gv_prevMouseY = y;
+    gdvp->gdv_view->gv_mode = GED_OSCALE_MODE;
+
+    bu_vls_init(&bindings);
+    bu_vls_printf(&bindings, "bind %V <Motion> {%V mouse_oscale %V %s %%x 
%%y}",
+                 &gdvp->gdv_dmp->dm_pathName,
+                 &go_current_gop->go_name,
+                 &gdvp->gdv_name,
+                 argv[2]);
+    Tcl_Eval(go_current_gop->go_interp, bu_vls_addr(&bindings));
+    bu_vls_free(&bindings);
+
+    return BRLCAD_OK;
+}
+
+static int
+go_otranslate_mode(struct ged  *gedp,
+                  int          argc,
+                  const char   *argv[],
+                  ged_func_ptr func,
+                  const char   *usage,
+                  int          maxargs)
+{
+    fastf_t x, y;
+    struct bu_vls bindings;
+    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 BRLCAD_HELP;
+    }
+
+    if (argc != 5) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    for (BU_LIST_FOR(gdvp, ged_dm_view, &go_current_gop->go_head_views.l)) {
+       if (!strcmp(bu_vls_addr(&gdvp->gdv_name), argv[1]))
+           break;
+    }
+
+    if (BU_LIST_IS_HEAD(&gdvp->l, &go_current_gop->go_head_views.l)) {
+       bu_vls_printf(&gedp->ged_result_str, "View not found - %s", argv[1]);
+       return BRLCAD_ERROR;
+    }
+
+    if (sscanf(argv[3], "%lf", &x) != 1 ||
+       sscanf(argv[4], "%lf", &y) != 1) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    gdvp->gdv_view->gv_prevMouseX = x;
+    gdvp->gdv_view->gv_prevMouseY = y;
+    gdvp->gdv_view->gv_mode = GED_OTRANSLATE_MODE;
+
+    bu_vls_init(&bindings);
+    bu_vls_printf(&bindings, "bind %V <Motion> {%V mouse_otranslate %V %s %%x 
%%y}",
+                 &gdvp->gdv_dmp->dm_pathName,
+                 &go_current_gop->go_name,
+                 &gdvp->gdv_name,
+                 argv[2]);
+    Tcl_Eval(go_current_gop->go_interp, bu_vls_addr(&bindings));
+    bu_vls_free(&bindings);
+
+    return BRLCAD_OK;
+}
+
+static int
 go_paint_rect_area(struct ged  *gedp,
                   int          argc,
                   const char   *argv[],

Modified: brlcad/trunk/src/tclscripts/archer/Archer.tcl
===================================================================
--- brlcad/trunk/src/tclscripts/archer/Archer.tcl       2008-12-02 16:38:21 UTC 
(rev 33269)
+++ brlcad/trunk/src/tclscripts/archer/Archer.tcl       2008-12-03 21:00:43 UTC 
(rev 33270)
@@ -3797,8 +3797,8 @@
        updateUtilityMenu
     }
 
-#    updateWizardMenu
-#    updateViewToolbarForEdit
+    updateWizardMenu
+    updateViewToolbarForEdit
 
     if {$mTarget != "" &&
        $mBindingMode == 0} {
@@ -3914,8 +3914,8 @@
        updateUtilityMenu
     }
 
-#    updateWizardMenu
-#    updateViewToolbarForEdit
+    updateWizardMenu
+    updateViewToolbarForEdit
 
     if {$mTarget != "" &&
        $mBindingMode == 0} {
@@ -4658,16 +4658,10 @@
        return
     }
 
-    # These values are insignificant (i.e. they will be ignored by the 
callback)
-    set x 0
-    set y 0
-    set z 0
-
     foreach dname {ul ur ll lr} {
-       set dm [$itk_component(mged) component $dname]
-       set win [$dm component dm]
-       bind $win <1> "$dm orotate_mode %x %y [list [::itcl::code $this 
handleObjRotate]] $obj $x $y $z; break"
-       bind $win <ButtonRelease-1> "[::itcl::code $this endObjRotate $dm 
$obj]; break"
+       set win [$itk_component(mged) component $dname]
+       bind $win <1> "$itk_component(mged) pane_orotate_mode $dname $obj %x 
%y; break"
+       bind $win <ButtonRelease-1> "[::itcl::code $this endObjRotate $dname 
$obj]; break"
     }
 }
 
@@ -4684,16 +4678,10 @@
        return
     }
 
-    # These values are insignificant (i.e. they will be ignored by the 
callback)
-    set x 0
-    set y 0
-    set z 0
-
     foreach dname {ul ur ll lr} {
-       set dm [$itk_component(mged) component $dname]
-       set win [$dm component dm]
-       bind $win <1> "$dm oscale_mode %x %y [list [::itcl::code $this 
handleObjScale]] $obj $x $y $z; break"
-       bind $win <ButtonRelease-1> "[::itcl::code $this endObjScale $dm $obj]; 
break"
+       set win [$itk_component(mged) component $dname]
+       bind $win <1> "$itk_component(mged) pane_oscale_mode $dname $obj %x %y; 
break"
+       bind $win <ButtonRelease-1> "[::itcl::code $this endObjScale $dname 
$obj]; break"
     }
 }
 
@@ -4711,10 +4699,9 @@
     }
 
     foreach dname {ul ur ll lr} {
-       set dm [$itk_component(mged) component $dname]
-       set win [$dm component dm]
-       bind $win <1> "$dm otranslate_mode %x %y [list [::itcl::code $this 
handleObjTranslate]] $obj; break"
-       bind $win <ButtonRelease-1> "[::itcl::code $this endObjTranslate $dm 
$obj]; break"
+       set win [$itk_component(mged) component $dname]
+       bind $win <1> "$itk_component(mged) pane_otranslate_mode $dname $obj %x 
%y; break"
+       bind $win <ButtonRelease-1> "[::itcl::code $this endObjTranslate $dname 
$obj]; break"
     }
 }
 
@@ -4732,45 +4719,64 @@
     }
 
     foreach dname {ul ur ll lr} {
-       set dm [$itk_component(mged) component $dname]
-       set win [$dm component dm]
+       set win [$itk_component(mged) component $dname]
        bind $win <1> "[::itcl::code $this handleObjCenter $obj %x %y]; break"
-       bind $win <ButtonRelease-1> "[::itcl::code $this endObjCenter $dm 
$obj]; break"
+       bind $win <ButtonRelease-1> "[::itcl::code $this endObjCenter $dname 
$obj]; break"
     }
 }
 
-::itcl::body Archer::endObjCenter {dsp obj} {
-    $dsp idle_mode
-
+::itcl::body Archer::endObjCenter {dname obj} {
     if {![info exists itk_component(mged)]} {
        return
     }
 
+    $itk_component(mged) pane_idle_mode $dname
+    set mNeedSave 1
+    updateSaveMode
+
     set center [$itk_component(mged) ocenter $obj]
     addHistory "ocenter $center"
 }
 
-::itcl::body Archer::endObjRotate {dsp obj} {
-    $dsp idle_mode
+::itcl::body Archer::endObjRotate {dname obj} {
+    if {![info exists itk_component(mged)]} {
+       return
+    }
 
+    $itk_component(mged) pane_idle_mode $dname
+    set mNeedSave 1
+    updateSaveMode
+
     #XXX Need code to track overall transformation
     if {[info exists itk_component(mged)]} {
        #addHistory "orotate obj rx ry rz"
     }
 }
 
-::itcl::body Archer::endObjScale {dsp obj} {
-    $dsp idle_mode
+::itcl::body Archer::endObjScale {dname obj} {
+    if {![info exists itk_component(mged)]} {
+       return
+    }
 
+    $itk_component(mged) pane_idle_mode $dname
+    set mNeedSave 1
+    updateSaveMode
+
     #XXX Need code to track overall transformation
     if {[info exists itk_component(mged)]} {
        #addHistory "oscale obj sf"
     }
 }
 
-::itcl::body Archer::endObjTranslate {dsp obj} {
-    $dsp idle_mode
+::itcl::body Archer::endObjTranslate {dname obj} {
+    if {![info exists itk_component(mged)]} {
+       return
+    }
 
+    $itk_component(mged) pane_idle_mode $dname
+    set mNeedSave 1
+    updateSaveMode
+
     #XXX Need code to track overall transformation
     if {[info exists itk_component(mged)]} {
        #addHistory "otranslate obj dx dy dz"
@@ -4787,18 +4793,18 @@
     }
 
     set ocenter [vscale $ocenter [dbCmd local2base]]
-    set ovcenter [eval dbCmd m2vPoint $ocenter]
+    set ovcenter [eval dbCmd m2v_point $ocenter]
 
     # This is the updated view center (i.e. we keep the original view Z)
     set vcenter [dbCmd screen2view $x $y]
     set vcenter [list [lindex $vcenter 0] [lindex $vcenter 1] [lindex 
$ovcenter 2]]
 
-    set ocenter [vscale [eval dbCmd v2mPoint $vcenter] [dbCmd base2local]]
+    set ocenter [vscale [eval dbCmd v2m_point $vcenter] [dbCmd base2local]]
 
     if {[info exists itk_component(mged)]} {
-       eval archerWrapper ocenter 0 0 1 0 $obj $ocenter
+       eval archerWrapper ocenter 0 0 0 0 $obj $ocenter
     } else {
-       eval archerWrapper ocenter 0 0 1 0 $obj $ocenter
+       eval archerWrapper ocenter 0 0 0 0 $obj $ocenter
        cd $savePwd
     }
 

Modified: brlcad/trunk/src/tclscripts/lib/Ged.tcl
===================================================================
--- brlcad/trunk/src/tclscripts/lib/Ged.tcl     2008-12-02 16:38:21 UTC (rev 
33269)
+++ brlcad/trunk/src/tclscripts/lib/Ged.tcl     2008-12-03 21:00:43 UTC (rev 
33270)
@@ -219,6 +219,9 @@
        method more_args_callback {args}
        method mouse_constrain_rot {args}
        method mouse_constrain_trans {args}
+       method mouse_orotate {args}
+       method mouse_oscale {args}
+       method mouse_otranslate {args}
        method mouse_rot {args}
        method mouse_scale {args}
        method mouse_trans {args}
@@ -233,8 +236,11 @@
        method open {args}
        method orient {args}
        method orotate {args}
+       method orotate_mode {args}
        method oscale {args}
+       method oscale_mode {args}
        method otranslate {args}
+       method otranslate_mode {args}
        method overlay {args}
        method paint_rect_area {args}
        method pane_adc {_pane args}
@@ -260,11 +266,17 @@
        method pane_model2view {_pane args}
        method pane_mouse_constrain_rot {_pane args}
        method pane_mouse_constrain_trans {_pane args}
+       method pane_mouse_orotate {_pane args}
+       method pane_mouse_oscale {_pane args}
+       method pane_mouse_otranslate {_pane args}
        method pane_mouse_rot {_pane args}
        method pane_mouse_scale {_pane args}
        method pane_mouse_trans {_pane args}
        method pane_nirt {_pane args}
        method pane_orient {_pane args}
+       method pane_orotate_mode {_pane args}
+       method pane_oscale_mode {_pane args}
+       method pane_otranslate_mode {_pane args}
        method pane_paint_rect_area {_pane args}
        method pane_perspective {_pane args}
        method pane_plot {_pane args}
@@ -363,6 +375,7 @@
        method saveview {args}
        method sca {args}
        method scale_mode {args}
+       method screen2view {args}
        method set_coord {args}
        method set_fb_mode {args}
        method set_output_script {args}
@@ -1192,6 +1205,18 @@
     eval $mGed mouse_constrain_trans $itk_component($itk_option(-pane)) $args
 }
 
+::itcl::body cadwidgets::Ged::mouse_orotate {args} {
+    eval $mGed mouse_orotate $itk_component($itk_option(-pane)) $args
+}
+
+::itcl::body cadwidgets::Ged::mouse_oscale {args} {
+    eval $mGed mouse_oscale $itk_component($itk_option(-pane)) $args
+}
+
+::itcl::body cadwidgets::Ged::mouse_otranslate {args} {
+    eval $mGed mouse_otranslate $itk_component($itk_option(-pane)) $args
+}
+
 ::itcl::body cadwidgets::Ged::mouse_rot {args} {
     eval $mGed mouse_rot $itk_component($itk_option(-pane)) $args
 }
@@ -1248,14 +1273,26 @@
     eval $mGed orotate $args
 }
 
+::itcl::body cadwidgets::Ged::orotate_mode {args} {
+    eval $mGed orotate_mode $itk_component($itk_option(-pane)) $args
+}
+
 ::itcl::body cadwidgets::Ged::oscale {args} {
     eval $mGed oscale $args
 }
 
+::itcl::body cadwidgets::Ged::oscale_mode {args} {
+    eval $mGed oscale_mode $itk_component($itk_option(-pane)) $args
+}
+
 ::itcl::body cadwidgets::Ged::otranslate {args} {
     eval $mGed otranslate $args
 }
 
+::itcl::body cadwidgets::Ged::otranslate_mode {args} {
+    eval $mGed otranslate_mode $itk_component($itk_option(-pane)) $args
+}
+
 ::itcl::body cadwidgets::Ged::overlay {args} {
     eval $mGed overlay $args
 }
@@ -1356,12 +1393,24 @@
     eval $mGed mouse_constrain_trans $itk_component($_pane) $args
 }
 
+::itcl::body cadwidgets::Ged::pane_mouse_orotate {_pane args} {
+    eval $mGed mouse_orotate $itk_component($_pane) $args
+}
+
+::itcl::body cadwidgets::Ged::pane_mouse_oscale {_pane args} {
+    eval $mGed mouse_oscale $itk_component($_pane) $args
+}
+
+::itcl::body cadwidgets::Ged::pane_mouse_otranslate {_pane args} {
+    eval $mGed mouse_otranslate $itk_component($_pane) $args
+}
+
 ::itcl::body cadwidgets::Ged::pane_mouse_rot {_pane args} {
-    eval $mGed mouse_rot  $itk_component($_pane) $args
+    eval $mGed mouse_rot $itk_component($_pane) $args
 }
 
 ::itcl::body cadwidgets::Ged::pane_mouse_scale {_pane args} {
-    eval $mGed mouse_scale  $itk_component($_pane) $args
+    eval $mGed mouse_scale $itk_component($_pane) $args
 }
 
 ::itcl::body cadwidgets::Ged::pane_mouse_trans {_pane args} {
@@ -1376,6 +1425,18 @@
     eval $mGed orient $itk_component($_pane) $args
 }
 
+::itcl::body cadwidgets::Ged::pane_orotate_mode {_pane args} {
+    eval $mGed orotate_mode $itk_component($_pane) $args
+}
+
+::itcl::body cadwidgets::Ged::pane_oscale_mode {_pane args} {
+    eval $mGed oscale_mode $itk_component($_pane) $args
+}
+
+::itcl::body cadwidgets::Ged::pane_otranslate_mode {_pane args} {
+    eval $mGed otranslate_mode $itk_component($_pane) $args
+}
+
 ::itcl::body cadwidgets::Ged::pane_paint_rect_area {_pane args} {
     eval $mGed paint_rect_area $itk_component($_pane) $args
 }
@@ -1787,6 +1848,10 @@
     eval $mGed sca $itk_component($itk_option(-pane)) $args
 }
 
+::itcl::body cadwidgets::Ged::screen2view {args} {
+    eval $mGed screen2view $itk_component($itk_option(-pane)) $args
+}
+
 ::itcl::body cadwidgets::Ged::scale_mode {args} {
     eval $mGed scale_mode $itk_component($itk_option(-pane)) $args
 }


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

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to