diff --git a/src/ant/ant/RulerConfigPage4.ui b/src/ant/ant/RulerConfigPage4.ui index 7e2c2365c..87e5dc3cc 100644 --- a/src/ant/ant/RulerConfigPage4.ui +++ b/src/ant/ant/RulerConfigPage4.ui @@ -6,8 +6,8 @@ 0 0 - 668 - 410 + 745 + 438 @@ -845,7 +845,12 @@ - Angle measurement (three mouse clicks) + Auto measure along edge (points will be set automatically) + + + + + Angle or radius measurement (three mouse clicks) diff --git a/src/ant/ant/antConfig.cc b/src/ant/ant/antConfig.cc index 36576b00a..5ed7c7d0b 100644 --- a/src/ant/ant/antConfig.cc +++ b/src/ant/ant/antConfig.cc @@ -247,6 +247,8 @@ RulerModeConverter::to_string (ant::Template::ruler_mode_type m) return "single_click"; } else if (m == ant::Template::RulerAutoMetric) { return "auto_metric"; + } else if (m == ant::Template::RulerAutoMetricEdge) { + return "auto_metric_edge"; } else if (m == ant::Template::RulerMultiSegment) { return "multi_segment"; } else if (m == ant::Template::RulerThreeClicks) { @@ -266,6 +268,8 @@ RulerModeConverter::from_string (const std::string &s, ant::Template::ruler_mode a = ant::Template::RulerSingleClick; } else if (t == "auto_metric") { a = ant::Template::RulerAutoMetric; + } else if (t == "auto_metric_edge") { + a = ant::Template::RulerAutoMetricEdge; } else if (t == "multi_segment") { a = ant::Template::RulerMultiSegment; } else if (t == "angle") { diff --git a/src/ant/ant/antPlugin.cc b/src/ant/ant/antPlugin.cc index 86a14d11a..06680c2a8 100644 --- a/src/ant/ant/antPlugin.cc +++ b/src/ant/ant/antPlugin.cc @@ -60,6 +60,9 @@ static std::vector make_standard_templates () templates.push_back (ant::Template (tl::to_string (tr ("Measure")), "$X", "$Y", "$D", ant::Object::STY_ruler, ant::Object::OL_diag, true, lay::AC_Global, "_measure")); templates.back ().set_mode (ant::Template::RulerAutoMetric); + templates.push_back (ant::Template (tl::to_string (tr ("Measure edge")), "$X", "$Y", "$D", ant::Object::STY_ruler, ant::Object::OL_diag, true, lay::AC_Global, "_measure_edge")); + templates.back ().set_mode (ant::Template::RulerAutoMetricEdge); + templates.push_back (ant::Template (tl::to_string (tr ("Angle")), "", "", "$(sprintf('%.5g',G))°", ant::Object::STY_line, ant::Object::OL_angle, true, lay::AC_Global, "_angle")); templates.back ().set_mode (ant::Template::RulerThreeClicks); diff --git a/src/ant/ant/antService.cc b/src/ant/ant/antService.cc index e1cc12f97..11b0d2fb7 100644 --- a/src/ant/ant/antService.cc +++ b/src/ant/ant/antService.cc @@ -1910,6 +1910,29 @@ Service::mouse_click_event (const db::DPoint &p, unsigned int buttons, bool prio } + } else if (tpl.mode () == ant::Template::RulerAutoMetricEdge) { + + lay::PointSnapToObjectResult snap_details = snap1_details (p, true); + if (snap_details.object_snap == lay::PointSnapToObjectResult::ObjectEdge) { + + // begin the transaction + if (manager ()) { + tl_assert (! manager ()->transacting ()); + manager ()->transaction (tl::to_string (tr ("Create ruler"))); + } + + m_current = ant::Object (snap_details.object_ref.p1 (), snap_details.object_ref.p2 (), 0, tpl); + show_message (); + + insert_ruler (m_current, true); + + // end the transaction + if (manager ()) { + manager ()->commit (); + } + + } + } else { m_p1 = snap1 (p, m_obj_snap && tpl.snap ()).second; @@ -2006,7 +2029,7 @@ Service::mouse_move_event (const db::DPoint &p, unsigned int buttons, bool prio) snap_details = snap2_details (m_p1, p, mp_active_ruler->ruler (), ac_from_buttons (buttons)); } else { const ant::Template &tpl = current_template (); - snap_details = snap1_details (p, m_obj_snap && tpl.snap ()); + snap_details = snap1_details (p, m_obj_snap && tpl.snap () && (tpl.mode () != ant::Template::RulerAutoMetricEdge || ! view ()->transient_selection_mode ())); } mouse_cursor_from_snap_details (snap_details); @@ -2356,24 +2379,38 @@ Service::timeout () // transiently create an auto-metric ruler if requested + ant::Object *ruler = 0; + const ant::Template &tpl = current_template (); if (tpl.mode () == ant::Template::RulerAutoMetric) { lay::TwoPointSnapToObjectResult ee = auto_measure (m_hover_point, ac_from_buttons (m_hover_buttons), tpl); if (ee.any) { - m_current = ant::Object (ee.first, ee.second, 0, tpl); + ruler = &m_current; + } - // HINT: there is no special style for "transient selection on rulers" - mp_transient_ruler = new ant::View (this, &m_current, true /*not selected*/); - - if (! editables ()->has_selection ()) { - display_status (true); - } + } else if (tpl.mode () == ant::Template::RulerAutoMetricEdge) { + lay::PointSnapToObjectResult snap_details = snap1_details (m_hover_point, true); + if (snap_details.object_snap == lay::PointSnapToObjectResult::ObjectEdge) { + m_current = ant::Object (snap_details.object_ref.p1 (), snap_details.object_ref.p2 (), 0, tpl); + ruler = &m_current; } } + + if (ruler) { + + // HINT: there is no special style for "transient selection on rulers" + mp_transient_ruler = new ant::View (this, ruler, true /*not selected*/); + + if (! editables ()->has_selection ()) { + display_status (true); + } + + } + } #endif diff --git a/src/ant/ant/antTemplate.h b/src/ant/ant/antTemplate.h index f589cc91e..6310ce2c6 100644 --- a/src/ant/ant/antTemplate.h +++ b/src/ant/ant/antTemplate.h @@ -64,15 +64,20 @@ public: */ RulerAutoMetric = 2, + /** + * @brief The ruler is auto-metric along an edge: a single click will place a ruler and the ruler will extend to the edge below + */ + RulerAutoMetricEdge = 3, + /** * @brief The ruler an angle type (two segments, three mouse clicks) for angle and circle radius measurements */ - RulerThreeClicks = 3, + RulerThreeClicks = 4, /** * @brief The ruler is a multi-segment type */ - RulerMultiSegment = 4 + RulerMultiSegment = 5 }; /** diff --git a/src/ant/ant/gsiDeclAnt.cc b/src/ant/ant/gsiDeclAnt.cc index d7e709318..6961636e3 100644 --- a/src/ant/ant/gsiDeclAnt.cc +++ b/src/ant/ant/gsiDeclAnt.cc @@ -434,6 +434,11 @@ static int ruler_mode_auto_metric () return ant::Template::RulerAutoMetric; } +static int ruler_mode_auto_metric_edge () +{ + return ant::Template::RulerAutoMetricEdge; +} + static int ruler_mode_three_clicks () { return ant::Template::RulerThreeClicks; @@ -525,6 +530,12 @@ gsi::Class decl_Annotation (decl_BasicAnnotation, "lay", "Annotat "\n" "This constant has been introduced in version 0.25" ) + + gsi::method ("RulerModeAutoMetricEdge", &gsi::ruler_mode_auto_metric_edge, + "@brief Specifies edge-sensitive auto-metric ruler mode for the \\register_template method\n" + "In auto-metric mode, a ruler can be placed with a single click and p1/p2 will be determined from the edge it is placed on.\n" + "\n" + "This constant has been introduced in version 0.29" + ) + gsi::method ("RulerThreeClicks", &gsi::ruler_mode_three_clicks, "@brief Specifies three-click ruler mode for the \\register_template method\n" "In this ruler mode, two segments are created for angle and circle radius measurements. Three mouse clicks are required.\n"