Revision: 51689 http://brlcad.svn.sourceforge.net/brlcad/?rev=51689&view=rev Author: bob1961 Date: 2012-07-27 12:04:25 +0000 (Fri, 27 Jul 2012) Log Message: ----------- Added a mechanism for using mouse interactions to edit the matrix above some member of a combination. Previously, mouse interactions resulted in edits getting pushed into the selected object. That is if the selected object was a combination, the edits wound up as matrices above all members in the combination. And if the selected object was a primitive, the edits were pushed into the primitive. Archer has another mode button in the toolbar for deciding how mouse interactions are applied to the select object.
Modified Paths: -------------- brlcad/trunk/include/tclcad.h brlcad/trunk/src/libtclcad/tclcad_obj.c brlcad/trunk/src/tclscripts/archer/Archer.tcl brlcad/trunk/src/tclscripts/archer/ArcherCore.tcl brlcad/trunk/src/tclscripts/archer/images/CMakeLists.txt brlcad/trunk/src/tclscripts/lib/Ged.tcl Added Paths: ----------- brlcad/trunk/src/tclscripts/archer/images/matrixModeAbove.png brlcad/trunk/src/tclscripts/archer/images/matrixModeBelow.png Modified: brlcad/trunk/include/tclcad.h =================================================================== --- brlcad/trunk/include/tclcad.h 2012-07-27 02:44:15 UTC (rev 51688) +++ brlcad/trunk/include/tclcad.h 2012-07-27 12:04:25 UTC (rev 51689) @@ -85,6 +85,7 @@ struct ged_dm_view { struct bu_list l; struct bu_vls gdv_callback; + struct bu_vls gdv_edit_motion_delta_callback; struct bu_vls gdv_name; struct ged_view *gdv_view; struct dm *gdv_dmp; Modified: brlcad/trunk/src/libtclcad/tclcad_obj.c =================================================================== --- brlcad/trunk/src/libtclcad/tclcad_obj.c 2012-07-27 02:44:15 UTC (rev 51688) +++ brlcad/trunk/src/libtclcad/tclcad_obj.c 2012-07-27 12:04:25 UTC (rev 51689) @@ -308,6 +308,12 @@ ged_func_ptr func, const char *usage, int maxargs); +HIDDEN int to_edit_motion_delta_callback(struct ged *gedp, + int argc, + const char *argv[], + ged_func_ptr func, + const char *usage, + int maxargs); HIDDEN int to_more_args_callback(struct ged *gedp, int argc, const char *argv[], @@ -954,6 +960,7 @@ {"mirror", (char *)0, TO_UNLIMITED, to_mirror, GED_FUNC_PTR_NULL}, {"model2view", "vname", 2, to_view_func, ged_model2view}, {"model_axes", "???", TO_UNLIMITED, to_model_axes, GED_FUNC_PTR_NULL}, + {"edit_motion_delta_callback", "vname [args]", TO_UNLIMITED, to_edit_motion_delta_callback, GED_FUNC_PTR_NULL}, {"more_args_callback", "set/get the \"more args\" callback", TO_UNLIMITED, to_more_args_callback, GED_FUNC_PTR_NULL}, {"move_arb_edge", (char *)0, TO_UNLIMITED, to_pass_through_func, ged_move_arb_edge}, {"move_arb_edge_mode", "obj edge x y", TO_UNLIMITED, to_move_arb_edge_mode, GED_FUNC_PTR_NULL}, @@ -1262,6 +1269,7 @@ BU_LIST_DEQUEUE(&(gdvp->l)); bu_vls_free(&gdvp->gdv_name); bu_vls_free(&gdvp->gdv_callback); + bu_vls_free(&gdvp->gdv_edit_motion_delta_callback); DM_CLOSE(gdvp->gdv_dmp); bu_free((genptr_t)gdvp->gdv_view, "ged_view"); @@ -4908,6 +4916,7 @@ BU_LIST_DEQUEUE(&(gdvp->l)); bu_vls_free(&gdvp->gdv_name); bu_vls_free(&gdvp->gdv_callback); + bu_vls_free(&gdvp->gdv_edit_motion_delta_callback); DM_CLOSE(gdvp->gdv_dmp); bu_free((genptr_t)gdvp->gdv_view, "ged_view"); bu_free((genptr_t)gdvp, "ged_dm_view"); @@ -5962,7 +5971,54 @@ return to_axes(gedp, gdvp, &gdvp->gdv_view->gv_model_axes, argc, argv, usage); } + HIDDEN int +to_edit_motion_delta_callback(struct ged *gedp, + int argc, + const char *argv[], + ged_func_ptr UNUSED(func), + const char *usage, + int UNUSED(maxargs)) +{ + register int i; + struct ged_dm_view *gdvp; + + /* initialize result */ + bu_vls_trunc(gedp->ged_result_str, 0); + + /* must be wanting help */ + if (argc == 1) { + bu_vls_printf(gedp->ged_result_str, "Usage: %s %s", argv[0], usage); + return GED_HELP; + } + + for (BU_LIST_FOR(gdvp, ged_dm_view, ¤t_top->to_gop->go_head_views.l)) { + if (BU_STR_EQUAL(bu_vls_addr(&gdvp->gdv_name), argv[1])) + break; + } + + if (BU_LIST_IS_HEAD(&gdvp->l, ¤t_top->to_gop->go_head_views.l)) { + bu_vls_printf(gedp->ged_result_str, "View not found - %s", argv[1]); + return GED_ERROR; + } + + /* get the callback string */ + if (argc == 2) { + bu_vls_printf(gedp->ged_result_str, "%s", bu_vls_addr(&gdvp->gdv_edit_motion_delta_callback)); + + return GED_OK; + } + + /* set the callback string */ + bu_vls_trunc(&gdvp->gdv_edit_motion_delta_callback, 0); + for (i = 2; i < argc; ++i) + bu_vls_printf(&gdvp->gdv_edit_motion_delta_callback, "%s ", argv[i]); + + return GED_OK; +} + + +HIDDEN int to_more_args_callback(struct ged *gedp, int argc, const char *argv[], @@ -6657,8 +6713,6 @@ const char *usage, int UNUSED(maxargs)) { - int ret; - char *av[6]; fastf_t x, y; fastf_t dx, dy; point_t model; @@ -6727,25 +6781,36 @@ bu_vls_printf(&rot_z_vls, "%lf", model[Z]); gedp->ged_gvp = gdvp->gdv_view; - av[0] = "orotate"; - av[1] = (char *)argv[2]; - av[2] = bu_vls_addr(&rot_x_vls); - av[3] = bu_vls_addr(&rot_y_vls); - av[4] = bu_vls_addr(&rot_z_vls); - av[5] = (char *)0; - ret = ged_orotate(gedp, 5, (const char **)av); + if (0 < bu_vls_strlen(&gdvp->gdv_edit_motion_delta_callback)) { + struct bu_vls tcl_cmd; + + bu_vls_init(&tcl_cmd); + bu_vls_printf(&tcl_cmd, "%V orotate %V %V %V", &gdvp->gdv_edit_motion_delta_callback, &rot_x_vls, &rot_y_vls, &rot_z_vls); + Tcl_Eval(current_top->to_interp, bu_vls_addr(&tcl_cmd)); + bu_vls_free(&tcl_cmd); + } else { + char *av[6]; + + av[0] = "orotate"; + av[1] = (char *)argv[2]; + av[2] = bu_vls_addr(&rot_x_vls); + av[3] = bu_vls_addr(&rot_y_vls); + av[4] = bu_vls_addr(&rot_z_vls); + av[5] = (char *)0; + + if (ged_orotate(gedp, 5, (const char **)av) == GED_OK) { + av[0] = "draw"; + av[1] = (char *)argv[2]; + av[2] = (char *)0; + to_edit_redraw(gedp, 2, (const char **)av); + } + } + bu_vls_free(&rot_x_vls); bu_vls_free(&rot_y_vls); bu_vls_free(&rot_z_vls); - if (ret == GED_OK) { - av[0] = "draw"; - av[1] = (char *)argv[2]; - av[2] = (char *)0; - to_edit_redraw(gedp, 2, (const char **)av); - } - return GED_OK; } @@ -6757,8 +6822,6 @@ const char *usage, int UNUSED(maxargs)) { - int ret; - char *av[6]; fastf_t x, y; fastf_t dx, dy; fastf_t sf; @@ -6824,21 +6887,32 @@ bu_vls_printf(&sf_vls, "%lf", sf); gedp->ged_gvp = gdvp->gdv_view; - av[0] = "oscale"; - av[1] = (char *)argv[2]; - av[2] = bu_vls_addr(&sf_vls); - av[3] = (char *)0; - ret = ged_oscale(gedp, 3, (const char **)av); - bu_vls_free(&sf_vls); + if (0 < bu_vls_strlen(&gdvp->gdv_edit_motion_delta_callback)) { + struct bu_vls tcl_cmd; - if (ret == GED_OK) { - av[0] = "draw"; + bu_vls_init(&tcl_cmd); + bu_vls_printf(&tcl_cmd, "%V oscale %V", &gdvp->gdv_edit_motion_delta_callback, &sf_vls); + Tcl_Eval(current_top->to_interp, bu_vls_addr(&tcl_cmd)); + bu_vls_free(&tcl_cmd); + } else { + char *av[6]; + + av[0] = "oscale"; av[1] = (char *)argv[2]; - av[2] = (char *)0; - to_edit_redraw(gedp, 2, (const char **)av); + av[2] = bu_vls_addr(&sf_vls); + av[3] = (char *)0; + + if (ged_oscale(gedp, 3, (const char **)av) == GED_OK) { + av[0] = "draw"; + av[1] = (char *)argv[2]; + av[2] = (char *)0; + to_edit_redraw(gedp, 2, (const char **)av); + } } + bu_vls_free(&sf_vls); + return GED_OK; } @@ -6850,8 +6924,6 @@ const char *usage, int UNUSED(maxargs)) { - int ret; - char *av[6]; fastf_t x, y; fastf_t dx, dy; fastf_t inv_width; @@ -6922,25 +6994,36 @@ bu_vls_printf(&tran_z_vls, "%lf", model[Z]); gedp->ged_gvp = gdvp->gdv_view; - av[0] = "otranslate"; - av[1] = (char *)argv[2]; - av[2] = bu_vls_addr(&tran_x_vls); - av[3] = bu_vls_addr(&tran_y_vls); - av[4] = bu_vls_addr(&tran_z_vls); - av[5] = (char *)0; - ret = ged_otranslate(gedp, 5, (const char **)av); + if (0 < bu_vls_strlen(&gdvp->gdv_edit_motion_delta_callback)) { + struct bu_vls tcl_cmd; + + bu_vls_init(&tcl_cmd); + bu_vls_printf(&tcl_cmd, "%V otranslate %V %V %V", &gdvp->gdv_edit_motion_delta_callback, &tran_x_vls, &tran_y_vls, &tran_z_vls); + Tcl_Eval(current_top->to_interp, bu_vls_addr(&tcl_cmd)); + bu_vls_free(&tcl_cmd); + } else { + char *av[6]; + + av[0] = "otranslate"; + av[1] = (char *)argv[2]; + av[2] = bu_vls_addr(&tran_x_vls); + av[3] = bu_vls_addr(&tran_y_vls); + av[4] = bu_vls_addr(&tran_z_vls); + av[5] = (char *)0; + + if (ged_otranslate(gedp, 5, (const char **)av) == GED_OK) { + av[0] = "draw"; + av[1] = (char *)argv[2]; + av[2] = (char *)0; + to_edit_redraw(gedp, 2, (const char **)av); + } + } + bu_vls_free(&tran_x_vls); bu_vls_free(&tran_y_vls); bu_vls_free(&tran_z_vls); - if (ret == GED_OK) { - av[0] = "draw"; - av[1] = (char *)argv[2]; - av[2] = (char *)0; - to_edit_redraw(gedp, 2, (const char **)av); - } - return GED_OK; } @@ -8462,6 +8545,7 @@ new_gdvp->gdv_gop = current_top->to_gop; bu_vls_init(&new_gdvp->gdv_name); bu_vls_init(&new_gdvp->gdv_callback); + bu_vls_init(&new_gdvp->gdv_edit_motion_delta_callback); bu_vls_printf(&new_gdvp->gdv_name, argv[name_index]); ged_view_init(new_gdvp->gdv_view); BU_LIST_INSERT(¤t_top->to_gop->go_head_views.l, &new_gdvp->l); @@ -8611,6 +8695,8 @@ return GED_OK; } + +/* to_model_delta_mode */ HIDDEN int to_otranslate_mode(struct ged *gedp, int argc, @@ -8668,6 +8754,7 @@ return GED_OK; } + HIDDEN int to_paint_rect_area(struct ged *gedp, int argc, @@ -10563,6 +10650,7 @@ return to_axes(gedp, gdvp, &gdvp->gdv_view->gv_view_axes, argc, argv, usage); } + HIDDEN int to_view_callback(struct ged *gedp, int argc, @@ -10608,6 +10696,7 @@ return GED_OK; } + HIDDEN int to_view_win_size(struct ged *gedp, int argc, Modified: brlcad/trunk/src/tclscripts/archer/Archer.tcl =================================================================== --- brlcad/trunk/src/tclscripts/archer/Archer.tcl 2012-07-27 02:44:15 UTC (rev 51688) +++ brlcad/trunk/src/tclscripts/archer/Archer.tcl 2012-07-27 12:04:25 UTC (rev 51689) @@ -182,8 +182,9 @@ method Load {_target} method saveDb {} method units {args} + method initCombImages {} + method initFbImages {} method initImages {} - method initFbImages {} method setDefaultBindingMode {_mode} # Object Edit Management @@ -242,6 +243,8 @@ method fbToggle {} method rtEndCallback {_aborted} method getRayBotNormalCos {_start _target _bot} + method editMotionDeltaCallback {args} + method toggleMatrixMode {} #XXX Need to split up menuStatusCB into one method per menu method menuStatusCB {_w} @@ -1631,6 +1634,7 @@ set mSavedViewEyePt "" set mSavedSize "" + $itk_component(ged) edit_motion_delta_callback_all [::itcl::code $this editMotionDeltaCallback] $itk_component(ged) refresh_on $itk_component(ged) refresh_all SetNormalCursor $this @@ -1667,6 +1671,47 @@ } +::itcl::body Archer::initCombImages {} { + set mImage_matrixModeAbove [image create photo \ + -file [file join $mImgDir matrixModeAbove.png]] + set mImage_matrixModeBelow [image create photo \ + -file [file join $mImgDir matrixModeBelow.png]] + + $itk_component(primaryToolbar) itemconfigure comb \ + -image [image create photo \ + -file [file join $mImgDir combination.png]] + + if {$mObjMatrixMode == $MATRIX_ABOVE_MODE} { + $itk_component(primaryToolbar) itemconfigure matrixmode \ + -image $mImage_matrixModeAbove + } else { + $itk_component(primaryToolbar) itemconfigure matrixmode \ + -image $mImage_matrixModeBelow + } +} + + +::itcl::body Archer::initFbImages {} { + set mImage_fbOff [image create photo -file [file join $mImgDir framebuffer_off.png]] + set mImage_fbOn [image create photo -file [file join $mImgDir framebuffer.png]] + set mImage_fbInterlay [image create photo -file [file join $mImgDir framebuffer_interlay.png]] + set mImage_fbOverlay [image create photo -file [file join $mImgDir framebuffer_overlay.png]] + set mImage_fbUnderlay [image create photo -file [file join $mImgDir framebuffer_underlay.png]] + set mImage_rt [image create photo -file [file join $mImgDir raytrace.png]] + set mImage_rtAbort [image create photo -file [file join $mImgDir raytrace_abort.png]] + + $itk_component(primaryToolbar) itemconfigure toggle_fb \ + -image $mImage_fbOn + $itk_component(primaryToolbar) itemconfigure toggle_fb_mode \ + -image $mImage_fbUnderlay + $itk_component(primaryToolbar) itemconfigure raytrace \ + -image $mImage_rt + $itk_component(primaryToolbar) itemconfigure clear_fb \ + -image [image create photo \ + -file [file join $mImgDir framebuffer_clear.png]] +} + + ::itcl::body Archer::initImages {} { if {$mInstanceInit} { return @@ -1694,9 +1739,6 @@ $itk_component(primaryToolbar) itemconfigure preferences \ -image [image create photo \ -file [file join $mImgDir configure.png]] - $itk_component(primaryToolbar) itemconfigure comb \ - -image [image create photo \ - -file [file join $mImgDir combination.png]] # $itk_component(primaryToolbar) itemconfigure arb6 \ -image [image create photo \ -file [file join $mImgDir primitive_arb6.png]] @@ -1820,31 +1862,11 @@ -file [file join $mImgDir rtimage.png]] } + initCombImages initFbImages } -::itcl::body Archer::initFbImages {} { - set mImage_fbOff [image create photo -file [file join $mImgDir framebuffer_off.png]] - set mImage_fbOn [image create photo -file [file join $mImgDir framebuffer.png]] - set mImage_fbInterlay [image create photo -file [file join $mImgDir framebuffer_interlay.png]] - set mImage_fbOverlay [image create photo -file [file join $mImgDir framebuffer_overlay.png]] - set mImage_fbUnderlay [image create photo -file [file join $mImgDir framebuffer_underlay.png]] - set mImage_rt [image create photo -file [file join $mImgDir raytrace.png]] - set mImage_rtAbort [image create photo -file [file join $mImgDir raytrace_abort.png]] - - $itk_component(primaryToolbar) itemconfigure toggle_fb \ - -image $mImage_fbOn - $itk_component(primaryToolbar) itemconfigure toggle_fb_mode \ - -image $mImage_fbUnderlay - $itk_component(primaryToolbar) itemconfigure raytrace \ - -image $mImage_rt - $itk_component(primaryToolbar) itemconfigure clear_fb \ - -image [image create photo \ - -file [file join $mImgDir framebuffer_clear.png]] -} - - ::itcl::body Archer::setDefaultBindingMode {_mode} { set saved_mode $mDefaultBindingMode @@ -3956,6 +3978,129 @@ } +::itcl::body Archer::editMotionDeltaCallback {args} { + set argslen [llength $args] + if {$argslen < 2} { + return + } + + if {$mObjMatrixMode == $MATRIX_ABOVE_MODE && $mSelectedObjPath != $mSelectedObj} { + set plist [split $mSelectedObjPath /] + set pobj [lindex $plist end-1] + } else { + set pobj $mSelectedObjPath + } + + switch -- [lindex $args 0] { + "orotate" { + if {$argslen != 4} { + return + } + + set rx [lindex $args 1] + set ry [lindex $args 2] + set rz [lindex $args 3] + + if {$mObjMatrixMode == $MATRIX_ABOVE_MODE && $mSelectedObjPath != $mSelectedObj} { + set ocenter [gedCmd ocenter $mSelectedObjPath] + set cx [lindex $ocenter 0] + set cy [lindex $ocenter 1] + set cz [lindex $ocenter 2] + + set cmd "$itk_component(ged) combmem -r 3 $pobj " + foreach item [split [$itk_component(ged) combmem -i 3 $pobj] "\n"] { + set obj [lindex $item 1] + + if {$obj == $mSelectedObj} { + set item [lreplace $item 2 end $rx $ry $rz $cx $cy $cz] + } + + append cmd " $item" + } + } else { + set cmd "orotate $pobj $rx $ry $rz" + } + } + "otranslate" { + if {$argslen != 4} { + return + } + + set dx [lindex $args 1] + set dy [lindex $args 2] + set dz [lindex $args 3] + + if {$mObjMatrixMode == $MATRIX_ABOVE_MODE && $mSelectedObjPath != $mSelectedObj} { + set cmd "$itk_component(ged) combmem -r 5 $pobj " + foreach item [split [$itk_component(ged) combmem -i 5 $pobj] "\n"] { + set obj [lindex $item 1] + + if {$obj == $mSelectedObj} { + set item [lreplace $item 2 end $dx $dy $dz] + } + + append cmd " $item" + } + } else { + set cmd "otranslate $pobj $dx $dy $dz" + } + } + "oscale" { + if {$argslen != 2} { + return + } + + set sf [lindex $args 1] + + if {$mObjMatrixMode == $MATRIX_ABOVE_MODE && $mSelectedObjPath != $mSelectedObj} { + set ocenter [gedCmd ocenter $mSelectedObjPath] + set cx [lindex $ocenter 0] + set cy [lindex $ocenter 1] + set cz [lindex $ocenter 2] + + set cmd "$itk_component(ged) combmem -r 6 $pobj " + foreach item [split [$itk_component(ged) combmem -i 6 $pobj] "\n"] { + set obj [lindex $item 1] + + if {$obj == $mSelectedObj} { + set item [lreplace $item 2 end $sf 1 1 1 $cx $cy $cz] + } + + append cmd " $item" + } + } else { + set cmd "oscale $pobj $sf" + } + } + default { + return + } + } + + eval $cmd + redrawObj $pobj 0 +} + + +::itcl::body Archer::toggleMatrixMode {} { + if {$mObjMatrixMode == $MATRIX_ABOVE_MODE} { + set mObjMatrixMode $MATRIX_BELOW_MODE + set mStatusStr "Toggle matrix mode. Currently set to \"Below\"" + $itk_component(primaryToolbar) itemconfigure matrixmode \ + -image $mImage_matrixModeBelow \ + -balloonstr "Toggle matrix mode. Currently set to \"Below\"" \ + -helpstr "Toggle matrix mode. Currently set to \"Below\"" + } else { + set mObjMatrixMode $MATRIX_ABOVE_MODE + set mStatusStr "Toggle matrix mode. Currently set to \"Aove\"" + $itk_component(primaryToolbar) itemconfigure matrixmode \ + -image $mImage_matrixModeAbove \ + -balloonstr "Toggle matrix mode. Currently set to \"Above\"" \ + -helpstr "Toggle matrix mode. Currently set to \"Above\"" + } +} + + ::itcl::body Archer::menuStatusCB {_w} { if {$mDoStatus} { # entry might not support -label (i.e. tearoffs) @@ -4258,9 +4403,11 @@ if {$_on} { $itk_component(primaryToolbar) itemconfigure other -state normal $itk_component(primaryToolbar) itemconfigure comb -state normal + $itk_component(primaryToolbar) itemconfigure matrixmode -state normal } else { $itk_component(primaryToolbar) itemconfigure other -state disabled $itk_component(primaryToolbar) itemconfigure comb -state disabled + $itk_component(primaryToolbar) itemconfigure matrixmode -state disabled } } @@ -4365,13 +4512,13 @@ buildWizardMenu - $itk_component(primaryToolbar) insert rotate frame fill4 \ +# $itk_component(primaryToolbar) insert rotate frame fill4 \ -relief flat \ -width 3 - $itk_component(primaryToolbar) insert rotate frame sep2 \ +# $itk_component(primaryToolbar) insert rotate frame sep2 \ -relief sunken \ -width 2 - $itk_component(primaryToolbar) insert rotate frame fill5 \ +# $itk_component(primaryToolbar) insert rotate frame fill5 \ -relief flat \ -width 3 @@ -4423,13 +4570,13 @@ -relief flat # half-size spacer - $itk_component(primaryToolbar) insert rotate frame fill6 \ +# $itk_component(primaryToolbar) insert rotate frame fill6 \ -relief flat \ -width 3 - $itk_component(primaryToolbar) insert rotate frame sep3 \ +# $itk_component(primaryToolbar) insert rotate frame sep3 \ -relief sunken \ -width 2 - $itk_component(primaryToolbar) insert rotate frame fill7 \ +# $itk_component(primaryToolbar) insert rotate frame fill7 \ -relief flat \ -width 3 @@ -4441,7 +4588,22 @@ -overrelief raised \ -command [::itcl::code $this createObj comb] + $itk_component(primaryToolbar) insert rotate button matrixmode \ + -state disabled \ + -relief flat \ + -overrelief raised \ + -command [::itcl::code $this toggleMatrixMode] + if {$mObjMatrixMode == $MATRIX_ABOVE_MODE} { + $itk_component(primaryToolbar) itemconfigure matrixmode \ + -balloonstr "Toggle matrix mode. Currently set to \"Above\"" \ + -helpstr "Toggle matrix mode. Currently set to \"Above\"" + } else { + $itk_component(primaryToolbar) itemconfigure matrixmode \ + -balloonstr "Toggle matrix mode. Currently set to \"Below\"" \ + -helpstr "Toggle matrix mode. Currently set to \"Below\"" + } + set parent [$itk_component(primaryToolbar) component other] itk_component add primitiveMenu { ::menu $parent.menu \ @@ -5975,17 +6137,24 @@ set vy [lindex $vl 1] set vcenter [list $vx $vy [lindex $ovcenter 2]] - set ocenter [vscale [eval gedCmd pane_v2m_point $_dm $vcenter] [gedCmd base2local]] + set new_ocenter [vscale [eval gedCmd pane_v2m_point $_dm $vcenter] [gedCmd base2local]] set ret [catch { - if {$GeometryEditFrame::mEditCommand != ""} { - gedCmd $GeometryEditFrame::mEditCommand $_obj $GeometryEditFrame::mEditParam1 $ocenter + # The value of _obj is expected to be the same as mSelectedObjPath + if {$mObjMatrixMode == $MATRIX_ABOVE_MODE && $mSelectedObjPath != $mSelectedObj} { + set diff [vsub2 $new_ocenter $ocenter] + eval editMotionDeltaCallback otranslate $diff } else { - eval gedCmd ocenter $_obj $ocenter + if {$GeometryEditFrame::mEditCommand != ""} { + gedCmd $GeometryEditFrame::mEditCommand $_obj $GeometryEditFrame::mEditParam1 $new_ocenter + } else { + eval gedCmd ocenter $_obj $new_ocenter + } + + redrawObj $_obj 0 } } msg] - redrawObj $_obj 0 initEdit 0 if {$ret} { @@ -8793,7 +8962,7 @@ } } - if {$mTreeMode == $TREE_MODE_LIST} { + if {$mEnableListView} { fillTree {} $name 1 } else { fillTree {} $name 0 Modified: brlcad/trunk/src/tclscripts/archer/ArcherCore.tcl =================================================================== --- brlcad/trunk/src/tclscripts/archer/ArcherCore.tcl 2012-07-27 02:44:15 UTC (rev 51688) +++ brlcad/trunk/src/tclscripts/archer/ArcherCore.tcl 2012-07-27 12:04:25 UTC (rev 51689) @@ -75,6 +75,9 @@ common OBJECT_CENTER_MODE 10 common FIRST_FREE_BINDING_MODE 11 + common MATRIX_ABOVE_MODE 0 + common MATRIX_BELOW_MODE 1 + common OBJ_EDIT_VIEW_MODE 0 common OBJ_ATTR_VIEW_MODE 1 common OBJ_TOOL_VIEW_MODE 2 @@ -512,6 +515,7 @@ variable mDefaultBindingMode 0 variable mPrevObjViewMode 0 variable mObjViewMode 0 + variable mObjMatrixMode $MATRIX_BELOW_MODE # This is mostly a list of wrapped Ged commands. However, it also contains # a few commands that are implemented here in ArcherCore. @@ -752,6 +756,9 @@ variable mImage_rt "" variable mImage_rtAbort "" + variable mImage_matrixModeAbove "" + variable mImage_matrixModeBelow "" + # variables for the new tree variable mCNode2PList variable mPNode2CList Modified: brlcad/trunk/src/tclscripts/archer/images/CMakeLists.txt =================================================================== --- brlcad/trunk/src/tclscripts/archer/images/CMakeLists.txt 2012-07-27 02:44:15 UTC (rev 51688) +++ brlcad/trunk/src/tclscripts/archer/images/CMakeLists.txt 2012-07-27 12:04:25 UTC (rev 51689) @@ -152,6 +152,8 @@ invalid_intersect.png invalid_subtract.png invalid_union.png + matrixModeAbove.png + matrixModeBelow.png measure.png metaball.png metaball_intersect.png Added: brlcad/trunk/src/tclscripts/archer/images/matrixModeAbove.png =================================================================== (Binary files differ) Property changes on: brlcad/trunk/src/tclscripts/archer/images/matrixModeAbove.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: brlcad/trunk/src/tclscripts/archer/images/matrixModeBelow.png =================================================================== (Binary files differ) Property changes on: brlcad/trunk/src/tclscripts/archer/images/matrixModeBelow.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: brlcad/trunk/src/tclscripts/lib/Ged.tcl =================================================================== --- brlcad/trunk/src/tclscripts/lib/Ged.tcl 2012-07-27 02:44:15 UTC (rev 51688) +++ brlcad/trunk/src/tclscripts/lib/Ged.tcl 2012-07-27 12:04:25 UTC (rev 51689) @@ -248,6 +248,8 @@ method mirror {args} method model2view {args} method model_axes {args} + method edit_motion_delta_callback {args} + method edit_motion_delta_callback_all {args} method more_args_callback {args} method mouse_append_pipept {args} method mouse_constrain_rot {args} @@ -319,6 +321,7 @@ method pane_lookat {_pane args} method pane_m2v_point {_pane args} method pane_model2view {_pane args} + method pane_edit_motion_delta_callback {_pane args} method pane_move_arb_edge_mode {_pane args} method pane_move_arb_face_mode {_pane args} method pane_move_pipept_mode {_pane args} @@ -1716,6 +1719,16 @@ return $ret } +::itcl::body cadwidgets::Ged::edit_motion_delta_callback {args} { + eval $mGed edit_motion_delta_callback $args +} + +::itcl::body cadwidgets::Ged::edit_motion_delta_callback_all {args} { + foreach dm {ur ul ll lr} { + eval $mGed edit_motion_delta_callback $itk_component($dm) $args + } +} + ::itcl::body cadwidgets::Ged::more_args_callback {args} { eval $mGed more_args_callback $args } @@ -2005,6 +2018,10 @@ eval $mGed model2view $itk_component($_pane) $args } +::itcl::body cadwidgets::Ged::pane_edit_motion_delta_callback {_pane args} { + eval $mGed edit_motion_delta_callback $itk_component($_pane) $args +} + ::itcl::body cadwidgets::Ged::pane_move_arb_edge_mode {_pane args} { eval $mGed move_arb_edge_mode $itk_component($_pane) $args } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ BRL-CAD Source Commits mailing list brlcad-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits