Revision: 39949
          http://brlcad.svn.sourceforge.net/brlcad/?rev=39949&view=rev
Author:   bob1961
Date:     2010-07-28 19:21:38 +0000 (Wed, 28 Jul 2010)

Log Message:
-----------
Added a mechanism for drawing a rectangular area on the screen via mouse.

Modified Paths:
--------------
    brlcad/trunk/src/libtclcad/ged_obj.c

Modified: brlcad/trunk/src/libtclcad/ged_obj.c
===================================================================
--- brlcad/trunk/src/libtclcad/ged_obj.c        2010-07-28 19:19:50 UTC (rev 
39948)
+++ brlcad/trunk/src/libtclcad/ged_obj.c        2010-07-28 19:21:38 UTC (rev 
39949)
@@ -315,6 +315,12 @@
                        ged_func_ptr func,
                        const char *usage,
                        int maxargs);
+HIDDEN int go_mouse_rect(struct ged *gedp,
+                        int argc,
+                        const char *argv[],
+                        ged_func_ptr func,
+                        const char *usage,
+                        int maxargs);
 HIDDEN int go_mouse_rot(struct ged *gedp,
                        int argc,
                        const char *argv[],
@@ -414,6 +420,12 @@
                         ged_func_ptr func,
                         const char *usage,
                         int maxargs);
+HIDDEN int go_rect_mode(struct ged *gedp,
+                       int argc,
+                       const char *argv[],
+                       ged_func_ptr func,
+                       const char *usage,
+                       int maxargs);
 HIDDEN int go_refresh(struct ged *gedp,
                      int argc,
                      const char *argv[],
@@ -782,6 +794,7 @@
     {"mouse_oscale",   "obj x y", MAXARGS, go_mouse_oscale, GED_FUNC_PTR_NULL},
     {"mouse_otranslate",       "obj x y", MAXARGS, go_mouse_otranslate, 
GED_FUNC_PTR_NULL},
     {"mouse_ray",      "x y", MAXARGS, go_mouse_ray, GED_FUNC_PTR_NULL},
+    {"mouse_rect",     "x y", MAXARGS, go_mouse_rect, GED_FUNC_PTR_NULL},
     {"mouse_rot",      "x y", MAXARGS, go_mouse_rot, GED_FUNC_PTR_NULL},
     {"mouse_rotate_arb_face",  "obj face v x y", MAXARGS, 
go_mouse_rotate_arb_face, GED_FUNC_PTR_NULL},
     {"mouse_scale",    "x y", MAXARGS, go_mouse_scale, GED_FUNC_PTR_NULL},
@@ -838,6 +851,7 @@
     {"r",      (char *)0, MAXARGS, go_pass_through_func, ged_region},
     {"rcodes", (char *)0, MAXARGS, go_pass_through_func, ged_rcodes},
     {"rect",   "args", 6, go_view_func, ged_rect},
+    {"rect_mode",      "x y", MAXARGS, go_rect_mode, GED_FUNC_PTR_NULL},
     {"red",    (char *)0, MAXARGS, go_pass_through_func, ged_red},
     {"refresh",        "vname", MAXARGS, go_refresh, GED_FUNC_PTR_NULL},
     {"refresh_all",    (char *)0, MAXARGS, go_refresh_all, GED_FUNC_PTR_NULL},
@@ -857,6 +871,7 @@
     {"rotate_arb_face_mode",   "obj face v x y", MAXARGS, 
go_rotate_arb_face_mode, GED_FUNC_PTR_NULL},
     {"rotate_mode",    "x y", MAXARGS, go_rotate_mode, GED_FUNC_PTR_NULL},
     {"rrt",    "[args]", GO_MAX_RT_ARGS, go_view_func, ged_rrt},
+    {"rselect",                (char *)0, MAXARGS, go_view_func, ged_rselect},
     {"rt",     "[args]", GO_MAX_RT_ARGS, go_view_func, ged_rt},
     {"rt_end_callback",        "[args]", GO_MAX_RT_ARGS, go_rt_end_callback, 
GED_FUNC_PTR_NULL},
     {"rt_gettrees",    "[-i] [-u] pname object", MAXARGS, go_rt_gettrees, 
GED_FUNC_PTR_NULL},
@@ -876,6 +891,7 @@
     {"sdata_labels",   "???", MAXARGS, go_data_labels, GED_FUNC_PTR_NULL},
     {"sdata_lines",    "???", MAXARGS, go_data_lines, GED_FUNC_PTR_NULL},
     {"search",         (char *)0, MAXARGS, go_pass_through_func, ged_search},
+    {"select",         (char *)0, MAXARGS, go_view_func, ged_select},
     {"set_coord",      "[m|v]", MAXARGS, go_set_coord, GED_FUNC_PTR_NULL},
     {"set_fb_mode",    "[mode]", MAXARGS, go_set_fb_mode, GED_FUNC_PTR_NULL},
     {"set_output_script",      "[script]", MAXARGS, go_pass_through_func, 
ged_set_output_script},
@@ -5059,6 +5075,79 @@
 }
 
 HIDDEN int
+go_mouse_rect(struct ged *gedp,
+             int argc,
+             const char *argv[],
+             ged_func_ptr func,
+             const char *usage,
+             int maxargs)
+{
+    int ret;
+    int ac;
+    char *av[5];
+    int x, y;
+    int dx, dy;
+    int half_wMh;
+    struct bu_vls dx_vls, dy_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 GED_HELP;
+    }
+
+    if (argc != 4) {
+       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[2], "%d", &x) != 1 ||
+       sscanf(argv[3], "%d", &y) != 1) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    half_wMh = (gdvp->gdv_dmp->dm_width - gdvp->gdv_dmp->dm_height) * 0.5;
+    dx = x - gdvp->gdv_view->gv_prevMouseX;
+    dy = gdvp->gdv_dmp->dm_height - y + half_wMh - 
gdvp->gdv_view->gv_prevMouseY;
+
+    bu_vls_init(&dx_vls);
+    bu_vls_init(&dy_vls);
+    bu_vls_printf(&dx_vls, "%d", dx);
+    bu_vls_printf(&dy_vls, "%d", dy);
+    gedp->ged_gvp = gdvp->gdv_view;
+    ac = 4;
+    av[0] = "rect";
+    av[1] = "dim";
+    av[2] = bu_vls_addr(&dx_vls);
+    av[3] = bu_vls_addr(&dy_vls);
+    av[4] = (char *)0;
+
+    ret = ged_rect(gedp, ac, (const char **)av);
+    bu_vls_free(&dx_vls);
+    bu_vls_free(&dy_vls);
+
+    if (ret == GED_OK)
+       go_refresh_view(gdvp);
+
+    return BRLCAD_OK;
+}
+
+HIDDEN int
 go_mouse_rot(struct ged *gedp,
             int argc,
             const char *argv[],
@@ -6412,6 +6501,98 @@
 }
 
 HIDDEN int
+go_rect_mode(struct ged *gedp,
+            int argc,
+            const char *argv[],
+            ged_func_ptr func,
+            const char *usage,
+            int maxargs)
+{
+    int ac;
+    char *av[5];
+    int x, y;
+    int half_wMh;
+    struct bu_vls bindings;
+    struct bu_vls x_vls, y_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 GED_HELP;
+    }
+
+    if (argc != 4) {
+       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;
+    }
+
+    gedp->ged_gvp = gdvp->gdv_view;
+
+    if (sscanf(argv[2], "%d", &x) != 1 ||
+       sscanf(argv[3], "%d", &y) != 1) {
+       bu_vls_printf(&gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return BRLCAD_ERROR;
+    }
+
+    half_wMh = (gdvp->gdv_dmp->dm_width - gdvp->gdv_dmp->dm_height) * 0.5;
+    gdvp->gdv_view->gv_prevMouseX = x;
+    gdvp->gdv_view->gv_prevMouseY = gdvp->gdv_dmp->dm_height - y + half_wMh;
+    gdvp->gdv_view->gv_mode = GED_RECTANGLE_MODE;
+
+    ac = 4;
+    av[0] = "rect";
+    av[1] = "dim";
+    av[2] = "0";
+    av[3] = "0";
+    av[4] = (char *)0;
+    (void)ged_rect(gedp, ac, (const char **)av);
+
+    bu_vls_init(&x_vls);
+    bu_vls_init(&y_vls);
+    bu_vls_printf(&x_vls, "%d", (int)gdvp->gdv_view->gv_prevMouseX);
+    bu_vls_printf(&y_vls, "%d", (int)gdvp->gdv_view->gv_prevMouseY);
+    av[1] = "pos";
+    av[2] = bu_vls_addr(&x_vls);
+    av[3] = bu_vls_addr(&y_vls);
+    (void)ged_rect(gedp, ac, (const char **)av);
+    bu_vls_free(&x_vls);
+    bu_vls_free(&y_vls);
+
+    ac = 3;
+    av[0] = "rect";
+    av[1] = "draw";
+    av[2] = "1";
+    av[3] = (char *)0;
+    (void)ged_rect(gedp, ac, (const char **)av);
+
+    bu_vls_init(&bindings);
+    bu_vls_printf(&bindings, "bind %V <Motion> {%V mouse_rect %V %%x %%y}",
+                 &gdvp->gdv_dmp->dm_pathName,
+                 &go_current_gop->go_name,
+                 &gdvp->gdv_name);
+    Tcl_Eval(go_current_gop->go_interp, bu_vls_addr(&bindings));
+    bu_vls_free(&bindings);
+
+    go_refresh_view(gdvp);
+
+    return BRLCAD_OK;
+}
+
+HIDDEN int
 go_refresh(struct ged *gedp,
           int argc,
           const char *argv[],


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

------------------------------------------------------------------------------
The Palm PDK Hot Apps Program offers developers who use the
Plug-In Development Kit to bring their C/C++ apps to Palm for a share
of $1 Million in cash or HP Products. Visit us here for more details:
http://p.sf.net/sfu/dev2dev-palm
_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to