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,
¤t_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, ¤t_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,
¤t_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, ¤t_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(¤t_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(¤t_top->to_gop->go_prim_label_list[i]);
- bu_vls_printf(¤t_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,
¤t_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, ¤t_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,
¤t_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, ¤t_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(¤t_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(¤t_top->to_gop->go_prim_label_list[i]);
+ bu_vls_printf(¤t_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