From 25d396023a1787f99ecbdd8be83686eebe72421c Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 11 Nov 2025 00:21:28 +0100 Subject: [PATCH] Refinement of snap, fixed tests --- src/laybasic/laybasic/laySnap.cc | 25 ++++++++++++++++--------- src/laybasic/unit_tests/laySnapTests.cc | 18 +++++++++--------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/laybasic/laybasic/laySnap.cc b/src/laybasic/laybasic/laySnap.cc index 186804da9..156913aab 100644 --- a/src/laybasic/laybasic/laySnap.cc +++ b/src/laybasic/laybasic/laySnap.cc @@ -258,13 +258,18 @@ class ContourFinder public: /** * @brief Constructor + * + * "vertex_mode" is: + * 0: no snapping to vertexes + * 1: snapping to edge vertexes + * 2: also snapping to centers */ - ContourFinder (const db::DPoint &original, const db::DVector &grid, const std::vector &cutlines, bool with_vertex = true, bool directed = false) + ContourFinder (const db::DPoint &original, const db::DVector &grid, const std::vector &cutlines, int vertex_mode = 2, bool directed = false) : m_any (false), m_any_exact (false), m_original (original), m_is_vertex (false), m_is_vertex_exact (false), m_tests (10000 /* max. number of tests, TODO: make variable? */), mp_layout (0), m_cutlines (cutlines), mp_prop_sel (0), m_inv_prop_sel (false), - m_with_vertex (with_vertex), m_directed (directed) + m_vertex_mode (vertex_mode), m_directed (directed) { m_projection_constraint = ! m_cutlines.empty (); @@ -491,7 +496,7 @@ private: void closest (const db::DPoint &p) { - if (! m_with_vertex) { + if (m_vertex_mode == 0) { // Only edges are considered for snapping. @@ -668,7 +673,9 @@ private: test_edge_with_center (t * db::Edge (db::Point (box.right (), box.bottom ()), box.p1 ())); // test for box center - test_edge (t * db::Edge (box.center (), box.center ())); + if (m_vertex_mode > 1) { + test_edge (t * db::Edge (box.center (), box.center ())); + } } else if (shape->is_point ()) { @@ -710,7 +717,7 @@ private: void test_edge_with_center (const db::DEdge &edg) { - if (m_with_vertex && ! edg.is_degenerate ()) { + if (m_vertex_mode > 1 && ! edg.is_degenerate ()) { db::DPoint c = edg.p1 () + (edg.p2 () - edg.p1 ()) * 0.5; @@ -726,7 +733,7 @@ private: void test_edge (const db::DEdge &edg) { - if (m_with_vertex) { + if (m_vertex_mode > 0) { // vertex snap is just annoying when trying to measure the width of simulation contours .. // But: when measuring corner-to-corner distances it is very valuable .. @@ -761,7 +768,7 @@ private: const std::set *mp_prop_sel; bool m_inv_prop_sel; bool m_projection_constraint; - bool m_with_vertex; + int m_vertex_mode; bool m_directed; }; @@ -836,7 +843,7 @@ do_obj_snap2 (lay::LayoutViewBase *view, const db::DPoint &pt1, const db::DPoint db::DPoint dp1 (pt1); db::DPoint dp2 (pt2); - ContourFinder finder (dp1, grid, cutlines, cutlines.empty () /*vertex snap on "any direction"*/); + ContourFinder finder (dp1, grid, cutlines, cutlines.empty () ? 1 : 0 /*vertex snap on "any direction", edge vertexes*/); double sr = min_search_range; while (sr < max_search_range + 1e-6) { @@ -880,7 +887,7 @@ do_obj_snap2 (lay::LayoutViewBase *view, const db::DPoint &pt1, const db::DPoint } - ContourFinder finder2 (dp2, grid, cl, false /*no vertex snap*/, true /*directional cutlines*/); + ContourFinder finder2 (dp2, grid, cl, 0 /*no vertex snap*/, true /*directional cutlines*/); double sr2 = min_search_range; while (sr2 < max_search_range + 1e-6) { diff --git a/src/laybasic/unit_tests/laySnapTests.cc b/src/laybasic/unit_tests/laySnapTests.cc index e208e8fe9..d8a90c2cb 100644 --- a/src/laybasic/unit_tests/laySnapTests.cc +++ b/src/laybasic/unit_tests/laySnapTests.cc @@ -66,9 +66,9 @@ TEST(1) EXPECT_EQ (res.object_snap, lay::PointSnapToObjectResult::ObjectUnspecific); // center point of edge EXPECT_EQ (res.snapped_point.to_string (), "0.5,0.5"); - res = lay::obj_snap (&view, db::DPoint (0.485, 0.505), db::DVector (0.01, 0.01), 0.1); + res = lay::obj_snap (&view, db::DPoint (0.385, 0.605), db::DVector (0.01, 0.01), 0.1); EXPECT_EQ (res.object_snap, lay::PointSnapToObjectResult::ObjectEdge); - EXPECT_EQ (res.snapped_point.to_string (), "0.49,0.51"); + EXPECT_EQ (res.snapped_point.to_string (), "0.39,0.61"); EXPECT_EQ (res.object_ref.to_string (), "(0,1;1,0)"); res = lay::obj_snap (&view, db::DPoint (0.205, 0.215), db::DVector (0.01, 0.025), 0.1); @@ -87,7 +87,7 @@ TEST(1) EXPECT_EQ (res.object_snap, lay::PointSnapToObjectResult::ObjectVertex); EXPECT_EQ (res.snapped_point.to_string (), "0,1"); - res = lay::obj_snap (&view, db::DPoint (1.000, 0.605), db::DPoint (0.405, 0.600), db::DVector (), lay::AC_Horizontal, 0.1); + res = lay::obj_snap (&view, db::DPoint (1.000, 0.605), db::DPoint (0.405, 0.600), db::DVector (), lay::AC_Horizontal, 0.05); EXPECT_EQ (res.object_snap, lay::PointSnapToObjectResult::ObjectEdge); EXPECT_EQ (res.snapped_point.to_string (), "0.395,0.605"); @@ -136,8 +136,12 @@ TEST(1) EXPECT_EQ (db::DEdge (res2.first, res2.second).to_string (), "(0.355,0.645;0,0.29)"); res2 = lay::obj_snap2 (&view, db::DPoint (0.5, 0.5), db::DVector (), 0.005, 1.0); + EXPECT_EQ (res2.any, false); // on edge -> measurement chooses wrong direction + EXPECT_EQ (db::DEdge (res2.first, res2.second).to_string (), "(0,0;0,0)"); + + res2 = lay::obj_snap2 (&view, db::DPoint (0.495, 0.495), db::DVector (), 0.005, 1.0); EXPECT_EQ (res2.any, true); - EXPECT_EQ (db::DEdge (res2.first, res2.second).to_string (), "(0.5,0.5;0.5,0.5)"); + EXPECT_EQ (db::DEdge (res2.first, res2.second).to_string (), "(0.5,0.5;0,0)"); res2 = lay::obj_snap2 (&view, db::DPoint (0.6, 0.4), db::DVector (), 0.005, 1.0); EXPECT_EQ (res2.any, false); @@ -145,7 +149,7 @@ TEST(1) res2 = lay::obj_snap2 (&view, db::DPoint (0.005, 0.5), db::DVector (), 0.005, 1.0); EXPECT_EQ (res2.any, true); - EXPECT_EQ (db::DEdge (res2.first, res2.second).to_string (), "(0,0.5;0,0.5)"); + EXPECT_EQ (db::DEdge (res2.first, res2.second).to_string (), "(0,0.5;0.5,0.5)"); res2 = lay::obj_snap2 (&view, db::DPoint (0.005, 0.4), db::DVector (), 0.005, 1.0); EXPECT_EQ (res2.any, true); @@ -156,10 +160,6 @@ TEST(1) EXPECT_EQ (db::DEdge (res2.first, res2.second).to_string (), "(0,0;0,0)"); res2 = lay::obj_snap2 (&view, db::DPoint (-0.2, 0.5), db::DVector (), 0.005, 1.0); - EXPECT_EQ (res2.any, true); - EXPECT_EQ (db::DEdge (res2.first, res2.second).to_string (), "(0,0.5;0,0.5)"); - - res2 = lay::obj_snap2 (&view, db::DPoint (-0.2, 0.4), db::DVector (), 0.005, 1.0); EXPECT_EQ (res2.any, false); EXPECT_EQ (db::DEdge (res2.first, res2.second).to_string (), "(0,0;0,0)"); }