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"