From 057b93540c9607694cbe3a7b13a8fe05b13d2274 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 9 Sep 2025 10:12:03 +0200 Subject: [PATCH 1/6] CSSTUDIO-3425 Add widget property. --- .../extra/widgets/linearmeter/LinearMeterWidget.java | 9 +++++++++ .../org/csstudio/display/builder/model/Messages.java | 1 + .../csstudio/display/builder/model/messages.properties | 1 + 3 files changed, 11 insertions(+) diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java index 736a949023..41a01e16dc 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterWidget.java @@ -160,6 +160,10 @@ public EnumWidgetProperty createProperty(Widget widge } }; + private WidgetProperty logScale; + public static WidgetPropertyDescriptor propLogScale = + newBooleanPropertyDescriptor(WidgetPropertyCategory.DISPLAY, "logScale", Messages.WidgetProperties_LogScale); + public static WidgetPropertyDescriptor propNeedleColor = newColorPropertyDescriptor(WidgetPropertyCategory.MISC, "needle_color", Messages.WidgetProperties_NeedleColor); @@ -253,6 +257,7 @@ protected void defineProperties(List> properties) { super.defineProperties(properties); properties.add(display_mode = propDisplayMode.createProperty(this, RTLinearMeter.DisplayMode.NEEDLE)); + properties.add(logScale = propLogScale.createProperty(this, false)); properties.add(font = propFont.createProperty(this, WidgetFontService.get(NamedWidgetFonts.DEFAULT))); properties.add(format = propFormat.createProperty(this, FormatOption.DEFAULT)); properties.add(show_units = propShowUnits.createProperty(this, true)); @@ -439,4 +444,8 @@ public WidgetProperty propDisplayMode() { return display_mode; } + public WidgetProperty propLogScale() { + return logScale; + } + } diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java index feff995562..f0c46cd261 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/Messages.java @@ -260,6 +260,7 @@ public class Messages WidgetProperties_LineColor, WidgetProperties_LineWidth, WidgetProperties_Locale, + WidgetProperties_LogScale, WidgetProperties_Macros, WidgetProperties_MajorTickSpace, WidgetProperties_MajorTickStepHint, diff --git a/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties b/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties index 9f2619903c..82e52e2889 100644 --- a/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties +++ b/app/display/model/src/main/resources/org/csstudio/display/builder/model/messages.properties @@ -246,6 +246,7 @@ WidgetProperties_LimitsFromPV=Limits from PV WidgetProperties_LineColor=Line Color WidgetProperties_LineWidth=Line Width WidgetProperties_Locale=Locale +WidgetProperties_LogScale=Logarithmic Scale WidgetProperties_Macros=Macros WidgetProperties_MajorTickSpace=Major Ticks Space WidgetProperties_MajorTickStepHint=Major Ticks Pixel Dist. From ba9b8d863f4ed30947b7031ae80431ebb6b7fd0c Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 9 Sep 2025 10:12:29 +0200 Subject: [PATCH 2/6] CSSTUDIO-3425 Add parameter 'logScale' to the constructor of RTLinearMeter. --- .../extra/widgets/linearmeter/LinearMeterRepresentation.java | 3 ++- .../display/extra/widgets/linearmeter/RTLinearMeter.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java index 375c09a1bc..f78298c1f8 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java @@ -77,7 +77,8 @@ public Pane createJFXNode() widgetColorToAWTColor(model_widget.propNeedleColor().getValue()), model_widget.propKnobSize().getValue(), widgetColorToAWTColor(model_widget.propKnobColor().getValue()), - model_widget.propShowWarnings().getValue()); + model_widget.propShowWarnings().getValue(), + model_widget.propLogScale().getValue()); meter.setDisplayMode(model_widget.propDisplayMode().getValue()); meter.setSize(model_widget.propWidth().getValue(),model_widget.propHeight().getValue()); meter.setHorizontal(model_widget.propDisplayHorizontal().getValue()); diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java index 95b3a21190..be9cd09c07 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java @@ -91,7 +91,8 @@ public RTLinearMeter(double initialValue, Color needleColor, int knobSize, Color knobColor, - boolean showWarnings) + boolean showWarnings, + boolean logScale) { if (warningTriangle == null) { try { From 30ade20362cc4a6d91d71fe2fb666859b695f97f Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 9 Sep 2025 13:13:05 +0200 Subject: [PATCH 3/6] CSSTUDIO-3425 Add functionality to draw the Linear Meter with a logarithmic scale. --- .../widgets/linearmeter/LinearMeterScale.java | 49 +++++++--- .../widgets/linearmeter/RTLinearMeter.java | 95 +++++++++++++++---- 2 files changed, 116 insertions(+), 28 deletions(-) diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterScale.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterScale.java index f17d6db822..a7fe573ee4 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterScale.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterScale.java @@ -39,10 +39,12 @@ public LinearMeterScale(PlotPartListener listener, int height, boolean horizontal, double min, - double max) + double max, + boolean isLogarithmic) { super("", listener, horizontal, min, max); super.setBounds(0, 0, width, height); + super.setLogarithmic(isLogarithmic); isHorizontal = horizontal; } @@ -102,26 +104,49 @@ public void paint(Graphics2D gc, Rectangle plot_bounds) FontMetrics scale_font_fontMetrics = gc.getFontMetrics(scale_font); for (MajorTick tick : ticks.getMajorTicks()) { - gc.drawLine((int) ((start_x + this.scale * (tick.getValue() - offset) )), + if (isLogarithmic()) { + gc.drawLine((int) ((start_x + this.scale * (Math.log10(tick.getValue()) - Math.log10(offset)) )), + (int) ((start_y - 0.5 * TICK_LENGTH)), + (int) ((start_x + this.scale * (Math.log10(tick.getValue()) - Math.log10(offset)) )), + (int) ((start_y + 0.5 * TICK_LENGTH))); + drawTickLabel(gc, + (int) ((start_x + this.scale * (Math.log10(tick.getValue()) - Math.log10(offset)) - scale_font_fontMetrics.stringWidth(tick.getLabel())/2)), + (int) (start_y + 0.5 * TICK_LENGTH + 2 + Math.round(Math.ceil((72.0 * (scale_font_fontMetrics.getAscent())) / 96.0))), + tick.getLabel()); + } + else { + gc.drawLine((int) ((start_x + this.scale * (tick.getValue() - offset) )), (int) ((start_y - 0.5 * TICK_LENGTH)), (int) ((start_x + this.scale * (tick.getValue() - offset) )), (int) ((start_y + 0.5 * TICK_LENGTH))); - drawTickLabel(gc, - (int) ((start_x + this.scale * (tick.getValue() - offset) - scale_font_fontMetrics.stringWidth(tick.getLabel())/2)), - (int) (start_y + 0.5 * TICK_LENGTH + 2 + Math.round(Math.ceil((72.0 * (scale_font_fontMetrics.getAscent())) / 96.0))), - tick.getLabel()); + drawTickLabel(gc, + (int) ((start_x + this.scale * (tick.getValue() - offset) - scale_font_fontMetrics.stringWidth(tick.getLabel())/2)), + (int) (start_y + 0.5 * TICK_LENGTH + 2 + Math.round(Math.ceil((72.0 * (scale_font_fontMetrics.getAscent())) / 96.0))), + tick.getLabel()); + } } } else { - for (MajorTick tick : ticks.getMajorTicks()) { - gc.drawLine((int) (start_x - 0.5 * TICK_LENGTH), + if (isLogarithmic()) { + gc.drawLine((int) (start_x - 0.5 * TICK_LENGTH), + (int) (start_y - this.scale * (Math.log10(tick.getValue()) - Math.log10(offset))), + (int) (start_x + 0.5 * TICK_LENGTH), + (int) (start_y - this.scale * (Math.log10(tick.getValue()) - Math.log10(offset)))); + drawTickLabel(gc, + (int) (start_x + 4), + (int) (start_y - this.scale * (Math.log10(tick.getValue()) - Math.log10(offset)) + Math.round((72.0 * scale_font.getSize()) / (96.0 * 2.0))), + tick.getLabel()); + } + else { + gc.drawLine((int) (start_x - 0.5 * TICK_LENGTH), (int) (start_y - this.scale * (tick.getValue() - offset)), (int) (start_x + 0.5 * TICK_LENGTH), (int) (start_y - this.scale * (tick.getValue() - offset))); - drawTickLabel(gc, - (int) (start_x + 4), - (int) (start_y - this.scale * (tick.getValue() - offset) + Math.round((72.0 * scale_font.getSize()) / (96.0 * 2.0))), - tick.getLabel()); + drawTickLabel(gc, + (int) (start_x + 4), + (int) (start_y - this.scale * (tick.getValue() - offset) + Math.round((72.0 * scale_font.getSize()) / (96.0 * 2.0))), + tick.getLabel()); + } } } diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java index be9cd09c07..bbef33c971 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java @@ -116,7 +116,8 @@ public RTLinearMeter(double initialValue, height, isHorizontal, min, - max); + max, + logScale); this.minMaxTolerance = minMaxTolerance; this.loLo = loLo; @@ -190,7 +191,8 @@ public void redrawLinearMeterScale() { linearMeterScale.getBounds().height, linearMeterScale.isHorizontal(), linearMeterScale.getValueRange().getLow(), - linearMeterScale.getValueRange().getHigh()); + linearMeterScale.getValueRange().getHigh(), + linearMeterScale.isLogarithmic()); linearMeterScale.setHorizontal(isHorizontal); }); } @@ -296,6 +298,13 @@ public void setDisplayMode(DisplayMode newDisplayMode) { private DisplayMode displayMode = DisplayMode.NEEDLE; + public void setLogScale(boolean logScale) { + withWriteLock(() -> { + linearMeterScale.setLogarithmic(true); + redraw(); + }); + } + private void runOnJavaFXThread(Runnable runnable) { if (Platform.isFxApplicationThread()) { runnable.run(); @@ -750,10 +759,20 @@ private Optional computeIndicatorPosition(double value) { } return withReadLock(() -> { if (linearMeterScale.isHorizontal()) { - return Optional.of((int) Math.round(marginLeft + pixelsPerScaleUnit * (value - linearMeterScale.getValueRange().getLow()))); + if (linearMeterScale.isLogarithmic()) { + return Optional.of((int) Math.round(marginLeft + pixelsPerScaleUnit * (Math.log10(value) - Math.log10(linearMeterScale.getValueRange().getLow())))); + } + else { + return Optional.of((int) Math.round(marginLeft + pixelsPerScaleUnit * (value - linearMeterScale.getValueRange().getLow()))); + } } else { - return Optional.of((int) Math.round(linearMeterScale.getBounds().height - marginBelow - pixelsPerScaleUnit * (value - linearMeterScale.getValueRange().getLow()))); + if (linearMeterScale.isLogarithmic()) { + return Optional.of((int) Math.round(linearMeterScale.getBounds().height - marginBelow - pixelsPerScaleUnit * (Math.log10(value) - Math.log10(linearMeterScale.getValueRange().getLow())))); + } + else { + return Optional.of((int) Math.round(linearMeterScale.getBounds().height - marginBelow - pixelsPerScaleUnit * (value - linearMeterScale.getValueRange().getLow()))); + } } }); } @@ -1324,14 +1343,34 @@ private void layout() { marginBelow += 1 + fontMetrics.getMaxAscent() + fontMetrics.getMaxDescent(); } - pixelsPerScaleUnit = (linearMeterScale.getBounds().width - marginLeft - marginRight - 1) / (linearMeterScale.getValueRange().getHigh() - linearMeterScale.getValueRange().getLow()); + if (linearMeterScale.isLogarithmic()) { + pixelsPerScaleUnit = (linearMeterScale.getBounds().width - marginLeft - marginRight - 1) / (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(linearMeterScale.getValueRange().getLow())); + } + else { + pixelsPerScaleUnit = (linearMeterScale.getBounds().width - marginLeft - marginRight - 1) / (linearMeterScale.getValueRange().getHigh() - linearMeterScale.getValueRange().getLow()); + } meterBreadth = Math.round(linearMeterScale.getBounds().height - marginAbove - marginBelow) - 1; - double x_loLoRectangle = marginLeft; - double x_lowRectangle = marginLeft + pixelsPerScaleUnit * (displayedLoLo - linearMeterScale.getValueRange().getLow()); - double x_normalRectangle = marginLeft + pixelsPerScaleUnit * (displayedLow - linearMeterScale.getValueRange().getLow()); - double x_highRectangle = marginLeft + pixelsPerScaleUnit * (displayedHigh - linearMeterScale.getValueRange().getLow()); - double x_hiHiRectangle = marginLeft + pixelsPerScaleUnit * (displayedHiHi - linearMeterScale.getValueRange().getLow()); + double x_loLoRectangle; + double x_lowRectangle; + double x_normalRectangle; + double x_highRectangle; + double x_hiHiRectangle; + if (linearMeterScale.isLogarithmic()) { + x_loLoRectangle = marginLeft; + x_lowRectangle = marginLeft + pixelsPerScaleUnit * (Math.log10(displayedLoLo) - Math.log10(linearMeterScale.getValueRange().getLow())); + x_normalRectangle = marginLeft + pixelsPerScaleUnit * (Math.log10(displayedLow) - Math.log10(linearMeterScale.getValueRange().getLow())); + x_highRectangle = marginLeft + pixelsPerScaleUnit * (Math.log10(displayedHigh) - Math.log10(linearMeterScale.getValueRange().getLow())); + x_hiHiRectangle = marginLeft + pixelsPerScaleUnit * (Math.log10(displayedHiHi) - Math.log10(linearMeterScale.getValueRange().getLow())); + } + else { + x_loLoRectangle = marginLeft; + x_lowRectangle = marginLeft + pixelsPerScaleUnit * (displayedLoLo - linearMeterScale.getValueRange().getLow()); + x_normalRectangle = marginLeft + pixelsPerScaleUnit * (displayedLow - linearMeterScale.getValueRange().getLow()); + x_highRectangle = marginLeft + pixelsPerScaleUnit * (displayedHigh - linearMeterScale.getValueRange().getLow()); + x_hiHiRectangle = marginLeft + pixelsPerScaleUnit * (displayedHiHi - linearMeterScale.getValueRange().getLow()); + + } loLoRectangle = new Rectangle((int) Math.round(x_loLoRectangle), marginAbove, @@ -1353,9 +1392,16 @@ private void layout() { (int) (Math.round(x_hiHiRectangle) - Math.round(x_highRectangle)), meterBreadth); + int hihiWidth; + if (linearMeterScale.isLogarithmic()) { + hihiWidth = (int) (Math.round(pixelsPerScaleUnit * (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(displayedHiHi)))); + } + else { + hihiWidth = (int) (Math.round(pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedHiHi))); + } hiHiRectangle = new Rectangle((int) Math.round(x_hiHiRectangle), marginAbove, - (int) (Math.round(pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedHiHi))), + hihiWidth, meterBreadth); } else { @@ -1382,13 +1428,30 @@ private void layout() { marginBelow += 1 + fontMetrics.getMaxAscent() + fontMetrics.getMaxDescent(); } - pixelsPerScaleUnit = (linearMeterScale.getBounds().height - marginAbove - marginBelow - 1) / (linearMeterScale.getValueRange().getHigh() - linearMeterScale.getValueRange().getLow()); + if (linearMeterScale.isLogarithmic()) { + pixelsPerScaleUnit = (linearMeterScale.getBounds().height - marginAbove - marginBelow - 1) / (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(linearMeterScale.getValueRange().getLow())); + } + else { + pixelsPerScaleUnit = (linearMeterScale.getBounds().height - marginAbove - marginBelow - 1) / (linearMeterScale.getValueRange().getHigh() - linearMeterScale.getValueRange().getLow()); + } meterBreadth = Math.round(linearMeterScale.getBounds().width - marginLeft - marginRight); - double y_loLoRectangle = marginAbove + pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedLoLo); - double y_lowRectangle = marginAbove + pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedLow); - double y_normalRectangle = marginAbove + pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedHigh); - double y_highRectangle = marginAbove + pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedHiHi); + double y_loLoRectangle; + double y_lowRectangle; + double y_normalRectangle; + double y_highRectangle; + if (linearMeterScale.isLogarithmic()) { + y_loLoRectangle = marginAbove + pixelsPerScaleUnit * (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(displayedLoLo)); + y_lowRectangle = marginAbove + pixelsPerScaleUnit * (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(displayedLow)); + y_normalRectangle = marginAbove + pixelsPerScaleUnit * (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(displayedHigh)); + y_highRectangle = marginAbove + pixelsPerScaleUnit * (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(displayedHiHi)); + } + else { + y_loLoRectangle = marginAbove + pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedLoLo); + y_lowRectangle = marginAbove + pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedLow); + y_normalRectangle = marginAbove + pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedHigh); + y_highRectangle = marginAbove + pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedHiHi); + } loLoRectangle = new Rectangle(marginLeft, (int) Math.round(y_loLoRectangle), From 7cc7cf02d16cbbc60a8998649c05d6c7c66538e8 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 9 Sep 2025 13:28:17 +0200 Subject: [PATCH 4/6] CSSTUDIO-3425 Add event handler to propLogScale, and fix setLogScale(). --- .../extra/widgets/linearmeter/LinearMeterRepresentation.java | 5 +++++ .../display/extra/widgets/linearmeter/RTLinearMeter.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java index f78298c1f8..66b461401e 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterRepresentation.java @@ -109,6 +109,11 @@ protected void registerListeners() addUntypedWidgetPropertyListener(model_widget.propFont(), layoutChangedListener); addUntypedWidgetPropertyListener(model_widget.propNeedleColor(), layoutChangedListener); + addWidgetPropertyListener(model_widget.propLogScale(), (property, oldValue, newValue) -> { + meter.setLogScale(newValue); + layoutChanged(null, null, null); + }); + addWidgetPropertyListener(model_widget.propShowWarnings(), (property, oldValue, newValue) -> { meter.setShowWarnings(newValue); layoutChanged(null, null, null); diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java index bbef33c971..d5c0e7e38c 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java @@ -300,7 +300,7 @@ public void setDisplayMode(DisplayMode newDisplayMode) { public void setLogScale(boolean logScale) { withWriteLock(() -> { - linearMeterScale.setLogarithmic(true); + linearMeterScale.setLogarithmic(logScale); redraw(); }); } From ebbbb8dd6cb07832d12f635fb055c91db47a519d Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 9 Sep 2025 13:29:26 +0200 Subject: [PATCH 5/6] CSSTUDIO-3425 Remove unnecessary call to redraw(). --- .../display/extra/widgets/linearmeter/RTLinearMeter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java index d5c0e7e38c..5336519e53 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java @@ -301,7 +301,6 @@ public void setDisplayMode(DisplayMode newDisplayMode) { public void setLogScale(boolean logScale) { withWriteLock(() -> { linearMeterScale.setLogarithmic(logScale); - redraw(); }); } From 26d5132279cecedacea9a34c99cef2fdc48376d5 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Thu, 11 Sep 2025 09:08:22 +0200 Subject: [PATCH 6/6] CSSTUDIO-3425 Use org.csstudio.javafx.rtplot.internal.util.Log10.log10() instead of Math.log10(). --- .../widgets/linearmeter/LinearMeterScale.java | 14 +++++----- .../widgets/linearmeter/RTLinearMeter.java | 27 ++++++++++--------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterScale.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterScale.java index a7fe573ee4..60b6f0b933 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterScale.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/LinearMeterScale.java @@ -6,6 +6,8 @@ import org.csstudio.javafx.rtplot.internal.*; import org.csstudio.javafx.rtplot.internal.util.GraphicsUtils; +import static org.csstudio.javafx.rtplot.internal.util.Log10.log10; + public class LinearMeterScale extends NumericAxis { @@ -105,12 +107,12 @@ public void paint(Graphics2D gc, Rectangle plot_bounds) for (MajorTick tick : ticks.getMajorTicks()) { if (isLogarithmic()) { - gc.drawLine((int) ((start_x + this.scale * (Math.log10(tick.getValue()) - Math.log10(offset)) )), + gc.drawLine((int) ((start_x + this.scale * (log10(tick.getValue()) - log10(offset)) )), (int) ((start_y - 0.5 * TICK_LENGTH)), - (int) ((start_x + this.scale * (Math.log10(tick.getValue()) - Math.log10(offset)) )), + (int) ((start_x + this.scale * (log10(tick.getValue()) - log10(offset)) )), (int) ((start_y + 0.5 * TICK_LENGTH))); drawTickLabel(gc, - (int) ((start_x + this.scale * (Math.log10(tick.getValue()) - Math.log10(offset)) - scale_font_fontMetrics.stringWidth(tick.getLabel())/2)), + (int) ((start_x + this.scale * (log10(tick.getValue()) - log10(offset)) - scale_font_fontMetrics.stringWidth(tick.getLabel())/2)), (int) (start_y + 0.5 * TICK_LENGTH + 2 + Math.round(Math.ceil((72.0 * (scale_font_fontMetrics.getAscent())) / 96.0))), tick.getLabel()); } @@ -129,12 +131,12 @@ public void paint(Graphics2D gc, Rectangle plot_bounds) for (MajorTick tick : ticks.getMajorTicks()) { if (isLogarithmic()) { gc.drawLine((int) (start_x - 0.5 * TICK_LENGTH), - (int) (start_y - this.scale * (Math.log10(tick.getValue()) - Math.log10(offset))), + (int) (start_y - this.scale * (log10(tick.getValue()) - log10(offset))), (int) (start_x + 0.5 * TICK_LENGTH), - (int) (start_y - this.scale * (Math.log10(tick.getValue()) - Math.log10(offset)))); + (int) (start_y - this.scale * (log10(tick.getValue()) - log10(offset)))); drawTickLabel(gc, (int) (start_x + 4), - (int) (start_y - this.scale * (Math.log10(tick.getValue()) - Math.log10(offset)) + Math.round((72.0 * scale_font.getSize()) / (96.0 * 2.0))), + (int) (start_y - this.scale * (log10(tick.getValue()) - log10(offset)) + Math.round((72.0 * scale_font.getSize()) / (96.0 * 2.0))), tick.getLabel()); } else { diff --git a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java index 5336519e53..a65717d6b7 100644 --- a/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java +++ b/app/display/linearmeter/src/main/java/org/csstudio/display/extra/widgets/linearmeter/RTLinearMeter.java @@ -2,6 +2,7 @@ package org.csstudio.display.extra.widgets.linearmeter; import static org.csstudio.javafx.rtplot.Activator.logger; +import static org.csstudio.javafx.rtplot.internal.util.Log10.log10; import java.awt.BasicStroke; import java.awt.Canvas; @@ -759,7 +760,7 @@ private Optional computeIndicatorPosition(double value) { return withReadLock(() -> { if (linearMeterScale.isHorizontal()) { if (linearMeterScale.isLogarithmic()) { - return Optional.of((int) Math.round(marginLeft + pixelsPerScaleUnit * (Math.log10(value) - Math.log10(linearMeterScale.getValueRange().getLow())))); + return Optional.of((int) Math.round(marginLeft + pixelsPerScaleUnit * (log10(value) - log10(linearMeterScale.getValueRange().getLow())))); } else { return Optional.of((int) Math.round(marginLeft + pixelsPerScaleUnit * (value - linearMeterScale.getValueRange().getLow()))); @@ -767,7 +768,7 @@ private Optional computeIndicatorPosition(double value) { } else { if (linearMeterScale.isLogarithmic()) { - return Optional.of((int) Math.round(linearMeterScale.getBounds().height - marginBelow - pixelsPerScaleUnit * (Math.log10(value) - Math.log10(linearMeterScale.getValueRange().getLow())))); + return Optional.of((int) Math.round(linearMeterScale.getBounds().height - marginBelow - pixelsPerScaleUnit * (log10(value) - log10(linearMeterScale.getValueRange().getLow())))); } else { return Optional.of((int) Math.round(linearMeterScale.getBounds().height - marginBelow - pixelsPerScaleUnit * (value - linearMeterScale.getValueRange().getLow()))); @@ -1343,7 +1344,7 @@ private void layout() { } if (linearMeterScale.isLogarithmic()) { - pixelsPerScaleUnit = (linearMeterScale.getBounds().width - marginLeft - marginRight - 1) / (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(linearMeterScale.getValueRange().getLow())); + pixelsPerScaleUnit = (linearMeterScale.getBounds().width - marginLeft - marginRight - 1) / (log10(linearMeterScale.getValueRange().getHigh()) - log10(linearMeterScale.getValueRange().getLow())); } else { pixelsPerScaleUnit = (linearMeterScale.getBounds().width - marginLeft - marginRight - 1) / (linearMeterScale.getValueRange().getHigh() - linearMeterScale.getValueRange().getLow()); @@ -1357,10 +1358,10 @@ private void layout() { double x_hiHiRectangle; if (linearMeterScale.isLogarithmic()) { x_loLoRectangle = marginLeft; - x_lowRectangle = marginLeft + pixelsPerScaleUnit * (Math.log10(displayedLoLo) - Math.log10(linearMeterScale.getValueRange().getLow())); - x_normalRectangle = marginLeft + pixelsPerScaleUnit * (Math.log10(displayedLow) - Math.log10(linearMeterScale.getValueRange().getLow())); - x_highRectangle = marginLeft + pixelsPerScaleUnit * (Math.log10(displayedHigh) - Math.log10(linearMeterScale.getValueRange().getLow())); - x_hiHiRectangle = marginLeft + pixelsPerScaleUnit * (Math.log10(displayedHiHi) - Math.log10(linearMeterScale.getValueRange().getLow())); + x_lowRectangle = marginLeft + pixelsPerScaleUnit * (log10(displayedLoLo) - log10(linearMeterScale.getValueRange().getLow())); + x_normalRectangle = marginLeft + pixelsPerScaleUnit * (log10(displayedLow) - log10(linearMeterScale.getValueRange().getLow())); + x_highRectangle = marginLeft + pixelsPerScaleUnit * (log10(displayedHigh) - log10(linearMeterScale.getValueRange().getLow())); + x_hiHiRectangle = marginLeft + pixelsPerScaleUnit * (log10(displayedHiHi) - log10(linearMeterScale.getValueRange().getLow())); } else { x_loLoRectangle = marginLeft; @@ -1393,7 +1394,7 @@ private void layout() { int hihiWidth; if (linearMeterScale.isLogarithmic()) { - hihiWidth = (int) (Math.round(pixelsPerScaleUnit * (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(displayedHiHi)))); + hihiWidth = (int) (Math.round(pixelsPerScaleUnit * (log10(linearMeterScale.getValueRange().getHigh()) - log10(displayedHiHi)))); } else { hihiWidth = (int) (Math.round(pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedHiHi))); @@ -1428,7 +1429,7 @@ private void layout() { } if (linearMeterScale.isLogarithmic()) { - pixelsPerScaleUnit = (linearMeterScale.getBounds().height - marginAbove - marginBelow - 1) / (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(linearMeterScale.getValueRange().getLow())); + pixelsPerScaleUnit = (linearMeterScale.getBounds().height - marginAbove - marginBelow - 1) / (log10(linearMeterScale.getValueRange().getHigh()) - log10(linearMeterScale.getValueRange().getLow())); } else { pixelsPerScaleUnit = (linearMeterScale.getBounds().height - marginAbove - marginBelow - 1) / (linearMeterScale.getValueRange().getHigh() - linearMeterScale.getValueRange().getLow()); @@ -1440,10 +1441,10 @@ private void layout() { double y_normalRectangle; double y_highRectangle; if (linearMeterScale.isLogarithmic()) { - y_loLoRectangle = marginAbove + pixelsPerScaleUnit * (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(displayedLoLo)); - y_lowRectangle = marginAbove + pixelsPerScaleUnit * (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(displayedLow)); - y_normalRectangle = marginAbove + pixelsPerScaleUnit * (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(displayedHigh)); - y_highRectangle = marginAbove + pixelsPerScaleUnit * (Math.log10(linearMeterScale.getValueRange().getHigh()) - Math.log10(displayedHiHi)); + y_loLoRectangle = marginAbove + pixelsPerScaleUnit * (log10(linearMeterScale.getValueRange().getHigh()) - log10(displayedLoLo)); + y_lowRectangle = marginAbove + pixelsPerScaleUnit * (log10(linearMeterScale.getValueRange().getHigh()) - log10(displayedLow)); + y_normalRectangle = marginAbove + pixelsPerScaleUnit * (log10(linearMeterScale.getValueRange().getHigh()) - log10(displayedHigh)); + y_highRectangle = marginAbove + pixelsPerScaleUnit * (log10(linearMeterScale.getValueRange().getHigh()) - log10(displayedHiHi)); } else { y_loLoRectangle = marginAbove + pixelsPerScaleUnit * (linearMeterScale.getValueRange().getHigh() - displayedLoLo);