diff --git a/src/ant/ant/antService.cc b/src/ant/ant/antService.cc index 80dcce680..cb3e685cb 100644 --- a/src/ant/ant/antService.cc +++ b/src/ant/ant/antService.cc @@ -1624,57 +1624,7 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac) auto ac_eff = ac == lay::AC_Global ? m_snap_mode : ac; clear_mouse_cursors (); - bool indicate_ruler_as_message = true; - - if (m_move_mode == MoveP1) { - - m_current.seg_p1 (m_seg_index, snap2_visual (m_p1, p, &m_current, ac)); - m_rulers [0]->redraw (); - - } else if (m_move_mode == MoveP2) { - - m_current.seg_p2 (m_seg_index, snap2_visual (m_p1, p, &m_current, ac)); - m_rulers [0]->redraw (); - - } else if (m_move_mode == MoveP12) { - - db::DPoint p12 = snap2_visual (m_p1, p, &m_current, ac); - m_current.seg_p1 (m_seg_index, db::DPoint (m_current.seg_p1 (m_seg_index).x(), p12.y ())); - m_current.seg_p2 (m_seg_index, db::DPoint (p12.x (), m_current.seg_p2 (m_seg_index).y ())); - m_rulers [0]->redraw (); - - } else if (m_move_mode == MoveP21) { - - db::DPoint p21 = snap2_visual (m_p1, p, &m_current, ac); - m_current.seg_p1 (m_seg_index, db::DPoint (p21.x (), m_current.seg_p1 (m_seg_index).y ())); - m_current.seg_p2 (m_seg_index, db::DPoint (m_current.seg_p2 (m_seg_index).x(), p21.y ())); - m_rulers [0]->redraw (); - - } else if (m_move_mode == MoveP1X) { - - db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac); - m_current.seg_p1 (m_seg_index, db::DPoint (pc.x (), m_current.seg_p1 (m_seg_index).y ())); - m_rulers [0]->redraw (); - - } else if (m_move_mode == MoveP2X) { - - db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac); - m_current.seg_p2 (m_seg_index, db::DPoint (pc.x (), m_current.seg_p2 (m_seg_index).y ())); - m_rulers [0]->redraw (); - - } else if (m_move_mode == MoveP1Y) { - - db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac); - m_current.seg_p1 (m_seg_index, db::DPoint (m_current.seg_p1 (m_seg_index).x (), pc.y ())); - m_rulers [0]->redraw (); - - } else if (m_move_mode == MoveP2Y) { - - db::DPoint pc = snap2_visual (m_p1, p, &m_current, ac); - m_current.seg_p2 (m_seg_index, db::DPoint (m_current.seg_p2 (m_seg_index).x (), pc.y ())); - m_rulers [0]->redraw (); - - } else if (m_move_mode == MoveSelected) { + if (m_move_mode == MoveSelected) { db::DVector dp = p - m_p1; dp = lay::snap_angle (dp, ac_eff); @@ -1682,7 +1632,6 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac) m_trans = db::DTrans (dp + (m_p1 - db::DPoint ()) - m_trans.disp ()) * m_trans * db::DTrans (db::DPoint () - m_p1); propose_move_transformation (m_trans, 1); - indicate_ruler_as_message = false; snap_rulers (ac_eff); @@ -1690,11 +1639,69 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac) (*r)->transform_by (db::DCplxTrans (m_trans)); } + show_message (); + + } else if (m_move_mode != MoveNone) { + + db::DPoint ps = snap2_visual (m_p1, p, &m_current, ac); + m_trans = db::DTrans (ps - m_p1); + + apply_partial_move (ps); + + propose_move_transformation (db::DTrans (ps - m_p1), 1); + + // display current move distance + std::string pos = std::string ("dx: ") + tl::micron_to_string (ps.x () - m_p1.x ()) + " " + + "dy: " + tl::micron_to_string (ps.y () - m_p1.y ()); + view ()->message (pos); + + } +} + +void +Service::apply_partial_move (db::DPoint &ps) +{ + if (m_move_mode == MoveP1) { + + m_current.seg_p1 (m_seg_index, ps); + + } else if (m_move_mode == MoveP2) { + + m_current.seg_p2 (m_seg_index, ps); + + } else if (m_move_mode == MoveP12) { + + m_current.seg_p1 (m_seg_index, db::DPoint (m_current.seg_p1 (m_seg_index).x(), ps.y ())); + m_current.seg_p2 (m_seg_index, db::DPoint (ps.x (), m_current.seg_p2 (m_seg_index).y ())); + + } else if (m_move_mode == MoveP21) { + + m_current.seg_p1 (m_seg_index, db::DPoint (ps.x (), m_current.seg_p1 (m_seg_index).y ())); + m_current.seg_p2 (m_seg_index, db::DPoint (m_current.seg_p2 (m_seg_index).x(), ps.y ())); + + } else if (m_move_mode == MoveP1X) { + + ps.set_y (m_p1.y ()); + m_current.seg_p1 (m_seg_index, db::DPoint (ps.x (), m_current.seg_p1 (m_seg_index).y ())); + + } else if (m_move_mode == MoveP2X) { + + ps.set_y (m_p1.y ()); + m_current.seg_p2 (m_seg_index, db::DPoint (ps.x (), m_current.seg_p2 (m_seg_index).y ())); + + } else if (m_move_mode == MoveP1Y) { + + ps.set_x (m_p1.x ()); + m_current.seg_p1 (m_seg_index, db::DPoint (m_current.seg_p1 (m_seg_index).x (), ps.y ())); + + } else if (m_move_mode == MoveP2Y) { + + ps.set_x (m_p1.x ()); + m_current.seg_p2 (m_seg_index, db::DPoint (m_current.seg_p2 (m_seg_index).x (), ps.y ())); + } - if (indicate_ruler_as_message) { - show_message (); - } + m_rulers [0]->redraw (); } void @@ -1743,6 +1750,9 @@ Service::end_move (const db::DPoint &, lay::angle_constraint_type) } else if (m_move_mode != MoveNone) { + db::DPoint ps = m_trans * m_p1; + apply_partial_move (ps); + // replace the ruler that was moved m_current.clean_points (); mp_view->annotation_shapes ().replace (*m_selected.begin (), db::DUserObject (new ant::Object (m_current))); diff --git a/src/ant/ant/antService.h b/src/ant/ant/antService.h index 6833c5acc..6213dc642 100644 --- a/src/ant/ant/antService.h +++ b/src/ant/ant/antService.h @@ -633,6 +633,7 @@ private: lay::EditorOptionsPage *toolbox_widget (); void show_message (); + void apply_partial_move (db::DPoint &ps); /** * @brief A handler for the shape container's changed event diff --git a/src/img/img/imgService.cc b/src/img/img/imgService.cc index 7d84f281b..5e410d345 100644 --- a/src/img/img/imgService.cc +++ b/src/img/img/imgService.cc @@ -419,6 +419,7 @@ Service::Service (db::Manager *manager, lay::LayoutViewBase *view) mp_transient_view (0), m_move_mode (Service::move_none), m_moved_landmark (0), + m_ac (lay::AC_Global), m_keep_selection_for_move (false), m_images_visible (true), m_visibility_cache_valid (false) @@ -608,12 +609,14 @@ Service::begin_move (lay::Editable::MoveMode mode, const db::DPoint &p, lay::ang double l = catch_distance (); db::DBox search_dbox = db::DBox (p, p).enlarged (db::DVector (l, l)); + m_plast = m_p1 = p; + m_trans = db::DTrans (); + m_ac = lay::AC_Global; + // choose move mode if (mode == lay::Editable::Selected) { m_move_mode = move_selected; - m_p1 = p; - m_trans = db::DTrans (); selection_to_view (); for (std::vector ::iterator r = m_selected_image_views.begin (); r != m_selected_image_views.end (); ++r) { @@ -657,7 +660,6 @@ Service::begin_move (lay::Editable::MoveMode mode, const db::DPoint &p, lay::ang } else if (mode == lay::Editable::Any) { m_move_mode = move_none; - m_p1 = p; double dmin = std::numeric_limits ::max (); const db::DUserObject *robj = find_image (p, search_dbox, l, dmin); @@ -705,11 +707,14 @@ Service::move_transform (const db::DPoint &p, db::DFTrans tr, lay::angle_constra return; } + db::DTrans tr_new = db::DTrans (p - db::DPoint ()) * db::DTrans (tr) * db::DTrans (m_trans.fp_trans ()) * db::DTrans (db::DPoint () - m_p1); + if (m_move_mode == move_all) { - db::DVector dp = p - db::DPoint (); + db::DTrans dt = tr_new * m_trans.inverted (); - m_current.transform (db::DTrans (dp) * db::DTrans (tr) * db::DTrans (-dp)); + m_current.transform (dt); + m_trans = dt * m_trans; // display current images' parameters show_message (); @@ -718,7 +723,7 @@ Service::move_transform (const db::DPoint &p, db::DFTrans tr, lay::angle_constra } else if (m_move_mode == move_selected) { - m_trans *= db::DTrans (m_p1 - db::DPoint ()) * db::DTrans (tr) * db::DTrans (db::DPoint () - m_p1); + m_trans = tr_new; for (std::vector::iterator r = m_selected_image_views.begin (); r != m_selected_image_views.end (); ++r) { (*r)->transform_by (db::DCplxTrans (m_trans)); @@ -734,13 +739,27 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac) return; } + m_ac = ac; + + do_move (p, ac); + + if (m_move_mode != move_selected) { + m_selected_image_views [0]->redraw (); + show_message (); + } + + propose_move_transformation (m_trans, 2); +} + +void +Service::do_move (const db::DPoint &p, lay::angle_constraint_type ac) +{ if (m_move_mode == move_selected) { - db::DVector dp = p - m_p1; - m_p1 = p; + db::DVector dp = p - m_plast; + m_plast = p; m_trans = db::DTrans (dp) * m_trans; - propose_move_transformation (m_trans, 2); for (std::vector::iterator r = m_selected_image_views.begin (); r != m_selected_image_views.end (); ++r) { (*r)->transform_by (db::DCplxTrans (m_trans)); @@ -748,6 +767,8 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac) } else if (m_move_mode == move_landmark) { + m_trans = db::DTrans (p - m_p1); + std::vector li = m_initial.landmarks (); for (std::vector ::iterator l = li.begin (); l != li.end (); ++l) { *l = m_initial.matrix ().trans (*l); @@ -771,20 +792,20 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac) db::adjust_matrix (m, li, lm, adjust, int (m_moved_landmark)); m_current.set_matrix (m * m_initial.matrix ()); - m_selected_image_views [0]->redraw (); - } else { if (m_move_mode == move_all) { - db::DVector dp = p - m_p1; - m_p1 = p; + db::DVector dp = p - m_plast; + m_plast = p; + m_trans = db::DTrans (dp) * m_trans; m_current.transform (db::DTrans (dp)); } else { m_current = m_initial; + m_trans = db::DTrans (p - m_p1); db::DVector dx (0.5 * m_current.width (), 0.5 * m_current.height ()); db::Matrix3d it = (m_current.matrix () * db::Matrix3d::disp (-dx)).inverted (); @@ -848,15 +869,6 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac) } - // display current images' parameters - show_message (); - - m_selected_image_views [0]->redraw (); - - } - - if (m_move_mode != move_selected) { - show_message (); } } @@ -875,7 +887,7 @@ Service::show_message () void Service::end_move (const db::DVector &v) { - m_trans = db::DTrans (v) * db::DTrans (m_trans.fp_trans ()); + do_move (m_p1 + v, m_ac); end_move (db::DPoint (), lay::AC_Any); } diff --git a/src/img/img/imgService.h b/src/img/img/imgService.h index 0d3d27092..aa4ef9975 100644 --- a/src/img/img/imgService.h +++ b/src/img/img/imgService.h @@ -505,8 +505,10 @@ private: std::set m_selected; // The previous selection std::set m_previous_selection; - // The reference point in move mode + // The starting point in move mode db::DPoint m_p1; + // The last reference point in move mode + db::DPoint m_plast; // The image object representing the image being moved as it was before it was moved img::Object m_initial; // The image object representing the image being moved @@ -519,6 +521,8 @@ private: MoveMode m_move_mode; // The index of the landmark being moved size_t m_moved_landmark; + // The last "angle constraint" (button combination) used in move + lay::angle_constraint_type m_ac; // Flag indicating that we want to keep the selection after the landmark was moved bool m_keep_selection_for_move; // Flag indicating whether images are visible @@ -528,6 +532,8 @@ private: std::map m_visibility_cache; void show_message (); + void do_move (const db::DPoint &p, lay::angle_constraint_type ac); + /** * @brief Select a certain image