From cfc6d2b6faf1dcddbf826aaf61bc6011f7049471 Mon Sep 17 00:00:00 2001 From: "GukSang.Jin" Date: Sat, 13 Jun 2026 19:21:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DentistryHandpieces/TorqueTrendControl.cs | 40 ++++++++++++++++++++--- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/DentistryHandpieces/TorqueTrendControl.cs b/DentistryHandpieces/TorqueTrendControl.cs index a4f59ea..cdacfc4 100644 --- a/DentistryHandpieces/TorqueTrendControl.cs +++ b/DentistryHandpieces/TorqueTrendControl.cs @@ -22,7 +22,8 @@ public sealed class TorqueTrendControl : FrameworkElement private const double SensorMaxTorque = 100; private const double MinimumTorqueRange = 0.1; private const double MinimumSpeedRange = 1; - private const double TorqueTrendBinSize = 0.1; + private const double TorqueRangePaddingRatio = 0.12; + private const double TorqueTrendBinSize = 0.01; private bool _isManualView; private double _viewMinTorque = SensorMinTorque; @@ -283,12 +284,35 @@ public sealed class TorqueTrendControl : FrameworkElement { if (!_isManualView) { + (_viewMinTorque, _viewMaxTorque) = GetAutoTorqueRange(samples); (_viewMinSpeed, _viewMaxSpeed) = GetAutoSpeedRange(samples); } return (_viewMinTorque, _viewMaxTorque, _viewMinSpeed, _viewMaxSpeed); } + private static (double MinTorque, double MaxTorque) GetAutoTorqueRange(List samples) + { + double minTorque = Math.Clamp(samples.Min(sample => sample.TorqueMilliNewtonMeters), SensorMinTorque, SensorMaxTorque); + double maxTorque = Math.Clamp(samples.Max(sample => sample.TorqueMilliNewtonMeters), SensorMinTorque, SensorMaxTorque); + double range = maxTorque - minTorque; + + if (range < MinimumTorqueRange) + { + double center = (minTorque + maxTorque) / 2; + minTorque = center - MinimumTorqueRange / 2; + maxTorque = center + MinimumTorqueRange / 2; + } + else + { + double padding = range * TorqueRangePaddingRatio; + minTorque -= padding; + maxTorque += padding; + } + + return ClampTorqueRange(minTorque, maxTorque); + } + private static (double MinSpeed, double MaxSpeed) GetAutoSpeedRange(List samples) { double minSpeed = samples.Min(sample => sample.SpeedRpm); @@ -480,15 +504,16 @@ public sealed class TorqueTrendControl : FrameworkElement } List samples = ReadSamples(); + (_viewMinTorque, _viewMaxTorque) = samples.Count == 0 + ? (SensorMinTorque, SensorMaxTorque) + : GetAutoTorqueRange(samples); (_viewMinSpeed, _viewMaxSpeed) = samples.Count == 0 ? (0, 1) : GetAutoSpeedRange(samples); _isManualView = true; } private void ClampView() { - double torqueRange = Math.Clamp(_viewMaxTorque - _viewMinTorque, MinimumTorqueRange, SensorMaxTorque - SensorMinTorque); - _viewMinTorque = Math.Clamp(_viewMinTorque, SensorMinTorque, SensorMaxTorque - torqueRange); - _viewMaxTorque = _viewMinTorque + torqueRange; + (_viewMinTorque, _viewMaxTorque) = ClampTorqueRange(_viewMinTorque, _viewMaxTorque); if (!double.IsFinite(_viewMinSpeed) || !double.IsFinite(_viewMaxSpeed) @@ -499,6 +524,13 @@ public sealed class TorqueTrendControl : FrameworkElement } } + private static (double MinTorque, double MaxTorque) ClampTorqueRange(double minTorque, double maxTorque) + { + double torqueRange = Math.Clamp(maxTorque - minTorque, MinimumTorqueRange, SensorMaxTorque - SensorMinTorque); + minTorque = Math.Clamp(minTorque, SensorMinTorque, SensorMaxTorque - torqueRange); + return (minTorque, minTorque + torqueRange); + } + private void EndMouseDrag() { _lastDragPoint = null;