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