Revision: 76014
          http://sourceforge.net/p/brlcad/code/76014
Author:   starseeker
Date:     2020-06-03 21:52:09 +0000 (Wed, 03 Jun 2020)
Log Message:
-----------
Rough in an ability for overlay -F to place an image in the active MGED 
framebuffer.

Modified Paths:
--------------
    brlcad/branches/dm-fb-merge/src/libged/overlay.c
    brlcad/branches/dm-fb-merge/src/libged/screengrab.c
    brlcad/branches/dm-fb-merge/src/mged/overlay.c

Modified: brlcad/branches/dm-fb-merge/src/libged/overlay.c
===================================================================
--- brlcad/branches/dm-fb-merge/src/libged/overlay.c    2020-06-03 19:31:59 UTC 
(rev 76013)
+++ brlcad/branches/dm-fb-merge/src/libged/overlay.c    2020-06-03 21:52:09 UTC 
(rev 76014)
@@ -25,6 +25,7 @@
 
 #include "common.h"
 
+#include "dm.h"
 
 #include "./ged_private.h"
 
@@ -32,12 +33,26 @@
 ged_overlay(struct ged *gedp, int argc, const char *argv[])
 {
     int ret;
-    struct bn_vlblock*vbp;
-    FILE *fp;
-    double char_size;
-    char *name;
-    static const char *usage = "file.plot3 char_size [name]";
+    int print_help = 0;
+    int write_fb = 0;
+    double size = 0.0;
+    struct dm *dmp = NULL;
+    struct fb *fbp = NULL;
+    const char *name = "_PLOT_OVERLAY_";
 
+    static char usage[] = "Usage: overlay [-h] [-F] file\n";
+
+    struct bu_opt_desc d[4];
+    BU_OPT(d[0], "h", "help",   "",   NULL,            &print_help,  "Print 
help and exit");
+    BU_OPT(d[1], "F", "fb",     "",   NULL,            &write_fb,    "Overlay 
image on framebuffer");
+    BU_OPT(d[2], "s", "size",   "#",  &bu_opt_fastf_t, &size,        
"Character size for plot drawing");
+    BU_OPT_NULL(d[3]);
+    //BU_OPT(d[2], "X", "scr_xoff",       "#",    &bu_opt_int,      &scr_xoff, 
        "X offset");
+    //BU_OPT(d[3], "Y", "scr_yoff",       "#",    &bu_opt_int,      &scr_yoff, 
        "Y offset");
+    //BU_OPT(d[4], "w", "width",          "#",    &bu_opt_int,      &width,    
        "image width to grab");
+    //BU_OPT(d[5], "n", "height",         "#",    &bu_opt_int,      &height,   
        "image height to grab");
+    //BU_OPT_NULL(d[6]);
+
     GED_CHECK_DATABASE_OPEN(gedp, GED_ERROR);
     GED_CHECK_DRAWABLE(gedp, GED_ERROR);
     GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR);
@@ -45,34 +60,81 @@
     /* initialize result */
     bu_vls_trunc(gedp->ged_result_str, 0);
 
+    if (!gedp->ged_dmp) {
+       bu_vls_printf(gedp->ged_result_str, ": no display manager currently 
active");
+       return GED_ERROR;
+    }
+
+    dmp = (struct dm *)gedp->ged_dmp;
+
     /* must be wanting help */
     if (argc == 1) {
-       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       _ged_cmd_help(gedp, usage, d);
        return GED_HELP;
     }
 
-    if (argc < 3 || 4 < argc) {
-       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+    argc-=(argc>0); argv+=(argc>0); /* done with command name argv[0] */
+
+    int opt_ret = bu_opt_parse(NULL, argc, argv, d);
+
+    if (print_help) {
+       _ged_cmd_help(gedp, usage, d);
+       return GED_HELP;
+    }
+
+    if (NEAR_ZERO(size, VUNITIZE_TOL)) {
+       if (!gedp->ged_gvp) {
+           bu_vls_printf(gedp->ged_result_str, ": no character size specified, 
and could not determine default value");
+           return GED_ERROR;
+       }
+       size = gedp->ged_gvp->gv_scale * 0.01;
+    }
+
+    argc = opt_ret;
+
+    if (write_fb) {
+       fbp = dm_get_fb(dmp);
+       if (!fbp) {
+           bu_vls_printf(gedp->ged_result_str, ": display manager does not 
have a framebuffer");
+           return GED_ERROR;
+       }
+    }
+
+    /* must be wanting help */
+    if (!argc) {
+       _ged_cmd_help(gedp, usage, d);
+       return GED_HELP;
+    }
+    /* check arg cnt */
+    if (argc > 2) {
+       _ged_cmd_help(gedp, usage, d);
        return GED_ERROR;
     }
 
-    if (sscanf(argv[2], "%lf", &char_size) != 1) {
-       bu_vls_printf(gedp->ged_result_str, "ged_overlay: bad character size - 
%s\n", argv[2]);
+    /* Second arg, if present, is view obj name */
+    if (argc == 2) {
+       name = argv[1];
+    }
+
+    if (!bu_file_exists(argv[0], NULL)) {
+       bu_vls_printf(gedp->ged_result_str, ": file %s not found", argv[0]);
        return GED_ERROR;
     }
 
-    if (argc == 3)
-       name = "_PLOT_OVERLAY_";
-    else
-       name = (char *)argv[3];
+    if (!write_fb) {
+       struct bn_vlblock*vbp;
+       FILE *fp = fopen(argv[0], "rb");
 
-    if ((fp = fopen(argv[1], "rb")) == NULL) {
-       char **files = NULL;
-       size_t count = bu_file_list(".", argv[1], &files);
-       if (count <= 0) {
-           bu_vls_printf(gedp->ged_result_str, "ged_overlay: failed to open 
file - %s\n", argv[1]);
-           return GED_ERROR;
-       } else {
+       /* If we don't have an exact filename match, see if we got a pattern -
+        * it is practical to plot many plot files simultaneously, so that may
+        * be what was specified. */
+       if (fp == NULL) {
+           char **files = NULL;
+           size_t count = bu_file_list(".", argv[1], &files);
+           if (count <= 0) {
+               bu_vls_printf(gedp->ged_result_str, "ged_overlay: failed to 
open file - %s\n", argv[1]);
+               return GED_ERROR;
+           }
            vbp = rt_vlblock_init();
            for (size_t i = 0; i < count; i++) {
                if ((fp = fopen(files[i], "rb")) == NULL) {
@@ -80,7 +142,7 @@
                    bu_argv_free(count, files);
                    return GED_ERROR;
                }
-               ret = rt_uplot_to_vlist(vbp, fp, char_size, 
gedp->ged_gdp->gd_uplotOutputMode);
+               ret = rt_uplot_to_vlist(vbp, fp, size, 
gedp->ged_gdp->gd_uplotOutputMode);
                fclose(fp);
                if (ret < 0) {
                    bn_vlblock_free(vbp);
@@ -89,25 +151,28 @@
                }
            }
            bu_argv_free(count, files);
-           _ged_cvt_vlblock_to_solids(gedp, vbp, name, 0);
-           bn_vlblock_free(vbp);
-           return GED_OK;
+           ret = 0;
+       } else {
+           vbp = rt_vlblock_init();
+           ret = rt_uplot_to_vlist(vbp, fp, size, 
gedp->ged_gdp->gd_uplotOutputMode);
+           fclose(fp);
+           if (ret < 0) {
+               bn_vlblock_free(vbp);
+               return GED_ERROR;
+           }
        }
-    } else {
-       vbp = rt_vlblock_init();
-       ret = rt_uplot_to_vlist(vbp, fp, char_size, 
gedp->ged_gdp->gd_uplotOutputMode);
-       fclose(fp);
-    }
 
-    if (ret < 0) {
+       _ged_cvt_vlblock_to_solids(gedp, vbp, name, 0);
        bn_vlblock_free(vbp);
-       return GED_ERROR;
+
+       return GED_OK;
+    } else {
+       const char *av[2];
+       const char *av0 = "overlay";
+       av[0] = av0;
+       av[1] = argv[0];
+       return ged_icv2fb(gedp, 2, (const char **)av);
     }
-
-    _ged_cvt_vlblock_to_solids(gedp, vbp, name, 0);
-    bn_vlblock_free(vbp);
-
-    return GED_OK;
 }
 
 

Modified: brlcad/branches/dm-fb-merge/src/libged/screengrab.c
===================================================================
--- brlcad/branches/dm-fb-merge/src/libged/screengrab.c 2020-06-03 19:31:59 UTC 
(rev 76013)
+++ brlcad/branches/dm-fb-merge/src/libged/screengrab.c 2020-06-03 21:52:09 UTC 
(rev 76014)
@@ -90,6 +90,9 @@
     GED_CHECK_DRAWABLE(gedp, GED_ERROR);
     GED_CHECK_ARGC_GT_0(gedp, argc, GED_ERROR);
 
+    /* initialize result */
+    bu_vls_trunc(gedp->ged_result_str, 0);
+
     if (!gedp->ged_dmp) {
        bu_vls_printf(gedp->ged_result_str, ": no display manager currently 
active");
        return GED_ERROR;
@@ -97,9 +100,6 @@
 
     dmp = (struct dm *)gedp->ged_dmp;
 
-    /* initialize result */
-    bu_vls_trunc(gedp->ged_result_str, 0);
-
     /* must be wanting help */
     if (argc == 1) {
        _ged_cmd_help(gedp, usage, d);
@@ -125,12 +125,9 @@
        }
     }
 
-    /* initialize result */
-    bu_vls_trunc(gedp->ged_result_str, 0);
-
     /* must be wanting help */
     if (!argc) {
-       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       _ged_cmd_help(gedp, usage, d);
        return GED_HELP;
     }
 

Modified: brlcad/branches/dm-fb-merge/src/mged/overlay.c
===================================================================
--- brlcad/branches/dm-fb-merge/src/mged/overlay.c      2020-06-03 19:31:59 UTC 
(rev 76013)
+++ brlcad/branches/dm-fb-merge/src/mged/overlay.c      2020-06-03 21:52:09 UTC 
(rev 76014)
@@ -39,9 +39,6 @@
 {
     int ret;
     Tcl_DString ds;
-    int ac;
-    const char *av[5];
-    struct bu_vls char_size = BU_VLS_INIT_ZERO;
 
     if (GEDP == GED_NULL)
        return TCL_OK;
@@ -54,19 +51,8 @@
        return TCL_OK;
     }
 
-    ac = argc + 1;
-
-    bu_vls_printf(&char_size, "%lf", view_state->vs_gvp->gv_scale * 0.01);
-    av[0] = argv[0];           /* command name */
-    av[1] = argv[1];           /* plotfile name */
-    av[2] = bu_vls_addr(&char_size);
-    if (argc == 3) {
-       av[3] = argv[2];        /* name */
-       av[4] = (char *)0;
-    } else
-       av[3] = (char *)0;
-
-    ret = ged_overlay(GEDP, ac, (const char **)av);
+    GEDP->ged_dmp = (void *)curr_dm_list->dml_dmp;
+    ret = ged_overlay(GEDP, argc, argv);
     Tcl_DStringAppend(&ds, bu_vls_addr(GEDP->ged_result_str), -1);
     Tcl_DStringResult(interp, &ds);
 
@@ -75,7 +61,6 @@
 
     update_views = 1;
 
-    bu_vls_free(&char_size);
     return ret;
 }
 

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



_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to