Revision: 76346
          http://sourceforge.net/p/brlcad/code/76346
Author:   starseeker
Date:     2020-07-15 01:30:45 +0000 (Wed, 15 Jul 2020)
Log Message:
-----------
more refactoring

Modified Paths:
--------------
    brlcad/trunk/src/libtclcad/CMakeLists.txt
    brlcad/trunk/src/libtclcad/tclcad_obj.c
    brlcad/trunk/src/libtclcad/tclcad_private.h
    brlcad/trunk/src/libtclcad/view/tclcad_views.c
    brlcad/trunk/src/libtclcad/view/view.h

Added Paths:
-----------
    brlcad/trunk/src/libtclcad/view/draw.c
    brlcad/trunk/src/libtclcad/view/faceplate.c
    brlcad/trunk/src/libtclcad/view/labels.c

Modified: brlcad/trunk/src/libtclcad/CMakeLists.txt
===================================================================
--- brlcad/trunk/src/libtclcad/CMakeLists.txt   2020-07-15 01:11:01 UTC (rev 
76345)
+++ brlcad/trunk/src/libtclcad/CMakeLists.txt   2020-07-15 01:30:45 UTC (rev 
76346)
@@ -18,6 +18,9 @@
   view/arrows.c
   view/autoview.c
   view/axes.c
+  view/draw.c
+  view/faceplate.c
+  view/labels.c
   view/lines.c
   view/refresh.c
   tkImgFmtPIX.c

Modified: brlcad/trunk/src/libtclcad/tclcad_obj.c
===================================================================
--- brlcad/trunk/src/libtclcad/tclcad_obj.c     2020-07-15 01:11:01 UTC (rev 
76345)
+++ brlcad/trunk/src/libtclcad/tclcad_obj.c     2020-07-15 01:30:45 UTC (rev 
76346)
@@ -143,17 +143,6 @@
                   ged_func_ptr func,
                   const char *usage,
                   int maxargs);
-HIDDEN int to_data_labels(struct ged *gedp,
-                         int argc,
-                         const char *argv[],
-                         ged_func_ptr func,
-                         const char *usage,
-                         int maxargs);
-HIDDEN int to_data_labels_func(Tcl_Interp *interp,
-                              struct ged *gedp,
-                              struct ged_dm_view *gdvp,
-                              int argc,
-                              const char *argv[]);
 HIDDEN int to_data_move(struct ged *gedp,
                        int argc,
                        const char *argv[],
@@ -247,12 +236,6 @@
                          ged_func_ptr func,
                          const char *usage,
                          int maxargs);
-HIDDEN int to_faceplate(struct ged *gedp,
-                       int argc,
-                       const char *argv[],
-                       ged_func_ptr func,
-                       const char *usage,
-                       int maxargs);
 HIDDEN int to_handle_expose(struct ged *gedp,
                            int argc,
                            const char *argv[],
@@ -417,18 +400,6 @@
                  const char *usage,
                  int maxargs);
 #endif
-HIDDEN int to_prim_label(struct ged *gedp,
-                        int argc,
-                        const char *argv[],
-                        ged_func_ptr func,
-                        const char *usage,
-                        int maxargs);
-HIDDEN int to_redraw(struct ged *gedp,
-                    int argc,
-                    const char *argv[],
-                    ged_func_ptr func,
-                    const char *usage,
-                    int maxargs);
 HIDDEN int to_rect_mode(struct ged *gedp,
                        int argc,
                        const char *argv[],
@@ -992,96 +963,6 @@
 };
 
 
-int
-to_edit_redraw(struct ged *gedp,
-              int argc,
-              const char *argv[])
-{
-    size_t i;
-    register struct display_list *gdlp;
-    register struct display_list *next_gdlp;
-    struct db_full_path subpath;
-    int ret = GED_OK;
-
-    if (argc != 2)
-       return GED_ERROR;
-
-    gdlp = BU_LIST_NEXT(display_list, gedp->ged_gdp->gd_headDisplay);
-    while (BU_LIST_NOT_HEAD(gdlp, gedp->ged_gdp->gd_headDisplay)) {
-       gdlp->dl_wflag = 0;
-       gdlp = BU_LIST_PNEXT(display_list, gdlp);
-    }
-
-    if (db_string_to_path(&subpath, gedp->ged_wdbp->dbip, argv[1]) == 0) {
-       for (i = 0; i < subpath.fp_len; ++i) {
-           gdlp = BU_LIST_NEXT(display_list, gedp->ged_gdp->gd_headDisplay);
-           while (BU_LIST_NOT_HEAD(gdlp, gedp->ged_gdp->gd_headDisplay)) {
-               register struct solid *curr_sp;
-
-               next_gdlp = BU_LIST_PNEXT(display_list, gdlp);
-
-               if (gdlp->dl_wflag) {
-                   gdlp = next_gdlp;
-                   continue;
-               }
-
-               FOR_ALL_SOLIDS(curr_sp, &gdlp->dl_headSolid) {
-                   if (db_full_path_search(&curr_sp->s_fullpath, 
subpath.fp_names[i])) {
-                       struct display_list *last_gdlp;
-                       struct solid *sp = BU_LIST_NEXT(solid, 
&gdlp->dl_headSolid);
-                       struct bu_vls mflag = BU_VLS_INIT_ZERO;
-                       struct bu_vls xflag = BU_VLS_INIT_ZERO;
-                       char *av[5] = {0};
-                       int arg = 0;
-
-                       av[arg++] = (char *)argv[0];
-                       if (sp->s_hiddenLine) {
-                           av[arg++] = "-h";
-                       } else {
-                           bu_vls_printf(&mflag, "-m%d", sp->s_dmode);
-                           bu_vls_printf(&xflag, "-x%f", sp->s_transparency);
-                           av[arg++] = bu_vls_addr(&mflag);
-                           av[arg++] = bu_vls_addr(&xflag);
-                       }
-                       av[arg] = bu_vls_strdup(&gdlp->dl_path);
-
-                       ret = ged_draw(gedp, arg + 1, (const char **)av);
-
-                       bu_free(av[arg], "to_edit_redraw");
-                       bu_vls_free(&mflag);
-                       bu_vls_free(&xflag);
-
-                       /* The function call above causes gdlp to be
-                        * removed from the display list. A new one is
-                        * then created and appended to the end.  Here
-                        * we put it back where it belongs (i.e. as
-                        * specified by the user).  This also prevents
-                        * an infinite loop where the last and the
-                        * second to last list items play leap frog
-                        * with the end of list.
-                        */
-                       last_gdlp = BU_LIST_PREV(display_list, 
gedp->ged_gdp->gd_headDisplay);
-                       BU_LIST_DEQUEUE(&last_gdlp->l);
-                       BU_LIST_INSERT(&next_gdlp->l, &last_gdlp->l);
-                       last_gdlp->dl_wflag = 1;
-
-                       goto end;
-                   }
-               }
-
-           end:
-               gdlp = next_gdlp;
-           }
-       }
-
-       db_free_full_path(&subpath);
-    }
-
-    to_refresh_all_views(current_top);
-
-    return ret;
-}
-
 /**
  * @brief
  * A TCL interface to dm_list_types()).
@@ -1985,289 +1866,7 @@
     return ret;
 }
 
-int
-go_data_labels(Tcl_Interp *interp,
-              struct ged *gedp,
-              struct ged_dm_view *gdvp,
-              int argc,
-              const char *argv[],
-              const char *usage)
-{
-    int ret;
 
-    /* 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 < 2 || 5 < argc) {
-       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
-       return GED_ERROR;
-    }
-
-    /* Don't allow go_refresh() to be called */
-    if (current_top != NULL)
-       current_top->to_gop->go_refresh_on = 0;
-
-    ret = to_data_labels_func(interp, gedp, gdvp, argc, argv);
-    if (ret == GED_ERROR)
-       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
-
-    return ret;
-}
-
-
-HIDDEN int
-to_data_labels(struct ged *gedp,
-              int argc,
-              const char *argv[],
-              ged_func_ptr UNUSED(func),
-              const char *usage,
-              int UNUSED(maxargs))
-{
-    struct ged_dm_view *gdvp;
-    int ret;
-
-    /* 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 < 3 || 6 < argc) {
-       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
-       return GED_ERROR;
-    }
-
-    for (BU_LIST_FOR(gdvp, ged_dm_view, 
&current_top->to_gop->go_head_views.l)) {
-       if (BU_STR_EQUAL(bu_vls_addr(&gdvp->gdv_name), argv[1]))
-           break;
-    }
-
-    if (BU_LIST_IS_HEAD(&gdvp->l, &current_top->to_gop->go_head_views.l)) {
-       bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]);
-       return GED_ERROR;
-    }
-
-    /* shift the command name to argv[1] before calling to_data_labels_func */
-    argv[1] = argv[0];
-    ret = to_data_labels_func(current_top->to_interp, gedp, gdvp, argc-1, 
argv+1);
-    if (ret == GED_ERROR)
-       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
-
-    return ret;
-}
-
-
-HIDDEN int
-to_data_labels_func(Tcl_Interp *interp,
-                   struct ged *gedp,
-                   struct ged_dm_view *gdvp,
-                   int argc,
-                   const char *argv[])
-{
-    struct bview_data_label_state *gdlsp;
-
-    if (argv[0][0] == 's')
-       gdlsp = &gdvp->gdv_view->gv_sdata_labels;
-    else
-       gdlsp = &gdvp->gdv_view->gv_data_labels;
-
-    if (BU_STR_EQUAL(argv[1], "draw")) {
-       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)
-               goto bad;
-
-           if (i)
-               gdlsp->gdls_draw = 1;
-           else
-               gdlsp->gdls_draw = 0;
-
-           to_refresh_view(gdvp);
-           return GED_OK;
-       }
-
-       goto bad;
-    }
-
-    if (BU_STR_EQUAL(argv[1], "color")) {
-       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)
-               goto bad;
-
-           /* validate color */
-           if (r < 0 || 255 < r ||
-               g < 0 || 255 < g ||
-               b < 0 || 255 < b)
-               goto bad;
-
-           VSET(gdlsp->gdls_color, r, g, b);
-
-           to_refresh_view(gdvp);
-           return GED_OK;
-       }
-
-       goto bad;
-    }
-
-    if (BU_STR_EQUAL(argv[1], "labels")) {
-       register int i;
-
-       /* { {{label this} {0 0 0}} {{label that} {100 100 100}} }*/
-
-       if (argc == 2) {
-           for (i = 0; i < gdlsp->gdls_num_labels; ++i) {
-               bu_vls_printf(gedp->ged_result_str, "{{%s}", 
gdlsp->gdls_labels[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 (Tcl_SplitList(interp, argv[2], &ac, &av) != TCL_OK) {
-               bu_vls_printf(gedp->ged_result_str, "%s", 
Tcl_GetStringResult(interp));
-               return GED_ERROR;
-           }
-
-           if (gdlsp->gdls_num_labels) {
-               for (i = 0; i < gdlsp->gdls_num_labels; ++i)
-                   bu_free((void *)gdlsp->gdls_labels[i], "data label");
-
-               bu_free((void *)gdlsp->gdls_labels, "data labels");
-               bu_free((void *)gdlsp->gdls_points, "data points");
-               gdlsp->gdls_labels = (char **)0;
-               gdlsp->gdls_points = (point_t *)0;
-               gdlsp->gdls_num_labels = 0;
-           }
-
-           /* Clear out data points */
-           if (ac < 1) {
-               Tcl_Free((char *)av);
-               to_refresh_view(gdvp);
-               return GED_OK;
-           }
-
-           gdlsp->gdls_num_labels = ac;
-           gdlsp->gdls_labels = (char **)bu_calloc(ac, sizeof(char *), "data 
labels");
-           gdlsp->gdls_points = (point_t *)bu_calloc(ac, sizeof(point_t), 
"data points");
-           for (i = 0; i < ac; ++i) {
-               int sub_ac;
-               const char **sub_av;
-               double scan[ELEMENTS_PER_VECT];
-
-               if (Tcl_SplitList(interp, av[i], &sub_ac, &sub_av) != TCL_OK) {
-                   /*XXX Need a macro for the following lines. Do something 
similar for the rest. */
-                   bu_free((void *)gdlsp->gdls_labels, "data labels");
-                   bu_free((void *)gdlsp->gdls_points, "data points");
-                   gdlsp->gdls_labels = (char **)0;
-                   gdlsp->gdls_points = (point_t *)0;
-                   gdlsp->gdls_num_labels = 0;
-
-                   bu_vls_printf(gedp->ged_result_str, "%s", 
Tcl_GetStringResult(interp));
-                   Tcl_Free((char *)av);
-                   to_refresh_view(gdvp);
-                   return GED_ERROR;
-               }
-
-               if (sub_ac != 2) {
-                   /*XXX Need a macro for the following lines. Do something 
similar for the rest. */
-                   bu_free((void *)gdlsp->gdls_labels, "data labels");
-                   bu_free((void *)gdlsp->gdls_points, "data points");
-                   gdlsp->gdls_labels = (char **)0;
-                   gdlsp->gdls_points = (point_t *)0;
-                   gdlsp->gdls_num_labels = 0;
-
-                   bu_vls_printf(gedp->ged_result_str, "Each list element must 
contain a label and a point (i.e. {{some label} {0 0 0}})");
-                   Tcl_Free((char *)sub_av);
-                   Tcl_Free((char *)av);
-                   to_refresh_view(gdvp);
-                   return GED_ERROR;
-               }
-
-               if (bu_sscanf(sub_av[1], "%lf %lf %lf", &scan[X], &scan[Y], 
&scan[Z]) != 3) {
-                   bu_vls_printf(gedp->ged_result_str, "bad data point - 
%s\n", sub_av[1]);
-
-                   /*XXX Need a macro for the following lines. Do something 
similar for the rest. */
-                   bu_free((void *)gdlsp->gdls_labels, "data labels");
-                   bu_free((void *)gdlsp->gdls_points, "data points");
-                   gdlsp->gdls_labels = (char **)0;
-                   gdlsp->gdls_points = (point_t *)0;
-                   gdlsp->gdls_num_labels = 0;
-
-                   Tcl_Free((char *)sub_av);
-                   Tcl_Free((char *)av);
-                   to_refresh_view(gdvp);
-                   return GED_ERROR;
-               }
-               /* convert double to fastf_t */
-               VMOVE(gdlsp->gdls_points[i], scan);
-
-               gdlsp->gdls_labels[i] = bu_strdup(sub_av[0]);
-               Tcl_Free((char *)sub_av);
-           }
-
-           Tcl_Free((char *)av);
-           to_refresh_view(gdvp);
-           return GED_OK;
-       }
-    }
-
-    if (BU_STR_EQUAL(argv[1], "size")) {
-       if (argc == 2) {
-           bu_vls_printf(gedp->ged_result_str, "%d", gdlsp->gdls_size);
-           return GED_OK;
-       }
-
-       if (argc == 3) {
-           int size;
-
-           if (bu_sscanf(argv[2], "%d", &size) != 1)
-               goto bad;
-
-           gdlsp->gdls_size = size;
-
-           to_refresh_view(gdvp);
-           return GED_OK;
-       }
-
-       goto bad;
-    }
-
-
-bad:
-    return GED_ERROR;
-}
-
-
 int
 go_data_move(Tcl_Interp *UNUSED(interp),
             struct ged *gedp,
@@ -3913,205 +3512,6 @@
 
 
 HIDDEN int
-to_faceplate(struct ged *gedp,
-            int argc,
-            const char *argv[],
-            ged_func_ptr UNUSED(func),
-            const char *usage,
-            int UNUSED(maxargs))
-{
-    int i;
-    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 || 7 < argc)
-       goto bad;
-
-    for (BU_LIST_FOR(gdvp, ged_dm_view, 
&current_top->to_gop->go_head_views.l)) {
-       if (BU_STR_EQUAL(bu_vls_addr(&gdvp->gdv_name), argv[1]))
-           break;
-    }
-
-    if (BU_LIST_IS_HEAD(&gdvp->l, &current_top->to_gop->go_head_views.l)) {
-       bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]);
-       return GED_ERROR;
-    }
-
-    if (BU_STR_EQUAL(argv[2], "center_dot")) {
-       if (BU_STR_EQUAL(argv[3], "draw")) {
-           if (argc == 4) {
-               bu_vls_printf(gedp->ged_result_str, "%d", 
gdvp->gdv_view->gv_center_dot.gos_draw);
-               return GED_OK;
-           } else if (argc == 5) {
-               if (bu_sscanf(argv[4], "%d", &i) != 1)
-                   goto bad;
-
-               if (i)
-                   gdvp->gdv_view->gv_center_dot.gos_draw = 1;
-               else
-                   gdvp->gdv_view->gv_center_dot.gos_draw = 0;
-
-               to_refresh_view(gdvp);
-               return GED_OK;
-           }
-       }
-
-       if (BU_STR_EQUAL(argv[3], "color")) {
-           if (argc == 4) {
-               bu_vls_printf(gedp->ged_result_str, "%d %d %d", 
V3ARGS(gdvp->gdv_view->gv_center_dot.gos_line_color));
-               return GED_OK;
-           } else if (argc == 7) {
-               int r, g, b;
-
-               if (bu_sscanf(argv[4], "%d", &r) != 1 ||
-                   bu_sscanf(argv[5], "%d", &g) != 1 ||
-                   bu_sscanf(argv[6], "%d", &b) != 1)
-                   goto bad;
-
-               VSET(gdvp->gdv_view->gv_center_dot.gos_line_color, r, g, b);
-               to_refresh_view(gdvp);
-               return GED_OK;
-           }
-       }
-
-       goto bad;
-    }
-
-    if (BU_STR_EQUAL(argv[2], "prim_labels")) {
-       if (BU_STR_EQUAL(argv[3], "draw")) {
-           if (argc == 4) {
-               bu_vls_printf(gedp->ged_result_str, "%d", 
gdvp->gdv_view->gv_prim_labels.gos_draw);
-               return GED_OK;
-           } else if (argc == 5) {
-               if (bu_sscanf(argv[4], "%d", &i) != 1)
-                   goto bad;
-
-               if (i)
-                   gdvp->gdv_view->gv_prim_labels.gos_draw = 1;
-               else
-                   gdvp->gdv_view->gv_prim_labels.gos_draw = 0;
-
-               to_refresh_view(gdvp);
-               return GED_OK;
-           }
-       }
-
-       if (BU_STR_EQUAL(argv[3], "color")) {
-           if (argc == 4) {
-               bu_vls_printf(gedp->ged_result_str, "%d %d %d", 
V3ARGS(gdvp->gdv_view->gv_prim_labels.gos_text_color));
-               return GED_OK;
-           } else if (argc == 7) {
-               int r, g, b;
-
-               if (bu_sscanf(argv[4], "%d", &r) != 1 ||
-                   bu_sscanf(argv[5], "%d", &g) != 1 ||
-                   bu_sscanf(argv[6], "%d", &b) != 1)
-                   goto bad;
-
-               VSET(gdvp->gdv_view->gv_prim_labels.gos_text_color, r, g, b);
-               to_refresh_view(gdvp);
-               return GED_OK;
-           }
-       }
-
-       goto bad;
-    }
-
-    if (BU_STR_EQUAL(argv[2], "view_params")) {
-       if (BU_STR_EQUAL(argv[3], "draw")) {
-           if (argc == 4) {
-               bu_vls_printf(gedp->ged_result_str, "%d", 
gdvp->gdv_view->gv_view_params.gos_draw);
-               return GED_OK;
-           } else if (argc == 5) {
-               if (bu_sscanf(argv[4], "%d", &i) != 1)
-                   goto bad;
-
-               if (i)
-                   gdvp->gdv_view->gv_view_params.gos_draw = 1;
-               else
-                   gdvp->gdv_view->gv_view_params.gos_draw = 0;
-
-               to_refresh_view(gdvp);
-               return GED_OK;
-           }
-       }
-
-       if (BU_STR_EQUAL(argv[3], "color")) {
-           if (argc == 4) {
-               bu_vls_printf(gedp->ged_result_str, "%d %d %d", 
V3ARGS(gdvp->gdv_view->gv_view_params.gos_text_color));
-               return GED_OK;
-           } else if (argc == 7) {
-               int r, g, b;
-
-               if (bu_sscanf(argv[4], "%d", &r) != 1 ||
-                   bu_sscanf(argv[5], "%d", &g) != 1 ||
-                   bu_sscanf(argv[6], "%d", &b) != 1)
-                   goto bad;
-
-               VSET(gdvp->gdv_view->gv_view_params.gos_text_color, r, g, b);
-               to_refresh_view(gdvp);
-               return GED_OK;
-           }
-       }
-
-       goto bad;
-    }
-
-    if (BU_STR_EQUAL(argv[2], "view_scale")) {
-       if (BU_STR_EQUAL(argv[3], "draw")) {
-           if (argc == 4) {
-               bu_vls_printf(gedp->ged_result_str, "%d", 
gdvp->gdv_view->gv_view_scale.gos_draw);
-               return GED_OK;
-           } else if (argc == 5) {
-               if (bu_sscanf(argv[4], "%d", &i) != 1)
-                   goto bad;
-
-               if (i)
-                   gdvp->gdv_view->gv_view_scale.gos_draw = 1;
-               else
-                   gdvp->gdv_view->gv_view_scale.gos_draw = 0;
-
-               to_refresh_view(gdvp);
-               return GED_OK;
-           }
-       }
-
-       if (BU_STR_EQUAL(argv[3], "color")) {
-           if (argc == 4) {
-               bu_vls_printf(gedp->ged_result_str, "%d %d %d", 
V3ARGS(gdvp->gdv_view->gv_view_scale.gos_line_color));
-               return GED_OK;
-           } else if (argc == 7) {
-               int r, g, b;
-
-               if (bu_sscanf(argv[4], "%d", &r) != 1 ||
-                   bu_sscanf(argv[5], "%d", &g) != 1 ||
-                   bu_sscanf(argv[6], "%d", &b) != 1)
-                   goto bad;
-
-               VSET(gdvp->gdv_view->gv_view_scale.gos_line_color, r, g, b);
-               to_refresh_view(gdvp);
-               return GED_OK;
-           }
-       }
-
-       goto bad;
-    }
-
-bad:
-    bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
-    return GED_ERROR;
-}
-
-
-HIDDEN int
 to_handle_expose(struct ged *gedp,
                 int argc,
                 const char *argv[],
@@ -5682,43 +5082,7 @@
 }
 #endif
 
-HIDDEN int
-to_prim_label(struct ged *gedp,
-             int argc,
-             const char *argv[],
-             ged_func_ptr UNUSED(func),
-             const char *UNUSED(usage),
-             int UNUSED(maxargs))
-{
-    register int i;
 
-    /* initialize result */
-    bu_vls_trunc(gedp->ged_result_str, 0);
-
-    /* Free the previous list of primitives scheduled for labeling */
-    if (current_top->to_gop->go_prim_label_list_size) {
-       for (i = 0; i < current_top->to_gop->go_prim_label_list_size; ++i)
-           bu_vls_free(&current_top->to_gop->go_prim_label_list[i]);
-       bu_free((void *)current_top->to_gop->go_prim_label_list, "prim_label");
-       current_top->to_gop->go_prim_label_list = (struct bu_vls *)0;
-    }
-
-    /* Set the list of primitives scheduled for labeling */
-    current_top->to_gop->go_prim_label_list_size = argc - 1;
-    if (current_top->to_gop->go_prim_label_list_size < 1)
-       return GED_OK;
-
-    current_top->to_gop->go_prim_label_list = (struct bu_vls 
*)bu_calloc(current_top->to_gop->go_prim_label_list_size,
-                                                                        
sizeof(struct bu_vls), "prim_label");
-    for (i = 0; i < current_top->to_gop->go_prim_label_list_size; ++i) {
-       bu_vls_init(&current_top->to_gop->go_prim_label_list[i]);
-       bu_vls_printf(&current_top->to_gop->go_prim_label_list[i], "%s", 
argv[i+1]);
-    }
-
-    return GED_OK;
-}
-
-
 HIDDEN int
 to_rect_mode(struct ged *gedp,
             int argc,
@@ -5811,33 +5175,6 @@
 
 
 HIDDEN int
-to_redraw(struct ged *gedp,
-         int argc,
-         const char *argv[],
-         ged_func_ptr UNUSED(func),
-         const char *usage,
-         int UNUSED(maxargs))
-{
-    /* 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 != 2) {
-       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
-       return GED_ERROR;
-    }
-
-    return to_edit_redraw(gedp, argc, argv);
-}
-
-
-
-HIDDEN int
 to_rotate_arb_face_mode(struct ged *gedp,
                        int argc,
                        const char *argv[],

Modified: brlcad/trunk/src/libtclcad/tclcad_private.h
===================================================================
--- brlcad/trunk/src/libtclcad/tclcad_private.h 2020-07-15 01:11:01 UTC (rev 
76345)
+++ brlcad/trunk/src/libtclcad/tclcad_private.h 2020-07-15 01:30:45 UTC (rev 
76346)
@@ -97,9 +97,6 @@
 
 
 
-/* Utility functions */
-extern int to_edit_redraw(struct ged *gedp, int argc, const char *argv[]);
-
 /* Tclcad mouse routines */
 extern int to_get_prev_mouse(struct ged *gedp,
                             int argc,
@@ -407,8 +404,6 @@
 extern fastf_t screen_to_view_x(struct dm *dmp, fastf_t x);
 extern fastf_t screen_to_view_y(struct dm *dmp, fastf_t y);
 extern int to_is_viewable(struct ged_dm_view *gdvp);
-extern void go_draw(struct ged_dm_view *gdvp);
-extern void go_draw_other(struct ged_obj *gop, struct ged_dm_view *gdvp);
 
 /* Tclcad obj wrapper routines */
 extern int to_pass_through_func(struct ged *gedp,

Added: brlcad/trunk/src/libtclcad/view/draw.c
===================================================================
--- brlcad/trunk/src/libtclcad/view/draw.c                              (rev 0)
+++ brlcad/trunk/src/libtclcad/view/draw.c      2020-07-15 01:30:45 UTC (rev 
76346)
@@ -0,0 +1,458 @@
+/*                       D R A W . C
+ * BRL-CAD
+ *
+ * Copyright (c) 2000-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.
+ */
+/** @addtogroup libtclcad */
+/** @{ */
+/** @file libtclcad/view/draw.c
+ *
+ */
+/** @} */
+
+#include "common.h"
+#include "bu/units.h"
+#include "ged.h"
+#include "tclcad.h"
+
+/* Private headers */
+#include "../tclcad_private.h"
+#include "../view/view.h"
+
+
+struct path_match_data {
+    struct db_full_path *s_fpath;
+    struct db_i *dbip;
+};
+
+static struct bu_hash_entry *
+key_matches_paths(struct bu_hash_tbl *t, void *udata)
+{
+    struct path_match_data *data = (struct path_match_data *)udata;
+    struct db_full_path entry_fpath;
+    uint8_t *key;
+    char *path_string;
+    struct bu_hash_entry *entry = bu_hash_next(t, NULL);
+
+    while (entry) {
+       (void)bu_hash_key(entry, &key, NULL);
+       path_string = (char *)key;
+       if (db_string_to_path(&entry_fpath, data->dbip, path_string) < 0) {
+           continue;
+       }
+
+       if (db_full_path_match_top(&entry_fpath, data->s_fpath)) {
+           db_free_full_path(&entry_fpath);
+           return entry;
+       }
+
+       db_free_full_path(&entry_fpath);
+       entry = bu_hash_next(t, entry);
+    }
+
+    return NULL;
+}
+
+static void
+go_draw_solid(struct ged_dm_view *gdvp, struct solid *sp)
+{
+    struct ged_obj *gop = gdvp->gdv_gop;
+    struct dm *dmp = gdvp->gdv_dmp;
+    struct bu_hash_entry *entry;
+    struct path_edit_params *params = NULL;
+    mat_t save_mat, edit_model2view;
+    struct path_match_data data;
+
+    data.s_fpath = &sp->s_fullpath;
+    data.dbip = gop->go_gedp->ged_wdbp->dbip;
+    entry = key_matches_paths(gop->go_edited_paths, &data);
+
+    if (entry != NULL) {
+       params = (struct path_edit_params *)bu_hash_value(entry, NULL);
+    }
+    if (params) {
+       MAT_COPY(save_mat, gdvp->gdv_view->gv_model2view);
+       bn_mat_mul(edit_model2view, gdvp->gdv_view->gv_model2view, 
params->edit_mat);
+       dm_loadmatrix(dmp, edit_model2view, 0);
+    }
+
+    if (gop->go_dlist_on) {
+       dm_draw_dlist(dmp, sp->s_dlist);
+    } else {
+       if (sp->s_iflag == UP)
+           (void)dm_set_fg(dmp, 255, 255, 255, 0, sp->s_transparency);
+       else
+           (void)dm_set_fg(dmp,
+                           (unsigned char)sp->s_color[0],
+                           (unsigned char)sp->s_color[1],
+                           (unsigned char)sp->s_color[2], 0, 
sp->s_transparency);
+
+       if (sp->s_hiddenLine) {
+           (void)dm_draw_vlist_hidden_line(dmp, (struct bn_vlist 
*)&sp->s_vlist);
+       } else {
+           (void)dm_draw_vlist(dmp, (struct bn_vlist *)&sp->s_vlist);
+       }
+    }
+    if (params) {
+       dm_loadmatrix(dmp, save_mat, 0);
+    }
+}
+
+/* Draw all display lists */
+static int
+go_draw_dlist(struct ged_dm_view *gdvp)
+{
+    register struct display_list *gdlp;
+    register struct display_list *next_gdlp;
+    struct solid *sp;
+    int line_style = -1;
+    struct dm *dmp = gdvp->gdv_dmp;
+    struct bu_list *hdlp = gdvp->gdv_gop->go_gedp->ged_gdp->gd_headDisplay;
+
+    if (dm_get_transparency(dmp)) {
+       /* First, draw opaque stuff */
+       gdlp = BU_LIST_NEXT(display_list, hdlp);
+       while (BU_LIST_NOT_HEAD(gdlp, hdlp)) {
+           next_gdlp = BU_LIST_PNEXT(display_list, gdlp);
+
+           FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) {
+               if (sp->s_transparency < 1.0)
+                   continue;
+
+               if (line_style != sp->s_soldash) {
+                   line_style = sp->s_soldash;
+                   (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), 
line_style);
+               }
+
+               go_draw_solid(gdvp, sp);
+           }
+
+           gdlp = next_gdlp;
+       }
+
+       /* disable write to depth buffer */
+       (void)dm_set_depth_mask(dmp, 0);
+
+       /* Second, draw transparent stuff */
+       gdlp = BU_LIST_NEXT(display_list, hdlp);
+       while (BU_LIST_NOT_HEAD(gdlp, hdlp)) {
+           next_gdlp = BU_LIST_PNEXT(display_list, gdlp);
+
+           FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) {
+               /* already drawn above */
+               if (ZERO(sp->s_transparency - 1.0))
+                   continue;
+
+               if (line_style != sp->s_soldash) {
+                   line_style = sp->s_soldash;
+                   (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), 
line_style);
+               }
+
+               go_draw_solid(gdvp, sp);
+           }
+
+           gdlp = next_gdlp;
+       }
+
+       /* re-enable write to depth buffer */
+       (void)dm_set_depth_mask(dmp, 1);
+    } else {
+       gdlp = BU_LIST_NEXT(display_list, hdlp);
+       while (BU_LIST_NOT_HEAD(gdlp, hdlp)) {
+           next_gdlp = BU_LIST_PNEXT(display_list, gdlp);
+
+           FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) {
+               if (line_style != sp->s_soldash) {
+                   line_style = sp->s_soldash;
+                   (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), 
line_style);
+               }
+
+               go_draw_solid(gdvp, sp);
+           }
+
+           gdlp = next_gdlp;
+       }
+    }
+
+    return GED_OK;
+}
+
+void
+go_draw(struct ged_dm_view *gdvp)
+{
+    (void)dm_loadmatrix(gdvp->gdv_dmp, gdvp->gdv_view->gv_model2view, 0);
+
+    if (SMALL_FASTF < gdvp->gdv_view->gv_perspective)
+       (void)dm_loadpmatrix(gdvp->gdv_dmp, gdvp->gdv_view->gv_pmat);
+    else
+       (void)dm_loadpmatrix(gdvp->gdv_dmp, (fastf_t *)NULL);
+
+    go_draw_dlist(gdvp);
+}
+
+
+#define GO_DM_DRAW_POLY(_dmp, _gdpsp, _i, _last_poly, _mode) { \
+       size_t _j; \
+       \
+       /* set color */ \
+       (void)dm_set_fg((_dmp), \
+                       (_gdpsp)->gdps_polygons.polygon[_i].gp_color[0], \
+                       (_gdpsp)->gdps_polygons.polygon[_i].gp_color[1], \
+                       (_gdpsp)->gdps_polygons.polygon[_i].gp_color[2], \
+                       1, 1.0);                                        \
+       \
+       for (_j = 0; _j < (_gdpsp)->gdps_polygons.polygon[_i].num_contours; 
++_j) { \
+           size_t _last = 
(_gdpsp)->gdps_polygons.polygon[_i].contour[_j].num_points-1; \
+           int _line_style; \
+           \
+           /* always draw holes using segmented lines */ \
+           if ((_gdpsp)->gdps_polygons.polygon[_i].hole[_j]) { \
+               _line_style = 1; \
+           } else { \
+               _line_style = 
(_gdpsp)->gdps_polygons.polygon[_i].gp_line_style; \
+           } \
+           \
+           /* set the linewidth and linestyle for polygon i, contour j */      
\
+           (void)dm_set_line_attr((_dmp), \
+                                  
(_gdpsp)->gdps_polygons.polygon[_i].gp_line_width, \
+                                  _line_style); \
+           \
+           (void)dm_draw_lines_3d((_dmp),                              \
+                                  
(_gdpsp)->gdps_polygons.polygon[_i].contour[_j].num_points, \
+                                  
(_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point, 1); \
+           \
+           if (_mode != TCLCAD_POLY_CONTOUR_MODE || _i != _last_poly || 
(_gdpsp)->gdps_cflag == 0) { \
+               (void)dm_draw_line_3d((_dmp),                           \
+                                     
(_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point[_last], \
+                                     
(_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point[0]); \
+           } \
+       }}
+
+
+static void
+go_dm_draw_polys(struct dm *dmp, bview_data_polygon_state *gdpsp, int mode)
+{
+    register size_t i, last_poly;
+    int saveLineWidth;
+    int saveLineStyle;
+
+    if (gdpsp->gdps_polygons.num_polygons < 1)
+       return;
+
+    saveLineWidth = dm_get_linewidth(dmp);
+    saveLineStyle = dm_get_linestyle(dmp);
+
+    last_poly = gdpsp->gdps_polygons.num_polygons - 1;
+    for (i = 0; i < gdpsp->gdps_polygons.num_polygons; ++i) {
+       if (i == gdpsp->gdps_target_polygon_i)
+           continue;
+
+       GO_DM_DRAW_POLY(dmp, gdpsp, i, last_poly, mode);
+    }
+
+    /* draw the target poly last */
+    GO_DM_DRAW_POLY(dmp, gdpsp, gdpsp->gdps_target_polygon_i, last_poly, mode);
+
+    /* Restore the line attributes */
+    (void)dm_set_line_attr(dmp, saveLineWidth, saveLineStyle);
+}
+
+void
+go_draw_other(struct ged_obj *gop, struct ged_dm_view *gdvp)
+{
+    int width = dm_get_width(gdvp->gdv_dmp);
+    fastf_t sf = (fastf_t)(gdvp->gdv_view->gv_size) / (fastf_t)width;
+
+    if (gdvp->gdv_view->gv_data_arrows.gdas_draw)
+       go_dm_draw_arrows(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_arrows, sf);
+
+    if (gdvp->gdv_view->gv_sdata_arrows.gdas_draw)
+       go_dm_draw_arrows(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_arrows, sf);
+
+    if (gdvp->gdv_view->gv_data_axes.draw)
+       dm_draw_data_axes(gdvp->gdv_dmp,
+                         sf,
+                         &gdvp->gdv_view->gv_data_axes);
+
+    if (gdvp->gdv_view->gv_sdata_axes.draw)
+       dm_draw_data_axes(gdvp->gdv_dmp,
+                         sf,
+                         &gdvp->gdv_view->gv_sdata_axes);
+
+    if (gdvp->gdv_view->gv_data_lines.gdls_draw)
+       go_dm_draw_lines(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_lines);
+
+    if (gdvp->gdv_view->gv_sdata_lines.gdls_draw)
+       go_dm_draw_lines(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_lines);
+
+    if (gdvp->gdv_view->gv_data_polygons.gdps_draw)
+       go_dm_draw_polys(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_polygons, 
gdvp->gdv_view->gv_mode);
+
+    if (gdvp->gdv_view->gv_sdata_polygons.gdps_draw)
+       go_dm_draw_polys(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_polygons, 
gdvp->gdv_view->gv_mode);
+
+    /* Restore to non-rotated, full brightness */
+    (void)dm_normal(gdvp->gdv_dmp);
+    go_draw_faceplate(gop, gdvp);
+
+    if (gdvp->gdv_view->gv_data_labels.gdls_draw)
+       go_dm_draw_labels(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_labels, 
gdvp->gdv_view->gv_model2view);
+
+    if (gdvp->gdv_view->gv_sdata_labels.gdls_draw)
+       go_dm_draw_labels(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_labels, 
gdvp->gdv_view->gv_model2view);
+
+    /* Draw labels */
+    if (gdvp->gdv_view->gv_prim_labels.gos_draw) {
+       register int i;
+
+       for (i = 0; i < gop->go_prim_label_list_size; ++i) {
+           dm_draw_labels(gdvp->gdv_dmp,
+                          gop->go_gedp->ged_wdbp,
+                          bu_vls_addr(&gop->go_prim_label_list[i]),
+                          gdvp->gdv_view->gv_model2view,
+                          gdvp->gdv_view->gv_prim_labels.gos_text_color,
+                          NULL, NULL);
+       }
+    }
+}
+
+int
+to_edit_redraw(struct ged *gedp,
+              int argc,
+              const char *argv[])
+{
+    size_t i;
+    register struct display_list *gdlp;
+    register struct display_list *next_gdlp;
+    struct db_full_path subpath;
+    int ret = GED_OK;
+
+    if (argc != 2)
+       return GED_ERROR;
+
+    gdlp = BU_LIST_NEXT(display_list, gedp->ged_gdp->gd_headDisplay);
+    while (BU_LIST_NOT_HEAD(gdlp, gedp->ged_gdp->gd_headDisplay)) {
+       gdlp->dl_wflag = 0;
+       gdlp = BU_LIST_PNEXT(display_list, gdlp);
+    }
+
+    if (db_string_to_path(&subpath, gedp->ged_wdbp->dbip, argv[1]) == 0) {
+       for (i = 0; i < subpath.fp_len; ++i) {
+           gdlp = BU_LIST_NEXT(display_list, gedp->ged_gdp->gd_headDisplay);
+           while (BU_LIST_NOT_HEAD(gdlp, gedp->ged_gdp->gd_headDisplay)) {
+               register struct solid *curr_sp;
+
+               next_gdlp = BU_LIST_PNEXT(display_list, gdlp);
+
+               if (gdlp->dl_wflag) {
+                   gdlp = next_gdlp;
+                   continue;
+               }
+
+               FOR_ALL_SOLIDS(curr_sp, &gdlp->dl_headSolid) {
+                   if (db_full_path_search(&curr_sp->s_fullpath, 
subpath.fp_names[i])) {
+                       struct display_list *last_gdlp;
+                       struct solid *sp = BU_LIST_NEXT(solid, 
&gdlp->dl_headSolid);
+                       struct bu_vls mflag = BU_VLS_INIT_ZERO;
+                       struct bu_vls xflag = BU_VLS_INIT_ZERO;
+                       char *av[5] = {0};
+                       int arg = 0;
+
+                       av[arg++] = (char *)argv[0];
+                       if (sp->s_hiddenLine) {
+                           av[arg++] = "-h";
+                       } else {
+                           bu_vls_printf(&mflag, "-m%d", sp->s_dmode);
+                           bu_vls_printf(&xflag, "-x%f", sp->s_transparency);
+                           av[arg++] = bu_vls_addr(&mflag);
+                           av[arg++] = bu_vls_addr(&xflag);
+                       }
+                       av[arg] = bu_vls_strdup(&gdlp->dl_path);
+
+                       ret = ged_draw(gedp, arg + 1, (const char **)av);
+
+                       bu_free(av[arg], "to_edit_redraw");
+                       bu_vls_free(&mflag);
+                       bu_vls_free(&xflag);
+
+                       /* The function call above causes gdlp to be
+                        * removed from the display list. A new one is
+                        * then created and appended to the end.  Here
+                        * we put it back where it belongs (i.e. as
+                        * specified by the user).  This also prevents
+                        * an infinite loop where the last and the
+                        * second to last list items play leap frog
+                        * with the end of list.
+                        */
+                       last_gdlp = BU_LIST_PREV(display_list, 
gedp->ged_gdp->gd_headDisplay);
+                       BU_LIST_DEQUEUE(&last_gdlp->l);
+                       BU_LIST_INSERT(&next_gdlp->l, &last_gdlp->l);
+                       last_gdlp->dl_wflag = 1;
+
+                       goto end;
+                   }
+               }
+
+           end:
+               gdlp = next_gdlp;
+           }
+       }
+
+       db_free_full_path(&subpath);
+    }
+
+    to_refresh_all_views(current_top);
+
+    return ret;
+}
+
+int
+to_redraw(struct ged *gedp,
+         int argc,
+         const char *argv[],
+         ged_func_ptr UNUSED(func),
+         const char *usage,
+         int UNUSED(maxargs))
+{
+    /* 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 != 2) {
+       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return GED_ERROR;
+    }
+
+    return to_edit_redraw(gedp, argc, argv);
+}
+
+
+
+/*
+ * Local Variables:
+ * mode: C
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * c-file-style: "stroustrup"
+ * End:
+ * ex: shiftwidth=4 tabstop=8
+ */


Property changes on: brlcad/trunk/src/libtclcad/view/draw.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
Added: brlcad/trunk/src/libtclcad/view/faceplate.c
===================================================================
--- brlcad/trunk/src/libtclcad/view/faceplate.c                         (rev 0)
+++ brlcad/trunk/src/libtclcad/view/faceplate.c 2020-07-15 01:30:45 UTC (rev 
76346)
@@ -0,0 +1,338 @@
+/*                     F A C E P L A T E . C
+ * BRL-CAD
+ *
+ * Copyright (c) 2000-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.
+ */
+/** @addtogroup libtclcad */
+/** @{ */
+/** @file libtclcad/faceplate.c
+ *
+ */
+/** @} */
+
+#include "common.h"
+#include "bu/units.h"
+#include "ged.h"
+#include "tclcad.h"
+
+/* Private headers */
+#include "../tclcad_private.h"
+#include "../view/view.h"
+
+int
+to_faceplate(struct ged *gedp,
+            int argc,
+            const char *argv[],
+            ged_func_ptr UNUSED(func),
+            const char *usage,
+            int UNUSED(maxargs))
+{
+    int i;
+    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 || 7 < argc)
+       goto bad;
+
+    for (BU_LIST_FOR(gdvp, ged_dm_view, 
&current_top->to_gop->go_head_views.l)) {
+       if (BU_STR_EQUAL(bu_vls_addr(&gdvp->gdv_name), argv[1]))
+           break;
+    }
+
+    if (BU_LIST_IS_HEAD(&gdvp->l, &current_top->to_gop->go_head_views.l)) {
+       bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]);
+       return GED_ERROR;
+    }
+
+    if (BU_STR_EQUAL(argv[2], "center_dot")) {
+       if (BU_STR_EQUAL(argv[3], "draw")) {
+           if (argc == 4) {
+               bu_vls_printf(gedp->ged_result_str, "%d", 
gdvp->gdv_view->gv_center_dot.gos_draw);
+               return GED_OK;
+           } else if (argc == 5) {
+               if (bu_sscanf(argv[4], "%d", &i) != 1)
+                   goto bad;
+
+               if (i)
+                   gdvp->gdv_view->gv_center_dot.gos_draw = 1;
+               else
+                   gdvp->gdv_view->gv_center_dot.gos_draw = 0;
+
+               to_refresh_view(gdvp);
+               return GED_OK;
+           }
+       }
+
+       if (BU_STR_EQUAL(argv[3], "color")) {
+           if (argc == 4) {
+               bu_vls_printf(gedp->ged_result_str, "%d %d %d", 
V3ARGS(gdvp->gdv_view->gv_center_dot.gos_line_color));
+               return GED_OK;
+           } else if (argc == 7) {
+               int r, g, b;
+
+               if (bu_sscanf(argv[4], "%d", &r) != 1 ||
+                   bu_sscanf(argv[5], "%d", &g) != 1 ||
+                   bu_sscanf(argv[6], "%d", &b) != 1)
+                   goto bad;
+
+               VSET(gdvp->gdv_view->gv_center_dot.gos_line_color, r, g, b);
+               to_refresh_view(gdvp);
+               return GED_OK;
+           }
+       }
+
+       goto bad;
+    }
+
+    if (BU_STR_EQUAL(argv[2], "prim_labels")) {
+       if (BU_STR_EQUAL(argv[3], "draw")) {
+           if (argc == 4) {
+               bu_vls_printf(gedp->ged_result_str, "%d", 
gdvp->gdv_view->gv_prim_labels.gos_draw);
+               return GED_OK;
+           } else if (argc == 5) {
+               if (bu_sscanf(argv[4], "%d", &i) != 1)
+                   goto bad;
+
+               if (i)
+                   gdvp->gdv_view->gv_prim_labels.gos_draw = 1;
+               else
+                   gdvp->gdv_view->gv_prim_labels.gos_draw = 0;
+
+               to_refresh_view(gdvp);
+               return GED_OK;
+           }
+       }
+
+       if (BU_STR_EQUAL(argv[3], "color")) {
+           if (argc == 4) {
+               bu_vls_printf(gedp->ged_result_str, "%d %d %d", 
V3ARGS(gdvp->gdv_view->gv_prim_labels.gos_text_color));
+               return GED_OK;
+           } else if (argc == 7) {
+               int r, g, b;
+
+               if (bu_sscanf(argv[4], "%d", &r) != 1 ||
+                   bu_sscanf(argv[5], "%d", &g) != 1 ||
+                   bu_sscanf(argv[6], "%d", &b) != 1)
+                   goto bad;
+
+               VSET(gdvp->gdv_view->gv_prim_labels.gos_text_color, r, g, b);
+               to_refresh_view(gdvp);
+               return GED_OK;
+           }
+       }
+
+       goto bad;
+    }
+
+    if (BU_STR_EQUAL(argv[2], "view_params")) {
+       if (BU_STR_EQUAL(argv[3], "draw")) {
+           if (argc == 4) {
+               bu_vls_printf(gedp->ged_result_str, "%d", 
gdvp->gdv_view->gv_view_params.gos_draw);
+               return GED_OK;
+           } else if (argc == 5) {
+               if (bu_sscanf(argv[4], "%d", &i) != 1)
+                   goto bad;
+
+               if (i)
+                   gdvp->gdv_view->gv_view_params.gos_draw = 1;
+               else
+                   gdvp->gdv_view->gv_view_params.gos_draw = 0;
+
+               to_refresh_view(gdvp);
+               return GED_OK;
+           }
+       }
+
+       if (BU_STR_EQUAL(argv[3], "color")) {
+           if (argc == 4) {
+               bu_vls_printf(gedp->ged_result_str, "%d %d %d", 
V3ARGS(gdvp->gdv_view->gv_view_params.gos_text_color));
+               return GED_OK;
+           } else if (argc == 7) {
+               int r, g, b;
+
+               if (bu_sscanf(argv[4], "%d", &r) != 1 ||
+                   bu_sscanf(argv[5], "%d", &g) != 1 ||
+                   bu_sscanf(argv[6], "%d", &b) != 1)
+                   goto bad;
+
+               VSET(gdvp->gdv_view->gv_view_params.gos_text_color, r, g, b);
+               to_refresh_view(gdvp);
+               return GED_OK;
+           }
+       }
+
+       goto bad;
+    }
+
+    if (BU_STR_EQUAL(argv[2], "view_scale")) {
+       if (BU_STR_EQUAL(argv[3], "draw")) {
+           if (argc == 4) {
+               bu_vls_printf(gedp->ged_result_str, "%d", 
gdvp->gdv_view->gv_view_scale.gos_draw);
+               return GED_OK;
+           } else if (argc == 5) {
+               if (bu_sscanf(argv[4], "%d", &i) != 1)
+                   goto bad;
+
+               if (i)
+                   gdvp->gdv_view->gv_view_scale.gos_draw = 1;
+               else
+                   gdvp->gdv_view->gv_view_scale.gos_draw = 0;
+
+               to_refresh_view(gdvp);
+               return GED_OK;
+           }
+       }
+
+       if (BU_STR_EQUAL(argv[3], "color")) {
+           if (argc == 4) {
+               bu_vls_printf(gedp->ged_result_str, "%d %d %d", 
V3ARGS(gdvp->gdv_view->gv_view_scale.gos_line_color));
+               return GED_OK;
+           } else if (argc == 7) {
+               int r, g, b;
+
+               if (bu_sscanf(argv[4], "%d", &r) != 1 ||
+                   bu_sscanf(argv[5], "%d", &g) != 1 ||
+                   bu_sscanf(argv[6], "%d", &b) != 1)
+                   goto bad;
+
+               VSET(gdvp->gdv_view->gv_view_scale.gos_line_color, r, g, b);
+               to_refresh_view(gdvp);
+               return GED_OK;
+           }
+       }
+
+       goto bad;
+    }
+
+bad:
+    bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+    return GED_ERROR;
+}
+
+
+void
+go_draw_faceplate(struct ged_obj *gop, struct ged_dm_view *gdvp)
+{
+    /* Center dot */
+    if (gdvp->gdv_view->gv_center_dot.gos_draw) {
+       (void)dm_set_fg(gdvp->gdv_dmp,
+                       gdvp->gdv_view->gv_center_dot.gos_line_color[0],
+                       gdvp->gdv_view->gv_center_dot.gos_line_color[1],
+                       gdvp->gdv_view->gv_center_dot.gos_line_color[2],
+                       1, 1.0);
+       (void)dm_draw_point_2d(gdvp->gdv_dmp, 0.0, 0.0);
+    }
+
+    /* Model axes */
+    if (gdvp->gdv_view->gv_model_axes.draw) {
+       point_t map;
+       point_t save_map;
+
+       VMOVE(save_map, gdvp->gdv_view->gv_model_axes.axes_pos);
+       VSCALE(map, gdvp->gdv_view->gv_model_axes.axes_pos, 
gop->go_gedp->ged_wdbp->dbip->dbi_local2base);
+       MAT4X3PNT(gdvp->gdv_view->gv_model_axes.axes_pos, 
gdvp->gdv_view->gv_model2view, map);
+
+       dm_draw_axes(gdvp->gdv_dmp,
+                    gdvp->gdv_view->gv_size,
+                    gdvp->gdv_view->gv_rotation,
+                    &gdvp->gdv_view->gv_model_axes);
+
+       VMOVE(gdvp->gdv_view->gv_model_axes.axes_pos, save_map);
+    }
+
+    /* View axes */
+    if (gdvp->gdv_view->gv_view_axes.draw) {
+       int width, height;
+       fastf_t inv_aspect;
+       fastf_t save_ypos;
+
+       save_ypos = gdvp->gdv_view->gv_view_axes.axes_pos[Y];
+       width = dm_get_width(gdvp->gdv_dmp);
+       height = dm_get_height(gdvp->gdv_dmp);
+       inv_aspect = (fastf_t)height / (fastf_t)width;
+       gdvp->gdv_view->gv_view_axes.axes_pos[Y] = save_ypos * inv_aspect;
+       dm_draw_axes(gdvp->gdv_dmp,
+                    gdvp->gdv_view->gv_size,
+                    gdvp->gdv_view->gv_rotation,
+                    &gdvp->gdv_view->gv_view_axes);
+
+       gdvp->gdv_view->gv_view_axes.axes_pos[Y] = save_ypos;
+    }
+
+
+    /* View scale */
+    if (gdvp->gdv_view->gv_view_scale.gos_draw)
+       dm_draw_scale(gdvp->gdv_dmp,
+                     
gdvp->gdv_view->gv_size*gop->go_gedp->ged_wdbp->dbip->dbi_base2local,
+                     
bu_units_string(1/gop->go_gedp->ged_wdbp->dbip->dbi_base2local),
+                     gdvp->gdv_view->gv_view_scale.gos_line_color,
+                     gdvp->gdv_view->gv_view_params.gos_text_color);
+
+    /* View parameters */
+    if (gdvp->gdv_view->gv_view_params.gos_draw) {
+       struct bu_vls vls = BU_VLS_INIT_ZERO;
+       point_t center;
+       char *ustr;
+
+       MAT_DELTAS_GET_NEG(center, gdvp->gdv_view->gv_center);
+       VSCALE(center, center, gop->go_gedp->ged_wdbp->dbip->dbi_base2local);
+
+       ustr = (char 
*)bu_units_string(gop->go_gedp->ged_wdbp->dbip->dbi_local2base);
+       bu_vls_printf(&vls, "units:%s  size:%.2f  center:(%.2f, %.2f, %.2f) 
az:%.2f  el:%.2f  tw::%.2f",
+                     ustr,
+                     gdvp->gdv_view->gv_size * 
gop->go_gedp->ged_wdbp->dbip->dbi_base2local,
+                     V3ARGS(center),
+                     V3ARGS(gdvp->gdv_view->gv_aet));
+       (void)dm_set_fg(gdvp->gdv_dmp,
+                       gdvp->gdv_view->gv_view_params.gos_text_color[0],
+                       gdvp->gdv_view->gv_view_params.gos_text_color[1],
+                       gdvp->gdv_view->gv_view_params.gos_text_color[2],
+                       1, 1.0);
+       (void)dm_draw_string_2d(gdvp->gdv_dmp, bu_vls_addr(&vls), -0.98, 
-0.965, 10, 0);
+       bu_vls_free(&vls);
+    }
+
+    /* Draw the angle distance cursor */
+    if (gdvp->gdv_view->gv_adc.draw)
+       dm_draw_adc(gdvp->gdv_dmp, &(gdvp->gdv_view->gv_adc), 
gdvp->gdv_view->gv_view2model, gdvp->gdv_view->gv_model2view);
+
+    /* Draw grid */
+    if (gdvp->gdv_view->gv_grid.draw)
+       dm_draw_grid(gdvp->gdv_dmp, &gdvp->gdv_view->gv_grid, 
gdvp->gdv_view->gv_scale, gdvp->gdv_view->gv_model2view, 
gdvp->gdv_gop->go_gedp->ged_wdbp->dbip->dbi_base2local);
+
+    /* Draw rect */
+    if (gdvp->gdv_view->gv_rect.draw && gdvp->gdv_view->gv_rect.line_width)
+       dm_draw_rect(gdvp->gdv_dmp, &gdvp->gdv_view->gv_rect);
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * c-file-style: "stroustrup"
+ * End:
+ * ex: shiftwidth=4 tabstop=8
+ */


Property changes on: brlcad/trunk/src/libtclcad/view/faceplate.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
Added: brlcad/trunk/src/libtclcad/view/labels.c
===================================================================
--- brlcad/trunk/src/libtclcad/view/labels.c                            (rev 0)
+++ brlcad/trunk/src/libtclcad/view/labels.c    2020-07-15 01:30:45 UTC (rev 
76346)
@@ -0,0 +1,385 @@
+/*                       L A B E L S . C
+ * BRL-CAD
+ *
+ * Copyright (c) 2000-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.
+ */
+/** @addtogroup libtclcad */
+/** @{ */
+/** @file libtclcad/view/labels.c
+ *
+ */
+/** @} */
+
+#include "common.h"
+#include "bu/units.h"
+#include "ged.h"
+#include "tclcad.h"
+
+/* Private headers */
+#include "../tclcad_private.h"
+#include "../view/view.h"
+
+int
+go_data_labels(Tcl_Interp *interp,
+              struct ged *gedp,
+              struct ged_dm_view *gdvp,
+              int argc,
+              const char *argv[],
+              const char *usage)
+{
+    int ret;
+
+    /* 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 < 2 || 5 < argc) {
+       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return GED_ERROR;
+    }
+
+    /* Don't allow go_refresh() to be called */
+    if (current_top != NULL)
+       current_top->to_gop->go_refresh_on = 0;
+
+    ret = to_data_labels_func(interp, gedp, gdvp, argc, argv);
+    if (ret == GED_ERROR)
+       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+
+    return ret;
+}
+
+
+int
+to_data_labels(struct ged *gedp,
+              int argc,
+              const char *argv[],
+              ged_func_ptr UNUSED(func),
+              const char *usage,
+              int UNUSED(maxargs))
+{
+    struct ged_dm_view *gdvp;
+    int ret;
+
+    /* 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 < 3 || 6 < argc) {
+       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+       return GED_ERROR;
+    }
+
+    for (BU_LIST_FOR(gdvp, ged_dm_view, 
&current_top->to_gop->go_head_views.l)) {
+       if (BU_STR_EQUAL(bu_vls_addr(&gdvp->gdv_name), argv[1]))
+           break;
+    }
+
+    if (BU_LIST_IS_HEAD(&gdvp->l, &current_top->to_gop->go_head_views.l)) {
+       bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]);
+       return GED_ERROR;
+    }
+
+    /* shift the command name to argv[1] before calling to_data_labels_func */
+    argv[1] = argv[0];
+    ret = to_data_labels_func(current_top->to_interp, gedp, gdvp, argc-1, 
argv+1);
+    if (ret == GED_ERROR)
+       bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage);
+
+    return ret;
+}
+
+
+int
+to_data_labels_func(Tcl_Interp *interp,
+                   struct ged *gedp,
+                   struct ged_dm_view *gdvp,
+                   int argc,
+                   const char *argv[])
+{
+    struct bview_data_label_state *gdlsp;
+
+    if (argv[0][0] == 's')
+       gdlsp = &gdvp->gdv_view->gv_sdata_labels;
+    else
+       gdlsp = &gdvp->gdv_view->gv_data_labels;
+
+    if (BU_STR_EQUAL(argv[1], "draw")) {
+       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)
+               goto bad;
+
+           if (i)
+               gdlsp->gdls_draw = 1;
+           else
+               gdlsp->gdls_draw = 0;
+
+           to_refresh_view(gdvp);
+           return GED_OK;
+       }
+
+       goto bad;
+    }
+
+    if (BU_STR_EQUAL(argv[1], "color")) {
+       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)
+               goto bad;
+
+           /* validate color */
+           if (r < 0 || 255 < r ||
+               g < 0 || 255 < g ||
+               b < 0 || 255 < b)
+               goto bad;
+
+           VSET(gdlsp->gdls_color, r, g, b);
+
+           to_refresh_view(gdvp);
+           return GED_OK;
+       }
+
+       goto bad;
+    }
+
+    if (BU_STR_EQUAL(argv[1], "labels")) {
+       register int i;
+
+       /* { {{label this} {0 0 0}} {{label that} {100 100 100}} }*/
+
+       if (argc == 2) {
+           for (i = 0; i < gdlsp->gdls_num_labels; ++i) {
+               bu_vls_printf(gedp->ged_result_str, "{{%s}", 
gdlsp->gdls_labels[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 (Tcl_SplitList(interp, argv[2], &ac, &av) != TCL_OK) {
+               bu_vls_printf(gedp->ged_result_str, "%s", 
Tcl_GetStringResult(interp));
+               return GED_ERROR;
+           }
+
+           if (gdlsp->gdls_num_labels) {
+               for (i = 0; i < gdlsp->gdls_num_labels; ++i)
+                   bu_free((void *)gdlsp->gdls_labels[i], "data label");
+
+               bu_free((void *)gdlsp->gdls_labels, "data labels");
+               bu_free((void *)gdlsp->gdls_points, "data points");
+               gdlsp->gdls_labels = (char **)0;
+               gdlsp->gdls_points = (point_t *)0;
+               gdlsp->gdls_num_labels = 0;
+           }
+
+           /* Clear out data points */
+           if (ac < 1) {
+               Tcl_Free((char *)av);
+               to_refresh_view(gdvp);
+               return GED_OK;
+           }
+
+           gdlsp->gdls_num_labels = ac;
+           gdlsp->gdls_labels = (char **)bu_calloc(ac, sizeof(char *), "data 
labels");
+           gdlsp->gdls_points = (point_t *)bu_calloc(ac, sizeof(point_t), 
"data points");
+           for (i = 0; i < ac; ++i) {
+               int sub_ac;
+               const char **sub_av;
+               double scan[ELEMENTS_PER_VECT];
+
+               if (Tcl_SplitList(interp, av[i], &sub_ac, &sub_av) != TCL_OK) {
+                   /*XXX Need a macro for the following lines. Do something 
similar for the rest. */
+                   bu_free((void *)gdlsp->gdls_labels, "data labels");
+                   bu_free((void *)gdlsp->gdls_points, "data points");
+                   gdlsp->gdls_labels = (char **)0;
+                   gdlsp->gdls_points = (point_t *)0;
+                   gdlsp->gdls_num_labels = 0;
+
+                   bu_vls_printf(gedp->ged_result_str, "%s", 
Tcl_GetStringResult(interp));
+                   Tcl_Free((char *)av);
+                   to_refresh_view(gdvp);
+                   return GED_ERROR;
+               }
+
+               if (sub_ac != 2) {
+                   /*XXX Need a macro for the following lines. Do something 
similar for the rest. */
+                   bu_free((void *)gdlsp->gdls_labels, "data labels");
+                   bu_free((void *)gdlsp->gdls_points, "data points");
+                   gdlsp->gdls_labels = (char **)0;
+                   gdlsp->gdls_points = (point_t *)0;
+                   gdlsp->gdls_num_labels = 0;
+
+                   bu_vls_printf(gedp->ged_result_str, "Each list element must 
contain a label and a point (i.e. {{some label} {0 0 0}})");
+                   Tcl_Free((char *)sub_av);
+                   Tcl_Free((char *)av);
+                   to_refresh_view(gdvp);
+                   return GED_ERROR;
+               }
+
+               if (bu_sscanf(sub_av[1], "%lf %lf %lf", &scan[X], &scan[Y], 
&scan[Z]) != 3) {
+                   bu_vls_printf(gedp->ged_result_str, "bad data point - 
%s\n", sub_av[1]);
+
+                   /*XXX Need a macro for the following lines. Do something 
similar for the rest. */
+                   bu_free((void *)gdlsp->gdls_labels, "data labels");
+                   bu_free((void *)gdlsp->gdls_points, "data points");
+                   gdlsp->gdls_labels = (char **)0;
+                   gdlsp->gdls_points = (point_t *)0;
+                   gdlsp->gdls_num_labels = 0;
+
+                   Tcl_Free((char *)sub_av);
+                   Tcl_Free((char *)av);
+                   to_refresh_view(gdvp);
+                   return GED_ERROR;
+               }
+               /* convert double to fastf_t */
+               VMOVE(gdlsp->gdls_points[i], scan);
+
+               gdlsp->gdls_labels[i] = bu_strdup(sub_av[0]);
+               Tcl_Free((char *)sub_av);
+           }
+
+           Tcl_Free((char *)av);
+           to_refresh_view(gdvp);
+           return GED_OK;
+       }
+    }
+
+    if (BU_STR_EQUAL(argv[1], "size")) {
+       if (argc == 2) {
+           bu_vls_printf(gedp->ged_result_str, "%d", gdlsp->gdls_size);
+           return GED_OK;
+       }
+
+       if (argc == 3) {
+           int size;
+
+           if (bu_sscanf(argv[2], "%d", &size) != 1)
+               goto bad;
+
+           gdlsp->gdls_size = size;
+
+           to_refresh_view(gdvp);
+           return GED_OK;
+       }
+
+       goto bad;
+    }
+
+
+bad:
+    return GED_ERROR;
+}
+
+void
+go_dm_draw_labels(struct dm *dmp, struct bview_data_label_state *gdlsp, matp_t 
m2vmat)
+{
+    register int i;
+
+    /* set color */
+    (void)dm_set_fg(dmp,
+                   gdlsp->gdls_color[0],
+                   gdlsp->gdls_color[1],
+                   gdlsp->gdls_color[2], 1, 1.0);
+
+    for (i = 0; i < gdlsp->gdls_num_labels; ++i) {
+       point_t vpoint;
+
+       MAT4X3PNT(vpoint, m2vmat,
+                 gdlsp->gdls_points[i]);
+       (void)dm_draw_string_2d(dmp, gdlsp->gdls_labels[i],
+                               vpoint[X], vpoint[Y], 0, 1);
+    }
+}
+
+int
+to_prim_label(struct ged *gedp,
+             int argc,
+             const char *argv[],
+             ged_func_ptr UNUSED(func),
+             const char *UNUSED(usage),
+             int UNUSED(maxargs))
+{
+    register int i;
+
+    /* initialize result */
+    bu_vls_trunc(gedp->ged_result_str, 0);
+
+    /* Free the previous list of primitives scheduled for labeling */
+    if (current_top->to_gop->go_prim_label_list_size) {
+       for (i = 0; i < current_top->to_gop->go_prim_label_list_size; ++i)
+           bu_vls_free(&current_top->to_gop->go_prim_label_list[i]);
+       bu_free((void *)current_top->to_gop->go_prim_label_list, "prim_label");
+       current_top->to_gop->go_prim_label_list = (struct bu_vls *)0;
+    }
+
+    /* Set the list of primitives scheduled for labeling */
+    current_top->to_gop->go_prim_label_list_size = argc - 1;
+    if (current_top->to_gop->go_prim_label_list_size < 1)
+       return GED_OK;
+
+    current_top->to_gop->go_prim_label_list = (struct bu_vls 
*)bu_calloc(current_top->to_gop->go_prim_label_list_size,
+                                                                        
sizeof(struct bu_vls), "prim_label");
+    for (i = 0; i < current_top->to_gop->go_prim_label_list_size; ++i) {
+       bu_vls_init(&current_top->to_gop->go_prim_label_list[i]);
+       bu_vls_printf(&current_top->to_gop->go_prim_label_list[i], "%s", 
argv[i+1]);
+    }
+
+    return GED_OK;
+}
+
+
+
+/*
+ * Local Variables:
+ * mode: C
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * c-file-style: "stroustrup"
+ * End:
+ * ex: shiftwidth=4 tabstop=8
+ */


Property changes on: brlcad/trunk/src/libtclcad/view/labels.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/libtclcad/view/tclcad_views.c
===================================================================
--- brlcad/trunk/src/libtclcad/view/tclcad_views.c      2020-07-15 01:11:01 UTC 
(rev 76345)
+++ brlcad/trunk/src/libtclcad/view/tclcad_views.c      2020-07-15 01:30:45 UTC 
(rev 76346)
@@ -39,12 +39,6 @@
 #include "../view/view.h"
 
 
-struct path_match_data {
-    struct db_full_path *s_fpath;
-    struct db_i *dbip;
-};
-
-
 fastf_t
 screen_to_view_x(struct dm *dmp, fastf_t x)
 {
@@ -91,413 +85,6 @@
     return 1;
 }
 
-static void
-go_draw_faceplate(struct ged_obj *gop, struct ged_dm_view *gdvp)
-{
-    /* Center dot */
-    if (gdvp->gdv_view->gv_center_dot.gos_draw) {
-       (void)dm_set_fg(gdvp->gdv_dmp,
-                       gdvp->gdv_view->gv_center_dot.gos_line_color[0],
-                       gdvp->gdv_view->gv_center_dot.gos_line_color[1],
-                       gdvp->gdv_view->gv_center_dot.gos_line_color[2],
-                       1, 1.0);
-       (void)dm_draw_point_2d(gdvp->gdv_dmp, 0.0, 0.0);
-    }
-
-    /* Model axes */
-    if (gdvp->gdv_view->gv_model_axes.draw) {
-       point_t map;
-       point_t save_map;
-
-       VMOVE(save_map, gdvp->gdv_view->gv_model_axes.axes_pos);
-       VSCALE(map, gdvp->gdv_view->gv_model_axes.axes_pos, 
gop->go_gedp->ged_wdbp->dbip->dbi_local2base);
-       MAT4X3PNT(gdvp->gdv_view->gv_model_axes.axes_pos, 
gdvp->gdv_view->gv_model2view, map);
-
-       dm_draw_axes(gdvp->gdv_dmp,
-                    gdvp->gdv_view->gv_size,
-                    gdvp->gdv_view->gv_rotation,
-                    &gdvp->gdv_view->gv_model_axes);
-
-       VMOVE(gdvp->gdv_view->gv_model_axes.axes_pos, save_map);
-    }
-
-    /* View axes */
-    if (gdvp->gdv_view->gv_view_axes.draw) {
-       int width, height;
-       fastf_t inv_aspect;
-       fastf_t save_ypos;
-
-       save_ypos = gdvp->gdv_view->gv_view_axes.axes_pos[Y];
-       width = dm_get_width(gdvp->gdv_dmp);
-       height = dm_get_height(gdvp->gdv_dmp);
-       inv_aspect = (fastf_t)height / (fastf_t)width;
-       gdvp->gdv_view->gv_view_axes.axes_pos[Y] = save_ypos * inv_aspect;
-       dm_draw_axes(gdvp->gdv_dmp,
-                    gdvp->gdv_view->gv_size,
-                    gdvp->gdv_view->gv_rotation,
-                    &gdvp->gdv_view->gv_view_axes);
-
-       gdvp->gdv_view->gv_view_axes.axes_pos[Y] = save_ypos;
-    }
-
-
-    /* View scale */
-    if (gdvp->gdv_view->gv_view_scale.gos_draw)
-       dm_draw_scale(gdvp->gdv_dmp,
-                     
gdvp->gdv_view->gv_size*gop->go_gedp->ged_wdbp->dbip->dbi_base2local,
-                     
bu_units_string(1/gop->go_gedp->ged_wdbp->dbip->dbi_base2local),
-                     gdvp->gdv_view->gv_view_scale.gos_line_color,
-                     gdvp->gdv_view->gv_view_params.gos_text_color);
-
-    /* View parameters */
-    if (gdvp->gdv_view->gv_view_params.gos_draw) {
-       struct bu_vls vls = BU_VLS_INIT_ZERO;
-       point_t center;
-       char *ustr;
-
-       MAT_DELTAS_GET_NEG(center, gdvp->gdv_view->gv_center);
-       VSCALE(center, center, gop->go_gedp->ged_wdbp->dbip->dbi_base2local);
-
-       ustr = (char 
*)bu_units_string(gop->go_gedp->ged_wdbp->dbip->dbi_local2base);
-       bu_vls_printf(&vls, "units:%s  size:%.2f  center:(%.2f, %.2f, %.2f) 
az:%.2f  el:%.2f  tw::%.2f",
-                     ustr,
-                     gdvp->gdv_view->gv_size * 
gop->go_gedp->ged_wdbp->dbip->dbi_base2local,
-                     V3ARGS(center),
-                     V3ARGS(gdvp->gdv_view->gv_aet));
-       (void)dm_set_fg(gdvp->gdv_dmp,
-                       gdvp->gdv_view->gv_view_params.gos_text_color[0],
-                       gdvp->gdv_view->gv_view_params.gos_text_color[1],
-                       gdvp->gdv_view->gv_view_params.gos_text_color[2],
-                       1, 1.0);
-       (void)dm_draw_string_2d(gdvp->gdv_dmp, bu_vls_addr(&vls), -0.98, 
-0.965, 10, 0);
-       bu_vls_free(&vls);
-    }
-
-    /* Draw the angle distance cursor */
-    if (gdvp->gdv_view->gv_adc.draw)
-       dm_draw_adc(gdvp->gdv_dmp, &(gdvp->gdv_view->gv_adc), 
gdvp->gdv_view->gv_view2model, gdvp->gdv_view->gv_model2view);
-
-    /* Draw grid */
-    if (gdvp->gdv_view->gv_grid.draw)
-       dm_draw_grid(gdvp->gdv_dmp, &gdvp->gdv_view->gv_grid, 
gdvp->gdv_view->gv_scale, gdvp->gdv_view->gv_model2view, 
gdvp->gdv_gop->go_gedp->ged_wdbp->dbip->dbi_base2local);
-
-    /* Draw rect */
-    if (gdvp->gdv_view->gv_rect.draw && gdvp->gdv_view->gv_rect.line_width)
-       dm_draw_rect(gdvp->gdv_dmp, &gdvp->gdv_view->gv_rect);
-}
-
-static struct bu_hash_entry *
-key_matches_paths(struct bu_hash_tbl *t, void *udata)
-{
-    struct path_match_data *data = (struct path_match_data *)udata;
-    struct db_full_path entry_fpath;
-    uint8_t *key;
-    char *path_string;
-    struct bu_hash_entry *entry = bu_hash_next(t, NULL);
-
-    while (entry) {
-       (void)bu_hash_key(entry, &key, NULL);
-       path_string = (char *)key;
-       if (db_string_to_path(&entry_fpath, data->dbip, path_string) < 0) {
-           continue;
-       }
-
-       if (db_full_path_match_top(&entry_fpath, data->s_fpath)) {
-           db_free_full_path(&entry_fpath);
-           return entry;
-       }
-
-       db_free_full_path(&entry_fpath);
-       entry = bu_hash_next(t, entry);
-    }
-
-    return NULL;
-}
-
-static void
-go_draw_solid(struct ged_dm_view *gdvp, struct solid *sp)
-{
-    struct ged_obj *gop = gdvp->gdv_gop;
-    struct dm *dmp = gdvp->gdv_dmp;
-    struct bu_hash_entry *entry;
-    struct path_edit_params *params = NULL;
-    mat_t save_mat, edit_model2view;
-    struct path_match_data data;
-
-    data.s_fpath = &sp->s_fullpath;
-    data.dbip = gop->go_gedp->ged_wdbp->dbip;
-    entry = key_matches_paths(gop->go_edited_paths, &data);
-
-    if (entry != NULL) {
-       params = (struct path_edit_params *)bu_hash_value(entry, NULL);
-    }
-    if (params) {
-       MAT_COPY(save_mat, gdvp->gdv_view->gv_model2view);
-       bn_mat_mul(edit_model2view, gdvp->gdv_view->gv_model2view, 
params->edit_mat);
-       dm_loadmatrix(dmp, edit_model2view, 0);
-    }
-
-    if (gop->go_dlist_on) {
-       dm_draw_dlist(dmp, sp->s_dlist);
-    } else {
-       if (sp->s_iflag == UP)
-           (void)dm_set_fg(dmp, 255, 255, 255, 0, sp->s_transparency);
-       else
-           (void)dm_set_fg(dmp,
-                           (unsigned char)sp->s_color[0],
-                           (unsigned char)sp->s_color[1],
-                           (unsigned char)sp->s_color[2], 0, 
sp->s_transparency);
-
-       if (sp->s_hiddenLine) {
-           (void)dm_draw_vlist_hidden_line(dmp, (struct bn_vlist 
*)&sp->s_vlist);
-       } else {
-           (void)dm_draw_vlist(dmp, (struct bn_vlist *)&sp->s_vlist);
-       }
-    }
-    if (params) {
-       dm_loadmatrix(dmp, save_mat, 0);
-    }
-}
-
-/* Draw all display lists */
-static int
-go_draw_dlist(struct ged_dm_view *gdvp)
-{
-    register struct display_list *gdlp;
-    register struct display_list *next_gdlp;
-    struct solid *sp;
-    int line_style = -1;
-    struct dm *dmp = gdvp->gdv_dmp;
-    struct bu_list *hdlp = gdvp->gdv_gop->go_gedp->ged_gdp->gd_headDisplay;
-
-    if (dm_get_transparency(dmp)) {
-       /* First, draw opaque stuff */
-       gdlp = BU_LIST_NEXT(display_list, hdlp);
-       while (BU_LIST_NOT_HEAD(gdlp, hdlp)) {
-           next_gdlp = BU_LIST_PNEXT(display_list, gdlp);
-
-           FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) {
-               if (sp->s_transparency < 1.0)
-                   continue;
-
-               if (line_style != sp->s_soldash) {
-                   line_style = sp->s_soldash;
-                   (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), 
line_style);
-               }
-
-               go_draw_solid(gdvp, sp);
-           }
-
-           gdlp = next_gdlp;
-       }
-
-       /* disable write to depth buffer */
-       (void)dm_set_depth_mask(dmp, 0);
-
-       /* Second, draw transparent stuff */
-       gdlp = BU_LIST_NEXT(display_list, hdlp);
-       while (BU_LIST_NOT_HEAD(gdlp, hdlp)) {
-           next_gdlp = BU_LIST_PNEXT(display_list, gdlp);
-
-           FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) {
-               /* already drawn above */
-               if (ZERO(sp->s_transparency - 1.0))
-                   continue;
-
-               if (line_style != sp->s_soldash) {
-                   line_style = sp->s_soldash;
-                   (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), 
line_style);
-               }
-
-               go_draw_solid(gdvp, sp);
-           }
-
-           gdlp = next_gdlp;
-       }
-
-       /* re-enable write to depth buffer */
-       (void)dm_set_depth_mask(dmp, 1);
-    } else {
-       gdlp = BU_LIST_NEXT(display_list, hdlp);
-       while (BU_LIST_NOT_HEAD(gdlp, hdlp)) {
-           next_gdlp = BU_LIST_PNEXT(display_list, gdlp);
-
-           FOR_ALL_SOLIDS(sp, &gdlp->dl_headSolid) {
-               if (line_style != sp->s_soldash) {
-                   line_style = sp->s_soldash;
-                   (void)dm_set_line_attr(dmp, dm_get_linewidth(dmp), 
line_style);
-               }
-
-               go_draw_solid(gdvp, sp);
-           }
-
-           gdlp = next_gdlp;
-       }
-    }
-
-    return GED_OK;
-}
-
-void
-go_draw(struct ged_dm_view *gdvp)
-{
-    (void)dm_loadmatrix(gdvp->gdv_dmp, gdvp->gdv_view->gv_model2view, 0);
-
-    if (SMALL_FASTF < gdvp->gdv_view->gv_perspective)
-       (void)dm_loadpmatrix(gdvp->gdv_dmp, gdvp->gdv_view->gv_pmat);
-    else
-       (void)dm_loadpmatrix(gdvp->gdv_dmp, (fastf_t *)NULL);
-
-    go_draw_dlist(gdvp);
-}
-
-
-#define GO_DM_DRAW_POLY(_dmp, _gdpsp, _i, _last_poly, _mode) { \
-       size_t _j; \
-       \
-       /* set color */ \
-       (void)dm_set_fg((_dmp), \
-                       (_gdpsp)->gdps_polygons.polygon[_i].gp_color[0], \
-                       (_gdpsp)->gdps_polygons.polygon[_i].gp_color[1], \
-                       (_gdpsp)->gdps_polygons.polygon[_i].gp_color[2], \
-                       1, 1.0);                                        \
-       \
-       for (_j = 0; _j < (_gdpsp)->gdps_polygons.polygon[_i].num_contours; 
++_j) { \
-           size_t _last = 
(_gdpsp)->gdps_polygons.polygon[_i].contour[_j].num_points-1; \
-           int _line_style; \
-           \
-           /* always draw holes using segmented lines */ \
-           if ((_gdpsp)->gdps_polygons.polygon[_i].hole[_j]) { \
-               _line_style = 1; \
-           } else { \
-               _line_style = 
(_gdpsp)->gdps_polygons.polygon[_i].gp_line_style; \
-           } \
-           \
-           /* set the linewidth and linestyle for polygon i, contour j */      
\
-           (void)dm_set_line_attr((_dmp), \
-                                  
(_gdpsp)->gdps_polygons.polygon[_i].gp_line_width, \
-                                  _line_style); \
-           \
-           (void)dm_draw_lines_3d((_dmp),                              \
-                                  
(_gdpsp)->gdps_polygons.polygon[_i].contour[_j].num_points, \
-                                  
(_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point, 1); \
-           \
-           if (_mode != TCLCAD_POLY_CONTOUR_MODE || _i != _last_poly || 
(_gdpsp)->gdps_cflag == 0) { \
-               (void)dm_draw_line_3d((_dmp),                           \
-                                     
(_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point[_last], \
-                                     
(_gdpsp)->gdps_polygons.polygon[_i].contour[_j].point[0]); \
-           } \
-       }}
-
-
-static void
-go_dm_draw_polys(struct dm *dmp, bview_data_polygon_state *gdpsp, int mode)
-{
-    register size_t i, last_poly;
-    int saveLineWidth;
-    int saveLineStyle;
-
-    if (gdpsp->gdps_polygons.num_polygons < 1)
-       return;
-
-    saveLineWidth = dm_get_linewidth(dmp);
-    saveLineStyle = dm_get_linestyle(dmp);
-
-    last_poly = gdpsp->gdps_polygons.num_polygons - 1;
-    for (i = 0; i < gdpsp->gdps_polygons.num_polygons; ++i) {
-       if (i == gdpsp->gdps_target_polygon_i)
-           continue;
-
-       GO_DM_DRAW_POLY(dmp, gdpsp, i, last_poly, mode);
-    }
-
-    /* draw the target poly last */
-    GO_DM_DRAW_POLY(dmp, gdpsp, gdpsp->gdps_target_polygon_i, last_poly, mode);
-
-    /* Restore the line attributes */
-    (void)dm_set_line_attr(dmp, saveLineWidth, saveLineStyle);
-}
-
-static void
-go_dm_draw_labels(struct dm *dmp, struct bview_data_label_state *gdlsp, matp_t 
m2vmat)
-{
-    register int i;
-
-    /* set color */
-    (void)dm_set_fg(dmp,
-                   gdlsp->gdls_color[0],
-                   gdlsp->gdls_color[1],
-                   gdlsp->gdls_color[2], 1, 1.0);
-
-    for (i = 0; i < gdlsp->gdls_num_labels; ++i) {
-       point_t vpoint;
-
-       MAT4X3PNT(vpoint, m2vmat,
-                 gdlsp->gdls_points[i]);
-       (void)dm_draw_string_2d(dmp, gdlsp->gdls_labels[i],
-                               vpoint[X], vpoint[Y], 0, 1);
-    }
-}
-
-void
-go_draw_other(struct ged_obj *gop, struct ged_dm_view *gdvp)
-{
-    int width = dm_get_width(gdvp->gdv_dmp);
-    fastf_t sf = (fastf_t)(gdvp->gdv_view->gv_size) / (fastf_t)width;
-
-    if (gdvp->gdv_view->gv_data_arrows.gdas_draw)
-       go_dm_draw_arrows(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_arrows, sf);
-
-    if (gdvp->gdv_view->gv_sdata_arrows.gdas_draw)
-       go_dm_draw_arrows(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_arrows, sf);
-
-    if (gdvp->gdv_view->gv_data_axes.draw)
-       dm_draw_data_axes(gdvp->gdv_dmp,
-                         sf,
-                         &gdvp->gdv_view->gv_data_axes);
-
-    if (gdvp->gdv_view->gv_sdata_axes.draw)
-       dm_draw_data_axes(gdvp->gdv_dmp,
-                         sf,
-                         &gdvp->gdv_view->gv_sdata_axes);
-
-    if (gdvp->gdv_view->gv_data_lines.gdls_draw)
-       go_dm_draw_lines(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_lines);
-
-    if (gdvp->gdv_view->gv_sdata_lines.gdls_draw)
-       go_dm_draw_lines(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_lines);
-
-    if (gdvp->gdv_view->gv_data_polygons.gdps_draw)
-       go_dm_draw_polys(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_polygons, 
gdvp->gdv_view->gv_mode);
-
-    if (gdvp->gdv_view->gv_sdata_polygons.gdps_draw)
-       go_dm_draw_polys(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_polygons, 
gdvp->gdv_view->gv_mode);
-
-    /* Restore to non-rotated, full brightness */
-    (void)dm_normal(gdvp->gdv_dmp);
-    go_draw_faceplate(gop, gdvp);
-
-    if (gdvp->gdv_view->gv_data_labels.gdls_draw)
-       go_dm_draw_labels(gdvp->gdv_dmp, &gdvp->gdv_view->gv_data_labels, 
gdvp->gdv_view->gv_model2view);
-
-    if (gdvp->gdv_view->gv_sdata_labels.gdls_draw)
-       go_dm_draw_labels(gdvp->gdv_dmp, &gdvp->gdv_view->gv_sdata_labels, 
gdvp->gdv_view->gv_model2view);
-
-    /* Draw labels */
-    if (gdvp->gdv_view->gv_prim_labels.gos_draw) {
-       register int i;
-
-       for (i = 0; i < gop->go_prim_label_list_size; ++i) {
-           dm_draw_labels(gdvp->gdv_dmp,
-                          gop->go_gedp->ged_wdbp,
-                          bu_vls_addr(&gop->go_prim_label_list[i]),
-                          gdvp->gdv_view->gv_model2view,
-                          gdvp->gdv_view->gv_prim_labels.gos_text_color,
-                          NULL, NULL);
-       }
-    }
-}
-
 /*
  * Local Variables:
  * mode: C

Modified: brlcad/trunk/src/libtclcad/view/view.h
===================================================================
--- brlcad/trunk/src/libtclcad/view/view.h      2020-07-15 01:11:01 UTC (rev 
76345)
+++ brlcad/trunk/src/libtclcad/view/view.h      2020-07-15 01:30:45 UTC (rev 
76346)
@@ -24,6 +24,7 @@
  */
 
 #include "common.h"
+#include "vmath.h"
 #include "ged.h"
 #include "tclcad.h"
 
@@ -84,7 +85,47 @@
                        const char *usage,
                        int maxargs);
 
+/* Draw */
+extern void go_draw(struct ged_dm_view *gdvp);
+extern void go_draw_other(struct ged_obj *gop, struct ged_dm_view *gdvp);
+extern int to_edit_redraw(struct ged *gedp, int argc, const char *argv[]);
+extern int to_redraw(struct ged *gedp,
+                    int argc,
+                    const char *argv[],
+                    ged_func_ptr func,
+                    const char *usage,
+                    int maxargs);
 
+/* Faceplate */
+extern void go_draw_faceplate(struct ged_obj *gop, struct ged_dm_view *gdvp);
+extern int to_faceplate(struct ged *gedp,
+                       int argc,
+                       const char *argv[],
+                       ged_func_ptr func,
+                       const char *usage,
+                       int maxargs);
+
+
+/* Labels */
+extern void go_dm_draw_labels(struct dm *dmp, struct bview_data_label_state 
*gdlsp, matp_t m2vmat);
+extern int to_data_labels(struct ged *gedp,
+                         int argc,
+                         const char *argv[],
+                         ged_func_ptr func,
+                         const char *usage,
+                         int maxargs);
+extern int to_data_labels_func(Tcl_Interp *interp,
+                              struct ged *gedp,
+                              struct ged_dm_view *gdvp,
+                              int argc,
+                              const char *argv[]);
+extern int to_prim_label(struct ged *gedp,
+                        int argc,
+                        const char *argv[],
+                        ged_func_ptr func,
+                        const char *usage,
+                        int maxargs);
+
 /* Lines */
 void go_dm_draw_lines(struct dm *dmp, struct bview_data_line_state *gdlsp);
 int to_data_lines(struct ged *gedp,

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