From 0a546ef41d7ec08b0c23a97ba47b850a252b31b4 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 2 Oct 2023 23:15:58 +0200 Subject: [PATCH] WIP --- src/edt/edt/edtService.cc | 106 ++++++++++++++++++++++++++++-- src/edt/edt/edtService.h | 10 +++ src/laybasic/laybasic/layMarker.h | 8 +++ 3 files changed, 120 insertions(+), 4 deletions(-) diff --git a/src/edt/edt/edtService.cc b/src/edt/edt/edtService.cc index d2bb74075..2482fce3b 100644 --- a/src/edt/edt/edtService.cc +++ b/src/edt/edt/edtService.cc @@ -148,6 +148,92 @@ Service::snap (db::DPoint p) const return p; } +void +Service::update_vector_snapped_point (const db::DPoint &pt, db::DVector &vr, bool &result_set) const +{ + db::DVector v = snap (pt) - pt; + v = lay::snap_angle (v, move_ac ()); + + if (! result_set || v.length () < vr.length ()) { + result_set = true; + vr = v; + } +} + +void +Service::update_vector_snapped_marker (const lay::ShapeMarker *sm, const db::DTrans &trans, db::DVector &vr, bool &result_set, size_t &count) const +{ + const db::Shape &shape = sm->shape (); + db::CplxTrans tr = db::DCplxTrans (trans) * db::DCplxTrans (-sm->trans ().disp ()) * sm->trans (); + + if (shape.is_text ()) { + + update_vector_snapped_point (tr * shape.bbox ().center (), vr, result_set); + --count; + + } else if (shape.is_path ()) { + + for (auto pt = shape.begin_point (); pt != shape.end_point () && count > 0; ++pt) { + update_vector_snapped_point (tr * *pt, vr, result_set); + --count; + } + + } else if (shape.is_box ()) { + + db::Box box = shape.bbox (); + for (unsigned int c = 0; c < 4 && count > 0; ++c) { + db::Point pt = db::Point ((c & 1) != 0 ? box.left () : box.right (), (c & 2) != 0 ? box.bottom () : box.top ()); + update_vector_snapped_point (tr * pt, vr, result_set); + --count; + } + + } else if (shape.is_polygon ()) { + + for (auto pt = shape.begin_hull (); pt != shape.end_hull () && count > 0; ++pt) { + update_vector_snapped_point (tr * *pt, vr, result_set); + --count; + } + + for (unsigned int h = 0; h < shape.holes () && count > 0; ++h) { + for (auto pt = shape.begin_hole (h); pt != shape.end_hole (h) && count > 0; ++pt) { + update_vector_snapped_point (tr * *pt, vr, result_set); + --count; + } + } + + } +} + +db::DVector +Service::snap_marker_to_grid (const db::DVector &v) const +{ + db::DVector vr; + bool result_set = false; + + // max. 10000 checks + size_t count = 10000; + + db::DTrans tt = db::DTrans (v); + + for (auto m = m_markers.begin (); m != m_markers.end () && count > 0; ++m) { + + const lay::ShapeMarker *sm = dynamic_cast (*m); + if (sm) { + update_vector_snapped_marker (sm, tt, vr, result_set, count); + } else { + // @@@ instance markers + } + + } + + if (result_set) { + tl::info << "@@@ " << v; + return vr + v; + } else { + return v; + } +} + db::DVector Service::snap (db::DVector v) const { @@ -433,10 +519,15 @@ Service::begin_move (lay::Editable::MoveMode mode, const db::DPoint &p, lay::ang void Service::move (const db::DPoint &pu, lay::angle_constraint_type ac) { + // @@@ does not work yet after rotation (right mouse click!!!!) m_alt_ac = ac; - db::DPoint p = snap (m_move_start) + snap (pu - m_move_start, false /*move*/); if (view ()->is_editable () && m_moving) { - move_markers (db::DTrans (p - db::DPoint ()) * db::DTrans (m_move_trans.fp_trans ()) * db::DTrans (db::DPoint () - snap (m_move_start))); + db::DPoint ref = snap (m_move_start); + db::DPoint p = ref + snap_marker_to_grid (pu - ref); + if (p.equal (pu)) { + p = ref + snap (pu - m_move_start, false /*move*/); + } + move_markers (db::DTrans (p - db::DPoint ()) * db::DTrans (m_move_trans.fp_trans ()) * db::DTrans (db::DPoint () - ref)); } m_alt_ac = lay::AC_Global; } @@ -444,10 +535,17 @@ Service::move (const db::DPoint &pu, lay::angle_constraint_type ac) void Service::move_transform (const db::DPoint &pu, db::DFTrans tr, lay::angle_constraint_type ac) { + // @@@ TODO: adjust and test!!! m_alt_ac = ac; - db::DPoint p = snap (m_move_start) + snap (pu - m_move_start, false); if (view ()->is_editable () && m_moving) { - move_markers (db::DTrans (p - db::DPoint ()) * db::DTrans (m_move_trans.fp_trans () * tr) * db::DTrans (db::DPoint () - snap (m_move_start))); + db::DPoint p = m_move_start + snap_marker_to_grid (pu - m_move_start); + if (p.equal (pu)) { + db::DPoint ref = snap (m_move_start); + p = ref + snap (pu - m_move_start, false /*move*/); + move_markers (db::DTrans (p - db::DPoint ()) * db::DTrans (tr * m_move_trans.fp_trans ()) * db::DTrans (db::DPoint () - ref)); + } else { + move_markers (db::DTrans (p - m_move_start) * db::DTrans (tr) * m_move_trans); + } } m_alt_ac = lay::AC_Global; } diff --git a/src/edt/edt/edtService.h b/src/edt/edt/edtService.h index 14e16c22f..55f756f1b 100644 --- a/src/edt/edt/edtService.h +++ b/src/edt/edt/edtService.h @@ -518,6 +518,14 @@ protected: */ db::DVector snap (const db::DVector &v, bool connect) const; + /** + * @brief Proposes a grid-snapped displacement vector + * + * @param v The input displacement + * @return A displacement that pushes the (current) markers on-grid, definition depending on marker + */ + db::DVector snap_marker_to_grid (const db::DVector &v) const; + /** * @brief Snap a point to the edit grid with advanced snapping (including object snapping) * @@ -658,6 +666,8 @@ private: private: void copy_selected (unsigned int inst_mode); + void update_vector_snapped_point (const db::DPoint &pt, db::DVector &vr, bool &result_set) const; + void update_vector_snapped_marker (const lay::ShapeMarker *sm, const db::DTrans &trans, db::DVector &vr, bool &result_set, size_t &count) const; }; } diff --git a/src/laybasic/laybasic/layMarker.h b/src/laybasic/laybasic/layMarker.h index d807dbf24..2563bd698 100644 --- a/src/laybasic/laybasic/layMarker.h +++ b/src/laybasic/laybasic/layMarker.h @@ -396,6 +396,14 @@ public: */ void set (const db::Shape &shape, const db::ICplxTrans &t1, const std::vector &trans); + /** + * @brief Gets the shape + */ + const db::Shape &shape () const + { + return m_shape; + } + private: virtual void render (const Viewport &vp, ViewObjectCanvas &canvas);