changeset 589:3c95dbbc67a5 annotations

fix unit conversions
author Sebastien Jodogne <s.jodogne@gmail.com>
date Sun, 06 Sep 2026 10:59:03 +0200
parents 5cd0db97602b
children 632cb930ac87
files ViewerPlugin/WebApplication/viewer.js
diffstat 1 files changed, 31 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/ViewerPlugin/WebApplication/viewer.js	Fri Sep 04 18:13:14 2026 +0200
+++ b/ViewerPlugin/WebApplication/viewer.js	Sun Sep 06 10:59:03 2026 +0200
@@ -1292,20 +1292,40 @@
 }
 
 
+function FormatUnit(value, units)
+{
+  // Order by unit size ascending (factor descending)
+  for (var i = 0; i < units.length - 1; i++) {
+    var nextScaled = value * units[i + 1].factor;
+
+    // Stop when the next larger unit would produce a value below 1
+    if (Math.abs(nextScaled) < 1) {
+      var scaled = value * units[i].factor;
+      return scaled.toFixed(2) + ' ' + units[i].label;
+    }
+  }
+
+  // Use the largest unit available
+  var largest = units[units.length - 1];
+  var scaled = value * largest.factor;
+  return scaled.toFixed(2) + ' ' + largest.label;
+}
+
+
 function FormatLength(lengthPx, projection)
 {
   var metersPerUnit = projection.getMetersPerUnit();
   if (metersPerUnit) {
     var meters = lengthPx * metersPerUnit;
-    if (meters < 1e-3) {
-      return (meters * 1e6).toFixed(1) + ' μm';
-    } else if (meters < 1) {
-      return (meters * 1e3).toFixed(1) + ' mm';
-    } else if (meters < 1000) {
-      return meters.toFixed(2) + ' m';
-    } else {
-      return (meters / 1000).toFixed(3) + ' km';
-    }
+
+    return FormatUnit(meters, [
+      { label: 'μm', factor: 1e6 },
+      { label: 'mm', factor: 1e3 },
+      { label: 'cm', factor: 1e2 },
+      { label: 'm',  factor: 1 },
+      { label: 'km', factor: 1e-3 }
+    ]);
+
   } else {
     return lengthPx.toFixed(0) + ' px';
   }
@@ -1318,23 +1338,14 @@
   if (metersPerUnit) {
     var sqMeters = areaPx * metersPerUnit * metersPerUnit;
 
-    var units = [
+    return FormatUnit(sqMeters, [
       { label: 'μm²', factor: 1e12 },
       { label: 'mm²', factor: 1e6 },
       { label: 'cm²', factor: 1e4 },
       { label: 'm²',  factor: 1 },
       { label: 'km²', factor: 1e-6 }
-    ];
+    ]);
 
-    for (var i = 0; i < units.length; i++) {
-      var scaled = sqMeters * units[i].factor;
-      if (scaled < 1000) {
-        return scaled.toFixed(2) + ' ' + units[i].label;
-      }
-    }
-
-    var largest = units[units.length - 1];
-    return (sqMeters * largest.factor).toFixed(2) + ' ' + largest.label;
   } else {
     return areaPx.toFixed(0) + ' px²';
   }