Mercurial > hg > orthanc-wsi
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²'; }
