diff --git a/diylc/diylc-core/src/main/resources/update.xml b/diylc/diylc-core/src/main/resources/update.xml
index 872b96d40..1c2ebd10a 100644
--- a/diylc/diylc-core/src/main/resources/update.xml
+++ b/diylc/diylc-core/src/main/resources/update.xml
@@ -425,6 +425,10 @@
2025-12-21 00:00:00.000 CET
+
+ IMPROVEMENT
+ Improved sensitivity of 'Multimeter Probe' that required pixel-level precision to detect connectivity; improved rendering of the probe in outline mode
+
BUG_FIX
Fixed underside rendering and mirroring position issues that affected only SPDT 'Mini Toggle Switch' types
diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/MultimeterProbe.java b/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/MultimeterProbe.java
index ea5087036..db68a6b0d 100644
--- a/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/MultimeterProbe.java
+++ b/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/MultimeterProbe.java
@@ -28,21 +28,20 @@ import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
+import org.diylc.appframework.miscutils.ConfigurationManager;
+import org.diylc.common.IPlugInPort;
import org.diylc.common.ObjectCache;
import org.diylc.common.Orientation45;
import org.diylc.components.AbstractTransparentComponent;
import org.diylc.components.transform.SimpleComponentTransformer;
-import org.diylc.core.ComponentState;
-import org.diylc.core.IDIYComponent;
-import org.diylc.core.IDrawingObserver;
-import org.diylc.core.Project;
-import org.diylc.core.VisibilityPolicy;
+import org.diylc.core.*;
import org.diylc.core.annotations.BomPolicy;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.KeywordPolicy;
import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
+import org.diylc.utils.Constants;
@ComponentDescriptor(name = "Multimeter Probe", category = "Connectivity",
author = "Branislav Stojkovic", description = "Multimeter Probe", instanceNamePrefix = "Probe",
@@ -59,6 +58,7 @@ public class MultimeterProbe extends AbstractTransparentComponent {
public static Size HANDLE_DIAMETER = new Size(0.2d, SizeUnit.in);
public static Size HANDLE_LENGTH = new Size(0.4d, SizeUnit.in);
public static Color HANDLE_COLOR = Color.red;
+ public static Size SENSITIVITY = new Size(0.05d, SizeUnit.in);
private Point2D.Double point = new Point2D.Double(0, 0);
private Color handleColor = HANDLE_COLOR;
@@ -77,27 +77,49 @@ public class MultimeterProbe extends AbstractTransparentComponent {
Shape[] shapes = getBody();
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f));
- if (!outlineMode) {
- Composite oldComposite = g2d.getComposite();
- if (alpha < MAX_ALPHA) {
- g2d.setComposite(
- AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA));
- }
- g2d.setColor(PROBE_COLOR);
- g2d.fill(shapes[0]);
- g2d.setColor(handleColor);
- g2d.fill(shapes[1]);
- g2d.setComposite(oldComposite);
+ // draw an invisible conductive circle around the point to increase sensitivity
+ g2d.setColor(Constants.TRANSPARENT_COLOR);
+ drawingObserver.startTrackingContinuityArea(true);
+ double sensitivity = SENSITIVITY.convertToPixels();
+ g2d.fillOval((int) (point.getX() - sensitivity), (int) (point.getY() - sensitivity),
+ (int) (sensitivity * 2), (int) (sensitivity * 2));
+ drawingObserver.stopTrackingContinuityArea();
+
+ Composite oldComposite = g2d.getComposite();
+ if (alpha < MAX_ALPHA) {
+ g2d.setComposite(
+ AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA));
}
- g2d.setColor(
- componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING
- ? SELECTION_COLOR
- : handleColor.darker());
+ g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : PROBE_COLOR);
+ g2d.fill(shapes[0]);
+ g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : handleColor);
+ g2d.fill(shapes[1]);
+ g2d.setComposite(oldComposite);
+ drawingObserver.stopTracking();
+
+ Theme theme = (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY,
+ Constants.DEFAULT_THEME);
+
+ Color handleBorderColor;
+ if (outlineMode) {
+ handleBorderColor = theme.getOutlineColor();
+ } else {
+ handleBorderColor = componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING
+ ? SELECTION_COLOR
+ : handleColor.darker();
+ }
+ g2d.setColor(handleBorderColor);
g2d.draw(shapes[1]);
- g2d.setColor(
- componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING
- ? SELECTION_COLOR
- : PROBE_COLOR.darker());
+
+ Color probeBorderColor;
+ if (outlineMode) {
+ probeBorderColor = theme.getOutlineColor();
+ } else {
+ probeBorderColor = componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING
+ ? SELECTION_COLOR
+ : PROBE_COLOR.darker();
+ }
+ g2d.setColor(probeBorderColor);
g2d.draw(shapes[0]);
}