diff --git a/diylc/diylc-library/src/org/diylc/components/Abstract3LegSymbol.java b/diylc/diylc-library/src/org/diylc/components/Abstract3LegSymbol.java index 30891a4a..f0a4ca2c 100644 --- a/diylc/diylc-library/src/org/diylc/components/Abstract3LegSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/Abstract3LegSymbol.java @@ -89,7 +89,11 @@ public abstract class Abstract3LegSymbol extends AbstractComponent { g2d.setColor(finalColor); // Draw transistor - + + if (this.body == null) { + this.body = getBody(); + applyOrientation(this.body); + } Shape[] body = getBody(); AffineTransform old = g2d.getTransform(); @@ -166,7 +170,7 @@ public abstract class Abstract3LegSymbol extends AbstractComponent { return controlPoints[0].y; } - private void updateControlPoints() { + protected void updateControlPoints() { int pinSpacing = (int) PIN_SPACING.convertToPixels(); // Update control points. int x = controlPoints[0].x; @@ -178,7 +182,17 @@ public abstract class Abstract3LegSymbol extends AbstractComponent { controlPoints[1].y = y - pinSpacing * 2; controlPoints[2].x = x + f * pinSpacing * 2; - controlPoints[2].y = y + pinSpacing * 2; + controlPoints[2].y = y + pinSpacing * 2; + + if (getOrientation() != Orientation.DEFAULT) + { + Point first = this.controlPoints[0]; + double angle = Double.parseDouble(getOrientation().name().replace("_", "")); + AffineTransform rotate = AffineTransform.getRotateInstance(Math.toRadians(angle), first.x, first.y); + for (int i = 1; i < this.controlPoints.length; i++) { + rotate.transform(this.controlPoints[i], this.controlPoints[i]); + } + } } @Override @@ -206,7 +220,8 @@ public abstract class Abstract3LegSymbol extends AbstractComponent { public void setControlPoint(Point point, int index) { controlPoints[index].setLocation(point); - refreshDrawing(); + // make sure we have a new drawing + body = null; } @EditableProperty @@ -217,7 +232,9 @@ public abstract class Abstract3LegSymbol extends AbstractComponent { public void setFlip(SymbolFlipping flip) { this.flip = flip; - refreshDrawing(); + updateControlPoints(); + // make sure we have a new drawing + body = null; } @EditableProperty @@ -249,29 +266,24 @@ public abstract class Abstract3LegSymbol extends AbstractComponent { public void setOrientation(Orientation orientation) { this.orientation = orientation; - refreshDrawing(); - } - - protected void refreshDrawing() { - updateControlPoints(); - // make sure we have a new drawing + updateControlPoints(); + // make sure we have a new drawing body = null; - getBody(); - - if (getOrientation() == Orientation.DEFAULT) - return; - - Point first = this.controlPoints[0]; - double angle = Double.parseDouble(getOrientation().name().replace("_", "")); - AffineTransform rotate = AffineTransform.getRotateInstance(Math.toRadians(angle), first.x, first.y); - for (int i = 1; i < this.controlPoints.length; i++) { - rotate.transform(this.controlPoints[i], this.controlPoints[i]); - } - if (this.body != null) { - for (int i = 0; i < this.body.length; i++) { - this.body[i] = rotate.createTransformedShape(this.body[i]); - } - } + } + + protected void applyOrientation(Shape[] body) { + if (getOrientation() == Orientation.DEFAULT) + return; + + Point first = this.controlPoints[0]; + double angle = Double.parseDouble(getOrientation().name().replace("_", "")); + AffineTransform rotate = AffineTransform.getRotateInstance(Math.toRadians(angle), first.x, first.y); + + if (body != null) { + for (int i = 0; i < body.length; i++) { + body[i] = rotate.createTransformedShape(body[i]); + } + } } /** diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/BJTSymbol.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/BJTSymbol.java index 6c538b8a..86113a8f 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/BJTSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/BJTSymbol.java @@ -45,49 +45,48 @@ public class BJTSymbol extends Abstract3LegSymbol { protected BJTPolarity polarity = BJTPolarity.NPN; public Shape[] getBody() { - if (body == null) { - body = new Shape[3]; - int x = controlPoints[0].x; - int y = controlPoints[0].y; - int pinSpacing = (int) PIN_SPACING.convertToPixels(); + Shape[] body = new Shape[3]; + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int pinSpacing = (int) PIN_SPACING.convertToPixels(); - GeneralPath polyline = new GeneralPath(); + GeneralPath polyline = new GeneralPath(); - polyline.moveTo(x + pinSpacing / 2, y - pinSpacing); - polyline.lineTo(x + pinSpacing / 2, y + pinSpacing); + polyline.moveTo(x + pinSpacing / 2, y - pinSpacing); + polyline.lineTo(x + pinSpacing / 2, y + pinSpacing); - body[0] = polyline; + body[0] = polyline; - polyline = new GeneralPath(); + polyline = new GeneralPath(); - polyline.moveTo(x, y); - polyline.lineTo(x + pinSpacing / 2, y); - polyline.moveTo(x + pinSpacing / 2, y - pinSpacing / 2); - polyline.lineTo(x + pinSpacing * 2, y - pinSpacing); - polyline.lineTo(x + pinSpacing * 2, y - pinSpacing * 2); - polyline.moveTo(x + pinSpacing / 2, y + pinSpacing / 2); - polyline.lineTo(x + pinSpacing * 2, y + pinSpacing); - polyline.lineTo(x + pinSpacing * 2, y + pinSpacing * 2); - body[1] = polyline; + polyline.moveTo(x, y); + polyline.lineTo(x + pinSpacing / 2, y); + polyline.moveTo(x + pinSpacing / 2, y - pinSpacing / 2); + polyline.lineTo(x + pinSpacing * 2, y - pinSpacing); + polyline.lineTo(x + pinSpacing * 2, y - pinSpacing * 2); + polyline.moveTo(x + pinSpacing / 2, y + pinSpacing / 2); + polyline.lineTo(x + pinSpacing * 2, y + pinSpacing); + polyline.lineTo(x + pinSpacing * 2, y + pinSpacing * 2); + body[1] = polyline; - Area arrow; - double theta; - if (polarity == BJTPolarity.NPN) { - theta = Math.atan(1.0 / 3); - arrow = - new Area(new Polygon(new int[] {x + pinSpacing, x + pinSpacing, x + pinSpacing * 10 / 6}, new int[] { - y - pinSpacing / 5 + pinSpacing / 2, y + pinSpacing / 5 + pinSpacing / 2, y + pinSpacing / 2}, 3)); - arrow.transform(AffineTransform.getRotateInstance(theta, x + pinSpacing / 2, y + pinSpacing / 2)); - } else { - theta = -Math.atan(1.0 / 3); - arrow = - new Area( - new Polygon(new int[] {x + pinSpacing, x + pinSpacing * 10 / 6, x + pinSpacing * 10 / 6}, new int[] { - y - pinSpacing / 2, y - pinSpacing / 5 - pinSpacing / 2, y + pinSpacing / 5 - pinSpacing / 2}, 3)); - arrow.transform(AffineTransform.getRotateInstance(theta, x + pinSpacing / 2, y - pinSpacing / 2)); - } - body[2] = arrow; + Area arrow; + double theta; + if (polarity == BJTPolarity.NPN) { + theta = Math.atan(1.0 / 3); + arrow = + new Area(new Polygon(new int[] {x + pinSpacing, x + pinSpacing, x + pinSpacing * 10 / 6}, new int[] { + y - pinSpacing / 5 + pinSpacing / 2, y + pinSpacing / 5 + pinSpacing / 2, y + pinSpacing / 2}, 3)); + arrow.transform(AffineTransform.getRotateInstance(theta, x + pinSpacing / 2, y + pinSpacing / 2)); + } else { + theta = -Math.atan(1.0 / 3); + arrow = + new Area( + new Polygon(new int[] {x + pinSpacing, x + pinSpacing * 10 / 6, x + pinSpacing * 10 / 6}, new int[] { + y - pinSpacing / 2, y - pinSpacing / 5 - pinSpacing / 2, y + pinSpacing / 5 - pinSpacing / 2}, 3)); + arrow.transform(AffineTransform.getRotateInstance(theta, x + pinSpacing / 2, y - pinSpacing / 2)); } + body[2] = arrow; + return body; } @@ -115,8 +114,7 @@ public class BJTSymbol extends Abstract3LegSymbol { public void setPolarity(BJTPolarity polarity) { this.polarity = polarity; - - - refreshDrawing(); + + body = null; } } diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/JFETSymbol.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/JFETSymbol.java index 3a213f53..0c8d7e6f 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/JFETSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/JFETSymbol.java @@ -42,44 +42,43 @@ public class JFETSymbol extends Abstract3LegSymbol { protected FETPolarity polarity = FETPolarity.NEGATIVE; - public Shape[] getBody() { - if (body == null) { - body = new Shape[3]; - int x = controlPoints[0].x; - int y = controlPoints[0].y; - int pinSpacing = (int) PIN_SPACING.convertToPixels(); + public Shape[] getBody() { + Shape[] body = new Shape[3]; + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int pinSpacing = (int) PIN_SPACING.convertToPixels(); - GeneralPath polyline = new GeneralPath(); + GeneralPath polyline = new GeneralPath(); - polyline.moveTo(x + pinSpacing, y - pinSpacing); - polyline.lineTo(x + pinSpacing, y + pinSpacing); + polyline.moveTo(x + pinSpacing, y - pinSpacing); + polyline.lineTo(x + pinSpacing, y + pinSpacing); - body[0] = polyline; + body[0] = polyline; - polyline = new GeneralPath(); + polyline = new GeneralPath(); - polyline.moveTo(x, y); - polyline.lineTo(x + pinSpacing, y); - polyline.moveTo(x + pinSpacing, y - pinSpacing * 7 / 8); - polyline.lineTo(x + pinSpacing * 2, y - pinSpacing * 7 / 8); - polyline.lineTo(x + pinSpacing * 2, y - pinSpacing * 2); - polyline.moveTo(x + pinSpacing, y + pinSpacing * 7 / 8); - polyline.lineTo(x + pinSpacing * 2, y + pinSpacing * 7 / 8); - polyline.lineTo(x + pinSpacing * 2, y + pinSpacing * 2); - body[1] = polyline; + polyline.moveTo(x, y); + polyline.lineTo(x + pinSpacing, y); + polyline.moveTo(x + pinSpacing, y - pinSpacing * 7 / 8); + polyline.lineTo(x + pinSpacing * 2, y - pinSpacing * 7 / 8); + polyline.lineTo(x + pinSpacing * 2, y - pinSpacing * 2); + polyline.moveTo(x + pinSpacing, y + pinSpacing * 7 / 8); + polyline.lineTo(x + pinSpacing * 2, y + pinSpacing * 7 / 8); + polyline.lineTo(x + pinSpacing * 2, y + pinSpacing * 2); + body[1] = polyline; - Polygon arrow; - if (polarity == FETPolarity.NEGATIVE) { - arrow = - new Polygon(new int[] {x + pinSpacing * 2 / 6, x + pinSpacing * 2 / 6, x + pinSpacing * 6 / 6}, new int[] { - y - pinSpacing / 5, y + pinSpacing / 5, y}, 3); - } else { - arrow = - new Polygon(new int[] {x + pinSpacing / 6, x + pinSpacing * 5 / 6, x + pinSpacing * 5 / 6}, new int[] {y, - y + pinSpacing / 5, y - pinSpacing / 5}, 3); - } - body[2] = arrow; + Polygon arrow; + if (polarity == FETPolarity.NEGATIVE) { + arrow = + new Polygon(new int[] {x + pinSpacing * 2 / 6, x + pinSpacing * 2 / 6, x + pinSpacing * 6 / 6}, new int[] { + y - pinSpacing / 5, y + pinSpacing / 5, y}, 3); + } else { + arrow = + new Polygon(new int[] {x + pinSpacing / 6, x + pinSpacing * 5 / 6, x + pinSpacing * 5 / 6}, new int[] {y, + y + pinSpacing / 5, y - pinSpacing / 5}, 3); } + body[2] = arrow; + return body; } @@ -108,6 +107,6 @@ public class JFETSymbol extends Abstract3LegSymbol { public void setPolarity(FETPolarity polarity) { this.polarity = polarity; - refreshDrawing(); + body = null; } } diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/MOSFETSymbol.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/MOSFETSymbol.java index bab2965b..e749f8e1 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/MOSFETSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/MOSFETSymbol.java @@ -42,47 +42,46 @@ public class MOSFETSymbol extends Abstract3LegSymbol { protected FETPolarity polarity = FETPolarity.NEGATIVE; - public Shape[] getBody() { - if (body == null) { - body = new Shape[3]; - int x = controlPoints[0].x; - int y = controlPoints[0].y; - int pinSpacing = (int) PIN_SPACING.convertToPixels(); + public Shape[] getBody() { + Shape[] body = new Shape[3]; + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int pinSpacing = (int) PIN_SPACING.convertToPixels(); - GeneralPath polyline = new GeneralPath(); + GeneralPath polyline = new GeneralPath(); - polyline.moveTo(x + pinSpacing / 2, y - pinSpacing + 1); - polyline.lineTo(x + pinSpacing / 2, y + pinSpacing - 1); - polyline.moveTo(x + pinSpacing, y - pinSpacing + 1); - polyline.lineTo(x + pinSpacing, y + pinSpacing - 1); - body[0] = polyline; + polyline.moveTo(x + pinSpacing / 2, y - pinSpacing + 1); + polyline.lineTo(x + pinSpacing / 2, y + pinSpacing - 1); + polyline.moveTo(x + pinSpacing, y - pinSpacing + 1); + polyline.lineTo(x + pinSpacing, y + pinSpacing - 1); + body[0] = polyline; - polyline = new GeneralPath(); + polyline = new GeneralPath(); - polyline.moveTo(x + pinSpacing, y - pinSpacing); - polyline.lineTo(x + pinSpacing * 2, y - pinSpacing); - polyline.moveTo(x + pinSpacing, y + pinSpacing); - polyline.lineTo(x + pinSpacing * 2, y + pinSpacing); - polyline.moveTo(x, y); - polyline.lineTo(x + pinSpacing / 2, y); - polyline.moveTo(x + pinSpacing * 2, y - pinSpacing * 2); - polyline.lineTo(x + pinSpacing * 2, y - pinSpacing); - polyline.moveTo(x + pinSpacing * 2, y + pinSpacing * 2); - polyline.lineTo(x + pinSpacing * 2, y + pinSpacing); - body[1] = polyline; + polyline.moveTo(x + pinSpacing, y - pinSpacing); + polyline.lineTo(x + pinSpacing * 2, y - pinSpacing); + polyline.moveTo(x + pinSpacing, y + pinSpacing); + polyline.lineTo(x + pinSpacing * 2, y + pinSpacing); + polyline.moveTo(x, y); + polyline.lineTo(x + pinSpacing / 2, y); + polyline.moveTo(x + pinSpacing * 2, y - pinSpacing * 2); + polyline.lineTo(x + pinSpacing * 2, y - pinSpacing); + polyline.moveTo(x + pinSpacing * 2, y + pinSpacing * 2); + polyline.lineTo(x + pinSpacing * 2, y + pinSpacing); + body[1] = polyline; - Polygon arrow; - if (polarity == FETPolarity.NEGATIVE) { - arrow = - new Polygon(new int[] {x + pinSpacing * 8 / 6, x + pinSpacing * 8 / 6, x + pinSpacing * 12 / 6}, new int[] { - y + pinSpacing * 6 / 5, y + pinSpacing * 4 / 5, y + pinSpacing}, 3); - } else { - arrow = - new Polygon(new int[] {x + pinSpacing * 7 / 6, x + pinSpacing * 11 / 6, x + pinSpacing * 11 / 6}, - new int[] {y - pinSpacing, y - pinSpacing * 6 / 5, y - pinSpacing * 4 / 5}, 3); - } - body[2] = arrow; + Polygon arrow; + if (polarity == FETPolarity.NEGATIVE) { + arrow = + new Polygon(new int[] {x + pinSpacing * 8 / 6, x + pinSpacing * 8 / 6, x + pinSpacing * 12 / 6}, new int[] { + y + pinSpacing * 6 / 5, y + pinSpacing * 4 / 5, y + pinSpacing}, 3); + } else { + arrow = + new Polygon(new int[] {x + pinSpacing * 7 / 6, x + pinSpacing * 11 / 6, x + pinSpacing * 11 / 6}, + new int[] {y - pinSpacing, y - pinSpacing * 6 / 5, y - pinSpacing * 4 / 5}, 3); } + body[2] = arrow; + return body; } @@ -111,6 +110,6 @@ public class MOSFETSymbol extends Abstract3LegSymbol { public void setPolarity(FETPolarity polarity) { this.polarity = polarity; - refreshDrawing(); + body = null; } } diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index b95dba76..a93dfaa5 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index d31657b4..4c1b40c0 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index 102fa6e4..87d12258 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2166,6 +2166,10 @@ BUG_FIX Project font gets reverted to "Square721 BT" on Undo + + BUG_FIX + When loaded from an existing file "Potentiometer Symbol" doesn't retain the specified orientation + https://github.com/bancika/diy-layout-creator/releases