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;
|
auto ac_eff = ac == lay::AC_Global ? m_snap_mode : ac;
|
||||||
clear_mouse_cursors ();
|
clear_mouse_cursors ();
|
||||||
|
|
||||||
bool indicate_ruler_as_message = true;
|
if (m_move_mode == MoveSelected) {
|
||||||
|
|
||||||
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) {
|
|
||||||
|
|
||||||
db::DVector dp = p - m_p1;
|
db::DVector dp = p - m_p1;
|
||||||
dp = lay::snap_angle (dp, ac_eff);
|
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);
|
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);
|
propose_move_transformation (m_trans, 1);
|
||||||
indicate_ruler_as_message = false;
|
|
||||||
|
|
||||||
snap_rulers (ac_eff);
|
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));
|
(*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) {
|
m_rulers [0]->redraw ();
|
||||||
show_message ();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -1743,6 +1750,9 @@ Service::end_move (const db::DPoint &, lay::angle_constraint_type)
|
||||||
|
|
||||||
} else if (m_move_mode != MoveNone) {
|
} else if (m_move_mode != MoveNone) {
|
||||||
|
|
||||||
|
db::DPoint ps = m_trans * m_p1;
|
||||||
|
apply_partial_move (ps);
|
||||||
|
|
||||||
// replace the ruler that was moved
|
// replace the ruler that was moved
|
||||||
m_current.clean_points ();
|
m_current.clean_points ();
|
||||||
mp_view->annotation_shapes ().replace (*m_selected.begin (), db::DUserObject (new ant::Object (m_current)));
|
mp_view->annotation_shapes ().replace (*m_selected.begin (), db::DUserObject (new ant::Object (m_current)));
|
||||||
|
|
|
||||||
|
|
@ -633,6 +633,7 @@ private:
|
||||||
lay::EditorOptionsPage *toolbox_widget ();
|
lay::EditorOptionsPage *toolbox_widget ();
|
||||||
|
|
||||||
void show_message ();
|
void show_message ();
|
||||||
|
void apply_partial_move (db::DPoint &ps);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief A handler for the shape container's changed event
|
* @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),
|
mp_transient_view (0),
|
||||||
m_move_mode (Service::move_none),
|
m_move_mode (Service::move_none),
|
||||||
m_moved_landmark (0),
|
m_moved_landmark (0),
|
||||||
|
m_ac (lay::AC_Global),
|
||||||
m_keep_selection_for_move (false),
|
m_keep_selection_for_move (false),
|
||||||
m_images_visible (true),
|
m_images_visible (true),
|
||||||
m_visibility_cache_valid (false)
|
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 ();
|
double l = catch_distance ();
|
||||||
db::DBox search_dbox = db::DBox (p, p).enlarged (db::DVector (l, l));
|
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
|
// choose move mode
|
||||||
if (mode == lay::Editable::Selected) {
|
if (mode == lay::Editable::Selected) {
|
||||||
|
|
||||||
m_move_mode = move_selected;
|
m_move_mode = move_selected;
|
||||||
m_p1 = p;
|
|
||||||
m_trans = db::DTrans ();
|
|
||||||
|
|
||||||
selection_to_view ();
|
selection_to_view ();
|
||||||
for (std::vector <img::View *>::iterator r = m_selected_image_views.begin (); r != m_selected_image_views.end (); ++r) {
|
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) {
|
} else if (mode == lay::Editable::Any) {
|
||||||
|
|
||||||
m_move_mode = move_none;
|
m_move_mode = move_none;
|
||||||
m_p1 = p;
|
|
||||||
double dmin = std::numeric_limits <double>::max ();
|
double dmin = std::numeric_limits <double>::max ();
|
||||||
|
|
||||||
const db::DUserObject *robj = find_image (p, search_dbox, l, dmin);
|
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;
|
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) {
|
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
|
// display current images' parameters
|
||||||
show_message ();
|
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) {
|
} 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) {
|
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));
|
(*r)->transform_by (db::DCplxTrans (m_trans));
|
||||||
|
|
@ -734,13 +739,27 @@ Service::move (const db::DPoint &p, lay::angle_constraint_type ac)
|
||||||
return;
|
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) {
|
if (m_move_mode == move_selected) {
|
||||||
|
|
||||||
db::DVector dp = p - m_p1;
|
db::DVector dp = p - m_plast;
|
||||||
m_p1 = p;
|
m_plast = p;
|
||||||
|
|
||||||
m_trans = db::DTrans (dp) * m_trans;
|
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) {
|
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));
|
(*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) {
|
} else if (m_move_mode == move_landmark) {
|
||||||
|
|
||||||
|
m_trans = db::DTrans (p - m_p1);
|
||||||
|
|
||||||
std::vector <db::DPoint> li = m_initial.landmarks ();
|
std::vector <db::DPoint> li = m_initial.landmarks ();
|
||||||
for (std::vector <db::DPoint>::iterator l = li.begin (); l != li.end (); ++l) {
|
for (std::vector <db::DPoint>::iterator l = li.begin (); l != li.end (); ++l) {
|
||||||
*l = m_initial.matrix ().trans (*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));
|
db::adjust_matrix (m, li, lm, adjust, int (m_moved_landmark));
|
||||||
m_current.set_matrix (m * m_initial.matrix ());
|
m_current.set_matrix (m * m_initial.matrix ());
|
||||||
|
|
||||||
m_selected_image_views [0]->redraw ();
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (m_move_mode == move_all) {
|
if (m_move_mode == move_all) {
|
||||||
|
|
||||||
db::DVector dp = p - m_p1;
|
db::DVector dp = p - m_plast;
|
||||||
m_p1 = p;
|
m_plast = p;
|
||||||
|
|
||||||
|
m_trans = db::DTrans (dp) * m_trans;
|
||||||
m_current.transform (db::DTrans (dp));
|
m_current.transform (db::DTrans (dp));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
m_current = m_initial;
|
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::DVector dx (0.5 * m_current.width (), 0.5 * m_current.height ());
|
||||||
db::Matrix3d it = (m_current.matrix () * db::Matrix3d::disp (-dx)).inverted ();
|
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
|
void
|
||||||
Service::end_move (const db::DVector &v)
|
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);
|
end_move (db::DPoint (), lay::AC_Any);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -505,8 +505,10 @@ private:
|
||||||
std::set<obj_iterator> m_selected;
|
std::set<obj_iterator> m_selected;
|
||||||
// The previous selection
|
// The previous selection
|
||||||
std::set<obj_iterator> m_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;
|
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
|
// The image object representing the image being moved as it was before it was moved
|
||||||
img::Object m_initial;
|
img::Object m_initial;
|
||||||
// The image object representing the image being moved
|
// The image object representing the image being moved
|
||||||
|
|
@ -519,6 +521,8 @@ private:
|
||||||
MoveMode m_move_mode;
|
MoveMode m_move_mode;
|
||||||
// The index of the landmark being moved
|
// The index of the landmark being moved
|
||||||
size_t m_moved_landmark;
|
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
|
// Flag indicating that we want to keep the selection after the landmark was moved
|
||||||
bool m_keep_selection_for_move;
|
bool m_keep_selection_for_move;
|
||||||
// Flag indicating whether images are visible
|
// Flag indicating whether images are visible
|
||||||
|
|
@ -528,6 +532,8 @@ private:
|
||||||
std::map<const img::Object *, bool> m_visibility_cache;
|
std::map<const img::Object *, bool> m_visibility_cache;
|
||||||
|
|
||||||
void show_message ();
|
void show_message ();
|
||||||
|
void do_move (const db::DPoint &p, lay::angle_constraint_type ac);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Select a certain image
|
* @brief Select a certain image
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue