Add IEC/IEEE schematic symbols for Potentiometer and Fuse (#995)

* Add new IEC and IEEE styles to Fuse symbol

* Add IEC style to potentiometer
For some reason it refuses to redraw on changing, it must be moved?

* Fix redraw on standard selection

* Fix indentation

* Change draw_style to camelCase drawStyle
This commit is contained in:
Jamie Drinkell
2026-06-05 19:38:11 +01:00
committed by GitHub
parent 717c16e88a
commit 75edc427f7
2 changed files with 99 additions and 28 deletions
@@ -24,6 +24,7 @@ package org.diylc.components.passive;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.Path2D;
import org.diylc.components.AbstractSchematicLeadedSymbol;
@@ -47,6 +48,8 @@ public class FuseSymbol extends AbstractSchematicLeadedSymbol<Current> {
public static Size DEFAULT_LENGTH = new Size(0.3, SizeUnit.in);
public static Size DEFAULT_WIDTH = new Size(0.12, SizeUnit.in);
private DrawStyle drawStyle = DrawStyle.ANSI;
private Current value = null;
@@ -59,6 +62,18 @@ public class FuseSymbol extends AbstractSchematicLeadedSymbol<Current> {
this.value = value;
}
@EditableProperty(name = "Draw Standard")
public DrawStyle getDrawStandard() {
if (drawStyle == null) {
drawStyle = DrawStyle.ANSI;
}
return drawStyle;
}
public void setDrawStandard(DrawStyle drawStyle) {
this.drawStyle = drawStyle;
}
@Override
public String getValueForDisplay() {
return getValue() == null ? null : getValue().toString();// + (getPowerNew() == null ? "" : " " + getPowerNew().toString());
@@ -93,16 +108,35 @@ public class FuseSymbol extends AbstractSchematicLeadedSymbol<Current> {
@Override
protected Shape getBodyShape() {
Path2D polyline = new Path2D.Double();
double length = getLength().convertToPixels();
double width = getWidth().convertToPixels();
double radius = width / 6;
polyline.moveTo(2 * radius, width / 2);
polyline.curveTo(3 * radius, width, length / 2 - radius, width, length / 2, width / 2);
polyline.curveTo(length / 2 + radius, 0, length - 3 * radius, 0, length - 2 * radius, width / 2);
polyline.append(new Ellipse2D.Double(0, width / 2 - radius, radius * 2, radius * 2), false);
polyline.append(new Ellipse2D.Double(length - radius * 2, width / 2 - radius, radius * 2, radius * 2), false);
return polyline;
double length = getLength().convertToPixels();
if(getDrawStandard() == DrawStyle.ANSI) {
Path2D polyline = new Path2D.Double();
double radius = width / 6;
polyline.moveTo(2 * radius, width / 2);
polyline.curveTo(3 * radius, width, length / 2 - radius, width, length / 2, width / 2);
polyline.curveTo(length / 2 + radius, 0, length - 3 * radius, 0, length - 2 * radius, width / 2);
polyline.append(new Ellipse2D.Double(0, width / 2 - radius, radius * 2, radius * 2), false);
polyline.append(new Ellipse2D.Double(length - radius * 2, width / 2 - radius, radius * 2, radius * 2), false);
return polyline;
} else {
GeneralPath fuseshape = new GeneralPath();
fuseshape.moveTo(0f, 0f);
fuseshape.lineTo(0f, width);
fuseshape.lineTo(length, width);
fuseshape.lineTo(length, 0f);
fuseshape.lineTo(0f, 0f);
if (getDrawStandard() == DrawStyle.IEEE) {
fuseshape.moveTo(0f, width / 2);
fuseshape.lineTo(length, width / 2);
} else {
fuseshape.moveTo(length * 0.2f, 0f);
fuseshape.lineTo(length * 0.2f, width);
fuseshape.moveTo(length * 0.8f, 0f);
fuseshape.lineTo(length * 0.8f, width);
}
return fuseshape;
}
}
@Override
@@ -110,6 +144,10 @@ public class FuseSymbol extends AbstractSchematicLeadedSymbol<Current> {
return false;
}
public enum DrawStyle {
ANSI, IEC, IEEE
}
@Override
public boolean isPolarized() {
return false;
@@ -35,6 +35,7 @@ import org.diylc.components.semiconductors.SymbolFlipping;
import org.diylc.components.transform.ThreeLegTransformer;
import org.diylc.core.IDIYComponent;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.KeywordPolicy;
@ComponentDescriptor(name = "Potentiometer", author = "MCbx", category = "Schematic Symbols",
@@ -44,50 +45,79 @@ import org.diylc.core.annotations.KeywordPolicy;
public class PotentiometerSymbol extends Abstract3LegSymbol {
private static final long serialVersionUID = 1L;
private DrawStyle drawStyle = DrawStyle.ANSI;
public PotentiometerSymbol() {
this.color = Color.blue;
}
@EditableProperty(name = "Draw Standard")
public DrawStyle getDrawStandard() {
if (drawStyle == null) {
drawStyle = DrawStyle.ANSI;
}
return drawStyle;
}
public void setDrawStandard(DrawStyle drawStyle) {
this.drawStyle = drawStyle;
body = null;
}
public Shape[] getBody() {
Shape[] body = new Shape[3];
Point2D[] controlPoints = getControlPoints();
double x = controlPoints[0].getX();
double y = controlPoints[0].getY();
int pinSpacing = (int) PIN_SPACING.convertToPixels();
GeneralPath polyline = new GeneralPath();
// Draw lead in
polyline.moveTo(x + pinSpacing * 2, y - pinSpacing * 2);
polyline.lineTo(x + pinSpacing * 2, y - pinSpacing * 2 + pinSpacing / 2);
polyline.lineTo(x + pinSpacing * 2 - pinSpacing / 4, (y - pinSpacing * 2) + pinSpacing / 2 + pinSpacing / 4);
polyline.lineTo(x + pinSpacing * 2 + pinSpacing / 4, (y - pinSpacing * 2) + 2 * pinSpacing / 2);
polyline.lineTo(x + pinSpacing * 2 - pinSpacing / 4, (y - pinSpacing * 2) + 3 * pinSpacing / 2 - pinSpacing / 8);
polyline.lineTo(x + pinSpacing * 2 + pinSpacing / 4, (y - pinSpacing * 2) + 4 * pinSpacing / 2 - pinSpacing / 4);
polyline.lineTo(x + pinSpacing * 2 - pinSpacing / 4, (y - pinSpacing * 2) + 5 * pinSpacing / 2 - pinSpacing / 3
- pinSpacing / 16);
polyline.lineTo(x + pinSpacing * 2 + pinSpacing / 4, (y - pinSpacing * 2) + 6 * pinSpacing / 2 - pinSpacing / 2
+ pinSpacing / 16);
polyline.lineTo(x + pinSpacing * 2 - pinSpacing / 4, (y - pinSpacing * 2) + 7 * pinSpacing / 2 - pinSpacing / 2
- pinSpacing / 16);
polyline.lineTo(x + pinSpacing * 2 + pinSpacing / 4, (y - pinSpacing * 2) + 7 * pinSpacing / 2 - pinSpacing / 2
+ pinSpacing / 4);
polyline.lineTo(x + pinSpacing * 2, (y - pinSpacing * 2) + 7 * pinSpacing / 2);
polyline.lineTo(x + pinSpacing * 2, y + pinSpacing * 2);
if (getDrawStandard() == DrawStyle.ANSI) {
// Draw ZigZag and lead out
polyline.lineTo(x + pinSpacing * 2 - pinSpacing / 4, (y - pinSpacing * 2) + pinSpacing / 2 + pinSpacing / 4);
polyline.lineTo(x + pinSpacing * 2 + pinSpacing / 4, (y - pinSpacing * 2) + 2 * pinSpacing / 2);
polyline.lineTo(x + pinSpacing * 2 - pinSpacing / 4, (y - pinSpacing * 2) + 3 * pinSpacing / 2 - pinSpacing / 8);
polyline.lineTo(x + pinSpacing * 2 + pinSpacing / 4, (y - pinSpacing * 2) + 4 * pinSpacing / 2 - pinSpacing / 4);
polyline.lineTo(x + pinSpacing * 2 - pinSpacing / 4, (y - pinSpacing * 2) + 5 * pinSpacing / 2 - pinSpacing / 3
- pinSpacing / 16);
polyline.lineTo(x + pinSpacing * 2 + pinSpacing / 4, (y - pinSpacing * 2) + 6 * pinSpacing / 2 - pinSpacing / 2
+ pinSpacing / 16);
polyline.lineTo(x + pinSpacing * 2 - pinSpacing / 4, (y - pinSpacing * 2) + 7 * pinSpacing / 2 - pinSpacing / 2
- pinSpacing / 16);
polyline.lineTo(x + pinSpacing * 2 + pinSpacing / 4, (y - pinSpacing * 2) + 7 * pinSpacing / 2 - pinSpacing / 2
+ pinSpacing / 4);
polyline.lineTo(x + pinSpacing * 2, (y - pinSpacing * 2) + 7 * pinSpacing / 2);
polyline.lineTo(x + pinSpacing * 2, y + pinSpacing * 2);
} else {
// Draw a rect and lead out
polyline.moveTo(x + pinSpacing * 1.7, y - pinSpacing * 2 + pinSpacing / 2);
polyline.lineTo(x + pinSpacing * 2.3, y - pinSpacing * 2 + pinSpacing / 2);
polyline.lineTo(x + pinSpacing * 2.3, y + pinSpacing * 2 - pinSpacing / 2);
polyline.lineTo(x + pinSpacing * 1.7, y + pinSpacing * 2 - pinSpacing / 2);
polyline.lineTo(x + pinSpacing * 1.7, y - pinSpacing * 2 + pinSpacing / 2);
polyline.moveTo(x + pinSpacing * 2, y + pinSpacing * 2 - pinSpacing / 2);
polyline.lineTo(x + pinSpacing * 2, y + pinSpacing * 2);
}
// The control line
polyline.moveTo(x, y);
polyline.lineTo(x + pinSpacing * 2 - pinSpacing / 2, y);
body[1] = polyline;
polyline = new GeneralPath();
body[0] = polyline;
// Arrow
polyline = new GeneralPath();
polyline.moveTo(x + pinSpacing * 2 - pinSpacing / 3, y);
polyline.lineTo(x + pinSpacing * 2 - pinSpacing * 2 / 3, y - pinSpacing / 3);
polyline.lineTo(x + pinSpacing * 2 - pinSpacing * 2 / 3, y + pinSpacing / 3);
polyline.lineTo(x + pinSpacing * 2 - pinSpacing / 3, y);
body[2] = polyline;
return body;
}
@@ -146,4 +176,7 @@ public class PotentiometerSymbol extends Abstract3LegSymbol {
height / 2 + 6, height / 2 + 2}, 3));
}
public enum DrawStyle {
ANSI, IEC
}
}