diff --git a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/MeterWidget.java b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/MeterWidget.java index 9c1613c4f2..7d73fa8e3a 100644 --- a/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/MeterWidget.java +++ b/app/display/model/src/main/java/org/csstudio/display/builder/model/widgets/MeterWidget.java @@ -18,6 +18,7 @@ import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propMinimum; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propPrecision; import static org.csstudio.display.builder.model.properties.CommonWidgetProperties.propShowUnits; +import static org.csstudio.display.builder.model.widgets.plots.PlotWidgetProperties.propLogscale; import java.util.Arrays; import java.util.List; @@ -158,6 +159,7 @@ else if (xml_version.getMajor() < 3) private volatile WidgetProperty limits_from_pv; private volatile WidgetProperty minimum; private volatile WidgetProperty maximum; + private volatile WidgetProperty log_scale; /** Constructor */ public MeterWidget() @@ -195,6 +197,7 @@ protected void defineProperties(final List> properties) properties.add(limits_from_pv = propLimitsFromPV.createProperty(this, true)); properties.add(minimum = propMinimum.createProperty(this, 0.0)); properties.add(maximum = propMaximum.createProperty(this, 100.0)); + properties.add(log_scale = propLogscale.createProperty(this, false)); } /** @return 'foreground_color' property */ @@ -274,4 +277,10 @@ public WidgetProperty propMaximum() { return maximum; } + + /** @return 'log_scale' property */ + public WidgetProperty propLogScale() + { + return log_scale; + } } diff --git a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/MeterRepresentation.java b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/MeterRepresentation.java index 713050c254..cae1cf7fb4 100644 --- a/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/MeterRepresentation.java +++ b/app/display/representation-javafx/src/main/java/org/csstudio/display/builder/representation/javafx/widgets/MeterRepresentation.java @@ -64,6 +64,7 @@ protected void registerListeners() model_widget.propMaximum().addUntypedPropertyListener(valueListener); model_widget.propShowValue().addUntypedPropertyListener(valueListener); model_widget.runtimePropValue().addUntypedPropertyListener(valueListener); + model_widget.propLogScale().addUntypedPropertyListener(valueListener); valueChanged(null, null, null); } @@ -82,6 +83,7 @@ protected void unregisterListeners() model_widget.propMaximum().removePropertyListener(valueListener); model_widget.propShowValue().removePropertyListener(valueListener); model_widget.runtimePropValue().removePropertyListener(valueListener); + model_widget.propLogScale().removePropertyListener(valueListener); super.unregisterListeners(); } @@ -142,6 +144,8 @@ private void valueChanged(final WidgetProperty property, final Object old_val } else meter.setValue(value, ""); + + meter.setLogScale(model_widget.propLogScale().getValue()); } @Override diff --git a/app/rtplot/src/main/java/org/csstudio/javafx/rtplot/RTMeter.java b/app/rtplot/src/main/java/org/csstudio/javafx/rtplot/RTMeter.java index 58190a2893..3391e5683b 100644 --- a/app/rtplot/src/main/java/org/csstudio/javafx/rtplot/RTMeter.java +++ b/app/rtplot/src/main/java/org/csstudio/javafx/rtplot/RTMeter.java @@ -61,6 +61,13 @@ public class RTMeter extends ImageView /** Area of this meter */ protected volatile Rectangle area = new Rectangle(0, 0, 0, 0); + /** @param logscale Use log scale for y-axis? */ + public void setLogScale(final boolean logscale) + { + scale.setLogarithmic(logscale); + requestUpdate(); + } + /** Listener to {@link PlotPart}s (scale), triggering refresh of meter */ protected final PlotPartListener plot_part_listener = new PlotPartListener() { diff --git a/app/rtplot/src/main/java/org/csstudio/javafx/rtplot/internal/MeterScale.java b/app/rtplot/src/main/java/org/csstudio/javafx/rtplot/internal/MeterScale.java index 9f09be1ff5..1e48c1606b 100644 --- a/app/rtplot/src/main/java/org/csstudio/javafx/rtplot/internal/MeterScale.java +++ b/app/rtplot/src/main/java/org/csstudio/javafx/rtplot/internal/MeterScale.java @@ -131,7 +131,15 @@ public double getAngle(final double value) if (Double.isFinite(value)) { final AxisRange range = getValueRange(); - return start_angle + (value - range.getLow()) * angle_range / (range.getHigh() - range.getLow()); + if (isLogarithmic()) + { + return start_angle + Math.log10(value/range.getLow()) * angle_range / Math.log10(range.getHigh()/range.getLow()); + } + else + { + return start_angle + (value - range.getLow()) * angle_range / (range.getHigh() - range.getLow()); + } + } else return Double.NaN;