mirror of https://github.com/KLayout/klayout.git
Providing numerical move entries also for partial (handle) image and ruler moves
This commit is contained in:
parent
8300e2ee57
commit
ccd9952d49
|
|
@ -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)));
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 <img::View *>::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 <double>::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<img::View *>::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<img::View *>::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 <db::DPoint> li = m_initial.landmarks ();
|
||||
for (std::vector <db::DPoint>::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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -505,8 +505,10 @@ private:
|
|||
std::set<obj_iterator> m_selected;
|
||||
// The previous selection
|
||||
std::set<obj_iterator> 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<const img::Object *, bool> m_visibility_cache;
|
||||
|
||||
void show_message ();
|
||||
void do_move (const db::DPoint &p, lay::angle_constraint_type ac);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Select a certain image
|
||||
|
|
|
|||
Loading…
Reference in New Issue