Revision: 76175 http://sourceforge.net/p/brlcad/code/76175 Author: starseeker Date: 2020-06-22 14:24:45 +0000 (Mon, 22 Jun 2020) Log Message: ----------- Start trying to figure out how to exercise the data_lines code. Right now this is an Archer/libtclcad only functionality from the looks of things... see if it can be factored down into libged so we can test it in MGED.
Modified Paths: -------------- brlcad/trunk/include/dm/bview.h brlcad/trunk/src/libged/CMakeLists.txt brlcad/trunk/src/libged/ged_private.h brlcad/trunk/src/libged/view/view.c Added Paths: ----------- brlcad/trunk/src/libged/view/data_lines.c Modified: brlcad/trunk/include/dm/bview.h =================================================================== --- brlcad/trunk/include/dm/bview.h 2020-06-22 02:33:25 UTC (rev 76174) +++ brlcad/trunk/include/dm/bview.h 2020-06-22 14:24:45 UTC (rev 76175) @@ -268,6 +268,7 @@ fastf_t gv_curve_scale; fastf_t gv_data_vZ; size_t gv_bot_threshold; + int gv_refresh; }; Modified: brlcad/trunk/src/libged/CMakeLists.txt =================================================================== --- brlcad/trunk/src/libged/CMakeLists.txt 2020-06-22 02:33:25 UTC (rev 76174) +++ brlcad/trunk/src/libged/CMakeLists.txt 2020-06-22 14:24:45 UTC (rev 76175) @@ -343,6 +343,7 @@ version.c view/aet.c view/center.cpp + view/data_lines.c view/eye.c view/quat.c view/size.c Modified: brlcad/trunk/src/libged/ged_private.h =================================================================== --- brlcad/trunk/src/libged/ged_private.h 2020-06-22 02:33:25 UTC (rev 76174) +++ brlcad/trunk/src/libged/ged_private.h 2020-06-22 14:24:45 UTC (rev 76175) @@ -667,6 +667,7 @@ extern int ged_view_snap(struct ged *gedp, int argc, const char *argv[]); +extern int ged_view_data_lines(struct ged *gedp, int argc, const char *argv[]); __END_DECLS Added: brlcad/trunk/src/libged/view/data_lines.c =================================================================== --- brlcad/trunk/src/libged/view/data_lines.c (rev 0) +++ brlcad/trunk/src/libged/view/data_lines.c 2020-06-22 14:24:45 UTC (rev 76175) @@ -0,0 +1,259 @@ +/* D A T A _ L I N E S . C + * BRL-CAD + * + * Copyright (c) 2008-2020 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file libged/data_lines.c + * + * Logic for drawing arbitary lines not associated with geometry. + * + */ + +#include "common.h" + +#include <stdlib.h> +#include <ctype.h> +#include <string.h> + +#include "bu/cmd.h" +#include "bu/opt.h" +#include "bu/str.h" +#include "bu/vls.h" +#include "../ged_private.h" + +struct view_dlines_state { + struct ged *gedp; + struct bview_data_line_state *gdlsp; +}; + +static int +_view_dlines_cmd_draw(void *bs, int argc, const char **argv) +{ + struct view_dlines_state *vs = (struct view_dlines_state *)bs; + struct ged *gedp = vs->gedp; + struct bview_data_line_state *gdlsp = vs->gdlsp; + if (argc == 2) { + bu_vls_printf(gedp->ged_result_str, "%d", gdlsp->gdls_draw); + return GED_OK; + } + + if (argc == 3) { + int i; + + if (bu_sscanf(argv[2], "%d", &i) != 1) return GED_ERROR; + + gdlsp->gdls_draw = (i) ? 1 : 0; + + gedp->ged_gvp->gv_refresh = 1; + return GED_OK; + } + + return GED_ERROR; +} + +static int +_view_dlines_cmd_color(void *bs, int argc, const char **argv) +{ + struct view_dlines_state *vs = (struct view_dlines_state *)bs; + struct ged *gedp = vs->gedp; + struct bview_data_line_state *gdlsp = vs->gdlsp; + + if (argc == 2) { + bu_vls_printf(gedp->ged_result_str, "%d %d %d", V3ARGS(gdlsp->gdls_color)); + return GED_OK; + } + + if (argc == 5) { + int r, g, b; + + /* set background color */ + if (bu_sscanf(argv[2], "%d", &r) != 1 || + bu_sscanf(argv[3], "%d", &g) != 1 || + bu_sscanf(argv[4], "%d", &b) != 1) + return GED_ERROR; + + /* validate color */ + if (r < 0 || 255 < r || + g < 0 || 255 < g || + b < 0 || 255 < b) + return GED_ERROR; + + VSET(gdlsp->gdls_color, r, g, b); + + gedp->ged_gvp->gv_refresh = 1; + return GED_OK; + } + + return GED_ERROR; +} + +static int +_view_dlines_cmd_line_width(void *bs, int argc, const char **argv) +{ + struct view_dlines_state *vs = (struct view_dlines_state *)bs; + struct ged *gedp = vs->gedp; + struct bview_data_line_state *gdlsp = vs->gdlsp; + + if (argc == 2) { + bu_vls_printf(gedp->ged_result_str, "%d", gdlsp->gdls_line_width); + return GED_OK; + } + + if (argc == 3) { + int line_width; + + if (bu_sscanf(argv[2], "%d", &line_width) != 1) + return GED_ERROR; + + gdlsp->gdls_line_width = line_width; + + gedp->ged_gvp->gv_refresh = 1; + return GED_OK; + } + + return GED_ERROR; +} + +static int +_view_dlines_cmd_points(void *bs, int argc, const char **argv) +{ + struct view_dlines_state *vs = (struct view_dlines_state *)bs; + struct ged *gedp = vs->gedp; + struct bview_data_line_state *gdlsp = vs->gdlsp; + int i; + + if (argc == 2) { + for (i = 0; i < gdlsp->gdls_num_points; ++i) { + bu_vls_printf(gedp->ged_result_str, " {%lf %lf %lf} ", V3ARGS(gdlsp->gdls_points[i])); + } + return GED_OK; + } + + if (argc == 3) { + int ac; + const char **av; + + if (bu_argv_from_tcl_list(argv[2], &ac, &av)) { + bu_vls_printf(gedp->ged_result_str, "failed to parse list"); + return GED_ERROR; + } + + if (ac % 2) { + bu_vls_printf(gedp->ged_result_str, "%s: must be an even number of points", argv[0]); + return GED_ERROR; + } + + if (gdlsp->gdls_num_points) { + bu_free((void *)gdlsp->gdls_points, "data points"); + gdlsp->gdls_points = (point_t *)0; + gdlsp->gdls_num_points = 0; + } + + /* Clear out data points */ + if (ac < 1) { + gedp->ged_gvp->gv_refresh = 1; + bu_free((char *)av, "av"); + return GED_OK; + } + + gdlsp->gdls_num_points = ac; + gdlsp->gdls_points = (point_t *)bu_calloc(ac, sizeof(point_t), "data points"); + for (i = 0; i < ac; ++i) { + double scan[3]; + + if (bu_sscanf(av[i], "%lf %lf %lf", &scan[X], &scan[Y], &scan[Z]) != 3) { + bu_vls_printf(gedp->ged_result_str, "bad data point - %s\n", av[i]); + + bu_free((void *)gdlsp->gdls_points, "data points"); + gdlsp->gdls_points = (point_t *)0; + gdlsp->gdls_num_points = 0; + + gedp->ged_gvp->gv_refresh = 1; + bu_free((char *)av, "av"); + return GED_ERROR; + } + /* convert double to fastf_t */ + VMOVE(gdlsp->gdls_points[i], scan); + } + + gedp->ged_gvp->gv_refresh = 1; + bu_free((char *)av, "av"); + return GED_OK; + } + + return GED_ERROR; +} + +const struct bu_cmdtab _view_dline_cmds[] = { + { "draw", _view_dlines_cmd_draw}, + { "color", _view_dlines_cmd_color}, + { "line_width", _view_dlines_cmd_line_width}, + { "points", _view_dlines_cmd_points}, + { (char *)NULL, NULL} +}; + +int +ged_view_data_lines(struct ged *gedp, int argc, const char *argv[]) +{ + struct view_dlines_state vs; + const char *usage = "view [s]data_lines [subcommand]"; + + vs.gedp = gedp; + + /* 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 (6 < argc) { + bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return GED_ERROR; + } + + if (argv[0][0] == 's') { + vs.gdlsp = &gedp->ged_gvp->gv_sdata_lines; + } else { + vs.gdlsp = &gedp->ged_gvp->gv_data_lines; + } + + if (bu_cmd_valid(_view_dline_cmds, argv[1]) != BRLCAD_OK) { + bu_vls_printf(gedp->ged_result_str, "invalid subcommand: %s", argv[1]); + return GED_ERROR; + } + + int ret; + if (bu_cmd(_view_dline_cmds, argc, argv, 0, (void *)&vs, &ret) == BRLCAD_OK) { + return GED_OK; + } + + return GED_ERROR; +} + + +/* + * Local Variables: + * tab-width: 8 + * mode: C + * indent-tabs-mode: t + * c-file-style: "stroustrup" + * End: + * ex: shiftwidth=4 tabstop=8 + */ Property changes on: brlcad/trunk/src/libged/view/data_lines.c ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Modified: brlcad/trunk/src/libged/view/view.c =================================================================== --- brlcad/trunk/src/libged/view/view.c 2020-06-22 02:33:25 UTC (rev 76174) +++ brlcad/trunk/src/libged/view/view.c 2020-06-22 14:24:45 UTC (rev 76175) @@ -79,6 +79,10 @@ return ged_size(gedp, argc-1, argv+1); } + if (BU_STR_EQUAL(argv[1], "data_lines") || BU_STR_EQUAL(argv[1], "sdata_lines")) { + return ged_view_data_lines(gedp, argc-1, argv+1); + } + if (BU_STR_EQUAL(argv[1], "snap")) { return ged_view_snap(gedp, argc-1, argv+1); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. _______________________________________________ BRL-CAD Source Commits mailing list brlcad-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits