diff --git a/src/mged/CMakeLists.txt b/src/mged/CMakeLists.txt index fb504f3d91..14f91b299e 100644 --- a/src/mged/CMakeLists.txt +++ b/src/mged/CMakeLists.txt @@ -14,17 +14,14 @@ set( chgmodel.c chgtree.c chgview.c - cmd.c clone.c + cmd.c color_scheme.c columns.c dm-generic.c dodraw.c doevent.c dozoom.c - edarb.c - edars.c - edpipe.c edsol.c f_db.c facedef.c @@ -34,6 +31,7 @@ set( mater.c menu.c mged.c + mged_impl.cpp mover.c overlay.c plot.c @@ -76,12 +74,15 @@ set( # but I'm not sure if that would be a problem for scripting with mged.exe on # Windows so leave it for now... if(BRLCAD_ENABLE_TCL) - set(MGED_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../libtermio) + set(MGED_INCLUDE_DIRS + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../libtermio + ) brlcad_addexec(mged "${MGED_SOURCES}" "${mged_libs}") if(TK_LIBRARY) target_compile_definitions(mged PRIVATE HAVE_TK=1) endif(TK_LIBRARY) - target_include_directories(mged BEFORE PRIVATE ${MGED_INCLUDE_DIRS}) + target_include_directories(mged BEFORE PRIVATE ${MGED_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR}) add_target_deps(mged Tkhtml Tktable itcl_pkgIndex itk_pkgIndex TclIndexBld dm_plugins) # MGED needs the tclIndex and pkgIndex files set up correctly @@ -108,17 +109,20 @@ set( f_cmd.h menu.h mged.h + mged.ico + mged.rc mged_dm.h + mged_impl.h mged_wdb.h sedit.h - mged.ico - mged.rc ) cmakefiles(${mged_ignore_files}) + # Local Variables: # tab-width: 8 # mode: cmake # indent-tabs-mode: t # End: # ex: shiftwidth=2 tabstop=8 + diff --git a/src/mged/attach.c b/src/mged/attach.c index 28c4b78f08..93f0729b8b 100644 --- a/src/mged/attach.c +++ b/src/mged/attach.c @@ -51,11 +51,13 @@ #include "./sedit.h" #include "./mged_dm.h" + +/* Ew. Globals. */ + /* Geometry display instances used by MGED */ struct bu_ptbl active_dm_set = BU_PTBL_INIT_ZERO; /* set of active display managers */ struct mged_dm *mged_dm_init_state = NULL; - extern struct _color_scheme default_color_scheme; extern void share_dlist(struct mged_dm *dlp2); /* defined in share.c */ int mged_default_dlist = 0; /* This variable is available via Tcl for controlling use of display lists */ diff --git a/src/mged/axes.c b/src/mged/axes.c index befc784430..be430de394 100644 --- a/src/mged/axes.c +++ b/src/mged/axes.c @@ -33,11 +33,6 @@ #include "./mged.h" #include "./mged_dm.h" - -extern point_t es_keypoint; -extern point_t e_axes_pos; -extern point_t curr_e_axes_pos; - /* local sp_hook function */ static void ax_set_dirty_flag(const struct bu_structparse *, const char *, void *, const char *, void *); @@ -105,14 +100,14 @@ draw_e_axes(struct mged_state *s) mat_t rot_mat; struct bv_axes gas; - if (GEOM_EDIT_STATE == ST_S_EDIT) { - MAT4X3PNT(v_ap1, view_state->vs_gvp->gv_model2view, e_axes_pos); - MAT4X3PNT(v_ap2, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - } else if (GEOM_EDIT_STATE == ST_O_EDIT) { + if (s->edit_state.global_editing_state == ST_S_EDIT) { + MAT4X3PNT(v_ap1, view_state->vs_gvp->gv_model2view, s->s_edit->e_axes_pos); + MAT4X3PNT(v_ap2, view_state->vs_gvp->gv_model2view, s->s_edit->curr_e_axes_pos); + } else if (s->edit_state.global_editing_state == ST_O_EDIT) { point_t m_ap2; - MAT4X3PNT(v_ap1, view_state->vs_gvp->gv_model2view, es_keypoint); - MAT4X3PNT(m_ap2, modelchanges, es_keypoint); + MAT4X3PNT(v_ap1, view_state->vs_gvp->gv_model2view, s->s_edit->e_keypoint); + MAT4X3PNT(m_ap2, s->s_edit->model_changes, s->s_edit->e_keypoint); MAT4X3PNT(v_ap2, view_state->vs_gvp->gv_model2view, m_ap2); } else return; @@ -135,7 +130,7 @@ draw_e_axes(struct mged_state *s) VMOVE(gas.label_color, color_scheme->cs_edit_axes_label2); gas.line_width = axes_state->ax_edit_linewidth2; - bn_mat_mul(rot_mat, view_state->vs_gvp->gv_rotation, acc_rot_sol); + bn_mat_mul(rot_mat, view_state->vs_gvp->gv_rotation, s->s_edit->acc_rot_sol); dm_draw_hud_axes(DMP, view_state->vs_gvp->gv_size, rot_mat, &gas); } diff --git a/src/mged/buttons.c b/src/mged/buttons.c index 3c3476611c..c6c54bbe7e 100644 --- a/src/mged/buttons.c +++ b/src/mged/buttons.c @@ -35,7 +35,6 @@ /* external sp_hook function */ extern void set_scroll_private(const struct bu_structparse *, const char *, void *, const char *, void *); /* defined in set.c */ -extern void set_e_axes_pos(struct mged_state *s, int both); extern int mged_zoom(struct mged_state *s, double val); extern void adc_set_scroll(struct mged_state *s); /* defined in adc.c */ @@ -89,14 +88,6 @@ static int edsol; int edobj; /* object editing */ int movedir; /* RARROW | UARROW | SARROW | ROTARROW */ -/* - * The "accumulation" solid rotation matrix and scale factor - */ -mat_t acc_rot_sol; -fastf_t acc_sc_sol; -fastf_t acc_sc_obj; /* global object scale factor --- accumulations */ -fastf_t acc_sc[3]; /* local object scale factors --- accumulations */ - /* flag to toggle whether we perform continuous motion tracking * (e.g., for a tablet) */ @@ -148,60 +139,6 @@ static fastf_t sav_vscale; static int vsaved = 0; /* set if view saved */ extern void mged_color_soltab(struct mged_state *s); -extern void sl_halt_scroll(struct mged_state *s, int, int, int); /* in scroll.c */ -extern void sl_toggle_scroll(struct mged_state *s, int, int, int); - -void btn_head_menu(struct mged_state *s, int i, int menu, int item); -void btn_item_hit(struct mged_state *s, int arg, int menu, int item); - -static struct menu_item first_menu[] = { - { "BUTTON MENU", btn_head_menu, 1 }, /* chg to 2nd menu */ - { "", NULL, 0 } -}; -struct menu_item second_menu[] = { - { "BUTTON MENU", btn_head_menu, 0 }, /* chg to 1st menu */ - { "REJECT Edit", btn_item_hit, BE_REJECT }, - { "ACCEPT Edit", btn_item_hit, BE_ACCEPT }, - { "35,25", btn_item_hit, BV_35_25 }, - { "Top", btn_item_hit, BV_TOP }, - { "Right", btn_item_hit, BV_RIGHT }, - { "Front", btn_item_hit, BV_FRONT }, - { "45,45", btn_item_hit, BV_45_45 }, - { "Restore View", btn_item_hit, BV_VRESTORE }, - { "Save View", btn_item_hit, BV_VSAVE }, - { "Ang/Dist Curs", btn_item_hit, BV_ADCURSOR }, - { "Reset Viewsize", btn_item_hit, BV_RESET }, - { "Zero Sliders", sl_halt_scroll, 0 }, - { "Sliders", sl_toggle_scroll, 0 }, - { "Rate/Abs", btn_item_hit, BV_RATE_TOGGLE }, - { "Zoom In 2X", btn_item_hit, BV_ZOOM_IN }, - { "Zoom Out 2X", btn_item_hit, BV_ZOOM_OUT }, - { "Primitive Illum", btn_item_hit, BE_S_ILLUMINATE }, - { "Matrix Illum", btn_item_hit, BE_O_ILLUMINATE }, - { "", NULL, 0 } -}; -struct menu_item sed_menu[] = { - { "*PRIMITIVE EDIT*", btn_head_menu, 2 }, - { "Edit Menu", btn_item_hit, BE_S_EDIT }, - { "Rotate", btn_item_hit, BE_S_ROTATE }, - { "Translate", btn_item_hit, BE_S_TRANS }, - { "Scale", btn_item_hit, BE_S_SCALE }, - { "", NULL, 0 } -}; - - -struct menu_item oed_menu[] = { - { "*MATRIX EDIT*", btn_head_menu, 2 }, - { "Scale", btn_item_hit, BE_O_SCALE }, - { "X Move", btn_item_hit, BE_O_X }, - { "Y Move", btn_item_hit, BE_O_Y }, - { "XY Move", btn_item_hit, BE_O_XY }, - { "Rotate", btn_item_hit, BE_O_ROTATE }, - { "Scale X", btn_item_hit, BE_O_XSCALE }, - { "Scale Y", btn_item_hit, BE_O_YSCALE }, - { "Scale Z", btn_item_hit, BE_O_ZSCALE }, - { "", NULL, 0 } -}; void @@ -257,9 +194,9 @@ f_press(ClientData clientData, for (i = 1; i < argc; i++) { const char *str = argv[i]; struct buttons *bp; - struct menu_item **m; + struct rt_solid_edit_menu_item **m; int menu, item; - struct menu_item *mptr; + struct rt_solid_edit_menu_item *mptr; if (edsol && edobj) { bu_vls_printf(&vls, "WARNING: State error: edsol=%x, edobj=%x\n", edsol, edobj); @@ -301,7 +238,7 @@ f_press(ClientData clientData, /* It's up to the menu_func to set menu_state->ms_flag = 0 * if no arrow is desired */ if (mptr->menu_func != NULL) - (*(mptr->menu_func))(s, mptr->menu_arg, menu, item); + (*(mptr->menu_func))(s->s_edit, mptr->menu_arg, menu, item, s); goto next; } @@ -586,8 +523,9 @@ ill_common(struct mged_state *s) { illump->s_iflag = UP; edobj = 0; /* sanity */ edsol = 0; /* sanity */ - movedir = 0; /* No edit modes set */ - MAT_IDN(modelchanges); /* No changes yet */ + movedir = 0; /* No edit modes set */ + if (s->s_edit) + MAT_IDN(s->s_edit->model_changes); /* No changes yet */ return 1; /* OK */ } @@ -607,10 +545,10 @@ be_o_illuminate(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(ar (void)chg_state(s, ST_VIEW, ST_O_PICK, "Matrix Illuminate"); } /* reset accumulation local scale factors */ - acc_sc[0] = acc_sc[1] = acc_sc[2] = 1.0; + s->edit_state.acc_sc[0] = s->edit_state.acc_sc[1] = s->edit_state.acc_sc[2] = 1.0; /* reset accumulation global scale factors */ - acc_sc_obj = 1.0; + s->edit_state.acc_sc_obj = 1.0; return TCL_OK; } @@ -644,13 +582,14 @@ be_o_scale(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), edobj = BE_O_SCALE; movedir = SARROW; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); - s->edit_state.edit_absolute_scale = acc_sc_obj - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc_obj - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; return TCL_OK; } @@ -667,13 +606,14 @@ be_o_xscale(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), edobj = BE_O_XSCALE; movedir = SARROW; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); - s->edit_state.edit_absolute_scale = acc_sc[0] - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc[0] - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; return TCL_OK; } @@ -690,13 +630,14 @@ be_o_yscale(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), edobj = BE_O_YSCALE; movedir = SARROW; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); - s->edit_state.edit_absolute_scale = acc_sc[1] - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc[1] - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; return TCL_OK; } @@ -713,13 +654,14 @@ be_o_zscale(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), edobj = BE_O_ZSCALE; movedir = SARROW; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); - s->edit_state.edit_absolute_scale = acc_sc[2] - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc[2] - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; return TCL_OK; } @@ -736,9 +678,10 @@ be_o_x(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), char edobj = BE_O_X; movedir = RARROW; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); return TCL_OK; } @@ -755,9 +698,10 @@ be_o_y(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), char edobj = BE_O_Y; movedir = UARROW; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); return TCL_OK; } @@ -774,9 +718,10 @@ be_o_xy(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), cha edobj = BE_O_XY; movedir = UARROW | RARROW; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); return TCL_OK; } @@ -793,9 +738,10 @@ be_o_rotate(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), edobj = BE_O_ROTATE; movedir = ROTARROW; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); return TCL_OK; } @@ -807,7 +753,7 @@ be_accept(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), c MGED_CK_CMD(ctp); struct mged_state *s = ctp->s; - if (GEOM_EDIT_STATE == ST_S_EDIT) { + if (s->edit_state.global_editing_state == ST_S_EDIT) { /* Accept a solid edit */ edsol = 0; @@ -822,7 +768,7 @@ be_accept(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), c illump = NULL; mged_color_soltab(s); (void)chg_state(s, ST_S_EDIT, ST_VIEW, "Edit Accept"); - } else if (GEOM_EDIT_STATE == ST_O_EDIT) { + } else if (s->edit_state.global_editing_state == ST_O_EDIT) { /* Accept an object edit */ edobj = 0; movedir = 0; /* No edit modes set */ @@ -865,12 +811,12 @@ be_reject(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), c MGED_CK_CMD(ctp); struct mged_state *s = ctp->s; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); /* Reject edit */ - switch (GEOM_EDIT_STATE) { + switch (s->edit_state.global_editing_state) { default: state_err(s, "Edit Reject"); return TCL_ERROR; @@ -900,7 +846,7 @@ be_reject(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), c movedir = 0; edsol = 0; edobj = 0; - es_edflag = -1; + rt_solid_edit_set_edflag(s->s_edit, -1); illum_gdlp = GED_DISPLAY_LIST_NULL; illump = NULL; /* None selected */ @@ -908,7 +854,7 @@ be_reject(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), c dl_set_iflag(s->gedp->ged_gdp->gd_headDisplay, DOWN); mged_color_soltab(s); - (void)chg_state(s, GEOM_EDIT_STATE, ST_VIEW, "Edit Reject"); + (void)chg_state(s, s->edit_state.global_editing_state, ST_VIEW, "Edit Reject"); for (size_t i = 0; i < BU_PTBL_LEN(&active_dm_set); i++) { struct mged_dm *m_dmp = (struct mged_dm *)BU_PTBL_GET(&active_dm_set, i); @@ -955,11 +901,12 @@ be_s_rotate(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), if (not_state(s, ST_S_EDIT, "Primitive Rotate")) return TCL_ERROR; - es_edflag = SROT; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_ROT); edsol = BE_S_ROTATE; mmenu_set(s, MENU_L1, NULL); - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); return TCL_OK; } @@ -976,11 +923,12 @@ be_s_trans(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), return TCL_ERROR; edsol = BE_S_TRANS; - es_edflag = STRANS; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_TRANS); movedir = UARROW | RARROW; mmenu_set(s, MENU_L1, NULL); - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); return TCL_OK; } @@ -997,11 +945,12 @@ be_s_scale(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), return TCL_ERROR; edsol = BE_S_SCALE; - es_edflag = SSCALE; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_SCALE); mmenu_set(s, MENU_L1, NULL); - acc_sc_sol = 1.0; + s->s_edit->acc_sc_sol = 1.0; - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); return TCL_OK; } @@ -1013,8 +962,8 @@ be_s_scale(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), int not_state(struct mged_state *s, int desired, char *str) { - if (GEOM_EDIT_STATE != desired) { - Tcl_AppendResult(s->interp, "Unable to do <", str, "> from ", state_str[GEOM_EDIT_STATE], " state.\n", (char *)NULL); + if (s->edit_state.global_editing_state != desired) { + Tcl_AppendResult(s->interp, "Unable to do <", str, "> from ", state_str[s->edit_state.global_editing_state], " state.\n", (char *)NULL); Tcl_AppendResult(s->interp, "Expecting ", state_str[desired], " state.\n", (char *)NULL); return -1; } @@ -1028,7 +977,7 @@ not_state(struct mged_state *s, int desired, char *str) * continuous tablet tracking, object highlighting. */ static void -stateChange(int UNUSED(oldstate), int newstate) +stateChange(struct mged_state *s, int UNUSED(oldstate), int newstate) { switch (newstate) { case ST_VIEW: @@ -1052,7 +1001,7 @@ stateChange(int UNUSED(oldstate), int newstate) break; } - ++update_views; + ++s->update_views; } @@ -1066,14 +1015,14 @@ chg_state(struct mged_state *s, int from, int to, char *str) struct mged_dm *save_dm_list; struct bu_vls vls = BU_VLS_INIT_ZERO; - if (GEOM_EDIT_STATE != from) { + if (s->edit_state.global_editing_state != from) { bu_log("Unable to do <%s> going from %s to %s state.\n", str, state_str[from], state_str[to]); return 1; /* BAD */ } - GEOM_EDIT_STATE = to; + s->edit_state.global_editing_state = to; - stateChange(from, to); + stateChange(s, from, to); save_dm_list = s->mged_curr_dm; for (size_t i = 0; i < BU_PTBL_LEN(&active_dm_set); i++) { @@ -1086,7 +1035,7 @@ chg_state(struct mged_state *s, int from, int to, char *str) set_curr_dm(s, save_dm_list); bu_vls_printf(&vls, "%s(state)", MGED_DISPLAY_VAR); - Tcl_SetVar(s->interp, bu_vls_addr(&vls), state_str[GEOM_EDIT_STATE], TCL_GLOBAL_ONLY); + Tcl_SetVar(s->interp, bu_vls_addr(&vls), state_str[s->edit_state.global_editing_state], TCL_GLOBAL_ONLY); bu_vls_free(&vls); return 0; /* GOOD */ @@ -1096,79 +1045,11 @@ chg_state(struct mged_state *s, int from, int to, char *str) void state_err(struct mged_state *s, char *str) { - Tcl_AppendResult(s->interp, "Unable to do <", str, "> from ", state_str[GEOM_EDIT_STATE], + Tcl_AppendResult(s->interp, "Unable to do <", str, "> from ", state_str[s->edit_state.global_editing_state], " state.\n", (char *)NULL); } -/* - * Called when a menu item is hit - */ -void -btn_item_hit(struct mged_state *s, int arg, int menu, int UNUSED(item)) -{ - button(s, arg); - if (menu == MENU_GEN && - (arg != BE_O_ILLUMINATE && arg != BE_S_ILLUMINATE)) - menu_state->ms_flag = 0; -} - - -/* - * Called to handle hits on menu heads. - * Also called from main() with arg 0 in init. - */ -void -btn_head_menu(struct mged_state *s, int i, int UNUSED(menu), int UNUSED(item)) { - switch (i) { - case 0: - mmenu_set(s, MENU_GEN, first_menu); - break; - case 1: - mmenu_set(s, MENU_GEN, second_menu); - break; - case 2: - /* nothing happens */ - break; - default: - { - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&tmp_vls, "btn_head_menu(%d): bad arg\n", i); - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); - bu_vls_free(&tmp_vls); - } - - break; - } -} - - -void -chg_l2menu(struct mged_state *s, int i) { - switch (i) { - case ST_S_EDIT: - mmenu_set_all(s, MENU_L2, sed_menu); - break; - case ST_S_NO_EDIT: - mmenu_set_all(s, MENU_L2, NULL); - break; - case ST_O_EDIT: - mmenu_set_all(s, MENU_L2, oed_menu); - break; - default: - { - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&tmp_vls, "chg_l2menu(%d): bad arg\n", i); - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); - bu_vls_free(&tmp_vls); - } - - break; - } -} - /* TODO: below are functions not yet migrated to libged, still * referenced by mged's setup command table. migrate to libged. diff --git a/src/mged/chgmodel.c b/src/mged/chgmodel.c index 6fed39e2f9..d17ade8872 100644 --- a/src/mged/chgmodel.c +++ b/src/mged/chgmodel.c @@ -123,7 +123,7 @@ mged_rot_obj(struct mged_state *s, int iflag, fastf_t *argvect) mat_t temp; vect_t v_work; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); if (movedir != ROTARROW) { @@ -132,25 +132,25 @@ mged_rot_obj(struct mged_state *s, int iflag, fastf_t *argvect) } /* find point for rotation to take place wrt */ - VMOVE(model_pt, es_keypoint); + VMOVE(model_pt, s->s_edit->e_keypoint); - MAT4X3PNT(point, modelchanges, model_pt); + MAT4X3PNT(point, s->s_edit->model_changes, model_pt); /* Find absolute translation vector to go from "model_pt" to - * "point" without any of the rotations in "modelchanges" + * "point" without any of the rotations in "s->s_edit->model_changes" */ - VSCALE(s_point, point, modelchanges[15]); + VSCALE(s_point, point, s->s_edit->model_changes[15]); VSUB2(v_work, s_point, model_pt); - /* REDO "modelchanges" such that: + /* REDO "s->s_edit->model_changes" such that: * 1. NO rotations (identity) * 2. trans == v_work * 3. same scale factor */ MAT_IDN(temp); MAT_DELTAS_VEC(temp, v_work); - temp[15] = modelchanges[15]; - MAT_COPY(modelchanges, temp); + temp[15] = s->s_edit->model_changes[15]; + MAT_COPY(s->s_edit->model_changes, temp); /* build new rotation matrix */ MAT_IDN(temp); @@ -158,15 +158,15 @@ mged_rot_obj(struct mged_state *s, int iflag, fastf_t *argvect) if (iflag) { /* apply accumulated rotations */ - bn_mat_mul2(acc_rot_sol, temp); + bn_mat_mul2(s->s_edit->acc_rot_sol, temp); } - /*XXX*/ MAT_COPY(acc_rot_sol, temp); /* used to rotate solid/object axis */ + /*XXX*/ MAT_COPY(s->s_edit->acc_rot_sol, temp); /* used to rotate solid/object axis */ /* Record the new rotation matrix into the revised - * modelchanges matrix wrt "point" + * s->s_edit->model_changes matrix wrt "point" */ - wrt_point(modelchanges, temp, modelchanges, point); + wrt_point(s->s_edit->model_changes, temp, s->s_edit->model_changes, point); new_edit_mats(s); @@ -249,7 +249,7 @@ f_sc_obj(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[] return TCL_ERROR; } - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); MAT_IDN(incr); @@ -259,31 +259,31 @@ f_sc_obj(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[] default: case BE_O_SCALE: /* global scaling */ - incr[15] = 1.0 / (atof(argv[1]) * modelchanges[15]); + incr[15] = 1.0 / (atof(argv[1]) * s->s_edit->model_changes[15]); break; case BE_O_XSCALE: /* local scaling ... X-axis */ - incr[0] = atof(argv[1]) / acc_sc[0]; - acc_sc[0] = atof(argv[1]); + incr[0] = atof(argv[1]) / s->edit_state.acc_sc[0]; + s->edit_state.acc_sc[0] = atof(argv[1]); break; case BE_O_YSCALE: /* local scaling ... Y-axis */ - incr[5] = atof(argv[1]) / acc_sc[1]; - acc_sc[1] = atof(argv[1]); + incr[5] = atof(argv[1]) / s->edit_state.acc_sc[1]; + s->edit_state.acc_sc[1] = atof(argv[1]); break; case BE_O_ZSCALE: /* local scaling ... Z-axis */ - incr[10] = atof(argv[1]) / acc_sc[2]; - acc_sc[2] = atof(argv[1]); + incr[10] = atof(argv[1]) / s->edit_state.acc_sc[2]; + s->edit_state.acc_sc[2] = atof(argv[1]); break; } /* find point the scaling is to take place wrt */ - VMOVE(temp, es_keypoint); + VMOVE(temp, s->s_edit->e_keypoint); - MAT4X3PNT(point, modelchanges, temp); + MAT4X3PNT(point, s->s_edit->model_changes, temp); - wrt_point(modelchanges, incr, modelchanges, point); + wrt_point(s->s_edit->model_changes, incr, s->s_edit->model_changes, point); new_edit_mats(s); return TCL_OK; @@ -318,7 +318,7 @@ f_tr_obj(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[] return TCL_ERROR; } - if (GEOM_EDIT_STATE == ST_S_EDIT) { + if (s->edit_state.global_editing_state == ST_S_EDIT) { /* In solid edit mode, * perform the equivalent of "press sxy" and "p xyz" */ @@ -332,7 +332,7 @@ f_tr_obj(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[] /* Remainder of code concerns object edit case */ - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); MAT_IDN(incr); @@ -347,13 +347,13 @@ f_tr_obj(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[] new_vertex[i] = atof(argv[i+1]) * s->dbip->dbi_local2base; } - VMOVE(model_sol_pt, es_keypoint); + VMOVE(model_sol_pt, s->s_edit->e_keypoint); - MAT4X3PNT(ed_sol_pt, modelchanges, model_sol_pt); + MAT4X3PNT(ed_sol_pt, s->s_edit->model_changes, model_sol_pt); VSUB2(model_incr, new_vertex, ed_sol_pt); MAT_DELTAS_VEC(incr, model_incr); - MAT_COPY(old, modelchanges); - bn_mat_mul(modelchanges, incr, old); + MAT_COPY(old, s->s_edit->model_changes); + bn_mat_mul(s->s_edit->model_changes, incr, old); new_edit_mats(s); return TCL_OK; @@ -411,10 +411,10 @@ f_qorot(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) ang = atof(argv[7]) * DEG2RAD; /* Get matrix for rotation about a point, direction vector and apply to - * modelchanges matrix + * s->s_edit->model_changes matrix */ bn_mat_arb_rot(temp, specified_pt, direc, ang); - bn_mat_mul2(temp, modelchanges); + bn_mat_mul2(temp, s->s_edit->model_changes); new_edit_mats(s); diff --git a/src/mged/chgtree.c b/src/mged/chgtree.c index e4ca3d4a08..b2ca15af9c 100644 --- a/src/mged/chgtree.c +++ b/src/mged/chgtree.c @@ -125,7 +125,7 @@ f_copy_inv(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv (void)cmd_draw(clientData, interp, 2, av); } - if (GEOM_EDIT_STATE == ST_VIEW) { + if (s->edit_state.global_editing_state == ST_VIEW) { struct bu_vls sed_cmd = BU_VLS_INIT_ZERO; bu_vls_sprintf(&sed_cmd, "sed %s", argv[2]); @@ -258,20 +258,31 @@ cmd_oed(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) db_dup_full_path(&both, &lhs); db_append_full_path(&both, &rhs); - /* Patterned after ill_common() ... */ illum_gdlp = gdlp; illump = BU_LIST_NEXT(bv_scene_obj, &gdlp->dl_head_scene_obj);/* any valid solid would do */ + + /* Set up solid edit state */ + struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; + s->s_edit = rt_solid_edit_create(&bdata->s_fullpath, s->dbip, &s->tol.tol, view_state->vs_gvp); + if (s->s_edit) { + Tcl_LinkVar(s->interp, "edit_solid_flag", (char *)&s->s_edit->edit_flag, TCL_LINK_INT); + s->s_edit->mv_context = mged_variables->mv_context; + s->s_edit->vlfree = &rt_vlfree; + mged_edit_clbk_sync(s->s_edit, s); + } + + /* Patterned after ill_common() ... */ edobj = 0; /* sanity */ movedir = 0; /* No edit modes set */ - MAT_IDN(modelchanges); /* No changes yet */ + MAT_IDN(s->s_edit->model_changes); /* No changes yet */ (void)chg_state(s, ST_VIEW, ST_O_PICK, "internal change of state"); /* reset accumulation local scale factors */ - acc_sc[0] = acc_sc[1] = acc_sc[2] = 1.0; + s->edit_state.acc_sc[0] = s->edit_state.acc_sc[1] = s->edit_state.acc_sc[2] = 1.0; new_mats(s); /* Find the one solid, set s_iflag UP, point illump at it */ illump = find_solid_with_path(s, &both); - if (!illump) { + if (!illump || !illump->s_u_data) { db_free_full_path(&lhs); db_free_full_path(&rhs); db_free_full_path(&both); @@ -283,6 +294,7 @@ cmd_oed(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) } (void)chg_state(s, ST_O_PICK, ST_O_PATH, "internal change of state"); + /* Select the matrix */ struct bu_vls tcl_cmd = BU_VLS_INIT_ZERO; bu_vls_printf(&tcl_cmd, "matpick %lu", (long unsigned)lhs.fp_len); diff --git a/src/mged/chgview.c b/src/mged/chgview.c index a33642929f..d3c8a6934e 100644 --- a/src/mged/chgview.c +++ b/src/mged/chgview.c @@ -39,7 +39,6 @@ #include "./mged_dm.h" #include "./cmd.h" - extern void mged_color_soltab(struct mged_state *s); void solid_list_callback(struct mged_state *s); @@ -59,21 +58,6 @@ int mged_otran(struct mged_state *s, const vect_t tvec); int mged_vtran(struct mged_state *s, const vect_t tvec); int mged_vrot_xyz(struct mged_state *s, char origin, char coords, vect_t rvec); - -extern vect_t curr_e_axes_pos; -extern long nvectors; - -extern vect_t e_axes_pos; - -fastf_t ar_scale_factor = GED_MAX / ABS_ROT_FACTOR; -fastf_t rr_scale_factor = GED_MAX / RATE_ROT_FACTOR; -fastf_t adc_angle_scale_factor = GED_MAX / ADC_ANGLE_FACTOR; - -double mged_abs_tol; -double mged_rel_tol = 0.01; /* 1%, by default */ -double mged_nrm_tol; /* normal ang tol, radians */ - - /* DEBUG -- force view center */ /* Format: C x y z */ int @@ -385,7 +369,7 @@ edit_com(struct mged_state *s, } } - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); if (flag_R_noresize) { @@ -589,18 +573,18 @@ cmd_zap(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), con CHECK_DBI_NULL; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); s->gedp->ged_destroy_vlist_callback = freeDListsAll; /* FIRST, reject any editing in progress */ - if (GEOM_EDIT_STATE != ST_VIEW) { + if (s->edit_state.global_editing_state != ST_VIEW) { button(s, BE_REJECT); } ged_exec_zap(s->gedp, 1, (const char **)av); - (void)chg_state(s, GEOM_EDIT_STATE, GEOM_EDIT_STATE, "zap"); + (void)chg_state(s, s->edit_state.global_editing_state, s->edit_state.global_editing_state, "zap"); solid_list_callback(s); s->gedp->ged_destroy_vlist_callback = tmp_callback; @@ -628,7 +612,7 @@ f_status(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[] } if (argc == 1) { - bu_vls_printf(&vls, "GEOM_EDIT_STATE=%s, ", state_str[GEOM_EDIT_STATE]); + bu_vls_printf(&vls, "s->edit_state.global_editing_state=%s, ", state_str[s->edit_state.global_editing_state]); bu_vls_printf(&vls, "Viewscale=%f (%f mm)\n", view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local, view_state->vs_gvp->gv_scale); bu_vls_printf(&vls, "s->dbip->dbi_base2local=%f\n", s->dbip->dbi_base2local); @@ -640,7 +624,7 @@ f_status(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[] tclcad_bn_mat_print(interp, "model2view", view_state->vs_gvp->gv_model2view); tclcad_bn_mat_print(interp, "view2model", view_state->vs_gvp->gv_view2model); - if (GEOM_EDIT_STATE != ST_VIEW) { + if (s->edit_state.global_editing_state != ST_VIEW) { tclcad_bn_mat_print(interp, "model2objview", view_state->vs_model2objview); tclcad_bn_mat_print(interp, "objview2model", view_state->vs_objview2model); } @@ -649,7 +633,7 @@ f_status(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[] } if (BU_STR_EQUAL(argv[1], "state")) { - Tcl_AppendResult(interp, state_str[GEOM_EDIT_STATE], (char *)NULL); + Tcl_AppendResult(interp, state_str[s->edit_state.global_editing_state], (char *)NULL); return TCL_OK; } @@ -844,7 +828,7 @@ f_ill(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) return TCL_ERROR; } - if (GEOM_EDIT_STATE != ST_S_PICK && GEOM_EDIT_STATE != ST_O_PICK) { + if (s->edit_state.global_editing_state != ST_S_PICK && s->edit_state.global_editing_state != ST_O_PICK) { state_err(s, "keyboard illuminate pick"); goto bail_out; } @@ -947,16 +931,26 @@ f_ill(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) illump->s_iflag = UP; if (!illum_only) { - if (GEOM_EDIT_STATE == ST_O_PICK) { + if (s->edit_state.global_editing_state == ST_O_PICK) { ipathpos = 0; (void)chg_state(s, ST_O_PICK, ST_O_PATH, "Keyboard illuminate"); } else { /* Check details, Init menu, set state=ST_S_EDIT */ - init_sedit(s); + if (!s->s_edit) { + struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; + s->s_edit = rt_solid_edit_create(&bdata->s_fullpath, s->dbip, &s->tol.tol, view_state->vs_gvp); + if (s->s_edit) { + Tcl_LinkVar(s->interp, "edit_solid_flag", (char *)&s->s_edit->edit_flag, TCL_LINK_INT); + s->s_edit->mv_context = mged_variables->mv_context; + s->s_edit->vlfree = &rt_vlfree; + mged_edit_clbk_sync(s->s_edit, s); + init_sedit(s); + } + } } } - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); if (path_piece) { @@ -974,7 +968,7 @@ f_ill(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) bail_out: - if (GEOM_EDIT_STATE != ST_VIEW) { + if (s->edit_state.global_editing_state != ST_VIEW) { bu_vls_printf(&vls, "%s", Tcl_GetStringResult(interp)); button(s, BE_REJECT); Tcl_ResetResult(interp); @@ -1045,7 +1039,7 @@ f_sed(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) return TCL_ERROR; } - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); button(s, BE_S_ILLUMINATE); /* To ST_S_PICK */ @@ -1064,6 +1058,18 @@ f_sed(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) return TCL_ERROR; } + /* Set up solid edit state, if f_ill hasn't already done so. */ + if (!s->s_edit) { + struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; + s->s_edit = rt_solid_edit_create(&bdata->s_fullpath, s->dbip, &s->tol.tol, view_state->vs_gvp); + if (s->s_edit) { + Tcl_LinkVar(s->interp, "edit_solid_flag", (char *)&s->s_edit->edit_flag, TCL_LINK_INT); + s->s_edit->mv_context = mged_variables->mv_context; + s->s_edit->vlfree = &rt_vlfree; + mged_edit_clbk_sync(s->s_edit, s); + } + } + return TCL_OK; } @@ -1183,7 +1189,7 @@ mged_print_knobvals(struct mged_state *s, Tcl_Interp *interp) struct bu_vls vls = BU_VLS_INIT_ZERO; if (mged_variables->mv_rateknobs) { - if (es_edclass == EDIT_CLASS_ROTATE && mged_variables->mv_transform == 'e') { + if (s->edit_state.e_edclass == EDIT_CLASS_ROTATE && mged_variables->mv_transform == 'e') { bu_vls_printf(&vls, "x = %f\n", s->edit_state.edit_rate_model_rotate[X]); bu_vls_printf(&vls, "y = %f\n", s->edit_state.edit_rate_model_rotate[Y]); bu_vls_printf(&vls, "z = %f\n", s->edit_state.edit_rate_model_rotate[Z]); @@ -1193,13 +1199,13 @@ mged_print_knobvals(struct mged_state *s, Tcl_Interp *interp) bu_vls_printf(&vls, "z = %f\n", view_state->vs_rate_rotate[Z]); } - if (es_edclass == EDIT_CLASS_SCALE && mged_variables->mv_transform == 'e') { + if (s->edit_state.e_edclass == EDIT_CLASS_SCALE && mged_variables->mv_transform == 'e') { bu_vls_printf(&vls, "S = %f\n", s->edit_state.edit_rate_scale); } else { bu_vls_printf(&vls, "S = %f\n", view_state->vs_rate_scale); } - if (es_edclass == EDIT_CLASS_TRAN && mged_variables->mv_transform == 'e') { + if (s->edit_state.e_edclass == EDIT_CLASS_TRAN && mged_variables->mv_transform == 'e') { bu_vls_printf(&vls, "X = %f\n", s->edit_state.edit_rate_model_tran[X]); bu_vls_printf(&vls, "Y = %f\n", s->edit_state.edit_rate_model_tran[Y]); bu_vls_printf(&vls, "Z = %f\n", s->edit_state.edit_rate_model_tran[Z]); @@ -1209,7 +1215,7 @@ mged_print_knobvals(struct mged_state *s, Tcl_Interp *interp) bu_vls_printf(&vls, "Z = %f\n", view_state->vs_rate_tran[Z]); } } else { - if (es_edclass == EDIT_CLASS_ROTATE && mged_variables->mv_transform == 'e') { + if (s->edit_state.e_edclass == EDIT_CLASS_ROTATE && mged_variables->mv_transform == 'e') { bu_vls_printf(&vls, "ax = %f\n", s->edit_state.edit_absolute_model_rotate[X]); bu_vls_printf(&vls, "ay = %f\n", s->edit_state.edit_absolute_model_rotate[Y]); bu_vls_printf(&vls, "az = %f\n", s->edit_state.edit_absolute_model_rotate[Z]); @@ -1219,16 +1225,16 @@ mged_print_knobvals(struct mged_state *s, Tcl_Interp *interp) bu_vls_printf(&vls, "az = %f\n", view_state->vs_absolute_rotate[Z]); } - if (es_edclass == EDIT_CLASS_SCALE && mged_variables->mv_transform == 'e') { - bu_vls_printf(&vls, "aS = %f\n", s->edit_state.edit_absolute_scale); + if (s->edit_state.e_edclass == EDIT_CLASS_SCALE && mged_variables->mv_transform == 'e') { + bu_vls_printf(&vls, "aS = %f\n", s->s_edit->edit_absolute_scale); } else { bu_vls_printf(&vls, "aS = %f\n", view_state->vs_gvp->gv_a_scale); } - if (es_edclass == EDIT_CLASS_TRAN && mged_variables->mv_transform == 'e') { - bu_vls_printf(&vls, "aX = %f\n", s->edit_state.edit_absolute_model_tran[X]); - bu_vls_printf(&vls, "aY = %f\n", s->edit_state.edit_absolute_model_tran[Y]); - bu_vls_printf(&vls, "aZ = %f\n", s->edit_state.edit_absolute_model_tran[Z]); + if (s->edit_state.e_edclass == EDIT_CLASS_TRAN && mged_variables->mv_transform == 'e') { + bu_vls_printf(&vls, "aX = %f\n", s->s_edit->edit_absolute_model_tran[X]); + bu_vls_printf(&vls, "aY = %f\n", s->s_edit->edit_absolute_model_tran[Y]); + bu_vls_printf(&vls, "aZ = %f\n", s->s_edit->edit_absolute_model_tran[Z]); } else { bu_vls_printf(&vls, "aX = %f\n", view_state->vs_absolute_tran[X]); bu_vls_printf(&vls, "aY = %f\n", view_state->vs_absolute_tran[Y]); @@ -1317,7 +1323,7 @@ f_knob(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) } if (origin != 'v' && origin != 'm' && origin != 'e' && origin != 'k') { - origin = mged_variables->mv_rotate_about; + origin = view_state->vs_gvp->gv_rotate_about; } /* print the current values */ @@ -2083,12 +2089,12 @@ f_knob(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) switch (mged_variables->mv_coords) { case 'm': case 'o': - s->edit_state.edit_absolute_model_tran[X] += sf; - s->edit_state.last_edit_absolute_model_tran[X] = s->edit_state.edit_absolute_model_tran[X]; + s->s_edit->edit_absolute_model_tran[X] += sf; + s->s_edit->last_edit_absolute_model_tran[X] = s->s_edit->edit_absolute_model_tran[X]; break; case 'v': - s->edit_state.edit_absolute_view_tran[X] += sf; - s->edit_state.last_edit_absolute_view_tran[X] = s->edit_state.edit_absolute_view_tran[X]; + s->s_edit->edit_absolute_view_tran[X] += sf; + s->s_edit->last_edit_absolute_view_tran[X] = s->s_edit->edit_absolute_view_tran[X]; break; } } else if (model_flag || (mged_variables->mv_coords == 'm' && !view_flag)) { @@ -2106,14 +2112,14 @@ f_knob(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) switch (mged_variables->mv_coords) { case 'm': case 'o': - tvec[X] = f - s->edit_state.last_edit_absolute_model_tran[X] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; - s->edit_state.edit_absolute_model_tran[X] = sf; - s->edit_state.last_edit_absolute_model_tran[X] = s->edit_state.edit_absolute_model_tran[X]; + tvec[X] = f - s->s_edit->last_edit_absolute_model_tran[X] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; + s->s_edit->edit_absolute_model_tran[X] = sf; + s->s_edit->last_edit_absolute_model_tran[X] = s->s_edit->edit_absolute_model_tran[X]; break; case 'v': - tvec[X] = f - s->edit_state.last_edit_absolute_view_tran[X] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; - s->edit_state.edit_absolute_view_tran[X] = sf; - s->edit_state.last_edit_absolute_view_tran[X] = s->edit_state.edit_absolute_view_tran[X]; + tvec[X] = f - s->s_edit->last_edit_absolute_view_tran[X] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; + s->s_edit->edit_absolute_view_tran[X] = sf; + s->s_edit->last_edit_absolute_view_tran[X] = s->s_edit->edit_absolute_view_tran[X]; break; } } else if (model_flag || (mged_variables->mv_coords == 'm' && !view_flag)) { @@ -2139,12 +2145,12 @@ f_knob(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) switch (mged_variables->mv_coords) { case 'm': case 'o': - s->edit_state.edit_absolute_model_tran[Y] += sf; - s->edit_state.last_edit_absolute_model_tran[Y] = s->edit_state.edit_absolute_model_tran[Y]; + s->s_edit->edit_absolute_model_tran[Y] += sf; + s->s_edit->last_edit_absolute_model_tran[Y] = s->s_edit->edit_absolute_model_tran[Y]; break; case 'v': - s->edit_state.edit_absolute_view_tran[Y] += sf; - s->edit_state.last_edit_absolute_view_tran[Y] = s->edit_state.edit_absolute_view_tran[Y]; + s->s_edit->edit_absolute_view_tran[Y] += sf; + s->s_edit->last_edit_absolute_view_tran[Y] = s->s_edit->edit_absolute_view_tran[Y]; break; } } else if (model_flag || (mged_variables->mv_coords == 'm' && !view_flag)) { @@ -2162,14 +2168,14 @@ f_knob(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) switch (mged_variables->mv_coords) { case 'm': case 'o': - tvec[Y] = f - s->edit_state.last_edit_absolute_model_tran[Y] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; - s->edit_state.edit_absolute_model_tran[Y] = sf; - s->edit_state.last_edit_absolute_model_tran[Y] = s->edit_state.edit_absolute_model_tran[Y]; + tvec[Y] = f - s->s_edit->last_edit_absolute_model_tran[Y] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; + s->s_edit->edit_absolute_model_tran[Y] = sf; + s->s_edit->last_edit_absolute_model_tran[Y] = s->s_edit->edit_absolute_model_tran[Y]; break; case 'v': - tvec[Y] = f - s->edit_state.last_edit_absolute_view_tran[Y] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; - s->edit_state.edit_absolute_view_tran[Y] = sf; - s->edit_state.last_edit_absolute_view_tran[Y] = s->edit_state.edit_absolute_view_tran[Y]; + tvec[Y] = f - s->s_edit->last_edit_absolute_view_tran[Y] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; + s->s_edit->edit_absolute_view_tran[Y] = sf; + s->s_edit->last_edit_absolute_view_tran[Y] = s->s_edit->edit_absolute_view_tran[Y]; break; } } else if (model_flag || (mged_variables->mv_coords == 'm' && !view_flag)) { @@ -2194,12 +2200,12 @@ f_knob(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) switch (mged_variables->mv_coords) { case 'm': case 'o': - s->edit_state.edit_absolute_model_tran[Z] += sf; - s->edit_state.last_edit_absolute_model_tran[Z] = s->edit_state.edit_absolute_model_tran[Z]; + s->s_edit->edit_absolute_model_tran[Z] += sf; + s->s_edit->last_edit_absolute_model_tran[Z] = s->s_edit->edit_absolute_model_tran[Z]; break; case 'v': - s->edit_state.edit_absolute_view_tran[Z] += sf; - s->edit_state.last_edit_absolute_view_tran[Z] = s->edit_state.edit_absolute_view_tran[Z]; + s->s_edit->edit_absolute_view_tran[Z] += sf; + s->s_edit->last_edit_absolute_view_tran[Z] = s->s_edit->edit_absolute_view_tran[Z]; break; } } else if (model_flag || (mged_variables->mv_coords == 'm' && !view_flag)) { @@ -2217,14 +2223,14 @@ f_knob(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) switch (mged_variables->mv_coords) { case 'm': case 'o': - tvec[Z] = f - s->edit_state.last_edit_absolute_model_tran[Z] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; - s->edit_state.edit_absolute_model_tran[Z] = sf; - s->edit_state.last_edit_absolute_model_tran[Z] = s->edit_state.edit_absolute_model_tran[Z]; + tvec[Z] = f - s->s_edit->last_edit_absolute_model_tran[Z] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; + s->s_edit->edit_absolute_model_tran[Z] = sf; + s->s_edit->last_edit_absolute_model_tran[Z] = s->s_edit->edit_absolute_model_tran[Z]; break; case 'v': - tvec[Z] = f - s->edit_state.last_edit_absolute_view_tran[Z] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; - s->edit_state.edit_absolute_view_tran[Z] = sf; - s->edit_state.last_edit_absolute_view_tran[Z] = s->edit_state.edit_absolute_view_tran[Z]; + tvec[Z] = f - s->s_edit->last_edit_absolute_view_tran[Z] * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local; + s->s_edit->edit_absolute_view_tran[Z] = sf; + s->s_edit->last_edit_absolute_view_tran[Z] = s->s_edit->edit_absolute_view_tran[Z]; break; } } else if (model_flag || (mged_variables->mv_coords == 'm' && !view_flag)) { @@ -2243,9 +2249,9 @@ f_knob(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) case 'S': if (incr_flag) { if (EDIT_SCALE && ((mged_variables->mv_transform == 'e' && !view_flag) || edit_flag)) { - s->edit_state.edit_absolute_scale += f; + s->s_edit->edit_absolute_scale += f; - if (GEOM_EDIT_STATE == ST_S_EDIT) { + if (s->edit_state.global_editing_state == ST_S_EDIT) { sedit_abs_scale(s); } else { oedit_abs_scale(s); @@ -2256,9 +2262,9 @@ f_knob(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) } } else { if (EDIT_SCALE && ((mged_variables->mv_transform == 'e' && !view_flag) || edit_flag)) { - s->edit_state.edit_absolute_scale = f; + s->s_edit->edit_absolute_scale = f; - if (GEOM_EDIT_STATE == ST_S_EDIT) { + if (s->edit_state.global_editing_state == ST_S_EDIT) { sedit_abs_scale(s); } else { oedit_abs_scale(s); @@ -3220,17 +3226,17 @@ mged_erot(struct mged_state *s, int save_edflag; mat_t temp1, temp2; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); switch (coords) { case 'm': break; case 'o': - bn_mat_inv(temp1, acc_rot_sol); + bn_mat_inv(temp1, s->s_edit->acc_rot_sol); /* transform into object rotations */ - bn_mat_mul(temp2, acc_rot_sol, newrot); + bn_mat_mul(temp2, s->s_edit->acc_rot_sol, newrot); bn_mat_mul(newrot, temp2, temp1); break; case 'v': @@ -3242,30 +3248,45 @@ mged_erot(struct mged_state *s, break; } - if (GEOM_EDIT_STATE == ST_S_EDIT) { + if (s->edit_state.global_editing_state == ST_S_EDIT) { char save_rotate_about; + int save_rot, save_tra, save_sca, save_pic; - save_rotate_about = mged_variables->mv_rotate_about; - mged_variables->mv_rotate_about = rotate_about; + save_rotate_about = view_state->vs_gvp->gv_rotate_about; + view_state->vs_gvp->gv_rotate_about = rotate_about; - save_edflag = es_edflag; + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_ROTATE) { - es_edflag = SROT; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_ROT); } - inpara = 0; - MAT_COPY(incr_change, newrot); - bn_mat_mul2(incr_change, acc_rot_sol); - sedit(s); + s->s_edit->e_inpara = 0; + MAT_COPY(s->s_edit->incr_change, newrot); + bn_mat_mul2(s->s_edit->incr_change, s->s_edit->acc_rot_sol); + + + s->s_edit->update_views = s->update_views; + sedraw = 0; + rt_solid_edit_process(s->s_edit); + s->update_views = s->s_edit->update_views; + + view_state->vs_gvp->gv_rotate_about = save_rotate_about; + s->s_edit->edit_flag = save_edflag; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; - mged_variables->mv_rotate_about = save_rotate_about; - es_edflag = save_edflag; } else { point_t point; vect_t work; - bn_mat_mul2(newrot, acc_rot_sol); + bn_mat_mul2(newrot, s->s_edit->acc_rot_sol); /* find point for rotation to take place wrt */ switch (rotate_about) { @@ -3282,13 +3303,13 @@ mged_erot(struct mged_state *s, break; case 'k': default: - MAT4X3PNT(point, modelchanges, es_keypoint); + MAT4X3PNT(point, s->s_edit->model_changes, s->s_edit->e_keypoint); } /* - * Apply newrot to the modelchanges matrix wrt "point" + * Apply newrot to the s->s_edit->model_changes matrix wrt "point" */ - wrt_point(modelchanges, newrot, modelchanges, point); + wrt_point(s->s_edit->model_changes, newrot, s->s_edit->model_changes, point); new_edit_mats(s); } @@ -3323,7 +3344,7 @@ cmd_mrot(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[] return TCL_OK; } - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { char coord; /* dummy argument for ged_rot_args */ mat_t rmat; @@ -3385,13 +3406,13 @@ mged_vrot(struct mged_state *s, char origin, fastf_t *newrot) if (origin == 'e') { /* "VR driver" method: rotate around "eye" point (0, 0, 1) viewspace */ VSET(rot_pt, 0.0, 0.0, 1.0); /* point to rotate around */ - } else if (origin == 'k' && GEOM_EDIT_STATE == ST_S_EDIT) { + } else if (origin == 'k' && s->edit_state.global_editing_state == ST_S_EDIT) { /* rotate around keypoint */ - MAT4X3PNT(rot_pt, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - } else if (origin == 'k' && GEOM_EDIT_STATE == ST_O_EDIT) { + MAT4X3PNT(rot_pt, view_state->vs_gvp->gv_model2view, s->s_edit->curr_e_axes_pos); + } else if (origin == 'k' && s->edit_state.global_editing_state == ST_O_EDIT) { point_t kpWmc; - MAT4X3PNT(kpWmc, modelchanges, es_keypoint); + MAT4X3PNT(kpWmc, s->s_edit->model_changes, s->s_edit->e_keypoint); MAT4X3PNT(rot_pt, view_state->vs_gvp->gv_model2view, kpWmc); } else { /* rotate around model center (0, 0, 0) */ @@ -3444,10 +3465,10 @@ mged_vrot_xyz(struct mged_state *s, bn_mat_inv(temp1, view_state->vs_gvp->gv_rotation); bn_mat_mul(temp2, view_state->vs_gvp->gv_rotation, newrot); bn_mat_mul(newrot, temp2, temp1); - } else if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && coords == 'o') { + } else if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && coords == 'o') { /* first, transform object rotations into model rotations */ - bn_mat_inv(temp1, acc_rot_sol); - bn_mat_mul(temp2, acc_rot_sol, newrot); + bn_mat_inv(temp1, s->s_edit->acc_rot_sol); + bn_mat_mul(temp2, s->s_edit->acc_rot_sol, newrot); bn_mat_mul(newrot, temp2, temp1); /* now transform model rotations into view rotations */ @@ -3502,7 +3523,7 @@ cmd_rot(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) return TCL_OK; } - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { char coord; mat_t rmat; @@ -3549,7 +3570,7 @@ cmd_arot(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[] return TCL_OK; } - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { mat_t rmat; @@ -3601,7 +3622,7 @@ mged_etran(struct mged_state *s, break; case 'o': VSCALE(p2, tvec, s->dbip->dbi_local2base); - MAT4X3PNT(delta, acc_rot_sol, p2); + MAT4X3PNT(delta, s->s_edit->acc_rot_sol, p2); break; case 'v': default: @@ -3613,27 +3634,58 @@ mged_etran(struct mged_state *s, break; } - if (GEOM_EDIT_STATE == ST_S_EDIT) { - es_keyfixed = 0; - get_solid_keypoint(s, &es_keypoint, &es_keytag, - &s->edit_state.es_int, es_mat); - save_edflag = es_edflag; - - if (!SEDIT_TRAN) { - es_edflag = STRANS; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + int save_rot, save_tra, save_sca, save_pic; + s->s_edit->e_keyfixed = 0; + + // Explicit get_solid_keypoint so we can make that function + // private to edsol + struct rt_db_internal *ip = &s->s_edit->es_int; + fastf_t *mat = s->s_edit->e_mat; + point_t *pt = &s->s_edit->e_keypoint; + RT_CK_DB_INTERNAL(ip); + if (EDOBJ[ip->idb_type].ft_keypoint) { + bu_vls_trunc(s->s_edit->log_str, 0); + s->s_edit->e_keytag = (*EDOBJ[ip->idb_type].ft_keypoint)(pt, s->s_edit->e_keytag, mat, s->s_edit, &s->tol.tol); + if (bu_vls_strlen(s->s_edit->log_str)) { + Tcl_AppendResult(s->interp, bu_vls_cstr(s->s_edit->log_str), (char *)NULL); + bu_vls_trunc(s->s_edit->log_str, 0); + } + } else { + Tcl_AppendResult(s->interp, "get_solid_keypoint: unrecognized solid type (setting keypoint to origin)\n", (char *)NULL); + VSETALL(*pt, 0.0); + s->s_edit->e_keytag = "(origin)"; } - VADD2(es_para, delta, curr_e_axes_pos); - inpara = 3; - sedit(s); - es_edflag = save_edflag; + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; + + + if (!SEDIT_TRAN) { + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_TRANS); + } + + VADD2(s->s_edit->e_para, delta, s->s_edit->curr_e_axes_pos); + s->s_edit->e_inpara = 3; + s->s_edit->update_views = s->update_views; + sedraw = 0; + rt_solid_edit_process(s->s_edit); + s->update_views = s->s_edit->update_views; + s->s_edit->edit_flag = save_edflag; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; } else { MAT_IDN(xlatemat); MAT_DELTAS_VEC(xlatemat, delta); - bn_mat_mul2(xlatemat, modelchanges); + bn_mat_mul2(xlatemat, s->s_edit->model_changes); new_edit_mats(s); - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); } @@ -3646,9 +3698,9 @@ mged_otran(struct mged_state *s, const vect_t tvec) { vect_t work = VINIT_ZERO; - if (GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) { - /* apply acc_rot_sol to tvec */ - MAT4X3PNT(work, acc_rot_sol, tvec); + if (s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) { + /* apply s->s_edit->acc_rot_sol to tvec */ + MAT4X3PNT(work, s->s_edit->acc_rot_sol, tvec); } return mged_mtran(s, work); @@ -3710,7 +3762,7 @@ cmd_tra(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) return TCL_OK; } - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { char coord; vect_t tvec; @@ -3753,34 +3805,49 @@ mged_escale(struct mged_state *s, fastf_t sfactor) return TCL_OK; } - if (GEOM_EDIT_STATE == ST_S_EDIT) { - int save_edflag; - - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + int save_edflag, save_rot, save_tra, save_sca, save_pic; + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_SCALE) { - es_edflag = SSCALE; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_SCALE); } - s->edit_state.es_scale = sfactor; - old_scale = acc_sc_sol; - acc_sc_sol *= sfactor; + s->s_edit->es_scale = sfactor; + old_scale = s->s_edit->acc_sc_sol; + s->s_edit->acc_sc_sol *= sfactor; - if (acc_sc_sol < MGED_SMALL_SCALE) { - acc_sc_sol = old_scale; - es_edflag = save_edflag; + if (s->s_edit->acc_sc_sol < MGED_SMALL_SCALE) { + s->s_edit->acc_sc_sol = old_scale; + s->s_edit->edit_flag = save_edflag; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; return TCL_OK; } - if (acc_sc_sol >= 1.0) { - s->edit_state.edit_absolute_scale = (acc_sc_sol - 1.0) / 3.0; + if (s->s_edit->acc_sc_sol >= 1.0) { + s->s_edit->edit_absolute_scale = (s->s_edit->acc_sc_sol - 1.0) / 3.0; } else { - s->edit_state.edit_absolute_scale = acc_sc_sol - 1.0; + s->s_edit->edit_absolute_scale = s->s_edit->acc_sc_sol - 1.0; } - sedit(s); + s->s_edit->update_views = s->update_views; + sedraw = 0; + rt_solid_edit_process(s->s_edit); + s->update_views = s->s_edit->update_views; + + s->s_edit->edit_flag = save_edflag; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; - es_edflag = save_edflag; } else { point_t temp; point_t pos_model; @@ -3793,33 +3860,33 @@ mged_escale(struct mged_state *s, fastf_t sfactor) switch (edobj) { case BE_O_XSCALE: /* local scaling ... X-axis */ smat[0] = sfactor; - old_scale = acc_sc[X]; - acc_sc[X] *= sfactor; + old_scale = s->edit_state.acc_sc[X]; + s->edit_state.acc_sc[X] *= sfactor; - if (acc_sc[X] < MGED_SMALL_SCALE) { - acc_sc[X] = old_scale; + if (s->edit_state.acc_sc[X] < MGED_SMALL_SCALE) { + s->edit_state.acc_sc[X] = old_scale; return TCL_OK; } break; case BE_O_YSCALE: /* local scaling ... Y-axis */ smat[5] = sfactor; - old_scale = acc_sc[Y]; - acc_sc[Y] *= sfactor; + old_scale = s->edit_state.acc_sc[Y]; + s->edit_state.acc_sc[Y] *= sfactor; - if (acc_sc[Y] < MGED_SMALL_SCALE) { - acc_sc[Y] = old_scale; + if (s->edit_state.acc_sc[Y] < MGED_SMALL_SCALE) { + s->edit_state.acc_sc[Y] = old_scale; return TCL_OK; } break; case BE_O_ZSCALE: /* local scaling ... Z-axis */ smat[10] = sfactor; - old_scale = acc_sc[Z]; - acc_sc[Z] *= sfactor; + old_scale = s->edit_state.acc_sc[Z]; + s->edit_state.acc_sc[Z] *= sfactor; - if (acc_sc[Z] < MGED_SMALL_SCALE) { - acc_sc[Z] = old_scale; + if (s->edit_state.acc_sc[Z] < MGED_SMALL_SCALE) { + s->edit_state.acc_sc[Z] = old_scale; return TCL_OK; } @@ -3827,11 +3894,11 @@ mged_escale(struct mged_state *s, fastf_t sfactor) case BE_O_SCALE: /* global scaling */ default: smat[15] = inv_sfactor; - old_scale = acc_sc_sol; - acc_sc_sol *= inv_sfactor; + old_scale = s->s_edit->acc_sc_sol; + s->s_edit->acc_sc_sol *= inv_sfactor; - if (acc_sc_sol < MGED_SMALL_SCALE) { - acc_sc_sol = old_scale; + if (s->s_edit->acc_sc_sol < MGED_SMALL_SCALE) { + s->s_edit->acc_sc_sol = old_scale; return TCL_OK; } @@ -3841,9 +3908,9 @@ mged_escale(struct mged_state *s, fastf_t sfactor) /* Have scaling take place with respect to keypoint, * NOT the view center. */ - VMOVE(temp, es_keypoint); - MAT4X3PNT(pos_model, modelchanges, temp); - wrt_point(modelchanges, smat, modelchanges, pos_model); + VMOVE(temp, s->s_edit->e_keypoint); + MAT4X3PNT(pos_model, s->s_edit->model_changes, temp); + wrt_point(s->s_edit->model_changes, smat, s->s_edit->model_changes, pos_model); new_edit_mats(s); } @@ -3892,7 +3959,7 @@ cmd_sca(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) return TCL_OK; } - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && mged_variables->mv_transform == 'e') { + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { fastf_t sf1 = 0.0; /* combined xyz scale or x scale */ fastf_t sf2 = 0.0; /* y scale */ fastf_t sf3 = 0.0; /* z scale */ @@ -3926,7 +3993,7 @@ cmd_sca(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) return TCL_OK; } - if (GEOM_EDIT_STATE == ST_O_EDIT) { + if (s->edit_state.global_editing_state == ST_O_EDIT) { save_edobj = edobj; edobj = BE_O_XSCALE; diff --git a/src/mged/clone.c b/src/mged/clone.c index 70665e0746..f315166c7b 100644 --- a/src/mged/clone.c +++ b/src/mged/clone.c @@ -309,6 +309,7 @@ copy_v4_solid(struct db_i *_dbip, struct directory *proto, struct clone_state *s if ((dp == RT_DIR_NULL) || (db_alloc(_dbip, dp, proto->d_len) < 0)) { Tcl_AppendResult(s->interp, "An error has occurred while adding a new object to the database.\n", (char *)NULL); Tcl_AppendResult(s->interp, ERROR_RECOVERY_SUGGESTION, (char *)NULL); + return; } /* get an in-memory reference to the object being copied */ diff --git a/src/mged/cmd.c b/src/mged/cmd.c index 855d57c905..7db14f8d9c 100644 --- a/src/mged/cmd.c +++ b/src/mged/cmd.c @@ -62,6 +62,8 @@ extern void mged_finish(struct mged_state *s, int exitcode); /* in mged.c */ extern void update_grids(struct mged_state *s, fastf_t sf); /* in grid.c */ extern void set_localunit_TclVar(struct mged_state *s); /* in chgmodel.c */ extern void init_qray(void); /* in qray.c */ + +/* Ew. Globals. */ extern int mged_default_dlist; /* in attach.c */ struct cmd_list head_cmd_list; struct cmd_list *curr_cmd_list; @@ -318,7 +320,7 @@ cmd_ged_info_wrapper(ClientData clientData, Tcl_Interp *interpreter, int argc, c (void)(*ctp->ged_func)(s->gedp, argc, (const char **)argv); GED_OUTPUT; } else { - if ((argc == 1) && (GEOM_EDIT_STATE == ST_S_EDIT)) { + if ((argc == 1) && (s->edit_state.global_editing_state == ST_S_EDIT)) { argc = 2; av = (const char **)bu_malloc(sizeof(char *)*(argc + 1), "f_list: av"); av[0] = (const char *)argv[0]; @@ -360,7 +362,7 @@ cmd_ged_erase_wrapper(ClientData clientData, Tcl_Interp *interpreter, int argc, return TCL_ERROR; solid_list_callback(s); - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); return TCL_OK; @@ -434,7 +436,7 @@ cmd_ged_gqa(ClientData clientData, Tcl_Interp *interpreter, int argc, const char if (ret) return TCL_ERROR; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); return TCL_OK; @@ -556,11 +558,11 @@ cmd_ged_inside(ClientData clientData, Tcl_Interp *interpreter, int argc, const c RT_DB_INTERNAL_INIT(&intern); - if (GEOM_EDIT_STATE == ST_S_EDIT) { + if (s->edit_state.global_editing_state == ST_S_EDIT) { /* solid edit mode */ - /* apply es_mat editing to parameters */ + /* apply s->s_edit->e_mat editing to parameters */ struct directory *outdp = RT_DIR_NULL; - transform_editing_solid(s, &intern, es_mat, &s->edit_state.es_int, 0); + transform_editing_solid(s, &intern, s->s_edit->e_mat, &s->s_edit->es_int, 0); if (illump && illump->s_u_data) { bdata = (struct ged_bv_data *)illump->s_u_data; outdp = LAST_SOLID(bdata); @@ -578,7 +580,7 @@ cmd_ged_inside(ClientData clientData, Tcl_Interp *interpreter, int argc, const c } else { ret = TCL_ERROR; } - } else if (GEOM_EDIT_STATE == ST_O_EDIT) { + } else if (s->edit_state.global_editing_state == ST_O_EDIT) { mat_t newmat; struct directory *outdp = RT_DIR_NULL; @@ -590,9 +592,9 @@ cmd_ged_inside(ClientData clientData, Tcl_Interp *interpreter, int argc, const c return TCL_ERROR; } /* use the solid at bottom of path (key solid) */ - /* apply es_mat and modelchanges editing to parameters */ - bn_mat_mul(newmat, modelchanges, es_mat); - transform_editing_solid(s, &intern, newmat, &s->edit_state.es_int, 0); + /* apply s->s_edit->e_mat and s->s_edit->model_changes editing to parameters */ + bn_mat_mul(newmat, s->s_edit->model_changes, s->s_edit->e_mat); + transform_editing_solid(s, &intern, newmat, &s->s_edit->es_int, 0); if (illump && illump->s_u_data) { bdata = (struct ged_bv_data *)illump->s_u_data; outdp = LAST_SOLID(bdata); @@ -1283,9 +1285,10 @@ cmdline(struct mged_state *s, struct bu_vls *vp, int record) } -void -mged_print_result(struct mged_state *s, int UNUSED(status)) +int +mged_print_result(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(ud)) { + struct mged_state *s = (struct mged_state *)d; size_t len; const char *result = Tcl_GetStringResult(s->interp); @@ -1298,6 +1301,93 @@ mged_print_result(struct mged_state *s, int UNUSED(status)) } Tcl_ResetResult(s->interp); + + return TCL_OK; +} + + +int +mged_print_str(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(ud)) +{ + struct mged_state *s = (struct mged_state *)d; + + Tcl_AppendResult(s->interp, bu_vls_cstr(s->s_edit->log_str), (char *)NULL); + + return TCL_OK; +} + +int +mged_view_update(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(ud)) +{ + struct mged_state *s = (struct mged_state *)d; + + dm_set_dirty(s->mged_curr_dm->dm_dmp, 1); + (void)Tcl_Eval(s->interp, "active_edit_callback"); + + return TCL_OK; +} + +int +mged_view_set_flag(int UNUSED(ac), const char **UNUSED(av), void *d, void *flagp) +{ + struct mged_state *s = (struct mged_state *)d; + int *flag = (int *)flagp; + + view_state->vs_flag = *flag; + + return TCL_OK; +} + +int +mged_get_filename(int ac, const char **av, void *d, void *sret) +{ + if (!ac || !av || !d || !sret) + return BRLCAD_ERROR; + + char *str = bu_strdup(av[0]); + char **ret = (char **)sret; + + struct mged_state *s = (struct mged_state *)d; + struct bu_vls cmd = BU_VLS_INIT_ZERO; + struct bu_vls varname_vls = BU_VLS_INIT_ZERO; + char *dir; + char *fptr; + char *ptr1; + char *ptr2; + + bu_vls_strcpy(&varname_vls, "mged_gui(getFileDir)"); + + if ((fptr=strrchr(str, '/'))) { + dir = (char *)bu_malloc((strlen(str)+1)*sizeof(char), "get_file_name: dir"); + ptr1 = str; + ptr2 = dir; + while (ptr1 != fptr) + *ptr2++ = *ptr1++; + *ptr2 = '\0'; + Tcl_SetVar(s->interp, bu_vls_addr(&varname_vls), dir, TCL_GLOBAL_ONLY); + bu_free((void *)dir, "get_file_name: directory string"); + } + + if (dm_get_pathname(DMP)) { + bu_vls_printf(&cmd, + "getFile %s %s {{{All Files} {*}}} {Get File}", + bu_vls_addr(dm_get_pathname(DMP)), + bu_vls_addr(&varname_vls)); + } + bu_vls_free(&varname_vls); + + if (Tcl_Eval(s->interp, bu_vls_addr(&cmd))) { + (*ret) = NULL; + goto str_ret; + } + if (Tcl_GetStringResult(s->interp)[0] != '\0') { + (*ret) = bu_strdup(Tcl_GetStringResult(s->interp)); + goto str_ret; + } +str_ret: + bu_vls_free(&cmd); + bu_free(str, "str"); + return BRLCAD_OK; } /** @@ -1362,7 +1452,7 @@ f_quit(ClientData clientData, Tcl_Interp *interpreter, int argc, const char *arg return TCL_ERROR; } - if (GEOM_EDIT_STATE != ST_VIEW) + if (s->edit_state.global_editing_state != ST_VIEW) button(s, BE_REJECT); quit(s); /* Exiting time */ @@ -1630,8 +1720,7 @@ mged_global_variable_setup(struct mged_state *s) Tcl_LinkVar(s->interp, "mged_default(db_upgrade)", (char *)&mged_global_db_ctx.db_upgrade, TCL_LINK_INT); Tcl_LinkVar(s->interp, "mged_default(db_version)", (char *)&mged_global_db_ctx.db_version, TCL_LINK_INT); - Tcl_LinkVar(s->interp, "edit_class", (char *)&es_edclass, TCL_LINK_INT); - Tcl_LinkVar(s->interp, "edit_solid_flag", (char *)&es_edflag, TCL_LINK_INT); + Tcl_LinkVar(s->interp, "edit_class", (char *)&s->edit_state.e_edclass, TCL_LINK_INT); Tcl_LinkVar(s->interp, "edit_object_flag", (char *)&edobj, TCL_LINK_INT); /* link some tcl variables to these corresponding globals */ @@ -1859,7 +1948,7 @@ cmd_units(ClientData clientData, Tcl_Interp *interpreter, int argc, const char * set_localunit_TclVar(s); sf = s->dbip->dbi_base2local / sf; update_grids(s,sf); - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); return TCL_OK; diff --git a/src/mged/dm-generic.c b/src/mged/dm-generic.c index d23e112adf..288f37494d 100644 --- a/src/mged/dm-generic.c +++ b/src/mged/dm-generic.c @@ -48,10 +48,6 @@ #include "./mged_dm.h" #include "./menu.h" - -extern point_t e_axes_pos; -extern point_t curr_e_axes_pos; - int common_dm(struct mged_state *s, int argc, const char *argv[]) { @@ -205,7 +201,7 @@ common_dm(struct mged_state *s, int argc, const char *argv[]) point_t model_pt; snap_to_grid(s, &fx, &fy); - MAT4X3PNT(view_pt, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); + MAT4X3PNT(view_pt, view_state->vs_gvp->gv_model2view, s->s_edit->curr_e_axes_pos); view_pt[X] = fx; view_pt[Y] = fy; MAT4X3PNT(model_pt, view_state->vs_gvp->gv_view2model, view_pt); @@ -217,15 +213,15 @@ common_dm(struct mged_state *s, int argc, const char *argv[]) point_t model_pt; snap_to_grid(s, &fx, &fy); - MAT4X3PNT(view_pt, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); + MAT4X3PNT(view_pt, view_state->vs_gvp->gv_model2view, s->s_edit->curr_e_axes_pos); view_pt[X] = fx; view_pt[Y] = fy; MAT4X3PNT(model_pt, view_state->vs_gvp->gv_view2model, view_pt); VSCALE(model_pt, model_pt, s->dbip->dbi_base2local); bu_vls_printf(&vls, "translate %lf %lf %lf", model_pt[X], model_pt[Y], model_pt[Z]); } else if (grid_state->snap && !stolen && - GEOM_EDIT_STATE != ST_S_PICK && GEOM_EDIT_STATE != ST_O_PICK && - GEOM_EDIT_STATE != ST_O_PATH && !SEDIT_PICK && !EDIT_SCALE) { + s->edit_state.global_editing_state != ST_S_PICK && s->edit_state.global_editing_state != ST_O_PICK && + s->edit_state.global_editing_state != ST_O_PATH && !SEDIT_PICK && !EDIT_SCALE) { point_t view_pt; point_t model_pt; point_t vcenter; @@ -266,14 +262,22 @@ common_dm(struct mged_state *s, int argc, const char *argv[]) am_mode = AMM_TRAN; if (grid_state->snap) { - int save_edflag; - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + int save_edflag = 0; + int save_rot = 0; + int save_tra = 0; + int save_sca = 0; + int save_pic = 0; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_TRAN) - es_edflag = STRANS; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_TRANS); } else { save_edflag = edobj; edobj = BE_O_XY; @@ -281,23 +285,28 @@ common_dm(struct mged_state *s, int argc, const char *argv[]) snap_keypoint_to_grid(s); - if (GEOM_EDIT_STATE == ST_S_EDIT) - es_edflag = save_edflag; - else + if (s->edit_state.global_editing_state == ST_S_EDIT) { + s->s_edit->edit_flag = save_edflag; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; + } else { edobj = save_edflag; + } } else snap_view_center_to_grid(s); } break; case 's': - if (GEOM_EDIT_STATE == ST_S_EDIT && mged_variables->mv_transform == 'e' && - ZERO(acc_sc_sol)) - acc_sc_sol = 1.0; - else if (GEOM_EDIT_STATE == ST_O_EDIT && mged_variables->mv_transform == 'e') { - s->edit_state.edit_absolute_scale = acc_sc_obj - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + if (s->edit_state.global_editing_state == ST_S_EDIT && mged_variables->mv_transform == 'e' && + ZERO(s->s_edit->acc_sc_sol)) + s->s_edit->acc_sc_sol = 1.0; + else if (s->edit_state.global_editing_state == ST_O_EDIT && mged_variables->mv_transform == 'e') { + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc_obj - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; } am_mode = AMM_SCALE; @@ -460,37 +469,37 @@ common_dm(struct mged_state *s, int argc, const char *argv[]) case 's': switch (*argv[2]) { case 'x': - if (GEOM_EDIT_STATE == ST_S_EDIT && mged_variables->mv_transform == 'e' && - ZERO(acc_sc_sol)) - acc_sc_sol = 1.0; - else if (GEOM_EDIT_STATE == ST_O_EDIT && mged_variables->mv_transform == 'e') { - s->edit_state.edit_absolute_scale = acc_sc[0] - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + if (s->edit_state.global_editing_state == ST_S_EDIT && mged_variables->mv_transform == 'e' && + ZERO(s->s_edit->acc_sc_sol)) + s->s_edit->acc_sc_sol = 1.0; + else if (s->edit_state.global_editing_state == ST_O_EDIT && mged_variables->mv_transform == 'e') { + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc[0] - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; } am_mode = AMM_CON_SCALE_X; break; case 'y': - if (GEOM_EDIT_STATE == ST_S_EDIT && mged_variables->mv_transform == 'e' && - ZERO(acc_sc_sol)) - acc_sc_sol = 1.0; - else if (GEOM_EDIT_STATE == ST_O_EDIT && mged_variables->mv_transform == 'e') { - s->edit_state.edit_absolute_scale = acc_sc[1] - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + if (s->edit_state.global_editing_state == ST_S_EDIT && mged_variables->mv_transform == 'e' && + ZERO(s->s_edit->acc_sc_sol)) + s->s_edit->acc_sc_sol = 1.0; + else if (s->edit_state.global_editing_state == ST_O_EDIT && mged_variables->mv_transform == 'e') { + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc[1] - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; } am_mode = AMM_CON_SCALE_Y; break; case 'z': - if (GEOM_EDIT_STATE == ST_S_EDIT && mged_variables->mv_transform == 'e' && - ZERO(acc_sc_sol)) - acc_sc_sol = 1.0; - else if (GEOM_EDIT_STATE == ST_O_EDIT && mged_variables->mv_transform == 'e') { - s->edit_state.edit_absolute_scale = acc_sc[2] - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + if (s->edit_state.global_editing_state == ST_S_EDIT && mged_variables->mv_transform == 'e' && + ZERO(s->s_edit->acc_sc_sol)) + s->s_edit->acc_sc_sol = 1.0; + else if (s->edit_state.global_editing_state == ST_O_EDIT && mged_variables->mv_transform == 'e') { + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc[2] - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; } am_mode = AMM_CON_SCALE_Z; diff --git a/src/mged/doevent.c b/src/mged/doevent.c index e6caefbe3d..6a3d93fe9a 100644 --- a/src/mged/doevent.c +++ b/src/mged/doevent.c @@ -54,62 +54,17 @@ #include "./mged_dm.h" #include "./sedit.h" - +/* Ew. Global. */ extern int doMotion; /* defined in buttons.c */ #ifdef HAVE_X11_TYPES static void motion_event_handler(struct mged_state *, XMotionEvent *); #endif -#ifdef IR_KNOBS -static void dials_event_handler(XDeviceMotionEvent *); -#endif -#ifdef IR_KNOBS -# define NOISE 16 /* Size of dead spot on knob */ -#endif -#ifdef IR_BUTTONS -static void buttons_event_handler(XDeviceButtonEvent *); -/* - * Map SGI Button numbers to MGED button functions. - * The layout of this table is suggestive of the actual button box layout. - */ -#define SW_HELP_KEY SW0 -#define SW_ZERO_KEY SW3 -#define HELP_KEY 0 -#define ZERO_KNOBS 0 -static unsigned char bmap[IR_BUTTONS] = { - HELP_KEY, BV_ADCURSOR, BV_RESET, ZERO_KNOBS, - BE_O_SCALE, BE_O_XSCALE, BE_O_YSCALE, BE_O_ZSCALE, 0, BV_VSAVE, - BE_O_X, BE_O_Y, BE_O_XY, BE_O_ROTATE, 0, BV_VRESTORE, - BE_S_TRANS, BE_S_ROTATE, BE_S_SCALE, BE_MENU, BE_O_ILLUMINATE, BE_S_ILLUMINATE, - BE_REJECT, BV_BOTTOM, BV_TOP, BV_REAR, BV_45_45, BE_ACCEPT, - BV_RIGHT, BV_FRONT, BV_LEFT, BV_35_25 -}; -#endif -#ifdef IR_KNOBS -/* - * Labels for knobs in help mode. - */ -static char *kn1_knobs[] = { - /* 0 */ "adc <1", /* 1 */ "zoom", - /* 2 */ "adc <2", /* 3 */ "adc dist", - /* 4 */ "adc y", /* 5 */ "y slew", - /* 6 */ "adc x", /* 7 */ "x slew" -}; -static char *kn2_knobs[] = { - /* 0 */ "unused", /* 1 */ "zoom", - /* 2 */ "z rot", /* 3 */ "z slew", - /* 4 */ "y rot", /* 5 */ "y slew", - /* 6 */ "x rot", /* 7 */ "x slew" -}; -#endif -#if defined(IR_BUTTONS) || defined(IR_KNOBS) -static int button0 = 0; -#endif #ifdef HAVE_X11_TYPES int @@ -119,7 +74,7 @@ doEvent(ClientData clientData, XEvent *eventPtr) struct mged_dm *save_dm_list; int status; - if (eventPtr->type == DestroyNotify || (unsigned long)eventPtr->xany.window == 0) + if (eventPtr->type == DestroyNotify || (unsigned long)eventPtr->xany.window == 0 || !MGED_STATE) return TCL_OK; // The set_curr_dm logic here appears to be important for Multipane mode - @@ -182,30 +137,6 @@ doEvent(ClientData clientData, XEvent *eventPtr) /* no further processing of this event */ status = TCL_RETURN; } -#ifdef IR_KNOBS - else if (dm_event_cmp(DMP, DM_MOTION_NOTIFY, eventPtr->type) == 1) { - dials_event_handler((XDeviceMotionEvent *)eventPtr); - dm_set_dirty(DMP, 1); - - /* no further processing of this event */ - status = TCL_RETURN; - } -#endif -#ifdef IR_BUTTONS - else if (dm_event_cmp(DMP, DM_BUTTON_PRESS, eventPtr->type) == 1) { - buttons_event_handler((XDeviceButtonEvent *)eventPtr, 1); - dm_set_dirty(DMP, 1); - - /* no further processing of this event */ - status = TCL_RETURN; - } else if (dm_event_cmp(DMP, DM_BUTTON_RELEASE, eventPtr->type) == 1) { - buttons_event_handler((XDeviceButtonEvent *)eventPtr, 0); - dm_set_dirty(DMP, 1); - - /* no further processing of this event */ - status = TCL_RETURN; - } -#endif if (save_dm_list) MGED_CK_STATE(s); @@ -220,24 +151,7 @@ doEvent(ClientData UNUSED(clientData), void *UNUSED(eventPtr)) { #endif /* HAVE_X11_XLIB_H */ -#if defined(IR_BUTTONS) || defined(IR_KNOBS) -static void -set_knob_offset() -{ - int i; - for (i = 0; i < 8; ++i) - dm_knobs[i] = 0; -} -#endif - -#if defined(IR_BUTTONS) || defined(IR_KNOBS) -static void -common_dbtext(char *str) -{ - bu_log("common_dbtext: You pressed Help key and '%s'\n", str); -} -#endif #ifdef HAVE_X11_TYPES @@ -246,6 +160,10 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) { struct bu_vls cmd = BU_VLS_INIT_ZERO; int save_edflag = -1; + int save_rot = 0; + int save_tra = 0; + int save_sca = 0; + int save_pic = 0; int mx, my; int dx, dy; int width, height; @@ -313,13 +231,17 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) save_coords = mged_variables->mv_coords; mged_variables->mv_coords = 'v'; - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_ROTATE) - es_edflag = SROT; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_ROT); } else { save_edflag = edobj; edobj = BE_O_ROTATE; @@ -357,13 +279,17 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) fx = dx / (fastf_t)width * 2.0; fy = -dy / (fastf_t)height / dm_get_aspect(DMP) * 2.0; - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_TRAN) - es_edflag = STRANS; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_TRANS); } else { save_edflag = edobj; edobj = BE_O_XY; @@ -390,7 +316,7 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) VSUB2(diff, model_pt, vcenter); VSCALE(diff, diff, s->dbip->dbi_base2local); VADD2(model_pt, dm_work_pt, diff); - if (GEOM_EDIT_STATE == ST_S_EDIT) + if (s->edit_state.global_editing_state == ST_S_EDIT) bu_vls_printf(&cmd, "p %lf %lf %lf", model_pt[X], model_pt[Y], model_pt[Z]); else bu_vls_printf(&cmd, "translate %lf %lf %lf", model_pt[X], model_pt[Y], model_pt[Z]); @@ -423,12 +349,16 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) goto reset_edflag; } case AMM_SCALE: - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT && !SEDIT_SCALE) { - save_edflag = es_edflag; - es_edflag = SSCALE; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_SCALE) { + if (s->edit_state.global_editing_state == ST_S_EDIT && !SEDIT_SCALE) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_SCALE); + } else if (s->edit_state.global_editing_state == ST_O_EDIT && !OEDIT_SCALE) { save_edflag = edobj; edobj = BE_O_SCALE; } @@ -481,12 +411,16 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) break; case AMM_CON_ROT_X: - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_ROTATE) - es_edflag = SROT; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_ROT); } else { save_edflag = edobj; edobj = BE_O_ROTATE; @@ -506,12 +440,16 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) break; case AMM_CON_ROT_Y: - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_ROTATE) - es_edflag = SROT; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_ROT); } else { save_edflag = edobj; edobj = BE_O_ROTATE; @@ -531,12 +469,16 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) break; case AMM_CON_ROT_Z: - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_ROTATE) - es_edflag = SROT; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_ROT); } else { save_edflag = edobj; edobj = BE_O_ROTATE; @@ -556,13 +498,17 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) break; case AMM_CON_TRAN_X: - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_TRAN) - es_edflag = STRANS; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_TRAN) { + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_TRANS); + } else if (s->edit_state.global_editing_state == ST_O_EDIT && !OEDIT_TRAN) { save_edflag = edobj; edobj = BE_O_X; } @@ -580,13 +526,17 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) break; case AMM_CON_TRAN_Y: - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_TRAN) - es_edflag = STRANS; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_TRAN) { + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_TRANS); + } else if (s->edit_state.global_editing_state == ST_O_EDIT && !OEDIT_TRAN) { save_edflag = edobj; edobj = BE_O_Y; } @@ -604,13 +554,17 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) break; case AMM_CON_TRAN_Z: - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_TRAN) - es_edflag = STRANS; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_TRAN) { + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_TRANS); + } else if (s->edit_state.global_editing_state == ST_O_EDIT && !OEDIT_TRAN) { save_edflag = edobj; edobj = BE_O_XY; } @@ -628,13 +582,17 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) break; case AMM_CON_SCALE_X: - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_SCALE) - es_edflag = SSCALE; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_SCALE) { + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_SCALE); + } else if (s->edit_state.global_editing_state == ST_O_EDIT && !OEDIT_SCALE) { save_edflag = edobj; edobj = BE_O_XSCALE; } @@ -652,13 +610,17 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) break; case AMM_CON_SCALE_Y: - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_SCALE) - es_edflag = SSCALE; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_SCALE) { + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_SCALE); + } else if (s->edit_state.global_editing_state == ST_O_EDIT && !OEDIT_SCALE) { save_edflag = edobj; edobj = BE_O_YSCALE; } @@ -676,13 +638,17 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) break; case AMM_CON_SCALE_Z: - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) && + if ((s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) && mged_variables->mv_transform == 'e') { - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_SCALE) - es_edflag = SSCALE; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_SCALE) { + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_SCALE); + } else if (s->edit_state.global_editing_state == ST_O_EDIT && !OEDIT_SCALE) { save_edflag = edobj; edobj = BE_O_ZSCALE; } @@ -750,9 +716,13 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) reset_edflag: if (save_edflag != -1) { - if (GEOM_EDIT_STATE == ST_S_EDIT) - es_edflag = save_edflag; - else if (GEOM_EDIT_STATE == ST_O_EDIT) + if (s->edit_state.global_editing_state == ST_S_EDIT) { + s->s_edit->edit_flag = save_edflag ; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; + } else if (s->edit_state.global_editing_state == ST_O_EDIT) edobj = save_edflag; } @@ -764,705 +734,7 @@ motion_event_handler(struct mged_state *s, XMotionEvent *xmotion) #endif /* HAVE_X11_XLIB_H */ -#ifdef IR_KNOBS -static void -dials_event_handler(XDeviceMotionEvent *dmep) -{ - static int knob_values[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - struct bu_vls cmd = BU_VLS_INIT_ZERO; - int save_edflag = -1; - int setting; - fastf_t f; - - if (s->dbip == DBI_NULL) - return; - - if (button0) { - common_dbtext((adc_state->adc_draw ? kn1_knobs:kn2_knobs)[dmep->first_axis]); - return; - } - - switch (DIAL0 + dmep->first_axis) { - case DIAL0: - if (adc_state->adc_draw) { - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && - !adc_state->adc_dv_a1) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit(adc_state->adc_dv_a1) + dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob ang1 %f\n", - 45.0 - 45.0*((double)setting) * INV_GED); - } else { - if (mged_variables->mv_rateknobs) { - f = view_state->vs_rate_model_rotate[Z]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob -m z %f\n", setting / 512.0); - } else { - f = view_state->vs_absolute_model_rotate[Z]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(2.847 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - f = dm_limit(dm_knobs[dmep->first_axis]) / 512.0; - bu_vls_printf(&cmd, "knob -m az %f\n", dm_wrap(f) * 180.0); - } - } - break; - case DIAL1: - if (mged_variables->mv_rateknobs) { - if (EDIT_SCALE && mged_variables->mv_transform == 'e') - f = edit_rate_scale; - else - f = view_state->vs_rate_scale; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob S %f\n", setting / 512.0); - } else { - if (EDIT_SCALE && mged_variables->mv_transform == 'e') - f = edit_absolute_scale; - else - f = view_state->vs_absolute_scale; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob aS %f\n", setting / 512.0); - } - break; - case DIAL2: - if (adc_state->adc_draw) { - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && - !adc_state->adc_dv_a2) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit(adc_state->adc_dv_a2) + dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob ang2 %f\n", - 45.0 - 45.0*((double)setting) * INV_GED); - } else { - if (mged_variables->mv_rateknobs) { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - f = edit_rate_model_rotate[Z]; - break; - case 'o': - f = edit_rate_object_rotate[Z]; - break; - case 'v': - default: - f = edit_rate_view_rotate[Z]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_ROTATE) - es_edflag = SROT; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_ROTATE) { - save_edflag = edobj; - edobj = BE_O_ROTATE; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_rate_model_rotate[Z]; - else - f = view_state->vs_rate_rotate[Z]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob z %f\n", setting / 512.0); - } else { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - f = edit_absolute_model_rotate[Z]; - break; - case 'o': - f = edit_absolute_object_rotate[Z]; - break; - case 'v': - default: - f = edit_absolute_view_rotate[Z]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_ROTATE) - es_edflag = SROT; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_ROTATE) { - save_edflag = edobj; - edobj = BE_O_ROTATE; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_absolute_model_rotate[Z]; - else - f = view_state->vs_absolute_rotate[Z]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(2.847 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - f = dm_limit(dm_knobs[dmep->first_axis]) / 512.0; - bu_vls_printf(&cmd, "knob az %f\n", dm_wrap(f) * 180.0); - } - } - break; - case DIAL3: - if (adc_state->adc_draw) { - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && - !adc_state->adc_dv_dist) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit(adc_state->adc_dv_dist) + dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob distadc %d\n", setting); - } else { - if (mged_variables->mv_rateknobs) { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - case 'o': - f = edit_rate_model_tran[Z]; - break; - case 'v': - default: - f = edit_rate_view_tran[Z]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_TRAN) - es_edflag = STRANS; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_TRAN) { - save_edflag = edobj; - edobj = BE_O_XY; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_rate_model_tran[Z]; - else - f = view_state->vs_rate_tran[Z]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob Z %f\n", setting / 512.0); - } else { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - case 'o': - f = edit_absolute_model_tran[Z]; - break; - case 'v': - default: - f = edit_absolute_view_tran[Z]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_TRAN) - es_edflag = STRANS; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_TRAN) { - save_edflag = edobj; - edobj = BE_O_XY; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_absolute_model_tran[Z]; - else - f = view_state->vs_absolute_tran[Z]; - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && - !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob aZ %f\n", setting / 512.0 * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local); - } - } - break; - case DIAL4: - if (adc_state->adc_draw) { - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && - !adc_state->adc_dv_y) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit(adc_state->adc_dv_y) + dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob yadc %d\n", setting); - } else { - if (mged_variables->mv_rateknobs) { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - f = edit_rate_model_rotate[Y]; - break; - case 'o': - f = edit_rate_object_rotate[Y]; - break; - case 'v': - default: - f = edit_rate_view_rotate[Y]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_ROTATE) - es_edflag = SROT; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_ROTATE) { - save_edflag = edobj; - edobj = BE_O_ROTATE; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_rate_model_rotate[Y]; - else - f = view_state->vs_rate_rotate[Y]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob y %f\n", setting / 512.0); - } else { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - f = edit_absolute_model_rotate[Y]; - break; - case 'o': - f = edit_absolute_object_rotate[Y]; - break; - case 'v': - default: - f = edit_absolute_view_rotate[Y]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_ROTATE) - es_edflag = SROT; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_ROTATE) { - save_edflag = edobj; - edobj = BE_O_ROTATE; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_absolute_model_rotate[Y]; - else - f = view_state->vs_absolute_rotate[Y]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && - !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(2.847 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - f = dm_limit(dm_knobs[dmep->first_axis]) / 512.0; - bu_vls_printf(&cmd, "knob ay %f\n", dm_wrap(f) * 180.0); - } - } - break; - case DIAL5: - if (mged_variables->mv_rateknobs) { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - case 'o': - f = edit_rate_model_tran[Y]; - break; - case 'v': - default: - f = edit_rate_view_tran[Y]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_TRAN) - es_edflag = STRANS; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_TRAN) { - save_edflag = edobj; - edobj = BE_O_XY; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_rate_model_tran[Y]; - else - f = view_state->vs_rate_tran[Y]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob Y %f\n", setting / 512.0); - } else { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - case 'o': - f = edit_absolute_model_tran[Y]; - break; - case 'v': - default: - f = edit_absolute_view_tran[Y]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_TRAN) - es_edflag = STRANS; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_TRAN) { - save_edflag = edobj; - edobj = BE_O_XY; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_absolute_model_tran[Y]; - else - f = view_state->vs_absolute_tran[Y]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob aY %f\n", setting / 512.0 * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local); - } - break; - case DIAL6: - if (adc_state->adc_draw) { - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && - !adc_state->adc_dv_x) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit(adc_state->adc_dv_x) + dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob xadc %d\n", setting); - } else { - if (mged_variables->mv_rateknobs) { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - f = edit_rate_model_rotate[X]; - break; - case 'o': - f = edit_rate_object_rotate[X]; - break; - case 'v': - default: - f = edit_rate_view_rotate[X]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_ROTATE) - es_edflag = SROT; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_ROTATE) { - save_edflag = edobj; - edobj = BE_O_ROTATE; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_rate_model_rotate[X]; - else - f = view_state->vs_rate_rotate[X]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob x %f\n", setting / 512.0); - } else { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - f = edit_absolute_model_rotate[X]; - break; - case 'o': - f = edit_absolute_object_rotate[X]; - break; - case 'v': - default: - f = edit_absolute_view_rotate[X]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_ROTATE) - es_edflag = SROT; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_ROTATE) { - save_edflag = edobj; - edobj = BE_O_ROTATE; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_absolute_model_rotate[X]; - else - f = view_state->vs_absolute_rotate[X]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(2.847 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - f = dm_limit(dm_knobs[dmep->first_axis]) / 512.0; - bu_vls_printf(&cmd, "knob ax %f\n", dm_wrap(f) * 180.0); - } - } - break; - case DIAL7: - if (mged_variables->mv_rateknobs) { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - case 'o': - f = edit_rate_model_tran[X]; - break; - case 'v': - default: - f = edit_rate_view_tran[X]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_TRAN) - es_edflag = STRANS; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_TRAN) { - save_edflag = edobj; - edobj = BE_O_XY; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_rate_model_tran[X]; - else - f = view_state->vs_rate_tran[X]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob X %f\n", setting / 512.0); - } else { - if ((GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) - && mged_variables->mv_transform == 'e') { - switch (mged_variables->mv_coords) { - case 'm': - case 'o': - f = edit_absolute_model_tran[X]; - break; - case 'v': - default: - f = edit_absolute_view_tran[X]; - break; - } - - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; - if (!SEDIT_TRAN) - es_edflag = STRANS; - } else if (GEOM_EDIT_STATE == ST_O_EDIT && !OEDIT_TRAN) { - save_edflag = edobj; - edobj = BE_O_XY; - } - } else if (mged_variables->mv_coords == 'm') - f = view_state->vs_absolute_model_tran[X]; - else - f = view_state->vs_absolute_tran[X]; - - if (-NOISE <= dm_knobs[dmep->first_axis] && - dm_knobs[dmep->first_axis] <= NOISE && !f) - dm_knobs[dmep->first_axis] += - dmep->axis_data[0] - knob_values[dmep->first_axis]; - else - dm_knobs[dmep->first_axis] = - dm_unlimit((int)(512.5 * f)) + - dmep->axis_data[0] - knob_values[dmep->first_axis]; - - setting = dm_limit(dm_knobs[dmep->first_axis]); - bu_vls_printf(&cmd, "knob aX %f\n", setting / 512.0 * view_state->vs_gvp->gv_scale * s->dbip->dbi_base2local); - } - break; - default: - break; - } - - /* Keep track of the knob values */ - knob_values[dmep->first_axis] = dmep->axis_data[0]; - - Tcl_Eval(s->interp, bu_vls_addr(&cmd)); - - if (save_edflag != -1) { - if (GEOM_EDIT_STATE == ST_S_EDIT) - es_edflag = save_edflag; - else if (GEOM_EDIT_STATE == ST_O_EDIT) - edobj = save_edflag; - } - - bu_vls_free(&cmd); -} -#endif - -#ifdef IR_BUTTONS -static void -buttons_event_handler(XDeviceButtonEvent *dbep, int press) -{ - if (press) { - struct bu_vls cmd = BU_VLS_INIT_ZERO; - - if (dbep->button == 1) { - button0 = 1; - return; - } - - if (button0) { - common_dbtext(label_button(bmap[dbep->button - 1])); - return; - } else if (dbep->button == 4) { - set_knob_offset(); - - bu_vls_strcat(&cmd, "knob zero\n"); - } else { - bu_vls_printf(&cmd, "press %s\n", - label_button(bmap[dbep->button - 1])); - } - - (void)Tcl_Eval(s->interp, bu_vls_addr(&cmd)); - bu_vls_free(&cmd); - } else { - if (dbep->button == 1) - button0 = 0; - } -} -#endif /* * Local Variables: diff --git a/src/mged/dozoom.c b/src/mged/dozoom.c index 277ac45755..b5bed8de6c 100644 --- a/src/mged/dozoom.c +++ b/src/mged/dozoom.c @@ -32,8 +32,6 @@ #include "./mged_dm.h" mat_t perspective_mat; -mat_t incr_change; -mat_t modelchanges; mat_t identity; @@ -185,7 +183,7 @@ dozoom(struct mged_state *s, int which_eye) * Draw all solids involved in editing. * They may be getting transformed away from the other solids. */ - if (GEOM_EDIT_STATE == ST_VIEW) + if (s->edit_state.global_editing_state == ST_VIEW) return; if (view_state->vs_gvp->gv_perspective <= 0) { @@ -195,7 +193,7 @@ dozoom(struct mged_state *s, int which_eye) mat = newmat; } dm_loadmatrix(DMP, mat, which_eye); - inv_viewsize /= modelchanges[15]; + inv_viewsize /= s->s_edit->model_changes[15]; dm_set_fg(DMP, color_scheme->cs_geo_hl[0], color_scheme->cs_geo_hl[1], diff --git a/src/mged/edarb.c b/src/mged/edarb.c deleted file mode 100644 index ab25df9b2c..0000000000 --- a/src/mged/edarb.c +++ /dev/null @@ -1,328 +0,0 @@ -/* E D A R B . C - * BRL-CAD - * - * Copyright (c) 1985-2025 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This program 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 program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ -/** @file mged/edarb.c - * - */ - -#include "common.h" - -#include -#include -#include -#include - -#include "vmath.h" -#include "rt/geom.h" -#include "rt/primitives/arb8.h" -#include "ged.h" -#include "rt/db4.h" - -#include "./sedit.h" -#include "./mged.h" -#include "./mged_dm.h" -#include "./cmd.h" - -int newedge; - -/* - * An ARB edge is moved by finding the direction of the line - * containing the edge and the 2 "bounding" planes. The new edge is - * found by intersecting the new line location with the bounding - * planes. The two "new" planes thus defined are calculated and the - * affected points are calculated by intersecting planes. This keeps - * ALL faces planar. - * - */ -int -editarb(struct mged_state *s, vect_t pos_model) -{ - int ret = 0; - struct rt_arb_internal *arb; - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - - ret = arb_edit(arb, es_peqn, es_menu, newedge, pos_model, &s->tol.tol); - - // arb_edit doesn't zero out our global any more as a library call, so - // reset once operation is complete. - newedge = 0; - - if (ret) { - es_edflag = IDLE; - } - - return ret; -} - -/* Extrude command - project an arb face */ -/* Format: extrude face distance */ -int -f_extrude(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) -{ - struct cmdtab *ctp = (struct cmdtab *)clientData; - MGED_CK_CMD(ctp); - struct mged_state *s = ctp->s; - - static int face; - static fastf_t dist; - struct rt_arb_internal *arb; - - CHECK_DBI_NULL; - - if (argc < 3 || 3 < argc) { - struct bu_vls vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&vls, "help extrude"); - Tcl_Eval(interp, bu_vls_addr(&vls)); - bu_vls_free(&vls); - - return TCL_ERROR; - } - - if (not_state(s, ST_S_EDIT, "Extrude")) - return TCL_ERROR; - - if (s->edit_state.es_int.idb_type != ID_ARB8) { - Tcl_AppendResult(interp, "Extrude: solid type must be ARB\n", (char *)NULL); - return TCL_ERROR; - } - - if (es_type != ARB8 && es_type != ARB6 && es_type != ARB4) { - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&tmp_vls, "ARB%d: extrusion of faces not allowed\n", es_type); - Tcl_AppendResult(interp, bu_vls_addr(&tmp_vls), (char *)NULL); - bu_vls_free(&tmp_vls); - - return TCL_ERROR; - } - - face = atoi(argv[1]); - - /* get distance to project face */ - dist = atof(argv[2]); - /* apply es_mat[15] to get to real model space */ - /* convert from the local unit (as input) to the base unit */ - dist = dist * es_mat[15] * s->dbip->dbi_local2base; - - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - RT_ARB_CK_MAGIC(arb); - - if (arb_extrude(arb, face, dist, &s->tol.tol, es_peqn)) { - Tcl_AppendResult(interp, "Error extruding ARB\n", (char *)NULL); - return TCL_ERROR; - } - - /* draw the updated solid */ - replot_editing_solid(s); - update_views = 1; - dm_set_dirty(DMP, 1); - - return TCL_OK; -} - - -/* Mirface command - mirror an arb face */ -/* Format: mirror face axis */ -int -f_mirface(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) -{ - struct cmdtab *ctp = (struct cmdtab *)clientData; - MGED_CK_CMD(ctp); - struct mged_state *s = ctp->s; - - int face; - struct rt_arb_internal *arb; - - if (argc < 3 || 3 < argc) { - struct bu_vls vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&vls, "help mirface"); - Tcl_Eval(interp, bu_vls_addr(&vls)); - bu_vls_free(&vls); - - return TCL_ERROR; - } - - if (not_state(s, ST_S_EDIT, "Mirface")) - return TCL_ERROR; - - if (s->edit_state.es_int.idb_type != ID_ARB8) { - Tcl_AppendResult(interp, "Mirface: solid type must be ARB\n", (char *)NULL); - return TCL_ERROR; - } - - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - RT_ARB_CK_MAGIC(arb); - - face = atoi(argv[1]); - - if (arb_mirror_face_axis(arb, es_peqn, face, argv[2], &s->tol.tol)) { - Tcl_AppendResult(interp, "Mirface: mirror operation failed\n", (char *)NULL); - return TCL_ERROR; - } - - /* draw the updated solid */ - replot_editing_solid(s); - view_state->vs_flag = 1; - - return TCL_OK; -} - - -/* Edgedir command: define the direction of an arb edge being moved - * Format: edgedir deltax deltay deltaz OR edgedir rot fb -*/ -int -f_edgedir(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) -{ - struct cmdtab *ctp = (struct cmdtab *)clientData; - MGED_CK_CMD(ctp); - struct mged_state *s = ctp->s; - - int i; - vect_t slope; - fastf_t rot, fb_a; - - if (argc < 3 || 4 < argc) { - struct bu_vls vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&vls, "help edgedir"); - Tcl_Eval(interp, bu_vls_addr(&vls)); - bu_vls_free(&vls); - - return TCL_ERROR; - } - - if (not_state(s, ST_S_EDIT, "Edgedir")) - return TCL_ERROR; - - if (es_edflag != EARB) { - Tcl_AppendResult(interp, "Not moving an ARB edge\n", (char *)NULL); - return TCL_ERROR; - } - - if (s->edit_state.es_int.idb_type != ID_ARB8) { - Tcl_AppendResult(interp, "Edgedir: solid type must be an ARB\n", (char *)NULL); - return TCL_ERROR; - } - - /* set up slope - - * if 2 values input assume rot, fb used - * else assume delta_x, delta_y, delta_z - */ - if (argc == 3) { - rot = atof(argv[1]) * DEG2RAD; - fb_a = atof(argv[2]) * DEG2RAD; - slope[0] = cos(fb_a) * cos(rot); - slope[1] = cos(fb_a) * sin(rot); - slope[2] = sin(fb_a); - } else { - for (i=0; i<3; i++) { - /* put edge slope in slope[] array */ - slope[i] = atof(argv[i+1]); - } - } - - if (ZERO(MAGNITUDE(slope))) { - Tcl_AppendResult(interp, "BAD slope\n", (char *)NULL); - return TCL_ERROR; - } - - /* get it done */ - newedge = 1; - editarb(s, slope); - sedit(s); - return TCL_OK; -} - -/* Permute command - permute the vertex labels of an ARB - * Format: permute tuple */ - -/* - * Minimum and maximum tuple lengths - * ------------------------------------------------ - * Solid # vertices needed # vertices - * type to disambiguate in THE face - * ------------------------------------------------ - * ARB4 3 3 - * ARB5 2 4 - * ARB6 2 4 - * ARB7 1 4 - * ARB8 3 4 - * ------------------------------------------------ - */ -int -f_permute(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) -{ - struct cmdtab *ctp = (struct cmdtab *)clientData; - MGED_CK_CMD(ctp); - struct mged_state *s = ctp->s; - - /* - * 1) Why were all vars declared static? - * 2) Recompute plane equations? - */ - struct bu_vls vls = BU_VLS_INIT_ZERO; - struct rt_arb_internal *arb; - CHECK_DBI_NULL; - CHECK_READ_ONLY; - - if (argc < 2 || 2 < argc) { - bu_vls_printf(&vls, "help permute"); - Tcl_Eval(interp, bu_vls_addr(&vls)); - bu_vls_free(&vls); - - return TCL_ERROR; - } - - if (not_state(s, ST_S_EDIT, "Permute")) - return TCL_ERROR; - - if (s->edit_state.es_int.idb_type != ID_ARB8) { - Tcl_AppendResult(interp, "Permute: solid type must be an ARB\n", (char *)NULL); - return TCL_ERROR; - } - - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - RT_ARB_CK_MAGIC(arb); - - if (arb_permute(arb, argv[1], &s->tol.tol)) { - Tcl_AppendResult(interp, "Permute failed.\n", (char *)NULL); - return TCL_ERROR; - } - - /* draw the updated solid */ - replot_editing_solid(s); - view_state->vs_flag = 1; - - return TCL_OK; -} - - - -/* - * Local Variables: - * mode: C - * tab-width: 8 - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ diff --git a/src/mged/edars.c b/src/mged/edars.c deleted file mode 100644 index 9cbc4a62d8..0000000000 --- a/src/mged/edars.c +++ /dev/null @@ -1,83 +0,0 @@ -/* E D A R S . C - * BRL-CAD - * - * Copyright (c) 1996-2025 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This program 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 program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ -/** @file mged/edars.c - * - */ - -#include "common.h" - -#include -#include - -#include "vmath.h" -#include "nmg.h" -#include "raytrace.h" -#include "rt/geom.h" -#include "wdb.h" - -#include "./mged.h" -#include "./sedit.h" -#include "./mged_dm.h" - - -/** - * find which vertex of an ARS is nearest *the ray from "pt" in the - * viewing direction (for vertex selection in MGED) - */ -void -find_ars_nearest_pnt( - int *crv, - int *col, - struct rt_ars_internal *ars, - point_t pick_pt, - vect_t dir) -{ - size_t i, j; - int closest_i=0, closest_j=0; - fastf_t min_dist_sq=MAX_FASTF; - - RT_ARS_CK_MAGIC(ars); - - for (i=0; incurves; i++) { - for (j=0; jpts_per_curve; j++) { - fastf_t dist_sq; - - dist_sq = bg_distsq_line3_pnt3(pick_pt, dir, &ars->curves[i][j*3]); - if (dist_sq < min_dist_sq) { - min_dist_sq = dist_sq; - closest_i = i; - closest_j = j; - } - } - } - *crv = closest_i; - *col = closest_j; -} - - -/* - * Local Variables: - * mode: C - * tab-width: 8 - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ diff --git a/src/mged/edpipe.c b/src/mged/edpipe.c deleted file mode 100644 index 74232cdfae..0000000000 --- a/src/mged/edpipe.c +++ /dev/null @@ -1,486 +0,0 @@ -/* E D P I P E . C - * BRL-CAD - * - * Copyright (c) 1995-2025 United States Government as represented by - * the U.S. Army Research Laboratory. - * - * This program 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 program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this file; see the file named COPYING for more - * information. - */ -/** @file mged/edpipe.c - * - * Functions - - * - * pipe_split_pnt - split a pipe segment at a given point - * - * find_pipe_pnt_nearest_pnt - find which segment of a pipe is nearest - * the ray from "pt" in the viewing direction (for segment selection - * in MGED) - */ - -#include "common.h" - -#include -#include - -#include "vmath.h" -#include "nmg.h" -#include "rt/geom.h" -#include "ged.h" -#include "wdb.h" - -#include "./mged.h" -#include "./sedit.h" -#include "./mged_dm.h" - - -void -pipe_split_pnt(struct bu_list *UNUSED(pipe_hd), struct wdb_pipe_pnt *UNUSED(ps), fastf_t *UNUSED(new_pt)) -{ - bu_log("WARNING: pipe splitting unimplemented\n"); -} - - -void -pipe_scale_od(struct mged_state *s, struct rt_db_internal *db_int, fastf_t scale) -{ - struct wdb_pipe_pnt *ps; - struct rt_pipe_internal *pipeip=(struct rt_pipe_internal *)db_int->idb_ptr; - - RT_PIPE_CK_MAGIC(pipeip); - - /* check that this can be done */ - for (BU_LIST_FOR(ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) { - fastf_t tmp_od; - - if (scale < 0.0) - tmp_od = (-scale); - else - tmp_od = ps->pp_od*scale; - if (ps->pp_id > tmp_od) { - Tcl_AppendResult(s->interp, "Cannot make OD less than ID\n", (char *)NULL); - return; - } - if (tmp_od > 2.0*ps->pp_bendradius) { - Tcl_AppendResult(s->interp, "Cannot make outer radius greater than bend radius\n", (char *)NULL); - return; - } - } - - for (BU_LIST_FOR(ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) - ps->pp_od *= scale; -} - - -void -pipe_scale_id(struct mged_state *s, struct rt_db_internal *db_int, fastf_t scale) -{ - struct wdb_pipe_pnt *ps; - struct rt_pipe_internal *pipeip=(struct rt_pipe_internal *)db_int->idb_ptr; - fastf_t tmp_id; - - RT_PIPE_CK_MAGIC(pipeip); - - /* check that this can be done */ - for (BU_LIST_FOR(ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) { - if (scale > 0.0) - tmp_id = ps->pp_id*scale; - else - tmp_id = (-scale); - if (ps->pp_od < tmp_id) { - Tcl_AppendResult(s->interp, "Cannot make ID greater than OD\n", (char *)NULL); - return; - } - if (tmp_id > 2.0*ps->pp_bendradius) { - Tcl_AppendResult(s->interp, "Cannot make inner radius greater than bend radius\n", (char *)NULL); - return; - } - } - - for (BU_LIST_FOR(ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) { - if (scale > 0.0) - ps->pp_id *= scale; - else - ps->pp_id = (-scale); - } -} - - -void -pipe_seg_scale_od(struct mged_state *s, struct wdb_pipe_pnt *ps, fastf_t scale) -{ - fastf_t tmp_od; - - BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "pipe segment"); - - /* need to check that the new OD is not less than ID - * of any affected segment. - */ - if (scale < 0.0) - tmp_od = (-scale); - else - tmp_od = scale*ps->pp_od; - if (ps->pp_id > tmp_od) { - Tcl_AppendResult(s->interp, "Cannot make OD smaller than ID\n", (char *)NULL); - return; - } - if (tmp_od > 2.0*ps->pp_bendradius) { - Tcl_AppendResult(s->interp, "Cannot make outer radius greater than bend radius\n", (char *)NULL); - return; - } - - if (scale > 0.0) - ps->pp_od *= scale; - else - ps->pp_od = (-scale); -} - - -void -pipe_seg_scale_id(struct mged_state *s, struct wdb_pipe_pnt *ps, fastf_t scale) -{ - fastf_t tmp_id; - - BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "pipe segment"); - - /* need to check that the new ID is not greater than OD */ - if (scale > 0.0) - tmp_id = scale*ps->pp_id; - else - tmp_id = (-scale); - if (ps->pp_od < tmp_id) { - Tcl_AppendResult(s->interp, "Cannot make ID greater than OD\n", (char *)NULL); - return; - } - if (tmp_id > 2.0*ps->pp_bendradius) { - Tcl_AppendResult(s->interp, "Cannot make inner radius greater than bend radius\n", (char *)NULL); - return; - } - - if (scale > 0.0) - ps->pp_id *= scale; - else - ps->pp_id = (-scale); -} - - -void -pipe_seg_scale_radius(struct mged_state *s, struct wdb_pipe_pnt *ps, fastf_t scale) -{ - fastf_t old_radius; - struct wdb_pipe_pnt *head; - - BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "pipe point"); - - head = ps; - while (head->l.magic != BU_LIST_HEAD_MAGIC) - head = BU_LIST_NEXT(wdb_pipe_pnt, &head->l); - - /* make sure we can make this change */ - old_radius = ps->pp_bendradius; - if (scale > 0.0) - ps->pp_bendradius *= scale; - else - ps->pp_bendradius = (-scale); - - if (ps->pp_bendradius < ps->pp_od * 0.5) { - Tcl_AppendResult(s->interp, "Cannot make bend radius less than pipe outer radius\n", (char *)NULL); - ps->pp_bendradius = old_radius; - return; - } - - if (rt_pipe_ck(&head->l)) { - /* won't work, go back to original radius */ - ps->pp_bendradius = old_radius; - return; - } - -} - - -void -pipe_scale_radius(struct mged_state *s, struct rt_db_internal *db_int, fastf_t scale) -{ - struct bu_list head; - struct wdb_pipe_pnt *old_ps, *new_ps; - struct rt_pipe_internal *pipeip=(struct rt_pipe_internal *)db_int->idb_ptr; - - RT_CK_DB_INTERNAL(db_int); - RT_PIPE_CK_MAGIC(pipeip); - - /* make a quick check for minimum bend radius */ - for (BU_LIST_FOR(old_ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) { - if (scale < 0.0) { - if ((-scale) < old_ps->pp_od * 0.5) { - Tcl_AppendResult(s->interp, "Cannot make bend radius less than pipe outer radius\n", (char *)NULL); - return; - } - } else { - if (old_ps->pp_bendradius * scale < old_ps->pp_od * 0.5) { - Tcl_AppendResult(s->interp, "Cannot make bend radius less than pipe outer radius\n", (char *)NULL); - return; - } - } - } - - /* make temporary copy of this pipe solid */ - BU_LIST_INIT(&head); - for (BU_LIST_FOR(old_ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) { - BU_ALLOC(new_ps, struct wdb_pipe_pnt); - *new_ps = (*old_ps); - BU_LIST_APPEND(&head, &new_ps->l); - } - - /* make the desired editing changes to the copy */ - for (BU_LIST_FOR(new_ps, wdb_pipe_pnt, &head)) { - if (scale < 0.0) - new_ps->pp_bendradius = (-scale); - else - new_ps->pp_bendradius *= scale; - } - - /* check if the copy is O.K. */ - if (rt_pipe_ck(&head)) { - /* won't work, go back to original */ - while (BU_LIST_NON_EMPTY(&head)) { - new_ps = BU_LIST_FIRST(wdb_pipe_pnt, &head); - BU_LIST_DEQUEUE(&new_ps->l); - bu_free((void *)new_ps, "pipe_scale_radius: new_ps"); - } - return; - } - - /* free temporary pipe solid */ - while (BU_LIST_NON_EMPTY(&head)) { - new_ps = BU_LIST_FIRST(wdb_pipe_pnt, &head); - BU_LIST_DEQUEUE(&new_ps->l); - bu_free((void *)new_ps, "pipe_scale_radius: new_ps"); - } - - /* make changes to the original */ - for (BU_LIST_FOR(old_ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) { - if (scale < 0.0) - old_ps->pp_bendradius = (-scale); - else - old_ps->pp_bendradius *= scale; - } - -} - - -struct wdb_pipe_pnt * -find_pipe_pnt_nearest_pnt(struct mged_state *s, const struct bu_list *pipe_hd, const point_t pt) -{ - struct wdb_pipe_pnt *ps; - struct wdb_pipe_pnt *nearest=(struct wdb_pipe_pnt *)NULL; - struct bn_tol tmp_tol; - fastf_t min_dist = MAX_FASTF; - vect_t dir, work; - - tmp_tol.magic = BN_TOL_MAGIC; - tmp_tol.dist = 0.0; - tmp_tol.dist_sq = tmp_tol.dist * tmp_tol.dist; - tmp_tol.perp = 0.0; - tmp_tol.para = 1.0 - tmp_tol.perp; - - /* get a direction vector in model space corresponding to z-direction in view */ - VSET(work, 0.0, 0.0, 1.0); - MAT4X3VEC(dir, view_state->vs_gvp->gv_view2model, work); - - for (BU_LIST_FOR(ps, wdb_pipe_pnt, pipe_hd)) { - fastf_t dist; - - dist = bg_dist_line3_pnt3(pt, dir, ps->pp_coord); - if (dist < min_dist) { - min_dist = dist; - nearest = ps; - } - } - return nearest; -} - - -struct wdb_pipe_pnt * -pipe_add_pnt(struct rt_pipe_internal *pipeip, struct wdb_pipe_pnt *pp, const point_t new_pt) -{ - struct wdb_pipe_pnt *last; - struct wdb_pipe_pnt *newpp; - - RT_PIPE_CK_MAGIC(pipeip); - if (pp) - BU_CKMAG(pp, WDB_PIPESEG_MAGIC, "pipe point"); - - if (pp) - last = pp; - else { - /* add new point to end of pipe solid */ - last = BU_LIST_LAST(wdb_pipe_pnt, &pipeip->pipe_segs_head); - if (last->l.magic == BU_LIST_HEAD_MAGIC) { - BU_ALLOC(newpp, struct wdb_pipe_pnt); - newpp->l.magic = WDB_PIPESEG_MAGIC; - newpp->pp_od = 30.0; - newpp->pp_id = 0.0; - newpp->pp_bendradius = 40.0; - VMOVE(newpp->pp_coord, new_pt); - BU_LIST_INSERT(&pipeip->pipe_segs_head, &newpp->l); - return newpp; - } - } - - /* build new point */ - BU_ALLOC(newpp, struct wdb_pipe_pnt); - newpp->l.magic = WDB_PIPESEG_MAGIC; - newpp->pp_od = last->pp_od; - newpp->pp_id = last->pp_id; - newpp->pp_bendradius = last->pp_bendradius; - VMOVE(newpp->pp_coord, new_pt); - - if (!pp) /* add to end of pipe solid */ - BU_LIST_INSERT(&pipeip->pipe_segs_head, &newpp->l) - else /* append after current point */ - BU_LIST_APPEND(&pp->l, &newpp->l) - - if (rt_pipe_ck(&pipeip->pipe_segs_head)) { - /* won't work here, so refuse to do it */ - BU_LIST_DEQUEUE(&newpp->l); - bu_free((void *)newpp, "pipe_add_pnt: newpp "); - return pp; - } else - return newpp; -} - - -void -pipe_ins_pnt(struct rt_pipe_internal *pipeip, struct wdb_pipe_pnt *pp, const point_t new_pt) -{ - struct wdb_pipe_pnt *first; - struct wdb_pipe_pnt *newpp; - - RT_PIPE_CK_MAGIC(pipeip); - if (pp) - BU_CKMAG(pp, WDB_PIPESEG_MAGIC, "pipe point"); - - if (pp) - first = pp; - else { - /* insert new point at start of pipe solid */ - first = BU_LIST_FIRST(wdb_pipe_pnt, &pipeip->pipe_segs_head); - if (first->l.magic == BU_LIST_HEAD_MAGIC) { - BU_ALLOC(newpp, struct wdb_pipe_pnt); - newpp->l.magic = WDB_PIPESEG_MAGIC; - newpp->pp_od = 30.0; - newpp->pp_id = 0.0; - newpp->pp_bendradius = 40.0; - VMOVE(newpp->pp_coord, new_pt); - BU_LIST_APPEND(&pipeip->pipe_segs_head, &newpp->l); - return; - } - } - - /* build new point */ - BU_ALLOC(newpp, struct wdb_pipe_pnt); - newpp->l.magic = WDB_PIPESEG_MAGIC; - newpp->pp_od = first->pp_od; - newpp->pp_id = first->pp_id; - newpp->pp_bendradius = first->pp_bendradius; - VMOVE(newpp->pp_coord, new_pt); - - if (!pp) /* add to start of pipe */ - BU_LIST_APPEND(&pipeip->pipe_segs_head, &newpp->l) - else /* insert before current point */ - BU_LIST_INSERT(&pp->l, &newpp->l) - - if (rt_pipe_ck(&pipeip->pipe_segs_head)) { - /* won't work here, so refuse to do it */ - BU_LIST_DEQUEUE(&newpp->l); - bu_free((void *)newpp, "pipe_ins_pnt: newpp "); - } -} - - -struct wdb_pipe_pnt * -pipe_del_pnt(struct mged_state *s, struct wdb_pipe_pnt *ps) -{ - struct wdb_pipe_pnt *next; - struct wdb_pipe_pnt *prev; - struct wdb_pipe_pnt *head; - - BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "pipe segment"); - - head = ps; - while (head->l.magic != BU_LIST_HEAD_MAGIC) - head = BU_LIST_NEXT(wdb_pipe_pnt, &head->l); - - next = BU_LIST_NEXT(wdb_pipe_pnt, &ps->l); - if (next->l.magic == BU_LIST_HEAD_MAGIC) - next = (struct wdb_pipe_pnt *)NULL; - - prev = BU_LIST_PREV(wdb_pipe_pnt, &ps->l); - if (prev->l.magic == BU_LIST_HEAD_MAGIC) - prev = (struct wdb_pipe_pnt *)NULL; - - if (!prev && !next) { - Tcl_AppendResult(s->interp, "Cannot delete last point in pipe\n", (char *)NULL); - return ps; - } - - BU_LIST_DEQUEUE(&ps->l); - - if (rt_pipe_ck(&head->l)) { - Tcl_AppendResult(s->interp, "Cannot delete this point, it will result in an illegal pipe\n", (char *)NULL); - if (next) - BU_LIST_INSERT(&next->l, &ps->l) - else if (prev) - BU_LIST_APPEND(&prev->l, &ps->l) - else - BU_LIST_INSERT(&head->l, &ps->l) - - return ps; - } else - bu_free((void *)ps, "pipe_del_pnt: ps"); - - if (prev) - return prev; - else - return next; - -} - - -void -pipe_move_pnt(struct mged_state *s, struct rt_pipe_internal *pipeip, struct wdb_pipe_pnt *ps, const point_t new_pt) -{ - point_t old_pt; - - RT_PIPE_CK_MAGIC(pipeip); - BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "pipe segment"); - - VMOVE(old_pt, ps->pp_coord); - - VMOVE(ps->pp_coord, new_pt); - if (rt_pipe_ck(&pipeip->pipe_segs_head)) { - Tcl_AppendResult(s->interp, "Cannot move point there\n", (char *)NULL); - VMOVE(ps->pp_coord, old_pt); - } -} - - -/* - * Local Variables: - * mode: C - * tab-width: 8 - * indent-tabs-mode: t - * c-file-style: "stroustrup" - * End: - * ex: shiftwidth=4 tabstop=8 - */ diff --git a/src/mged/edsol.c b/src/mged/edsol.c index 24df193db9..416b9fea58 100644 --- a/src/mged/edsol.c +++ b/src/mged/edsol.c @@ -19,6 +19,13 @@ */ /** @file mged/edsol.c * + * TODO - probably should try setting up an equivalent to OBJ[] table + * in librt to isolate per-primitive methods in the MGED code. Might + * be a little overkill structurally, but right now we've got a bunch + * of ID_* conditional switch tables complicating the logic. Some of + * that we were able to push to librt (labels, keypoints) but it is + * less clear if we can get away with that for the editing codes and + * the menus are extremely unlikely to be suitable librt canddiates. */ #include "common.h" @@ -35,9 +42,12 @@ #include "nmg.h" #include "rt/geom.h" #include "raytrace.h" -#include "rt/primitives/arb8.h" #include "wdb.h" #include "rt/db4.h" +#include "rt/primitives/arb8.h" +#include "rt/primitives/bot.h" +#include "rt/primitives/nmg.h" +#include "rt/primitives/pipe.h" #include "ged/view/ged_view_tmp.h" #include "./mged.h" @@ -45,228 +55,45 @@ #include "./mged_dm.h" #include "./menu.h" -extern void pipe_split_pnt(struct bu_list *, struct wdb_pipe_pnt *, point_t); -extern struct wdb_pipe_pnt *pipe_add_pnt(struct rt_pipe_internal *, struct wdb_pipe_pnt *, const point_t); - static void init_sedit_vars(struct mged_state *), init_oedit_vars(struct mged_state *), init_oedit_guts(struct mged_state *); -int nurb_closest2d(int *surface, int *uval, int *vval, const struct rt_nurb_internal *spl, const point_t ref_pt , const mat_t mat); - -point_t e_axes_pos; -point_t curr_e_axes_pos; -short int fixv; /* used in ECMD_ARB_ROTATE_FACE, f_eqn(): fixed vertex */ - - +/* Ew. Global. */ /* data for solid editing */ int sedraw; /* apply solid editing changes */ -int es_type; /* COMGEOM solid type */ -int es_edflag; /* type of editing for this solid */ -int es_edclass; /* type of editing class for this solid */ -fastf_t es_peqn[7][4]; /* ARBs defining plane equations */ +/* Ew. Global. */ fastf_t es_m[3]; /* edge(line) slope */ -mat_t es_mat; /* accumulated matrix of path */ -mat_t es_invmat; /* inverse of es_mat KAA */ - -int bot_verts[3]; /* vertices for the BOT solid */ - -point_t es_keypoint; /* center of editing xforms */ -const char *es_keytag; /* string identifying the keypoint */ -int es_keyfixed; /* keypoint specified by user? */ - -vect_t es_para; /* keyboard input param. Only when inpara set. */ -int inpara; /* es_para valid. es_mvalid must = 0 */ - -static vect_t es_mparam; /* mouse input param. Only when es_mvalid set */ -static int es_mvalid; /* es_mparam valid. inpara must = 0 */ - -static int spl_surfno; /* What surf & ctl pt to edit on spline */ -static int spl_ui; -static int spl_vi; - -static int es_ars_crv; /* curve and column identifying selected ARS point */ -static int es_ars_col; -static point_t es_pt; /* coordinates of selected ARS point */ - -struct edgeuse *es_eu=(struct edgeuse *)NULL; /* Currently selected NMG edgeuse */ -struct loopuse *lu_copy=(struct loopuse*)NULL; /* copy of loop to be extruded */ -plane_t lu_pl; /* plane equation for loop to be extruded */ -struct shell *es_s=(struct shell *)NULL; /* Shell where extrusion is to end up */ -point_t lu_keypoint; /* keypoint of lu_copy for extrusion */ - -struct wdb_pipe_pnt *es_pipe_pnt=(struct wdb_pipe_pnt *)NULL; /* Currently selected PIPE segment */ -struct wdb_metaball_pnt *es_metaball_pnt=(struct wdb_metaball_pnt *)NULL; /* Currently selected METABALL Point */ - -/* These values end up in es_menu, as do ARB vertex numbers */ -int es_menu; /* item selected from menu */ - -#define PARAM_1ARG (es_edflag == SSCALE || \ - es_edflag == PSCALE || \ - es_edflag == ECMD_BOT_THICK || \ - es_edflag == ECMD_VOL_THRESH_LO || \ - es_edflag == ECMD_VOL_THRESH_HI || \ - es_edflag == ECMD_DSP_SCALE_X || \ - es_edflag == ECMD_DSP_SCALE_Y || \ - es_edflag == ECMD_DSP_SCALE_ALT || \ - es_edflag == ECMD_EBM_HEIGHT || \ - es_edflag == ECMD_CLINE_SCALE_H || \ - es_edflag == ECMD_CLINE_SCALE_R || \ - es_edflag == ECMD_CLINE_SCALE_T || \ - es_edflag == ECMD_EXTR_SCALE_H) -#define PARAM_2ARG (es_edflag == ECMD_DSP_FSIZE || \ - es_edflag == ECMD_EBM_FSIZE) -void -set_e_axes_pos(struct mged_state *s, int both) - /* if (!both) then set only curr_e_axes_pos, otherwise - set e_axes_pos and curr_e_axes_pos */ +int +set_e_axes_pos(int UNUSED(ac), const char **UNUSED(av), void *d, void *id) + /* if (!both) then set only s->s_edit->curr_e_axes_pos, otherwise + set s->s_edit->e_axes_pos and s->s_edit->curr_e_axes_pos */ { - int i; - const short earb8[12][18] = earb8_edit_array; - const short earb7[12][18] = earb7_edit_array; - const short earb6[10][18] = earb6_edit_array; - const short earb5[9][18] = earb5_edit_array; - const int local_arb_faces[5][24] = rt_arb_faces; - - update_views = 1; + struct mged_state *s = (struct mged_state *)d; + int *flag = (int *)id; + int both = *flag; + s->update_views = 1; dm_set_dirty(DMP, 1); - switch (s->edit_state.es_int.idb_type) { - case ID_ARB8: - if (GEOM_EDIT_STATE == ST_O_EDIT) { - i = 0; - } else { - switch (es_edflag) { - case STRANS: - i = 0; - break; - case EARB: - switch (es_type) { - case ARB5: - i = earb5[es_menu][0]; - break; - case ARB6: - i = earb6[es_menu][0]; - break; - case ARB7: - i = earb7[es_menu][0]; - break; - case ARB8: - i = earb8[es_menu][0]; - break; - default: - i = 0; - break; - } - break; - case PTARB: - switch (es_type) { - case ARB4: - i = es_menu; /* index for point 1, 2, 3 or 4 */ - break; - case ARB5: - case ARB7: - i = 4; /* index for point 5 */ - break; - case ARB6: - i = es_menu; /* index for point 5 or 6 */ - break; - default: - i = 0; - break; - } - break; - case ECMD_ARB_MOVE_FACE: - switch (es_type) { - case ARB4: - i = local_arb_faces[0][es_menu * 4]; - break; - case ARB5: - i = local_arb_faces[1][es_menu * 4]; - break; - case ARB6: - i = local_arb_faces[2][es_menu * 4]; - break; - case ARB7: - i = local_arb_faces[3][es_menu * 4]; - break; - case ARB8: - i = local_arb_faces[4][es_menu * 4]; - break; - default: - i = 0; - break; - } - break; - case ECMD_ARB_ROTATE_FACE: - i = fixv; - break; - default: - i = 0; - break; - } - } - MAT4X3PNT(curr_e_axes_pos, es_mat, - ((struct rt_arb_internal *)s->edit_state.es_int.idb_ptr)->pt[i]); - break; - case ID_TGC: - case ID_REC: - if (es_edflag == ECMD_TGC_MV_H || - es_edflag == ECMD_TGC_MV_HH) { - struct rt_tgc_internal *tgc = (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - point_t tgc_v; - vect_t tgc_h; - - MAT4X3PNT(tgc_v, es_mat, tgc->v); - MAT4X3VEC(tgc_h, es_mat, tgc->h); - VADD2(curr_e_axes_pos, tgc_h, tgc_v); - } else { - VMOVE(curr_e_axes_pos, es_keypoint); - } - - break; - case ID_EXTRUDE: - if (es_edflag == ECMD_EXTR_MOV_H) { - struct rt_extrude_internal *extr = (struct rt_extrude_internal *)s->edit_state.es_int.idb_ptr; - point_t extr_v; - vect_t extr_h; - - RT_EXTRUDE_CK_MAGIC(extr); - - MAT4X3PNT(extr_v, es_mat, extr->V); - MAT4X3VEC(extr_h, es_mat, extr->h); - VADD2(curr_e_axes_pos, extr_h, extr_v); - } else { - VMOVE(curr_e_axes_pos, es_keypoint); - } - break; - case ID_CLINE: - if (es_edflag == ECMD_CLINE_MOVE_H) { - struct rt_cline_internal *cli = - (struct rt_cline_internal *)s->edit_state.es_int.idb_ptr; - point_t cli_v; - vect_t cli_h; - - RT_CLINE_CK_MAGIC(cli); - - MAT4X3PNT(cli_v, es_mat, cli->v); - MAT4X3VEC(cli_h, es_mat, cli->h); - VADD2(curr_e_axes_pos, cli_h, cli_v); - } else { - VMOVE(curr_e_axes_pos, es_keypoint); - } + struct rt_db_internal *ip = &s->s_edit->es_int; - break; - default: - VMOVE(curr_e_axes_pos, es_keypoint); - break; + if (EDOBJ[ip->idb_type].ft_e_axes_pos) { + bu_vls_trunc(s->s_edit->log_str, 0); + (*EDOBJ[ip->idb_type].ft_e_axes_pos)(s->s_edit, ip, &s->tol.tol); + if (bu_vls_strlen(s->s_edit->log_str)) { + Tcl_AppendResult(s->interp, bu_vls_cstr(s->s_edit->log_str), (char *)NULL); + bu_vls_trunc(s->s_edit->log_str, 0); + } + return BRLCAD_OK; + } else { + VMOVE(s->s_edit->curr_e_axes_pos, s->s_edit->e_keypoint); } if (both) { - VMOVE(e_axes_pos, curr_e_axes_pos); + VMOVE(s->s_edit->e_axes_pos, s->s_edit->curr_e_axes_pos); if (EDIT_ROTATE) { - es_edclass = EDIT_CLASS_ROTATE; + s->edit_state.e_edclass = EDIT_CLASS_ROTATE; VSETALL(s->edit_state.edit_absolute_model_rotate, 0.0); VSETALL(s->edit_state.edit_absolute_object_rotate, 0.0); VSETALL(s->edit_state.edit_absolute_view_rotate, 0.0); @@ -274,326 +101,432 @@ set_e_axes_pos(struct mged_state *s, int both) VSETALL(s->edit_state.last_edit_absolute_object_rotate, 0.0); VSETALL(s->edit_state.last_edit_absolute_view_rotate, 0.0); } else if (EDIT_TRAN) { - es_edclass = EDIT_CLASS_TRAN; - VSETALL(s->edit_state.edit_absolute_model_tran, 0.0); - VSETALL(s->edit_state.edit_absolute_view_tran, 0.0); - VSETALL(s->edit_state.last_edit_absolute_model_tran, 0.0); - VSETALL(s->edit_state.last_edit_absolute_view_tran, 0.0); + s->edit_state.e_edclass = EDIT_CLASS_TRAN; + VSETALL(s->s_edit->edit_absolute_model_tran, 0.0); + VSETALL(s->s_edit->edit_absolute_view_tran, 0.0); + VSETALL(s->s_edit->last_edit_absolute_model_tran, 0.0); + VSETALL(s->s_edit->last_edit_absolute_view_tran, 0.0); } else if (EDIT_SCALE) { - es_edclass = EDIT_CLASS_SCALE; + s->edit_state.e_edclass = EDIT_CLASS_SCALE; if (SEDIT_SCALE) { - s->edit_state.edit_absolute_scale = 0.0; - acc_sc_sol = 1.0; + s->s_edit->edit_absolute_scale = 0.0; + s->s_edit->acc_sc_sol = 1.0; } } else { - es_edclass = EDIT_CLASS_NULL; + s->edit_state.e_edclass = EDIT_CLASS_NULL; } - MAT_IDN(acc_rot_sol); + MAT_IDN(s->s_edit->acc_rot_sol); for (size_t di = 0; di < BU_PTBL_LEN(&active_dm_set); di++) { struct mged_dm *m_dmp = (struct mged_dm *)BU_PTBL_GET(&active_dm_set, di); m_dmp->dm_mged_variables->mv_transform = 'e'; } } + + return BRLCAD_OK; } -/* - * Keypoint in model space is established in "pt". - * If "str" is set, then that point is used, else default - * for this solid is selected and set. - * "str" may be a constant string, in either upper or lower case, - * or it may be something complex like "(3, 4)" for an ARS or spline - * to select a particular vertex or control point. - * - * XXX Perhaps this should be done via solid-specific parse tables, - * so that solids could be pretty-printed & structprint/structparse - * processed as well? - */ -void -get_solid_keypoint(struct mged_state *s, point_t *pt, const char **strp, struct rt_db_internal *ip, fastf_t *mat) +int +arb_setup_rotface_clbk(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(d2)) { - static const char *vert_str = "V"; - const char *cp = *strp; - point_t mpt = VINIT_ZERO; - static char buf[BUFSIZ]; + struct mged_state *ms = (struct mged_state *)d; + struct rt_solid_edit *s = ms->s_edit; + int vertex = -1; + struct bu_vls str = BU_VLS_INIT_ZERO; + struct bu_vls cmd = BU_VLS_INIT_ZERO; + int arb_type = rt_arb_std_type(&s->es_int, s->tol); + int type = arb_type - 4; + int loc = s->edit_menu*4; + int valid = 0; - RT_CK_DB_INTERNAL(ip); - memset(buf, 0, BUFSIZ); + /* check if point 5 is in the face */ + static int pnt5 = 0; + for (int i=0; i<4; i++) { + if (rt_arb_vertices[arb_type-4][s->edit_menu*4+i]==5) + pnt5=1; + } - switch (ip->idb_type) { - - case ID_PIPE: - { - struct rt_pipe_internal *pipeip = - (struct rt_pipe_internal *)ip->idb_ptr; - struct wdb_pipe_pnt *pipe_seg; + /* special case for arb7 */ + if (arb_type == ARB7 && pnt5) { + bu_vls_printf(s->log_str, "\nFixed vertex is point 5.\n"); + pr_prompt(ms); + return 5; + } - RT_PIPE_CK_MAGIC(pipeip); + bu_vls_printf(&str, "Enter fixed vertex number("); + for (int i=0; i<4; i++) { + if (rt_arb_vertices[type][loc+i]) + bu_vls_printf(&str, "%d ", rt_arb_vertices[type][loc+i]); + } + bu_vls_printf(&str, ") [%d]: ", rt_arb_vertices[type][loc]); - if (es_pipe_pnt == (struct wdb_pipe_pnt *)NULL) { - pipe_seg = BU_LIST_FIRST(wdb_pipe_pnt, &pipeip->pipe_segs_head); - VMOVE(mpt, pipe_seg->pp_coord); - } else { - VMOVE(mpt, es_pipe_pnt->pp_coord); - } - *strp = "V"; - MAT4X3PNT(*pt, mat, mpt); - return; - } - case ID_METABALL: - { - struct rt_metaball_internal *metaball = (struct rt_metaball_internal *)ip->idb_ptr; + const struct bu_vls *dnvp = dm_get_dname(ms->mged_curr_dm->dm_dmp); - RT_METABALL_CK_MAGIC(metaball); + bu_vls_printf(&cmd, "cad_input_dialog .get_vertex %s {Need vertex for solid rotate}\ + {%s} vertex_num %d 0 {{ summary \"Enter a vertex number to rotate about.\"}} OK", + (dnvp) ? bu_vls_cstr(dnvp) : "id", bu_vls_cstr(&str), rt_arb_vertices[type][loc]); - VSETALL(mpt, 0.0); - if (es_metaball_pnt==NULL) { - snprintf(buf, BUFSIZ, "no point selected"); - } else { - VMOVE(mpt, es_metaball_pnt->coord); - snprintf(buf, BUFSIZ, "V %f", es_metaball_pnt->fldstr); - } - *strp = buf; - MAT4X3PNT(*pt, mat, mpt); - return; - } - case ID_BOT: - { - *strp = OBJ[ip->idb_type].ft_keypoint(pt, cp, mat, ip, &s->tol.tol); - // If we're editing, use that position instead - if (bot_verts[0] > -1) { - struct rt_bot_internal *bot = (struct rt_bot_internal *)ip->idb_ptr; - RT_BOT_CK_MAGIC(bot); - VMOVE(mpt, &bot->vertices[bot_verts[0]*3]); - MAT4X3PNT(*pt, mat, mpt); - } - return; - } - case ID_ARB8: - if (*cp == 'V') { - *strp = OBJ[ip->idb_type].ft_keypoint(pt, cp, mat, ip, &s->tol.tol); - } else { - static const char *vstr = "V1"; - *strp = OBJ[ip->idb_type].ft_keypoint(pt, vstr, mat, ip, &s->tol.tol); - } - return; - case ID_BSPLINE: - { - struct rt_nurb_internal *sip = - (struct rt_nurb_internal *) s->edit_state.es_int.idb_ptr; - struct face_g_snurb *surf; - fastf_t *fp; - - RT_NURB_CK_MAGIC(sip); - surf = sip->srfs[spl_surfno]; - NMG_CK_SNURB(surf); - fp = &RT_NURB_GET_CONTROL_POINT(surf, spl_ui, spl_vi); - VMOVE(mpt, fp); - sprintf(buf, "Surf %d, index %d,%d", - spl_surfno, spl_ui, spl_vi); - *strp = buf; - MAT4X3PNT(*pt, mat, mpt); - return; - } - case ID_GRIP: - { - *strp = OBJ[ip->idb_type].ft_keypoint(pt, cp, mat, ip, &s->tol.tol); - if (!*strp) { - static const char *c_str = "C"; - *strp = OBJ[ip->idb_type].ft_keypoint(pt, c_str, mat, ip, &s->tol.tol); - } - return; - } - case ID_ARS: - { - struct rt_ars_internal *ars = - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv < 0 || es_ars_col < 0) { - VMOVE(mpt, es_pt); - } else { - VMOVE(mpt, &ars->curves[es_ars_crv][es_ars_col*3]); - } + while (!valid) { + if (Tcl_Eval(ms->interp, bu_vls_addr(&cmd)) != TCL_OK) { + bu_vls_printf(s->log_str, "get_rotation_vertex: Error reading vertex\n"); + /* Using default */ + pr_prompt(ms); + return rt_arb_vertices[type][loc]; + } - MAT4X3PNT(*pt, mat, mpt); - *strp = "V"; - return; - } - case ID_EXTRUDE: + vertex = atoi(Tcl_GetVar(ms->interp, "vertex_num", TCL_GLOBAL_ONLY)); + for (int j=0; j<4; j++) { + if (vertex==rt_arb_vertices[type][loc+j]) + valid = 1; + } + } + + bu_vls_free(&cmd); + bu_vls_free(&str); + + pr_prompt(ms); + return vertex; +} + +int +ecmd_bot_mode_clbk(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(d2)) +{ + struct mged_state *ms = (struct mged_state *)d; + struct rt_solid_edit *s = ms->s_edit; + struct rt_bot_internal *bot = (struct rt_bot_internal *)s->es_int.idb_ptr; + RT_BOT_CK_MAGIC(bot); + + const char *radio_result; + char mode[10]; + int ret_tcl = TCL_ERROR; + + sprintf(mode, " %d", bot->mode - 1); + if (dm_get_pathname(ms->mged_curr_dm->dm_dmp)) { + ret_tcl = Tcl_VarEval(ms->interp, "cad_radio", " .bot_mode_radio ", + bu_vls_cstr(dm_get_pathname(ms->mged_curr_dm->dm_dmp)), " _bot_mode_result", + " \"BOT Mode\"", " \"Select the desired mode\"", mode, + " { surface volume plate plate/nocosine }", + " { \"In surface mode, each triangle represents part of a zero thickness surface and no volume is enclosed\" \"In volume mode, the triangles are expected to enclose a volume and that volume becomes the solid\" \"In plate mode, each triangle represents a plate with a specified thickness\" \"In plate/nocosine mode, each triangle represents a plate with a specified thickness, but the LOS thickness reported by the raytracer is independent of obliquity angle\" } ", (char *)NULL); + } + if (ret_tcl != TCL_OK) { + bu_vls_printf(s->log_str, "Mode selection failed!\n"); + return BRLCAD_ERROR; + } + radio_result = Tcl_GetVar(ms->interp, "_bot_mode_result", TCL_GLOBAL_ONLY); + bot->mode = atoi(radio_result) + 1; + + return BRLCAD_OK; +} + +int +ecmd_bot_orient_clbk(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(d2)) +{ + struct mged_state *s = (struct mged_state *)d; + struct rt_bot_internal *bot = (struct rt_bot_internal *)s->s_edit->es_int.idb_ptr; + RT_BOT_CK_MAGIC(bot); + + const char *radio_result; + char orient[10]; + int ret_tcl = TCL_ERROR; + + sprintf(orient, " %d", bot->orientation - 1); + if (dm_get_pathname(DMP)) { + ret_tcl = Tcl_VarEval(s->interp, "cad_radio", " .bot_orient_radio ", + bu_vls_addr(dm_get_pathname(DMP)), " _bot_orient_result", + " \"BOT Face Orientation\"", " \"Select the desired orientation\"", orient, + " { none right-hand-rule left-hand-rule }", + " { \"No orientation means that there is no particular order for the vertices of the triangles\" \"right-hand-rule means that the vertices of each triangle are ordered such that the right-hand-rule produces an outward pointing normal\" \"left-hand-rule means that the vertices of each triangle are ordered such that the left-hand-rule produces an outward pointing normal\" } ", (char *)NULL); + } + if (ret_tcl != TCL_OK) { + bu_vls_printf(s->s_edit->log_str, "Face orientation selection failed!\n"); + return BRLCAD_ERROR; + } + radio_result = Tcl_GetVar(s->interp, "_bot_orient_result", TCL_GLOBAL_ONLY); + bot->orientation = atoi(radio_result) + 1; + + return BRLCAD_OK; +} + +int +ecmd_bot_thick_clbk(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(d2)) +{ + struct mged_state *s = (struct mged_state *)d; + struct rt_bot_internal *bot = (struct rt_bot_internal *)s->s_edit->es_int.idb_ptr; + struct rt_bot_edit *b = (struct rt_bot_edit *)s->s_edit->ipe_ptr; + RT_BOT_CK_MAGIC(bot); + + size_t face_no = 0; + int face_state = 0; + + if (bot->mode != RT_BOT_PLATE && bot->mode != RT_BOT_PLATE_NOCOS) { + if (Tcl_VarEval(s->interp, "cad_dialog ", ".bot_err ", "$mged_gui(mged,screen) ", "{Not Plate Mode} ", + "{Cannot edit face thickness in a non-plate BOT} ", "\"\" ", "0 ", "OK ", + (char *)NULL) != TCL_OK) + { + bu_log("cad_dialog failed: %s\n", Tcl_GetStringResult(s->interp)); + } + return BRLCAD_ERROR; + } + + if (b->bot_verts[0] < 0 || b->bot_verts[1] < 0 || b->bot_verts[2] < 0) { + /* setting thickness for all faces */ + (void)Tcl_VarEval(s->interp, "cad_dialog ", ".bot_err ", + "$mged_gui(mged,screen) ", "{Setting Thickness for All Faces} ", + "{No face is selected, so this operation will modify all the faces in this BOT} ", + "\"\" ", "0 ", "OK ", "CANCEL ", (char *)NULL); + if (atoi(Tcl_GetStringResult(s->interp))) + return BRLCAD_ERROR; + + for (size_t i=0; inum_faces; i++) + bot->thickness[i] = s->s_edit->e_para[0]; + } else { + /* setting thickness for just one face */ + + face_state = -1; + for (size_t i=0; i < bot->num_faces; i++) { + if (b->bot_verts[0] == bot->faces[i*3] && + b->bot_verts[1] == bot->faces[i*3+1] && + b->bot_verts[2] == bot->faces[i*3+2]) { - struct rt_extrude_internal *extr = (struct rt_extrude_internal *)ip->idb_ptr; - RT_EXTRUDE_CK_MAGIC(extr); - if (extr->skt && extr->skt->verts) { - static const char *vstr = "V1"; - *strp = OBJ[ip->idb_type].ft_keypoint(pt, vstr, mat, ip, &s->tol.tol); - } else { - *strp = OBJ[ip->idb_type].ft_keypoint(pt, NULL, mat, ip, &s->tol.tol); - } - return; + face_no = i; + face_state = 0; + break; } - case ID_NMG: - { - struct vertex *v; - struct vertexuse *vu; - struct edgeuse *eu; - struct loopuse *lu; - struct faceuse *fu; - struct shell *nmg_s; - struct nmgregion *r; - struct model *m = - (struct model *) s->edit_state.es_int.idb_ptr; - NMG_CK_MODEL(m); - /* XXX Fall through, for now (How about first vertex?? - JRA) */ - - /* set default first */ - VSETALL(mpt, 0.0); - *strp = "(origin)"; - - /* XXX Try to use the first point of the selected edge */ - if (es_eu != (struct edgeuse *)NULL && - es_eu->vu_p != (struct vertexuse *)NULL && - es_eu->vu_p->v_p != (struct vertex *)NULL && - es_eu->vu_p->v_p->vg_p != (struct vertex_g *)NULL) { - VMOVE(mpt, es_eu->vu_p->v_p->vg_p->coord); - break; - } + } + if (face_state > -1) { + bu_log("Cannot find face with vertices %d %d %d!\n", V3ARGS(b->bot_verts)); + return BRLCAD_ERROR; + } - if (BU_LIST_IS_EMPTY(&m->r_hd)) - break; + bot->thickness[face_no] = s->s_edit->e_para[0]; + } - r = BU_LIST_FIRST(nmgregion, &m->r_hd); - if (!r) - break; - NMG_CK_REGION(r); + return BRLCAD_OK; +} - if (BU_LIST_IS_EMPTY(&r->s_hd)) - break; +int +ecmd_bot_flags_clbk(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(d2)) +{ + struct mged_state *s = (struct mged_state *)d; + int ret_tcl = TCL_ERROR; + const char *dialog_result; + char cur_settings[11]; + struct rt_bot_internal *bot = (struct rt_bot_internal *)s->s_edit->es_int.idb_ptr; + RT_BOT_CK_MAGIC(bot); - nmg_s = BU_LIST_FIRST(shell, &r->s_hd); - if (!s) - break; - NMG_CK_SHELL(nmg_s); - - if (BU_LIST_IS_EMPTY(&nmg_s->fu_hd)) - fu = (struct faceuse *)NULL; - else - fu = BU_LIST_FIRST(faceuse, &nmg_s->fu_hd); - if (fu) { - NMG_CK_FACEUSE(fu); - lu = BU_LIST_FIRST(loopuse, &fu->lu_hd); - NMG_CK_LOOPUSE(lu); - if (BU_LIST_FIRST_MAGIC(&lu->down_hd) == NMG_EDGEUSE_MAGIC) { - eu = BU_LIST_FIRST(edgeuse, &lu->down_hd); - NMG_CK_EDGEUSE(eu); - NMG_CK_VERTEXUSE(eu->vu_p); - v = eu->vu_p->v_p; - } else { - vu = BU_LIST_FIRST(vertexuse, &lu->down_hd); - NMG_CK_VERTEXUSE(vu); - v = vu->v_p; - } - NMG_CK_VERTEX(v); - if (!v->vg_p) - break; - VMOVE(mpt, v->vg_p->coord); - *strp = "V"; - break; - } - if (BU_LIST_IS_EMPTY(&nmg_s->lu_hd)) - lu = (struct loopuse *)NULL; - else - lu = BU_LIST_FIRST(loopuse, &nmg_s->lu_hd); - if (lu) { - NMG_CK_LOOPUSE(lu); - if (BU_LIST_FIRST_MAGIC(&lu->down_hd) == NMG_EDGEUSE_MAGIC) { - eu = BU_LIST_FIRST(edgeuse, &lu->down_hd); - NMG_CK_EDGEUSE(eu); - NMG_CK_VERTEXUSE(eu->vu_p); - v = eu->vu_p->v_p; - } else { - vu = BU_LIST_FIRST(vertexuse, &lu->down_hd); - NMG_CK_VERTEXUSE(vu); - v = vu->v_p; - } - NMG_CK_VERTEX(v); - if (!v->vg_p) - break; - VMOVE(mpt, v->vg_p->coord); - *strp = "V"; - break; - } - if (BU_LIST_IS_EMPTY(&nmg_s->eu_hd)) - eu = (struct edgeuse *)NULL; - else - eu = BU_LIST_FIRST(edgeuse, &nmg_s->eu_hd); - if (eu) { - NMG_CK_EDGEUSE(eu); - NMG_CK_VERTEXUSE(eu->vu_p); - v = eu->vu_p->v_p; - NMG_CK_VERTEX(v); - if (!v->vg_p) - break; - VMOVE(mpt, v->vg_p->coord); - *strp = "V"; - break; - } - vu = nmg_s->vu_p; - if (vu) { - NMG_CK_VERTEXUSE(vu); - v = vu->v_p; - NMG_CK_VERTEX(v); - if (!v->vg_p) - break; - VMOVE(mpt, v->vg_p->coord); - *strp = "V"; - break; - } + bu_strlcpy(cur_settings, " { 0 0 }", sizeof(cur_settings)); + + if (bot->bot_flags & RT_BOT_USE_NORMALS) + cur_settings[3] = '1'; + + if (bot->bot_flags & RT_BOT_USE_FLOATS) + cur_settings[5] = '1'; + + if (dm_get_pathname(DMP)) { + // TODO - figure out what this is doing... + ret_tcl = Tcl_VarEval(s->interp, + "cad_list_buts", + " .bot_list_flags ", + bu_vls_addr(dm_get_pathname(DMP)), + " _bot_flags_result ", + cur_settings, + " \"BOT Flags\"", + " \"Select the desired flags\"", + " { {Use vertex normals} {Use single precision ray-tracing} }", + " { {This selection indicates that surface normals at hit points should be interpolated from vertex normals} {This selection indicates that the prepped form of the BOT triangles should use single precision to save memory} } ", + (char *)NULL); + } + if (ret_tcl != TCL_OK) { + bu_log("ERROR: cad_list_buts: %s\n", Tcl_GetStringResult(s->interp)); + return BRLCAD_ERROR; + } + dialog_result = Tcl_GetVar(s->interp, "_bot_flags_result", TCL_GLOBAL_ONLY); + + if (dialog_result[0] == '1') { + bot->bot_flags |= RT_BOT_USE_NORMALS; + } else { + bot->bot_flags &= ~RT_BOT_USE_NORMALS; + } + if (dialog_result[2] == '1') { + bot->bot_flags |= RT_BOT_USE_FLOATS; + } else { + bot->bot_flags &= ~RT_BOT_USE_FLOATS; + } + + return BRLCAD_OK; +} + +int +ecmd_bot_fmode_clbk(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(d2)) +{ + struct mged_state *s = (struct mged_state *)d; + struct rt_bot_internal *bot = (struct rt_bot_internal *)s->s_edit->es_int.idb_ptr; + struct rt_bot_edit *b = (struct rt_bot_edit *)s->s_edit->ipe_ptr; + char fmode[10]; + const char *radio_result; + size_t face_no = 0; + int face_state = 0; + int ret_tcl = TCL_ERROR; + + RT_BOT_CK_MAGIC(bot); + + if (bot->mode != RT_BOT_PLATE && bot->mode != RT_BOT_PLATE_NOCOS) { + (void)Tcl_VarEval(s->interp, "cad_dialog ", ".bot_err ", "$mged_gui(mged,screen) ", "{Not Plate Mode} ", + "{Cannot edit face mode in a non-plate BOT} ", "\"\" ", "0 ", "OK ", + (char *)NULL); + return BRLCAD_ERROR; + } + + if (b->bot_verts[0] < 0 || b->bot_verts[1] < 0 || b->bot_verts[2] < 0) { + /* setting mode for all faces */ + (void)Tcl_VarEval(s->interp, "cad_dialog ", ".bot_err ", + "$mged_gui(mged,screen) ", "{Setting Mode for All Faces} ", + "{No face is selected, so this operation will modify all the faces in this BOT} ", + "\"\" ", "0 ", "OK ", "CANCEL ", (char *)NULL); + if (atoi(Tcl_GetStringResult(s->interp))) + return BRLCAD_ERROR; + + face_state = -2; + } else { + /* setting thickness for just one face */ + face_state = -1; + for (size_t i=0; i < bot->num_faces; i++) { + if (b->bot_verts[0] == bot->faces[i*3] && + b->bot_verts[1] == bot->faces[i*3+1] && + b->bot_verts[2] == bot->faces[i*3+2]) + { + face_no = i; + face_state = 0; break; } - case ID_CLINE: - case ID_PARTICLE: - case ID_ARBN: - case ID_EBM: - case ID_DSP: - case ID_HF: - case ID_VOL: - case ID_HALF: - case ID_ELL: - case ID_SPH: - case ID_SUPERELL: - case ID_TOR: - case ID_TGC: - case ID_REC: - case ID_RPC: - case ID_RHC: - case ID_EPA: - case ID_EHY: - case ID_HYP: - case ID_ETO: - case ID_POLY: - case ID_SKETCH: - case ID_ANNOT: - case ID_DATUM: - *strp = OBJ[ip->idb_type].ft_keypoint(pt, cp, mat, ip, &s->tol.tol); - if (!*strp) - *strp = OBJ[ip->idb_type].ft_keypoint(pt, vert_str, mat, ip, &s->tol.tol); - return; - /* fall through */ - default: - Tcl_AppendResult(s->interp, "get_solid_keypoint: unrecognized solid type (setting keypoint to origin)\n", (char *)NULL); - VSETALL(mpt, 0.0); - *strp = "(origin)"; - break; + } + if (face_state < 0) { + bu_log("Cannot find face with vertices %d %d %d!\n", V3ARGS(b->bot_verts)); + return BRLCAD_ERROR; + } + } + + if (face_state > -1) + sprintf(fmode, " %d", BU_BITTEST(bot->face_mode, face_no)?1:0); + else + sprintf(fmode, " %d", BU_BITTEST(bot->face_mode, 0)?1:0); + + if (dm_get_pathname(DMP)) { + ret_tcl = Tcl_VarEval(s->interp, "cad_radio", " .bot_fmode_radio ", bu_vls_addr(dm_get_pathname(DMP)), + " _bot_fmode_result ", "\"BOT Face Mode\"", + " \"Select the desired face mode\"", fmode, + " { {Thickness centered about hit point} {Thickness appended to hit point} }", + " { {This selection will place the plate thickness centered about the hit point} {This selection will place the plate thickness rayward of the hit point} } ", + (char *)NULL); + } + if (ret_tcl != TCL_OK) { + bu_log("ERROR: cad_radio: %s\n", Tcl_GetStringResult(s->interp)); + return BRLCAD_ERROR; + } + radio_result = Tcl_GetVar(s->interp, "_bot_fmode_result", TCL_GLOBAL_ONLY); + + if (face_state > -1) { + if (atoi(radio_result)) + BU_BITSET(bot->face_mode, face_no); + else + BU_BITCLR(bot->face_mode, face_no); + } else { + if (atoi(radio_result)) { + for (size_t i=0; inum_faces; i++) + BU_BITSET(bot->face_mode, i); + } else + bu_bitv_clear(bot->face_mode); } - // Most of the time this is handled, but if it hasn't been yet do the mat calculation - MAT4X3PNT(*pt, mat, mpt); + return BRLCAD_OK; +} + +int +ecmd_bot_pickt_multihit_clbk(int UNUSED(ac), const char **UNUSED(av), void *d, void *d2) +{ + struct mged_state *s = (struct mged_state *)d; + struct rt_solid_edit *se = (struct rt_solid_edit *)d2; + struct rt_bot_edit *b = (struct rt_bot_edit *)se->ipe_ptr; + struct bu_vls *vls = (struct bu_vls *)se->u_ptr; + + // Evil Tcl variable linkage. Will need to figure out how to do this + // "on the fly" with temporary s_edit structure internal variables... + Tcl_LinkVar(s->interp, "bot_v1", (char *)&b->bot_verts[0], TCL_LINK_INT); + Tcl_LinkVar(s->interp, "bot_v2", (char *)&b->bot_verts[1], TCL_LINK_INT); + Tcl_LinkVar(s->interp, "bot_v3", (char *)&b->bot_verts[2], TCL_LINK_INT); + + int ret_tcl = Tcl_VarEval(s->interp, "bot_face_select ", bu_vls_cstr(vls), (char *)NULL); + int ret = BRLCAD_OK; + if (ret_tcl != TCL_OK) { + bu_log("bot_face_select failed: %s\n", Tcl_GetStringResult(s->interp)); + b->bot_verts[0] = -1; + b->bot_verts[1] = -1; + b->bot_verts[2] = -1; + ret = BRLCAD_ERROR; + } + Tcl_UnlinkVar(s->interp, "bot_v1"); + Tcl_UnlinkVar(s->interp, "bot_v2"); + Tcl_UnlinkVar(s->interp, "bot_v3"); + return ret; +} + +int +ecmd_nmg_edebug_clbk(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(d2)) +{ + struct mged_state *ms = (struct mged_state *)d; + struct rt_solid_edit *s = ms->s_edit; + struct rt_nmg_edit *en = (struct rt_nmg_edit *)s->ipe_ptr; + nmg_plot_eu(ms->gedp, en->es_eu, s->tol, s->vlfree); + return BRLCAD_OK; } +int +ecmd_extrude_skt_name_clbk(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(d2)) +{ + struct mged_state *s = (struct mged_state *)d; + struct rt_solid_edit *se = s->s_edit; + struct rt_extrude_internal *extr = (struct rt_extrude_internal *)se->es_int.idb_ptr; + + struct bu_vls tcl_cmd = BU_VLS_INIT_ZERO; + bu_vls_printf(&tcl_cmd, "cad_input_dialog .get_sketch_name $mged_gui(mged,screen) {Select Sketch} {Enter the name of the sketch to be extruded} final_sketch_name %s 0 {{summary \"Enter sketch name\"}} APPLY DISMISS", extr->sketch_name); + int ret_tcl = Tcl_Eval(s->interp, bu_vls_addr(&tcl_cmd)); + if (ret_tcl != TCL_OK) { + bu_log("ERROR: %s\n", Tcl_GetStringResult(s->interp)); + bu_vls_free(&tcl_cmd); + return BRLCAD_ERROR; + } + + if (atoi(Tcl_GetStringResult(s->interp)) == 1) + return BRLCAD_ERROR; + + bu_vls_free(&tcl_cmd); + + if (extr->sketch_name) + bu_free((char *)extr->sketch_name, "extr->sketch_name"); + + extr->sketch_name = bu_strdup(Tcl_GetVar(s->interp, "final_sketch_name", TCL_GLOBAL_ONLY)); + + struct directory *dp = RT_DIR_NULL; + if ((dp = db_lookup(s->dbip, extr->sketch_name, 0)) == RT_DIR_NULL) { + bu_log("Warning: %s does not exist!\n", extr->sketch_name); + extr->skt = (struct rt_sketch_internal *)NULL; + } else { + /* import the new sketch */ + struct rt_db_internal tmp_ip; + if (rt_db_get_internal(&tmp_ip, dp, s->dbip, bn_mat_identity, &rt_uniresource) != ID_SKETCH) { + bu_log("rt_extrude_import: ERROR: Cannot import sketch (%.16s) for extrusion\n", extr->sketch_name); + extr->skt = (struct rt_sketch_internal *)NULL; + } else { + extr->skt = (struct rt_sketch_internal *)tmp_ip.idb_ptr; + } + } + + return BRLCAD_OK; +} + int f_get_solid_keypoint(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUSED(argc), char *UNUSED(argv[])) { @@ -601,10 +534,10 @@ f_get_solid_keypoint(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUS MGED_CK_CMD(ctp); struct mged_state *s = ctp->s; - if (GEOM_EDIT_STATE == ST_VIEW || GEOM_EDIT_STATE == ST_S_PICK || GEOM_EDIT_STATE == ST_O_PICK) + if (s->edit_state.global_editing_state == ST_VIEW || s->edit_state.global_editing_state == ST_S_PICK || s->edit_state.global_editing_state == ST_O_PICK) return TCL_OK; - get_solid_keypoint(s, &es_keypoint, &es_keytag, &s->edit_state.es_int, es_mat); + rt_get_solid_keypoint(s->s_edit, &s->s_edit->e_keypoint, &s->s_edit->e_keytag, s->s_edit->e_mat); return TCL_OK; } @@ -617,9 +550,6 @@ f_get_solid_keypoint(ClientData clientData, Tcl_Interp *UNUSED(interp), int UNUS void init_sedit(struct mged_state *s) { - int type; - int id; - if (s->dbip == DBI_NULL || !illump) return; @@ -632,12 +562,12 @@ init_sedit(struct mged_state *s) return; } - /* Read solid description into s->edit_state.es_int */ if (!illump->s_u_data) return; + struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; - if (rt_db_get_internal(&s->edit_state.es_int, LAST_SOLID(bdata), - s->dbip, NULL, &rt_uniresource) < 0) { + s->s_edit = rt_solid_edit_create(&bdata->s_fullpath, s->dbip, &s->tol.tol, view_state->vs_gvp); + if (!s->s_edit) { if (bdata->s_fullpath.fp_len > 0) { Tcl_AppendResult(s->interp, "init_sedit(", LAST_SOLID(bdata)->d_namep, @@ -645,69 +575,14 @@ init_sedit(struct mged_state *s) } else { Tcl_AppendResult(s->interp, "sedit_reset(NULL): solid import failure\n", (char *)NULL); } - rt_db_free_internal(&s->edit_state.es_int); return; /* FAIL */ } - RT_CK_DB_INTERNAL(&s->edit_state.es_int); - id = s->edit_state.es_int.idb_type; - - es_menu = 0; - if (id == ID_ARB8) { - struct rt_arb_internal *arb; - struct bu_vls error_msg = BU_VLS_INIT_ZERO; - - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - RT_ARB_CK_MAGIC(arb); - - type = rt_arb_std_type(&s->edit_state.es_int, &s->tol.tol); - es_type = type; - - if (rt_arb_calc_planes(&error_msg, arb, es_type, es_peqn, &s->tol.tol)) { - Tcl_AppendResult(s->interp, bu_vls_addr(&error_msg), - "\nCannot calculate plane equations for ARB8\n", - (char *)NULL); - rt_db_free_internal(&s->edit_state.es_int); - bu_vls_free(&error_msg); - return; - } - bu_vls_free(&error_msg); - } else if (id == ID_BSPLINE) { - struct rt_nurb_internal *sip = - (struct rt_nurb_internal *) s->edit_state.es_int.idb_ptr; - struct face_g_snurb *surf; - RT_NURB_CK_MAGIC(sip); - spl_surfno = sip->nsrf/2; - surf = sip->srfs[spl_surfno]; - NMG_CK_SNURB(surf); - spl_ui = surf->s_size[1]/2; - spl_vi = surf->s_size[0]/2; - } - - /* Save aggregate path matrix */ - (void)db_path_to_mat(s->dbip, &bdata->s_fullpath, es_mat, bdata->s_fullpath.fp_len-1, &rt_uniresource); - - /* get the inverse matrix */ - bn_mat_inv(es_invmat, es_mat); - - /* Establish initial keypoint */ - es_keytag = ""; - get_solid_keypoint(s, &es_keypoint, &es_keytag, &s->edit_state.es_int, es_mat); - - es_eu = (struct edgeuse *)NULL; /* Reset es_eu */ - es_pipe_pnt = (struct wdb_pipe_pnt *)NULL; /* Reset es_pipe_pnt */ - es_metaball_pnt = (struct wdb_metaball_pnt *)NULL; /* Reset es_metaball_pnt */ - lu_copy = (struct loopuse *)NULL; - es_ars_crv = (-1); - es_ars_col = (-1); - bot_verts[0] = -1; - bot_verts[1] = -1; - bot_verts[2] = -1; /* Finally, enter solid edit state */ (void)chg_state(s, ST_S_PICK, ST_S_EDIT, "Keyboard illuminate"); chg_l2menu(s, ST_S_EDIT); - es_edflag = IDLE; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_IDLE); button(s, BE_S_EDIT); /* Drop into edit menu right away */ init_sedit_vars(s); @@ -726,8 +601,8 @@ init_sedit(struct mged_state *s) static void init_sedit_vars(struct mged_state *s) { - MAT_IDN(acc_rot_sol); - MAT_IDN(incr_change); + MAT_IDN(s->s_edit->acc_rot_sol); + MAT_IDN(s->s_edit->incr_change); VSETALL(s->edit_state.edit_absolute_model_rotate, 0.0); VSETALL(s->edit_state.edit_absolute_object_rotate, 0.0); @@ -735,12 +610,12 @@ init_sedit_vars(struct mged_state *s) VSETALL(s->edit_state.last_edit_absolute_model_rotate, 0.0); VSETALL(s->edit_state.last_edit_absolute_object_rotate, 0.0); VSETALL(s->edit_state.last_edit_absolute_view_rotate, 0.0); - VSETALL(s->edit_state.edit_absolute_model_tran, 0.0); - VSETALL(s->edit_state.edit_absolute_view_tran, 0.0); - VSETALL(s->edit_state.last_edit_absolute_model_tran, 0.0); - VSETALL(s->edit_state.last_edit_absolute_view_tran, 0.0); - s->edit_state.edit_absolute_scale = 0.0; - acc_sc_sol = 1.0; + VSETALL(s->s_edit->edit_absolute_model_tran, 0.0); + VSETALL(s->s_edit->edit_absolute_view_tran, 0.0); + VSETALL(s->s_edit->last_edit_absolute_model_tran, 0.0); + VSETALL(s->s_edit->last_edit_absolute_view_tran, 0.0); + s->s_edit->edit_absolute_scale = 0.0; + s->s_edit->acc_sc_sol = 1.0; VSETALL(s->edit_state.edit_rate_model_rotate, 0.0); VSETALL(s->edit_state.edit_rate_object_rotate, 0.0); @@ -748,17 +623,19 @@ init_sedit_vars(struct mged_state *s) VSETALL(s->edit_state.edit_rate_model_tran, 0.0); VSETALL(s->edit_state.edit_rate_view_tran, 0.0); - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); } /* * All solid edit routines call this subroutine after - * making a change to es_int or es_mat. + * making a change to es_int or s->s_edit->e_mat. */ -void -replot_editing_solid(struct mged_state *s) +int +replot_editing_solid(int UNUSED(ac), const char **UNUSED(av), void *d, void *UNUSED(id)) { + struct mged_state *s = (struct mged_state *)d; struct display_list *gdlp; struct display_list *next_gdlp; mat_t mat; @@ -766,10 +643,10 @@ replot_editing_solid(struct mged_state *s) struct directory *illdp; if (!illump) { - return; + return BRLCAD_OK; } if (!illump->s_u_data) - return; + return BRLCAD_OK; struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; illdp = LAST_SOLID(bdata); @@ -782,16 +659,22 @@ replot_editing_solid(struct mged_state *s) bdata = (struct ged_bv_data *)sp->s_u_data; if (LAST_SOLID(bdata) == illdp) { (void)db_path_to_mat(s->dbip, &bdata->s_fullpath, mat, bdata->s_fullpath.fp_len-1, &rt_uniresource); - (void)replot_modified_solid(s, sp, &s->edit_state.es_int, mat); + (void)replot_modified_solid(s, sp, &s->s_edit->es_int, mat); } } } gdlp = next_gdlp; } + + return BRLCAD_OK; } +/* TODO - this needs dbip because the ft_xform routines are calling ft_export and ft_import + * under the hood. Could we get away with a null dbip? We shouldn't be writing intermediate + * solids to the disk, unless this routine is also responsible for writing out geometry. + */ void transform_editing_solid( struct mged_state *s, @@ -807,4426 +690,77 @@ transform_editing_solid( /* * Put up menu header - */ -void -sedit_menu(struct mged_state *s) { - - menu_state->ms_flag = 0; /* No menu item selected yet */ - - mmenu_set_all(s, MENU_L1, NULL); - chg_l2menu(s, ST_S_EDIT); - - switch (s->edit_state.es_int.idb_type) { - - case ID_ARB8: - mmenu_set_all(s, MENU_L1, cntrl_menu); - break; - case ID_TGC: - mmenu_set_all(s, MENU_L1, tgc_menu); - break; - case ID_TOR: - mmenu_set_all(s, MENU_L1, tor_menu); - break; - case ID_ELL: - mmenu_set_all(s, MENU_L1, ell_menu); - break; - case ID_SUPERELL: - mmenu_set_all(s, MENU_L1, superell_menu); - break; - case ID_ARS: - mmenu_set_all(s, MENU_L1, ars_menu); - break; - case ID_BSPLINE: - mmenu_set_all(s, MENU_L1, spline_menu); - break; - case ID_RPC: - mmenu_set_all(s, MENU_L1, rpc_menu); - break; - case ID_RHC: - mmenu_set_all(s, MENU_L1, rhc_menu); - break; - case ID_EPA: - mmenu_set_all(s, MENU_L1, epa_menu); - break; - case ID_EHY: - mmenu_set_all(s, MENU_L1, ehy_menu); - break; - case ID_HYP: - mmenu_set_all(s, MENU_L1, hyp_menu); - break; - case ID_ETO: - mmenu_set_all(s, MENU_L1, eto_menu); - break; - case ID_NMG: - mmenu_set_all(s, MENU_L1, nmg_menu); - break; - case ID_PIPE: - mmenu_set_all(s, MENU_L1, pipe_menu); - break; - case ID_METABALL: - mmenu_set_all(s, MENU_L1, metaball_menu); - break; - case ID_VOL: - mmenu_set_all(s, MENU_L1, vol_menu); - break; - case ID_EBM: - mmenu_set_all(s, MENU_L1, ebm_menu); - break; - case ID_DSP: - mmenu_set_all(s, MENU_L1, dsp_menu); - break; - case ID_PARTICLE: - mmenu_set_all(s, MENU_L1, part_menu); - break; - case ID_BOT: - mmenu_set_all(s, MENU_L1, bot_menu); - break; - case ID_EXTRUDE: - mmenu_set_all(s, MENU_L1, extr_menu); - break; - case ID_CLINE: - mmenu_set_all(s, MENU_L1, cline_menu); - break; - } - es_edflag = IDLE; /* Drop out of previous edit mode */ - es_menu = 0; -} - - -int -get_rotation_vertex(struct mged_state *s) -{ - int i, j; - int type, loc, valid; - int vertex = -1; - struct bu_vls str = BU_VLS_INIT_ZERO; - struct bu_vls cmd = BU_VLS_INIT_ZERO; - - type = es_type - 4; - - loc = es_menu*4; - valid = 0; - - bu_vls_printf(&str, "Enter fixed vertex number("); - for (i=0; i<4; i++) { - if (rt_arb_vertices[type][loc+i]) - bu_vls_printf(&str, "%d ", rt_arb_vertices[type][loc+i]); - } - bu_vls_printf(&str, ") [%d]: ", rt_arb_vertices[type][loc]); - - const struct bu_vls *dnvp = dm_get_dname(s->mged_curr_dm->dm_dmp); - - bu_vls_printf(&cmd, "cad_input_dialog .get_vertex %s {Need vertex for solid rotate}\ - {%s} vertex_num %d 0 {{ summary \"Enter a vertex number to rotate about.\"}} OK", - (dnvp) ? bu_vls_addr(dnvp) : "id", bu_vls_addr(&str), rt_arb_vertices[type][loc]); - - while (!valid) { - if (Tcl_Eval(s->interp, bu_vls_addr(&cmd)) != TCL_OK) { - Tcl_AppendResult(s->interp, "get_rotation_vertex: Error reading vertex\n", (char *)NULL); - /* Using default */ - return rt_arb_vertices[type][loc]; - } - - vertex = atoi(Tcl_GetVar(s->interp, "vertex_num", TCL_GLOBAL_ONLY)); - for (j=0; j<4; j++) { - if (vertex==rt_arb_vertices[type][loc+j]) - valid = 1; - } - } - - bu_vls_free(&str); - return vertex; -} - - -const char * -get_file_name(struct mged_state *s, char *str) -{ - struct bu_vls cmd = BU_VLS_INIT_ZERO; - struct bu_vls varname_vls = BU_VLS_INIT_ZERO; - char *dir; - char *fptr; - char *ptr1; - char *ptr2; - - bu_vls_strcpy(&varname_vls, "mged_gui(getFileDir)"); - - if ((fptr=strrchr(str, '/'))) { - dir = (char *)bu_malloc((strlen(str)+1)*sizeof(char), "get_file_name: dir"); - ptr1 = str; - ptr2 = dir; - while (ptr1 != fptr) - *ptr2++ = *ptr1++; - *ptr2 = '\0'; - Tcl_SetVar(s->interp, bu_vls_addr(&varname_vls), dir, TCL_GLOBAL_ONLY); - bu_free((void *)dir, "get_file_name: directory string"); - } - - if (dm_get_pathname(DMP)) { - bu_vls_printf(&cmd, - "getFile %s %s {{{All Files} {*}}} {Get File}", - bu_vls_addr(dm_get_pathname(DMP)), - bu_vls_addr(&varname_vls)); - } - bu_vls_free(&varname_vls); - - if (Tcl_Eval(s->interp, bu_vls_addr(&cmd))) { - bu_vls_free(&cmd); - return (char *)NULL; - } else if (Tcl_GetStringResult(s->interp)[0] != '\0') { - bu_vls_free(&cmd); - return Tcl_GetStringResult(s->interp); - } else { - bu_vls_free(&cmd); - } - return (char *)NULL; -} - - -static void -dsp_scale(struct mged_state *s, struct rt_dsp_internal *dsp, int idx) -{ - mat_t m, scalemat; - - RT_DSP_CK_MAGIC(dsp); - - MAT_IDN(m); - - if (es_mvalid) { - bu_log("es_mvalid %g %g %g\n", V3ARGS(es_mparam)); - } - - if (inpara > 0) { - m[idx] = es_para[0]; - bu_log("Keyboard %g\n", es_para[0]); - } else if (!ZERO(s->edit_state.es_scale)) { - m[idx] *= s->edit_state.es_scale; - bu_log("s->edit_state.es_scale %g\n", s->edit_state.es_scale); - s->edit_state.es_scale = 0.0; - } - - bn_mat_xform_about_pnt(scalemat, m, es_keypoint); - - bn_mat_mul(m, dsp->dsp_stom, scalemat); - MAT_COPY(dsp->dsp_stom, m); - - bn_mat_mul(m, scalemat, dsp->dsp_mtos); - MAT_COPY(dsp->dsp_mtos, m); - -} - - -/* - * Partial scaling of a solid. - */ -void -pscale(struct mged_state *s) -{ - static fastf_t ma, mb; - - switch (es_menu) { - - case MENU_VOL_CSIZE: /* scale voxel size */ - { - bu_log("s->edit_state.es_scale = %g\n", s->edit_state.es_scale); - } - break; - - case MENU_TGC_SCALE_H: /* scale height vector */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - RT_TGC_CK_MAGIC(tgc); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(tgc->h); - } - VSCALE(tgc->h, tgc->h, s->edit_state.es_scale); - } - break; - - case MENU_TGC_SCALE_H_V: /* scale height vector (but move V) */ - { - point_t old_top; - - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - RT_TGC_CK_MAGIC(tgc); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(tgc->h); - } - VADD2(old_top, tgc->v, tgc->h); - VSCALE(tgc->h, tgc->h, s->edit_state.es_scale); - VSUB2(tgc->v, old_top, tgc->h); - } - break; - - case MENU_TGC_SCALE_H_CD: - { - vect_t vec1, vec2; - vect_t c, d; - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - - RT_TGC_CK_MAGIC(tgc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(tgc->h); - } - - /* calculate new c */ - VSUB2(vec1, tgc->a, tgc->c); - VSCALE(vec2, vec1, 1-s->edit_state.es_scale); - VADD2(c, tgc->c, vec2); - - /* calculate new d */ - VSUB2(vec1, tgc->b, tgc->d); - VSCALE(vec2, vec1, 1-s->edit_state.es_scale); - VADD2(d, tgc->d, vec2); - - if (0 <= VDOT(tgc->c, c) && - 0 <= VDOT(tgc->d, d) && - !ZERO(MAGNITUDE(c)) && - !ZERO(MAGNITUDE(d))) { - /* adjust c, d and h */ - VMOVE(tgc->c, c); - VMOVE(tgc->d, d); - VSCALE(tgc->h, tgc->h, s->edit_state.es_scale); - } - } - break; - - case MENU_TGC_SCALE_H_V_AB: - { - vect_t vec1, vec2; - vect_t a, b; - point_t old_top; - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - - RT_TGC_CK_MAGIC(tgc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(tgc->h); - } - - /* calculate new a */ - VSUB2(vec1, tgc->c, tgc->a); - VSCALE(vec2, vec1, 1-s->edit_state.es_scale); - VADD2(a, tgc->a, vec2); - - /* calculate new b */ - VSUB2(vec1, tgc->d, tgc->b); - VSCALE(vec2, vec1, 1-s->edit_state.es_scale); - VADD2(b, tgc->b, vec2); - - if (0 <= VDOT(tgc->a, a) && - 0 <= VDOT(tgc->b, b) && - !ZERO(MAGNITUDE(a)) && - !ZERO(MAGNITUDE(b))) { - /* adjust a, b, v and h */ - VMOVE(tgc->a, a); - VMOVE(tgc->b, b); - VADD2(old_top, tgc->v, tgc->h); - VSCALE(tgc->h, tgc->h, s->edit_state.es_scale); - VSUB2(tgc->v, old_top, tgc->h); - } - } - break; - - case MENU_TOR_R1: - /* scale radius 1 of TOR */ - { - struct rt_tor_internal *tor = - (struct rt_tor_internal *)s->edit_state.es_int.idb_ptr; - fastf_t newrad; - RT_TOR_CK_MAGIC(tor); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - newrad = es_para[0]; - } else { - newrad = tor->r_a * s->edit_state.es_scale; - } - if (newrad < SMALL) newrad = 4*SMALL; - if (tor->r_h <= newrad) - tor->r_a = newrad; - } - break; - - case MENU_TOR_R2: - /* scale radius 2 of TOR */ - { - struct rt_tor_internal *tor = - (struct rt_tor_internal *)s->edit_state.es_int.idb_ptr; - fastf_t newrad; - RT_TOR_CK_MAGIC(tor); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - newrad = es_para[0]; - } else { - newrad = tor->r_h * s->edit_state.es_scale; - } - if (newrad < SMALL) newrad = 4*SMALL; - if (newrad <= tor->r_a) - tor->r_h = newrad; - } - break; - - case MENU_ETO_R: - /* scale radius 1 (r) of ETO */ - { - struct rt_eto_internal *eto = - (struct rt_eto_internal *)s->edit_state.es_int.idb_ptr; - fastf_t ch, cv, dh, newrad; - vect_t Nu; - - RT_ETO_CK_MAGIC(eto); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - newrad = es_para[0]; - } else { - newrad = eto->eto_r * s->edit_state.es_scale; - } - if (newrad < SMALL) newrad = 4*SMALL; - VMOVE(Nu, eto->eto_N); - VUNITIZE(Nu); - /* get horiz and vert components of C and Rd */ - cv = VDOT(eto->eto_C, Nu); - ch = sqrt(VDOT(eto->eto_C, eto->eto_C) - cv * cv); - /* angle between C and Nu */ - dh = eto->eto_rd * cv / MAGNITUDE(eto->eto_C); - /* make sure revolved ellipse doesn't overlap itself */ - if (ch <= newrad && dh <= newrad) - eto->eto_r = newrad; - } - break; - - case MENU_ETO_RD: - /* scale Rd, ellipse semi-minor axis length, of ETO */ - { - struct rt_eto_internal *eto = - (struct rt_eto_internal *)s->edit_state.es_int.idb_ptr; - fastf_t dh, newrad, work; - vect_t Nu; - - RT_ETO_CK_MAGIC(eto); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - newrad = es_para[0]; - } else { - newrad = eto->eto_rd * s->edit_state.es_scale; - } - if (newrad < SMALL) newrad = 4*SMALL; - work = MAGNITUDE(eto->eto_C); - if (newrad <= work) { - VMOVE(Nu, eto->eto_N); - VUNITIZE(Nu); - dh = newrad * VDOT(eto->eto_C, Nu) / work; - /* make sure revolved ellipse doesn't overlap itself */ - if (dh <= eto->eto_r) - eto->eto_rd = newrad; - } - } - break; - - case MENU_ETO_SCALE_C: - /* scale vector C */ - { - struct rt_eto_internal *eto = - (struct rt_eto_internal *)s->edit_state.es_int.idb_ptr; - fastf_t ch, cv; - vect_t Nu, Work; - - RT_ETO_CK_MAGIC(eto); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(eto->eto_C); - } - if (s->edit_state.es_scale * MAGNITUDE(eto->eto_C) >= eto->eto_rd) { - VMOVE(Nu, eto->eto_N); - VUNITIZE(Nu); - VSCALE(Work, eto->eto_C, s->edit_state.es_scale); - /* get horiz and vert comps of C and Rd */ - cv = VDOT(Work, Nu); - ch = sqrt(VDOT(Work, Work) - cv * cv); - if (ch <= eto->eto_r) - VMOVE(eto->eto_C, Work); - } - } - break; - - case MENU_RPC_B: - /* scale vector B */ - { - struct rt_rpc_internal *rpc = - (struct rt_rpc_internal *)s->edit_state.es_int.idb_ptr; - RT_RPC_CK_MAGIC(rpc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(rpc->rpc_B); - } - VSCALE(rpc->rpc_B, rpc->rpc_B, s->edit_state.es_scale); - } - break; - - case MENU_RPC_H: - /* scale vector H */ - { - struct rt_rpc_internal *rpc = - (struct rt_rpc_internal *)s->edit_state.es_int.idb_ptr; - - RT_RPC_CK_MAGIC(rpc); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(rpc->rpc_H); - } - VSCALE(rpc->rpc_H, rpc->rpc_H, s->edit_state.es_scale); - } - break; - - case MENU_RPC_R: - /* scale rectangular half-width of RPC */ - { - struct rt_rpc_internal *rpc = - (struct rt_rpc_internal *)s->edit_state.es_int.idb_ptr; - - RT_RPC_CK_MAGIC(rpc); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / rpc->rpc_r; - } - rpc->rpc_r *= s->edit_state.es_scale; - } - break; - - case MENU_RHC_B: - /* scale vector B */ - { - struct rt_rhc_internal *rhc = - (struct rt_rhc_internal *)s->edit_state.es_int.idb_ptr; - RT_RHC_CK_MAGIC(rhc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(rhc->rhc_B); - } - VSCALE(rhc->rhc_B, rhc->rhc_B, s->edit_state.es_scale); - } - break; - - case MENU_RHC_H: - /* scale vector H */ - { - struct rt_rhc_internal *rhc = - (struct rt_rhc_internal *)s->edit_state.es_int.idb_ptr; - RT_RHC_CK_MAGIC(rhc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(rhc->rhc_H); - } - VSCALE(rhc->rhc_H, rhc->rhc_H, s->edit_state.es_scale); - } - break; - - case MENU_RHC_R: - /* scale rectangular half-width of RHC */ - { - struct rt_rhc_internal *rhc = - (struct rt_rhc_internal *)s->edit_state.es_int.idb_ptr; - - RT_RHC_CK_MAGIC(rhc); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / rhc->rhc_r; - } - rhc->rhc_r *= s->edit_state.es_scale; - } - break; - - case MENU_RHC_C: - /* scale rectangular half-width of RHC */ - { - struct rt_rhc_internal *rhc = - (struct rt_rhc_internal *)s->edit_state.es_int.idb_ptr; - - RT_RHC_CK_MAGIC(rhc); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / rhc->rhc_c; - } - rhc->rhc_c *= s->edit_state.es_scale; - } - break; - - case MENU_EPA_H: - /* scale height vector H */ - { - struct rt_epa_internal *epa = - (struct rt_epa_internal *)s->edit_state.es_int.idb_ptr; - - RT_EPA_CK_MAGIC(epa); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(epa->epa_H); - } - VSCALE(epa->epa_H, epa->epa_H, s->edit_state.es_scale); - } - break; - - case MENU_EPA_R1: - /* scale semimajor axis of EPA */ - { - struct rt_epa_internal *epa = - (struct rt_epa_internal *)s->edit_state.es_int.idb_ptr; - - RT_EPA_CK_MAGIC(epa); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / epa->epa_r1; - } - if (epa->epa_r1 * s->edit_state.es_scale >= epa->epa_r2) - epa->epa_r1 *= s->edit_state.es_scale; - else - bu_log("pscale: semi-minor axis cannot be longer than semi-major axis!"); - } - break; - - case MENU_EPA_R2: - /* scale semiminor axis of EPA */ - { - struct rt_epa_internal *epa = - (struct rt_epa_internal *)s->edit_state.es_int.idb_ptr; - - RT_EPA_CK_MAGIC(epa); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / epa->epa_r2; - } - if (epa->epa_r2 * s->edit_state.es_scale <= epa->epa_r1) - epa->epa_r2 *= s->edit_state.es_scale; - else - bu_log("pscale: semi-minor axis cannot be longer than semi-major axis!"); - } - break; - - case MENU_EHY_H: - /* scale height vector H */ - { - struct rt_ehy_internal *ehy = - (struct rt_ehy_internal *)s->edit_state.es_int.idb_ptr; - - RT_EHY_CK_MAGIC(ehy); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(ehy->ehy_H); - } - VSCALE(ehy->ehy_H, ehy->ehy_H, s->edit_state.es_scale); - } - break; - - case MENU_EHY_R1: - /* scale semimajor axis of EHY */ - { - struct rt_ehy_internal *ehy = - (struct rt_ehy_internal *)s->edit_state.es_int.idb_ptr; - - RT_EHY_CK_MAGIC(ehy); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / ehy->ehy_r1; - } - if (ehy->ehy_r1 * s->edit_state.es_scale >= ehy->ehy_r2) - ehy->ehy_r1 *= s->edit_state.es_scale; - else - bu_log("pscale: semi-minor axis cannot be longer than semi-major axis!"); - } - break; - - case MENU_EHY_R2: - /* scale semiminor axis of EHY */ - { - struct rt_ehy_internal *ehy = - (struct rt_ehy_internal *)s->edit_state.es_int.idb_ptr; - - RT_EHY_CK_MAGIC(ehy); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / ehy->ehy_r2; - } - if (ehy->ehy_r2 * s->edit_state.es_scale <= ehy->ehy_r1) - ehy->ehy_r2 *= s->edit_state.es_scale; - else - bu_log("pscale: semi-minor axis cannot be longer than semi-major axis!"); - } - break; - - case MENU_EHY_C: - /* scale distance between apex of EHY & asymptotic cone */ - { - struct rt_ehy_internal *ehy = - (struct rt_ehy_internal *)s->edit_state.es_int.idb_ptr; - - RT_EHY_CK_MAGIC(ehy); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / ehy->ehy_c; - } - ehy->ehy_c *= s->edit_state.es_scale; - } - break; - - case MENU_HYP_H: - /* scale height of HYP */ - { - struct rt_hyp_internal *hyp = - (struct rt_hyp_internal *)s->edit_state.es_int.idb_ptr; - - RT_HYP_CK_MAGIC(hyp); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0]; - } - VSCALE(hyp->hyp_Hi, hyp->hyp_Hi, s->edit_state.es_scale); - } - break; - - case MENU_HYP_SCALE_A: - /* scale A vector of HYP */ - { - struct rt_hyp_internal *hyp = - (struct rt_hyp_internal *)s->edit_state.es_int.idb_ptr; - - RT_HYP_CK_MAGIC(hyp); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0]; - } - VSCALE(hyp->hyp_A, hyp->hyp_A, s->edit_state.es_scale); - } - break; - - case MENU_HYP_SCALE_B: - /* scale B vector of HYP */ - { - struct rt_hyp_internal *hyp = - (struct rt_hyp_internal *)s->edit_state.es_int.idb_ptr; - - RT_HYP_CK_MAGIC(hyp); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0]; - } - hyp->hyp_b = hyp->hyp_b * s->edit_state.es_scale; - } - break; - - - case MENU_HYP_C: - /* scale Neck to Base ratio of HYP */ - { - struct rt_hyp_internal *hyp = - (struct rt_hyp_internal *)s->edit_state.es_int.idb_ptr; - - RT_HYP_CK_MAGIC(hyp); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0]; - } - if (hyp->hyp_bnr * s->edit_state.es_scale <= 1.0) { - hyp->hyp_bnr = hyp->hyp_bnr * s->edit_state.es_scale; - } - } - break; - - - case MENU_TGC_SCALE_A: - /* scale vector A */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - RT_TGC_CK_MAGIC(tgc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(tgc->a); - } - VSCALE(tgc->a, tgc->a, s->edit_state.es_scale); - } - break; - - case MENU_TGC_SCALE_B: - /* scale vector B */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - RT_TGC_CK_MAGIC(tgc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(tgc->b); - } - VSCALE(tgc->b, tgc->b, s->edit_state.es_scale); - } - break; - - case MENU_ELL_SCALE_A: - /* scale vector A */ - { - struct rt_ell_internal *ell = - (struct rt_ell_internal *)s->edit_state.es_int.idb_ptr; - RT_ELL_CK_MAGIC(ell); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - s->edit_state.es_scale = es_para[0] * es_mat[15] / - MAGNITUDE(ell->a); - } - VSCALE(ell->a, ell->a, s->edit_state.es_scale); - } - break; - - case MENU_ELL_SCALE_B: - /* scale vector B */ - { - struct rt_ell_internal *ell = - (struct rt_ell_internal *)s->edit_state.es_int.idb_ptr; - RT_ELL_CK_MAGIC(ell); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - s->edit_state.es_scale = es_para[0] * es_mat[15] / - MAGNITUDE(ell->b); - } - VSCALE(ell->b, ell->b, s->edit_state.es_scale); - } - break; - - case MENU_ELL_SCALE_C: - /* scale vector C */ - { - struct rt_ell_internal *ell = - (struct rt_ell_internal *)s->edit_state.es_int.idb_ptr; - RT_ELL_CK_MAGIC(ell); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - s->edit_state.es_scale = es_para[0] * es_mat[15] / - MAGNITUDE(ell->c); - } - VSCALE(ell->c, ell->c, s->edit_state.es_scale); - } - break; - - case MENU_TGC_SCALE_C: - /* TGC: scale ratio "c" */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - RT_TGC_CK_MAGIC(tgc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(tgc->c); - } - VSCALE(tgc->c, tgc->c, s->edit_state.es_scale); - } - break; - - case MENU_TGC_SCALE_D: /* scale d for tgc */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - RT_TGC_CK_MAGIC(tgc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(tgc->d); - } - VSCALE(tgc->d, tgc->d, s->edit_state.es_scale); - } - break; - - case MENU_TGC_SCALE_AB: - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - RT_TGC_CK_MAGIC(tgc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(tgc->a); - } - VSCALE(tgc->a, tgc->a, s->edit_state.es_scale); - ma = MAGNITUDE(tgc->a); - mb = MAGNITUDE(tgc->b); - VSCALE(tgc->b, tgc->b, ma/mb); - } - break; - - case MENU_TGC_SCALE_CD: /* scale C and D of tgc */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - RT_TGC_CK_MAGIC(tgc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(tgc->c); - } - VSCALE(tgc->c, tgc->c, s->edit_state.es_scale); - ma = MAGNITUDE(tgc->c); - mb = MAGNITUDE(tgc->d); - VSCALE(tgc->d, tgc->d, ma/mb); - } - break; - - case MENU_TGC_SCALE_ABCD: /* scale A, B, C, and D of tgc */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - RT_TGC_CK_MAGIC(tgc); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(tgc->a); - } - VSCALE(tgc->a, tgc->a, s->edit_state.es_scale); - ma = MAGNITUDE(tgc->a); - mb = MAGNITUDE(tgc->b); - VSCALE(tgc->b, tgc->b, ma/mb); - mb = MAGNITUDE(tgc->c); - VSCALE(tgc->c, tgc->c, ma/mb); - mb = MAGNITUDE(tgc->d); - VSCALE(tgc->d, tgc->d, ma/mb); - } - break; - - case MENU_ELL_SCALE_ABC: /* set A, B, and C length the same */ - { - struct rt_ell_internal *ell = - (struct rt_ell_internal *)s->edit_state.es_int.idb_ptr; - RT_ELL_CK_MAGIC(ell); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - s->edit_state.es_scale = es_para[0] * es_mat[15] / - MAGNITUDE(ell->a); - } - VSCALE(ell->a, ell->a, s->edit_state.es_scale); - ma = MAGNITUDE(ell->a); - mb = MAGNITUDE(ell->b); - VSCALE(ell->b, ell->b, ma/mb); - mb = MAGNITUDE(ell->c); - VSCALE(ell->c, ell->c, ma/mb); - } - break; - - /* begin super ellipse menu options */ - case MENU_SUPERELL_SCALE_A: - /* scale vector A */ - { - struct rt_superell_internal *superell = - (struct rt_superell_internal *)s->edit_state.es_int.idb_ptr; - RT_SUPERELL_CK_MAGIC(superell); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - s->edit_state.es_scale = es_para[0] * es_mat[15] / - MAGNITUDE(superell->a); - } - VSCALE(superell->a, superell->a, s->edit_state.es_scale); - } - break; - - case MENU_SUPERELL_SCALE_B: - /* scale vector B */ - { - struct rt_superell_internal *superell = - (struct rt_superell_internal *)s->edit_state.es_int.idb_ptr; - RT_SUPERELL_CK_MAGIC(superell); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - s->edit_state.es_scale = es_para[0] * es_mat[15] / - MAGNITUDE(superell->b); - } - VSCALE(superell->b, superell->b, s->edit_state.es_scale); - } - break; - - case MENU_SUPERELL_SCALE_C: - /* scale vector C */ - { - struct rt_superell_internal *superell = - (struct rt_superell_internal *)s->edit_state.es_int.idb_ptr; - RT_SUPERELL_CK_MAGIC(superell); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - s->edit_state.es_scale = es_para[0] * es_mat[15] / - MAGNITUDE(superell->c); - } - VSCALE(superell->c, superell->c, s->edit_state.es_scale); - } - break; - - case MENU_SUPERELL_SCALE_ABC: /* set A, B, and C length the same */ - { - struct rt_superell_internal *superell = - (struct rt_superell_internal *)s->edit_state.es_int.idb_ptr; - RT_SUPERELL_CK_MAGIC(superell); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - s->edit_state.es_scale = es_para[0] * es_mat[15] / - MAGNITUDE(superell->a); - } - VSCALE(superell->a, superell->a, s->edit_state.es_scale); - ma = MAGNITUDE(superell->a); - mb = MAGNITUDE(superell->b); - VSCALE(superell->b, superell->b, ma/mb); - mb = MAGNITUDE(superell->c); - VSCALE(superell->c, superell->c, ma/mb); - } - break; - - - case MENU_PIPE_PT_OD: /* scale OD of one pipe segment */ - { - if (!es_pipe_pnt) { - Tcl_AppendResult(s->interp, "pscale: no pipe segment selected for scaling\n", (char *)NULL); - return; - } - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - if (es_pipe_pnt->pp_od > 0.0) - s->edit_state.es_scale = es_para[0] * es_mat[15]/es_pipe_pnt->pp_od; - else - s->edit_state.es_scale = (-es_para[0] * es_mat[15]); - } - pipe_seg_scale_od(s, es_pipe_pnt, s->edit_state.es_scale); - } - break; - case MENU_PIPE_PT_ID: /* scale ID of one pipe segment */ - { - if (!es_pipe_pnt) { - Tcl_AppendResult(s->interp, "pscale: no pipe segment selected for scaling\n", (char *)NULL); - return; - } - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - if (es_pipe_pnt->pp_id > 0.0) - s->edit_state.es_scale = es_para[0] * es_mat[15]/es_pipe_pnt->pp_id; - else - s->edit_state.es_scale = (-es_para[0] * es_mat[15]); - } - pipe_seg_scale_id(s, es_pipe_pnt, s->edit_state.es_scale); - } - break; - case MENU_PIPE_PT_RADIUS: /* scale bend radius at selected point */ - { - if (!es_pipe_pnt) { - Tcl_AppendResult(s->interp, "pscale: no pipe segment selected for scaling\n", (char *)NULL); - return; - } - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - if (es_pipe_pnt->pp_id > 0.0) - s->edit_state.es_scale = es_para[0] * es_mat[15]/es_pipe_pnt->pp_bendradius; - else - s->edit_state.es_scale = (-es_para[0] * es_mat[15]); - } - pipe_seg_scale_radius(s, es_pipe_pnt, s->edit_state.es_scale); - } - break; - case MENU_PIPE_SCALE_OD: /* scale entire pipe OD */ - if (inpara) { - struct rt_pipe_internal *pipeip = - (struct rt_pipe_internal *)s->edit_state.es_int.idb_ptr; - struct wdb_pipe_pnt *ps; - - RT_PIPE_CK_MAGIC(pipeip); - - ps = BU_LIST_FIRST(wdb_pipe_pnt, &pipeip->pipe_segs_head); - BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "wdb_pipe_pnt"); - - if (ps->pp_od > 0.0) { - s->edit_state.es_scale = es_para[0] * es_mat[15]/ps->pp_od; - } else { - while (ps->l.magic != BU_LIST_HEAD_MAGIC && ps->pp_od <= 0.0) - ps = BU_LIST_NEXT(wdb_pipe_pnt, &ps->l); - - if (ps->l.magic == BU_LIST_HEAD_MAGIC) { - Tcl_AppendResult(s->interp, "Entire pipe solid has zero OD!\n", (char *)NULL); - return; - } - - s->edit_state.es_scale = es_para[0] * es_mat[15]/ps->pp_od; - } - } - pipe_scale_od(s, &s->edit_state.es_int, s->edit_state.es_scale); - break; - case MENU_PIPE_SCALE_ID: /* scale entire pipe ID */ - if (inpara) { - struct rt_pipe_internal *pipeip = - (struct rt_pipe_internal *)s->edit_state.es_int.idb_ptr; - struct wdb_pipe_pnt *ps; - - RT_PIPE_CK_MAGIC(pipeip); - - ps = BU_LIST_FIRST(wdb_pipe_pnt, &pipeip->pipe_segs_head); - BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "wdb_pipe_pnt"); - - if (ps->pp_id > 0.0) { - s->edit_state.es_scale = es_para[0] * es_mat[15]/ps->pp_id; - } else { - while (ps->l.magic != BU_LIST_HEAD_MAGIC && ps->pp_id <= 0.0) - ps = BU_LIST_NEXT(wdb_pipe_pnt, &ps->l); - - /* Check if entire pipe has zero ID */ - if (ps->l.magic == BU_LIST_HEAD_MAGIC) - s->edit_state.es_scale = (-es_para[0] * es_mat[15]); - else - s->edit_state.es_scale = es_para[0] * es_mat[15]/ps->pp_id; - } - } - pipe_scale_id(s, &s->edit_state.es_int, s->edit_state.es_scale); - break; - case MENU_PIPE_SCALE_RADIUS: /* scale entire pipr bend radius */ - if (inpara) { - struct rt_pipe_internal *pipeip = - (struct rt_pipe_internal *)s->edit_state.es_int.idb_ptr; - struct wdb_pipe_pnt *ps; - - RT_PIPE_CK_MAGIC(pipeip); - - ps = BU_LIST_FIRST(wdb_pipe_pnt, &pipeip->pipe_segs_head); - BU_CKMAG(ps, WDB_PIPESEG_MAGIC, "wdb_pipe_pnt"); - - if (ps->pp_bendradius > 0.0) { - s->edit_state.es_scale = es_para[0] * es_mat[15]/ps->pp_bendradius; - } else { - while (ps->l.magic != BU_LIST_HEAD_MAGIC && ps->pp_bendradius <= 0.0) - ps = BU_LIST_NEXT(wdb_pipe_pnt, &ps->l); - - /* Check if entire pipe has zero ID */ - if (ps->l.magic == BU_LIST_HEAD_MAGIC) - s->edit_state.es_scale = (-es_para[0] * es_mat[15]); - else - s->edit_state.es_scale = es_para[0] * es_mat[15]/ps->pp_bendradius; - } - } - pipe_scale_radius(s, &s->edit_state.es_int, s->edit_state.es_scale); - break; - case MENU_PART_H: - /* scale vector H */ - { - struct rt_part_internal *part = - (struct rt_part_internal *)s->edit_state.es_int.idb_ptr; - - RT_PART_CK_MAGIC(part); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(part->part_H); - } - VSCALE(part->part_H, part->part_H, s->edit_state.es_scale); - } - break; - - case MENU_PART_v: - /* scale v end radius */ - { - struct rt_part_internal *part = - (struct rt_part_internal *)s->edit_state.es_int.idb_ptr; - - RT_PART_CK_MAGIC(part); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / part->part_vrad; - } - part->part_vrad *= s->edit_state.es_scale; - } - break; - - case MENU_PART_h: - /* scale h end radius */ - { - struct rt_part_internal *part = - (struct rt_part_internal *)s->edit_state.es_int.idb_ptr; - - RT_PART_CK_MAGIC(part); - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / part->part_hrad; - } - part->part_hrad *= s->edit_state.es_scale; - } - break; - case MENU_METABALL_SET_THRESHOLD: - { - struct rt_metaball_internal *ball = - (struct rt_metaball_internal *)s->edit_state.es_int.idb_ptr; - RT_METABALL_CK_MAGIC(ball); - ball->threshold = es_para[0]; - } - break; - case MENU_METABALL_SET_METHOD: - { - struct rt_metaball_internal *ball = - (struct rt_metaball_internal *)s->edit_state.es_int.idb_ptr; - RT_METABALL_CK_MAGIC(ball); - ball->method = es_para[0]; - } - break; - case MENU_METABALL_PT_SET_GOO: - { - if (!es_metaball_pnt || !inpara) { - Tcl_AppendResult(s->interp, "pscale: no metaball point selected for scaling goo\n", (char *)NULL); - return; - } - es_metaball_pnt->sweat *= *es_para * ((s->edit_state.es_scale > -SMALL_FASTF) ? s->edit_state.es_scale : 1.0); - } - break; - case MENU_METABALL_PT_FLDSTR: - { - if (!es_metaball_pnt || !inpara) { - Tcl_AppendResult(s->interp, "pscale: no metaball point selected for scaling strength\n", (char *)NULL); - return; - } - es_metaball_pnt->fldstr *= *es_para * ((s->edit_state.es_scale > -SMALL_FASTF) ? s->edit_state.es_scale : 1.0); - } - break; - } -} - - -/* - * A great deal of magic takes place here, to accomplish solid editing. - * - * Called from mged main loop after any event handlers: - * if (sedraw > 0) sedit(s); - * to process any residual events that the event handlers were too - * lazy to handle themselves. - * - * A lot of processing is deferred to here, so that the "p" command - * can operate on an equal footing to mouse events. - */ -void -sedit(struct mged_state *s) -{ - struct rt_arb_internal *arb; - fastf_t *eqp; - static vect_t work; - size_t i; - static int pnt5; /* ECMD_ARB_SETUP_ROTFACE, special arb7 case */ - static float la, lb, lc, ld; /* TGC: length of vectors */ - mat_t mat; - mat_t mat1; - mat_t edit; - point_t rot_point; - - if (s->dbip == DBI_NULL) - return; - - sedraw = 0; - ++update_views; - - switch (es_edflag) { - - case IDLE: - /* do nothing more */ - --update_views; - break; - - case ECMD_DSP_SCALE_X: - dsp_scale(s, (struct rt_dsp_internal *)s->edit_state.es_int.idb_ptr, MSX); - break; - case ECMD_DSP_SCALE_Y: - dsp_scale(s, (struct rt_dsp_internal *)s->edit_state.es_int.idb_ptr, MSY); - break; - case ECMD_DSP_SCALE_ALT: - dsp_scale(s, (struct rt_dsp_internal *)s->edit_state.es_int.idb_ptr, MSZ); - break; - case ECMD_DSP_FNAME: - { - struct rt_dsp_internal *dsp = - (struct rt_dsp_internal *)s->edit_state.es_int.idb_ptr; - const char *fname; - struct stat stat_buf; - b_off_t need_size; - struct bu_vls message = BU_VLS_INIT_ZERO; - - RT_DSP_CK_MAGIC(dsp); - - /* Pop-up the Tk file browser */ - fname = get_file_name(s, bu_vls_addr(&dsp->dsp_name)); - if (! fname) break; - - if (stat(fname, &stat_buf)) { - bu_vls_printf(&message, "Cannot get status of file %s\n", fname); - Tcl_SetResult(s->interp, bu_vls_addr(&message), TCL_VOLATILE); - bu_vls_free(&message); - mged_print_result(s, TCL_ERROR); - return; - } - - need_size = dsp->dsp_xcnt * dsp->dsp_ycnt * 2; - if (stat_buf.st_size < need_size) { - bu_vls_printf(&message, "File (%s) is too small, adjust the file size parameters first", fname); - Tcl_SetResult(s->interp, bu_vls_addr(&message), TCL_VOLATILE); - bu_vls_free(&message); - mged_print_result(s, TCL_ERROR); - return; - } - bu_vls_strcpy(&dsp->dsp_name, fname); - - break; - } - - case ECMD_EBM_FSIZE: /* set file size */ - { - struct rt_ebm_internal *ebm = - (struct rt_ebm_internal *)s->edit_state.es_int.idb_ptr; - struct stat stat_buf; - b_off_t need_size; - - RT_EBM_CK_MAGIC(ebm); - - if (inpara == 2) { - if (stat(ebm->name, &stat_buf)) { - Tcl_AppendResult(s->interp, "Cannot get status of ebm data source ", ebm->name, (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - need_size = es_para[0] * es_para[1] * sizeof(unsigned char); - if (stat_buf.st_size < need_size) { - Tcl_AppendResult(s->interp, "File (", ebm->name, - ") is too small, set data source name first", (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - ebm->xdim = es_para[0]; - ebm->ydim = es_para[1]; - } else if (inpara > 0) { - Tcl_AppendResult(s->interp, "width and length of data source are required\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - } - break; - - case ECMD_EBM_FNAME: - { - struct rt_ebm_internal *ebm = - (struct rt_ebm_internal *)s->edit_state.es_int.idb_ptr; - const char *fname; - struct stat stat_buf; - b_off_t need_size; - - RT_EBM_CK_MAGIC(ebm); - - fname = get_file_name(s, ebm->name); - if (fname) { - struct bu_vls message = BU_VLS_INIT_ZERO; - - if (stat(fname, &stat_buf)) { - bu_vls_printf(&message, "Cannot get status of file %s\n", fname); - Tcl_SetResult(s->interp, bu_vls_addr(&message), TCL_VOLATILE); - bu_vls_free(&message); - mged_print_result(s, TCL_ERROR); - return; - } - need_size = ebm->xdim * ebm->ydim * sizeof(unsigned char); - if (stat_buf.st_size < need_size) { - bu_vls_printf(&message, "File (%s) is too small, adjust the file size parameters first", fname); - Tcl_SetResult(s->interp, bu_vls_addr(&message), TCL_VOLATILE); - bu_vls_free(&message); - mged_print_result(s, TCL_ERROR); - return; - } - bu_strlcpy(ebm->name, fname, RT_EBM_NAME_LEN); - } - - break; - } - - case ECMD_EBM_HEIGHT: /* set extrusion depth */ - { - struct rt_ebm_internal *ebm = - (struct rt_ebm_internal *)s->edit_state.es_int.idb_ptr; - - RT_EBM_CK_MAGIC(ebm); - - if (inpara == 1) - ebm->tallness = es_para[0]; - else if (inpara > 0) { - Tcl_AppendResult(s->interp, - "extrusion depth required\n", - (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } else if (s->edit_state.es_scale > 0.0) { - ebm->tallness *= s->edit_state.es_scale; - s->edit_state.es_scale = 0.0; - } - } - break; - - case ECMD_VOL_CSIZE: /* set voxel size */ - { - struct rt_vol_internal *vol = - (struct rt_vol_internal *)s->edit_state.es_int.idb_ptr; - - RT_VOL_CK_MAGIC(vol); - - if (inpara == 3) { - VMOVE(vol->cellsize, es_para); - } else if (inpara > 0 && inpara != 3) { - Tcl_AppendResult(s->interp, "x, y, and z cell sizes are required\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } else if (s->edit_state.es_scale > 0.0) { - VSCALE(vol->cellsize, vol->cellsize, s->edit_state.es_scale); - s->edit_state.es_scale = 0.0; - } - } - break; - - case ECMD_VOL_FSIZE: /* set file size */ - { - struct rt_vol_internal *vol = - (struct rt_vol_internal *)s->edit_state.es_int.idb_ptr; - struct stat stat_buf; - b_off_t need_size; - - RT_VOL_CK_MAGIC(vol); - - if (inpara == 3) { - if (stat(vol->name, &stat_buf)) { - Tcl_AppendResult(s->interp, "Cannot get status of file ", vol->name, (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - need_size = es_para[0] * es_para[1] * es_para[2] * sizeof(unsigned char); - if (stat_buf.st_size < need_size) { - Tcl_AppendResult(s->interp, "File (", vol->name, - ") is too small, set file name first", (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - vol->xdim = es_para[0]; - vol->ydim = es_para[1]; - vol->zdim = es_para[2]; - } else if (inpara > 0) { - Tcl_AppendResult(s->interp, "x, y, and z file sizes are required\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - } - break; - - case ECMD_VOL_THRESH_LO: - { - struct rt_vol_internal *vol = - (struct rt_vol_internal *)s->edit_state.es_int.idb_ptr; - - RT_VOL_CK_MAGIC(vol); - - i = vol->lo; - if (inpara) { - i = es_para[0]; - } else if (s->edit_state.es_scale > 0.0) { - i = vol->lo * s->edit_state.es_scale; - if (i == vol->lo && s->edit_state.es_scale > 1.0) { - i++; - } else if (i == vol->lo && s->edit_state.es_scale < 1.0) { - i--; - } - } - - if (i > 255) - i = 255; - - vol->lo = i; - break; - } - - case ECMD_VOL_THRESH_HI: - { - struct rt_vol_internal *vol = - (struct rt_vol_internal *)s->edit_state.es_int.idb_ptr; - - RT_VOL_CK_MAGIC(vol); - - i = vol->hi; - if (inpara) { - i = es_para[0]; - } else if (s->edit_state.es_scale > 0.0) { - i = vol->hi * s->edit_state.es_scale; - if (i == vol->hi && s->edit_state.es_scale > 1.0) { - i++; - } else if (i == vol->hi && s->edit_state.es_scale < 1.0) { - i--; - } - } - - if (i > 255) - i = 255; - - vol->hi = i; - break; - } - - case ECMD_VOL_FNAME: - { - struct rt_vol_internal *vol = - (struct rt_vol_internal *)s->edit_state.es_int.idb_ptr; - const char *fname; - struct stat stat_buf; - b_off_t need_size; - - RT_VOL_CK_MAGIC(vol); - - fname = get_file_name(s, vol->name); - if (fname) { - struct bu_vls message = BU_VLS_INIT_ZERO; - - if (stat(fname, &stat_buf)) { - bu_vls_printf(&message, "Cannot get status of file %s\n", fname); - Tcl_SetResult(s->interp, bu_vls_addr(&message), TCL_VOLATILE); - bu_vls_free(&message); - mged_print_result(s, TCL_ERROR); - return; - } - need_size = vol->xdim * vol->ydim * vol->zdim * sizeof(unsigned char); - if (stat_buf.st_size < need_size) { - bu_vls_printf(&message, "File (%s) is too small, adjust the file size parameters first", fname); - Tcl_SetResult(s->interp, bu_vls_addr(&message), TCL_VOLATILE); - bu_vls_free(&message); - mged_print_result(s, TCL_ERROR); - return; - } - bu_strlcpy(vol->name, fname, RT_VOL_NAME_LEN); - } - - break; - } - - case ECMD_BOT_MODE: - { - struct rt_bot_internal *bot = - (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - const char *radio_result; - char mode[10]; - int ret_tcl = TCL_ERROR; - int old_mode; - - RT_BOT_CK_MAGIC(bot); - old_mode = bot->mode; - sprintf(mode, " %d", old_mode - 1); - if (dm_get_pathname(DMP)) { - ret_tcl = Tcl_VarEval(s->interp, "cad_radio", " .bot_mode_radio ", - bu_vls_addr(dm_get_pathname(DMP)), " _bot_mode_result", - " \"BOT Mode\"", " \"Select the desired mode\"", mode, - " { surface volume plate plate/nocosine }", - " { \"In surface mode, each triangle represents part of a zero thickness surface and no volume is enclosed\" \"In volume mode, the triangles are expected to enclose a volume and that volume becomes the solid\" \"In plate mode, each triangle represents a plate with a specified thickness\" \"In plate/nocosine mode, each triangle represents a plate with a specified thickness, but the LOS thickness reported by the raytracer is independent of obliquity angle\" } ", (char *)NULL); - } - if (ret_tcl != TCL_OK) { - Tcl_AppendResult(s->interp, "Mode selection failed!\n", (char *)NULL); - break; - } - radio_result = Tcl_GetVar(s->interp, "_bot_mode_result", TCL_GLOBAL_ONLY); - bot->mode = atoi(radio_result) + 1; - if (bot->mode == RT_BOT_PLATE || bot->mode == RT_BOT_PLATE_NOCOS) { - if (old_mode != RT_BOT_PLATE && old_mode != RT_BOT_PLATE_NOCOS) { - /* need to create some thicknesses */ - bot->thickness = (fastf_t *)bu_calloc(bot->num_faces, sizeof(fastf_t), "BOT thickness"); - bot->face_mode = bu_bitv_new(bot->num_faces); - } - } else { - if (old_mode == RT_BOT_PLATE || old_mode == RT_BOT_PLATE_NOCOS) { - /* free the per face memory */ - bu_free((char *)bot->thickness, "BOT thickness"); - bot->thickness = (fastf_t *)NULL; - bu_free((char *)bot->face_mode, "BOT face_mode"); - bot->face_mode = (struct bu_bitv *)NULL; - } - } - } - break; - case ECMD_BOT_ORIENT: - { - struct rt_bot_internal *bot = - (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - const char *radio_result; - char orient[10]; - int ret_tcl = TCL_ERROR; - - RT_BOT_CK_MAGIC(bot); - sprintf(orient, " %d", bot->orientation - 1); - if (dm_get_pathname(DMP)) { - ret_tcl = Tcl_VarEval(s->interp, "cad_radio", " .bot_orient_radio ", - bu_vls_addr(dm_get_pathname(DMP)), " _bot_orient_result", - " \"BOT Face Orientation\"", " \"Select the desired orientation\"", orient, - " { none right-hand-rule left-hand-rule }", - " { \"No orientation means that there is no particular order for the vertices of the triangles\" \"right-hand-rule means that the vertices of each triangle are ordered such that the right-hand-rule produces an outward pointing normal\" \"left-hand-rule means that the vertices of each triangle are ordered such that the left-hand-rule produces an outward pointing normal\" } ", (char *)NULL); - } - if (ret_tcl != TCL_OK) { - Tcl_AppendResult(s->interp, "Face orientation selection failed!\n", (char *)NULL); - break; - } - radio_result = Tcl_GetVar(s->interp, "_bot_orient_result", TCL_GLOBAL_ONLY); - bot->orientation = atoi(radio_result) + 1; - } - break; - case ECMD_BOT_THICK: - { - struct rt_bot_internal *bot = - (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - size_t face_no = 0; - int face_state = 0; - - RT_BOT_CK_MAGIC(bot); - - if (bot->mode != RT_BOT_PLATE && bot->mode != RT_BOT_PLATE_NOCOS) { - if (Tcl_VarEval(s->interp, "cad_dialog ", ".bot_err ", "$mged_gui(mged,screen) ", "{Not Plate Mode} ", - "{Cannot edit face thickness in a non-plate BOT} ", "\"\" ", "0 ", "OK ", - (char *)NULL) != TCL_OK) - { - bu_log("cad_dialog failed: %s\n", Tcl_GetStringResult(s->interp)); - } - break; - } - - if (bot_verts[0] < 0 || bot_verts[1] < 0 || bot_verts[2] < 0) { - /* setting thickness for all faces */ - if (!inpara) - break; - - (void)Tcl_VarEval(s->interp, "cad_dialog ", ".bot_err ", - "$mged_gui(mged,screen) ", "{Setting Thickness for All Faces} ", - "{No face is selected, so this operation will modify all the faces in this BOT} ", - "\"\" ", "0 ", "OK ", "CANCEL ", (char *)NULL); - if (atoi(Tcl_GetStringResult(s->interp))) - break; - - for (i=0; inum_faces; i++) - bot->thickness[i] = es_para[0]; - } else { - /* setting thickness for just one face */ - if (!inpara) - break; - - face_state = -1; - for (i=0; i < bot->num_faces; i++) { - if (bot_verts[0] == bot->faces[i*3] && - bot_verts[1] == bot->faces[i*3+1] && - bot_verts[2] == bot->faces[i*3+2]) - { - face_no = i; - face_state = 0; - break; - } - } - if (face_state > -1) { - bu_log("Cannot find face with vertices %d %d %d!\n", - V3ARGS(bot_verts)); - break; - } - - bot->thickness[face_no] = es_para[0]; - } - } - break; - case ECMD_BOT_FLAGS: - { - int ret_tcl = TCL_ERROR; - const char *dialog_result; - char cur_settings[11]; - struct rt_bot_internal *bot = - (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - - RT_BOT_CK_MAGIC(bot); - - bu_strlcpy(cur_settings, " { 0 0 }", sizeof(cur_settings)); - - if (bot->bot_flags & RT_BOT_USE_NORMALS) { - cur_settings[3] = '1'; - } - if (bot->bot_flags & RT_BOT_USE_FLOATS) { - cur_settings[5] = '1'; - } - - if (dm_get_pathname(DMP)) { - ret_tcl = Tcl_VarEval(s->interp, - "cad_list_buts", - " .bot_list_flags ", - bu_vls_addr(dm_get_pathname(DMP)), - " _bot_flags_result ", - cur_settings, - " \"BOT Flags\"", - " \"Select the desired flags\"", - " { {Use vertex normals} {Use single precision ray-tracing} }", - " { {This selection indicates that surface normals at hit points should be interpolated from vertex normals} {This selection indicates that the prepped form of the BOT triangles should use single precision to save memory} } ", - (char *)NULL); - } - if (ret_tcl != TCL_OK) { - bu_log("ERROR: cad_list_buts: %s\n", Tcl_GetStringResult(s->interp)); - break; - } - dialog_result = Tcl_GetVar(s->interp, "_bot_flags_result", TCL_GLOBAL_ONLY); - - if (dialog_result[0] == '1') { - bot->bot_flags |= RT_BOT_USE_NORMALS; - } else { - bot->bot_flags &= ~RT_BOT_USE_NORMALS; - } - if (dialog_result[2] == '1') { - bot->bot_flags |= RT_BOT_USE_FLOATS; - } else { - bot->bot_flags &= ~RT_BOT_USE_FLOATS; - } - } - break; - case ECMD_BOT_FMODE: - { - struct rt_bot_internal *bot = - (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - char fmode[10]; - const char *radio_result; - size_t face_no = 0; - int face_state = 0; - int ret_tcl = TCL_ERROR; - - RT_BOT_CK_MAGIC(bot); - - if (bot->mode != RT_BOT_PLATE && bot->mode != RT_BOT_PLATE_NOCOS) { - (void)Tcl_VarEval(s->interp, "cad_dialog ", ".bot_err ", "$mged_gui(mged,screen) ", "{Not Plate Mode} ", - "{Cannot edit face mode in a non-plate BOT} ", "\"\" ", "0 ", "OK ", - (char *)NULL); - break; - } - - if (bot_verts[0] < 0 || bot_verts[1] < 0 || bot_verts[2] < 0) { - /* setting mode for all faces */ - (void)Tcl_VarEval(s->interp, "cad_dialog ", ".bot_err ", - "$mged_gui(mged,screen) ", "{Setting Mode for All Faces} ", - "{No face is selected, so this operation will modify all the faces in this BOT} ", - "\"\" ", "0 ", "OK ", "CANCEL ", (char *)NULL); - if (atoi(Tcl_GetStringResult(s->interp))) - break; - - face_state = -2; - } else { - /* setting thickness for just one face */ - face_state = -1; - for (i=0; i < bot->num_faces; i++) { - if (bot_verts[0] == bot->faces[i*3] && - bot_verts[1] == bot->faces[i*3+1] && - bot_verts[2] == bot->faces[i*3+2]) - { - face_no = i; - face_state = 0; - break; - } - } - if (face_state < 0) { - bu_log("Cannot find face with vertices %d %d %d!\n", - V3ARGS(bot_verts)); - break; - } - } - - if (face_state > -1) - sprintf(fmode, " %d", BU_BITTEST(bot->face_mode, face_no)?1:0); - else - sprintf(fmode, " %d", BU_BITTEST(bot->face_mode, 0)?1:0); - - if (dm_get_pathname(DMP)) { - ret_tcl = Tcl_VarEval(s->interp, "cad_radio", " .bot_fmode_radio ", bu_vls_addr(dm_get_pathname(DMP)), - " _bot_fmode_result ", "\"BOT Face Mode\"", - " \"Select the desired face mode\"", fmode, - " { {Thickness centered about hit point} {Thickness appended to hit point} }", - " { {This selection will place the plate thickness centered about the hit point} {This selection will place the plate thickness rayward of the hit point} } ", - (char *)NULL); - } - if (ret_tcl != TCL_OK) { - bu_log("ERROR: cad_radio: %s\n", Tcl_GetStringResult(s->interp)); - break; - } - radio_result = Tcl_GetVar(s->interp, "_bot_fmode_result", TCL_GLOBAL_ONLY); - - if (face_state > -1) { - if (atoi(radio_result)) - BU_BITSET(bot->face_mode, face_no); - else - BU_BITCLR(bot->face_mode, face_no); - } else { - if (atoi(radio_result)) { - for (i=0; inum_faces; i++) - BU_BITSET(bot->face_mode, i); - } else - bu_bitv_clear(bot->face_mode); - } - } - break; - case ECMD_BOT_FDEL: - { - struct rt_bot_internal *bot = - (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - - int j, face_no; - - RT_BOT_CK_MAGIC(bot); - - if (bot_verts[0] < 0 || bot_verts[1] < 0 || bot_verts[2] < 0) { - bu_log("No Face selected!\n"); - return; - } - - face_no = -1; - for (i=0; i < bot->num_faces; i++) { - if (bot_verts[0] == bot->faces[i*3] && - bot_verts[1] == bot->faces[i*3+1] && - bot_verts[2] == bot->faces[i*3+2]) - { - face_no = i; - break; - } - } - if (face_no < 0) { - bu_log("Cannot find selected face!\n"); - return; - } - bot->num_faces--; - for (i=face_no; inum_faces; i++) { - j = i + 1; - bot->faces[3*i] = bot->faces[3*j]; - bot->faces[3*i + 1] = bot->faces[3*j + 1]; - bot->faces[3*i + 2] = bot->faces[3*j + 2]; - if (bot->thickness) - bot->thickness[i] = bot->thickness[j]; - } - - if (bot->face_mode) { - struct bu_bitv *new_bitv; - - new_bitv = bu_bitv_new(bot->num_faces); - for (i=0; i<(size_t)face_no; i++) { - if (BU_BITTEST(bot->face_mode, i)) - BU_BITSET(new_bitv, i); - } - for (i=face_no; inum_faces; i++) { - j = i+1; - if (BU_BITTEST(bot->face_mode, j)) - BU_BITSET(new_bitv, i); - } - bu_bitv_free(bot->face_mode); - bot->face_mode = new_bitv; - } - bot_verts[0] = -1; - bot_verts[1] = -1; - bot_verts[2] = -1; - } - break; - case ECMD_EXTR_SKT_NAME: - { - struct rt_extrude_internal *extr = - (struct rt_extrude_internal *)s->edit_state.es_int.idb_ptr; - const char *sketch_name; - int ret_tcl; - struct directory *dp; - struct rt_db_internal tmp_ip; - struct bu_vls tcl_cmd = BU_VLS_INIT_ZERO; - - RT_EXTRUDE_CK_MAGIC(extr); - - bu_vls_printf(&tcl_cmd, "cad_input_dialog .get_sketch_name $mged_gui(mged,screen) {Select Sketch} {Enter the name of the sketch to be extruded} final_sketch_name %s 0 {{summary \"Enter sketch name\"}} APPLY DISMISS", - extr->sketch_name); - ret_tcl = Tcl_Eval(s->interp, bu_vls_addr(&tcl_cmd)); - if (ret_tcl != TCL_OK) { - bu_log("ERROR: %s\n", Tcl_GetStringResult(s->interp)); - bu_vls_free(&tcl_cmd); - break; - } - - if (atoi(Tcl_GetStringResult(s->interp)) == 1) - break; - - bu_vls_free(&tcl_cmd); - - sketch_name = Tcl_GetVar(s->interp, "final_sketch_name", TCL_GLOBAL_ONLY); - if (extr->sketch_name) - bu_free((char *)extr->sketch_name, "extr->sketch_name"); - extr->sketch_name = bu_strdup(sketch_name); - - if (extr->skt) { - /* free the old sketch */ - RT_DB_INTERNAL_INIT(&tmp_ip); - tmp_ip.idb_major_type = DB5_MAJORTYPE_BRLCAD; - tmp_ip.idb_type = ID_SKETCH; - tmp_ip.idb_ptr = (void *)extr->skt; - tmp_ip.idb_meth = &OBJ[ID_SKETCH]; - rt_db_free_internal(&tmp_ip); - } - - if ((dp = db_lookup(s->dbip, sketch_name, 0)) == RT_DIR_NULL) { - bu_log("Warning: %s does not exist!\n", - sketch_name); - extr->skt = (struct rt_sketch_internal *)NULL; - } else { - /* import the new sketch */ - - if (rt_db_get_internal(&tmp_ip, dp, s->dbip, bn_mat_identity, &rt_uniresource) != ID_SKETCH) { - bu_log("rt_extrude_import: ERROR: Cannot import sketch (%.16s) for extrusion\n", - sketch_name); - extr->skt = (struct rt_sketch_internal *)NULL; - } else { - extr->skt = (struct rt_sketch_internal *)tmp_ip.idb_ptr; - } - } - } - break; - case ECMD_EXTR_MOV_H: - { - struct rt_extrude_internal *extr = - (struct rt_extrude_internal *)s->edit_state.es_int.idb_ptr; - - RT_EXTRUDE_CK_MAGIC(extr); - if (inpara) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model coordinates */ - MAT4X3PNT(work, es_invmat, es_para); - VSUB2(extr->h, work, extr->V); - } else { - VSUB2(extr->h, es_para, extr->V); - } - } - - /* check for zero H vector */ - if (MAGNITUDE(extr->h) <= SQRT_SMALL_FASTF) { - Tcl_AppendResult(s->interp, "Zero H vector not allowed, resetting to +Z\n", - (char *)NULL); - mged_print_result(s, TCL_ERROR); - VSET(extr->h, 0.0, 0.0, 1.0); - break; - } - } - break; - case ECMD_EXTR_SCALE_H: - { - struct rt_extrude_internal *extr = - (struct rt_extrude_internal *)s->edit_state.es_int.idb_ptr; - - RT_EXTRUDE_CK_MAGIC(extr); - - if (inpara) { - /* take es_mat[15] (path scaling) into account */ - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(extr->h); - VSCALE(extr->h, extr->h, s->edit_state.es_scale); - } else if (s->edit_state.es_scale > 0.0) { - VSCALE(extr->h, extr->h, s->edit_state.es_scale); - s->edit_state.es_scale = 0.0; - } - } - break; - case ECMD_ARB_MAIN_MENU: - /* put up control (main) menu for GENARB8s */ - menu_state->ms_flag = 0; - es_edflag = IDLE; - mmenu_set(s, MENU_L1, cntrl_menu); - break; - - case ECMD_ARB_SPECIFIC_MENU: - /* put up specific arb edit menus */ - menu_state->ms_flag = 0; - es_edflag = IDLE; - switch (es_menu) { - case MENU_ARB_MV_EDGE: - mmenu_set(s, MENU_L1, which_menu[es_type-4]); - break; - case MENU_ARB_MV_FACE: - mmenu_set(s, MENU_L1, which_menu[es_type+1]); - break; - case MENU_ARB_ROT_FACE: - mmenu_set(s, MENU_L1, which_menu[es_type+6]); - break; - default: - Tcl_AppendResult(s->interp, "Bad menu item.\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - break; - - case ECMD_ARB_MOVE_FACE: - /* move face through definite point */ - if (inpara) { - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - RT_ARB_CK_MAGIC(arb); - - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(work, es_invmat, es_para); - } else { - VMOVE(work, es_para); - } - /* change D of planar equation */ - es_peqn[es_menu][W]=VDOT(&es_peqn[es_menu][0], work); - /* find new vertices, put in record in vector notation */ - - (void)rt_arb_calc_points(arb, es_type, (const plane_t *)es_peqn, &s->tol.tol); - } - break; - case ECMD_ARB_SETUP_ROTFACE: - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - RT_ARB_CK_MAGIC(arb); - - /* check if point 5 is in the face */ - pnt5 = 0; - for (i=0; i<4; i++) { - if (rt_arb_vertices[es_type-4][es_menu*4+i]==5) - pnt5=1; - } - - /* special case for arb7 */ - if (es_type == ARB7 && pnt5) { - Tcl_AppendResult(s->interp, "\nFixed vertex is point 5.\n", (char *)NULL); - fixv = 5; - } else { - fixv = get_rotation_vertex(s); - } - - pr_prompt(s); - fixv--; - es_edflag = ECMD_ARB_ROTATE_FACE; - view_state->vs_flag = 1; /* draw arrow, etc. */ - set_e_axes_pos(s, 1); - break; - - case ECMD_ARB_ROTATE_FACE: - /* rotate a GENARB8 defining plane through a fixed vertex */ - - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - RT_ARB_CK_MAGIC(arb); - - if (inpara) { - static mat_t invsolr; - static vect_t tempvec; - static float rota, fb_a; - - /* - * Keyboard parameters in degrees. - * First, cancel any existing rotations, - * then perform new rotation - */ - bn_mat_inv(invsolr, acc_rot_sol); - eqp = &es_peqn[es_menu][0]; /* es_menu==plane of interest */ - VMOVE(work, eqp); - MAT4X3VEC(eqp, invsolr, work); - - if (inpara == 3) { - /* 3 params: absolute X, Y, Z rotations */ - /* Build completely new rotation change */ - MAT_IDN(modelchanges); - bn_mat_angles(modelchanges, - es_para[0], - es_para[1], - es_para[2]); - MAT_COPY(acc_rot_sol, modelchanges); - - /* Borrow incr_change matrix here */ - bn_mat_mul(incr_change, modelchanges, invsolr); - if (mged_variables->mv_context) { - /* calculate rotations about keypoint */ - bn_mat_xform_about_pnt(edit, incr_change, es_keypoint); - - /* We want our final matrix (mat) to xform the original solid - * to the position of this instance of the solid, perform the - * current edit operations, then xform back. - * mat = es_invmat * edit * es_mat - */ - bn_mat_mul(mat1, edit, es_mat); - bn_mat_mul(mat, es_invmat, mat1); - MAT_IDN(incr_change); - /* work contains original es_peqn[es_menu][0] */ - MAT4X3VEC(eqp, mat, work); - } else { - VMOVE(work, eqp); - MAT4X3VEC(eqp, modelchanges, work); - } - } else if (inpara == 2) { - /* 2 parameters: rot, fb were given */ - rota= es_para[0] * DEG2RAD; - fb_a = es_para[1] * DEG2RAD; - - /* calculate normal vector (length = 1) from rot, struct fb */ - es_peqn[es_menu][0] = cos(fb_a) * cos(rota); - es_peqn[es_menu][1] = cos(fb_a) * sin(rota); - es_peqn[es_menu][2] = sin(fb_a); - } else { - Tcl_AppendResult(s->interp, "Must be < rot fb | xdeg ydeg zdeg >\n", - (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - - /* point notation of fixed vertex */ - VMOVE(tempvec, arb->pt[fixv]); - - /* set D of planar equation to anchor at fixed vertex */ - /* es_menu == plane of interest */ - es_peqn[es_menu][W]=VDOT(eqp, tempvec); - - /* Clear out solid rotation */ - MAT_IDN(modelchanges); - - } else { - /* Apply incremental changes */ - static vect_t tempvec; - - eqp = &es_peqn[es_menu][0]; - VMOVE(work, eqp); - MAT4X3VEC(eqp, incr_change, work); - - /* point notation of fixed vertex */ - VMOVE(tempvec, arb->pt[fixv]); - - /* set D of planar equation to anchor at fixed vertex */ - /* es_menu == plane of interest */ - es_peqn[es_menu][W]=VDOT(eqp, tempvec); - } - - (void)rt_arb_calc_points(arb, es_type, (const plane_t *)es_peqn, &s->tol.tol); - MAT_IDN(incr_change); - - /* no need to calc_planes again */ - replot_editing_solid(s); - - inpara = 0; - return; - - case SSCALE: - /* scale the solid uniformly about its vertex point */ - { - mat_t scalemat; - - es_eu = (struct edgeuse *)NULL; /* Reset es_eu */ - es_pipe_pnt = (struct wdb_pipe_pnt *)NULL; /* Reset es_pipe_pnt */ - es_metaball_pnt = (struct wdb_metaball_pnt *)NULL; /* Reset es_metaball_pnt */ - bot_verts[0] = -1; - bot_verts[1] = -1; - bot_verts[2] = -1; - if (inpara) { - /* accumulate the scale factor */ - s->edit_state.es_scale = es_para[0] / acc_sc_sol; - acc_sc_sol = es_para[0]; - } - - bn_mat_scale_about_pnt(scalemat, es_keypoint, s->edit_state.es_scale); - bn_mat_mul(mat1, scalemat, es_mat); - bn_mat_mul(mat, es_invmat, mat1); - transform_editing_solid(s, &s->edit_state.es_int, mat, &s->edit_state.es_int, 1); - - /* reset solid scale factor */ - s->edit_state.es_scale = 1.0; - } - break; - - case STRANS: - /* translate solid */ - { - vect_t delta; - - es_eu = (struct edgeuse *)NULL; /* Reset es_eu */ - es_pipe_pnt = (struct wdb_pipe_pnt *)NULL; /* Reset es_pipe_pnt */ - es_metaball_pnt = (struct wdb_metaball_pnt *)NULL; /* Reset es_metaball_pnt */ - bot_verts[0] = -1; - bot_verts[1] = -1; - bot_verts[2] = -1; - if (inpara) { - /* Need vector from current vertex/keypoint - * to desired new location. - */ - if (mged_variables->mv_context) { - /* move solid so that es_keypoint is at position es_para */ - vect_t raw_para; - - MAT4X3PNT(raw_para, es_invmat, es_para); - MAT4X3PNT(work, es_invmat, es_keypoint); - VSUB2(delta, work, raw_para); - MAT_IDN(mat); - MAT_DELTAS_VEC_NEG(mat, delta); - } else { - /* move solid to position es_para */ - /* move solid to position es_para */ - MAT4X3PNT(work, es_invmat, es_keypoint); - VSUB2(delta, work, es_para); - MAT_IDN(mat); - MAT_DELTAS_VEC_NEG(mat, delta); - } - transform_editing_solid(s, &s->edit_state.es_int, mat, &s->edit_state.es_int, 1); - } - } - break; - case ECMD_VTRANS: - /* translate a vertex */ - es_eu = (struct edgeuse *)NULL; /* Reset es_eu */ - es_pipe_pnt = (struct wdb_pipe_pnt *)NULL; /* Reset es_pipe_pnt */ - es_metaball_pnt = (struct wdb_metaball_pnt *)NULL; /* Reset es_metaball_pnt */ - bot_verts[0] = -1; - bot_verts[1] = -1; - bot_verts[2] = -1; - if (es_mvalid) { - /* Mouse parameter: new position in model space */ - VMOVE(es_para, es_mparam); - inpara = 1; - } - if (inpara) { - - - /* Keyboard parameter: new position in model space. - * XXX for now, splines only here */ - struct rt_nurb_internal *sip = - (struct rt_nurb_internal *) s->edit_state.es_int.idb_ptr; - struct face_g_snurb *surf; - fastf_t *fp; - - RT_NURB_CK_MAGIC(sip); - surf = sip->srfs[spl_surfno]; - NMG_CK_SNURB(surf); - fp = &RT_NURB_GET_CONTROL_POINT(surf, spl_ui, spl_vi); - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(fp, es_invmat, es_para); - } else { - VMOVE(fp, es_para); - } - } - break; - - case ECMD_CLINE_SCALE_H: - /* - * Scale height vector - */ - { - struct rt_cline_internal *cli = - (struct rt_cline_internal *)s->edit_state.es_int.idb_ptr; - - RT_CLINE_CK_MAGIC(cli); - - if (inpara) { - es_para[0] *= es_mat[15]; - s->edit_state.es_scale = es_para[0] / MAGNITUDE(cli->h); - VSCALE(cli->h, cli->h, s->edit_state.es_scale); - } else if (s->edit_state.es_scale > 0.0) { - VSCALE(cli->h, cli->h, s->edit_state.es_scale); - s->edit_state.es_scale = 0.0; - } - } - break; - - case ECMD_CLINE_SCALE_R: - /* - * Scale radius - */ - { - struct rt_cline_internal *cli = - (struct rt_cline_internal *)s->edit_state.es_int.idb_ptr; - - RT_CLINE_CK_MAGIC(cli); - - if (inpara) - cli->radius = es_para[0]; - else if (s->edit_state.es_scale > 0.0) { - cli->radius *= s->edit_state.es_scale; - s->edit_state.es_scale = 0.0; - } - } - break; - - case ECMD_CLINE_SCALE_T: - /* - * Scale plate thickness - */ - { - struct rt_cline_internal *cli = - (struct rt_cline_internal *)s->edit_state.es_int.idb_ptr; - - RT_CLINE_CK_MAGIC(cli); - - if (inpara) - cli->thickness = es_para[0]; - else if (s->edit_state.es_scale > 0.0) { - cli->thickness *= s->edit_state.es_scale; - s->edit_state.es_scale = 0.0; - } - } - break; - - case ECMD_CLINE_MOVE_H: - /* - * Move end of height vector - */ - { - struct rt_cline_internal *cli = - (struct rt_cline_internal *)s->edit_state.es_int.idb_ptr; - - RT_CLINE_CK_MAGIC(cli); - - if (inpara) { - if (mged_variables->mv_context) { - MAT4X3PNT(work, es_invmat, es_para); - VSUB2(cli->h, work, cli->v); - } else - VSUB2(cli->h, es_para, cli->v); - } - /* check for zero H vector */ - if (MAGNITUDE(cli->h) <= SQRT_SMALL_FASTF) { - Tcl_AppendResult(s->interp, "Zero H vector not allowed, resetting to +Z\n", - (char *)NULL); - mged_print_result(s, TCL_ERROR); - VSET(cli->h, 0.0, 0.0, 1.0); - break; - } - } - break; - - case ECMD_TGC_MV_H: - /* - * Move end of H of tgc, keeping plates perpendicular - * to H vector. - */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - - RT_TGC_CK_MAGIC(tgc); - if (inpara) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model coordinates */ - MAT4X3PNT(work, es_invmat, es_para); - VSUB2(tgc->h, work, tgc->v); - } else { - VSUB2(tgc->h, es_para, tgc->v); - } - } - - /* check for zero H vector */ - if (MAGNITUDE(tgc->h) <= SQRT_SMALL_FASTF) { - Tcl_AppendResult(s->interp, "Zero H vector not allowed, resetting to +Z\n", - (char *)NULL); - mged_print_result(s, TCL_ERROR); - VSET(tgc->h, 0.0, 0.0, 1.0); - break; - } - - /* have new height vector -- redefine rest of tgc */ - la = MAGNITUDE(tgc->a); - lb = MAGNITUDE(tgc->b); - lc = MAGNITUDE(tgc->c); - ld = MAGNITUDE(tgc->d); - - /* find 2 perpendicular vectors normal to H for new A, B */ - bn_vec_perp(tgc->b, tgc->h); - VCROSS(tgc->a, tgc->b, tgc->h); - VUNITIZE(tgc->a); - VUNITIZE(tgc->b); - - /* Create new C, D from unit length A, B, with previous len */ - VSCALE(tgc->c, tgc->a, lc); - VSCALE(tgc->d, tgc->b, ld); - - /* Restore original vector lengths to A, B */ - VSCALE(tgc->a, tgc->a, la); - VSCALE(tgc->b, tgc->b, lb); - } - break; - - case ECMD_TGC_MV_HH: - /* Move end of H of tgc - leave ends alone */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - - RT_TGC_CK_MAGIC(tgc); - if (inpara) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model coordinates */ - MAT4X3PNT(work, es_invmat, es_para); - VSUB2(tgc->h, work, tgc->v); - } else { - VSUB2(tgc->h, es_para, tgc->v); - } - } - - /* check for zero H vector */ - if (MAGNITUDE(tgc->h) <= SQRT_SMALL_FASTF) { - Tcl_AppendResult(s->interp, "Zero H vector not allowed, resetting to +Z\n", - (char *)NULL); - mged_print_result(s, TCL_ERROR); - VSET(tgc->h, 0.0, 0.0, 1.0); - break; - } - } - break; - - case PSCALE: - es_eu = (struct edgeuse *)NULL; /* Reset es_eu */ - bot_verts[0] = -1; - bot_verts[1] = -1; - bot_verts[2] = -1; - pscale(s); - break; - - case PTARB: /* move an ARB point */ - case EARB: /* edit an ARB edge */ - if (inpara) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(work, es_invmat, es_para); - } else { - VMOVE(work, es_para); - } - editarb(s, work); - } - break; - - case SROT: - /* rot solid about vertex */ - { - es_eu = (struct edgeuse *)NULL; /* Reset es_eu */ - es_pipe_pnt = (struct wdb_pipe_pnt *)NULL; /* Reset es_pipe_pnt */ - es_metaball_pnt = (struct wdb_metaball_pnt *)NULL; /* Reset es_metaball_pnt */ - bot_verts[0] = -1; - bot_verts[1] = -1; - bot_verts[2] = -1; - if (inpara) { - static mat_t invsolr; - /* - * Keyboard parameters: absolute x, y, z rotations, - * in degrees. First, cancel any existing rotations, - * then perform new rotation - */ - bn_mat_inv(invsolr, acc_rot_sol); - - /* Build completely new rotation change */ - MAT_IDN(modelchanges); - bn_mat_angles(modelchanges, - es_para[0], - es_para[1], - es_para[2]); - /* Borrow incr_change matrix here */ - bn_mat_mul(incr_change, modelchanges, invsolr); - MAT_COPY(acc_rot_sol, modelchanges); - - /* Apply new rotation to solid */ - /* Clear out solid rotation */ - MAT_IDN(modelchanges); - } else { - /* Apply incremental changes already in incr_change */ - } - /* Apply changes to solid */ - /* xlate keypoint to origin, rotate, then put back. */ - switch (mged_variables->mv_rotate_about) { - case 'v': /* View Center */ - VSET(work, 0.0, 0.0, 0.0); - MAT4X3PNT(rot_point, view_state->vs_gvp->gv_view2model, work); - break; - case 'e': /* Eye */ - VSET(work, 0.0, 0.0, 1.0); - MAT4X3PNT(rot_point, view_state->vs_gvp->gv_view2model, work); - break; - case 'm': /* Model Center */ - VSETALL(rot_point, 0.0); - break; - case 'k': /* Key Point */ - default: - VMOVE(rot_point, es_keypoint); - break; - } - - if (mged_variables->mv_context) { - /* calculate rotations about keypoint */ - bn_mat_xform_about_pnt(edit, incr_change, rot_point); - - /* We want our final matrix (mat) to xform the original solid - * to the position of this instance of the solid, perform the - * current edit operations, then xform back. - * mat = es_invmat * edit * es_mat - */ - bn_mat_mul(mat1, edit, es_mat); - bn_mat_mul(mat, es_invmat, mat1); - } else { - MAT4X3PNT(work, es_invmat, rot_point); - bn_mat_xform_about_pnt(mat, incr_change, work); - } - transform_editing_solid(s, &s->edit_state.es_int, mat, &s->edit_state.es_int, 1); - - MAT_IDN(incr_change); - } - break; - - case ECMD_EXTR_ROT_H: - /* rotate height vector */ - { - struct rt_extrude_internal *extr = - (struct rt_extrude_internal *)s->edit_state.es_int.idb_ptr; - - RT_EXTRUDE_CK_MAGIC(extr); - if (inpara) { - static mat_t invsolr; - /* - * Keyboard parameters: absolute x, y, z rotations, - * in degrees. First, cancel any existing rotations, - * then perform new rotation - */ - bn_mat_inv(invsolr, acc_rot_sol); - - /* Build completely new rotation change */ - MAT_IDN(modelchanges); - bn_mat_angles(modelchanges, - es_para[0], - es_para[1], - es_para[2]); - /* Borrow incr_change matrix here */ - bn_mat_mul(incr_change, modelchanges, invsolr); - MAT_COPY(acc_rot_sol, modelchanges); - - /* Apply new rotation to solid */ - /* Clear out solid rotation */ - MAT_IDN(modelchanges); - } else { - /* Apply incremental changes already in incr_change */ - } - - if (mged_variables->mv_context) { - /* calculate rotations about keypoint */ - bn_mat_xform_about_pnt(edit, incr_change, es_keypoint); - - /* We want our final matrix (mat) to xform the original solid - * to the position of this instance of the solid, perform the - * current edit operations, then xform back. - * mat = es_invmat * edit * es_mat - */ - bn_mat_mul(mat1, edit, es_mat); - bn_mat_mul(mat, es_invmat, mat1); - MAT4X3VEC(extr->h, mat, extr->h); - } else { - MAT4X3VEC(extr->h, incr_change, extr->h); - } - - MAT_IDN(incr_change); - } - break; - - case ECMD_TGC_ROT_H: - /* rotate height vector */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - - RT_TGC_CK_MAGIC(tgc); - if (inpara) { - static mat_t invsolr; - /* - * Keyboard parameters: absolute x, y, z rotations, - * in degrees. First, cancel any existing rotations, - * then perform new rotation - */ - bn_mat_inv(invsolr, acc_rot_sol); - - /* Build completely new rotation change */ - MAT_IDN(modelchanges); - bn_mat_angles(modelchanges, - es_para[0], - es_para[1], - es_para[2]); - /* Borrow incr_change matrix here */ - bn_mat_mul(incr_change, modelchanges, invsolr); - MAT_COPY(acc_rot_sol, modelchanges); - - /* Apply new rotation to solid */ - /* Clear out solid rotation */ - MAT_IDN(modelchanges); - } else { - /* Apply incremental changes already in incr_change */ - } - - if (mged_variables->mv_context) { - /* calculate rotations about keypoint */ - bn_mat_xform_about_pnt(edit, incr_change, es_keypoint); - - /* We want our final matrix (mat) to xform the original solid - * to the position of this instance of the solid, perform the - * current edit operations, then xform back. - * mat = es_invmat * edit * es_mat - */ - bn_mat_mul(mat1, edit, es_mat); - bn_mat_mul(mat, es_invmat, mat1); - MAT4X3VEC(tgc->h, mat, tgc->h); - } else { - MAT4X3VEC(tgc->h, incr_change, tgc->h); - } - - MAT_IDN(incr_change); - } - break; - - case ECMD_TGC_ROT_AB: - /* rotate surfaces AxB and CxD (tgc) */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - - RT_TGC_CK_MAGIC(tgc); - if (inpara) { - static mat_t invsolr; - /* - * Keyboard parameters: absolute x, y, z rotations, - * in degrees. First, cancel any existing rotations, - * then perform new rotation - */ - bn_mat_inv(invsolr, acc_rot_sol); - - /* Build completely new rotation change */ - MAT_IDN(modelchanges); - bn_mat_angles(modelchanges, - es_para[0], - es_para[1], - es_para[2]); - /* Borrow incr_change matrix here */ - bn_mat_mul(incr_change, modelchanges, invsolr); - MAT_COPY(acc_rot_sol, modelchanges); - - /* Apply new rotation to solid */ - /* Clear out solid rotation */ - MAT_IDN(modelchanges); - } else { - /* Apply incremental changes already in incr_change */ - } - - if (mged_variables->mv_context) { - /* calculate rotations about keypoint */ - bn_mat_xform_about_pnt(edit, incr_change, es_keypoint); - - /* We want our final matrix (mat) to xform the original solid - * to the position of this instance of the solid, perform the - * current edit operations, then xform back. - * mat = es_invmat * edit * es_mat - */ - bn_mat_mul(mat1, edit, es_mat); - bn_mat_mul(mat, es_invmat, mat1); - MAT4X3VEC(tgc->a, mat, tgc->a); - MAT4X3VEC(tgc->b, mat, tgc->b); - MAT4X3VEC(tgc->c, mat, tgc->c); - MAT4X3VEC(tgc->d, mat, tgc->d); - } else { - MAT4X3VEC(tgc->a, incr_change, tgc->a); - MAT4X3VEC(tgc->b, incr_change, tgc->b); - MAT4X3VEC(tgc->c, incr_change, tgc->c); - MAT4X3VEC(tgc->d, incr_change, tgc->d); - } - MAT_IDN(incr_change); - } - break; - - case ECMD_HYP_ROT_H: - /* rotate hyperboloid height vector */ - { - struct rt_hyp_internal *hyp = - (struct rt_hyp_internal *)s->edit_state.es_int.idb_ptr; - - RT_HYP_CK_MAGIC(hyp); - if (inpara) { - static mat_t invsolr; - /* - * Keyboard parameters: absolute x, y, z rotations, - * in degrees. First, cancel any existing rotations, - * then perform new rotation - */ - bn_mat_inv(invsolr, acc_rot_sol); - - /* Build completely new rotation change */ - MAT_IDN(modelchanges); - bn_mat_angles(modelchanges, - es_para[0], - es_para[1], - es_para[2]); - /* Borrow incr_change matrix here */ - bn_mat_mul(incr_change, modelchanges, invsolr); - MAT_COPY(acc_rot_sol, modelchanges); - - /* Apply new rotation to solid */ - /* Clear out solid rotation */ - MAT_IDN(modelchanges); - } else { - /* Apply incremental changes already in incr_change */ - } - - if (mged_variables->mv_context) { - /* calculate rotations about keypoint */ - bn_mat_xform_about_pnt(edit, incr_change, es_keypoint); - - /* We want our final matrix (mat) to xform the original solid - * to the position of this instance of the solid, perform the - * current edit operations, then xform back. - * mat = es_invmat * edit * es_mat - */ - bn_mat_mul(mat1, edit, es_mat); - bn_mat_mul(mat, es_invmat, mat1); - - MAT4X3VEC(hyp->hyp_Hi, mat, hyp->hyp_Hi); - } else { - MAT4X3VEC(hyp->hyp_Hi, incr_change, hyp->hyp_Hi); - } - } - MAT_IDN(incr_change); - break; - - case ECMD_ETO_ROT_C: - /* rotate ellipse semi-major axis vector */ - { - struct rt_eto_internal *eto = - (struct rt_eto_internal *)s->edit_state.es_int.idb_ptr; - - RT_ETO_CK_MAGIC(eto); - if (inpara) { - static mat_t invsolr; - /* - * Keyboard parameters: absolute x, y, z rotations, - * in degrees. First, cancel any existing rotations, - * then perform new rotation - */ - bn_mat_inv(invsolr, acc_rot_sol); - - /* Build completely new rotation change */ - MAT_IDN(modelchanges); - bn_mat_angles(modelchanges, - es_para[0], - es_para[1], - es_para[2]); - /* Borrow incr_change matrix here */ - bn_mat_mul(incr_change, modelchanges, invsolr); - MAT_COPY(acc_rot_sol, modelchanges); - - /* Apply new rotation to solid */ - /* Clear out solid rotation */ - MAT_IDN(modelchanges); - } else { - /* Apply incremental changes already in incr_change */ - } - - if (mged_variables->mv_context) { - /* calculate rotations about keypoint */ - bn_mat_xform_about_pnt(edit, incr_change, es_keypoint); - - /* We want our final matrix (mat) to xform the original solid - * to the position of this instance of the solid, perform the - * current edit operations, then xform back. - * mat = es_invmat * edit * es_mat - */ - bn_mat_mul(mat1, edit, es_mat); - bn_mat_mul(mat, es_invmat, mat1); - - MAT4X3VEC(eto->eto_C, mat, eto->eto_C); - } else { - MAT4X3VEC(eto->eto_C, incr_change, eto->eto_C); - } - } - MAT_IDN(incr_change); - break; - - case ECMD_NMG_EPICK: - /* XXX Nothing to do here (yet), all done in mouse routine. */ - break; - case ECMD_NMG_EMOVE: - { - point_t new_pt; - - if (!es_eu) { - Tcl_AppendResult(s->interp, "No edge selected!\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } - NMG_CK_EDGEUSE(es_eu); - - if (es_mvalid) { - VMOVE(new_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for edge move\n", - (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) - break; - - if (!nmg_find_fu_of_eu(es_eu) && *es_eu->up.magic_p == NMG_LOOPUSE_MAGIC) { - struct loopuse *lu; - fastf_t area; - plane_t pl; - - /* this edge is in a wire loop - * keep the loop planar - */ - lu = es_eu->up.lu_p; - NMG_CK_LOOPUSE(lu); - - /* get plane equation for loop */ - area = nmg_loop_plane_area(lu, pl); - if (area > 0.0) { - vect_t view_z_dir; - vect_t view_dir; - fastf_t dist; - - /* Get view direction vector */ - VSET(view_z_dir, 0.0, 0.0, 1.0); - MAT4X3VEC(view_dir, view_state->vs_gvp->gv_view2model, view_z_dir); - - /* intersect line through new_pt with plane of loop */ - if (bg_isect_line3_plane(&dist, new_pt, view_dir, pl, &s->tol.tol) < 1) { - /* line does not intersect plane, don't do an esplit */ - Tcl_AppendResult(s->interp, "Edge Move: Cannot place new point in plane of loop\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } - VJOIN1(new_pt, new_pt, dist, view_dir); - } - } - - if (nmg_move_edge_thru_pnt(es_eu, new_pt, &s->tol.tol) < 0) { - VPRINT("Unable to hit", new_pt); - } - } - break; - - case ECMD_NMG_EKILL: - { - struct model *m; - struct edge_g_lseg *eg; - - if (!es_eu) { - Tcl_AppendResult(s->interp, "No edge selected!\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } - NMG_CK_EDGEUSE(es_eu); - - m = nmg_find_model(&es_eu->l.magic); - - if (*es_eu->up.magic_p == NMG_LOOPUSE_MAGIC) { - struct loopuse *lu; - struct edgeuse *prev_eu, *next_eu; - - lu = es_eu->up.lu_p; - NMG_CK_LOOPUSE(lu); - - if (*lu->up.magic_p != NMG_SHELL_MAGIC) { - /* Currently can only kill wire edges or edges in wire loops */ - Tcl_AppendResult(s->interp, "Currently, we can only kill wire edges or edges in wire loops\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - es_edflag = IDLE; - break; - } - - prev_eu = BU_LIST_PPREV_CIRC(edgeuse, &es_eu->l); - NMG_CK_EDGEUSE(prev_eu); - - if (prev_eu == es_eu) { - /* only one edge left in the loop - * make it an edge to/from same vertex - */ - if (es_eu->vu_p->v_p == es_eu->eumate_p->vu_p->v_p) { - /* refuse to delete last edge that runs - * to/from same vertex - */ - Tcl_AppendResult(s->interp, "Cannot delete last edge running to/from same vertex\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } - NMG_CK_EDGEUSE(es_eu->eumate_p); - nmg_movevu(es_eu->eumate_p->vu_p, es_eu->vu_p->v_p); - break; - } - - next_eu = BU_LIST_PNEXT_CIRC(edgeuse, &es_eu->l); - NMG_CK_EDGEUSE(next_eu); - - nmg_movevu(next_eu->vu_p, es_eu->vu_p->v_p); - if (nmg_keu(es_eu)) { - /* Should never happen! */ - bu_exit(EXIT_FAILURE, "sedit(s): killed edge and emptied loop!\n"); - } - es_eu = prev_eu; - nmg_rebound(m, &s->tol.tol); - - /* fix edge geometry for modified edge (next_eu) */ - eg = next_eu->g.lseg_p; - NMG_CK_EDGE_G_LSEG(eg); - VMOVE(eg->e_pt, next_eu->vu_p->v_p->vg_p->coord); - VSUB2(eg->e_dir, next_eu->eumate_p->vu_p->v_p->vg_p->coord, next_eu->vu_p->v_p->vg_p->coord); - - break; - } else if (*es_eu->up.magic_p == NMG_SHELL_MAGIC) { - /* wire edge, just kill it */ - (void)nmg_keu(es_eu); - es_eu = (struct edgeuse *)NULL; - nmg_rebound(m, &s->tol.tol); - } - } - - /* fall through */ - - case ECMD_NMG_ESPLIT: - { - struct vertex *v=(struct vertex *)NULL; - struct edge_g_lseg *eg; - struct model *m; - point_t new_pt; - fastf_t area; - plane_t pl; - - if (!es_eu) { - Tcl_AppendResult(s->interp, "No edge selected!\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } - NMG_CK_EDGEUSE(es_eu); - m = nmg_find_model(&es_eu->l.magic); - NMG_CK_MODEL(m); - if (es_mvalid) { - VMOVE(new_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for edge split\n", - (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) - break; - - if (*es_eu->up.magic_p == NMG_LOOPUSE_MAGIC) { - struct loopuse *lu; - - lu = es_eu->up.lu_p; - NMG_CK_LOOPUSE(lu); - - /* Currently, can only split wire edges or edges in wire loops */ - if (*lu->up.magic_p != NMG_SHELL_MAGIC) { - Tcl_AppendResult(s->interp, "Currently, we can only split wire edges or edges in wire loops\n", (char *)NULL); - es_edflag = IDLE; - mged_print_result(s, TCL_ERROR); - break; - } - - /* get plane equation for loop */ - area = nmg_loop_plane_area(lu, pl); - if (area > 0.0) { - vect_t view_z_dir; - vect_t view_dir; - fastf_t dist; - - /* Get view direction vector */ - VSET(view_z_dir, 0.0, 0.0, 1.0); - MAT4X3VEC(view_dir, view_state->vs_gvp->gv_view2model, view_z_dir); - - /* intersect line through new_pt with plane of loop */ - if (bg_isect_line3_plane(&dist, new_pt, view_dir, pl, &s->tol.tol) < 1) { - /* line does not intersect plane, don't do an esplit */ - Tcl_AppendResult(s->interp, "Edge Split: Cannot place new point in plane of loop\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } - VJOIN1(new_pt, new_pt, dist, view_dir); - } - } - es_eu = nmg_esplit(v, es_eu, 0); - nmg_vertex_gv(es_eu->vu_p->v_p, new_pt); - nmg_rebound(m, &s->tol.tol); - eg = es_eu->g.lseg_p; - NMG_CK_EDGE_G_LSEG(eg); - VMOVE(eg->e_pt, new_pt); - VSUB2(eg->e_dir, es_eu->eumate_p->vu_p->v_p->vg_p->coord, new_pt); - } - break; - case ECMD_NMG_LEXTRU: - { - fastf_t dist; - point_t to_pt; - vect_t extrude_vec; - struct loopuse *new_lu; - struct faceuse *fu; - struct model *m; - plane_t new_lu_pl; - fastf_t area; - - if (es_mvalid) { - VMOVE(to_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(to_pt, es_invmat, es_para); - } else { - VMOVE(to_pt, es_para); - } - } else if (inpara == 1) { - VJOIN1(to_pt, lu_keypoint, es_para[0], lu_pl); - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for loop extrusion\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) { - break; - } - - VSUB2(extrude_vec, to_pt, lu_keypoint); - - if (bg_isect_line3_plane(&dist, to_pt, extrude_vec, lu_pl, &s->tol.tol) < 1) { - Tcl_AppendResult(s->interp, "Cannot extrude parallel to plane of loop\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - - if (BU_LIST_NON_EMPTY(&es_s->fu_hd)) { - struct nmgregion *r; - - r = es_s->r_p; - (void) nmg_ks(es_s); - es_s = nmg_msv(r); - } - - new_lu = nmg_dup_loop(lu_copy, &es_s->l.magic, (long **)0); - area = nmg_loop_plane_area(new_lu, new_lu_pl); - if (area < 0.0) { - Tcl_AppendResult(s->interp, "loop to be extruded as no area!\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - - if (VDOT(extrude_vec, new_lu_pl) > 0.0) { - plane_t tmp_pl; - - fu = nmg_mf(new_lu->lumate_p); - NMG_CK_FACEUSE(fu); - HREVERSE(tmp_pl, new_lu_pl); - nmg_face_g(fu, tmp_pl); - } else { - fu = nmg_mf(new_lu); - NMG_CK_FACEUSE(fu); - nmg_face_g(fu, new_lu_pl); - } - - (void)nmg_extrude_face(fu, extrude_vec, s->vlfree, &s->tol.tol); - - nmg_fix_normals(fu->s_p, s->vlfree, &s->tol.tol); - - m = nmg_find_model(&fu->l.magic); - nmg_rebound(m, &s->tol.tol); - (void)nmg_ck_geometry(m, s->vlfree, &s->tol.tol); - - es_eu = (struct edgeuse *)NULL; - - replot_editing_solid(s); - view_state->vs_flag = 1; - } - break; - case ECMD_PIPE_PICK: - { - struct rt_pipe_internal *pipeip = - (struct rt_pipe_internal *)s->edit_state.es_int.idb_ptr; - point_t new_pt; - - RT_PIPE_CK_MAGIC(pipeip); - - if (es_mvalid) { - VMOVE(new_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for segment selection\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) - break; - - es_pipe_pnt = find_pipe_pnt_nearest_pnt(s, &pipeip->pipe_segs_head, new_pt); - if (!es_pipe_pnt) { - Tcl_AppendResult(s->interp, "No PIPE segment selected\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - } else - rt_pipe_pnt_print(es_pipe_pnt, s->dbip->dbi_base2local); - } - break; - case ECMD_PIPE_SPLIT: - { - struct rt_pipe_internal *pipeip = - (struct rt_pipe_internal *)s->edit_state.es_int.idb_ptr; - point_t new_pt; - - RT_PIPE_CK_MAGIC(pipeip); - - if (es_mvalid) { - VMOVE(new_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for segment split\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) - break; - - if (!es_pipe_pnt) { - Tcl_AppendResult(s->interp, "No pipe segment selected\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } - - pipe_split_pnt(&pipeip->pipe_segs_head, es_pipe_pnt, new_pt); - } - break; - case ECMD_PIPE_PT_MOVE: - { - struct rt_pipe_internal *pipeip = - (struct rt_pipe_internal *)s->edit_state.es_int.idb_ptr; - point_t new_pt; - - RT_PIPE_CK_MAGIC(pipeip); - - if (es_mvalid) { - VMOVE(new_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for segment movement\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) - break; - - if (!es_pipe_pnt) { - Tcl_AppendResult(s->interp, "No pipe segment selected\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } - - pipe_move_pnt(s, pipeip, es_pipe_pnt, new_pt); - } - break; - case ECMD_PIPE_PT_ADD: - { - struct rt_pipe_internal *pipeip = - (struct rt_pipe_internal *)s->edit_state.es_int.idb_ptr; - point_t new_pt; - - RT_PIPE_CK_MAGIC(pipeip); - - if (es_mvalid) { - VMOVE(new_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for 'append segment'\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) - break; - - es_pipe_pnt = pipe_add_pnt(pipeip, es_pipe_pnt, new_pt); - } - break; - case ECMD_PIPE_PT_INS: - { - struct rt_pipe_internal *pipeip = - (struct rt_pipe_internal *)s->edit_state.es_int.idb_ptr; - point_t new_pt; - - RT_PIPE_CK_MAGIC(pipeip); - - if (es_mvalid) { - VMOVE(new_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for 'prepend segment'\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) - break; - - pipe_ins_pnt(pipeip, es_pipe_pnt, new_pt); - } - break; - case ECMD_PIPE_PT_DEL: - { - if (!es_pipe_pnt) { - Tcl_AppendResult(s->interp, "No pipe segment selected\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } - es_pipe_pnt = pipe_del_pnt(s, es_pipe_pnt); - } - break; - case ECMD_ARS_PICK_MENU: - /* put up point pick menu for ARS solid */ - menu_state->ms_flag = 0; - es_edflag = ECMD_ARS_PICK; - mmenu_set(s, MENU_L1, ars_pick_menu); - break; - case ECMD_ARS_EDIT_MENU: - /* put up main ARS edit menu */ - menu_state->ms_flag = 0; - es_edflag = IDLE; - mmenu_set(s, MENU_L1, ars_menu); - break; - case ECMD_ARS_PICK: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - point_t pick_pt; - vect_t view_dir; - vect_t z_dir; - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - point_t selected_pt; - - RT_ARS_CK_MAGIC(ars); - - if (es_mvalid) { - VMOVE(pick_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(pick_pt, es_invmat, es_para); - } else { - VMOVE(pick_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for 'pick point'\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) - break; - - /* Get view direction vector */ - VSET(z_dir, 0.0, 0.0, 1.0); - MAT4X3VEC(view_dir, view_state->vs_gvp->gv_view2model, z_dir); - find_ars_nearest_pnt(&es_ars_crv, &es_ars_col, ars, pick_pt, view_dir); - VMOVE(es_pt, &ars->curves[es_ars_crv][es_ars_col*3]); - VSCALE(selected_pt, es_pt, s->dbip->dbi_base2local); - bu_log("Selected point #%d from curve #%d (%f %f %f)\n", - es_ars_col, es_ars_crv, V3ARGS(selected_pt)); - - bu_vls_printf(&tmp_vls, "Selected point #%d from curve #%d (%f %f %f)\n", es_ars_col, es_ars_crv, V3ARGS(selected_pt)); - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); - mged_print_result(s, TCL_ERROR); - bu_vls_free(&tmp_vls); - } - break; - case ECMD_ARS_NEXT_PT: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - point_t selected_pt; - - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv >= 0 && es_ars_col >= 0) { - es_ars_col++; - if ((size_t)es_ars_col >= ars->pts_per_curve) - es_ars_col = 0; - VMOVE(es_pt, &ars->curves[es_ars_crv][es_ars_col*3]); - VSCALE(selected_pt, es_pt, s->dbip->dbi_base2local); - bu_log("Selected point #%d from curve #%d (%f %f %f)\n", - es_ars_col, es_ars_crv, V3ARGS(selected_pt)); - - bu_vls_printf(&tmp_vls, "Selected point #%d from curve #%d (%f %f %f)\n", es_ars_col, es_ars_crv, V3ARGS(selected_pt)); - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); - mged_print_result(s, TCL_ERROR); - bu_vls_free(&tmp_vls); - } - } - break; - case ECMD_ARS_PREV_PT: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - point_t selected_pt; - - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv >= 0 && es_ars_col >= 0) { - es_ars_col--; - if (es_ars_col < 0) - es_ars_col = ars->pts_per_curve - 1; - VMOVE(es_pt, &ars->curves[es_ars_crv][es_ars_col*3]); - VSCALE(selected_pt, es_pt, s->dbip->dbi_base2local); - bu_log("Selected point #%d from curve #%d (%f %f %f)\n", - es_ars_col, es_ars_crv, V3ARGS(selected_pt)); - - bu_vls_printf(&tmp_vls, "Selected point #%d from curve #%d (%f %f %f)\n", es_ars_col, es_ars_crv, V3ARGS(selected_pt)); - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); - mged_print_result(s, TCL_ERROR); - bu_vls_free(&tmp_vls); - } - } - break; - case ECMD_ARS_NEXT_CRV: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - point_t selected_pt; - - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv >= 0 && es_ars_col >= 0) { - es_ars_crv++; - if ((size_t)es_ars_crv >= ars->ncurves) - es_ars_crv = 0; - VMOVE(es_pt, &ars->curves[es_ars_crv][es_ars_col*3]); - VSCALE(selected_pt, es_pt, s->dbip->dbi_base2local); - bu_log("Selected point #%d from curve #%d (%f %f %f)\n", - es_ars_col, es_ars_crv, V3ARGS(selected_pt)); - - bu_vls_printf(&tmp_vls, "Selected point #%d from curve #%d (%f %f %f)\n", es_ars_col, es_ars_crv, V3ARGS(selected_pt)); - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); - mged_print_result(s, TCL_ERROR); - bu_vls_free(&tmp_vls); - } - } - break; - case ECMD_ARS_PREV_CRV: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - point_t selected_pt; - - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv >= 0 && es_ars_col >= 0) { - es_ars_crv--; - if (es_ars_crv < 0) - es_ars_crv = ars->ncurves - 1; - VMOVE(es_pt, &ars->curves[es_ars_crv][es_ars_col*3]); - VSCALE(selected_pt, es_pt, s->dbip->dbi_base2local); - bu_log("Selected point #%d from curve #%d (%f %f %f)\n", - es_ars_col, es_ars_crv, V3ARGS(selected_pt)); - - bu_vls_printf(&tmp_vls, "Selected point #%d from curve #%d (%f %f %f)\n", es_ars_col, es_ars_crv, V3ARGS(selected_pt)); - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); - mged_print_result(s, TCL_ERROR); - bu_vls_free(&tmp_vls); - } - } - break; - case ECMD_ARS_DUP_CRV: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - fastf_t **curves; - - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv < 0 || es_ars_col < 0) { - bu_log("No ARS point selected\n"); - break; - } - - curves = (fastf_t **)bu_malloc((ars->ncurves+1) * sizeof(fastf_t *), - "new curves"); - - for (i=0; incurves+1; i++) { - size_t j, k; - - curves[i] = (fastf_t *)bu_malloc(ars->pts_per_curve * 3 * sizeof(fastf_t), - "new curves[i]"); - - if (i <= (size_t)es_ars_crv) - k = i; - else - k = i - 1; - - for (j=0; jpts_per_curve*3; j++) - curves[i][j] = ars->curves[k][j]; - } - - for (i=0; incurves; i++) - bu_free((void *)ars->curves[i], "ars->curves[i]"); - bu_free((void *)ars->curves, "ars->curves"); - - ars->curves = curves; - ars->ncurves++; - } - break; - case ECMD_ARS_DUP_COL: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - fastf_t **curves; - - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv < 0 || es_ars_col < 0) { - bu_log("No ARS point selected\n"); - break; - } - - curves = (fastf_t **)bu_malloc(ars->ncurves * sizeof(fastf_t *), - "new curves"); - - for (i=0; incurves; i++) { - size_t j, k; - - curves[i] = (fastf_t *)bu_malloc((ars->pts_per_curve + 1) * 3 * sizeof(fastf_t), - "new curves[i]"); - - for (j=0; jpts_per_curve+1; j++) { - if (j <= (size_t)es_ars_col) - k = j; - else - k = j - 1; - - curves[i][j*3] = ars->curves[i][k*3]; - curves[i][j*3+1] = ars->curves[i][k*3+1]; - curves[i][j*3+2] = ars->curves[i][k*3+2]; - } - } - - for (i=0; incurves; i++) - bu_free((void *)ars->curves[i], "ars->curves[i]"); - bu_free((void *)ars->curves, "ars->curves"); - - ars->curves = curves; - ars->pts_per_curve++; - } - break; - case ECMD_ARS_DEL_CRV: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - fastf_t **curves; - int k; - - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv < 0 || es_ars_col < 0) { - bu_log("No ARS point selected\n"); - break; - } - - if (es_ars_crv == 0 || (size_t)es_ars_crv == ars->ncurves-1) { - bu_log("Cannot delete first or last curve\n"); - break; - } - - curves = (fastf_t **)bu_malloc((ars->ncurves - 1) * sizeof(fastf_t *), - "new curves"); - - k = 0; - for (i=0; incurves; i++) { - size_t j; - - if (i == (size_t)es_ars_crv) - continue; - - curves[k] = (fastf_t *)bu_malloc(ars->pts_per_curve * 3 * sizeof(fastf_t), - "new curves[k]"); - - for (j=0; jpts_per_curve*3; j++) - curves[k][j] = ars->curves[i][j]; - - k++; - } - - for (i=0; incurves; i++) - bu_free((void *)ars->curves[i], "ars->curves[i]"); - bu_free((void *)ars->curves, "ars->curves"); - - ars->curves = curves; - ars->ncurves--; - - if ((size_t)es_ars_crv >= ars->ncurves) - es_ars_crv = ars->ncurves - 1; - } - break; - case ECMD_ARS_DEL_COL: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - fastf_t **curves; - - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv < 0 || es_ars_col < 0) { - bu_log("No ARS point selected\n"); - break; - } - - if (es_ars_col == 0 || (size_t)es_ars_col == ars->ncurves - 1) { - bu_log("Cannot delete first or last column\n"); - break; - } - - if (ars->pts_per_curve < 3) { - bu_log("Cannot create an ARS with less than two points per curve\n"); - break; - } - - curves = (fastf_t **)bu_malloc(ars->ncurves * sizeof(fastf_t *), - "new curves"); - - for (i=0; incurves; i++) { - size_t j, k; - - - curves[i] = (fastf_t *)bu_malloc((ars->pts_per_curve - 1) * 3 * sizeof(fastf_t), - "new curves[i]"); - - k = 0; - for (j=0; jpts_per_curve; j++) { - if (j == (size_t)es_ars_col) - continue; - - curves[i][k*3] = ars->curves[i][j*3]; - curves[i][k*3+1] = ars->curves[i][j*3+1]; - curves[i][k*3+2] = ars->curves[i][j*3+2]; - k++; - } - } - - for (i=0; incurves; i++) - bu_free((void *)ars->curves[i], "ars->curves[i]"); - bu_free((void *)ars->curves, "ars->curves"); - - ars->curves = curves; - ars->pts_per_curve--; - - if ((size_t)es_ars_col >= ars->pts_per_curve) - es_ars_col = ars->pts_per_curve - 1; - } - break; - case ECMD_ARS_MOVE_COL: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - point_t new_pt = VINIT_ZERO; - vect_t diff; - - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv < 0 || es_ars_col < 0) { - bu_log("No ARS point selected\n"); - break; - } - - if (es_mvalid) { - vect_t view_dir; - plane_t view_pl; - fastf_t dist; - - /* construct a plane perpendicular to view direction - * that passes through ARS point being moved - */ - VSET(view_dir, 0.0, 0.0, 1.0); - MAT4X3VEC(view_pl, view_state->vs_gvp->gv_view2model, view_dir); - VUNITIZE(view_pl); - view_pl[W] = VDOT(view_pl, &ars->curves[es_ars_crv][es_ars_col*3]); - - /* project es_mparam onto the plane */ - dist = DIST_PNT_PLANE(es_mparam, view_pl); - VJOIN1(new_pt, es_mparam, -dist, view_pl); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for point movement\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) { - break; - } - - VSUB2(diff, new_pt, &ars->curves[es_ars_crv][es_ars_col*3]); - - for (i=0; incurves; i++) - VADD2(&ars->curves[i][es_ars_col*3], - &ars->curves[i][es_ars_col*3], diff); - - } - break; - case ECMD_ARS_MOVE_CRV: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - point_t new_pt = VINIT_ZERO; - vect_t diff; - - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv < 0 || es_ars_col < 0) { - bu_log("No ARS point selected\n"); - break; - } - - if (es_mvalid) { - vect_t view_dir; - plane_t view_pl; - fastf_t dist; - - /* construct a plane perpendicular to view direction - * that passes through ARS point being moved - */ - VSET(view_dir, 0.0, 0.0, 1.0); - MAT4X3VEC(view_pl, view_state->vs_gvp->gv_view2model, view_dir); - VUNITIZE(view_pl); - view_pl[W] = VDOT(view_pl, &ars->curves[es_ars_crv][es_ars_col*3]); - - /* project es_mparam onto the plane */ - dist = DIST_PNT_PLANE(es_mparam, view_pl); - VJOIN1(new_pt, es_mparam, -dist, view_pl); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for point movement\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) { - break; - } - - VSUB2(diff, new_pt, &ars->curves[es_ars_crv][es_ars_col*3]); - - for (i=0; ipts_per_curve; i++) - VADD2(&ars->curves[es_ars_crv][i*3], - &ars->curves[es_ars_crv][i*3], diff); - - } - break; - case ECMD_ARS_MOVE_PT: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - point_t new_pt = VINIT_ZERO; - - RT_ARS_CK_MAGIC(ars); - - if (es_ars_crv < 0 || es_ars_col < 0) { - bu_log("No ARS point selected\n"); - break; - } - - if (es_mvalid) { - vect_t view_dir; - plane_t view_pl; - fastf_t dist; - - /* construct a plane perpendicular to view direction - * that passes through ARS point being moved - */ - VSET(view_dir, 0.0, 0.0, 1.0); - MAT4X3VEC(view_pl, view_state->vs_gvp->gv_view2model, view_dir); - VUNITIZE(view_pl); - view_pl[W] = VDOT(view_pl, &ars->curves[es_ars_crv][es_ars_col*3]); - - /* project es_mparam onto the plane */ - dist = DIST_PNT_PLANE(es_mparam, view_pl); - VJOIN1(new_pt, es_mparam, -dist, view_pl); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for point movement\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) { - break; - } - - VMOVE(&ars->curves[es_ars_crv][es_ars_col*3], new_pt); - } - break; - case ECMD_BOT_MOVEV: - { - struct rt_bot_internal *bot = (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - int vert; - point_t new_pt = VINIT_ZERO; - - RT_BOT_CK_MAGIC(bot); - - if (bot_verts[0] < 0) { - bu_log("No BOT point selected\n"); - break; - } - - if (bot_verts[1] >= 0 && bot_verts[2] >= 0) { - bu_log("A triangle is selected, not a BOT point!\n"); - break; - } - - if (bot_verts[1] >= 0) { - bu_log("An edge is selected, not a BOT point!\n"); - break; - } - - vert = bot_verts[0]; - if (es_mvalid) { - VMOVE(new_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for point movement\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) { - break; - } - - VMOVE(&bot->vertices[vert*3], new_pt); - } - break; - case ECMD_BOT_MOVEE: - { - struct rt_bot_internal *bot = (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - int v1, v2; - vect_t diff; - point_t new_pt = VINIT_ZERO; - - RT_BOT_CK_MAGIC(bot); - - if (bot_verts[0] < 0 || bot_verts[1] < 0) { - Tcl_AppendResult(s->interp, "No BOT edge selected\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } - - if (bot_verts[2] >= 0) { - bu_log("A triangle is selected, not a BOT edge!\n"); - break; - } - v1 = bot_verts[0]; - v2 = bot_verts[1]; - if (es_mvalid) { - VMOVE(new_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for point movement\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) { - break; - } - - - VSUB2(diff, new_pt, &bot->vertices[v1*3]); - VMOVE(&bot->vertices[v1*3], new_pt); - VADD2(&bot->vertices[v2*3], &bot->vertices[v2*3], diff); - } - break; - case ECMD_BOT_MOVET: - { - struct rt_bot_internal *bot = (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - int v1, v2, v3; - point_t new_pt = VINIT_ZERO; - vect_t diff; - - RT_BOT_CK_MAGIC(bot); - - if (bot_verts[0] < 0 || bot_verts[1] < 0 || bot_verts[2] < 0) { - Tcl_AppendResult(s->interp, "No BOT triangle selected\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } - v1 = bot_verts[0]; - v2 = bot_verts[1]; - v3 = bot_verts[2]; - - if (es_mvalid) { - VMOVE(new_pt, es_mparam); - } else if (inpara == 3) { - if (mged_variables->mv_context) { - /* apply es_invmat to convert to real model space */ - MAT4X3PNT(new_pt, es_invmat, es_para); - } else { - VMOVE(new_pt, es_para); - } - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for point movement\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) { - break; - } - - VSUB2(diff, new_pt, &bot->vertices[v1*3]); - VMOVE(&bot->vertices[v1*3], new_pt); - VADD2(&bot->vertices[v2*3], &bot->vertices[v2*3], diff); - VADD2(&bot->vertices[v3*3], &bot->vertices[v3*3], diff); - } - break; - case ECMD_BOT_PICKV: - case ECMD_BOT_PICKE: - case ECMD_BOT_PICKT: - break; - - case ECMD_METABALL_PT_PICK: - { - struct rt_metaball_internal *metaball= - (struct rt_metaball_internal *)s->edit_state.es_int.idb_ptr; - point_t new_pt; - struct wdb_metaball_pnt *ps; - struct wdb_metaball_pnt *nearest=(struct wdb_metaball_pnt *)NULL; - struct bn_tol tmp_tol; - fastf_t min_dist = MAX_FASTF; - vect_t dir; - - RT_METABALL_CK_MAGIC(metaball); - - if (es_mvalid) { - VMOVE(new_pt, es_mparam); - } else if (inpara == 3) { - VMOVE(new_pt, es_para); - } else if (inpara && inpara != 3) { - Tcl_AppendResult(s->interp, "x y z coordinates required for control point selection\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - break; - } else if (!es_mvalid && !inpara) { - break; - } - - tmp_tol.magic = BN_TOL_MAGIC; - tmp_tol.dist = 0.0; - tmp_tol.dist_sq = tmp_tol.dist * tmp_tol.dist; - tmp_tol.perp = 0.0; - tmp_tol.para = 1.0 - tmp_tol.perp; - - /* get a direction vector in model space corresponding to z-direction in view */ - VSET(work, 0.0, 0.0, 1.0); - MAT4X3VEC(dir, view_state->vs_gvp->gv_view2model, work); - - for (BU_LIST_FOR(ps, wdb_metaball_pnt, &metaball->metaball_ctrl_head)) { - fastf_t dist; - - dist = bg_dist_line3_pnt3(new_pt, dir, ps->coord); - if (dist < min_dist) { - min_dist = dist; - nearest = ps; - } - } - - es_metaball_pnt = nearest; - - if (!es_metaball_pnt) { - Tcl_AppendResult(s->interp, "No METABALL control point selected\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - } else { - rt_metaball_pnt_print(es_metaball_pnt, s->dbip->dbi_base2local); - } - } - break; - case ECMD_METABALL_PT_MOV: - if (!es_metaball_pnt) { - bu_log("Must select a point to move"); break; } - if (inpara != 3) { - bu_log("Must provide dx dy dz"); break; } - VADD2(es_metaball_pnt->coord, es_metaball_pnt->coord, es_para); - break; - case ECMD_METABALL_PT_DEL: - { - struct wdb_metaball_pnt *tmp = es_metaball_pnt, *p; - - if (es_metaball_pnt == NULL) { - bu_log("No point selected"); - break; - } - p = BU_LIST_PREV(wdb_metaball_pnt, &es_metaball_pnt->l); - if (p->l.magic == BU_LIST_HEAD_MAGIC) { - es_metaball_pnt = BU_LIST_NEXT(wdb_metaball_pnt, &es_metaball_pnt->l); - /* 0 point metaball... allow it for now. */ - if (es_metaball_pnt->l.magic == BU_LIST_HEAD_MAGIC) - es_metaball_pnt = NULL; - } else - es_metaball_pnt = p; - BU_LIST_DQ(&tmp->l); - free(tmp); - if (!es_metaball_pnt) - bu_log("WARNING: Last point of this metaball has been deleted."); - } - break; - case ECMD_METABALL_PT_ADD: - { - struct rt_metaball_internal *metaball= (struct rt_metaball_internal *)s->edit_state.es_int.idb_ptr; - struct wdb_metaball_pnt *n = (struct wdb_metaball_pnt *)malloc(sizeof(struct wdb_metaball_pnt)); - - if (inpara != 3) { - bu_log("Must provide x y z"); - bu_free(n, "wdb_metaball_pnt n"); - break; - } - - es_metaball_pnt = BU_LIST_FIRST(wdb_metaball_pnt, &metaball->metaball_ctrl_head); - VMOVE(n->coord, es_para); - n->l.magic = WDB_METABALLPT_MAGIC; - n->fldstr = 1.0; - BU_LIST_APPEND(&es_metaball_pnt->l, &n->l); - es_metaball_pnt = n; - } - break; - - default: - { - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&tmp_vls, "sedit(s): unknown edflag = %d.\n", es_edflag); - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); - mged_print_result(s, TCL_ERROR); - bu_vls_free(&tmp_vls); - } - } + */ +void +sedit_menu(struct mged_state *s) { - /* must re-calculate the face plane equations for arbs */ - if (s->edit_state.es_int.idb_type == ID_ARB8) { - struct bu_vls error_msg = BU_VLS_INIT_ZERO; + menu_state->ms_flag = 0; /* No menu item selected yet */ - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - RT_ARB_CK_MAGIC(arb); + mmenu_set_all(s, MENU_L1, NULL); + chg_l2menu(s, ST_S_EDIT); - if (rt_arb_calc_planes(&error_msg, arb, es_type, es_peqn, &s->tol.tol) < 0) - Tcl_AppendResult(s->interp, bu_vls_addr(&error_msg), (char *)0); - bu_vls_free(&error_msg); + const struct rt_db_internal *ip = &s->s_edit->es_int; + if (EDOBJ[ip->idb_type].ft_menu_item) { + bu_vls_trunc(s->s_edit->log_str, 0); + struct rt_solid_edit_menu_item *mi = (*EDOBJ[ip->idb_type].ft_menu_item)(&s->tol.tol); + if (bu_vls_strlen(s->s_edit->log_str)) { + Tcl_AppendResult(s->interp, bu_vls_cstr(s->s_edit->log_str), (char *)NULL); + bu_vls_trunc(s->s_edit->log_str, 0); + } + mmenu_set_all(s, MENU_L1, mi); } - /* If the keypoint changed location, find about it here */ - if (!es_keyfixed) - get_solid_keypoint(s, &es_keypoint, &es_keytag, &s->edit_state.es_int, es_mat); - - set_e_axes_pos(s, 0); - replot_editing_solid(s); - - if (update_views) { - dm_set_dirty(DMP, 1); - struct bu_vls vls = BU_VLS_INIT_ZERO; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_IDLE); /* Drop out of previous edit mode */ + s->s_edit->edit_menu = 0; +} - bu_vls_printf(&vls, "active_edit_callback"); - (void)Tcl_Eval(s->interp, bu_vls_addr(&vls)); - bu_vls_free(&vls); +char * +get_sketch_name(struct mged_state *s, const char *sk_n) +{ + struct bu_vls tcl_cmd = BU_VLS_INIT_ZERO; + bu_vls_printf(&tcl_cmd, "cad_input_dialog .get_sketch_name $mged_gui(mged,screen) {Select Sketch} {Enter the name of the sketch to be extruded} final_sketch_name %s 0 {{summary \"Enter sketch name\"}} APPLY DISMISS", sk_n); + int ret_tcl = Tcl_Eval(s->interp, bu_vls_addr(&tcl_cmd)); + if (ret_tcl != TCL_OK) { + bu_log("ERROR: %s\n", Tcl_GetStringResult(s->interp)); + bu_vls_free(&tcl_cmd); + return NULL; } - inpara = 0; - es_mvalid = 0; -} + if (atoi(Tcl_GetStringResult(s->interp)) == 1) + return NULL; + bu_vls_free(&tcl_cmd); -void -update_edit_absolute_tran(struct mged_state *s, vect_t view_pos) -{ - vect_t model_pos; - vect_t ea_view_pos; - vect_t diff; - fastf_t inv_Viewscale = 1/view_state->vs_gvp->gv_scale; - - MAT4X3PNT(model_pos, view_state->vs_gvp->gv_view2model, view_pos); - VSUB2(diff, model_pos, e_axes_pos); - VSCALE(s->edit_state.edit_absolute_model_tran, diff, inv_Viewscale); - VMOVE(s->edit_state.last_edit_absolute_model_tran, s->edit_state.edit_absolute_model_tran); - - MAT4X3PNT(ea_view_pos, view_state->vs_gvp->gv_model2view, e_axes_pos); - VSUB2(s->edit_state.edit_absolute_view_tran, view_pos, ea_view_pos); - VMOVE(s->edit_state.last_edit_absolute_view_tran, s->edit_state.edit_absolute_view_tran); + const char *sketch_name = Tcl_GetVar(s->interp, "final_sketch_name", TCL_GLOBAL_ONLY); + return bu_strdup(sketch_name); } - /* * Mouse (pen) press in graphics area while doing Solid Edit. * mousevec [X] and [Y] are in the range -1.0...+1.0, corresponding * to viewspace. * - * In order to allow the "p" command to do the same things that - * a mouse event can, the preferred strategy is to store the value - * corresponding to what the "p" command would give in es_mparam, - * set es_mvalid = 1, set sedraw = 1, and return, allowing sedit(s) - * to actually do the work. + * In order to allow the "p" command to do the same things that a mouse event + * can, the preferred strategy is to store the value corresponding to what the + * "p" command would give in s->edit_state.e_mparam, set s->edit_state.e_mvalid + * = 1, set sedraw = 1, and return, allowing rt_solid_edit_process(s) to + * actually do the work. */ void sedit_mouse(struct mged_state *s, const vect_t mousevec) { - vect_t pos_view = VINIT_ZERO; /* Unrotated view space pos */ - vect_t pos_model = VINIT_ZERO; /* Rotated screen space pos */ - vect_t tr_temp = VINIT_ZERO; /* temp translation vector */ - vect_t temp = VINIT_ZERO; - vect_t raw_kp = VINIT_ZERO; /* es_keypoint with es_invmat applied */ - vect_t raw_mp = VINIT_ZERO; /* raw model position */ - mat_t mat; - - if (es_edflag <= 0) + if (s->s_edit->edit_flag <= 0) return; - switch (es_edflag) { - case SSCALE: - case PSCALE: - case ECMD_DSP_SCALE_X: - case ECMD_DSP_SCALE_Y: - case ECMD_DSP_SCALE_ALT: - case ECMD_VOL_CSIZE: - case ECMD_VOL_THRESH_LO: - case ECMD_VOL_THRESH_HI: - case ECMD_EBM_HEIGHT: - case ECMD_EXTR_SCALE_H: - case ECMD_CLINE_SCALE_H: - case ECMD_CLINE_SCALE_T: - case ECMD_CLINE_SCALE_R: - /* use mouse to get a scale factor */ - s->edit_state.es_scale = 1.0 + 0.25 * ((fastf_t) - (mousevec[Y] > 0 ? mousevec[Y] : -mousevec[Y])); - if (mousevec[Y] <= 0) - s->edit_state.es_scale = 1.0 / s->edit_state.es_scale; - - /* accumulate scale factor */ - acc_sc_sol *= s->edit_state.es_scale; - - s->edit_state.edit_absolute_scale = acc_sc_sol - 1.0; - if (s->edit_state.edit_absolute_scale > 0) - s->edit_state.edit_absolute_scale /= 3.0; - - sedit(s); - - return; - case STRANS: - /* - * Use mouse to change solid's location. - * Project solid's keypoint into view space, - * replace X, Y (but NOT Z) components, and - * project result back to model space. - * Then move keypoint there. - */ - { - point_t pt; - vect_t delta; - - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - MAT4X3PNT(pt, view_state->vs_gvp->gv_view2model, pos_view); - - /* Need vector from current vertex/keypoint - * to desired new location. - */ - MAT4X3PNT(raw_mp, es_invmat, pt); - MAT4X3PNT(raw_kp, es_invmat, curr_e_axes_pos); - VSUB2(delta, raw_kp, raw_mp); - MAT_IDN(mat); - MAT_DELTAS_VEC_NEG(mat, delta); - transform_editing_solid(s, &s->edit_state.es_int, mat, &s->edit_state.es_int, 1); - } - - break; - case ECMD_VTRANS: - /* - * Use mouse to change a vertex location. - * Project vertex (in solid keypoint) into view space, - * replace X, Y (but NOT Z) components, and - * project result back to model space. - * Leave desired location in es_mparam. - */ - - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - MAT4X3PNT(temp, view_state->vs_gvp->gv_view2model, pos_view); - MAT4X3PNT(es_mparam, es_invmat, temp); - es_mvalid = 1; /* es_mparam is valid */ - /* Leave the rest to code in sedit(s) */ - - break; - case ECMD_TGC_MV_H: - case ECMD_TGC_MV_HH: - /* Use mouse to change location of point V+H */ - { - struct rt_tgc_internal *tgc = - (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - RT_TGC_CK_MAGIC(tgc); - - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - /* Do NOT change pos_view[Z] ! */ - MAT4X3PNT(temp, view_state->vs_gvp->gv_view2model, pos_view); - MAT4X3PNT(tr_temp, es_invmat, temp); - VSUB2(tgc->h, tr_temp, tgc->v); - } - - break; - case ECMD_EXTR_MOV_H: - /* Use mouse to change location of point V+H */ - { - struct rt_extrude_internal *extr = - (struct rt_extrude_internal *)s->edit_state.es_int.idb_ptr; - RT_EXTRUDE_CK_MAGIC(extr); - - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - /* Do NOT change pos_view[Z] ! */ - MAT4X3PNT(temp, view_state->vs_gvp->gv_view2model, pos_view); - MAT4X3PNT(tr_temp, es_invmat, temp); - VSUB2(extr->h, tr_temp, extr->V); - } - - break; - case ECMD_CLINE_MOVE_H: - { - struct rt_cline_internal *cli = - (struct rt_cline_internal *)s->edit_state.es_int.idb_ptr; - - RT_CLINE_CK_MAGIC(cli); - - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - /* Do NOT change pos_view[Z] ! */ - MAT4X3PNT(temp, view_state->vs_gvp->gv_view2model, pos_view); - MAT4X3PNT(tr_temp, es_invmat, temp); - VSUB2(cli->h, tr_temp, cli->v); - } - - break; - case PTARB: - /* move an arb point to indicated point */ - /* point is located at es_values[es_menu*3] */ - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - MAT4X3PNT(temp, view_state->vs_gvp->gv_view2model, pos_view); - MAT4X3PNT(pos_model, es_invmat, temp); - editarb(s, pos_model); - - break; - case EARB: - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - MAT4X3PNT(temp, view_state->vs_gvp->gv_view2model, pos_view); - MAT4X3PNT(pos_model, es_invmat, temp); - editarb(s, pos_model); - - break; - case ECMD_ARB_MOVE_FACE: - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - MAT4X3PNT(temp, view_state->vs_gvp->gv_view2model, pos_view); - MAT4X3PNT(pos_model, es_invmat, temp); - /* change D of planar equation */ - es_peqn[es_menu][W]=VDOT(&es_peqn[es_menu][0], pos_model); - /* calculate new vertices, put in record as vectors */ - { - struct rt_arb_internal *arb= - (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - - RT_ARB_CK_MAGIC(arb); - - (void)rt_arb_calc_points(arb, es_type, (const plane_t *)es_peqn, &s->tol.tol); - } - - break; - case ECMD_BOT_PICKV: - { - struct rt_bot_internal *bot = (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - int tmp_vert; - char tmp_msg[256]; - point_t selected_pt; - - RT_BOT_CK_MAGIC(bot); - - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - - tmp_vert = rt_bot_find_v_nearest_pt2(bot, pos_view, view_state->vs_gvp->gv_model2view); - if (tmp_vert < 0) { - Tcl_AppendResult(s->interp, "ECMD_BOT_PICKV: unable to find a vertex!\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - - bot_verts[0] = tmp_vert; - bot_verts[1] = -1; - bot_verts[2] = -1; - VSCALE(selected_pt, &bot->vertices[tmp_vert*3], s->dbip->dbi_base2local); - sprintf(tmp_msg, "picked point at (%g %g %g), vertex #%d\n", V3ARGS(selected_pt), tmp_vert); - Tcl_AppendResult(s->interp, tmp_msg, (char *)NULL); - mged_print_result(s, TCL_OK); - } - break; - case ECMD_BOT_PICKE: - { - struct rt_bot_internal *bot = (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - int vert1, vert2; - char tmp_msg[256]; - point_t from_pt, to_pt; - - RT_BOT_CK_MAGIC(bot); - - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - - if (rt_bot_find_e_nearest_pt2(&vert1, &vert2, bot, pos_view, view_state->vs_gvp->gv_model2view)) { - Tcl_AppendResult(s->interp, "ECMD_BOT_PICKE: unable to find an edge!\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - - bot_verts[0] = vert1; - bot_verts[1] = vert2; - bot_verts[2] = -1; - VSCALE(from_pt, &bot->vertices[vert1*3], s->dbip->dbi_base2local); - VSCALE(to_pt, &bot->vertices[vert2*3], s->dbip->dbi_base2local); - sprintf(tmp_msg, "picked edge from (%g %g %g) to (%g %g %g)\n", V3ARGS(from_pt), V3ARGS(to_pt)); - Tcl_AppendResult(s->interp, tmp_msg, (char *)NULL); - mged_print_result(s, TCL_OK); - } - break; - case ECMD_BOT_PICKT: - { - struct rt_bot_internal *bot = (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - point_t start_pt, tmp; - vect_t dir; - size_t i; - int hits, ret_tcl; - int v1, v2, v3; - point_t pt1, pt2, pt3; - struct bu_vls vls = BU_VLS_INIT_ZERO; - - RT_BOT_CK_MAGIC(bot); - - VSET(tmp, mousevec[X], mousevec[Y], 0.0); - MAT4X3PNT(start_pt, view_state->vs_gvp->gv_view2model, tmp); - VSET(tmp, 0, 0, 1); - MAT4X3VEC(dir, view_state->vs_gvp->gv_view2model, tmp); - - bu_vls_strcat(&vls, " {"); - hits = 0; - for (i=0; inum_faces; i++) { - v1 = bot->faces[i*3]; - v2 = bot->faces[i*3+1]; - v3 = bot->faces[i*3+2]; - VMOVE(pt1, &bot->vertices[v1*3]); - VMOVE(pt2, &bot->vertices[v2*3]); - VMOVE(pt3, &bot->vertices[v3*3]); - - if (bg_does_ray_isect_tri(start_pt, dir, pt1, pt2, pt3, tmp)) { - hits++; - bu_vls_printf(&vls, " { %d %d %d }", v1, v2, v3); - } - } - bu_vls_strcat(&vls, " } "); - - if (hits == 0) { - bot_verts[0] = -1; - bot_verts[1] = -1; - bot_verts[2] = -1; - bu_vls_free(&vls); - } - if (hits == 1) { - sscanf(bu_vls_addr(&vls), " { { %d %d %d", &bot_verts[0], &bot_verts[1], &bot_verts[2]); - bu_vls_free(&vls); - } else { - Tcl_LinkVar(s->interp, "bot_v1", (char *)&bot_verts[0], TCL_LINK_INT); - Tcl_LinkVar(s->interp, "bot_v2", (char *)&bot_verts[1], TCL_LINK_INT); - Tcl_LinkVar(s->interp, "bot_v3", (char *)&bot_verts[2], TCL_LINK_INT); - - ret_tcl = Tcl_VarEval(s->interp, "bot_face_select ", bu_vls_addr(&vls), (char *)NULL); - bu_vls_free(&vls); - if (ret_tcl != TCL_OK) { - bu_log("bot_face_select failed: %s\n", Tcl_GetStringResult(s->interp)); - bot_verts[0] = -1; - bot_verts[1] = -1; - bot_verts[2] = -1; - break; - } - } - } - break; - case ECMD_NMG_EPICK: - /* XXX Should just leave desired location in es_mparam for sedit(s) */ - { - struct model *m = - (struct model *)s->edit_state.es_int.idb_ptr; - struct edge *e; - struct bn_tol tmp_tol; - NMG_CK_MODEL(m); - - /* Picking an edge should not depend on tolerances! */ - tmp_tol.magic = BN_TOL_MAGIC; - tmp_tol.dist = 0.0; - tmp_tol.dist_sq = tmp_tol.dist * tmp_tol.dist; - tmp_tol.perp = 0.0; - tmp_tol.para = 1 - tmp_tol.perp; - - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - if ((e = nmg_find_e_nearest_pt2(&m->magic, pos_view, - view_state->vs_gvp->gv_model2view, s->vlfree, &tmp_tol)) == (struct edge *)NULL) { - Tcl_AppendResult(s->interp, "ECMD_NMG_EPICK: unable to find an edge\n", - (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; - } - es_eu = e->eu_p; - NMG_CK_EDGEUSE(es_eu); - - { - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&tmp_vls, - "edgeuse selected = %p (%g %g %g) <-> (%g %g %g)\n", - (void *)es_eu, V3ARGS(es_eu->vu_p->v_p->vg_p->coord), - V3ARGS(es_eu->eumate_p->vu_p->v_p->vg_p->coord)); - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); - mged_print_result(s, TCL_ERROR); - bu_vls_free(&tmp_vls); - } - } - - break; - case ECMD_NMG_LEXTRU: - case ECMD_NMG_EMOVE: - case ECMD_NMG_ESPLIT: - case ECMD_PIPE_PICK: - case ECMD_PIPE_SPLIT: - case ECMD_PIPE_PT_MOVE: - case ECMD_PIPE_PT_ADD: - case ECMD_PIPE_PT_INS: - case ECMD_ARS_PICK: - case ECMD_ARS_MOVE_PT: - case ECMD_ARS_MOVE_CRV: - case ECMD_ARS_MOVE_COL: - case ECMD_BOT_MOVEV: - case ECMD_BOT_MOVEE: - case ECMD_BOT_MOVET: - case ECMD_METABALL_PT_PICK: - case ECMD_METABALL_PT_MOV: - case ECMD_METABALL_PT_ADD: - - MAT4X3PNT(pos_view, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); - pos_view[X] = mousevec[X]; - pos_view[Y] = mousevec[Y]; - MAT4X3PNT(temp, view_state->vs_gvp->gv_view2model, pos_view); - MAT4X3PNT(es_mparam, es_invmat, temp); - es_mvalid = 1; - - break; - default: - Tcl_AppendResult(s->interp, "mouse press undefined in this solid edit mode\n", (char *)NULL); - mged_print_result(s, TCL_ERROR); - return; + const struct rt_db_internal *ip = &s->s_edit->es_int; + if (EDOBJ[ip->idb_type].ft_edit_xy) { + bu_vls_trunc(s->s_edit->log_str, 0); + (*EDOBJ[ip->idb_type].ft_edit_xy)(s->s_edit, mousevec); + if (bu_vls_strlen(s->s_edit->log_str)) { + Tcl_AppendResult(s->interp, bu_vls_cstr(s->s_edit->log_str), (char *)NULL); + bu_vls_trunc(s->s_edit->log_str, 0); + } } - - update_edit_absolute_tran(s, pos_view); - sedit(s); } @@ -5235,24 +769,27 @@ sedit_abs_scale(struct mged_state *s) { fastf_t old_acc_sc_sol; - if (es_edflag != SSCALE && es_edflag != PSCALE) + if (s->s_edit->edit_flag != RT_SOLID_EDIT_SCALE && s->s_edit->edit_flag != RT_SOLID_EDIT_PSCALE) return; - old_acc_sc_sol = acc_sc_sol; + old_acc_sc_sol = s->s_edit->acc_sc_sol; - if (-SMALL_FASTF < s->edit_state.edit_absolute_scale && s->edit_state.edit_absolute_scale < SMALL_FASTF) - acc_sc_sol = 1.0; - else if (s->edit_state.edit_absolute_scale > 0.0) - acc_sc_sol = 1.0 + s->edit_state.edit_absolute_scale * 3.0; + if (-SMALL_FASTF < s->s_edit->edit_absolute_scale && s->s_edit->edit_absolute_scale < SMALL_FASTF) + s->s_edit->acc_sc_sol = 1.0; + else if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->acc_sc_sol = 1.0 + s->s_edit->edit_absolute_scale * 3.0; else { - if ((s->edit_state.edit_absolute_scale - MGED_SMALL_SCALE) < -1.0) - s->edit_state.edit_absolute_scale = -1.0 + MGED_SMALL_SCALE; + if ((s->s_edit->edit_absolute_scale - MGED_SMALL_SCALE) < -1.0) + s->s_edit->edit_absolute_scale = -1.0 + MGED_SMALL_SCALE; - acc_sc_sol = 1.0 + s->edit_state.edit_absolute_scale; + s->s_edit->acc_sc_sol = 1.0 + s->s_edit->edit_absolute_scale; } - s->edit_state.es_scale = acc_sc_sol / old_acc_sc_sol; - sedit(s); + s->s_edit->es_scale = s->s_edit->acc_sc_sol / old_acc_sc_sol; + s->s_edit->update_views = s->update_views; + sedraw = 0; + rt_solid_edit_process(s->s_edit); + s->update_views = s->s_edit->update_views; } @@ -5268,7 +805,7 @@ objedit_mouse(struct mged_state *s, const vect_t mousevec) vect_t tr_temp; /* temp translation vector */ vect_t temp; - MAT_IDN(incr_change); + MAT_IDN(s->s_edit->incr_change); if (movedir & SARROW) { /* scaling option is in effect */ scale = 1.0 + (fastf_t)(mousevec[Y]>0 ? @@ -5281,59 +818,59 @@ objedit_mouse(struct mged_state *s, const vect_t mousevec) case BE_O_SCALE: /* global scaling */ - incr_change[15] = 1.0 / scale; + s->s_edit->incr_change[15] = 1.0 / scale; - acc_sc_obj /= incr_change[15]; - s->edit_state.edit_absolute_scale = acc_sc_obj - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + s->edit_state.acc_sc_obj /= s->s_edit->incr_change[15]; + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc_obj - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; break; case BE_O_XSCALE: /* local scaling ... X-axis */ - incr_change[0] = scale; + s->s_edit->incr_change[0] = scale; /* accumulate the scale factor */ - acc_sc[0] *= scale; - s->edit_state.edit_absolute_scale = acc_sc[0] - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + s->edit_state.acc_sc[0] *= scale; + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc[0] - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; break; case BE_O_YSCALE: /* local scaling ... Y-axis */ - incr_change[5] = scale; + s->s_edit->incr_change[5] = scale; /* accumulate the scale factor */ - acc_sc[1] *= scale; - s->edit_state.edit_absolute_scale = acc_sc[1] - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + s->edit_state.acc_sc[1] *= scale; + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc[1] - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; break; case BE_O_ZSCALE: /* local scaling ... Z-axis */ - incr_change[10] = scale; + s->s_edit->incr_change[10] = scale; /* accumulate the scale factor */ - acc_sc[2] *= scale; - s->edit_state.edit_absolute_scale = acc_sc[2] - 1.0; - if (s->edit_state.edit_absolute_scale > 0.0) - s->edit_state.edit_absolute_scale /= 3.0; + s->edit_state.acc_sc[2] *= scale; + s->s_edit->edit_absolute_scale = s->edit_state.acc_sc[2] - 1.0; + if (s->s_edit->edit_absolute_scale > 0.0) + s->s_edit->edit_absolute_scale /= 3.0; break; } /* Have scaling take place with respect to keypoint, * NOT the view center. */ - VMOVE(temp, es_keypoint); - MAT4X3PNT(pos_model, modelchanges, temp); - wrt_point(modelchanges, incr_change, modelchanges, pos_model); + VMOVE(temp, s->s_edit->e_keypoint); + MAT4X3PNT(pos_model, s->s_edit->model_changes, temp); + wrt_point(s->s_edit->model_changes, s->s_edit->incr_change, s->s_edit->model_changes, pos_model); - MAT_IDN(incr_change); + MAT_IDN(s->s_edit->incr_change); new_edit_mats(s); } else if (movedir & (RARROW|UARROW)) { mat_t oldchanges; /* temporary matrix */ /* Vector from object keypoint to cursor */ - VMOVE(temp, es_keypoint); + VMOVE(temp, s->s_edit->e_keypoint); MAT4X3PNT(pos_view, view_state->vs_model2objview, temp); if (movedir & RARROW) @@ -5342,16 +879,16 @@ objedit_mouse(struct mged_state *s, const vect_t mousevec) pos_view[Y] = mousevec[Y]; MAT4X3PNT(pos_model, view_state->vs_gvp->gv_view2model, pos_view);/* NOT objview */ - MAT4X3PNT(tr_temp, modelchanges, temp); + MAT4X3PNT(tr_temp, s->s_edit->model_changes, temp); VSUB2(tr_temp, pos_model, tr_temp); - MAT_DELTAS_VEC(incr_change, tr_temp); - MAT_COPY(oldchanges, modelchanges); - bn_mat_mul(modelchanges, incr_change, oldchanges); + MAT_DELTAS_VEC(s->s_edit->incr_change, tr_temp); + MAT_COPY(oldchanges, s->s_edit->model_changes); + bn_mat_mul(s->s_edit->model_changes, s->s_edit->incr_change, oldchanges); - MAT_IDN(incr_change); + MAT_IDN(s->s_edit->incr_change); new_edit_mats(s); - update_edit_absolute_tran(s, pos_view); + rt_update_edit_absolute_tran(s->s_edit, pos_view); } else { Tcl_AppendResult(s->interp, "No object edit mode selected; mouse press ignored\n", (char *)NULL); return; @@ -5369,15 +906,15 @@ oedit_abs_scale(struct mged_state *s) MAT_IDN(incr_mat); - if (-SMALL_FASTF < s->edit_state.edit_absolute_scale && s->edit_state.edit_absolute_scale < SMALL_FASTF) + if (-SMALL_FASTF < s->s_edit->edit_absolute_scale && s->s_edit->edit_absolute_scale < SMALL_FASTF) scale = 1; - else if (s->edit_state.edit_absolute_scale > 0.0) - scale = 1.0 + s->edit_state.edit_absolute_scale * 3.0; + else if (s->s_edit->edit_absolute_scale > 0.0) + scale = 1.0 + s->s_edit->edit_absolute_scale * 3.0; else { - if ((s->edit_state.edit_absolute_scale - MGED_SMALL_SCALE) < -1.0) - s->edit_state.edit_absolute_scale = -1.0 + MGED_SMALL_SCALE; + if ((s->s_edit->edit_absolute_scale - MGED_SMALL_SCALE) < -1.0) + s->s_edit->edit_absolute_scale = -1.0 + MGED_SMALL_SCALE; - scale = 1.0 + s->edit_state.edit_absolute_scale; + scale = 1.0 + s->s_edit->edit_absolute_scale; } /* switch depending on scaling option selected */ @@ -5385,84 +922,88 @@ oedit_abs_scale(struct mged_state *s) case BE_O_SCALE: /* global scaling */ - incr_mat[15] = acc_sc_obj / scale; - acc_sc_obj = scale; + incr_mat[15] = s->edit_state.acc_sc_obj / scale; + s->edit_state.acc_sc_obj = scale; break; case BE_O_XSCALE: /* local scaling ... X-axis */ - incr_mat[0] = scale / acc_sc[0]; + incr_mat[0] = scale / s->edit_state.acc_sc[0]; /* accumulate the scale factor */ - acc_sc[0] = scale; + s->edit_state.acc_sc[0] = scale; break; case BE_O_YSCALE: /* local scaling ... Y-axis */ - incr_mat[5] = scale / acc_sc[1]; + incr_mat[5] = scale / s->edit_state.acc_sc[1]; /* accumulate the scale factor */ - acc_sc[1] = scale; + s->edit_state.acc_sc[1] = scale; break; case BE_O_ZSCALE: /* local scaling ... Z-axis */ - incr_mat[10] = scale / acc_sc[2]; + incr_mat[10] = scale / s->edit_state.acc_sc[2]; /* accumulate the scale factor */ - acc_sc[2] = scale; + s->edit_state.acc_sc[2] = scale; break; } /* Have scaling take place with respect to keypoint, * NOT the view center. */ - VMOVE(temp, es_keypoint); - MAT4X3PNT(pos_model, modelchanges, temp); - wrt_point(modelchanges, incr_mat, modelchanges, pos_model); + VMOVE(temp, s->s_edit->e_keypoint); + MAT4X3PNT(pos_model, s->s_edit->model_changes, temp); + wrt_point(s->s_edit->model_changes, incr_mat, s->s_edit->model_changes, pos_model); new_edit_mats(s); } void -vls_solid(struct mged_state *s, struct bu_vls *vp, struct rt_db_internal *ip, const mat_t mat) +vls_solid(struct mged_state *ms, struct bu_vls *vp, struct rt_solid_edit *s, const mat_t mat) { + struct rt_db_internal *ip = &ms->s_edit->es_int; struct rt_db_internal intern; int id; RT_DB_INTERNAL_INIT(&intern); - if (s->dbip == DBI_NULL) + if (ms->dbip == DBI_NULL) return; BU_CK_VLS(vp); RT_CK_DB_INTERNAL(ip); id = ip->idb_type; - transform_editing_solid(s, &intern, mat, (struct rt_db_internal *)ip, 0); + transform_editing_solid(ms, &intern, mat, (struct rt_db_internal *)ip, 0); if (id != ID_ARS && id != ID_POLY && id != ID_BOT) { - if (OBJ[id].ft_describe(vp, &intern, 1 /*verbose*/, s->dbip->dbi_base2local) < 0) - Tcl_AppendResult(s->interp, "vls_solid: describe error\n", (char *)NULL); + if (OBJ[id].ft_describe(vp, &intern, 1 /*verbose*/, ms->dbip->dbi_base2local) < 0) + Tcl_AppendResult(ms->interp, "vls_solid: describe error\n", (char *)NULL); } else { - if (OBJ[id].ft_describe(vp, &intern, 0 /* not verbose */, s->dbip->dbi_base2local) < 0) - Tcl_AppendResult(s->interp, "vls_solid: describe error\n", (char *)NULL); + if (OBJ[id].ft_describe(vp, &intern, 0 /* not verbose */, ms->dbip->dbi_base2local) < 0) + Tcl_AppendResult(ms->interp, "vls_solid: describe error\n", (char *)NULL); } - if (id == ID_PIPE && es_pipe_pnt) { - struct rt_pipe_internal *pipeip; - struct wdb_pipe_pnt *ps=(struct wdb_pipe_pnt *)NULL; - int seg_no = 0; + if (id == ID_PIPE) { + struct rt_pipe_edit *p = (struct rt_pipe_edit *)s->ipe_ptr; + if (p->es_pipe_pnt) { + struct rt_pipe_internal *pipeip; + struct wdb_pipe_pnt *ps=(struct wdb_pipe_pnt *)NULL; + int seg_no = 0; - pipeip = (struct rt_pipe_internal *)ip->idb_ptr; - RT_PIPE_CK_MAGIC(pipeip); + pipeip = (struct rt_pipe_internal *)ip->idb_ptr; + RT_PIPE_CK_MAGIC(pipeip); - for (BU_LIST_FOR(ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) { - seg_no++; - if (ps == es_pipe_pnt) - break; - } + for (BU_LIST_FOR(ps, wdb_pipe_pnt, &pipeip->pipe_segs_head)) { + seg_no++; + if (ps == p->es_pipe_pnt) + break; + } - if (ps == es_pipe_pnt) - rt_vls_pipe_pnt(vp, seg_no, &intern, s->dbip->dbi_base2local); + if (ps == p->es_pipe_pnt) + rt_vls_pipe_pnt(vp, seg_no, &intern, ms->dbip->dbi_base2local); + } } rt_db_free_internal(&intern); @@ -5472,13 +1013,12 @@ vls_solid(struct mged_state *s, struct bu_vls *vp, struct rt_db_internal *ip, co static void init_oedit_guts(struct mged_state *s) { - int id; const char *strp=""; /* for safety sake */ - es_menu = 0; - es_edflag = -1; - MAT_IDN(es_mat); + s->s_edit->edit_menu = 0; + rt_solid_edit_set_edflag(s->s_edit, -1); + MAT_IDN(s->s_edit->e_mat); if (s->dbip == DBI_NULL || !illump) { return; @@ -5491,16 +1031,16 @@ init_oedit_guts(struct mged_state *s) /* Have a processed (E'd) region - NO key solid. * Use the 'center' as the key */ - VMOVE(es_keypoint, illump->s_center); + VMOVE(s->s_edit->e_keypoint, illump->s_center); - /* The s_center takes the es_mat into account already */ + /* The s_center takes the s->s_edit->e_mat into account already */ } /* Not an evaluated region - just a regular path ending in a solid */ if (!illump->s_u_data) return; struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; - if (rt_db_get_internal(&s->edit_state.es_int, LAST_SOLID(bdata), + if (rt_db_get_internal(&s->s_edit->es_int, LAST_SOLID(bdata), s->dbip, NULL, &rt_uniresource) < 0) { if (bdata->s_fullpath.fp_len > 0) { Tcl_AppendResult(s->interp, "init_oedit(", @@ -5509,29 +1049,19 @@ init_oedit_guts(struct mged_state *s) } else { Tcl_AppendResult(s->interp, "sedit_reset(NULL): solid import failure\n", (char *)NULL); } - rt_db_free_internal(&s->edit_state.es_int); + rt_db_free_internal(&s->s_edit->es_int); button(s, BE_REJECT); return; /* FAIL */ } - RT_CK_DB_INTERNAL(&s->edit_state.es_int); - id = s->edit_state.es_int.idb_type; - - if (id == ID_ARB8) { - struct rt_arb_internal *arb; - - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - RT_ARB_CK_MAGIC(arb); - - es_type = rt_arb_std_type(&s->edit_state.es_int, &s->tol.tol); - } + RT_CK_DB_INTERNAL(&s->s_edit->es_int); /* Save aggregate path matrix */ - (void)db_path_to_mat(s->dbip, &bdata->s_fullpath, es_mat, bdata->s_fullpath.fp_len-1, &rt_uniresource); + (void)db_path_to_mat(s->dbip, &bdata->s_fullpath, s->s_edit->e_mat, bdata->s_fullpath.fp_len-1, &rt_uniresource); /* get the inverse matrix */ - bn_mat_inv(es_invmat, es_mat); + bn_mat_inv(s->s_edit->e_invmat, s->s_edit->e_mat); - get_solid_keypoint(s, &es_keypoint, &strp, &s->edit_state.es_int, es_mat); + rt_get_solid_keypoint(s->s_edit, &s->s_edit->e_keypoint, &strp, s->s_edit->e_mat); init_oedit_vars(s); } @@ -5539,7 +1069,8 @@ init_oedit_guts(struct mged_state *s) static void init_oedit_vars(struct mged_state *s) { - set_e_axes_pos(s, 1); + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); VSETALL(s->edit_state.edit_absolute_model_rotate, 0.0); VSETALL(s->edit_state.edit_absolute_object_rotate, 0.0); @@ -5547,14 +1078,14 @@ init_oedit_vars(struct mged_state *s) VSETALL(s->edit_state.last_edit_absolute_model_rotate, 0.0); VSETALL(s->edit_state.last_edit_absolute_object_rotate, 0.0); VSETALL(s->edit_state.last_edit_absolute_view_rotate, 0.0); - VSETALL(s->edit_state.edit_absolute_model_tran, 0.0); - VSETALL(s->edit_state.edit_absolute_view_tran, 0.0); - VSETALL(s->edit_state.last_edit_absolute_model_tran, 0.0); - VSETALL(s->edit_state.last_edit_absolute_view_tran, 0.0); - s->edit_state.edit_absolute_scale = 0.0; - acc_sc_sol = 1.0; - acc_sc_obj = 1.0; - VSETALL(acc_sc, 1.0); + VSETALL(s->s_edit->edit_absolute_model_tran, 0.0); + VSETALL(s->s_edit->edit_absolute_view_tran, 0.0); + VSETALL(s->s_edit->last_edit_absolute_model_tran, 0.0); + VSETALL(s->s_edit->last_edit_absolute_view_tran, 0.0); + s->s_edit->edit_absolute_scale = 0.0; + s->s_edit->acc_sc_sol = 1.0; + s->edit_state.acc_sc_obj = 1.0; + VSETALL(s->edit_state.acc_sc, 1.0); VSETALL(s->edit_state.edit_rate_model_rotate, 0.0); VSETALL(s->edit_state.edit_rate_object_rotate, 0.0); @@ -5562,8 +1093,8 @@ init_oedit_vars(struct mged_state *s) VSETALL(s->edit_state.edit_rate_model_tran, 0.0); VSETALL(s->edit_state.edit_rate_view_tran, 0.0); - MAT_IDN(modelchanges); - MAT_IDN(acc_rot_sol); + MAT_IDN(s->s_edit->model_changes); + MAT_IDN(s->s_edit->acc_rot_sol); } @@ -5575,7 +1106,7 @@ init_oedit(struct mged_state *s) /* do real initialization work */ init_oedit_guts(s); - es_edclass = EDIT_CLASS_NULL; + s->edit_state.e_edclass = EDIT_CLASS_NULL; /* begin edit callback */ bu_vls_strcpy(&vls, "begin_edit_callback {}"); @@ -5597,7 +1128,7 @@ oedit_apply(struct mged_state *s, int continue_editing) */ mat_t topm; /* accum matrix from pathpos 0 to i-2 */ mat_t inv_topm; /* inverse */ - mat_t deltam; /* final "changes": deltam = (inv_topm)(modelchanges)(topm) */ + mat_t deltam; /* final "changes": deltam = (inv_topm)(s->s_edit->model_changes)(topm) */ mat_t tempm; if (!illump || !illump->s_u_data) @@ -5607,12 +1138,12 @@ oedit_apply(struct mged_state *s, int continue_editing) switch (ipathpos) { case 0: moveHobj(s, DB_FULL_PATH_GET(&bdata->s_fullpath, ipathpos), - modelchanges); + s->s_edit->model_changes); break; case 1: moveHinstance(s, DB_FULL_PATH_GET(&bdata->s_fullpath, ipathpos-1), DB_FULL_PATH_GET(&bdata->s_fullpath, ipathpos), - modelchanges); + s->s_edit->model_changes); break; default: MAT_IDN(topm); @@ -5624,7 +1155,7 @@ oedit_apply(struct mged_state *s, int continue_editing) bn_mat_inv(inv_topm, topm); - bn_mat_mul(tempm, modelchanges, topm); + bn_mat_mul(tempm, s->s_edit->model_changes, topm); bn_mat_mul(deltam, inv_topm, tempm); moveHinstance(s, DB_FULL_PATH_GET(&bdata->s_fullpath, ipathpos-1), @@ -5639,7 +1170,7 @@ oedit_apply(struct mged_state *s, int continue_editing) * include the solids about to be replaced, * so we can safely fiddle the displaylist. */ - modelchanges[15] = 1000000000; /* => small ratio */ + s->s_edit->model_changes[15] = 1000000000; /* => small ratio */ /* Now, recompute new chunks of displaylist */ gdlp = BU_LIST_NEXT(display_list, s->gedp->ged_gdp->gd_headDisplay); @@ -5702,70 +1233,48 @@ oedit_accept(struct mged_state *s) void oedit_reject(struct mged_state *s) { - rt_db_free_internal(&s->edit_state.es_int); + rt_db_free_internal(&s->s_edit->es_int); + Tcl_UnlinkVar(s->interp, "edit_solid_flag"); + rt_solid_edit_destroy(s->s_edit); + s->s_edit = NULL; + mmenu_set(s, MENU_L1, NULL); + mmenu_set(s, MENU_L2, NULL); } /* * Gets the A, B, C of a planar equation from the command line and puts the * result into the array es_peqn[] at the position pointed to by the variable - * 'es_menu' which is the plane being redefined. This function is only callable + * 'edit_menu' which is the plane being redefined. This function is only callable * when in solid edit and rotating the face of a GENARB8. */ int -f_eqn(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) +f_eqn(ClientData clientData, Tcl_Interp *UNUSED(interp), int argc, const char *argv[]) { struct cmdtab *ctp = (struct cmdtab *)clientData; MGED_CK_CMD(ctp); struct mged_state *s = ctp->s; - short int i; - vect_t tempvec; - struct rt_arb_internal *arb; - - CHECK_DBI_NULL; - CHECK_READ_ONLY; - if (argc < 4 || 4 < argc) { struct bu_vls vls = BU_VLS_INIT_ZERO; bu_vls_printf(&vls, "help eqn"); - Tcl_Eval(interp, bu_vls_addr(&vls)); + Tcl_Eval(s->interp, bu_vls_addr(&vls)); bu_vls_free(&vls); return TCL_ERROR; } - if (GEOM_EDIT_STATE != ST_S_EDIT) { - Tcl_AppendResult(interp, "Eqn: must be in solid edit\n", (char *)NULL); - return TCL_ERROR; - } - - if (s->edit_state.es_int.idb_type != ID_ARB8) { - Tcl_AppendResult(interp, "Eqn: type must be GENARB8\n", (char *)NULL); - return TCL_ERROR; - } - - if (es_edflag != ECMD_ARB_ROTATE_FACE) { - Tcl_AppendResult(interp, "Eqn: must be rotating a face\n", (char *)NULL); + if (s->edit_state.global_editing_state != ST_S_EDIT) { + Tcl_AppendResult(s->interp, "Eqn: must be in solid edit\n", (char *)NULL); return TCL_ERROR; } - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - RT_ARB_CK_MAGIC(arb); - - /* get the A, B, C from the command line */ - for (i=0; i<3; i++) - es_peqn[es_menu][i]= atof(argv[i+1]); - VUNITIZE(&es_peqn[es_menu][0]); - - VMOVE(tempvec, arb->pt[fixv]); - es_peqn[es_menu][W]=VDOT(es_peqn[es_menu], tempvec); - - if (rt_arb_calc_points(arb, es_type, (const plane_t *)es_peqn, &s->tol.tol)) + int ret = rt_arb_f_eqn(s->s_edit, argc, argv); + if (ret != BRLCAD_OK) return CMD_BAD; /* draw the new version of the solid */ - replot_editing_solid(s); + replot_editing_solid(0, NULL, s, NULL); /* update display information */ view_state->vs_flag = 1; @@ -5785,39 +1294,44 @@ sedit_apply(struct mged_state *s, int accept_flag) { struct directory *dp; - es_eu = (struct edgeuse *)NULL; /* Reset es_eu */ - es_pipe_pnt = (struct wdb_pipe_pnt *)NULL; /* Reset es_pipe_pnt */ - es_metaball_pnt = (struct wdb_metaball_pnt *)NULL; /* Reset es_metaball_pnt */ - bot_verts[0] = -1; - bot_verts[1] = -1; - bot_verts[2] = -1; + /* reset internal variables */ + if (EDOBJ[s->s_edit->es_int.idb_type].ft_prim_edit_reset) + (*EDOBJ[s->s_edit->es_int.idb_type].ft_prim_edit_reset)(s->s_edit); /* make sure we are in solid edit mode */ if (!illump) { + Tcl_UnlinkVar(s->interp, "edit_solid_flag"); + rt_solid_edit_destroy(s->s_edit); + s->s_edit = NULL; + mmenu_set(s, MENU_L1, NULL); + mmenu_set(s, MENU_L2, NULL); return TCL_OK; } - if (lu_copy) { - struct model *m; - - m = nmg_find_model(&lu_copy->l.magic); - nmg_km(m); - lu_copy = (struct loopuse *)NULL; - } - /* write editing changes out to disc */ - if (!illump->s_u_data) + if (!illump->s_u_data) { + Tcl_UnlinkVar(s->interp, "edit_solid_flag"); + rt_solid_edit_destroy(s->s_edit); + s->s_edit = NULL; + mmenu_set(s, MENU_L1, NULL); + mmenu_set(s, MENU_L2, NULL); return TCL_ERROR; + } struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; dp = LAST_SOLID(bdata); if (!dp) { /* sanity check, unexpected error */ + Tcl_UnlinkVar(s->interp, "edit_solid_flag"); + rt_solid_edit_destroy(s->s_edit); + s->s_edit = NULL; + mmenu_set(s, MENU_L1, NULL); + mmenu_set(s, MENU_L2, NULL); return TCL_ERROR; } /* make sure that any BOT solid is minimally legal */ - if (s->edit_state.es_int.idb_type == ID_BOT) { - struct rt_bot_internal *bot = (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; + if (s->s_edit->es_int.idb_type == ID_BOT) { + struct rt_bot_internal *bot = (struct rt_bot_internal *)s->s_edit->es_int.idb_ptr; RT_BOT_CK_MAGIC(bot); if (bot->mode == RT_BOT_SURFACE || bot->mode == RT_BOT_SOLID) { @@ -5841,36 +1355,50 @@ sedit_apply(struct mged_state *s, int accept_flag) } /* Scale change on export is 1.0 -- no change */ - if (rt_db_put_internal(dp, s->dbip, &s->edit_state.es_int, &rt_uniresource) < 0) { + if (rt_db_put_internal(dp, s->dbip, &s->s_edit->es_int, &rt_uniresource) < 0) { Tcl_AppendResult(s->interp, "sedit_apply(", dp->d_namep, "): solid export failure\n", (char *)NULL); if (accept_flag) { - rt_db_free_internal(&s->edit_state.es_int); + rt_db_free_internal(&s->s_edit->es_int); } + Tcl_UnlinkVar(s->interp, "edit_solid_flag"); + rt_solid_edit_destroy(s->s_edit); + s->s_edit = NULL; + mmenu_set(s, MENU_L1, NULL); + mmenu_set(s, MENU_L2, NULL); return TCL_ERROR; /* FAIL */ } if (accept_flag) { menu_state->ms_flag = 0; movedir = 0; - es_edflag = -1; - es_edclass = EDIT_CLASS_NULL; + rt_solid_edit_set_edflag(s->s_edit, -1); + s->edit_state.e_edclass = EDIT_CLASS_NULL; - rt_db_free_internal(&s->edit_state.es_int); + rt_db_free_internal(&s->s_edit->es_int); } else { - /* XXX hack to restore s->edit_state.es_int after rt_db_put_internal blows it away */ - /* Read solid description into s->edit_state.es_int again! Gaak! */ - if (rt_db_get_internal(&s->edit_state.es_int, LAST_SOLID(bdata), + /* XXX hack to restore s->s_edit->es_int after rt_db_put_internal blows it away */ + /* Read solid description into s->s_edit->es_int again! Gaak! */ + if (rt_db_get_internal(&s->s_edit->es_int, LAST_SOLID(bdata), s->dbip, NULL, &rt_uniresource) < 0) { Tcl_AppendResult(s->interp, "sedit_apply(", LAST_SOLID(bdata)->d_namep, "): solid reimport failure\n", (char *)NULL); - rt_db_free_internal(&s->edit_state.es_int); + rt_db_free_internal(&s->s_edit->es_int); + Tcl_UnlinkVar(s->interp, "edit_solid_flag"); + rt_solid_edit_destroy(s->s_edit); + s->s_edit = NULL; + mmenu_set(s, MENU_L1, NULL); + mmenu_set(s, MENU_L2, NULL); return TCL_ERROR; } } - + Tcl_UnlinkVar(s->interp, "edit_solid_flag"); + rt_solid_edit_destroy(s->s_edit); + s->s_edit = NULL; + mmenu_set(s, MENU_L1, NULL); + mmenu_set(s, MENU_L2, NULL); return TCL_OK; } @@ -5891,8 +1419,12 @@ sedit_accept(struct mged_state *s) return; } - if (sedraw > 0) - sedit(s); + if (sedraw > 0) { + s->s_edit->update_views = s->update_views; + sedraw = 0; + rt_solid_edit_process(s->s_edit); + s->update_views = s->s_edit->update_views; + } (void)sedit_apply(s, 1); } @@ -5905,23 +1437,11 @@ sedit_reject(struct mged_state *s) return; } - if (sedraw > 0) - sedit(s); - - es_eu = (struct edgeuse *)NULL; /* Reset es_eu */ - es_pipe_pnt = (struct wdb_pipe_pnt *)NULL; /* Reset es_pipe_pnt */ - es_metaball_pnt = (struct wdb_metaball_pnt *)NULL; /* Reset es_metaball_pnt */ - bot_verts[0] = -1; - bot_verts[1] = -1; - bot_verts[2] = -1; - es_ars_crv = (-1); - es_ars_col = (-1); - - if (lu_copy) { - struct model *m; - m = nmg_find_model(&lu_copy->l.magic); - nmg_km(m); - lu_copy = (struct loopuse *)NULL; + if (sedraw > 0) { + s->s_edit->update_views = s->update_views; + sedraw = 0; + rt_solid_edit_process(s->s_edit); + s->update_views = s->s_edit->update_views; } /* Restore the original solid everywhere */ @@ -5929,8 +1449,14 @@ sedit_reject(struct mged_state *s) struct display_list *gdlp; struct display_list *next_gdlp; struct bv_scene_obj *sp; - if (!illump->s_u_data) + if (!illump->s_u_data) { + Tcl_UnlinkVar(s->interp, "edit_solid_flag"); + rt_solid_edit_destroy(s->s_edit); + s->s_edit = NULL; + mmenu_set(s, MENU_L1, NULL); + mmenu_set(s, MENU_L2, NULL); return; + } struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; gdlp = BU_LIST_NEXT(display_list, s->gedp->ged_gdp->gd_headDisplay); @@ -5951,13 +1477,17 @@ sedit_reject(struct mged_state *s) menu_state->ms_flag = 0; movedir = 0; - es_edflag = -1; - es_edclass = EDIT_CLASS_NULL; - - rt_db_free_internal(&s->edit_state.es_int); + rt_solid_edit_set_edflag(s->s_edit, -1); + s->edit_state.e_edclass = EDIT_CLASS_NULL; + + rt_db_free_internal(&s->s_edit->es_int); + Tcl_UnlinkVar(s->interp, "edit_solid_flag"); + rt_solid_edit_destroy(s->s_edit); + s->s_edit = NULL; + mmenu_set(s, MENU_L1, NULL); + mmenu_set(s, MENU_L2, NULL); } - int mged_param(struct mged_state *s, Tcl_Interp *interp, int argc, fastf_t *argvect) { @@ -5965,461 +1495,113 @@ mged_param(struct mged_state *s, Tcl_Interp *interp, int argc, fastf_t *argvect) CHECK_DBI_NULL; - if (es_edflag <= 0) { - Tcl_AppendResult(interp, - "A solid editor option not selected\n", - (char *)NULL); - return TCL_ERROR; - } - - inpara = 0; - for (i = 0; i < argc; i++) { - es_para[ inpara++ ] = argvect[i]; - } - - if (PARAM_1ARG) { - if (inpara != 1) { - Tcl_AppendResult(interp, "ERROR: only one argument needed\n", (char *)NULL); - inpara = 0; - return TCL_ERROR; - } - - if (es_menu == MENU_PIPE_PT_OD || es_menu == MENU_PIPE_PT_ID || es_menu == MENU_PIPE_SCALE_ID - || es_menu == MENU_METABALL_SET_THRESHOLD || es_menu == MENU_METABALL_SET_METHOD - || es_menu == MENU_METABALL_PT_SET_GOO) - { - if (es_para[0] < 0.0) { - Tcl_AppendResult(interp, "ERROR: SCALE FACTOR < 0\n", (char *)NULL); - inpara = 0; - return TCL_ERROR; - } - } else { - if (es_para[0] <= 0.0) { - Tcl_AppendResult(interp, "ERROR: SCALE FACTOR <= 0\n", (char *)NULL); - inpara = 0; - return TCL_ERROR; - } - } - } else if (PARAM_2ARG) { - if (inpara != 2) { - Tcl_AppendResult(interp, "ERROR: two arguments needed\n", (char *)NULL); - inpara = 0; - return TCL_ERROR; - } - - if (es_para[0] <= 0.0) { - Tcl_AppendResult(interp, "ERROR: X SIZE <= 0\n", (char *)NULL); - inpara = 0; - return TCL_ERROR; - } else if (es_para[1] <= 0.0) { - Tcl_AppendResult(interp, "ERROR: Y SIZE <= 0\n", (char *)NULL); - inpara = 0; - return TCL_ERROR; - } - } else { - if (inpara != 3) { - Tcl_AppendResult(interp, "ERROR: three arguments needed\n", (char *)NULL); - inpara = 0; - return TCL_ERROR; - } - } - - /* check if need to convert input values to the base unit */ - switch (es_edflag) { - - case STRANS: - case ECMD_VTRANS: - case PSCALE: - case EARB: - case ECMD_ARB_MOVE_FACE: - case ECMD_TGC_MV_H: - case ECMD_TGC_MV_HH: - case PTARB: - case ECMD_NMG_ESPLIT: - case ECMD_NMG_EMOVE: - case ECMD_NMG_LEXTRU: - case ECMD_PIPE_PICK: - case ECMD_PIPE_SPLIT: - case ECMD_PIPE_PT_MOVE: - case ECMD_PIPE_PT_ADD: - case ECMD_PIPE_PT_INS: - case ECMD_ARS_PICK: - case ECMD_ARS_MOVE_PT: - case ECMD_ARS_MOVE_CRV: - case ECMD_ARS_MOVE_COL: - case ECMD_VOL_CSIZE: - case ECMD_DSP_SCALE_X: - case ECMD_DSP_SCALE_Y: - case ECMD_DSP_SCALE_ALT: - case ECMD_EBM_HEIGHT: - case ECMD_EXTR_SCALE_H: - case ECMD_CLINE_SCALE_H: - case ECMD_CLINE_SCALE_T: - case ECMD_CLINE_SCALE_R: - case ECMD_CLINE_MOVE_H: - case ECMD_EXTR_MOV_H: - case ECMD_BOT_THICK: - case ECMD_BOT_MOVET: - case ECMD_BOT_MOVEE: - case ECMD_BOT_MOVEV: - case ECMD_METABALL_PT_PICK: - case ECMD_METABALL_PT_MOV: - case ECMD_METABALL_PT_ADD: - /* must convert to base units */ - es_para[0] *= s->dbip->dbi_local2base; - es_para[1] *= s->dbip->dbi_local2base; - es_para[2] *= s->dbip->dbi_local2base; - /* fall through */ - default: - break; - } - - sedit(s); - - if (SEDIT_TRAN) { - vect_t diff; - fastf_t inv_Viewscale = 1/view_state->vs_gvp->gv_scale; - - VSUB2(diff, es_para, e_axes_pos); - VSCALE(s->edit_state.edit_absolute_model_tran, diff, inv_Viewscale); - VMOVE(s->edit_state.last_edit_absolute_model_tran, s->edit_state.edit_absolute_model_tran); - } else if (SEDIT_ROTATE) { - VMOVE(s->edit_state.edit_absolute_model_rotate, es_para); - } else if (SEDIT_SCALE) { - s->edit_state.edit_absolute_scale = acc_sc_sol - 1.0; - if (s->edit_state.edit_absolute_scale > 0) - s->edit_state.edit_absolute_scale /= 3.0; - } - return TCL_OK; -} - - -/* Input parameter editing changes from keyboard */ -/* Format: p dx [dy dz] */ -int -f_param(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) -{ - struct cmdtab *ctp = (struct cmdtab *)clientData; - MGED_CK_CMD(ctp); - struct mged_state *s = ctp->s; - - int i; - vect_t argvect; - - CHECK_DBI_NULL; - CHECK_READ_ONLY; - - if (argc < 2 || 4 < argc) { - struct bu_vls vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&vls, "help p"); - Tcl_Eval(interp, bu_vls_addr(&vls)); - bu_vls_free(&vls); - return TCL_ERROR; - } - - for (i = 1; i < argc && i <= 3; i++) { - argvect[i-1] = atof(argv[i]); - } - - return mged_param(s, interp, argc-1, argvect); -} - - -/* - * Put labels on the vertices of the currently edited solid. - * XXX This really should use import/export interface! Or be part of it. - */ -void -label_edited_solid( - struct mged_state *s, - int *num_lines, // NOTE - used only for BOTs - point_t *lines, // NOTE - used only for BOTs - struct rt_point_labels pl[], - int max_pl, - const mat_t xform, - struct rt_db_internal *ip) -{ - point_t work; - point_t pos_view; - int npl = 0; - - RT_CK_DB_INTERNAL(ip); - - switch (ip->idb_type) { - -#define POINT_LABEL(_pt, _char) { \ - VMOVE(pl[npl].pt, _pt); \ - pl[npl].str[0] = _char; \ - pl[npl++].str[1] = '\0'; } - -#define POINT_LABEL_STR(_pt, _str) { \ - VMOVE(pl[npl].pt, _pt); \ - bu_strlcpy(pl[npl++].str, _str, sizeof(pl[0].str)); } - - case ID_ARS: - { - struct rt_ars_internal *ars= - (struct rt_ars_internal *)s->edit_state.es_int.idb_ptr; - - RT_ARS_CK_MAGIC(ars); - npl = OBJ[ip->idb_type].ft_labels(pl, max_pl, xform, &s->edit_state.es_int, &s->tol.tol); - - // Conditional additional labeling - if (es_ars_crv >= 0 && es_ars_col >= 0) { - point_t ars_pt; - - VMOVE(work, &ars->curves[es_ars_crv][es_ars_col*3]); - MAT4X3PNT(ars_pt, xform, work); - POINT_LABEL_STR(ars_pt, "pt"); - } - } - break; - - case ID_BSPLINE: - { - struct rt_nurb_internal *sip = - (struct rt_nurb_internal *) s->edit_state.es_int.idb_ptr; - RT_NURB_CK_MAGIC(sip); - - // Conditional labeling - struct face_g_snurb *surf; - fastf_t *fp; - surf = sip->srfs[spl_surfno]; - NMG_CK_SNURB(surf); - fp = &RT_NURB_GET_CONTROL_POINT(surf, spl_ui, spl_vi); - MAT4X3PNT(pos_view, xform, fp); - POINT_LABEL(pos_view, 'V'); - - fp = &RT_NURB_GET_CONTROL_POINT(surf, 0, 0); - MAT4X3PNT(pos_view, xform, fp); - POINT_LABEL_STR(pos_view, " 0,0"); - fp = &RT_NURB_GET_CONTROL_POINT(surf, 0, surf->s_size[1]-1); - MAT4X3PNT(pos_view, xform, fp); - POINT_LABEL_STR(pos_view, " 0,u"); - fp = &RT_NURB_GET_CONTROL_POINT(surf, surf->s_size[0]-1, 0); - MAT4X3PNT(pos_view, xform, fp); - POINT_LABEL_STR(pos_view, " v,0"); - fp = &RT_NURB_GET_CONTROL_POINT(surf, surf->s_size[0]-1, surf->s_size[1]-1); - MAT4X3PNT(pos_view, xform, fp); - POINT_LABEL_STR(pos_view, " u,v"); - - } - break; - case ID_NMG: - /* New way only */ - { -#ifndef NO_MAGIC_CHECKING - struct model *m = - (struct model *) s->edit_state.es_int.idb_ptr; - NMG_CK_MODEL(m); -#endif - - // Conditional labeling - if (es_eu) { - point_t cent; - NMG_CK_EDGEUSE(es_eu); - VADD2SCALE(cent, - es_eu->vu_p->v_p->vg_p->coord, - es_eu->eumate_p->vu_p->v_p->vg_p->coord, - 0.5); - MAT4X3PNT(pos_view, xform, cent); - POINT_LABEL_STR(pos_view, " eu"); - } - } - break; - case ID_PIPE: - { -#ifndef NO_MAGIC_CHECKING - struct rt_pipe_internal *pipeip = - (struct rt_pipe_internal *)s->edit_state.es_int.idb_ptr; - - RT_PIPE_CK_MAGIC(pipeip); -#endif - - // Conditional labeling - if (es_pipe_pnt) { - BU_CKMAG(es_pipe_pnt, WDB_PIPESEG_MAGIC, "wdb_pipe_pnt"); - - MAT4X3PNT(pos_view, xform, es_pipe_pnt->pp_coord); - POINT_LABEL_STR(pos_view, "pt"); - } - } - break; - case ID_BOT: - { - struct rt_bot_internal *bot = - (struct rt_bot_internal *)s->edit_state.es_int.idb_ptr; - - RT_BOT_CK_MAGIC(bot); - - // Conditional labeling - if (bot_verts[2] > -1 && - bot_verts[1] > -1 && - bot_verts[0] > -1) - { - /* editing a face */ - point_t mid_pt; - point_t p1, p2, p3; - fastf_t one_third = 1.0/3.0; - - MAT4X3PNT(p1, xform, &bot->vertices[bot_verts[0]*3]); - MAT4X3PNT(p2, xform, &bot->vertices[bot_verts[1]*3]); - MAT4X3PNT(p3, xform, &bot->vertices[bot_verts[2]*3]); - VADD3(mid_pt, p1, p2, p3); - - VSCALE(mid_pt, mid_pt, one_third); - - *num_lines = 3; - VMOVE(lines[0], mid_pt); - VMOVE(lines[1], p1); - VMOVE(lines[2], mid_pt); - VMOVE(lines[3], p2); - VMOVE(lines[4], mid_pt); - VMOVE(lines[5], p3); - } else if (bot_verts[1] > -1 && bot_verts[0] > -1) { - /* editing an edge */ - point_t mid_pt; - - VBLEND2(mid_pt, 0.5, &bot->vertices[bot_verts[0]*3], - 0.5, &bot->vertices[bot_verts[1]*3]); - - MAT4X3PNT(pos_view, xform, mid_pt); - POINT_LABEL_STR(pos_view, "edge"); - } - if (bot_verts[0] > -1) { - /* editing something, always label the vertex (this is the keypoint) */ - MAT4X3PNT(pos_view, xform, &bot->vertices[bot_verts[0]*3]); - POINT_LABEL_STR(pos_view, "pt"); - } - } - break; - case ID_METABALL: - { -#ifndef NO_MAGIC_CHECKING - struct rt_metaball_internal *metaball = - (struct rt_metaball_internal *)s->edit_state.es_int.idb_ptr; - - RT_METABALL_CK_MAGIC(metaball); -#endif - - if (es_metaball_pnt) { - BU_CKMAG(es_metaball_pnt, WDB_METABALLPT_MAGIC, "wdb_metaball_pnt"); + if (s->s_edit->edit_flag <= 0) { + Tcl_AppendResult(interp, + "A solid editor option not selected\n", + (char *)NULL); + return TCL_ERROR; + } - MAT4X3PNT(pos_view, xform, es_metaball_pnt->coord); - POINT_LABEL_STR(pos_view, "pt"); - } - } + s->s_edit->e_inpara = 0; + for (i = 0; i < argc; i++) { + s->s_edit->e_para[ s->s_edit->e_inpara++ ] = argvect[i]; + } - break; + s->s_edit->update_views = s->update_views; + sedraw = 0; + rt_solid_edit_process(s->s_edit); + s->update_views = s->s_edit->update_views; - default: - if (OBJ[ip->idb_type].ft_labels) - npl = OBJ[ip->idb_type].ft_labels(pl, max_pl, xform, &s->edit_state.es_int, &s->tol.tol); - break; + if (SEDIT_TRAN) { + vect_t diff; + fastf_t inv_Viewscale = 1/view_state->vs_gvp->gv_scale; + VSUB2(diff, s->s_edit->e_para, s->s_edit->e_axes_pos); + VSCALE(s->s_edit->edit_absolute_model_tran, diff, inv_Viewscale); + VMOVE(s->s_edit->last_edit_absolute_model_tran, s->s_edit->edit_absolute_model_tran); + } else if (SEDIT_ROTATE) { + VMOVE(s->edit_state.edit_absolute_model_rotate, s->s_edit->e_para); + } else if (SEDIT_SCALE) { + s->s_edit->edit_absolute_scale = s->s_edit->acc_sc_sol - 1.0; + if (s->s_edit->edit_absolute_scale > 0) + s->s_edit->edit_absolute_scale /= 3.0; } - - pl[npl].str[0] = '\0'; /* Mark ending */ + return TCL_OK; } -/* -------------------------------- */ -void -sedit_vpick(struct mged_state *s, point_t v_pos) +/* Input parameter editing changes from keyboard */ +/* Format: p dx [dy dz] */ +int +f_param(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { - point_t m_pos; - int surfno, u, v; - - MAT4X3PNT(m_pos, view_state->vs_objview2model, v_pos); - - if (nurb_closest2d(&surfno, &u, &v, - (struct rt_nurb_internal *)s->edit_state.es_int.idb_ptr, - m_pos, view_state->vs_model2objview) >= 0) { - spl_surfno = surfno; - spl_ui = u; - spl_vi = v; - get_solid_keypoint(s, &es_keypoint, &es_keytag, &s->edit_state.es_int, es_mat); + struct cmdtab *ctp = (struct cmdtab *)clientData; + MGED_CK_CMD(ctp); + struct mged_state *s = ctp->s; + + int i; + vect_t argvect; + + CHECK_DBI_NULL; + CHECK_READ_ONLY; + + if (argc < 2 || 4 < argc) { + struct bu_vls vls = BU_VLS_INIT_ZERO; + + bu_vls_printf(&vls, "help p"); + Tcl_Eval(interp, bu_vls_addr(&vls)); + bu_vls_free(&vls); + return TCL_ERROR; } - chg_state(s, ST_S_VPICK, ST_S_EDIT, "Vertex Pick Complete"); - view_state->vs_flag = 1; -} + for (i = 1; i < argc && i <= 3; i++) { + argvect[i-1] = atof(argv[i]); + } -#define DIST2D(P0, P1) sqrt(((P1)[X] - (P0)[X])*((P1)[X] - (P0)[X]) + \ - ((P1)[Y] - (P0)[Y])*((P1)[Y] - (P0)[Y])) + return mged_param(s, interp, argc-1, argvect); +} -#define DIST3D(P0, P1) sqrt(((P1)[X] - (P0)[X])*((P1)[X] - (P0)[X]) + \ - ((P1)[Y] - (P0)[Y])*((P1)[Y] - (P0)[Y]) + \ - ((P1)[Z] - (P0)[Z])*((P1)[Z] - (P0)[Z])) /* - * Given a pointer (vhead) to vlist point coordinates, a reference - * point (ref_pt), and a transformation matrix (mat), pass back in - * "closest_pt" the original, untransformed 3 space coordinates of - * the point nearest the reference point after all points have been - * transformed into 2 space projection plane coordinates. + * Put labels on the vertices of the currently edited solid. + * XXX This really should use import/export interface! Or be part of it. */ -int -nurb_closest2d( - int *surface, - int *uval, - int *vval, - const struct rt_nurb_internal *spl, - const point_t ref_pt, - const mat_t mat) +void +label_edited_solid( + struct mged_state *s, + int *num_lines, // NOTE - currently used only for BOTs + point_t *lines, // NOTE - currently used only for BOTs + struct rt_point_labels pl[], + int max_pl, + const mat_t xform, + struct rt_db_internal *ip) { - struct face_g_snurb *srf; - point_t ref_2d; - fastf_t *mesh; - fastf_t d; - fastf_t c_dist; /* closest dist so far */ - int c_surfno; - int c_u, c_v; - int u, v; - int i; + // TODO - is es_int the same as ip here? If not, why not? + RT_CK_DB_INTERNAL(ip); - RT_NURB_CK_MAGIC(spl); - - c_dist = INFINITY; - c_surfno = c_u = c_v = -1; - - /* transform reference point to 2d */ - MAT4X3PNT(ref_2d, mat, ref_pt); - - for (i = 0; i < spl->nsrf; i++) { - int advance; - - srf = spl->srfs[i]; - NMG_CK_SNURB(srf); - mesh = srf->ctl_points; - advance = RT_NURB_EXTRACT_COORDS(srf->pt_type); - - for (v = 0; v < srf->s_size[0]; v++) { - for (u = 0; u < srf->s_size[1]; u++) { - point_t cur; - /* XXX 4-tuples? */ - MAT4X3PNT(cur, mat, mesh); - d = DIST2D(ref_2d, cur); - if (d < c_dist) { - c_dist = d; - c_surfno = i; - c_u = u; - c_v = v; - } - mesh += advance; - } + // First, see if we have an edit-aware labeling method. If we do, use it. + if (EDOBJ[ip->idb_type].ft_labels) { + bu_vls_trunc(s->s_edit->log_str, 0); + (*EDOBJ[ip->idb_type].ft_labels)(num_lines, lines, pl, max_pl, xform, s->s_edit, &s->tol.tol); + if (bu_vls_strlen(s->s_edit->log_str)) { + Tcl_AppendResult(s->interp, bu_vls_cstr(s->s_edit->log_str), (char *)NULL); + bu_vls_trunc(s->s_edit->log_str, 0); } + return; + } + // If there is no editing-aware labeling, use standard librt labels + if (OBJ[ip->idb_type].ft_labels) { + OBJ[ip->idb_type].ft_labels(pl, max_pl, xform, &s->s_edit->es_int, &s->tol.tol); + return; } - if (c_surfno < 0) return -1; /* FAIL */ - *surface = c_surfno; - *uval = c_u; - *vval = c_v; - return 0; /* success */ + // If we have nothing, NULL the string + pl[0].str[0] = '\0'; } +/* -------------------------------- */ + int f_keypoint(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { @@ -6438,7 +1620,7 @@ f_keypoint(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv return TCL_ERROR; } - if ((GEOM_EDIT_STATE != ST_S_EDIT) && (GEOM_EDIT_STATE != ST_O_EDIT)) { + if ((s->edit_state.global_editing_state != ST_S_EDIT) && (s->edit_state.global_editing_state != ST_O_EDIT)) { state_err(s, "keypoint assignment"); return TCL_ERROR; } @@ -6449,27 +1631,26 @@ f_keypoint(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; point_t key; - VSCALE(key, es_keypoint, s->dbip->dbi_base2local); - bu_vls_printf(&tmp_vls, "%s (%g, %g, %g)\n", es_keytag, V3ARGS(key)); + VSCALE(key, s->s_edit->e_keypoint, s->dbip->dbi_base2local); + bu_vls_printf(&tmp_vls, "%s (%g, %g, %g)\n", s->s_edit->e_keytag, V3ARGS(key)); Tcl_AppendResult(interp, bu_vls_addr(&tmp_vls), (char *)NULL); bu_vls_free(&tmp_vls); } break; case 3: - VSET(es_keypoint, + VSET(s->s_edit->e_keypoint, atof(argv[1]) * s->dbip->dbi_local2base, atof(argv[2]) * s->dbip->dbi_local2base, atof(argv[3]) * s->dbip->dbi_local2base); - es_keytag = "user-specified"; - es_keyfixed = 1; + s->s_edit->e_keytag = "user-specified"; + s->s_edit->e_keyfixed = 1; break; case 1: if (BU_STR_EQUAL(argv[1], "reset")) { - es_keytag = ""; - es_keyfixed = 0; - get_solid_keypoint(s, &es_keypoint, &es_keytag, - &s->edit_state.es_int, es_mat); + s->s_edit->e_keytag = ""; + s->s_edit->e_keyfixed = 0; + rt_get_solid_keypoint(s->s_edit, &s->s_edit->e_keypoint, &s->s_edit->e_keytag, s->s_edit->e_mat); break; } /* fall through */ @@ -6489,160 +1670,25 @@ f_get_sedit_menus(ClientData clientData, Tcl_Interp *interp, int UNUSED(argc), c struct cmdtab *ctp = (struct cmdtab *)clientData; MGED_CK_CMD(ctp); struct mged_state *s = ctp->s; + struct rt_db_internal *ip = &s->s_edit->es_int; - struct menu_item *mip = (struct menu_item *)NULL; struct bu_vls vls = BU_VLS_INIT_ZERO; - if (GEOM_EDIT_STATE != ST_S_EDIT) + if (s->edit_state.global_editing_state != ST_S_EDIT) return TCL_ERROR; - switch (s->edit_state.es_int.idb_type) { - case ID_ARB8: - { - struct bu_vls vls2 = BU_VLS_INIT_ZERO; - - /* title */ - bu_vls_printf(&vls, "{{ARB MENU} {}}"); - - /* build "move edge" menu */ - mip = which_menu[es_type-4]; - /* submenu title */ - bu_vls_printf(&vls2, "{{%s} {}}", mip->menu_string); - for (++mip; mip->menu_func != NULL; ++mip) - bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string); - - bu_vls_printf(&vls, " {{%s} {%s}}", cntrl_menu[1].menu_string, bu_vls_addr(&vls2)); - bu_vls_trunc(&vls2, 0); - - /* build "move face" menu */ - mip = which_menu[es_type+1]; - /* submenu title */ - bu_vls_printf(&vls2, "{{%s} {}}", mip->menu_string); - for (++mip; mip->menu_func != NULL; ++mip) - bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string); - - bu_vls_printf(&vls, " {{%s} {%s}}", cntrl_menu[2].menu_string, bu_vls_addr(&vls2)); - bu_vls_trunc(&vls2, 0); - - /* build "rotate face" menu */ - mip = which_menu[es_type+6]; - /* submenu title */ - bu_vls_printf(&vls2, "{{%s} {}}", mip->menu_string); - for (++mip; mip->menu_func != NULL; ++mip) - bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string); - - bu_vls_printf(&vls, " {{%s} {%s}}", cntrl_menu[3].menu_string, bu_vls_addr(&vls2)); - bu_vls_free(&vls2); - } - - break; - case ID_ARS: - { - struct bu_vls vls2 = BU_VLS_INIT_ZERO; - - /* build ARS PICK MENU Tcl list */ - - mip = ars_pick_menu; - /* title */ - bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string); - for (++mip; mip->menu_func != NULL; ++mip) - bu_vls_printf(&vls2, " {{%s} {}}", mip->menu_string); - - mip = ars_menu; - /* title */ - bu_vls_printf(&vls, " {{%s} {}}", mip->menu_string); - - /* pick vertex menu */ - bu_vls_printf(&vls, " {{%s} {%s}}", (++mip)->menu_string, - bu_vls_addr(&vls2)); - - for (++mip; mip->menu_func != NULL; ++mip) - bu_vls_printf(&vls, " {{%s} {}}", mip->menu_string); - - bu_vls_free(&vls2); - } - - break; - default: - switch (s->edit_state.es_int.idb_type) { - case ID_TGC: - mip = tgc_menu; - break; - case ID_TOR: - mip = tor_menu; - break; - case ID_ELL: - mip = ell_menu; - break; - case ID_SUPERELL: - mip = superell_menu; - break; - case ID_BSPLINE: - mip = spline_menu; - break; - case ID_RPC: - mip = rpc_menu; - break; - case ID_RHC: - mip = rhc_menu; - break; - case ID_EPA: - mip = epa_menu; - break; - case ID_EHY: - mip = ehy_menu; - break; - case ID_HYP: - mip = hyp_menu; - break; - case ID_ETO: - mip = eto_menu; - break; - case ID_NMG: - mip = nmg_menu; - break; - case ID_PIPE: - mip = pipe_menu; - break; - case ID_METABALL: - mip = metaball_menu; - break; - case ID_VOL: - mip = vol_menu; - break; - case ID_EBM: - mip = ebm_menu; - break; - case ID_DSP: - mip = dsp_menu; - break; - case ID_PARTICLE: - mip = part_menu; - break; - case ID_BOT: - mip = bot_menu; - break; - case ID_EXTRUDE: - mip = extr_menu; - break; - case ID_CLINE: - mip = cline_menu; - break; - } - - if (mip == (struct menu_item *)NULL) - break; - - /* title */ - bu_vls_printf(&vls, " {{%s} {}}", mip->menu_string); - - for (++mip; mip->menu_func != NULL; ++mip) - bu_vls_printf(&vls, " {{%s} {}}", mip->menu_string); - - break; + if (EDOBJ[ip->idb_type].ft_menu_str) { + bu_vls_trunc(s->s_edit->log_str, 0); + int ret = (*EDOBJ[ip->idb_type].ft_menu_str)(&vls, ip, &s->tol.tol); + if (bu_vls_strlen(s->s_edit->log_str)) { + Tcl_AppendResult(s->interp, bu_vls_cstr(s->s_edit->log_str), (char *)NULL); + bu_vls_trunc(s->s_edit->log_str, 0); + } + if (ret != BRLCAD_OK) + return TCL_ERROR; } - Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)0); + Tcl_AppendResult(interp, bu_vls_cstr(&vls), (char *)0); bu_vls_free(&vls); return TCL_OK; @@ -6670,7 +1716,7 @@ f_get_sedit(ClientData clientData, Tcl_Interp *interp, int argc, const char *arg return TCL_ERROR; } - if (GEOM_EDIT_STATE != ST_S_EDIT || !illump) { + if (s->edit_state.global_editing_state != ST_S_EDIT || !illump) { Tcl_AppendResult(interp, "get_sed: must be in solid edit state", (char *)0); return TCL_ERROR; } @@ -6683,9 +1729,9 @@ f_get_sedit(ClientData clientData, Tcl_Interp *interp, int argc, const char *arg struct bu_vls logstr = BU_VLS_INIT_ZERO; /* get solid type and parameters */ - RT_CK_DB_INTERNAL(&s->edit_state.es_int); - RT_CK_FUNCTAB(s->edit_state.es_int.idb_meth); - status = s->edit_state.es_int.idb_meth->ft_get(&logstr, &s->edit_state.es_int, (char *)0); + RT_CK_DB_INTERNAL(&s->s_edit->es_int); + RT_CK_FUNCTAB(s->s_edit->es_int.idb_meth); + status = s->s_edit->es_int.idb_meth->ft_get(&logstr, &s->s_edit->es_int, (char *)0); Tcl_AppendResult(interp, bu_vls_addr(&logstr), (char *)0); pto = Tcl_GetObjResult(interp); @@ -6707,7 +1753,7 @@ f_get_sedit(ClientData clientData, Tcl_Interp *interp, int argc, const char *arg /* apply matrices along the path */ RT_DB_INTERNAL_INIT(&ces_int); - transform_editing_solid(s, &ces_int, es_mat, &s->edit_state.es_int, 0); + transform_editing_solid(s, &ces_int, s->s_edit->e_mat, &s->s_edit->es_int, 0); /* get solid type and parameters */ RT_CK_DB_INTERNAL(&ces_int); @@ -6763,7 +1809,7 @@ f_put_sedit(ClientData clientData, Tcl_Interp *interp, int argc, const char *arg return TCL_ERROR; } - if (GEOM_EDIT_STATE != ST_S_EDIT) { + if (s->edit_state.global_editing_state != ST_S_EDIT) { Tcl_AppendResult(interp, "put_sed: must be in solid edit state", (char *)0); return TCL_ERROR; } @@ -6785,48 +1831,36 @@ f_put_sedit(ClientData clientData, Tcl_Interp *interp, int argc, const char *arg return TCL_ERROR; } - RT_CK_FUNCTAB(s->edit_state.es_int.idb_meth); - if (s->edit_state.es_int.idb_meth != ftp) { + RT_CK_FUNCTAB(s->s_edit->es_int.idb_meth); + if (s->s_edit->es_int.idb_meth != ftp) { Tcl_AppendResult(interp, "put_sed: idb_meth type mismatch", (char *)0); } - save_magic = *((uint32_t *)s->edit_state.es_int.idb_ptr); - *((uint32_t *)s->edit_state.es_int.idb_ptr) = ftp->ft_internal_magic; + save_magic = *((uint32_t *)s->s_edit->es_int.idb_ptr); + *((uint32_t *)s->s_edit->es_int.idb_ptr) = ftp->ft_internal_magic; { int ret; struct bu_vls vlog = BU_VLS_INIT_ZERO; - ret = bu_structparse_argv(&vlog, argc-2, argv+2, ftp->ft_parsetab, (char *)s->edit_state.es_int.idb_ptr, NULL); + ret = bu_structparse_argv(&vlog, argc-2, argv+2, ftp->ft_parsetab, (char *)s->s_edit->es_int.idb_ptr, NULL); Tcl_AppendResult(interp, bu_vls_addr(&vlog), (char *)NULL); bu_vls_free(&vlog); if (ret != BRLCAD_OK) return TCL_ERROR; } - *((uint32_t *)s->edit_state.es_int.idb_ptr) = save_magic; + *((uint32_t *)s->s_edit->es_int.idb_ptr) = save_magic; if (context) - transform_editing_solid(s, &s->edit_state.es_int, es_invmat, &s->edit_state.es_int, 1); - - /* must re-calculate the face plane equations for arbs */ - if (s->edit_state.es_int.idb_type == ID_ARB8) { - struct rt_arb_internal *arb; - struct bu_vls error_msg = BU_VLS_INIT_ZERO; - - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - RT_ARB_CK_MAGIC(arb); - - if (rt_arb_calc_planes(&error_msg, arb, es_type, es_peqn, &s->tol.tol) < 0) - Tcl_AppendResult(interp, bu_vls_addr(&error_msg), (char *)0); - bu_vls_free(&error_msg); - } + transform_editing_solid(s, &s->s_edit->es_int, s->s_edit->e_invmat, &s->s_edit->es_int, 1); - if (!es_keyfixed) - get_solid_keypoint(s, &es_keypoint, &es_keytag, &s->edit_state.es_int, es_mat); + if (!s->s_edit->e_keyfixed) + rt_get_solid_keypoint(s->s_edit, &s->s_edit->e_keypoint, &s->s_edit->e_keytag, s->s_edit->e_mat); - set_e_axes_pos(s, 0); - replot_editing_solid(s); + int flag = 0; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); + replot_editing_solid(0, NULL, s, NULL); return TCL_OK; } @@ -6840,7 +1874,7 @@ f_sedit_reset(ClientData clientData, Tcl_Interp *interp, int argc, const char *U struct mged_state *s = ctp->s; struct bu_vls vls = BU_VLS_INIT_ZERO; - if (GEOM_EDIT_STATE != ST_S_EDIT || !illump) + if (s->edit_state.global_editing_state != ST_S_EDIT || !illump) return TCL_ERROR; if (argc != 1) { @@ -6851,19 +1885,17 @@ f_sedit_reset(ClientData clientData, Tcl_Interp *interp, int argc, const char *U } /* free old copy */ - rt_db_free_internal(&s->edit_state.es_int); + rt_db_free_internal(&s->s_edit->es_int); - /* reset */ - es_pipe_pnt = (struct wdb_pipe_pnt *)NULL; - es_metaball_pnt = (struct wdb_metaball_pnt *)NULL; - es_s = (struct shell *)NULL; - es_eu = (struct edgeuse *)NULL; + /* reset internal variables */ + if (EDOBJ[s->s_edit->es_int.idb_type].ft_prim_edit_reset) + (*EDOBJ[s->s_edit->es_int.idb_type].ft_prim_edit_reset)(s->s_edit); /* read in a fresh copy */ if (!illump || !illump->s_u_data) return TCL_ERROR; struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; - if (rt_db_get_internal(&s->edit_state.es_int, LAST_SOLID(bdata), + if (rt_db_get_internal(&s->s_edit->es_int, LAST_SOLID(bdata), s->dbip, NULL, &rt_uniresource) < 0) { if (bdata->s_fullpath.fp_len > 0) { Tcl_AppendResult(interp, "sedit_reset(", @@ -6875,35 +1907,36 @@ f_sedit_reset(ClientData clientData, Tcl_Interp *interp, int argc, const char *U } return TCL_ERROR; /* FAIL */ } - RT_CK_DB_INTERNAL(&s->edit_state.es_int); - replot_editing_solid(s); + RT_CK_DB_INTERNAL(&s->s_edit->es_int); + replot_editing_solid(0, NULL, s, NULL); /* Establish initial keypoint */ - es_keytag = ""; - get_solid_keypoint(s, &es_keypoint, &es_keytag, &s->edit_state.es_int, es_mat); + s->s_edit->e_keytag = ""; + rt_get_solid_keypoint(s->s_edit, &s->s_edit->e_keypoint, &s->s_edit->e_keytag, s->s_edit->e_mat); /* Reset relevant variables */ - MAT_IDN(acc_rot_sol); + MAT_IDN(s->s_edit->acc_rot_sol); VSETALL(s->edit_state.edit_absolute_model_rotate, 0.0); VSETALL(s->edit_state.edit_absolute_object_rotate, 0.0); VSETALL(s->edit_state.edit_absolute_view_rotate, 0.0); VSETALL(s->edit_state.last_edit_absolute_model_rotate, 0.0); VSETALL(s->edit_state.last_edit_absolute_object_rotate, 0.0); VSETALL(s->edit_state.last_edit_absolute_view_rotate, 0.0); - VSETALL(s->edit_state.edit_absolute_model_tran, 0.0); - VSETALL(s->edit_state.edit_absolute_view_tran, 0.0); - VSETALL(s->edit_state.last_edit_absolute_model_tran, 0.0); - VSETALL(s->edit_state.last_edit_absolute_view_tran, 0.0); - s->edit_state.edit_absolute_scale = 0.0; - acc_sc_sol = 1.0; + VSETALL(s->s_edit->edit_absolute_model_tran, 0.0); + VSETALL(s->s_edit->edit_absolute_view_tran, 0.0); + VSETALL(s->s_edit->last_edit_absolute_model_tran, 0.0); + VSETALL(s->s_edit->last_edit_absolute_view_tran, 0.0); + s->s_edit->edit_absolute_scale = 0.0; + s->s_edit->acc_sc_sol = 1.0; VSETALL(s->edit_state.edit_rate_model_rotate, 0.0); VSETALL(s->edit_state.edit_rate_object_rotate, 0.0); VSETALL(s->edit_state.edit_rate_view_rotate, 0.0); VSETALL(s->edit_state.edit_rate_model_tran, 0.0); VSETALL(s->edit_state.edit_rate_view_tran, 0.0); - set_e_axes_pos(s, 1); - update_views = 1; + int flag = 1; + set_e_axes_pos(0, NULL, (void *)s, (void *)&flag); + s->update_views = 1; dm_set_dirty(DMP, 1); /* active edit callback */ @@ -6930,8 +1963,12 @@ f_sedit_apply(ClientData clientData, Tcl_Interp *interp, int UNUSED(argc), const return TCL_ERROR; } - if (sedraw > 0) - sedit(s); + if (sedraw > 0) { + s->s_edit->update_views = s->update_views; + sedraw = 0; + rt_solid_edit_process(s->s_edit); + s->update_views = s->s_edit->update_views; + } init_sedit_vars(s); (void)sedit_apply(s, 0); @@ -6954,7 +1991,7 @@ f_oedit_reset(ClientData clientData, Tcl_Interp *interp, int argc, const char *U struct bu_vls vls = BU_VLS_INIT_ZERO; - if (GEOM_EDIT_STATE != ST_O_EDIT) + if (s->edit_state.global_editing_state != ST_O_EDIT) return TCL_ERROR; if (argc != 1) { @@ -6968,7 +2005,7 @@ f_oedit_reset(ClientData clientData, Tcl_Interp *interp, int argc, const char *U init_oedit_guts(s); new_edit_mats(s); - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); /* active edit callback */ @@ -6998,16 +2035,16 @@ f_oedit_apply(ClientData clientData, Tcl_Interp *interp, int UNUSED(argc), const struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; /* Save aggregate path matrix */ - MAT_IDN(es_mat); - (void)db_path_to_mat(s->dbip, &bdata->s_fullpath, es_mat, bdata->s_fullpath.fp_len-1, &rt_uniresource); + MAT_IDN(s->s_edit->e_mat); + (void)db_path_to_mat(s->dbip, &bdata->s_fullpath, s->s_edit->e_mat, bdata->s_fullpath.fp_len-1, &rt_uniresource); /* get the inverse matrix */ - bn_mat_inv(es_invmat, es_mat); + bn_mat_inv(s->s_edit->e_invmat, s->s_edit->e_mat); - get_solid_keypoint(s, &es_keypoint, &strp, &s->edit_state.es_int, es_mat); + rt_get_solid_keypoint(s->s_edit, &s->s_edit->e_keypoint, &strp, s->s_edit->e_mat); init_oedit_vars(s); new_edit_mats(s); - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); /* active edit callback */ @@ -7018,6 +2055,231 @@ f_oedit_apply(ClientData clientData, Tcl_Interp *interp, int UNUSED(argc), const return TCL_OK; } +/* Extrude command - project an arb face */ +/* Format: extrude face distance */ +int +f_extrude(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) +{ + struct cmdtab *ctp = (struct cmdtab *)clientData; + MGED_CK_CMD(ctp); + struct mged_state *s = ctp->s; + + static int face; + static fastf_t dist; + + CHECK_DBI_NULL; + + if (argc < 3 || 3 < argc) { + struct bu_vls vls = BU_VLS_INIT_ZERO; + + bu_vls_printf(&vls, "help extrude"); + Tcl_Eval(interp, bu_vls_addr(&vls)); + bu_vls_free(&vls); + + return TCL_ERROR; + } + + if (not_state(s, ST_S_EDIT, "Extrude")) + return TCL_ERROR; + + if (s->s_edit->es_int.idb_type != ID_ARB8) { + Tcl_AppendResult(interp, "Extrude: solid type must be ARB\n", (char *)NULL); + return TCL_ERROR; + } + + int arb_type = rt_arb_std_type(&s->s_edit->es_int, s->s_edit->tol); + + if (arb_type != ARB8 && arb_type != ARB6 && arb_type != ARB4) { + struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; + + bu_vls_printf(&tmp_vls, "ARB%d: extrusion of faces not allowed\n", arb_type); + Tcl_AppendResult(interp, bu_vls_addr(&tmp_vls), (char *)NULL); + bu_vls_free(&tmp_vls); + + return TCL_ERROR; + } + + face = atoi(argv[1]); + + /* get distance to project face */ + dist = atof(argv[2]); + /* apply s->s_edit->e_mat[15] to get to real model space */ + /* convert from the local unit (as input) to the base unit */ + dist = dist * s->s_edit->e_mat[15] * s->dbip->dbi_local2base; + + struct rt_arb_internal *arb = (struct rt_arb_internal *)s->s_edit->es_int.idb_ptr; + RT_ARB_CK_MAGIC(arb); + + fastf_t es_peqn[7][4]; + struct bu_vls error_msg = BU_VLS_INIT_ZERO; + if (rt_arb_calc_planes(&error_msg, arb, arb_type, es_peqn, &s->tol.tol)) { + // TODO - write to a vls so parent code can do Tcl_AppendResult + bu_log("\nCannot calculate plane equations for ARB8\n"); + bu_vls_free(&error_msg); + return TCL_ERROR; + } + bu_vls_free(&error_msg); + + if (arb_extrude(arb, face, dist, s->s_edit->tol, es_peqn)) { + Tcl_AppendResult(interp, "Error extruding ARB\n", (char *)NULL); + return TCL_ERROR; + } + + /* draw the updated solid */ + replot_editing_solid(0, NULL, s, NULL); + s->update_views = 1; + dm_set_dirty(DMP, 1); + + return TCL_OK; +} + + +/* Mirface command - mirror an arb face */ +/* Format: mirror face axis */ +int +f_mirface(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) +{ + struct cmdtab *ctp = (struct cmdtab *)clientData; + MGED_CK_CMD(ctp); + struct mged_state *s = ctp->s; + + int face; + + if (argc < 3 || 3 < argc) { + struct bu_vls vls = BU_VLS_INIT_ZERO; + + bu_vls_printf(&vls, "help mirface"); + Tcl_Eval(interp, bu_vls_addr(&vls)); + bu_vls_free(&vls); + + return TCL_ERROR; + } + + if (not_state(s, ST_S_EDIT, "Mirface")) + return TCL_ERROR; + + if (s->s_edit->es_int.idb_type != ID_ARB8) { + Tcl_AppendResult(interp, "Mirface: solid type must be ARB\n", (char *)NULL); + return TCL_ERROR; + } + + struct rt_arb_internal *arb = (struct rt_arb_internal *)s->s_edit->es_int.idb_ptr; + RT_ARB_CK_MAGIC(arb); + + face = atoi(argv[1]); + + fastf_t es_peqn[7][4]; + struct bu_vls error_msg = BU_VLS_INIT_ZERO; + int arb_type = rt_arb_std_type(&s->s_edit->es_int, s->s_edit->tol); + if (rt_arb_calc_planes(&error_msg, arb, arb_type, es_peqn, &s->tol.tol)) { + // TODO - write to a vls so parent code can do Tcl_AppendResult + bu_log("\nCannot calculate plane equations for ARB8\n"); + bu_vls_free(&error_msg); + return TCL_ERROR; + } + bu_vls_free(&error_msg); + + if (arb_mirror_face_axis(arb, es_peqn, face, argv[2], s->s_edit->tol)) { + Tcl_AppendResult(interp, "Mirface: mirror operation failed\n", (char *)NULL); + return TCL_ERROR; + } + + /* draw the updated solid */ + replot_editing_solid(0, NULL, s, NULL); + view_state->vs_flag = 1; + + return TCL_OK; +} + + +/* Edgedir command: define the direction of an arb edge being moved + * Format: edgedir deltax deltay deltaz OR edgedir rot fb +*/ +int +f_edgedir(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) +{ + struct cmdtab *ctp = (struct cmdtab *)clientData; + MGED_CK_CMD(ctp); + struct mged_state *s = ctp->s; + + if (argc < 3 || 4 < argc) { + struct bu_vls vls = BU_VLS_INIT_ZERO; + + bu_vls_printf(&vls, "help edgedir"); + Tcl_Eval(interp, bu_vls_addr(&vls)); + bu_vls_free(&vls); + + return TCL_ERROR; + } + + if (not_state(s, ST_S_EDIT, "Edgedir")) + return TCL_ERROR; + + return rt_arb_edgedir(s->s_edit, argc, argv); +} + +/* Permute command - permute the vertex labels of an ARB + * Format: permute tuple */ + +/* + * Minimum and maximum tuple lengths + * ------------------------------------------------ + * Solid # vertices needed # vertices + * type to disambiguate in THE face + * ------------------------------------------------ + * ARB4 3 3 + * ARB5 2 4 + * ARB6 2 4 + * ARB7 1 4 + * ARB8 3 4 + * ------------------------------------------------ + */ +int +f_permute(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) +{ + struct cmdtab *ctp = (struct cmdtab *)clientData; + MGED_CK_CMD(ctp); + struct mged_state *s = ctp->s; + + /* + * 1) Why were all vars declared static? + * 2) Recompute plane equations? + */ + struct bu_vls vls = BU_VLS_INIT_ZERO; + CHECK_DBI_NULL; + CHECK_READ_ONLY; + + if (argc < 2 || 2 < argc) { + bu_vls_printf(&vls, "help permute"); + Tcl_Eval(interp, bu_vls_addr(&vls)); + bu_vls_free(&vls); + + return TCL_ERROR; + } + + if (not_state(s, ST_S_EDIT, "Permute")) + return TCL_ERROR; + + if (s->s_edit->es_int.idb_type != ID_ARB8) { + Tcl_AppendResult(interp, "Permute: solid type must be an ARB\n", (char *)NULL); + return TCL_ERROR; + } + + struct rt_arb_internal *arb = (struct rt_arb_internal *)s->s_edit->es_int.idb_ptr; + RT_ARB_CK_MAGIC(arb); + + if (arb_permute(arb, argv[1], s->s_edit->tol)) { + Tcl_AppendResult(interp, "Permute failed.\n", (char *)NULL); + return TCL_ERROR; + } + + /* draw the updated solid */ + replot_editing_solid(0, NULL, s, NULL); + view_state->vs_flag = 1; + + return TCL_OK; +} + /* * Local Variables: diff --git a/src/mged/facedef.c b/src/mged/facedef.c index b03239dc4e..d41f883d4e 100644 --- a/src/mged/facedef.c +++ b/src/mged/facedef.c @@ -108,25 +108,26 @@ f_facedef(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[ BU_VLS_INIT(&error_msg); RT_DB_INTERNAL_INIT(&intern); - if (GEOM_EDIT_STATE != ST_S_EDIT) { + if (s->edit_state.global_editing_state != ST_S_EDIT) { Tcl_AppendResult(interp, "Facedef: must be in solid edit mode\n", (char *)NULL); status = TCL_ERROR; goto end; } - if (s->edit_state.es_int.idb_type != ID_ARB8) { + if (s->s_edit->es_int.idb_type != ID_ARB8) { Tcl_AppendResult(interp, "Facedef: solid type must be ARB\n"); status = TCL_ERROR; goto end; } - /* apply es_mat editing to parameters. "new way" */ - transform_editing_solid(s, &intern, es_mat, &s->edit_state.es_int, 0); + /* apply s->edit_state.e_mat editing to parameters. "new way" */ + transform_editing_solid(s, &intern, s->s_edit->e_mat, &s->s_edit->es_int, 0); arb = (struct rt_arb_internal *)intern.idb_ptr; RT_ARB_CK_MAGIC(arb); /* find new planes to account for any editing */ - if (rt_arb_calc_planes(&error_msg, arb, es_type, planes, &s->tol.tol)) { + int arb_type = rt_arb_std_type(&s->s_edit->es_int, s->s_edit->tol); + if (rt_arb_calc_planes(&error_msg, arb, arb_type, planes, &s->tol.tol)) { Tcl_AppendResult(interp, bu_vls_addr(&error_msg), "Unable to determine plane equations\n", (char *)NULL); status = TCL_ERROR; @@ -152,7 +153,7 @@ f_facedef(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[ /* face 1234 of arb7 */ /* face 1234 of arb6 */ /* face 1234 of arb5 */ - if (es_type==4 && prod==24) + if (arb_type==4 && prod==24) plane=2; /* face 234 of arb4 */ break; case 8: /* face 124 of arb4 */ @@ -164,20 +165,20 @@ f_facedef(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[ case 120: /* face 1564 of arb6 */ case 20: /* face 145 of arb7 */ case 160:plane=2; /* face 1584 of arb8 */ - if (es_type==5) + if (arb_type==5) plane=4; /* face 145 of arb5 */ break; case 12: /* face 134 of arb4 */ case 10: /* face 125 of arb6 */ case 252:plane=3; /* face 2376 of arb8 */ /* face 2376 of arb7 */ - if (es_type==5) + if (arb_type==5) plane=1; /* face 125 of arb5 */ break; case 72: /* face 346 of arb6 */ case 60:plane=4; /* face 1265 of arb8 */ /* face 1265 of arb7 */ - if (es_type==5) + if (arb_type==5) plane=3; /* face 345 of arb5 */ break; case 420: /* face 4375 of arb7 */ @@ -211,7 +212,7 @@ f_facedef(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[ switch (argv[2][0]) { case 'a': /* special case for arb7, because of 2 4-pt planes meeting */ - if (es_type == 7) + if (arb_type == 7) if (plane!=0 && plane!=3) { Tcl_AppendResult(interp, "Facedef: can't redefine that arb7 plane\n", (char *)NULL); status = TCL_ERROR; @@ -227,7 +228,7 @@ f_facedef(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[ break; case 'b': /* special case for arb7, because of 2 4-pt planes meeting */ - if (es_type == 7) + if (arb_type == 7) if (plane!=0 && plane!=3) { Tcl_AppendResult(interp, "Facedef: can't redefine that arb7 plane\n", (char *)NULL); status = TCL_ERROR; @@ -250,7 +251,7 @@ f_facedef(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[ break; case 'c': /* special case for arb7, because of 2 4-pt planes meeting */ - if (es_type == 7 && (plane != 0 && plane != 3)) { + if (arb_type == 7 && (plane != 0 && plane != 3)) { if (argc < 5) { /* total # of args under this option */ Tcl_AppendResult(interp, MORE_ARGS_STR, p_rotfb[argc-3], (char *)NULL); @@ -271,7 +272,7 @@ f_facedef(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[ break; case 'd': /* special case for arb7, because of 2 4-pt planes meeting */ - if (es_type == 7) + if (arb_type == 7) if (plane!=0 && plane!=3) { Tcl_AppendResult(interp, "Facedef: can't redefine that arb7 plane\n", (char *)NULL); status = TCL_ERROR; @@ -294,25 +295,25 @@ f_facedef(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[ } /* find all vertices from the plane equations */ - if (rt_arb_calc_points(arb, es_type, (const plane_t *)planes, &s->tol.tol) < 0) { + if (rt_arb_calc_points(arb, arb_type, (const plane_t *)planes, &s->tol.tol) < 0) { Tcl_AppendResult(interp, "facedef: unable to find points\n", (char *)NULL); status = TCL_ERROR; goto end; } /* Now have 8 points, which is the internal form of an ARB8. */ - /* Transform points back before es_mat changes */ + /* Transform points back before s->edit_state.e_mat changes */ /* This is the "new way" */ - arbo = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; + arbo = (struct rt_arb_internal *)s->s_edit->es_int.idb_ptr; RT_ARB_CK_MAGIC(arbo); for (i=0; i<8; i++) { - MAT4X3PNT(arbo->pt[i], es_invmat, arb->pt[i]); + MAT4X3PNT(arbo->pt[i], s->s_edit->e_invmat, arb->pt[i]); } rt_db_free_internal(&intern); /* draw the new solid */ - replot_editing_solid(s); + replot_editing_solid(0, NULL, s, NULL); end: (void)signal(SIGINT, SIG_IGN); diff --git a/src/mged/fbserv.c b/src/mged/fbserv.c index 6b93a3149b..af254153a5 100644 --- a/src/mged/fbserv.c +++ b/src/mged/fbserv.c @@ -42,6 +42,7 @@ #define NET_LONG_LEN 4 /* # bytes to network long */ +/* Ew. Global. */ extern const struct pkg_switch pkg_switch[]; /* diff --git a/src/mged/grid.c b/src/mged/grid.c index d1c52222b4..b0f1770f33 100644 --- a/src/mged/grid.c +++ b/src/mged/grid.c @@ -33,15 +33,10 @@ #include "./mged.h" #include "./mged_dm.h" - -extern point_t e_axes_pos; /* from edsol.c */ -extern point_t curr_e_axes_pos; /* from edsol.c */ - static void grid_set_dirty_flag(const struct bu_structparse *, const char *, void *, const char *, void *); static void set_grid_draw(const struct bu_structparse *, const char *, void *, const char *, void *); static void set_grid_res(const struct bu_structparse *, const char *, void *, const char *, void *); - struct bv_grid_state default_grid_state = { /* rc */ 1, /* draw */ 0, @@ -304,22 +299,22 @@ snap_keypoint_to_grid(struct mged_state *s) if (s->dbip == DBI_NULL) return; - if (GEOM_EDIT_STATE != ST_S_EDIT && GEOM_EDIT_STATE != ST_O_EDIT) { + if (s->edit_state.global_editing_state != ST_S_EDIT && s->edit_state.global_editing_state != ST_O_EDIT) { bu_log("snap_keypoint_to_grid: must be in an edit state\n"); return; } - if (GEOM_EDIT_STATE == ST_S_EDIT) { - MAT4X3PNT(view_pt, view_state->vs_gvp->gv_model2view, curr_e_axes_pos); + if (s->edit_state.global_editing_state == ST_S_EDIT) { + MAT4X3PNT(view_pt, view_state->vs_gvp->gv_model2view, s->s_edit->curr_e_axes_pos); } else { - MAT4X3PNT(model_pt, modelchanges, e_axes_pos); + MAT4X3PNT(model_pt, s->s_edit->model_changes, s->s_edit->e_axes_pos); MAT4X3PNT(view_pt, view_state->vs_gvp->gv_model2view, model_pt); } snap_to_grid(s, &view_pt[X], &view_pt[Y]); MAT4X3PNT(model_pt, view_state->vs_gvp->gv_view2model, view_pt); VSCALE(model_pt, model_pt, s->dbip->dbi_base2local); - if (GEOM_EDIT_STATE == ST_S_EDIT) + if (s->edit_state.global_editing_state == ST_S_EDIT) bu_vls_printf(&cmd, "p %lf %lf %lf", model_pt[X], model_pt[Y], model_pt[Z]); else bu_vls_printf(&cmd, "translate %lf %lf %lf", model_pt[X], model_pt[Y], model_pt[Z]); diff --git a/src/mged/mater.c b/src/mged/mater.c index 24eda68a8b..1810b4cd10 100644 --- a/src/mged/mater.c +++ b/src/mged/mater.c @@ -50,7 +50,7 @@ void mged_color_soltab(struct mged_state *s) { dl_color_soltab(s->gedp->ged_gdp->gd_headDisplay); - update_views = 1; /* re-write control list with new colors */ + s->update_views = 1; /* re-write control list with new colors */ dm_set_dirty(DMP, 1); } diff --git a/src/mged/menu.c b/src/mged/menu.c index d53759e2a9..17ea2c577e 100644 --- a/src/mged/menu.c +++ b/src/mged/menu.c @@ -33,1324 +33,134 @@ #include "./menu.h" #include "ged.h" -#include "ged/view/ged_view_tmp.h" -static void -cline_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_edflag = arg; - sedit(s); -} -struct menu_item cline_menu[] = { - { "CLINE MENU", NULL, 0 }, - { "Set H", cline_ed, ECMD_CLINE_SCALE_H }, - { "Move End H", cline_ed, ECMD_CLINE_MOVE_H }, - { "Set R", cline_ed, ECMD_CLINE_SCALE_R }, - { "Set plate thickness", cline_ed, ECMD_CLINE_SCALE_T }, - { "", NULL, 0 } -}; +extern void sl_halt_scroll(struct rt_solid_edit *, int, int, int, void *); /* in scroll.c */ +extern void sl_toggle_scroll(struct rt_solid_edit *, int, int, int, void *); -/*ARGSUSED*/ -static void -extr_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_edflag = arg; - sedit(s); -} -struct menu_item extr_menu[] = { - { "EXTRUSION MENU", NULL, 0 }, - { "Set H", extr_ed, ECMD_EXTR_SCALE_H }, - { "Move End H", extr_ed, ECMD_EXTR_MOV_H }, - { "Rotate H", extr_ed, ECMD_EXTR_ROT_H }, - { "Referenced Sketch", extr_ed, ECMD_EXTR_SKT_NAME }, - { "", NULL, 0 } -}; +void btn_head_menu(struct rt_solid_edit *s, int i, int menu, int item, void *data); +void btn_item_hit(struct rt_solid_edit *s, int arg, int menu, int item, void *data); -/*ARGSUSED*/ -static void -ars_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_edflag = arg; - sedit(s); -} -struct menu_item ars_pick_menu[] = { - { "ARS PICK MENU", NULL, 0 }, - { "Pick Vertex", ars_ed, ECMD_ARS_PICK }, - { "Next Vertex", ars_ed, ECMD_ARS_NEXT_PT }, - { "Prev Vertex", ars_ed, ECMD_ARS_PREV_PT }, - { "Next Curve", ars_ed, ECMD_ARS_NEXT_CRV }, - { "Prev Curve", ars_ed, ECMD_ARS_PREV_CRV }, +struct rt_solid_edit_menu_item first_menu[] = { + { "BUTTON MENU", btn_head_menu, 1 }, /* chg to 2nd menu */ { "", NULL, 0 } }; - - -struct menu_item ars_menu[] = { - { "ARS MENU", NULL, 0 }, - { "Pick Vertex", ars_ed, ECMD_ARS_PICK_MENU }, - { "Move Point", ars_ed, ECMD_ARS_MOVE_PT }, - { "Delete Curve", ars_ed, ECMD_ARS_DEL_CRV }, - { "Delete Column", ars_ed, ECMD_ARS_DEL_COL }, - { "Dup Curve", ars_ed, ECMD_ARS_DUP_CRV }, - { "Dup Column", ars_ed, ECMD_ARS_DUP_COL }, - { "Move Curve", ars_ed, ECMD_ARS_MOVE_CRV }, - { "Move Column", ars_ed, ECMD_ARS_MOVE_COL }, +struct rt_solid_edit_menu_item second_menu[] = { + { "BUTTON MENU", btn_head_menu, 0 }, /* chg to 1st menu */ + { "REJECT Edit", btn_item_hit, BE_REJECT }, + { "ACCEPT Edit", btn_item_hit, BE_ACCEPT }, + { "35,25", btn_item_hit, BV_35_25 }, + { "Top", btn_item_hit, BV_TOP }, + { "Right", btn_item_hit, BV_RIGHT }, + { "Front", btn_item_hit, BV_FRONT }, + { "45,45", btn_item_hit, BV_45_45 }, + { "Restore View", btn_item_hit, BV_VRESTORE }, + { "Save View", btn_item_hit, BV_VSAVE }, + { "Ang/Dist Curs", btn_item_hit, BV_ADCURSOR }, + { "Reset Viewsize", btn_item_hit, BV_RESET }, + { "Zero Sliders", sl_halt_scroll, 0 }, + { "Sliders", sl_toggle_scroll, 0 }, + { "Rate/Abs", btn_item_hit, BV_RATE_TOGGLE }, + { "Zoom In 2X", btn_item_hit, BV_ZOOM_IN }, + { "Zoom Out 2X", btn_item_hit, BV_ZOOM_OUT }, + { "Primitive Illum", btn_item_hit, BE_S_ILLUMINATE }, + { "Matrix Illum", btn_item_hit, BE_O_ILLUMINATE }, { "", NULL, 0 } }; - -static void -arb8_edge(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = EARB; - if (arg == 12) { - es_edflag = ECMD_ARB_MAIN_MENU; - sedit(s); - } - - set_e_axes_pos(s, 1); -} -struct menu_item edge8_menu[] = { - { "ARB8 EDGES", NULL, 0 }, - { "Move Edge 12", arb8_edge, 0 }, - { "Move Edge 23", arb8_edge, 1 }, - { "Move Edge 34", arb8_edge, 2 }, - { "Move Edge 14", arb8_edge, 3 }, - { "Move Edge 15", arb8_edge, 4 }, - { "Move Edge 26", arb8_edge, 5 }, - { "Move Edge 56", arb8_edge, 6 }, - { "Move Edge 67", arb8_edge, 7 }, - { "Move Edge 78", arb8_edge, 8 }, - { "Move Edge 58", arb8_edge, 9 }, - { "Move Edge 37", arb8_edge, 10 }, - { "Move Edge 48", arb8_edge, 11 }, - { "RETURN", arb8_edge, 12 }, +struct rt_solid_edit_menu_item sed_menu[] = { + { "*PRIMITIVE EDIT*", btn_head_menu, 2 }, + { "Edit Menu", btn_item_hit, BE_S_EDIT }, + { "Rotate", btn_item_hit, BE_S_ROTATE }, + { "Translate", btn_item_hit, BE_S_TRANS }, + { "Scale", btn_item_hit, BE_S_SCALE }, { "", NULL, 0 } }; -static void -arb7_edge(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = EARB; - if (arg == 11) { - /* move point 5 */ - es_edflag = PTARB; - es_menu = 4; /* location of point */ - } - if (arg == 12) { - es_edflag = ECMD_ARB_MAIN_MENU; - sedit(s); - } - - set_e_axes_pos(s, 1); -} -struct menu_item edge7_menu[] = { - { "ARB7 EDGES", NULL, 0 }, - { "Move Edge 12", arb7_edge, 0 }, - { "Move Edge 23", arb7_edge, 1 }, - { "Move Edge 34", arb7_edge, 2 }, - { "Move Edge 14", arb7_edge, 3 }, - { "Move Edge 15", arb7_edge, 4 }, - { "Move Edge 26", arb7_edge, 5 }, - { "Move Edge 56", arb7_edge, 6 }, - { "Move Edge 67", arb7_edge, 7 }, - { "Move Edge 37", arb7_edge, 8 }, - { "Move Edge 57", arb7_edge, 9 }, - { "Move Edge 45", arb7_edge, 10 }, - { "Move Point 5", arb7_edge, 11 }, - { "RETURN", arb7_edge, 12 }, +struct rt_solid_edit_menu_item oed_menu[] = { + { "*MATRIX EDIT*", btn_head_menu, 2 }, + { "Scale", btn_item_hit, BE_O_SCALE }, + { "X Move", btn_item_hit, BE_O_X }, + { "Y Move", btn_item_hit, BE_O_Y }, + { "XY Move", btn_item_hit, BE_O_XY }, + { "Rotate", btn_item_hit, BE_O_ROTATE }, + { "Scale X", btn_item_hit, BE_O_XSCALE }, + { "Scale Y", btn_item_hit, BE_O_YSCALE }, + { "Scale Z", btn_item_hit, BE_O_ZSCALE }, { "", NULL, 0 } }; -static void -arb6_edge(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = EARB; - if (arg == 8) { - /* move point 5, location = 4 */ - es_edflag = PTARB; - es_menu = 4; - } - if (arg == 9) { - /* move point 6, location = 6 */ - es_edflag = PTARB; - es_menu = 6; - } - if (arg == 10) { - es_edflag = ECMD_ARB_MAIN_MENU; - sedit(s); - } - - set_e_axes_pos(s, 1); -} -struct menu_item edge6_menu[] = { - { "ARB6 EDGES", NULL, 0 }, - { "Move Edge 12", arb6_edge, 0 }, - { "Move Edge 23", arb6_edge, 1 }, - { "Move Edge 34", arb6_edge, 2 }, - { "Move Edge 14", arb6_edge, 3 }, - { "Move Edge 15", arb6_edge, 4 }, - { "Move Edge 25", arb6_edge, 5 }, - { "Move Edge 36", arb6_edge, 6 }, - { "Move Edge 46", arb6_edge, 7 }, - { "Move Point 5", arb6_edge, 8 }, - { "Move Point 6", arb6_edge, 9 }, - { "RETURN", arb6_edge, 10 }, - { "", NULL, 0 } -}; - -static void -arb5_edge(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = EARB; - if (arg == 8) { - /* move point 5 at location 4 */ - es_edflag = PTARB; - es_menu = 4; - } - if (arg == 9) { - es_edflag = ECMD_ARB_MAIN_MENU; - sedit(s); - } - - set_e_axes_pos(s, 1); -} -struct menu_item edge5_menu[] = { - { "ARB5 EDGES", NULL, 0 }, - { "Move Edge 12", arb5_edge, 0 }, - { "Move Edge 23", arb5_edge, 1 }, - { "Move Edge 34", arb5_edge, 2 }, - { "Move Edge 14", arb5_edge, 3 }, - { "Move Edge 15", arb5_edge, 4 }, - { "Move Edge 25", arb5_edge, 5 }, - { "Move Edge 35", arb5_edge, 6 }, - { "Move Edge 45", arb5_edge, 7 }, - { "Move Point 5", arb5_edge, 8 }, - { "RETURN", arb5_edge, 9 }, - { "", NULL, 0 } -}; - -static void -arb4_point(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = PTARB; - if (arg == 5) { - es_edflag = ECMD_ARB_MAIN_MENU; - sedit(s); - } - - set_e_axes_pos(s, 1); -} -struct menu_item point4_menu[] = { - { "ARB4 POINTS", NULL, 0 }, - { "Move Point 1", arb4_point, 0 }, - { "Move Point 2", arb4_point, 1 }, - { "Move Point 3", arb4_point, 2 }, - { "Move Point 4", arb4_point, 4 }, - { "RETURN", arb4_point, 5 }, - { "", NULL, 0 } -}; -static void -tgc_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = PSCALE; - if (arg == MENU_TGC_ROT_H) - es_edflag = ECMD_TGC_ROT_H; - if (arg == MENU_TGC_ROT_AB) - es_edflag = ECMD_TGC_ROT_AB; - if (arg == MENU_TGC_MV_H) - es_edflag = ECMD_TGC_MV_H; - if (arg == MENU_TGC_MV_HH) - es_edflag = ECMD_TGC_MV_HH; - - set_e_axes_pos(s, 1); -} - -struct menu_item tgc_menu[] = { - { "TGC MENU", NULL, 0 }, - { "Set H", tgc_ed, MENU_TGC_SCALE_H }, - { "Set H (move V)", tgc_ed, MENU_TGC_SCALE_H_V }, - { "Set H (adj C,D)", tgc_ed, MENU_TGC_SCALE_H_CD }, - { "Set H (move V, adj A,B)", tgc_ed, MENU_TGC_SCALE_H_V_AB }, - { "Set A", tgc_ed, MENU_TGC_SCALE_A }, - { "Set B", tgc_ed, MENU_TGC_SCALE_B }, - { "Set C", tgc_ed, MENU_TGC_SCALE_C }, - { "Set D", tgc_ed, MENU_TGC_SCALE_D }, - { "Set A,B", tgc_ed, MENU_TGC_SCALE_AB }, - { "Set C,D", tgc_ed, MENU_TGC_SCALE_CD }, - { "Set A,B,C,D", tgc_ed, MENU_TGC_SCALE_ABCD }, - { "Rotate H", tgc_ed, MENU_TGC_ROT_H }, - { "Rotate AxB", tgc_ed, MENU_TGC_ROT_AB }, - { "Move End H(rt)", tgc_ed, MENU_TGC_MV_H }, - { "Move End H", tgc_ed, MENU_TGC_MV_HH }, - { "", NULL, 0 } -}; - -static void -tor_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = PSCALE; - - set_e_axes_pos(s, 1); -} - - -struct menu_item tor_menu[] = { - { "TORUS MENU", NULL, 0 }, - { "Set Radius 1", tor_ed, MENU_TOR_R1 }, - { "Set Radius 2", tor_ed, MENU_TOR_R2 }, - { "", NULL, 0 } -}; - -static void -eto_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - if (arg == MENU_ETO_ROT_C) - es_edflag = ECMD_ETO_ROT_C; - else - es_edflag = PSCALE; - - set_e_axes_pos(s, 1); -} -struct menu_item eto_menu[] = { - { "ELL-TORUS MENU", NULL, 0 }, - { "Set r", eto_ed, MENU_ETO_R }, - { "Set D", eto_ed, MENU_ETO_RD }, - { "Set C", eto_ed, MENU_ETO_SCALE_C }, - { "Rotate C", eto_ed, MENU_ETO_ROT_C }, - { "", NULL, 0 } -}; - -static void -ell_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = PSCALE; - - set_e_axes_pos(s, 1); -} -struct menu_item ell_menu[] = { - { "ELLIPSOID MENU", NULL, 0 }, - { "Set A", ell_ed, MENU_ELL_SCALE_A }, - { "Set B", ell_ed, MENU_ELL_SCALE_B }, - { "Set C", ell_ed, MENU_ELL_SCALE_C }, - { "Set A,B,C", ell_ed, MENU_ELL_SCALE_ABC }, - { "", NULL, 0 } -}; - -/*ARGSUSED*/ -static void -spline_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) +/* + * Called when a menu item is hit + */ +void +btn_item_hit(struct rt_solid_edit *UNUSED(es), int arg, int menu, int UNUSED(item), void *data) { - /* XXX Why wasn't this done by setting es_edflag = ECMD_SPLINE_VPICK? */ - if (arg < 0) { - /* Enter picking state */ - chg_state(s, ST_S_EDIT, ST_S_VPICK, "Vertex Pick"); - return; - } - /* For example, this will set es_edflag = ECMD_VTRANS */ - es_edflag = arg; - sedit(s); - - set_e_axes_pos(s, 1); + struct mged_state *s = (struct mged_state *)data; + button(s, arg); + if (menu == MENU_GEN && + (arg != BE_O_ILLUMINATE && arg != BE_S_ILLUMINATE)) + menu_state->ms_flag = 0; } -struct menu_item spline_menu[] = { - { "SPLINE MENU", NULL, 0 }, - { "Pick Vertex", spline_ed, -1 }, - { "Move Vertex", spline_ed, ECMD_VTRANS }, - { "", NULL, 0 } -}; /* - * Handler for events in the NMG menu. - * Mostly just set appropriate state flags to prepare us for user's - * next event. + * Called to handle hits on menu heads. + * Also called from main() with arg 0 in init. */ -/*ARGSUSED*/ -static void -nmg_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) +void +btn_head_menu(struct rt_solid_edit *UNUSED(es), int i, int UNUSED(menu), int UNUSED(item), void *data) { - switch (arg) { - default: - Tcl_AppendResult(s->interp, "nmg_ed: undefined menu event?\n", (char *)NULL); - return; - case ECMD_NMG_EPICK: - case ECMD_NMG_EMOVE: - case ECMD_NMG_ESPLIT: - case ECMD_NMG_EKILL: + struct mged_state *s = (struct mged_state *)data; + switch (i) { + case 0: + mmenu_set(s, MENU_GEN, first_menu); break; - case ECMD_NMG_EDEBUG: - if (!es_eu) { - Tcl_AppendResult(s->interp, "nmg_ed: no edge selected yet\n", (char *)NULL); - return; - } - - nmg_pr_fu_around_eu(es_eu, &s->tol.tol); - - nmg_plot_eu(s->gedp, es_eu, &s->tol.tol, s->vlfree); - - if (*es_eu->up.magic_p == NMG_LOOPUSE_MAGIC) - nmg_veu(&es_eu->up.lu_p->down_hd, es_eu->up.magic_p); - /* no change of state or es_edflag */ - view_state->vs_flag = 1; - return; - case ECMD_NMG_FORW: - if (!es_eu) { - Tcl_AppendResult(s->interp, "nmg_ed: no edge selected yet\n", (char *)NULL); - return; - } - NMG_CK_EDGEUSE(es_eu); - es_eu = BU_LIST_PNEXT_CIRC(edgeuse, es_eu); - - { - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&tmp_vls, "edgeuse selected = %p (%g %g %g) <-> (%g %g %g)\n", - (void *)es_eu, V3ARGS(es_eu->vu_p->v_p->vg_p->coord), - V3ARGS(es_eu->eumate_p->vu_p->v_p->vg_p->coord)); - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); - bu_vls_free(&tmp_vls); - } - - sedit(s); - return; - case ECMD_NMG_BACK: - if (!es_eu) { - bu_log("nmg_ed: no edge selected yet\n"); - return; - } - NMG_CK_EDGEUSE(es_eu); - es_eu = BU_LIST_PPREV_CIRC(edgeuse, es_eu); - - { - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&tmp_vls, "edgeuse selected = %p (%g %g %g) <-> (%g %g %g)\n", - (void *)es_eu, V3ARGS(es_eu->vu_p->v_p->vg_p->coord), - V3ARGS(es_eu->eumate_p->vu_p->v_p->vg_p->coord)); - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); - bu_vls_free(&tmp_vls); - } - - sedit(s); - return; - case ECMD_NMG_RADIAL: - if (!es_eu) { - bu_log("nmg_ed: no edge selected yet\n"); - return; - } - NMG_CK_EDGEUSE(es_eu); - es_eu = es_eu->eumate_p->radial_p; - + case 1: + mmenu_set(s, MENU_GEN, second_menu); + break; + case 2: + /* nothing happens */ + break; + default: { struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - bu_vls_printf(&tmp_vls, "edgeuse selected = %p (%g %g %g) <-> (%g %g %g)\n", - (void *)es_eu, V3ARGS(es_eu->vu_p->v_p->vg_p->coord), - V3ARGS(es_eu->eumate_p->vu_p->v_p->vg_p->coord)); + bu_vls_printf(&tmp_vls, "btn_head_menu(%d): bad arg\n", i); Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); bu_vls_free(&tmp_vls); } - sedit(s); - return; - case ECMD_NMG_LEXTRU: - { - struct model *m, *m_tmp; - struct nmgregion *r, *r_tmp; - struct shell *sh, *s_tmp; - struct loopuse *lu=(struct loopuse *)NULL; - struct loopuse *lu_tmp; - struct edgeuse *eu; - fastf_t area; - int wire_loop_count = 0; - - m = (struct model *)s->edit_state.es_int.idb_ptr; - NMG_CK_MODEL(m); - - /* look for wire loops */ - for (BU_LIST_FOR(r, nmgregion, &m->r_hd)) { - NMG_CK_REGION(r); - for (BU_LIST_FOR(sh, shell, &r->s_hd)) { - if (BU_LIST_IS_EMPTY(&sh->lu_hd)) - continue; - - for (BU_LIST_FOR(lu_tmp, loopuse, &sh->lu_hd)) { - if (!lu) - lu = lu_tmp; - else if (lu_tmp == lu->lumate_p) - continue; - - wire_loop_count++; - } - } - } - - if (!wire_loop_count) { - Tcl_AppendResult(s->interp, "No sketch (wire loop) to extrude\n", - (char *)NULL); - return; - } - - if (wire_loop_count > 1) { - Tcl_AppendResult(s->interp, "Too many wire loops! Don't know which to extrude!\n", (char *)NULL); - return; - } - - if (!lu || *lu->up.magic_p != NMG_SHELL_MAGIC) { - /* This should never happen */ - bu_exit(EXIT_FAILURE, "Cannot find wire loop!\n"); - } - - /* Make sure loop is not a crack */ - area = nmg_loop_plane_area(lu, lu_pl); - - if (area < 0.0) { - Tcl_AppendResult(s->interp, "Cannot extrude loop with no area\n", - (char *)NULL); - return; - } - - /* Check if loop crosses itself */ - for (BU_LIST_FOR(eu, edgeuse, &lu->down_hd)) { - struct edgeuse *eu2; - struct vertex *v1; - vect_t edge1; - - NMG_CK_EDGEUSE(eu); - - v1 = eu->vu_p->v_p; - NMG_CK_VERTEX(v1); - VSUB2(edge1, eu->eumate_p->vu_p->v_p->vg_p->coord, v1->vg_p->coord); - - for (eu2 = BU_LIST_PNEXT(edgeuse, &eu->l); BU_LIST_NOT_HEAD(eu2, &lu->down_hd); eu2=BU_LIST_PNEXT(edgeuse, &eu2->l)) { - struct vertex *v2; - vect_t edge2; - fastf_t dist[2]; - int ret_val; - - NMG_CK_EDGEUSE(eu2); - - if (eu2 == eu) - continue; - if (eu2 == BU_LIST_PNEXT_CIRC(edgeuse, &eu->l)) - continue; - if (eu2 == BU_LIST_PPREV_CIRC(edgeuse, &eu->l)) - continue; - - v2 = eu2->vu_p->v_p; - NMG_CK_VERTEX(v2); - VSUB2(edge2, eu2->eumate_p->vu_p->v_p->vg_p->coord, v2->vg_p->coord); - - if ((ret_val = bg_isect_lseg3_lseg3(dist, v1->vg_p->coord, edge1, - v2->vg_p->coord, edge2, &s->tol.tol)) > (-1)) - { - struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - - bu_vls_printf(&tmp_vls, - "Loop crosses itself, cannot extrude\n"); - bu_vls_printf(&tmp_vls, - "edge1: pt=(%g %g %g), dir=(%g %g %g)\n", - V3ARGS(v1->vg_p->coord), V3ARGS(edge1)); - bu_vls_printf(&tmp_vls, - "edge2: pt=(%g %g %g), dir=(%g %g %g)\n", - V3ARGS(v2->vg_p->coord), V3ARGS(edge2)); - if (ret_val == 0) { - bu_vls_printf(&tmp_vls, - "edges are collinear and overlap\n"); - } else { - point_t isect_pt; - - VJOIN1(isect_pt, v1->vg_p->coord, dist[0], edge1); - bu_vls_printf(&tmp_vls, - "edges intersect at (%g %g %g)\n", - V3ARGS(isect_pt)); - } - - Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), - (char *)NULL); - bu_vls_free(&tmp_vls); - return; - } - } - } - - /* Create a temporary model to store the basis loop */ - m_tmp = nmg_mm(); - r_tmp = nmg_mrsv(m_tmp); - s_tmp = BU_LIST_FIRST(shell, &r_tmp->s_hd); - lu_copy = nmg_dup_loop(lu, &s_tmp->l.magic, (long **)0); - if (!lu_copy) { - Tcl_AppendResult(s->interp, "Failed to make copy of loop\n", (char *)NULL); - nmg_km(m_tmp); - return; - } - - /* Get the first vertex in the loop as the basis for extrusion */ - eu = BU_LIST_FIRST(edgeuse, &lu->down_hd); - VMOVE(lu_keypoint, eu->vu_p->v_p->vg_p->coord); - - sh = lu->up.s_p; - - if (BU_LIST_NON_EMPTY(&sh->fu_hd)) { - /* make a new shell to hold the extruded solid */ - - r = BU_LIST_FIRST(nmgregion, &m->r_hd); - NMG_CK_REGION(r); - es_s = nmg_msv(r); - } else { - es_s = sh; - } - - } - break; - } - /* For example, this will set es_edflag = ECMD_NMG_EPICK */ - es_edflag = arg; - sedit(s); -} -struct menu_item nmg_menu[] = { - { "NMG MENU", NULL, 0 }, - { "Pick Edge", nmg_ed, ECMD_NMG_EPICK }, - { "Move Edge", nmg_ed, ECMD_NMG_EMOVE }, - { "Split Edge", nmg_ed, ECMD_NMG_ESPLIT }, - { "Delete Edge", nmg_ed, ECMD_NMG_EKILL }, - { "Next EU", nmg_ed, ECMD_NMG_FORW }, - { "Prev EU", nmg_ed, ECMD_NMG_BACK }, - { "Radial EU", nmg_ed, ECMD_NMG_RADIAL }, - { "Extrude Loop", nmg_ed, ECMD_NMG_LEXTRU }, - { "Eebug Edge", nmg_ed, ECMD_NMG_EDEBUG }, - { "", NULL, 0 } -}; - -static void -arb8_mv_face(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg - 1; - es_edflag = ECMD_ARB_MOVE_FACE; - if (arg == 7) { - es_edflag = ECMD_ARB_MAIN_MENU; - sedit(s); - } - - set_e_axes_pos(s, 1); -} -struct menu_item mv8_menu[] = { - { "ARB8 FACES", NULL, 0 }, - { "Move Face 1234", arb8_mv_face, 1 }, - { "Move Face 5678", arb8_mv_face, 2 }, - { "Move Face 1584", arb8_mv_face, 3 }, - { "Move Face 2376", arb8_mv_face, 4 }, - { "Move Face 1265", arb8_mv_face, 5 }, - { "Move Face 4378", arb8_mv_face, 6 }, - { "RETURN", arb8_mv_face, 7 }, - { "", NULL, 0 } -}; - -static void -arb7_mv_face(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg - 1; - es_edflag = ECMD_ARB_MOVE_FACE; - if (arg == 7) { - es_edflag = ECMD_ARB_MAIN_MENU; - sedit(s); - } - - set_e_axes_pos(s, 1); -} -struct menu_item mv7_menu[] = { - { "ARB7 FACES", NULL, 0 }, - { "Move Face 1234", arb7_mv_face, 1 }, - { "Move Face 2376", arb7_mv_face, 4 }, - { "RETURN", arb7_mv_face, 7 }, - { "", NULL, 0 } -}; - -static void -arb6_mv_face(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg - 1; - es_edflag = ECMD_ARB_MOVE_FACE; - if (arg == 6) { - es_edflag = ECMD_ARB_MAIN_MENU; - sedit(s); - } - - set_e_axes_pos(s, 1); -} -struct menu_item mv6_menu[] = { - { "ARB6 FACES", NULL, 0 }, - { "Move Face 1234", arb6_mv_face, 1 }, - { "Move Face 2365", arb6_mv_face, 2 }, - { "Move Face 1564", arb6_mv_face, 3 }, - { "Move Face 125", arb6_mv_face, 4 }, - { "Move Face 346", arb6_mv_face, 5 }, - { "RETURN", arb6_mv_face, 6 }, - { "", NULL, 0 } -}; - -static void -arb5_mv_face(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg - 1; - es_edflag = ECMD_ARB_MOVE_FACE; - if (arg == 6) { - es_edflag = ECMD_ARB_MAIN_MENU; - sedit(s); - } - - set_e_axes_pos(s, 1); -} -struct menu_item mv5_menu[] = { - { "ARB5 FACES", NULL, 0 }, - { "Move Face 1234", arb5_mv_face, 1 }, - { "Move Face 125", arb5_mv_face, 2 }, - { "Move Face 235", arb5_mv_face, 3 }, - { "Move Face 345", arb5_mv_face, 4 }, - { "Move Face 145", arb5_mv_face, 5 }, - { "RETURN", arb5_mv_face, 6 }, - { "", NULL, 0 } -}; - -static void -arb4_mv_face(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg - 1; - es_edflag = ECMD_ARB_MOVE_FACE; - if (arg == 5) { - es_edflag = ECMD_ARB_MAIN_MENU; - sedit(s); - } - - set_e_axes_pos(s, 1); -} -struct menu_item mv4_menu[] = { - { "ARB4 FACES", NULL, 0 }, - { "Move Face 123", arb4_mv_face, 1 }, - { "Move Face 124", arb4_mv_face, 2 }, - { "Move Face 234", arb4_mv_face, 3 }, - { "Move Face 134", arb4_mv_face, 4 }, - { "RETURN", arb4_mv_face, 5 }, - { "", NULL, 0 } -}; - -static void -arb8_rot_face(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg - 1; - es_edflag = ECMD_ARB_SETUP_ROTFACE; - if (arg == 7) - es_edflag = ECMD_ARB_MAIN_MENU; - - sedit(s); -} -struct menu_item rot8_menu[] = { - { "ARB8 FACES", NULL, 0 }, - { "Rotate Face 1234", arb8_rot_face, 1 }, - { "Rotate Face 5678", arb8_rot_face, 2 }, - { "Rotate Face 1584", arb8_rot_face, 3 }, - { "Rotate Face 2376", arb8_rot_face, 4 }, - { "Rotate Face 1265", arb8_rot_face, 5 }, - { "Rotate Face 4378", arb8_rot_face, 6 }, - { "RETURN", arb8_rot_face, 7 }, - { "", NULL, 0 } -}; - -static void -arb7_rot_face(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg - 1; - es_edflag = ECMD_ARB_SETUP_ROTFACE; - if (arg == 7) - es_edflag = ECMD_ARB_MAIN_MENU; - - sedit(s); -} -struct menu_item rot7_menu[] = { - { "ARB7 FACES", NULL, 0 }, - { "Rotate Face 1234", arb7_rot_face, 1 }, - { "Rotate Face 567", arb7_rot_face, 2 }, - { "Rotate Face 145", arb7_rot_face, 3 }, - { "Rotate Face 2376", arb7_rot_face, 4 }, - { "Rotate Face 1265", arb7_rot_face, 5 }, - { "Rotate Face 4375", arb7_rot_face, 6 }, - { "RETURN", arb7_rot_face, 7 }, - { "", NULL, 0 } -}; - -static void -arb6_rot_face(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg - 1; - es_edflag = ECMD_ARB_SETUP_ROTFACE; - if (arg == 6) - es_edflag = ECMD_ARB_MAIN_MENU; - - sedit(s); -} -struct menu_item rot6_menu[] = { - { "ARB6 FACES", NULL, 0 }, - { "Rotate Face 1234", arb6_rot_face, 1 }, - { "Rotate Face 2365", arb6_rot_face, 2 }, - { "Rotate Face 1564", arb6_rot_face, 3 }, - { "Rotate Face 125", arb6_rot_face, 4 }, - { "Rotate Face 346", arb6_rot_face, 5 }, - { "RETURN", arb6_rot_face, 6 }, - { "", NULL, 0 } -}; - -static void -arb5_rot_face(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg - 1; - es_edflag = ECMD_ARB_SETUP_ROTFACE; - if (arg == 6) - es_edflag = ECMD_ARB_MAIN_MENU; - - sedit(s); -} - -struct menu_item rot5_menu[] = { - { "ARB5 FACES", NULL, 0 }, - { "Rotate Face 1234", arb5_rot_face, 1 }, - { "Rotate Face 125", arb5_rot_face, 2 }, - { "Rotate Face 235", arb5_rot_face, 3 }, - { "Rotate Face 345", arb5_rot_face, 4 }, - { "Rotate Face 145", arb5_rot_face, 5 }, - { "RETURN", arb5_rot_face, 6 }, - { "", NULL, 0 } -}; - -static void -arb4_rot_face(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg - 1; - es_edflag = ECMD_ARB_SETUP_ROTFACE; - if (arg == 5) - es_edflag = ECMD_ARB_MAIN_MENU; - - sedit(s); -} -struct menu_item rot4_menu[] = { - { "ARB4 FACES", NULL, 0 }, - { "Rotate Face 123", arb4_rot_face, 1 }, - { "Rotate Face 124", arb4_rot_face, 2 }, - { "Rotate Face 234", arb4_rot_face, 3 }, - { "Rotate Face 134", arb4_rot_face, 4 }, - { "RETURN", arb4_rot_face, 5 }, - { "", NULL, 0 } -}; - -static void -arb_control(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = ECMD_ARB_SPECIFIC_MENU; - sedit(s); -} -struct menu_item cntrl_menu[] = { - { "ARB MENU", NULL, 0 }, - { "Move Edges", arb_control, MENU_ARB_MV_EDGE }, - { "Move Faces", arb_control, MENU_ARB_MV_FACE }, - { "Rotate Faces", arb_control, MENU_ARB_ROT_FACE }, - { "", NULL, 0 } -}; - -static void -part_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = PSCALE; - - set_e_axes_pos(s, 1); -} -struct menu_item part_menu[] = { - { "Particle MENU", NULL, 0 }, - { "Set H", part_ed, MENU_PART_H }, - { "Set v", part_ed, MENU_PART_v }, - { "Set h", part_ed, MENU_PART_h }, - { "", NULL, 0 } -}; - -static void -rpc_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = PSCALE; - - set_e_axes_pos(s, 1); -} -struct menu_item rpc_menu[] = { - { "RPC MENU", NULL, 0 }, - { "Set B", rpc_ed, MENU_RPC_B }, - { "Set H", rpc_ed, MENU_RPC_H }, - { "Set r", rpc_ed, MENU_RPC_R }, - { "", NULL, 0 } -}; - -static void -rhc_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = PSCALE; - - set_e_axes_pos(s, 1); -} -struct menu_item rhc_menu[] = { - { "RHC MENU", NULL, 0 }, - { "Set B", rhc_ed, MENU_RHC_B }, - { "Set H", rhc_ed, MENU_RHC_H }, - { "Set r", rhc_ed, MENU_RHC_R }, - { "Set c", rhc_ed, MENU_RHC_C }, - { "", NULL, 0 } -}; - -static void -epa_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = PSCALE; - - set_e_axes_pos(s, 1); -} -struct menu_item epa_menu[] = { - { "EPA MENU", NULL, 0 }, - { "Set H", epa_ed, MENU_EPA_H }, - { "Set A", epa_ed, MENU_EPA_R1 }, - { "Set B", epa_ed, MENU_EPA_R2 }, - { "", NULL, 0 } -}; - -static void -ehy_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = PSCALE; - - set_e_axes_pos(s, 1); -} -struct menu_item ehy_menu[] = { - { "EHY MENU", NULL, 0 }, - { "Set H", ehy_ed, MENU_EHY_H }, - { "Set A", ehy_ed, MENU_EHY_R1 }, - { "Set B", ehy_ed, MENU_EHY_R2 }, - { "Set c", ehy_ed, MENU_EHY_C }, - { "", NULL, 0 } -}; - -static void -hyp_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - switch (arg) { - case MENU_HYP_ROT_H: - es_edflag = ECMD_HYP_ROT_H; - break; - default: - es_edflag = PSCALE; - break; - } - set_e_axes_pos(s, 1); - return; -} -struct menu_item hyp_menu[] = { - { "HYP MENU", NULL, 0 }, - { "Set H", hyp_ed, MENU_HYP_H }, - { "Set A", hyp_ed, MENU_HYP_SCALE_A }, - { "Set B", hyp_ed, MENU_HYP_SCALE_B }, - { "Set c", hyp_ed, MENU_HYP_C }, - { "Rotate H", hyp_ed, MENU_HYP_ROT_H }, - { "", NULL, 0 } -}; - -static void -pipe_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - struct wdb_pipe_pnt *next; - struct wdb_pipe_pnt *prev; - - if (s->dbip == DBI_NULL) - return; - - switch (arg) { - case MENU_PIPE_SELECT: - es_menu = arg; - es_edflag = ECMD_PIPE_PICK; - break; - case MENU_PIPE_NEXT_PT: - if (!es_pipe_pnt) { - Tcl_AppendResult(s->interp, "No Pipe Segment selected\n", (char *)NULL); - return; - } - next = BU_LIST_NEXT(wdb_pipe_pnt, &es_pipe_pnt->l); - if (next->l.magic == BU_LIST_HEAD_MAGIC) { - Tcl_AppendResult(s->interp, "Current segment is the last\n", (char *)NULL); - return; - } - es_pipe_pnt = next; - rt_pipe_pnt_print(es_pipe_pnt, s->dbip->dbi_base2local); - es_menu = arg; - es_edflag = IDLE; - sedit(s); - break; - case MENU_PIPE_PREV_PT: - if (!es_pipe_pnt) { - Tcl_AppendResult(s->interp, "No Pipe Segment selected\n", (char *)NULL); - return; - } - prev = BU_LIST_PREV(wdb_pipe_pnt, &es_pipe_pnt->l); - if (prev->l.magic == BU_LIST_HEAD_MAGIC) { - Tcl_AppendResult(s->interp, "Current segment is the first\n", (char *)NULL); - return; - } - es_pipe_pnt = prev; - rt_pipe_pnt_print(es_pipe_pnt, s->dbip->dbi_base2local); - es_menu = arg; - es_edflag = IDLE; - sedit(s); - break; - case MENU_PIPE_SPLIT: - /* not used */ - break; - case MENU_PIPE_MOV_PT: - if (!es_pipe_pnt) { - Tcl_AppendResult(s->interp, "No Pipe Segment selected\n", (char *)NULL); - es_edflag = IDLE; - return; - } - es_menu = arg; - es_edflag = ECMD_PIPE_PT_MOVE; - break; - case MENU_PIPE_PT_OD: - case MENU_PIPE_PT_ID: - case MENU_PIPE_PT_RADIUS: - if (!es_pipe_pnt) { - Tcl_AppendResult(s->interp, "No Pipe Segment selected\n", (char *)NULL); - es_edflag = IDLE; - return; - } - es_menu = arg; - es_edflag = PSCALE; - break; - case MENU_PIPE_SCALE_OD: - case MENU_PIPE_SCALE_ID: - case MENU_PIPE_SCALE_RADIUS: - es_menu = arg; - es_edflag = PSCALE; - break; - case MENU_PIPE_ADD_PT: - es_menu = arg; - es_edflag = ECMD_PIPE_PT_ADD; - break; - case MENU_PIPE_INS_PT: - es_menu = arg; - es_edflag = ECMD_PIPE_PT_INS; - break; - case MENU_PIPE_DEL_PT: - es_menu = arg; - es_edflag = ECMD_PIPE_PT_DEL; - sedit(s); - break; - } - set_e_axes_pos(s, 1); -} - - -struct menu_item pipe_menu[] = { - { "PIPE MENU", NULL, 0 }, - { "Select Point", pipe_ed, MENU_PIPE_SELECT }, - { "Next Point", pipe_ed, MENU_PIPE_NEXT_PT }, - { "Previous Point", pipe_ed, MENU_PIPE_PREV_PT }, - { "Move Point", pipe_ed, MENU_PIPE_MOV_PT }, - { "Delete Point", pipe_ed, MENU_PIPE_DEL_PT }, - { "Append Point", pipe_ed, MENU_PIPE_ADD_PT }, - { "Prepend Point", pipe_ed, MENU_PIPE_INS_PT }, - { "Set Point OD", pipe_ed, MENU_PIPE_PT_OD }, - { "Set Point ID", pipe_ed, MENU_PIPE_PT_ID }, - { "Set Point Bend", pipe_ed, MENU_PIPE_PT_RADIUS }, - { "Set Pipe OD", pipe_ed, MENU_PIPE_SCALE_OD }, - { "Set Pipe ID", pipe_ed, MENU_PIPE_SCALE_ID }, - { "Set Pipe Bend", pipe_ed, MENU_PIPE_SCALE_RADIUS }, - { "", NULL, 0 } -}; - - -static void -vol_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - - switch (arg) { - case MENU_VOL_FNAME: - es_edflag = ECMD_VOL_FNAME; - break; - case MENU_VOL_FSIZE: - es_edflag = ECMD_VOL_FSIZE; - break; - case MENU_VOL_CSIZE: - es_edflag = ECMD_VOL_CSIZE; - break; - case MENU_VOL_THRESH_LO: - es_edflag = ECMD_VOL_THRESH_LO; - break; - case MENU_VOL_THRESH_HI: - es_edflag = ECMD_VOL_THRESH_HI; break; } - - sedit(s); - set_e_axes_pos(s, 1); } -struct menu_item vol_menu[] = { - {"VOL MENU", NULL, 0 }, - {"File Name", vol_ed, MENU_VOL_FNAME }, - {"File Size (X Y Z)", vol_ed, MENU_VOL_FSIZE }, - {"Voxel Size (X Y Z)", vol_ed, MENU_VOL_CSIZE }, - {"Threshold (low)", vol_ed, MENU_VOL_THRESH_LO }, - {"Threshold (hi)", vol_ed, MENU_VOL_THRESH_HI }, - { "", NULL, 0 } -}; - -static void -ebm_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - - switch (arg) { - case MENU_EBM_FNAME: - es_edflag = ECMD_EBM_FNAME; - break; - case MENU_EBM_FSIZE: - es_edflag = ECMD_EBM_FSIZE; - break; - case MENU_EBM_HEIGHT: - es_edflag = ECMD_EBM_HEIGHT; - break; - } - - sedit(s); - set_e_axes_pos(s, 1); -} -struct menu_item ebm_menu[] = { - {"EBM MENU", NULL, 0 }, - {"File Name", ebm_ed, MENU_EBM_FNAME }, - {"File Size (W N)", ebm_ed, MENU_EBM_FSIZE }, - {"Extrude Depth", ebm_ed, MENU_EBM_HEIGHT }, - { "", NULL, 0 } -}; - -static void -dsp_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - - switch (arg) { - case MENU_DSP_FNAME: - es_edflag = ECMD_DSP_FNAME; - break; - case MENU_DSP_FSIZE: - es_edflag = ECMD_DSP_FSIZE; - break; - case MENU_DSP_SCALE_X: - es_edflag = ECMD_DSP_SCALE_X; +void +chg_l2menu(struct mged_state *s, int i) { + switch (i) { + case ST_S_EDIT: + mmenu_set_all(s, MENU_L2, sed_menu); break; - case MENU_DSP_SCALE_Y: - es_edflag = ECMD_DSP_SCALE_Y; + case ST_S_NO_EDIT: + mmenu_set_all(s, MENU_L2, NULL); break; - case MENU_DSP_SCALE_ALT: - es_edflag = ECMD_DSP_SCALE_ALT; + case ST_O_EDIT: + mmenu_set_all(s, MENU_L2, oed_menu); break; - } - sedit(s); - set_e_axes_pos(s, 1); -} -struct menu_item dsp_menu[] = { - {"DSP MENU", NULL, 0 }, - {"Name", dsp_ed, MENU_DSP_FNAME }, - {"Set X", dsp_ed, MENU_DSP_SCALE_X }, - {"Set Y", dsp_ed, MENU_DSP_SCALE_Y }, - {"Set ALT", dsp_ed, MENU_DSP_SCALE_ALT }, - { "", NULL, 0 } -}; - -static void -bot_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - es_menu = arg; - es_edflag = arg; - - sedit(s); - set_e_axes_pos(s, 1); -} -struct menu_item bot_menu[] = { - { "BOT MENU", NULL, 0 }, - { "Pick Vertex", bot_ed, ECMD_BOT_PICKV }, - { "Pick Edge", bot_ed, ECMD_BOT_PICKE }, - { "Pick Triangle", bot_ed, ECMD_BOT_PICKT }, - { "Move Vertex", bot_ed, ECMD_BOT_MOVEV }, - { "Move Edge", bot_ed, ECMD_BOT_MOVEE }, - { "Move Triangle", bot_ed, ECMD_BOT_MOVET }, - { "Delete Triangle", bot_ed, ECMD_BOT_FDEL }, - { "Select Mode", bot_ed, ECMD_BOT_MODE }, - { "Select Orientation", bot_ed, ECMD_BOT_ORIENT }, - { "Set flags", bot_ed, ECMD_BOT_FLAGS }, - { "Set Face Thickness", bot_ed, ECMD_BOT_THICK }, - { "Set Face Mode", bot_ed, ECMD_BOT_FMODE }, - { "", NULL, 0 } -}; - -static void -superell_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) { - es_menu = arg; - es_edflag = PSCALE; - set_e_axes_pos(s, 1); - return; -} -struct menu_item superell_menu[] = { - { "SUPERELLIPSOID MENU", NULL, 0 }, - { "Set A", superell_ed, MENU_SUPERELL_SCALE_A }, - { "Set B", superell_ed, MENU_SUPERELL_SCALE_B }, - { "Set C", superell_ed, MENU_SUPERELL_SCALE_C }, - { "Set A,B,C", superell_ed, MENU_SUPERELL_SCALE_ABC }, - { "", NULL, 0 } -}; - -static void -metaball_ed(struct mged_state *s, int arg, int UNUSED(a), int UNUSED(b)) -{ - struct wdb_metaball_pnt *next, *prev; - - if (s->dbip == DBI_NULL) - return; + default: + { + struct bu_vls tmp_vls = BU_VLS_INIT_ZERO; - switch (arg) { - case MENU_METABALL_SET_THRESHOLD: - es_menu = arg; - es_edflag = PSCALE; - break; - case MENU_METABALL_SET_METHOD: - es_menu = arg; - es_edflag = PSCALE; - break; - case MENU_METABALL_PT_SET_GOO: - es_menu = arg; - es_edflag = PSCALE; - break; - case MENU_METABALL_SELECT: - es_menu = arg; - es_edflag = ECMD_METABALL_PT_PICK; - break; - case MENU_METABALL_NEXT_PT: - if (!es_metaball_pnt) { - Tcl_AppendResult(s->interp, "No Metaball Point selected\n", (char *)NULL); - return; - } - next = BU_LIST_NEXT(wdb_metaball_pnt, &es_metaball_pnt->l); - if (next->l.magic == BU_LIST_HEAD_MAGIC) { - Tcl_AppendResult(s->interp, "Current point is the last\n", (char *)NULL); - return; - } - es_metaball_pnt = next; - rt_metaball_pnt_print(es_metaball_pnt, s->dbip->dbi_base2local); - es_menu = arg; - es_edflag = IDLE; - sedit(s); - break; - case MENU_METABALL_PREV_PT: - if (!es_metaball_pnt) { - Tcl_AppendResult(s->interp, "No Metaball Point selected\n", (char *)NULL); - return; - } - prev = BU_LIST_PREV(wdb_metaball_pnt, &es_metaball_pnt->l); - if (prev->l.magic == BU_LIST_HEAD_MAGIC) { - Tcl_AppendResult(s->interp, "Current point is the first\n", (char *)NULL); - return; - } - es_metaball_pnt = prev; - rt_metaball_pnt_print(es_metaball_pnt, s->dbip->dbi_base2local); - es_menu = arg; - es_edflag = IDLE; - sedit(s); - break; - case MENU_METABALL_MOV_PT: - if (!es_metaball_pnt) { - Tcl_AppendResult(s->interp, "No Metaball Point selected\n", (char *)NULL); - es_edflag = IDLE; - return; - } - es_menu = arg; - es_edflag = ECMD_METABALL_PT_MOV; - sedit(s); - break; - case MENU_METABALL_PT_FLDSTR: - if (!es_metaball_pnt) { - Tcl_AppendResult(s->interp, "No Metaball Point selected\n", (char *)NULL); - es_edflag = IDLE; - return; + bu_vls_printf(&tmp_vls, "chg_l2menu(%d): bad arg\n", i); + Tcl_AppendResult(s->interp, bu_vls_addr(&tmp_vls), (char *)NULL); + bu_vls_free(&tmp_vls); } - es_menu = arg; - es_edflag = PSCALE; - break; - case MENU_METABALL_DEL_PT: - es_menu = arg; - es_edflag = ECMD_METABALL_PT_DEL; - sedit(s); - break; - case MENU_METABALL_ADD_PT: - es_menu = arg; - es_edflag = ECMD_METABALL_PT_ADD; + break; } - set_e_axes_pos(s, 1); - return; } -struct menu_item metaball_menu[] = { - { "METABALL MENU", NULL, 0 }, - { "Set Threshold", metaball_ed, MENU_METABALL_SET_THRESHOLD }, - { "Set Render Method", metaball_ed, MENU_METABALL_SET_METHOD }, - { "Select Point", metaball_ed, MENU_METABALL_SELECT }, - { "Next Point", metaball_ed, MENU_METABALL_NEXT_PT }, - { "Previous Point", metaball_ed, MENU_METABALL_PREV_PT }, - { "Move Point", metaball_ed, MENU_METABALL_MOV_PT }, - { "Scale Point fldstr", metaball_ed, MENU_METABALL_PT_FLDSTR }, - { "Scale Point \"goo\" value", metaball_ed, MENU_METABALL_PT_SET_GOO }, - { "Delete Point", metaball_ed, MENU_METABALL_DEL_PT }, - { "Add Point", metaball_ed, MENU_METABALL_ADD_PT }, - { "", NULL, 0 } -}; - - -struct menu_item *which_menu[] = { - point4_menu, - edge5_menu, - edge6_menu, - edge7_menu, - edge8_menu, - mv4_menu, - mv5_menu, - mv6_menu, - mv7_menu, - mv8_menu, - rot4_menu, - rot5_menu, - rot6_menu, - rot7_menu, - rot8_menu -}; -extern struct menu_item second_menu[], sed_menu[]; int cmd_mmenu_get(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) @@ -1370,7 +180,7 @@ cmd_mmenu_get(ClientData clientData, Tcl_Interp *interp, int argc, const char *a } if (argc == 2) { - struct menu_item **m, *mptr; + struct rt_solid_edit_menu_item **m, *mptr; if (Tcl_GetInt(interp, argv[1], &index) != TCL_OK) return TCL_ERROR; @@ -1387,7 +197,7 @@ cmd_mmenu_get(ClientData clientData, Tcl_Interp *interp, int argc, const char *a for (mptr = *m; mptr->menu_string[0] != '\0'; mptr++) Tcl_AppendElement(interp, mptr->menu_string); } else { - struct menu_item **m; + struct rt_solid_edit_menu_item **m; struct bu_vls result = BU_VLS_INIT_ZERO; int status; @@ -1418,8 +228,46 @@ mmenu_init(struct mged_state *s) } +int +mged_mmenu_set(int UNUSED(ac), const char **UNUSED(av), void *d, void *ms) +{ + struct mged_state *s = (struct mged_state *)d; + struct rt_solid_edit_menu_item *value = (struct rt_solid_edit_menu_item *)ms; + int index = MENU_L1; + + // All uses of mmenu_set in primitives did this, so just do it here instead. + menu_state->ms_flag = 0; + + Tcl_DString ds_menu; + struct bu_vls menu_string = BU_VLS_INIT_ZERO; + + menu_state->ms_menus[index] = value; /* Change the menu internally */ + + Tcl_DStringInit(&ds_menu); + + bu_vls_printf(&menu_string, "mmenu_set %s %d ", bu_vls_addr(&curr_cmd_list->cl_name), index); + + (void)Tcl_Eval(s->interp, bu_vls_addr(&menu_string)); + + Tcl_DStringFree(&ds_menu); + bu_vls_free(&menu_string); + + for (size_t di = 0; di < BU_PTBL_LEN(&active_dm_set); di++) { + struct mged_dm *dlp = (struct mged_dm *)BU_PTBL_GET(&active_dm_set, di); + if (menu_state == dlp->dm_menu_state && + dlp->dm_mged_variables->mv_faceplate && + dlp->dm_mged_variables->mv_orig_gui) { + dlp->dm_dirty = 1; + dm_set_dirty(dlp->dm_dmp, 1); + } + } + + return TCL_OK; +} + + void -mmenu_set(struct mged_state *s, int index, struct menu_item *value) +mmenu_set(struct mged_state *s, int index, struct rt_solid_edit_menu_item *value) { Tcl_DString ds_menu; struct bu_vls menu_string = BU_VLS_INIT_ZERO; @@ -1448,7 +296,7 @@ mmenu_set(struct mged_state *s, int index, struct menu_item *value) void -mmenu_set_all(struct mged_state *s, int index, struct menu_item *value) +mmenu_set_all(struct mged_state *s, int index, struct rt_solid_edit_menu_item *value) { struct cmd_list *save_cmd_list; struct mged_dm *save_dm_list; @@ -1470,7 +318,7 @@ mmenu_set_all(struct mged_state *s, int index, struct menu_item *value) void -mged_highlight_menu_item(struct mged_state *s, struct menu_item *mptr, int y) +mged_highlight_menu_item(struct mged_state *s, struct rt_solid_edit_menu_item *mptr, int y) { switch (mptr->menu_arg) { case BV_RATE_TOGGLE: @@ -1517,8 +365,8 @@ void mmenu_display(struct mged_state *s, int y_top) { static int menu, item; - struct menu_item **m; - struct menu_item *mptr; + struct rt_solid_edit_menu_item **m; + struct rt_solid_edit_menu_item *mptr; int y = y_top; menu_state->ms_top = y - MENU_DY / 2; @@ -1536,7 +384,7 @@ mmenu_display(struct mged_state *s, int y_top) for (menu=0, m = menu_state->ms_menus; m - menu_state->ms_menus < NMENU; m++, menu++) { if (*m == NULL) continue; for (item=0, mptr = *m; mptr->menu_string[0] != '\0' && y > TITLE_YBASE; mptr++, y += MENU_DY, item++) { - if ((*m == (struct menu_item *)second_menu + if ((*m == (struct rt_solid_edit_menu_item *)second_menu && (mptr->menu_arg == BV_RATE_TOGGLE || mptr->menu_arg == BV_EDIT_TOGGLE || mptr->menu_arg == BV_EYEROT_TOGGLE))) @@ -1602,8 +450,8 @@ int mmenu_select(struct mged_state *s, int pen_y, int do_func) { static int menu, item; - struct menu_item **m; - struct menu_item *mptr; + struct rt_solid_edit_menu_item **m; + struct rt_solid_edit_menu_item *mptr; int yy; if (pen_y > menu_state->ms_top) @@ -1629,7 +477,7 @@ mmenu_select(struct mged_state *s, int pen_y, int do_func) /* It's up to the menu_func to set menu_state->ms_flag=0 * if no arrow is desired */ if (do_func && mptr->menu_func != NULL) - (*(mptr->menu_func))(s, mptr->menu_arg, menu, item); + (*(mptr->menu_func))(s->s_edit, mptr->menu_arg, menu, item, s); return 1; /* menu claims pen value */ } diff --git a/src/mged/menu.h b/src/mged/menu.h index 108ac666f2..b0f37edebd 100644 --- a/src/mged/menu.h +++ b/src/mged/menu.h @@ -24,170 +24,52 @@ #define MGED_MENU_H #include "common.h" -#include "mged.h" +#include "rt/edit.h" -/* These values end up in es_menu, as do ARB vertex numbers */ -#define MENU_TOR_R1 21 -#define MENU_TOR_R2 22 -#define MENU_TGC_ROT_H 23 -#define MENU_TGC_ROT_AB 24 -#define MENU_TGC_MV_H 25 -#define MENU_TGC_MV_HH 26 -#define MENU_TGC_SCALE_H 27 -#define MENU_TGC_SCALE_H_V 28 -#define MENU_TGC_SCALE_A 29 -#define MENU_TGC_SCALE_B 30 -#define MENU_TGC_SCALE_C 31 -#define MENU_TGC_SCALE_D 32 -#define MENU_TGC_SCALE_AB 33 -#define MENU_TGC_SCALE_CD 34 -#define MENU_TGC_SCALE_ABCD 35 -#define MENU_ARB_MV_EDGE 36 -#define MENU_ARB_MV_FACE 37 -#define MENU_ARB_ROT_FACE 38 -#define MENU_ELL_SCALE_A 39 -#define MENU_ELL_SCALE_B 40 -#define MENU_ELL_SCALE_C 41 -#define MENU_ELL_SCALE_ABC 42 -#define MENU_RPC_B 43 -#define MENU_RPC_H 44 -#define MENU_RPC_R 45 -#define MENU_RHC_B 46 -#define MENU_RHC_H 47 -#define MENU_RHC_R 48 -#define MENU_RHC_C 49 -#define MENU_EPA_H 50 -#define MENU_EPA_R1 51 -#define MENU_EPA_R2 52 -#define MENU_EHY_H 53 -#define MENU_EHY_R1 54 -#define MENU_EHY_R2 55 -#define MENU_EHY_C 56 -#define MENU_ETO_R 57 -#define MENU_ETO_RD 58 -#define MENU_ETO_SCALE_C 59 -#define MENU_ETO_ROT_C 60 -#define MENU_PIPE_SELECT 61 -#define MENU_PIPE_NEXT_PT 62 -#define MENU_PIPE_PREV_PT 63 -#define MENU_PIPE_SPLIT 64 -#define MENU_PIPE_PT_OD 65 -#define MENU_PIPE_PT_ID 66 -#define MENU_PIPE_SCALE_OD 67 -#define MENU_PIPE_SCALE_ID 68 -#define MENU_PIPE_ADD_PT 69 -#define MENU_PIPE_INS_PT 70 -#define MENU_PIPE_DEL_PT 71 -#define MENU_PIPE_MOV_PT 72 -#define MENU_PIPE_PT_RADIUS 73 -#define MENU_PIPE_SCALE_RADIUS 74 -#define MENU_VOL_FNAME 75 -#define MENU_VOL_FSIZE 76 -#define MENU_VOL_CSIZE 77 -#define MENU_VOL_THRESH_LO 78 -#define MENU_VOL_THRESH_HI 79 -#define MENU_EBM_FNAME 80 -#define MENU_EBM_FSIZE 81 -#define MENU_EBM_HEIGHT 82 -#define MENU_DSP_FNAME 83 -#define MENU_DSP_FSIZE 84 /* Not implemented yet */ -#define MENU_DSP_SCALE_X 85 -#define MENU_DSP_SCALE_Y 86 -#define MENU_DSP_SCALE_ALT 87 -#define MENU_PART_H 88 -#define MENU_PART_v 89 -#define MENU_PART_h 90 -#define MENU_BOT_PICKV 91 -#define MENU_BOT_PICKE 92 -#define MENU_BOT_PICKT 93 -#define MENU_BOT_MOVEV 94 -#define MENU_BOT_MOVEE 95 -#define MENU_BOT_MOVET 96 -#define MENU_BOT_MODE 97 -#define MENU_BOT_ORIENT 98 -#define MENU_BOT_THICK 99 -#define MENU_BOT_FMODE 100 -#define MENU_BOT_DELETE_TRI 101 -#define MENU_BOT_FLAGS 102 -#define MENU_EXTR_SCALE_H 103 -#define MENU_EXTR_MOV_H 104 -#define MENU_EXTR_ROT_H 105 -#define MENU_EXTR_SKT_NAME 106 -#define MENU_CLINE_SCALE_H 107 -#define MENU_CLINE_MOVE_H 108 -#define MENU_CLINE_SCALE_R 109 -#define MENU_CLINE_SCALE_T 110 -#define MENU_TGC_SCALE_H_CD 111 -#define MENU_TGC_SCALE_H_V_AB 112 -#define MENU_SUPERELL_SCALE_A 113 -#define MENU_SUPERELL_SCALE_B 114 -#define MENU_SUPERELL_SCALE_C 115 -#define MENU_SUPERELL_SCALE_ABC 116 -#define MENU_METABALL_SET_THRESHOLD 117 -#define MENU_METABALL_SET_METHOD 118 -#define MENU_METABALL_PT_SET_GOO 119 -#define MENU_METABALL_SELECT 120 -#define MENU_METABALL_NEXT_PT 121 -#define MENU_METABALL_PREV_PT 122 -#define MENU_METABALL_MOV_PT 123 -#define MENU_METABALL_PT_FLDSTR 124 -#define MENU_METABALL_DEL_PT 125 -#define MENU_METABALL_ADD_PT 126 -#define MENU_HYP_H 127 -#define MENU_HYP_SCALE_A 128 -#define MENU_HYP_SCALE_B 129 -#define MENU_HYP_C 130 -#define MENU_HYP_ROT_H 131 +__BEGIN_DECLS -extern struct menu_item ars_menu[]; -extern struct menu_item ars_pick_menu[]; -extern struct menu_item bot_menu[]; -extern struct menu_item cline_menu[]; -extern struct menu_item cntrl_menu[]; -extern struct menu_item dsp_menu[]; -extern struct menu_item ebm_menu[]; -extern struct menu_item ehy_menu[]; -extern struct menu_item ell_menu[]; -extern struct menu_item epa_menu[]; -extern struct menu_item eto_menu[]; -extern struct menu_item extr_menu[]; -extern struct menu_item hyp_menu[]; -extern struct menu_item metaball_menu[]; -extern struct menu_item nmg_menu[]; -extern struct menu_item part_menu[]; -extern struct menu_item pipe_menu[]; -extern struct menu_item rhc_menu[]; -extern struct menu_item rpc_menu[]; -extern struct menu_item spline_menu[]; -extern struct menu_item superell_menu[]; -extern struct menu_item tgc_menu[]; -extern struct menu_item tor_menu[]; -extern struct menu_item vol_menu[]; +/* Menu structures and defines + * + * Each active menu is installed by having a non-null entry in + * menu_array[] which is a pointer + * to an array of menu items. The first ([0]) menu item is the title + * for the menu, and the remaining items are individual menu entries. + */ + +#define NMENU 3 +#define MENU_L1 0 /* top-level solid-edit menu */ +#define MENU_L2 1 /* second-level menu */ +#define MENU_GEN 2 /* general features (mouse buttons) */ + +#define MENUXLIM (-1250) /* Value to set X lim to for menu */ +#define MENUX (-2048+115) /* pixel position for menu, X */ +#define MENUY 1780 /* pixel position for menu, Y */ +#define SCROLLY (2047) /* starting Y pos for scroll area */ +#define MENU_DY (-104) /* Distance between menu items */ +#define SCROLL_DY (-100) /* Distance between scrollers */ -extern struct menu_item point4_menu[]; -extern struct menu_item edge5_menu[]; -extern struct menu_item edge6_menu[]; -extern struct menu_item edge7_menu[]; -extern struct menu_item edge8_menu[]; -extern struct menu_item mv4_menu[]; -extern struct menu_item mv5_menu[]; -extern struct menu_item mv6_menu[]; -extern struct menu_item mv7_menu[]; -extern struct menu_item mv8_menu[]; -extern struct menu_item rot4_menu[]; -extern struct menu_item rot5_menu[]; -extern struct menu_item rot6_menu[]; -extern struct menu_item rot7_menu[]; -extern struct menu_item rot8_menu[]; -extern struct menu_item *which_menu[]; +#define TITLE_XBASE (-2048) /* pixel X of title line start pos */ +#define TITLE_YBASE (-1920) /* pixel pos of last title line */ +#define SOLID_XBASE MENUXLIM /* X to start display text */ +#define SOLID_YBASE (1920) /* pixel pos of first solid line */ +#define TEXT0_DY (-60) /* #pixels per line, Size 0 */ +#define TEXT1_DY (-90) /* #pixels per line, Size 1 */ + +extern struct rt_solid_edit_menu_item sed_menu[]; +extern struct rt_solid_edit_menu_item oed_menu[]; + +void btn_head_menu(struct rt_solid_edit *s, int i, int menu, int item, void *data); +void chg_l2menu(struct mged_state *s, int i); extern void mmenu_init(struct mged_state *s); extern void mmenu_display(struct mged_state *s, int y_top); -extern void mmenu_set(struct mged_state *s, int idx, struct menu_item *value); -extern void mmenu_set_all(struct mged_state *s, int idx, struct menu_item *value); +extern void mmenu_set(struct mged_state *s, int idx, struct rt_solid_edit_menu_item *value); +extern void mmenu_set_all(struct mged_state *s, int idx, struct rt_solid_edit_menu_item *value); extern void sedit_menu(struct mged_state *s); extern int mmenu_select(struct mged_state *s, int pen_y, int do_func); +__END_DECLS + #endif /* MGED_MGED_H */ /* diff --git a/src/mged/mged.c b/src/mged/mged.c index a8bf2f8b04..840965bb43 100644 --- a/src/mged/mged.c +++ b/src/mged/mged.c @@ -103,21 +103,27 @@ extern struct bu_vls *history_prev(const char *); extern struct bu_vls *history_cur(const char *); extern struct bu_vls *history_next(const char *); +/* Ew. Global. */ /* defined in dozoom.c */ extern unsigned char geometry_default_color[]; +/* Ew. Global. */ /* defined in set.c */ extern struct _mged_variables default_mged_variables; +/* Ew. Global. */ /* defined in color_scheme.c */ extern struct _color_scheme default_color_scheme; +/* Ew. Global. */ /* defined in grid.c */ extern struct bv_grid_state default_grid_state; +/* Ew. Global. */ /* defined in axes.c */ extern struct _axes_state default_axes_state; +/* Ew. Global. */ /* defined in rect.c */ extern struct _rubber_band default_rubber_band; @@ -126,6 +132,7 @@ extern struct _rubber_band default_rubber_band; * when we're done (which is needed so atexit() calls to bu_log() will * still work). */ +/* Ew. Global. */ static int stdfd[2] = {1, 2}; /* Container for passing I/O data through Tcl callbacks */ @@ -137,22 +144,21 @@ struct stdio_data { struct mged_state *MGED_STATE = NULL; -/* called by numerous functions to indicate truthfully whether the - * views need to be redrawn. - */ -int update_views = 0; - jmp_buf jmp_env; /* For non-local gotos */ +/* Ew. Global. */ double frametime; /* time needed to draw last frame */ +/* Ew. Global. */ struct rt_wdb rtg_headwdb; /* head of database object list */ void (*cur_sigint)(int); /* Current SIGINT status */ +/* Ew. Global. */ int cbreak_mode = 0; /* >0 means in cbreak_mode */ /* The old mged gui is temporarily the default. */ +/* Ew. Global. */ int old_mged_gui=1; static int @@ -307,7 +313,7 @@ new_edit_mats(struct mged_state *s) continue; set_curr_dm(s, p); - bn_mat_mul(view_state->vs_model2objview, view_state->vs_gvp->gv_model2view, modelchanges); + bn_mat_mul(view_state->vs_model2objview, view_state->vs_gvp->gv_model2view, s->s_edit->model_changes); bn_mat_inv(view_state->vs_objview2model, view_state->vs_model2objview); view_state->vs_flag = 1; } @@ -326,9 +332,11 @@ mged_view_callback(struct bview *gvp, if (!gvp) return; - if (GEOM_EDIT_STATE != ST_VIEW) { - bn_mat_mul(vsp->vs_model2objview, gvp->gv_model2view, modelchanges); - bn_mat_inv(vsp->vs_objview2model, vsp->vs_model2objview); + if (s->edit_state.global_editing_state != ST_VIEW) { + if (s->s_edit) { + bn_mat_mul(vsp->vs_model2objview, gvp->gv_model2view, s->s_edit->model_changes); + bn_mat_inv(vsp->vs_objview2model, vsp->vs_model2objview); + } } vsp->vs_flag = 1; dm_set_dirty(s->mged_curr_dm->dm_dmp, 1); @@ -977,7 +985,11 @@ int event_check(struct mged_state *s, int non_blocking) { struct mged_dm *save_dm_list; - int save_edflag; + int save_edflag = 0; + int save_rot = 0; + int save_tra = 0; + int save_sca = 0; + int save_pic = 0; /* Let cool Tk event handler do most of the work */ @@ -1016,10 +1028,14 @@ event_check(struct mged_state *s, int non_blocking) save_coords = mged_variables->mv_coords; mged_variables->mv_coords = 'm'; - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_ROTATE) - es_edflag = SROT; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_ROT); } else { save_edflag = edobj; edobj = BE_O_ROTATE; @@ -1037,10 +1053,15 @@ event_check(struct mged_state *s, int non_blocking) mged_variables->mv_coords = save_coords; - if (GEOM_EDIT_STATE == ST_S_EDIT) - es_edflag = save_edflag; - else + if (s->edit_state.global_editing_state == ST_S_EDIT) { + s->s_edit->edit_flag = save_edflag; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; + } else { edobj = save_edflag; + } } if (s->edit_state.edit_rateflag_object_rotate) { struct bu_vls vls = BU_VLS_INIT_ZERO; @@ -1050,10 +1071,14 @@ event_check(struct mged_state *s, int non_blocking) save_coords = mged_variables->mv_coords; mged_variables->mv_coords = 'o'; - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_ROTATE) - es_edflag = SROT; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_ROT); } else { save_edflag = edobj; edobj = BE_O_ROTATE; @@ -1071,10 +1096,15 @@ event_check(struct mged_state *s, int non_blocking) mged_variables->mv_coords = save_coords; - if (GEOM_EDIT_STATE == ST_S_EDIT) - es_edflag = save_edflag; - else + if (s->edit_state.global_editing_state == ST_S_EDIT) { + s->s_edit->edit_flag = save_edflag; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; + } else { edobj = save_edflag; + } } if (s->edit_state.edit_rateflag_view_rotate) { struct bu_vls vls = BU_VLS_INIT_ZERO; @@ -1084,10 +1114,14 @@ event_check(struct mged_state *s, int non_blocking) save_coords = mged_variables->mv_coords; mged_variables->mv_coords = 'v'; - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_ROTATE) - es_edflag = SROT; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_ROT); } else { save_edflag = edobj; edobj = BE_O_ROTATE; @@ -1105,10 +1139,15 @@ event_check(struct mged_state *s, int non_blocking) mged_variables->mv_coords = save_coords; - if (GEOM_EDIT_STATE == ST_S_EDIT) - es_edflag = save_edflag; - else + if (s->edit_state.global_editing_state == ST_S_EDIT) { + s->s_edit->edit_flag = save_edflag; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; + } else { edobj = save_edflag; + } } if (s->edit_state.edit_rateflag_model_tran) { char save_coords; @@ -1118,10 +1157,14 @@ event_check(struct mged_state *s, int non_blocking) save_coords = mged_variables->mv_coords; mged_variables->mv_coords = 'm'; - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_TRAN) - es_edflag = STRANS; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_TRANS); } else { save_edflag = edobj; edobj = BE_O_XY; @@ -1138,10 +1181,15 @@ event_check(struct mged_state *s, int non_blocking) mged_variables->mv_coords = save_coords; - if (GEOM_EDIT_STATE == ST_S_EDIT) - es_edflag = save_edflag; - else + if (s->edit_state.global_editing_state == ST_S_EDIT) { + s->s_edit->edit_flag = save_edflag; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; + } else { edobj = save_edflag; + } } if (s->edit_state.edit_rateflag_view_tran) { char save_coords; @@ -1151,10 +1199,14 @@ event_check(struct mged_state *s, int non_blocking) save_coords = mged_variables->mv_coords; mged_variables->mv_coords = 'v'; - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_TRAN) - es_edflag = STRANS; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_TRANS); } else { save_edflag = edobj; edobj = BE_O_XY; @@ -1171,18 +1223,27 @@ event_check(struct mged_state *s, int non_blocking) mged_variables->mv_coords = save_coords; - if (GEOM_EDIT_STATE == ST_S_EDIT) - es_edflag = save_edflag; - else + if (s->edit_state.global_editing_state == ST_S_EDIT) { + s->s_edit->edit_flag = save_edflag; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; + } else { edobj = save_edflag; + } } if (s->edit_state.edit_rateflag_scale) { struct bu_vls vls = BU_VLS_INIT_ZERO; - if (GEOM_EDIT_STATE == ST_S_EDIT) { - save_edflag = es_edflag; + if (s->edit_state.global_editing_state == ST_S_EDIT) { + save_edflag = s->s_edit->edit_flag; + save_rot = s->s_edit->solid_edit_rotate; + save_tra = s->s_edit->solid_edit_translate; + save_sca = s->s_edit->solid_edit_scale; + save_pic = s->s_edit->solid_edit_pick; if (!SEDIT_SCALE) - es_edflag = SSCALE; + rt_solid_edit_set_edflag(s->s_edit, RT_SOLID_EDIT_SCALE); } else { save_edflag = edobj; if (!OEDIT_SCALE) @@ -1195,10 +1256,15 @@ event_check(struct mged_state *s, int non_blocking) Tcl_Eval(s->interp, bu_vls_addr(&vls)); bu_vls_free(&vls); - if (GEOM_EDIT_STATE == ST_S_EDIT) - es_edflag = save_edflag; - else + if (s->edit_state.global_editing_state == ST_S_EDIT) { + s->s_edit->edit_flag = save_edflag; + s->s_edit->solid_edit_rotate = save_rot; + s->s_edit->solid_edit_translate = save_tra; + s->s_edit->solid_edit_scale = save_sca; + s->s_edit->solid_edit_pick = save_pic; + } else { edobj = save_edflag; + } } for (size_t di = 0; di < BU_PTBL_LEN(&active_dm_set); di++) { @@ -1508,7 +1574,7 @@ refresh(struct mged_state *s) struct mged_dm *p = (struct mged_dm *)BU_PTBL_GET(&active_dm_set, di); if (!p->dm_view_state) continue; - if (update_views || p->dm_view_state->vs_flag) + if (s->update_views || p->dm_view_state->vs_flag) p->dm_dirty = 1; } @@ -1523,7 +1589,7 @@ refresh(struct mged_state *s) p->dm_view_state->vs_flag = 0; } - update_views = 0; + s->update_views = 0; save_dm_list = s->mged_curr_dm; for (size_t di = 0; di < BU_PTBL_LEN(&active_dm_set); di++) { @@ -1633,7 +1699,7 @@ refresh(struct mged_state *s) draw_m_axes(s); if (axes_state->ax_edit_draw && - (GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT)) + (s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT)) draw_e_axes(s); /* Display titles, etc., if desired */ @@ -1766,12 +1832,7 @@ mged_finish(struct mged_state *s, int exitcode) mged_global_variable_teardown(s); - s->magic = 0; // make sure anything trying to use this after free gets a magic failure - bu_vls_free(&s->input_str); - bu_vls_free(&s->input_str_prefix); - bu_vls_free(&s->scratchline); - bu_vls_free(&s-> mged_prompt); - BU_PUT(s, struct mged_state); + mged_state_destroy(s); MGED_STATE = NULL; // sanity /* 8.5 seems to have some bugs in their reference counting */ @@ -1820,19 +1881,8 @@ main(int argc, char *argv[]) int result; #endif - BU_GET(MGED_STATE, struct mged_state); + MGED_STATE = mged_state_create(); struct mged_state *s = MGED_STATE; - s->magic = MGED_STATE_MAGIC; - s->classic_mged = 1; - s->interactive = 0; /* >0 means interactive, intentionally starts - * 0 to know when interactive, e.g., via -C - * option - */ - bu_vls_init(&s->input_str); - bu_vls_init(&s->input_str_prefix); - bu_vls_init(&s->scratchline); - bu_vls_init(&s->mged_prompt); - s->dpy_string = NULL; /* Set up linked lists */ s->vlfree = &rt_vlfree; @@ -2072,13 +2122,8 @@ main(int argc, char *argv[]) owner = 1; frametime = 1; - MAT_IDN(modelchanges); - MAT_IDN(acc_rot_sol); - - GEOM_EDIT_STATE = ST_VIEW; - es_edflag = -1; - es_edclass = EDIT_CLASS_NULL; - inpara = newedge = 0; + s->edit_state.global_editing_state = ST_VIEW; + s->edit_state.e_edclass = EDIT_CLASS_NULL; /* These values match old GED. Use 'tol' command to change them. */ s->tol.tol.magic = BN_TOL_MAGIC; @@ -2089,15 +2134,13 @@ main(int argc, char *argv[]) rt_prep_timer(); /* Initialize timer */ - es_edflag = -1; /* no solid editing just now */ - /* prepare mged, adjust our path, get set up to use Tcl */ mged_setup(s); new_mats(s); mmenu_init(s); - btn_head_menu(s, 0, 0, 0); + btn_head_menu(s->s_edit, 0, 0, 0, s); mged_link_vars(s->mged_curr_dm); bu_vls_printf(&s->input_str, "set version \"%s\"", brlcad_ident("Geometry Editor (MGED)")); diff --git a/src/mged/mged.h b/src/mged/mged.h index 08b4eaaf64..e553f06adc 100644 --- a/src/mged/mged.h +++ b/src/mged/mged.h @@ -57,16 +57,12 @@ #include "common.h" + #ifdef HAVE_SYS_TIME_H # include #endif #include -#include "tcl.h" -#ifdef HAVE_TK -# include "tk.h" -# define HAVE_X11_TYPES 1 -#endif #include "bu/parallel.h" #include "bu/list.h" #include "bu/str.h" @@ -77,6 +73,18 @@ /* Needed to define struct bv_scene_obj */ #include "bv/defines.h" +__BEGIN_DECLS +#include "tcl.h" +#ifdef HAVE_TK +# include "tk.h" +# define HAVE_X11_TYPES 1 +#endif +__END_DECLS + +#include "mged_impl.h" +#include "rt/edit.h" + +__BEGIN_DECLS #define MGED_DB_NAME "db" #define MGED_INMEM_NAME ".inmem" @@ -111,41 +119,14 @@ struct cmdtab { struct mged_state *s; }; -/* Menu structures and defines - * - * Each active menu is installed by having a non-null entry in - * menu_array[] which is a pointer - * to an array of menu items. The first ([0]) menu item is the title - * for the menu, and the remaining items are individual menu entries. - */ -struct menu_item { - char *menu_string; - void (*menu_func)(struct mged_state *, int, int, int); - int menu_arg; -}; - -#define NMENU 3 -#define MENU_L1 0 /* top-level solid-edit menu */ -#define MENU_L2 1 /* second-level menu */ -#define MENU_GEN 2 /* general features (mouse buttons) */ - -#define MENUXLIM (-1250) /* Value to set X lim to for menu */ -#define MENUX (-2048+115) /* pixel position for menu, X */ -#define MENUY 1780 /* pixel position for menu, Y */ -#define SCROLLY (2047) /* starting Y pos for scroll area */ -#define MENU_DY (-104) /* Distance between menu items */ -#define SCROLL_DY (-100) /* Distance between scrollers */ - -#define TITLE_XBASE (-2048) /* pixel X of title line start pos */ -#define TITLE_YBASE (-1920) /* pixel pos of last title line */ -#define SOLID_XBASE MENUXLIM /* X to start display text */ -#define SOLID_YBASE (1920) /* pixel pos of first solid line */ -#define TEXT0_DY (-60) /* #pixels per line, Size 0 */ -#define TEXT1_DY (-90) /* #pixels per line, Size 1 */ - +#include "./menu.h" #include "./mged_dm.h" /* _view_state */ struct mged_edit_state { + + // main global editing state (ugh) + int global_editing_state; + // Rotate vect_t edit_absolute_model_rotate; vect_t edit_absolute_object_rotate; @@ -161,21 +142,19 @@ struct mged_edit_state { int edit_rateflag_view_rotate; // Translate - vect_t edit_absolute_model_tran; - vect_t edit_absolute_view_tran; - vect_t last_edit_absolute_model_tran; - vect_t last_edit_absolute_view_tran; vect_t edit_rate_model_tran; vect_t edit_rate_view_tran; int edit_rateflag_model_tran; int edit_rateflag_view_tran; // Scale - fastf_t es_scale; /* scale factor */ - fastf_t edit_absolute_scale; fastf_t edit_rate_scale; int edit_rateflag_scale; + /* The "accumulation" solid rotation matrix and scale factor */ + fastf_t acc_sc_obj; /* accumulate global object scale factor */ + fastf_t acc_sc[3]; /* accumulate local object scale factors */ + // Origin char edit_rate_model_origin; char edit_rate_object_origin; @@ -192,14 +171,47 @@ struct mged_edit_state { struct mged_dm *edit_rate_mt_dm; struct mged_dm *edit_rate_vt_dm; - // Container to hold the intermediate state - // of the object being edited (I think?) - struct rt_db_internal es_int; + // TODO - can we eliminate these? + int e_edclass; /* type of editing class for this solid */ + int e_type; /* COMGEOM solid type */ + }; + +// Callback registration mechanism. sedit() is going to become +// something like rt_solid_edit_process(). We need general methods for: +// +// mged_print_results +// set_e_axes_pos +// replot_editing_solid +// view_update +// +// in addition to allowing ECMD specific callback registrations. Simplest thing +// to do is probably assign the "generic" operations above some specific numbers +// and supply a 0 obj type so we can just use the same mechanism for everything. +extern int mged_state_clbk_set(struct mged_state *s, int obj_type, int ed_cmd, int menu_cmd, int mode, bu_clbk_t f, void *d); +extern int mged_state_clbk_get(bu_clbk_t *f, void **d, struct mged_state *s, int obj_type, int ed_cmd, int menu_cmd, int mode); +extern int mged_edit_clbk_sync(struct rt_solid_edit *se, struct mged_state *s); + + +extern int mged_mmenu_set(int ac, const char **av, void *d, void *ms); + +extern int arb_setup_rotface_clbk(int ac, const char **av, void *d, void *d2); +extern int ecmd_bot_mode_clbk(int ac, const char **av, void *d, void *d2); +extern int ecmd_bot_orient_clbk(int ac, const char **av, void *d, void *d2); +extern int ecmd_bot_thick_clbk(int ac, const char **av, void *d, void *d2); +extern int ecmd_bot_flags_clbk(int ac, const char **av, void *d, void *d2); +extern int ecmd_bot_fmode_clbk(int ac, const char **av, void *d, void *d2); +extern int ecmd_bot_pickt_multihit_clbk(int ac, const char **av, void *d, void *d2); +extern int ecmd_nmg_edebug_clbk(int ac, const char **av, void *d, void *d2); +extern int ecmd_extrude_skt_name_clbk(int ac, const char **av, void *d, void *d2); + + /* global application state */ +struct mged_state_impl; struct mged_state { uint32_t magic; + struct mged_state_impl *i; struct ged *gedp; struct db_i *dbip; struct rt_wdb *wdbp; @@ -225,9 +237,19 @@ struct mged_state { /* Editing related */ struct mged_edit_state edit_state; + struct rt_solid_edit *s_edit; + + /* Checked by numerous functions to indicate truthfully whether the + * views need to be redrawn. */ + int update_views; }; extern struct mged_state *MGED_STATE; +extern struct mged_state * +mged_state_create(void); +extern void +mged_state_destroy(struct mged_state *s); + /** * Definitions. @@ -258,15 +280,6 @@ extern struct mged_state *MGED_STATE; * These are allocated storage in dozoom.c */ -extern mat_t modelchanges; /* full changes this edit */ -extern mat_t incr_change; /* change(s) from last cycle */ - -/* defined in buttons.c */ -extern fastf_t acc_sc_sol; /* accumulate solid scale factor */ -extern fastf_t acc_sc_obj; /* accumulate global object scale factor */ -extern fastf_t acc_sc[3]; /* accumulate local object scale factors */ -extern mat_t acc_rot_sol; /* accumulate solid rotations */ - /* defined in mged.c */ extern jmp_buf jmp_env; @@ -285,7 +298,6 @@ extern void moveHinstance(struct mged_state *s, struct directory *cdp, struct di extern void moveHobj(struct mged_state *s, struct directory *dp, matp_t xlate); extern void quit(struct mged_state *s); extern void refresh(struct mged_state *s); -extern void sedit(struct mged_state *s); extern void setview(struct mged_state *s, double a1, double a2, double a3); extern void adcursor(struct mged_state *s); extern void get_attached(struct mged_state *s); @@ -315,8 +327,9 @@ void history_setup(void); #define UARROW 002 #define SARROW 004 #define ROTARROW 010 /* Object rotation enabled */ -extern int movedir; /* RARROW | UARROW | SARROW | ROTARROW */ +/* Ew. Globals. */ +extern int movedir; /* RARROW | UARROW | SARROW | ROTARROW */ extern struct display_list *illum_gdlp; /* Pointer to solid in solid table to be illuminated */ extern struct bv_scene_obj *illump; /* == 0 if none, else points to ill. solid */ extern int ipathpos; /* path index of illuminated element */ @@ -328,10 +341,6 @@ extern int edobj; /* object editing options */ #define ROOT 0 #define INNER 1 -/* FIXME: ugh, main global editing state */ -extern int ged_state; /* (defined in titles.c) */ -#define GEOM_EDIT_STATE ged_state - /** * Editor States */ @@ -386,6 +395,7 @@ struct cmd_list { }; #define CMD_LIST_NULL ((struct cmd_list *)NULL) +/* Ew. Globals. */ /* defined in cmd.c */ extern struct cmd_list head_cmd_list; extern struct cmd_list *curr_cmd_list; @@ -396,6 +406,7 @@ typedef void *Tk_Window; #endif extern Tk_Window tkwin; /* in cmd.c */ +/* Ew. Globals. */ /* defined in rtif.c */ extern struct run_rt head_run_rt; @@ -415,10 +426,6 @@ void mged_slider_free_vls(struct mged_dm *p); int gui_setup(struct mged_state *s, const char *dstr); -/* buttons.c */ -void btn_head_menu(struct mged_state *s, int i, int menu, int item); -void chg_l2menu(struct mged_state *s, int i); - /* chgview.c */ int mged_svbase(struct mged_state *s); void size_reset(struct mged_state *s); @@ -429,7 +436,11 @@ extern void view_ring_destroy(struct mged_dm *dlp); /* cmd.c */ int cmdline(struct mged_state *s, struct bu_vls *vp, int record); -void mged_print_result(struct mged_state *s, int status); +int mged_print_result(int, const char **, void *, void*); +int mged_print_str(int, const char **, void *, void*); +int mged_view_update(int, const char **, void *, void*); +int mged_view_set_flag(int, const char **, void *, void*); +int mged_get_filename(int, const char **, void *, void*); int gui_output(void *clientData, void *str); void mged_pr_output(Tcl_Interp *interp); @@ -450,7 +461,8 @@ void createDListAll(void *, struct display_list *); void freeDListsAll(void *, unsigned int dlist, int range); /* edarb.c */ -int editarb(struct mged_state *s, vect_t pos_model); +int editarb(struct rt_solid_edit *s, vect_t pos_model); +/* Ew. Global. */ extern int newedge; /* new edge for arb editing */ /* edars.c */ @@ -517,20 +529,18 @@ void rect_image2view(struct mged_state *); void rb_set_dirty_flag(const struct bu_structparse *, const char *, void *, const char *, void *); /* edsol.c */ -extern int inpara; /* parameter input from keyboard flag */ -void vls_solid(struct mged_state *s, struct bu_vls *vp, struct rt_db_internal *ip, const mat_t mat); +void vls_solid(struct mged_state *s, struct bu_vls *vp, struct rt_solid_edit *S, const mat_t mat); void transform_editing_solid( struct mged_state *s, struct rt_db_internal *os, /* output solid */ const mat_t mat, struct rt_db_internal *is, /* input solid */ int freedbi); -void replot_editing_solid(struct mged_state *s); +int replot_editing_solid(int, const char **, void *, void *); void sedit_abs_scale(struct mged_state *s); void sedit_accept(struct mged_state *s); void sedit_mouse(struct mged_state *s, const vect_t mousevec); void sedit_reject(struct mged_state *s); -void sedit_vpick(struct mged_state *s, point_t v_pos); void oedit_abs_scale(struct mged_state *s); void oedit_accept(struct mged_state *s); void oedit_reject(struct mged_state *s); @@ -539,6 +549,8 @@ void label_edited_solid(struct mged_state *s, int *num_lines, point_t *lines, st void init_oedit(struct mged_state *s); void init_sedit(struct mged_state *s); +int set_e_axes_pos(int , const char **, void *, void *); + /* share.c */ void usurp_all_resources(struct mged_dm *dlp1, struct mged_dm *dlp2); @@ -555,19 +567,6 @@ void set_scroll(struct mged_state *); int scroll_select(struct mged_state *s, int pen_x, int pen_y, int do_func); int scroll_display(struct mged_state *s, int y_top); -/* edpipe.c */ -void pipe_scale_od(struct mged_state *s, struct rt_db_internal *, fastf_t); -void pipe_scale_id(struct mged_state *s, struct rt_db_internal *, fastf_t); -void pipe_seg_scale_od(struct mged_state *s, struct wdb_pipe_pnt *, fastf_t); -void pipe_seg_scale_id(struct mged_state *s, struct wdb_pipe_pnt *, fastf_t); -void pipe_seg_scale_radius(struct mged_state *s, struct wdb_pipe_pnt *, fastf_t); -void pipe_scale_radius(struct mged_state *s, struct rt_db_internal *, fastf_t); -struct wdb_pipe_pnt *find_pipe_pnt_nearest_pnt(struct mged_state *s, const struct bu_list *, const point_t); -struct wdb_pipe_pnt *pipe_add_pnt(struct rt_pipe_internal *, struct wdb_pipe_pnt *, const point_t); -void pipe_ins_pnt(struct rt_pipe_internal *, struct wdb_pipe_pnt *, const point_t); -struct wdb_pipe_pnt *pipe_del_pnt(struct mged_state *s, struct wdb_pipe_pnt *); -void pipe_move_pnt(struct mged_state *s, struct rt_pipe_internal *, struct wdb_pipe_pnt *, const point_t); - /* vparse.c */ extern void mged_vls_struct_parse(struct mged_state *s, struct bu_vls *vls, const char *title, struct bu_structparse *how_to_parse, const char *structp, int argc, const char *argv[]); /* defined in vparse.c */ extern void mged_vls_struct_parse_old(struct mged_state *s, struct bu_vls *vls, const char *title, struct bu_structparse *how_to_parse, char *structp, int argc, const char *argv[]); @@ -575,13 +574,12 @@ extern void mged_vls_struct_parse_old(struct mged_state *s, struct bu_vls *vls, /* mater.c */ void mged_color_soltab(struct mged_state *s); -/* utility1.c */ -int editit(struct mged_state *s, const char *command, const char *tempfile); - int Wdb_Init(Tcl_Interp *interp); int wdb_cmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]); void wdb_deleteProc(ClientData clientData); +__END_DECLS + #endif /* MGED_MGED_H */ /* diff --git a/src/mged/mged_dm.h b/src/mged/mged_dm.h index be8d414db2..de71c6790b 100644 --- a/src/mged/mged_dm.h +++ b/src/mged/mged_dm.h @@ -32,6 +32,7 @@ #include "pkg.h" /* struct pkg_conn */ #include "ged.h" +#include "menu.h" struct scroll_item { char *scroll_string; @@ -375,7 +376,7 @@ struct _menu_state { int ms_top; int ms_cur_menu; int ms_cur_item; - struct menu_item *ms_menus[NMENU]; /* base of menu items array */ + struct rt_solid_edit_menu_item *ms_menus[NMENU]; /* base of menu items array */ }; @@ -552,9 +553,9 @@ extern void set_curr_dm(struct mged_state *s, struct mged_dm *nl); \ } +/* Ew. Globals. */ extern double frametime; /* defined in mged.c */ extern int dm_pipe[]; /* defined in mged.c */ -extern int update_views; /* defined in mged.c */ extern struct bu_ptbl active_dm_set; /* defined in attach.c */ extern struct mged_dm *mged_dm_init_state; diff --git a/src/mged/mged_impl.cpp b/src/mged/mged_impl.cpp new file mode 100644 index 0000000000..1a1c51b63b --- /dev/null +++ b/src/mged/mged_impl.cpp @@ -0,0 +1,172 @@ +/* M G E D _ I M P L . C P P + * BRL-CAD + * + * Copyright (c) 2019-2025 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file mged_impl.cpp + * + * Internal state implementations + */ + +#include "common.h" + +#include "mged.h" +#include "rt/rt_ecmds.h" + +MGED_Internal::MGED_Internal() +{ +} + +MGED_Internal::~MGED_Internal() +{ + std::map::iterator c_it; + for (c_it = cmd_map.begin(); c_it != cmd_map.end(); c_it++) { + rt_solid_edit_map *m = c_it->second; + rt_solid_edit_map_destroy(m); + } +} + +struct mged_state * +mged_state_create(void) +{ + struct mged_state *s; + BU_GET(s, struct mged_state); + s->magic = MGED_STATE_MAGIC; + + BU_GET(s->i, struct mged_state_impl); + s->i->i = new MGED_Internal; + + s->classic_mged = 1; + s->interactive = 0; /* >0 means interactive, intentionally starts + * 0 to know when interactive, e.g., via -C + * option + */ + bu_vls_init(&s->input_str); + bu_vls_init(&s->input_str_prefix); + bu_vls_init(&s->scratchline); + bu_vls_init(&s->mged_prompt); + s->dpy_string = NULL; + + s->s_edit = NULL; + + // Register default callbacks + mged_state_clbk_set(s, 0, ECMD_PRINT_STR, 0, BU_CLBK_DURING, mged_print_str, s); + mged_state_clbk_set(s, 0, ECMD_PRINT_RESULTS, 0, BU_CLBK_DURING, mged_print_result, s); + mged_state_clbk_set(s, 0, ECMD_EAXES_POS , 0, BU_CLBK_DURING, set_e_axes_pos, s); + mged_state_clbk_set(s, 0, ECMD_REPLOT_EDITING_SOLID, 0, BU_CLBK_DURING, replot_editing_solid, s); + mged_state_clbk_set(s, 0, ECMD_VIEW_UPDATE, 0, BU_CLBK_DURING, mged_view_update, s); + mged_state_clbk_set(s, 0, ECMD_VIEW_SET_FLAG, 0, BU_CLBK_DURING, mged_view_set_flag, s); + mged_state_clbk_set(s, 0, ECMD_MENU_SET, 0, BU_CLBK_DURING, mged_mmenu_set, s); + mged_state_clbk_set(s, 0, ECMD_GET_FILENAME, 0, BU_CLBK_DURING, mged_get_filename, s); + + // Register primitive/ecmd specific callbacks + mged_state_clbk_set(s, ID_ARB8, ECMD_ARB_SETUP_ROTFACE, 0, BU_CLBK_DURING, arb_setup_rotface_clbk, s); + mged_state_clbk_set(s, ID_BOT, ECMD_BOT_MODE, 0, BU_CLBK_DURING, ecmd_bot_mode_clbk, s); + mged_state_clbk_set(s, ID_BOT, ECMD_BOT_ORIENT, 0, BU_CLBK_DURING, ecmd_bot_orient_clbk, s); + mged_state_clbk_set(s, ID_BOT, ECMD_BOT_THICK, 0, BU_CLBK_DURING, ecmd_bot_thick_clbk, s); + mged_state_clbk_set(s, ID_BOT, ECMD_BOT_FLAGS, 0, BU_CLBK_DURING, ecmd_bot_flags_clbk, s); + mged_state_clbk_set(s, ID_BOT, ECMD_BOT_FMODE, 0, BU_CLBK_DURING, ecmd_bot_fmode_clbk, s); + mged_state_clbk_set(s, ID_BOT, ECMD_BOT_PICKT, 0, BU_CLBK_DURING, ecmd_bot_pickt_multihit_clbk, s); + mged_state_clbk_set(s, ID_NMG, ECMD_NMG_EDEBUG, 0, BU_CLBK_DURING, ecmd_nmg_edebug_clbk, s); + mged_state_clbk_set(s, ID_EXTRUDE, ECMD_EXTR_SKT_NAME, 0, BU_CLBK_DURING, ecmd_extrude_skt_name_clbk, s); + + return s; +} + +void +mged_state_destroy(struct mged_state *s) +{ + if (!s) + return; + + s->magic = 0; // make sure anything trying to use this after free gets a magic failure + bu_vls_free(&s->input_str); + bu_vls_free(&s->input_str_prefix); + bu_vls_free(&s->scratchline); + bu_vls_free(&s->mged_prompt); + if (s->s_edit) + rt_solid_edit_destroy(s->s_edit); + s->s_edit = NULL; + + delete s->i->i; + BU_PUT(s->i, struct mged_state_impl); + BU_PUT(s, struct mged_state); +} + +struct rt_solid_edit_map * +mged_internal_clbk_map(MGED_Internal *i, int obj_type) +{ + struct rt_solid_edit_map *omap = NULL; + std::map::iterator m_it = i->cmd_map.find(obj_type); + if (m_it != i->cmd_map.end()) { + omap = m_it->second; + } else { + omap = rt_solid_edit_map_create(); + i->cmd_map[obj_type] = omap; + } + return omap; +} + +int mged_state_clbk_set(struct mged_state *s, int obj_type, int ed_cmd, int menu_cmd, int mode, bu_clbk_t f, void *d) +{ + // Check for no-op case + if (!s) + return BRLCAD_OK; + + MGED_Internal *i = s->i->i; + struct rt_solid_edit_map *mp = mged_internal_clbk_map(i, obj_type); + if (!mp) + return BRLCAD_ERROR; + + return rt_solid_edit_map_clbk_set(mp, ed_cmd, menu_cmd, mode, f, d); +} + +int mged_state_clbk_get(bu_clbk_t *f, void **d, struct mged_state *s, int obj_type, int ed_cmd, int menu_cmd, int mode) +{ + // Check for no-op case + if (!f || !d || !s) + return BRLCAD_OK; + + MGED_Internal *i = s->i->i; + struct rt_solid_edit_map *mp = mged_internal_clbk_map(i, obj_type); + if (!mp) + return BRLCAD_ERROR; + + return rt_solid_edit_map_clbk_get(f, d, mp, ed_cmd, menu_cmd, mode); +} + + +int mged_edit_clbk_sync(struct rt_solid_edit *se, struct mged_state *s) +{ + if (!se) + return BRLCAD_ERROR; + + MGED_Internal *i = s->i->i; + struct rt_solid_edit_map *mp = mged_internal_clbk_map(i, s->s_edit->es_int.idb_type); + + return rt_solid_edit_map_sync(se->m, mp); +} + + +// Local Variables: +// tab-width: 8 +// mode: C++ +// c-basic-offset: 4 +// indent-tabs-mode: t +// c-file-style: "stroustrup" +// End: +// ex: shiftwidth=4 tabstop=8 diff --git a/src/mged/mged_impl.h b/src/mged/mged_impl.h new file mode 100644 index 0000000000..bedb8ed97b --- /dev/null +++ b/src/mged/mged_impl.h @@ -0,0 +1,65 @@ +/* M G E D _ I M P L . H + * BRL-CAD + * + * Copyright (c) 2019-2025 United States Government as represented by + * the U.S. Army Research Laboratory. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 2.1 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this file; see the file named COPYING for more + * information. + */ +/** @file mged_impl.h + * + * Internal state implementations + */ + +#include "common.h" +#include "bu.h" +#include "rt/edit.h" + +#ifdef __cplusplus + +#include +#include +#include +#include +#include + +class MGED_Internal { + public: + + MGED_Internal(); + ~MGED_Internal(); + + // key is primitive type (e.g. ID_ETO) + std::map cmd_map; +}; + +#else + +#define MGED_Internal void + +#endif + +struct mged_state_impl { + MGED_Internal *i; +}; + + +// Local Variables: +// tab-width: 8 +// mode: C++ +// c-basic-offset: 4 +// indent-tabs-mode: t +// c-file-style: "stroustrup" +// End: +// ex: shiftwidth=4 tabstop=8 diff --git a/src/mged/mged_wdb.h b/src/mged/mged_wdb.h index 939017630a..a1f8117866 100644 --- a/src/mged/mged_wdb.h +++ b/src/mged/mged_wdb.h @@ -36,6 +36,7 @@ #include "raytrace.h" +/* Ew. Global. */ extern struct rt_wdb rtg_headwdb; #endif /* MGED_MGED_WDB_H */ diff --git a/src/mged/overlay.c b/src/mged/overlay.c index 068c92def5..016bd5b614 100644 --- a/src/mged/overlay.c +++ b/src/mged/overlay.c @@ -61,7 +61,7 @@ cmd_overlay(ClientData clientData, Tcl_Interp *interp, int argc, const char *arg if (ret != BRLCAD_OK) return TCL_ERROR; - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); return ret; diff --git a/src/mged/scroll.c b/src/mged/scroll.c index a8088aa09d..4c5d1258c5 100644 --- a/src/mged/scroll.c +++ b/src/mged/scroll.c @@ -118,8 +118,9 @@ set_scroll(struct mged_state *s) * Reset all scroll bars to the zero position. */ void -sl_halt_scroll(struct mged_state *s, int UNUSED(a), int UNUSED(b), int UNUSED(c)) +sl_halt_scroll(struct rt_solid_edit *UNUSED(es), int UNUSED(a), int UNUSED(b), int UNUSED(c), void *data) { + struct mged_state *s = (struct mged_state *)data; struct bu_vls vls = BU_VLS_INIT_ZERO; bu_vls_printf(&vls, "knob zero"); @@ -129,8 +130,9 @@ sl_halt_scroll(struct mged_state *s, int UNUSED(a), int UNUSED(b), int UNUSED(c) void -sl_toggle_scroll(struct mged_state *s, int UNUSED(a), int UNUSED(b), int UNUSED(c)) +sl_toggle_scroll(struct rt_solid_edit *UNUSED(es), int UNUSED(a), int UNUSED(b), int UNUSED(c), void *data) { + struct mged_state *s = (struct mged_state *)data; mged_variables->mv_sliders = mged_variables->mv_sliders ? 0 : 1; { @@ -325,14 +327,14 @@ scroll_display(struct mged_state *s, int y_top) if (mged_variables->mv_rateknobs) f = s->edit_state.edit_rate_model_tran[X]; else - f = s->edit_state.edit_absolute_model_tran[X]; + f = s->s_edit->edit_absolute_model_tran[X]; break; case 'v': default: if (mged_variables->mv_rateknobs) f = s->edit_state.edit_rate_view_tran[X]; else - f = s->edit_state.edit_absolute_view_tran[X]; + f = s->s_edit->edit_absolute_view_tran[X]; break; } @@ -376,13 +378,13 @@ scroll_display(struct mged_state *s, int y_top) if (mged_variables->mv_rateknobs) f = s->edit_state.edit_rate_model_tran[Y]; else - f = s->edit_state.edit_absolute_model_tran[Y]; + f = s->s_edit->edit_absolute_model_tran[Y]; break; case 'v': if (mged_variables->mv_rateknobs) f = s->edit_state.edit_rate_view_tran[Y]; else - f = s->edit_state.edit_absolute_view_tran[Y]; + f = s->s_edit->edit_absolute_view_tran[Y]; break; } @@ -426,13 +428,13 @@ scroll_display(struct mged_state *s, int y_top) if (mged_variables->mv_rateknobs) f = s->edit_state.edit_rate_model_tran[Z]; else - f = s->edit_state.edit_absolute_model_tran[Z]; + f = s->s_edit->edit_absolute_model_tran[Z]; break; case 'v': if (mged_variables->mv_rateknobs) f = s->edit_state.edit_rate_view_tran[Z]; else - f = s->edit_state.edit_absolute_view_tran[Z]; + f = s->s_edit->edit_absolute_view_tran[Z]; break; } @@ -473,7 +475,7 @@ scroll_display(struct mged_state *s, int y_top) if (mged_variables->mv_rateknobs) f = s->edit_state.edit_rate_scale; else - f = s->edit_state.edit_absolute_scale; + f = s->s_edit->edit_absolute_scale; dm_set_fg(DMP, color_scheme->cs_slider_text1[0], diff --git a/src/mged/sedit.h b/src/mged/sedit.h index 613a0f3dbc..1f0ca02de8 100644 --- a/src/mged/sedit.h +++ b/src/mged/sedit.h @@ -32,224 +32,39 @@ #define MGED_SMALL_SCALE 1.0e-10 -/* These EDIT_CLASS_ values go in es_edclass. */ +/* These EDIT_CLASS_ values go in s->edit_state.e_edclass. */ #define EDIT_CLASS_NULL 0 #define EDIT_CLASS_TRAN 1 #define EDIT_CLASS_ROTATE 2 #define EDIT_CLASS_SCALE 3 -/* These ECMD_ values go in es_edflag. Some names not changed yet */ -#define IDLE 0 /* edarb.c */ -#define STRANS 1 /* buttons.c */ -#define SSCALE 2 /* buttons.c */ /* Scale whole solid by scalar */ -#define SROT 3 /* buttons.c */ -#define PSCALE 4 /* Scale one solid parameter by scalar */ +/* These values go in edit_flag . Some names not changed yet */ -#define ECMD_TGC_MV_H 5 -#define ECMD_TGC_MV_HH 6 -#define ECMD_TGC_ROT_H 7 -#define ECMD_TGC_ROT_AB 8 +#define SEDIT_ROTATE (s->edit_state.global_editing_state == ST_S_EDIT && \ + s->s_edit->solid_edit_rotate) +#define SEDIT_TRAN (s->edit_state.global_editing_state == ST_S_EDIT && \ + s->s_edit->solid_edit_translate) +#define SEDIT_SCALE (s->edit_state.global_editing_state == ST_S_EDIT && \ + s->s_edit->solid_edit_scale) +#define SEDIT_PICK (s->edit_state.global_editing_state == ST_S_EDIT && \ + s->s_edit->solid_edit_pick) -#define EARB 9 /* chgmodel.c, edarb.c */ -#define PTARB 10 /* edarb.c */ -#define ECMD_ARB_MAIN_MENU 11 -#define ECMD_ARB_SPECIFIC_MENU 12 -#define ECMD_ARB_MOVE_FACE 13 -#define ECMD_ARB_SETUP_ROTFACE 14 -#define ECMD_ARB_ROTATE_FACE 15 - -#define ECMD_ETO_ROT_C 16 - -#define ECMD_VTRANS 17 /* vertex translate */ -#define ECMD_NMG_EPICK 19 /* edge pick */ -#define ECMD_NMG_EMOVE 20 /* edge move */ -#define ECMD_NMG_EDEBUG 21 /* edge debug */ -#define ECMD_NMG_FORW 22 /* next eu */ -#define ECMD_NMG_BACK 23 /* prev eu */ -#define ECMD_NMG_RADIAL 24 /* radial+mate eu */ -#define ECMD_NMG_ESPLIT 25 /* split current edge */ -#define ECMD_NMG_EKILL 26 /* kill current edge */ -#define ECMD_NMG_LEXTRU 27 /* Extrude loop */ - -#define ECMD_PIPE_PICK 28 /* Pick pipe point */ -#define ECMD_PIPE_SPLIT 29 /* Split a pipe segment into two */ -#define ECMD_PIPE_PT_ADD 30 /* Add a pipe point to end of pipe */ -#define ECMD_PIPE_PT_INS 31 /* Add a pipe point to start of pipe */ -#define ECMD_PIPE_PT_DEL 32 /* Delete a pipe point */ -#define ECMD_PIPE_PT_MOVE 33 /* Move a pipe point */ - -#define ECMD_ARS_PICK 34 /* select an ARS point */ -#define ECMD_ARS_NEXT_PT 35 /* select next ARS point in same curve */ -#define ECMD_ARS_PREV_PT 36 /* select previous ARS point in same curve */ -#define ECMD_ARS_NEXT_CRV 37 /* select corresponding ARS point in next curve */ -#define ECMD_ARS_PREV_CRV 38 /* select corresponding ARS point in previous curve */ -#define ECMD_ARS_MOVE_PT 39 /* translate an ARS point */ -#define ECMD_ARS_DEL_CRV 40 /* delete an ARS curve */ -#define ECMD_ARS_DEL_COL 41 /* delete all corresponding points in each curve (a column) */ -#define ECMD_ARS_DUP_CRV 42 /* duplicate an ARS curve */ -#define ECMD_ARS_DUP_COL 43 /* duplicate an ARS column */ -#define ECMD_ARS_MOVE_CRV 44 /* translate an ARS curve */ -#define ECMD_ARS_MOVE_COL 45 /* translate an ARS column */ -#define ECMD_ARS_PICK_MENU 46 /* display the ARS pick menu */ -#define ECMD_ARS_EDIT_MENU 47 /* display the ARS edit menu */ - -#define ECMD_VOL_CSIZE 48 /* set voxel size */ -#define ECMD_VOL_FSIZE 49 /* set VOL file dimensions */ -#define ECMD_VOL_THRESH_LO 50 /* set VOL threshold (lo) */ -#define ECMD_VOL_THRESH_HI 51 /* set VOL threshold (hi) */ -#define ECMD_VOL_FNAME 52 /* set VOL file name */ - -#define ECMD_EBM_FNAME 53 /* set EBM file name */ -#define ECMD_EBM_FSIZE 54 /* set EBM file size */ -#define ECMD_EBM_HEIGHT 55 /* set EBM extrusion depth */ - -#define ECMD_DSP_FNAME 56 /* set DSP file name */ -#define ECMD_DSP_FSIZE 57 /* set DSP file size */ -#define ECMD_DSP_SCALE_X 58 /* Scale DSP x size */ -#define ECMD_DSP_SCALE_Y 59 /* Scale DSP y size */ -#define ECMD_DSP_SCALE_ALT 60 /* Scale DSP Altitude size */ - -#define ECMD_BOT_PICKV 61 /* pick a BOT vertex */ -#define ECMD_BOT_PICKE 62 /* pick a BOT edge */ -#define ECMD_BOT_PICKT 63 /* pick a BOT triangle */ -#define ECMD_BOT_MOVEV 64 /* move a BOT vertex */ -#define ECMD_BOT_MOVEE 65 /* move a BOT edge */ -#define ECMD_BOT_MOVET 66 /* move a BOT triangle */ -#define ECMD_BOT_MODE 67 /* set BOT mode */ -#define ECMD_BOT_ORIENT 68 /* set BOT face orientation */ -#define ECMD_BOT_THICK 69 /* set face thickness (one or all) */ -#define ECMD_BOT_FMODE 70 /* set face mode (one or all) */ -#define ECMD_BOT_FDEL 71 /* delete current face */ -#define ECMD_BOT_FLAGS 72 /* set BOT flags */ - -#define ECMD_EXTR_SCALE_H 73 /* scale extrusion vector */ -#define ECMD_EXTR_MOV_H 74 /* move end of extrusion vector */ -#define ECMD_EXTR_ROT_H 75 /* rotate extrusion vector */ -#define ECMD_EXTR_SKT_NAME 76 /* set sketch that the extrusion uses */ - -#define ECMD_CLINE_SCALE_H 77 /* scale height vector */ -#define ECMD_CLINE_MOVE_H 78 /* move end of height vector */ -#define ECMD_CLINE_SCALE_R 79 /* scale radius */ -#define ECMD_CLINE_SCALE_T 80 /* scale thickness */ -#define ECMD_TGC_MV_H_CD 81 /* move end of tgc, while scaling CD */ -#define ECMD_TGC_MV_H_V_AB 82 /* move vertex end of tgc, while scaling AB */ - -#define ECMD_METABALL_SET_THRESHOLD 83 /* overall metaball threshold value */ -#define ECMD_METABALL_SET_METHOD 84 /* set the rendering method */ -#define ECMD_METABALL_PT_PICK 85 /* pick a metaball control point */ -#define ECMD_METABALL_PT_MOV 86 /* move a metaball control point */ -#define ECMD_METABALL_PT_FLDSTR 87 /* set a metaball control point field strength */ -#define ECMD_METABALL_PT_DEL 88 /* delete a metaball control point */ -#define ECMD_METABALL_PT_ADD 89 /* add a metaball control point */ -#define ECMD_METABALL_RMET 90 /* set the metaball render method */ - -#define ECMD_HYP_ROT_H 91 -#define ECMD_HYP_ROT_A 92 - -#define SEDIT_ROTATE (GEOM_EDIT_STATE == ST_S_EDIT && \ - (es_edflag == SROT || \ - es_edflag == ECMD_TGC_ROT_H || \ - es_edflag == ECMD_TGC_ROT_AB || \ - es_edflag == ECMD_ARB_ROTATE_FACE || \ - es_edflag == ECMD_EXTR_ROT_H || \ - es_edflag == ECMD_ETO_ROT_C)) -#define OEDIT_ROTATE (GEOM_EDIT_STATE == ST_O_EDIT && \ +#define OEDIT_ROTATE (s->edit_state.global_editing_state == ST_O_EDIT && \ edobj == BE_O_ROTATE) -#define EDIT_ROTATE (SEDIT_ROTATE || OEDIT_ROTATE) - -#define SEDIT_SCALE (GEOM_EDIT_STATE == ST_S_EDIT && \ - (es_edflag == SSCALE || \ - es_edflag == PSCALE || \ - es_edflag == ECMD_VOL_THRESH_LO || \ - es_edflag == ECMD_VOL_THRESH_HI || \ - es_edflag == ECMD_VOL_CSIZE || \ - es_edflag == ECMD_DSP_SCALE_X || \ - es_edflag == ECMD_DSP_SCALE_Y || \ - es_edflag == ECMD_DSP_SCALE_ALT || \ - es_edflag == ECMD_EBM_HEIGHT || \ - es_edflag == ECMD_CLINE_SCALE_H || \ - es_edflag == ECMD_CLINE_SCALE_R || \ - es_edflag == ECMD_CLINE_SCALE_T || \ - es_edflag == ECMD_EXTR_SCALE_H)) -#define OEDIT_SCALE (GEOM_EDIT_STATE == ST_O_EDIT && \ +#define OEDIT_TRAN (s->edit_state.global_editing_state == ST_O_EDIT && \ + (edobj == BE_O_X || \ + edobj == BE_O_Y || \ + edobj == BE_O_XY)) +#define OEDIT_SCALE (s->edit_state.global_editing_state == ST_O_EDIT && \ (edobj == BE_O_XSCALE || \ edobj == BE_O_YSCALE || \ edobj == BE_O_ZSCALE || \ edobj == BE_O_SCALE)) -#define EDIT_SCALE (SEDIT_SCALE || OEDIT_SCALE) -#define SEDIT_TRAN (GEOM_EDIT_STATE == ST_S_EDIT && \ - (es_edflag == STRANS || \ - es_edflag == ECMD_TGC_MV_H || \ - es_edflag == ECMD_TGC_MV_HH || \ - es_edflag == EARB || \ - es_edflag == PTARB || \ - es_edflag == ECMD_ARB_MOVE_FACE || \ - es_edflag == ECMD_VTRANS || \ - es_edflag == ECMD_NMG_EMOVE || \ - es_edflag == ECMD_NMG_ESPLIT || \ - es_edflag == ECMD_NMG_LEXTRU || \ - es_edflag == ECMD_PIPE_PT_MOVE || \ - es_edflag == ECMD_PIPE_SPLIT || \ - es_edflag == ECMD_PIPE_PT_ADD || \ - es_edflag == ECMD_PIPE_PT_INS || \ - es_edflag == ECMD_ARS_MOVE_PT || \ - es_edflag == ECMD_ARS_MOVE_CRV || \ - es_edflag == ECMD_ARS_MOVE_COL || \ - es_edflag == ECMD_BOT_MOVEV || \ - es_edflag == ECMD_BOT_MOVEE || \ - es_edflag == ECMD_BOT_MOVET || \ - es_edflag == ECMD_CLINE_MOVE_H || \ - es_edflag == ECMD_EXTR_MOV_H)) -#define OEDIT_TRAN (GEOM_EDIT_STATE == ST_O_EDIT && \ - (edobj == BE_O_X || \ - edobj == BE_O_Y || \ - edobj == BE_O_XY)) +#define EDIT_ROTATE (SEDIT_ROTATE || OEDIT_ROTATE) +#define EDIT_SCALE (SEDIT_SCALE || OEDIT_SCALE) #define EDIT_TRAN (SEDIT_TRAN || OEDIT_TRAN) -#define SEDIT_PICK (GEOM_EDIT_STATE == ST_S_EDIT && \ - (es_edflag == ECMD_NMG_EPICK || \ - es_edflag == ECMD_PIPE_PICK || \ - es_edflag == ECMD_ARS_PICK || \ - es_edflag == ECMD_BOT_PICKV || \ - es_edflag == ECMD_BOT_PICKE || \ - es_edflag == ECMD_BOT_PICKT || \ - es_edflag == ECMD_METABALL_PT_PICK)) - - -extern fastf_t es_para[3]; /* keyboard input parameter changes */ -extern fastf_t es_peqn[7][4]; /* ARBs defining plane equations */ -extern int es_menu; /* item/edit_mode selected from menu */ -extern int es_edflag; /* type of editing for this solid */ -extern int es_edclass; /* type of editing class for this solid */ -extern int es_type; /* COMGEOM solid type */ -extern int es_keyfixed; /* keypoint specified by user */ - -// NMG editing vars -extern struct edgeuse *es_eu; -extern struct loopuse *lu_copy; -extern point_t lu_keypoint; -extern plane_t lu_pl; -extern struct shell *es_s; - -extern struct wdb_pipe_pnt *es_pipe_pnt; -extern struct wdb_metaball_pnt *es_metaball_pnt; - -extern mat_t es_mat; /* accumulated matrix of path */ -extern mat_t es_invmat; /* inverse of es_mat KAA */ - -extern point_t es_keypoint; /* center of editing xforms */ -extern const char *es_keytag; /* string identifying the keypoint */ -extern point_t curr_e_axes_pos; /* center of editing xforms */ - -extern void get_solid_keypoint(struct mged_state *s, point_t *pt, - const char **strp, - struct rt_db_internal *ip, - fastf_t *mat); - -extern void set_e_axes_pos(struct mged_state *s, int both); - - #endif /* MGED_SEDIT_H */ /* diff --git a/src/mged/set.c b/src/mged/set.c index ad6289cbd3..4bcc005af9 100644 --- a/src/mged/set.c +++ b/src/mged/set.c @@ -220,6 +220,15 @@ write_var(ClientData clientData, Tcl_Interp *interp, const char *name1, const ch " TO ", newvalue, "\n", (char *)NULL); } + /* We don't want to expose mged_variables to the primitive editing code + * directly, but MGED uses "set context 1" to trigger a behavior change. Do + * a sync here to propagate the value to a more localized value in the + * editing context. We have to first check for s_edit before doing this + * assignment (and always initialize it after creating an s_edit instance.) + */ + if (s->s_edit) + s->s_edit->mv_context = mged_variables->mv_context; + bu_vls_free(&str); return read_var(clientData, interp, name1, name2, (flags&(~TCL_TRACE_WRITES))|TCL_TRACE_READS); @@ -253,6 +262,10 @@ unset_var(ClientData clientData, Tcl_Interp *interp, const char *name1, const ch (ClientData)sp); read_var(clientData, interp, name1, name2, (flags&(~TCL_TRACE_UNSETS))|TCL_TRACE_READS); + + if (MGED_STATE->s_edit) + MGED_STATE->s_edit->mv_context = MGED_STATE->mged_curr_dm->dm_mged_variables->mv_context; + return NULL; } @@ -305,6 +318,9 @@ f_set(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) Tcl_AppendResult(interp, bu_vls_addr(&vls), (char *)NULL); bu_vls_free(&vls); + if (s->s_edit) + s->s_edit->mv_context = mged_variables->mv_context; + return TCL_OK; } diff --git a/src/mged/setup.c b/src/mged/setup.c index 8883ada8a4..80555f61fa 100644 --- a/src/mged/setup.c +++ b/src/mged/setup.c @@ -54,6 +54,7 @@ extern int mged_post_opendb_clbk(int ac, const char **av, void *gedp, void *ctx) extern int mged_pre_closedb_clbk(int ac, const char **av, void *gedp, void *ctx); extern int mged_post_closedb_clbk(int ac, const char **av, void *gedp, void *ctx); +/* Ew. Global. */ extern Tk_Window tkwin; /* in cmd.c */ extern void init_qray(void); @@ -574,7 +575,7 @@ mged_setup(struct mged_state *s) /* Tcl needs to write nulls onto subscripted variable names */ bu_vls_printf(&str, "%s(state)", MGED_DISPLAY_VAR); - Tcl_SetVar(s->interp, bu_vls_addr(&str), state_str[GEOM_EDIT_STATE], TCL_GLOBAL_ONLY); + Tcl_SetVar(s->interp, bu_vls_addr(&str), state_str[s->edit_state.global_editing_state], TCL_GLOBAL_ONLY); /* Set defaults for view status variables */ bu_vls_trunc(&str, 0); diff --git a/src/mged/share.c b/src/mged/share.c index 1159b91868..2f57d915d0 100644 --- a/src/mged/share.c +++ b/src/mged/share.c @@ -69,6 +69,7 @@ } while (0) +/* Ew. Globals. */ extern struct bu_structparse axes_vparse[]; extern struct bu_structparse color_scheme_vparse[]; extern struct bu_structparse grid_vparse[]; @@ -88,8 +89,8 @@ void free_all_resources(struct mged_dm *dlp); * ADC AXES COLOR_SCHEMES DISPLAY_LISTS GRID MENU MGED_VARIABLES RUBBER_BAND VIEW * * EXAMPLES - * share res_type p1 p2 ---> causes 'p1' to share its resource of type 'res_type' with 'p2' - * share -u res_type p ---> causes 'p' to no longer share resource of type 'res_type' + * share rs->edit_state.e_type p1 p2 ---> causes 'p1' to share its resource of type 'rs->edit_state.e_type' with 'p2' + * share -u rs->edit_state.e_type p ---> causes 'p' to no longer share resource of type 'rs->edit_state.e_type' */ int f_share(ClientData clientData, Tcl_Interp *interpreter, int argc, const char *argv[]) @@ -274,7 +275,7 @@ f_share(ClientData clientData, Tcl_Interp *interpreter, int argc, const char *ar /* * SYNOPSIS - * rset [res_type [res [vals]]] + * rset [rs->edit_state.e_type [res [vals]]] * * DESCRIPTION * Provides a mechanism to set resource values for some resource. @@ -282,6 +283,7 @@ f_share(ClientData clientData, Tcl_Interp *interpreter, int argc, const char *ar * EXAMPLES * rset c bg 0 0 50 ---> sets the background color to dark blue */ +// TODO - is e_type actually used here? int f_rset (ClientData clientData, Tcl_Interp *interpreter, int argc, const char *argv[]) { @@ -293,19 +295,19 @@ f_rset (ClientData clientData, Tcl_Interp *interpreter, int argc, const char *ar /* print values for all resources */ if (argc == 1) { - mged_vls_struct_parse(s, &vls, "Axes, res_type - ax", axes_vparse, + mged_vls_struct_parse(s, &vls, "Axes, rs->edit_state.e_type - ax", axes_vparse, (const char *)axes_state, argc, argv); bu_vls_printf(&vls, "\n"); - mged_vls_struct_parse(s, &vls, "Color Schemes, res_type - c", color_scheme_vparse, + mged_vls_struct_parse(s, &vls, "Color Schemes, rs->edit_state.e_type - c", color_scheme_vparse, (const char *)color_scheme, argc, argv); bu_vls_printf(&vls, "\n"); - mged_vls_struct_parse(s, &vls, "Grid, res_type - g", grid_vparse, + mged_vls_struct_parse(s, &vls, "Grid, rs->edit_state.e_type - g", grid_vparse, (const char *)grid_state, argc, argv); bu_vls_printf(&vls, "\n"); - mged_vls_struct_parse(s, &vls, "Rubber Band, res_type - r", rubber_band_vparse, + mged_vls_struct_parse(s, &vls, "Rubber Band, rs->edit_state.e_type - r", rubber_band_vparse, (const char *)rubber_band, argc, argv); bu_vls_printf(&vls, "\n"); - mged_vls_struct_parse(s, &vls, "MGED Variables, res_type - var", mged_vparse, + mged_vls_struct_parse(s, &vls, "MGED Variables, rs->edit_state.e_type - var", mged_vparse, (const char *)mged_variables, argc, argv); Tcl_AppendResult(interpreter, bu_vls_addr(&vls), (char *)NULL); diff --git a/src/mged/tedit.c b/src/mged/tedit.c index 780e0d9dca..8aeefcb32a 100644 --- a/src/mged/tedit.c +++ b/src/mged/tedit.c @@ -42,9 +42,7 @@ #include "./sedit.h" #include "./mged_dm.h" - #define V3BASE2LOCAL(_pt) (_pt)[X]*s->dbip->dbi_base2local, (_pt)[Y]*s->dbip->dbi_base2local, (_pt)[Z]*s->dbip->dbi_base2local -#define V4BASE2LOCAL(_pt) (_pt)[X]*s->dbip->dbi_base2local, (_pt)[Y]*s->dbip->dbi_base2local, (_pt)[Z]*s->dbip->dbi_base2local, (_pt)[W]*s->dbip->dbi_base2local /* editors to test, in order of discovery preference (EDITOR overrides) */ #define WIN_EDITOR "\"c:/Program Files/Windows NT/Accessories/wordpad\"" @@ -64,18 +62,40 @@ static char tmpfil[MAXPATHLEN] = {0}; -/* used in handling different arb types */ -static int numUnique = 0; -static int cgtype = 8; -static int uvec[8]; -static int svec[11]; -static int j; +int writesolid(struct mged_state *), readsolid(struct mged_state *); +/* + * + * No-frills edit - opens an editor on the supplied + * file name. + * + */ +int +editit(struct mged_state *s, const char *tempfile) { + int argc = 5; + const char *av[6] = {NULL, NULL, NULL, NULL, NULL, NULL}; + struct bu_vls editstring = BU_VLS_INIT_ZERO; -int writesolid(struct mged_state *), readsolid(struct mged_state *); + CHECK_DBI_NULL; + + if (!get_editor_string(s, &editstring)) + return TCL_ERROR; + + av[0] = "editit"; + av[1] = "-e"; + av[2] = bu_vls_addr(&editstring); + av[3] = "-f"; + av[4] = tempfile; + av[5] = NULL; + + ged_exec(s->gedp, argc, (const char **)av); + + bu_vls_free(&editstring); + return TCL_OK; +} int -f_tedit(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) +f_tedit(ClientData clientData, Tcl_Interp *interp, int argc, const char **UNUSED(argv)) { struct cmdtab *ctp = (struct cmdtab *)clientData; MGED_CK_CMD(ctp); @@ -111,14 +131,14 @@ f_tedit(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) (void)fclose(fp); - if (editit(s, argv[0], tmpfil) == TCL_OK) { + if (editit(s, tmpfil) == TCL_OK) { if (readsolid(s)) { bu_file_delete(tmpfil); return TCL_ERROR; } /* Update the display */ - replot_editing_solid(s); + replot_editing_solid(0, NULL, s, NULL); view_state->vs_flag = 1; Tcl_AppendResult(interp, "done\n", (char *)NULL); } @@ -129,784 +149,57 @@ f_tedit(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) } -/* - * given the index of a vertex of the arb currently being edited, - * return 1 if this vertex should appear in the editor - * return 0 if this vertex is a duplicate of one of the above - */ -static int -useThisVertex(int idx) -{ - int i; - - for (i=0; i<8 && uvec[i] != -1; i++) { - if (uvec[i] == idx) return 1; - } - - if (svec[0] != 0 && idx == svec[2]) return 1; - - if (svec[1] != 0 && idx == svec[2+svec[0]]) return 1; - - return 0; -} - - /* Write numerical parameters of a solid into a file */ int writesolid(struct mged_state *s) { - int i; FILE *fp; - char *eol = "\n"; CHECK_DBI_NULL; - fp = fopen(tmpfil, "w"); - - /* Print solid parameters, 1 vector or point per line */ - switch (s->edit_state.es_int.idb_type) { - struct rt_tor_internal *tor; - struct rt_tgc_internal *tgc; - struct rt_ell_internal *ell; - struct rt_arb_internal *arb; - struct rt_half_internal *haf; - struct rt_grip_internal *grip; - struct rt_rpc_internal *rpc; - struct rt_rhc_internal *rhc; - struct rt_epa_internal *epa; - struct rt_ehy_internal *ehy; - struct rt_hyp_internal *hyp; - struct rt_eto_internal *eto; - struct rt_part_internal *part; - struct rt_superell_internal *superell; - struct rt_datum_internal *datum; - - default: - Tcl_AppendResult(s->interp, "Cannot text edit this solid type\n", (char *)NULL); - (void)fclose(fp); - return 1; - case ID_TOR: - tor = (struct rt_tor_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Vertex: %.9f %.9f %.9f%s", V3BASE2LOCAL(tor->v), eol); - fprintf(fp, "Normal: %.9f %.9f %.9f%s", V3BASE2LOCAL(tor->h), eol); - fprintf(fp, "radius_1: %.9f%s", tor->r_a*s->dbip->dbi_base2local, eol); - fprintf(fp, "radius_2: %.9f%s", tor->r_h*s->dbip->dbi_base2local, eol); - break; - case ID_TGC: - case ID_REC: - tgc = (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Vertex: %.9f %.9f %.9f%s", V3BASE2LOCAL(tgc->v), eol); - fprintf(fp, "Height: %.9f %.9f %.9f%s", V3BASE2LOCAL(tgc->h), eol); - fprintf(fp, "A: %.9f %.9f %.9f%s", V3BASE2LOCAL(tgc->a), eol); - fprintf(fp, "B: %.9f %.9f %.9f%s", V3BASE2LOCAL(tgc->b), eol); - fprintf(fp, "C: %.9f %.9f %.9f%s", V3BASE2LOCAL(tgc->c), eol); - fprintf(fp, "D: %.9f %.9f %.9f%s", V3BASE2LOCAL(tgc->d), eol); - break; - case ID_ELL: - case ID_SPH: - ell = (struct rt_ell_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Vertex: %.9f %.9f %.9f%s", V3BASE2LOCAL(ell->v), eol); - fprintf(fp, "A: %.9f %.9f %.9f%s", V3BASE2LOCAL(ell->a), eol); - fprintf(fp, "B: %.9f %.9f %.9f%s", V3BASE2LOCAL(ell->b), eol); - fprintf(fp, "C: %.9f %.9f %.9f%s", V3BASE2LOCAL(ell->c), eol); - break; - case ID_ARB8: - for (j=0; j<8; j++) uvec[j] = -1; - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - numUnique = rt_arb_get_cgtype(&cgtype, arb, &s->tol.tol, uvec, svec); - j = 0; - for (i=0; i<8; i++) { - if (useThisVertex(i)) { - j++; - fprintf(fp, "pt[%d]: %.9f %.9f %.9f%s", - j, V3BASE2LOCAL(arb->pt[i]), eol); - } - } - break; - case ID_HALF: - haf = (struct rt_half_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Plane: %.9f %.9f %.9f %.9f%s", V4BASE2LOCAL(haf->eqn), eol); - break; - case ID_GRIP: - grip = (struct rt_grip_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Center: %.9f %.9f %.9f%s", V3BASE2LOCAL(grip->center), eol); - fprintf(fp, "Normal: %.9f %.9f %.9f%s", V3BASE2LOCAL(grip->normal), eol); - fprintf(fp, "Magnitude: %.9f%s", grip->mag*s->dbip->dbi_base2local, eol); - break; - case ID_PARTICLE: - part = (struct rt_part_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Vertex: %.9f %.9f %.9f%s", V3BASE2LOCAL(part->part_V), eol); - fprintf(fp, "Height: %.9f %.9f %.9f%s", V3BASE2LOCAL(part->part_H), eol); - fprintf(fp, "v radius: %.9f%s", part->part_vrad * s->dbip->dbi_base2local, eol); - fprintf(fp, "h radius: %.9f%s", part->part_hrad * s->dbip->dbi_base2local, eol); - break; - case ID_RPC: - rpc = (struct rt_rpc_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Vertex: %.9f %.9f %.9f%s", V3BASE2LOCAL(rpc->rpc_V), eol); - fprintf(fp, "Height: %.9f %.9f %.9f%s", V3BASE2LOCAL(rpc->rpc_H), eol); - fprintf(fp, "Breadth: %.9f %.9f %.9f%s", V3BASE2LOCAL(rpc->rpc_B), eol); - fprintf(fp, "Half-width: %.9f%s", rpc->rpc_r * s->dbip->dbi_base2local, eol); - break; - case ID_RHC: - rhc = (struct rt_rhc_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Vertex: %.9f %.9f %.9f%s", V3BASE2LOCAL(rhc->rhc_V), eol); - fprintf(fp, "Height: %.9f %.9f %.9f%s", V3BASE2LOCAL(rhc->rhc_H), eol); - fprintf(fp, "Breadth: %.9f %.9f %.9f%s", V3BASE2LOCAL(rhc->rhc_B), eol); - fprintf(fp, "Half-width: %.9f%s", rhc->rhc_r * s->dbip->dbi_base2local, eol); - fprintf(fp, "Dist_to_asymptotes: %.9f%s", rhc->rhc_c * s->dbip->dbi_base2local, eol); - break; - case ID_EPA: - epa = (struct rt_epa_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Vertex: %.9f %.9f %.9f%s", V3BASE2LOCAL(epa->epa_V), eol); - fprintf(fp, "Height: %.9f %.9f %.9f%s", V3BASE2LOCAL(epa->epa_H), eol); - fprintf(fp, "Semi-major axis: %.9f %.9f %.9f%s", V3ARGS(epa->epa_Au), eol); - fprintf(fp, "Semi-major length: %.9f%s", epa->epa_r1 * s->dbip->dbi_base2local, eol); - fprintf(fp, "Semi-minor length: %.9f%s", epa->epa_r2 * s->dbip->dbi_base2local, eol); - break; - case ID_EHY: - ehy = (struct rt_ehy_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Vertex: %.9f %.9f %.9f%s", V3BASE2LOCAL(ehy->ehy_V), eol); - fprintf(fp, "Height: %.9f %.9f %.9f%s", V3BASE2LOCAL(ehy->ehy_H), eol); - fprintf(fp, "Semi-major axis: %.9f %.9f %.9f%s", V3ARGS(ehy->ehy_Au), eol); - fprintf(fp, "Semi-major length: %.9f%s", ehy->ehy_r1 * s->dbip->dbi_base2local, eol); - fprintf(fp, "Semi-minor length: %.9f%s", ehy->ehy_r2 * s->dbip->dbi_base2local, eol); - fprintf(fp, "Dist to asymptotes: %.9f%s", ehy->ehy_c * s->dbip->dbi_base2local, eol); - break; - case ID_HYP: - hyp = (struct rt_hyp_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Vertex: %.9f %.9f %.9f%s", V3BASE2LOCAL(hyp->hyp_Vi), eol); - fprintf(fp, "Height: %.9f %.9f %.9f%s", V3BASE2LOCAL(hyp->hyp_Hi), eol); - fprintf(fp, "Semi-major axis: %.9f %.9f %.9f%s", V3BASE2LOCAL(hyp->hyp_A), eol); - fprintf(fp, "Semi-minor length: %.9f%s", hyp->hyp_b * s->dbip->dbi_base2local, eol); - fprintf(fp, "Ratio of Neck to Base: %.9f%s", hyp->hyp_bnr, eol); - break; - case ID_ETO: - eto = (struct rt_eto_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Vertex: %.9f %.9f %.9f%s", V3BASE2LOCAL(eto->eto_V), eol); - fprintf(fp, "Normal: %.9f %.9f %.9f%s", V3BASE2LOCAL(eto->eto_N), eol); - fprintf(fp, "Semi-major axis: %.9f %.9f %.9f%s", V3BASE2LOCAL(eto->eto_C), eol); - fprintf(fp, "Semi-minor length: %.9f%s", eto->eto_rd * s->dbip->dbi_base2local, eol); - fprintf(fp, "Radius of rotation: %.9f%s", eto->eto_r * s->dbip->dbi_base2local, eol); - break; - case ID_SUPERELL: - superell = (struct rt_superell_internal *)s->edit_state.es_int.idb_ptr; - fprintf(fp, "Vertex: %.9f %.9f %.9f%s", V3BASE2LOCAL(superell->v), eol); - fprintf(fp, "A: %.9f %.9f %.9f%s", V3BASE2LOCAL(superell->a), eol); - fprintf(fp, "B: %.9f %.9f %.9f%s", V3BASE2LOCAL(superell->b), eol); - fprintf(fp, "C: %.9f %.9f %.9f%s", V3BASE2LOCAL(superell->c), eol); - fprintf(fp, ": <%.9f, %.9f>%s", superell->n, superell->e, eol); - break; - case ID_DATUM: - datum = (struct rt_datum_internal *)s->edit_state.es_int.idb_ptr; - do { - if (!ZERO(datum->w)) - fprintf(fp, "Plane: %.9f %.9f %.9f (pnt) %.9f %.9f %.9f (dir) %.9f (scale)%s", V3BASE2LOCAL(datum->pnt), V3BASE2LOCAL(datum->dir), datum->w, eol); - else if (!ZERO(MAGNITUDE(datum->dir))) - fprintf(fp, "Line: %.9f %.9f %.9f (pnt) %.9f %.9f %.9f (dir)%s", V3BASE2LOCAL(datum->pnt), V3BASE2LOCAL(datum->dir), eol); - else - fprintf(fp, "Point: %.9f %.9f %.9f%s", V3BASE2LOCAL(datum->pnt), eol); - } while ((datum = datum->next)); - - break; + struct rt_db_internal *ip = &s->s_edit->es_int; + if (!EDOBJ[ip->idb_type].ft_write_params) { + Tcl_AppendResult(s->interp, "Cannot text edit this solid type\n", (char *)NULL); + return 1; } + struct bu_vls params = BU_VLS_INIT_ZERO; + (*EDOBJ[ip->idb_type].ft_write_params)(¶ms, ip, &s->tol.tol, s->dbip->dbi_base2local); + fp = fopen(tmpfil, "w"); + fprintf(fp, "%s", bu_vls_cstr(¶ms)); (void)fclose(fp); return 0; } - -static char * -Get_next_line(FILE *fp) -{ - static char line[RT_MAXLINE]; - size_t i; - size_t len; - - if (bu_fgets(line, sizeof(line), fp) == NULL) - return (char *)NULL; - - len = strlen(line); - - i = 0; - while (is_edit->es_int; + + if (!EDOBJ[ip->idb_type].ft_read_params) { + Tcl_AppendResult(s->interp, "Cannot text edit this solid type\n", (char *)NULL); + return 1; + } + + struct bu_vls solid_in = BU_VLS_INIT_ZERO; + struct bu_mapped_file *mf = bu_open_mapped_file(tmpfil, (char *)NULL); + if (!mf) { + bu_log("cannot read temporary file \"%s\"\n", tmpfil); return 1; /* FAIL */ } + bu_vls_strncpy(&solid_in, (char *)mf->buf, mf->buflen); + bu_close_mapped_file(mf); - switch (s->edit_state.es_int.idb_type) { - struct rt_tor_internal *tor; - struct rt_tgc_internal *tgc; - struct rt_ell_internal *ell; - struct rt_arb_internal *arb; - struct rt_half_internal *haf; - struct rt_grip_internal *grip; - struct rt_rpc_internal *rpc; - struct rt_rhc_internal *rhc; - struct rt_epa_internal *epa; - struct rt_ehy_internal *ehy; - struct rt_hyp_internal *hyp; - struct rt_eto_internal *eto; - struct rt_part_internal *part; - struct rt_superell_internal *superell; - struct rt_datum_internal *datum; - - char *str; - double a, b, c, d, e, f, g; - - default: - Tcl_AppendResult(s->interp, "Cannot text edit this solid type\n", (char *)NULL); - ret_val = 1; - break; - case ID_TOR: - tor = (struct rt_tor_internal *)s->edit_state.es_int.idb_ptr; - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(tor->v, a, b, c); - VSCALE(tor->v, tor->v, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(tor->h, a, b, c); - VUNITIZE(tor->h); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - tor->r_a = a * s->dbip->dbi_local2base; - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - tor->r_h = a * s->dbip->dbi_local2base; - break; - case ID_TGC: - case ID_REC: - tgc = (struct rt_tgc_internal *)s->edit_state.es_int.idb_ptr; - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(tgc->v, a, b, c); - VSCALE(tgc->v, tgc->v, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(tgc->h, a, b, c); - VSCALE(tgc->h, tgc->h, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(tgc->a, a, b, c); - VSCALE(tgc->a, tgc->a, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(tgc->b, a, b, c); - VSCALE(tgc->b, tgc->b, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(tgc->c, a, b, c); - VSCALE(tgc->c, tgc->c, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(tgc->d, a, b, c); - VSCALE(tgc->d, tgc->d, s->dbip->dbi_local2base); - - break; - case ID_ELL: - case ID_SPH: - ell = (struct rt_ell_internal *)s->edit_state.es_int.idb_ptr; - - fprintf(stderr, "ID_SPH\n"); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(ell->v, a, b, c); - VSCALE(ell->v, ell->v, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(ell->a, a, b, c); - VSCALE(ell->a, ell->a, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(ell->b, a, b, c); - VSCALE(ell->b, ell->b, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(ell->c, a, b, c); - VSCALE(ell->c, ell->c, s->dbip->dbi_local2base); - break; - case ID_ARB8: - arb = (struct rt_arb_internal *)s->edit_state.es_int.idb_ptr; - for (i=0; i<8; i++) { - /* only read vertices that we wrote */ - if (useThisVertex(i)) { - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(arb->pt[i], a, b, c); - VSCALE(arb->pt[i], arb->pt[i], s->dbip->dbi_local2base); - } - } - /* fill in the duplicate vertices - * (based on rt_arb_get_cgtype called in writesolid) - */ - if (svec[0] != -1) { - for (i=1; ipt[svec[start+i]], arb->pt[svec[start]]); - } - } - if (svec[1] != -1) { - int start = 2 + svec[0]; - for (i=1; ipt[svec[start+i]], arb->pt[svec[start]]); - } - } - break; - case ID_HALF: - haf = (struct rt_half_internal *)s->edit_state.es_int.idb_ptr; - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf %lf", &a, &b, &c, &d); - VSET(haf->eqn, a, b, c); - haf->eqn[W] = d * s->dbip->dbi_local2base; - break; - case ID_GRIP: - grip = (struct rt_grip_internal *)s->edit_state.es_int.idb_ptr; - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(grip->center, a, b, c); - VSCALE(grip->center, grip->center, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(grip->normal, a, b, c); - break; - case ID_PARTICLE: - part = (struct rt_part_internal *)s->edit_state.es_int.idb_ptr; - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(part->part_V, a, b, c); - VSCALE(part->part_V, part->part_V, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(part->part_H, a, b, c); - VSCALE(part->part_H, part->part_H, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - part->part_vrad = a * s->dbip->dbi_local2base; - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - part->part_hrad = a * s->dbip->dbi_local2base; - - break; - case ID_RPC: - rpc = (struct rt_rpc_internal *)s->edit_state.es_int.idb_ptr; - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(rpc->rpc_V, a, b, c); - VSCALE(rpc->rpc_V, rpc->rpc_V, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(rpc->rpc_H, a, b, c); - VSCALE(rpc->rpc_H, rpc->rpc_H, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(rpc->rpc_B, a, b, c); - VSCALE(rpc->rpc_B, rpc->rpc_B, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - rpc->rpc_r = a * s->dbip->dbi_local2base; - break; - case ID_RHC: - rhc = (struct rt_rhc_internal *)s->edit_state.es_int.idb_ptr; - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(rhc->rhc_V, a, b, c); - VSCALE(rhc->rhc_V, rhc->rhc_V, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(rhc->rhc_H, a, b, c); - VSCALE(rhc->rhc_H, rhc->rhc_H, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(rhc->rhc_B, a, b, c); - VSCALE(rhc->rhc_B, rhc->rhc_B, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - rhc->rhc_r = a * s->dbip->dbi_local2base; - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - rhc->rhc_c = a * s->dbip->dbi_local2base; - break; - case ID_EPA: - epa = (struct rt_epa_internal *)s->edit_state.es_int.idb_ptr; - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(epa->epa_V, a, b, c); - VSCALE(epa->epa_V, epa->epa_V, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(epa->epa_H, a, b, c); - VSCALE(epa->epa_H, epa->epa_H, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(epa->epa_Au, a, b, c); - VUNITIZE(epa->epa_Au); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - epa->epa_r1 = a * s->dbip->dbi_local2base; - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - epa->epa_r2 = a * s->dbip->dbi_local2base; - break; - case ID_EHY: - ehy = (struct rt_ehy_internal *)s->edit_state.es_int.idb_ptr; - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(ehy->ehy_V, a, b, c); - VSCALE(ehy->ehy_V, ehy->ehy_V, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(ehy->ehy_H, a, b, c); - VSCALE(ehy->ehy_H, ehy->ehy_H, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(ehy->ehy_Au, a, b, c); - VUNITIZE(ehy->ehy_Au); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - ehy->ehy_r1 = a * s->dbip->dbi_local2base; - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - ehy->ehy_r2 = a * s->dbip->dbi_local2base; - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - ehy->ehy_c = a * s->dbip->dbi_local2base; - break; - case ID_HYP: - hyp = (struct rt_hyp_internal *)s->edit_state.es_int.idb_ptr; - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(hyp->hyp_Vi, a, b, c); - VSCALE(hyp->hyp_Vi, hyp->hyp_Vi, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(hyp->hyp_Hi, a, b, c); - VSCALE(hyp->hyp_Hi, hyp->hyp_Hi, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(hyp->hyp_A, a, b, c); - VSCALE(hyp->hyp_A, hyp->hyp_A, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - hyp->hyp_b = a * s->dbip->dbi_local2base; - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - hyp->hyp_bnr = a; - - break; - case ID_ETO: - eto = (struct rt_eto_internal *)s->edit_state.es_int.idb_ptr; - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(eto->eto_V, a, b, c); - VSCALE(eto->eto_V, eto->eto_V, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(eto->eto_N, a, b, c); - VUNITIZE(eto->eto_N); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(eto->eto_C, a, b, c); - VSCALE(eto->eto_C, eto->eto_C, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - eto->eto_rd = a * s->dbip->dbi_local2base; - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf", &a); - eto->eto_r = a * s->dbip->dbi_local2base; - break; - case ID_SUPERELL: - superell = (struct rt_superell_internal *)s->edit_state.es_int.idb_ptr; - - fprintf(stderr, "ID_SUPERELL\n"); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(superell->v, a, b, c); - VSCALE(superell->v, superell->v, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(superell->a, a, b, c); - VSCALE(superell->a, superell->a, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(superell->b, a, b, c); - VSCALE(superell->b, superell->b, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(superell->c, a, b, c); - VSCALE(superell->c, superell->c, s->dbip->dbi_local2base); - - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - (void) sscanf(str, "%lf %lf", &superell->n, &superell->e); - break; - case ID_DATUM: - datum = (struct rt_datum_internal *)s->edit_state.es_int.idb_ptr; - do { - if ((str=Get_next_line(fp)) == NULL) { - ret_val = 1; - break; - } - if (bu_strncasecmp(str, "point", strlen("point")) == 0) { - sscanf(str, "%lf %lf %lf", &a, &b, &c); - VSET(datum->pnt, a, b, c); - VSCALE(datum->pnt, datum->pnt, s->dbip->dbi_local2base); - } else if (bu_strncasecmp(str, "line", strlen("line")) == 0) { - sscanf(str, "%lf %lf %lf %lf %lf %lf", &a, &b, &c, &d, &e, &f); - VSET(datum->pnt, a, b, c); - VSET(datum->dir, d, e, f); - VSCALE(datum->pnt, datum->pnt, s->dbip->dbi_local2base); - VSCALE(datum->dir, datum->dir, s->dbip->dbi_local2base); - } else if (bu_strncasecmp(str, "plane", strlen("plane")) == 0) { - sscanf(str, "%lf %lf %lf %lf %lf %lf %lf", &a, &b, &c, &d, &e, &f, &g); - VSET(datum->pnt, a, b, c); - VSET(datum->dir, d, e, f); - VSCALE(datum->pnt, datum->pnt, s->dbip->dbi_local2base); - VSCALE(datum->dir, datum->dir, s->dbip->dbi_local2base); - datum->w = g; - } - } while ((datum = datum->next)); - - break; + if ((*EDOBJ[ip->idb_type].ft_read_params)(ip, bu_vls_cstr(&solid_in), &s->tol.tol, s->dbip->dbi_local2base) == BRLCAD_ERROR) { + bu_vls_free(&solid_in); + return 1; /* FAIL */ } - (void)fclose(fp); - return ret_val; + bu_vls_free(&solid_in); + return 0; } diff --git a/src/mged/titles.c b/src/mged/titles.c index d983cd9bdc..325aa2406b 100644 --- a/src/mged/titles.c +++ b/src/mged/titles.c @@ -38,9 +38,6 @@ #define USE_OLD_MENUS 0 -/* should only be accessed via STATE define in mged.h */ -int ged_state; - char *state_str[] = { "-ZOT-", "VIEWING", @@ -53,7 +50,7 @@ char *state_str[] = { "UNKNOWN", }; - +/* Ew. Global. */ extern mat_t perspective_mat; /* defined in dozoom.c */ /* @@ -76,7 +73,7 @@ create_text_overlay(struct mged_state *s, struct bu_vls *vp) * Check if the illuminated solid still exists or it has been killed * before Accept was clicked. */ - if (es_edflag >= 0 && illump != NULL && illump->s_u_data != NULL) { + if (s->s_edit && s->s_edit->edit_flag >= 0 && illump != NULL && illump->s_u_data != NULL) { struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; dp = LAST_SOLID(bdata); @@ -85,7 +82,7 @@ create_text_overlay(struct mged_state *s, struct bu_vls *vp) bu_vls_strcat(vp, dp->d_namep); bu_vls_strcat(vp, ": "); - vls_solid(s, vp, &s->edit_state.es_int, bn_mat_identity); + vls_solid(s, vp, s->s_edit, bn_mat_identity); if (bdata->s_fullpath.fp_len > 1) { bu_vls_strcat(vp, "\n** PATH -- "); @@ -93,12 +90,12 @@ create_text_overlay(struct mged_state *s, struct bu_vls *vp) bu_vls_strcat(vp, ": "); /* print the evaluated (path) solid parameters */ - vls_solid(s, vp, &s->edit_state.es_int, es_mat); + vls_solid(s, vp, s->s_edit, s->s_edit->e_mat); } } /* display path info for object editing also */ - if (GEOM_EDIT_STATE == ST_O_EDIT && illump != NULL && illump->s_u_data != NULL) { + if (s->edit_state.global_editing_state == ST_O_EDIT && illump != NULL && illump->s_u_data != NULL) { struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; bu_vls_strcat(vp, "** PATH -- "); @@ -110,9 +107,9 @@ create_text_overlay(struct mged_state *s, struct bu_vls *vp) mat_t new_mat; /* NOT an evaluated region */ /* object edit option selected */ - bn_mat_mul(new_mat, modelchanges, es_mat); + bn_mat_mul(new_mat, s->s_edit->model_changes, s->s_edit->e_mat); - vls_solid(s, vp, &s->edit_state.es_int, new_mat); + vls_solid(s, vp, s->s_edit, new_mat); } } @@ -341,22 +338,22 @@ dotitles(struct mged_state *s, struct bu_vls *overlay_vls) dm_set_line_attr(DMP, mged_variables->mv_linewidth, 0); /* Label the vertices of the edited solid */ - if (es_edflag >= 0 || (GEOM_EDIT_STATE == ST_O_EDIT && illump->s_old.s_Eflag == 0)) { + if ((s->s_edit && s->s_edit->edit_flag >= 0) || (s->edit_state.global_editing_state == ST_O_EDIT && illump->s_old.s_Eflag == 0)) { mat_t xform; - struct rt_point_labels pl[8+1]; + struct rt_point_labels pl[8+1] = {RT_POINT_LABELS_INIT}; point_t lines[2*4]; /* up to 4 lines to draw */ int num_lines=0; if (view_state->vs_gvp->gv_perspective <= 0) - bn_mat_mul(xform, view_state->vs_model2objview, es_mat); + bn_mat_mul(xform, view_state->vs_model2objview, s->s_edit->e_mat); else { mat_t tmat; - bn_mat_mul(tmat, view_state->vs_model2objview, es_mat); + bn_mat_mul(tmat, view_state->vs_model2objview, s->s_edit->e_mat); bn_mat_mul(xform, perspective_mat, tmat); } - label_edited_solid(s, &num_lines, lines, pl, 8+1, xform, &s->edit_state.es_int); + label_edited_solid(s, &num_lines, lines, pl, 8+1, xform, &s->s_edit->es_int); dm_set_fg(DMP, color_scheme->cs_geo_label[0], @@ -411,7 +408,7 @@ dotitles(struct mged_state *s, struct bu_vls *overlay_vls) color_scheme->cs_state_text1[0], color_scheme->cs_state_text1[1], color_scheme->cs_state_text1[2], 1, 1.0); - dm_draw_string_2d(DMP, state_str[GEOM_EDIT_STATE], + dm_draw_string_2d(DMP, state_str[s->edit_state.global_editing_state], GED2PM1(MENUX), GED2PM1(MENUY - MENU_DY), 1, 0); } else { scroll_ybot = SCROLLY; @@ -423,12 +420,12 @@ dotitles(struct mged_state *s, struct bu_vls *overlay_vls) * Print information about object illuminated */ if (illump != NULL && illump->s_u_data != NULL && - (GEOM_EDIT_STATE == ST_O_PATH || GEOM_EDIT_STATE==ST_O_PICK || GEOM_EDIT_STATE==ST_S_PICK)) { + (s->edit_state.global_editing_state == ST_O_PATH || s->edit_state.global_editing_state==ST_O_PICK || s->edit_state.global_editing_state==ST_S_PICK)) { struct ged_bv_data *bdata = (struct ged_bv_data *)illump->s_u_data; for (i=0; i < bdata->s_fullpath.fp_len; i++) { - if (i == (size_t)ipathpos && GEOM_EDIT_STATE == ST_O_PATH) { + if (i == (size_t)ipathpos && s->edit_state.global_editing_state == ST_O_PATH) { dm_set_fg(DMP, color_scheme->cs_state_text1[0], color_scheme->cs_state_text1[1], @@ -462,9 +459,9 @@ dotitles(struct mged_state *s, struct bu_vls *overlay_vls) mmenu_display(s, y); /* print parameter locations on screen */ - if (GEOM_EDIT_STATE == ST_O_EDIT && illump->s_old.s_Eflag) { + if (s->edit_state.global_editing_state == ST_O_EDIT && illump->s_old.s_Eflag) { /* region is a processed region */ - MAT4X3PNT(temp, view_state->vs_model2objview, es_keypoint); + MAT4X3PNT(temp, view_state->vs_model2objview, s->s_edit->e_keypoint); xloc = (int)(temp[X]*GED_MAX); yloc = (int)(temp[Y]*GED_MAX); dm_set_fg(DMP, @@ -558,16 +555,16 @@ dotitles(struct mged_state *s, struct bu_vls *overlay_vls) Tcl_SetVar(s->interp, bu_vls_addr(&s->mged_curr_dm->dm_adc_name), "", TCL_GLOBAL_ONLY); } - if (GEOM_EDIT_STATE == ST_S_EDIT || GEOM_EDIT_STATE == ST_O_EDIT) { + if (s->edit_state.global_editing_state == ST_S_EDIT || s->edit_state.global_editing_state == ST_O_EDIT) { struct bu_vls kp_vls = BU_VLS_INIT_ZERO; bu_vls_printf(&kp_vls, " Keypoint: %s %s: (%g, %g, %g)", - OBJ[s->edit_state.es_int.idb_type].ft_name+3, /* Skip ID_ */ - es_keytag, - es_keypoint[X] * s->dbip->dbi_base2local, - es_keypoint[Y] * s->dbip->dbi_base2local, - es_keypoint[Z] * s->dbip->dbi_base2local); + OBJ[s->s_edit->es_int.idb_type].ft_name+3, /* Skip ID_ */ + s->s_edit->e_keytag, + s->s_edit->e_keypoint[X] * s->dbip->dbi_base2local, + s->s_edit->e_keypoint[Y] * s->dbip->dbi_base2local, + s->s_edit->e_keypoint[Z] * s->dbip->dbi_base2local); if (mged_variables->mv_faceplate && ss_line_not_drawn) { dm_set_fg(DMP, color_scheme->cs_status_text2[0], @@ -600,7 +597,7 @@ dotitles(struct mged_state *s, struct bu_vls *overlay_vls) bu_vls_strcat(&vls, " Path: "); for (i=0; i < bdata->s_fullpath.fp_len; i++) { if (i == (size_t)ipathpos && - (GEOM_EDIT_STATE == ST_O_PATH || GEOM_EDIT_STATE == ST_O_EDIT)) + (s->edit_state.global_editing_state == ST_O_PATH || s->edit_state.global_editing_state == ST_O_EDIT)) bu_vls_strcat(&vls, "/__MATRIX__"); bu_vls_printf(&vls, "/%s", DB_FULL_PATH_GET(&bdata->s_fullpath, i)->d_namep); diff --git a/src/mged/track.c b/src/mged/track.c index b8a6a0dfdd..785a673ef0 100644 --- a/src/mged/track.c +++ b/src/mged/track.c @@ -71,9 +71,12 @@ f_amtrack(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[ MGED_CK_CMD(ctp); struct mged_state *s = ctp->s; - int item_default = 1000; /* GIFT region ID */ - int mat_default = 1; /* GIFT material code */ - int los_default = 100; /* Line-of-sight estimate */ + // TODO - need to confirm the actual intent of this code is to have the + // assignments to default made in subsequent function logic persist beyond + // one call to f_amtrack. + static int item_default = 1000; /* GIFT region ID */ + static int mat_default = 1; /* GIFT material code */ + static int los_default = 100; /* Line-of-sight estimate */ fastf_t fw[3], lw[3], iw[3], dw[3], tr[3]; char solname[12], regname[12], grpname[9], oper[3]; diff --git a/src/mged/usepen.c b/src/mged/usepen.c index 84a96070f4..58d623ecb7 100644 --- a/src/mged/usepen.c +++ b/src/mged/usepen.c @@ -82,7 +82,7 @@ illuminate(struct mged_state *s, int y) { gdlp = next_gdlp; } - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); } @@ -112,14 +112,14 @@ f_aip(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) if (!(s->mged_curr_dm->dm_ndrawn)) { return TCL_OK; - } else if (GEOM_EDIT_STATE != ST_S_PICK && GEOM_EDIT_STATE != ST_O_PICK && GEOM_EDIT_STATE != ST_O_PATH) { + } else if (s->edit_state.global_editing_state != ST_S_PICK && s->edit_state.global_editing_state != ST_O_PICK && s->edit_state.global_editing_state != ST_O_PATH) { return TCL_OK; } if (illump != NULL && illump->s_u_data != NULL) bdata = (struct ged_bv_data *)illump->s_u_data; - if (GEOM_EDIT_STATE == ST_O_PATH && bdata) { + if (s->edit_state.global_editing_state == ST_O_PATH && bdata) { if (argc == 1 || *argv[1] == 'f') { ++ipathpos; if ((size_t)ipathpos >= bdata->s_fullpath.fp_len) @@ -171,7 +171,7 @@ f_aip(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) illum_gdlp = gdlp; } - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); return TCL_OK; } @@ -328,7 +328,7 @@ f_matpick(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[ init_oedit(s); } - update_views = 1; + s->update_views = 1; dm_set_dirty(DMP, 1); return TCL_OK; } @@ -459,7 +459,7 @@ f_mouse( * the host being informed when the mouse changes position. * However, for now, illuminate mode makes this impossible. */ - if (up == 0) switch (GEOM_EDIT_STATE) { + if (up == 0) switch (s->edit_state.global_editing_state) { case ST_VIEW: case ST_S_EDIT: @@ -487,7 +487,7 @@ f_mouse( view_state->vs_flag = 1; return TCL_OK; - } else switch (GEOM_EDIT_STATE) { + } else switch (s->edit_state.global_editing_state) { case ST_VIEW: /* @@ -537,9 +537,12 @@ f_mouse( return TCL_OK; } +#if 0 + // TODO - this needs to be a method call, not a public function case ST_S_VPICK: - sedit_vpick(s, mousevec); + sedit_vpick(s->s_edit, mousevec); return TCL_OK; +#endif case ST_O_EDIT: if ((OEDIT_TRAN || OEDIT_SCALE) && mged_variables->mv_transform == 'e') diff --git a/src/mged/utility1.c b/src/mged/utility1.c index 6a37b7bc7b..58525c798c 100644 --- a/src/mged/utility1.c +++ b/src/mged/utility1.c @@ -71,38 +71,6 @@ FILE *tabptr; char ctemp[7]; - -/* - * - * No-frills edit - opens an editor on the supplied - * file name. - * - */ -int -editit(struct mged_state *s, const char *command, const char *tempfile) { - int argc = 5; - const char *av[6] = {NULL, NULL, NULL, NULL, NULL, NULL}; - struct bu_vls editstring = BU_VLS_INIT_ZERO; - - CHECK_DBI_NULL; - - if (!get_editor_string(s, &editstring)) - return TCL_ERROR; - - av[0] = command; - av[1] = "-e"; - av[2] = bu_vls_addr(&editstring); - av[3] = "-f"; - av[4] = tempfile; - av[5] = NULL; - - ged_exec(s->gedp, argc, (const char **)av); - - bu_vls_free(&editstring); - return TCL_OK; -} - - /* * * control routine for editing color