From 2eeb05e7afb3f7efde3cfca6cf3cae72b5e6b4b2 Mon Sep 17 00:00:00 2001 From: bancika Date: Wed, 21 Dec 2016 15:58:57 +0100 Subject: [PATCH] Tube symbols can be rotated --- .../components/tube/AbstractTubeSymbol.java | 65 +++++++++++++++++- .../diylc/components/tube/DiodeSymbol.java | 27 ++------ .../diylc/components/tube/PentodeSymbol.java | 25 ++----- .../diylc/components/tube/TriodeSymbol.java | 26 ++----- diylc/diylc-swing/library/main.jar | Bin 341868 -> 342386 bytes diylc/diylc-swing/update.xml | 4 ++ 6 files changed, 79 insertions(+), 68 deletions(-) diff --git a/diylc/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java b/diylc/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java index f307414b..1c5cceb5 100644 --- a/diylc/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java @@ -3,13 +3,16 @@ package org.diylc.components.tube; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; +import java.awt.Rectangle; import java.awt.Shape; +import java.awt.geom.AffineTransform; import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.Display; import org.diylc.common.HorizontalAlignment; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; +import org.diylc.common.Orientation; import org.diylc.common.VerticalAlignment; import org.diylc.components.AbstractComponent; import org.diylc.core.ComponentState; @@ -34,6 +37,8 @@ public abstract class AbstractTubeSymbol extends AbstractComponent { protected Display display = Display.NAME; transient protected Shape[] body; protected boolean showHeaters; + protected Orientation orientation = Orientation.DEFAULT; + protected Point[] controlPoints; @Override public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, @@ -82,7 +87,9 @@ public abstract class AbstractTubeSymbol extends AbstractComponent { : LABEL_COLOR; } g2d.setColor(finalLabelColor); - Point p = getTextLocation(); + + Rectangle rect = body[2] != null ? body[2].getBounds() : body[1].getBounds(); + String label = ""; label = display == Display.VALUE ? getValue() : getName(); if (display == Display.NONE) { @@ -91,7 +98,24 @@ public abstract class AbstractTubeSymbol extends AbstractComponent { if (display == Display.BOTH) { label = getName() + " " + (getValue() == null ? "" : getValue().toString()); } - drawCenteredText(g2d, label, p.x, p.y, HorizontalAlignment.LEFT, VerticalAlignment.TOP); + drawCenteredText(g2d, label, rect.x + rect.width, rect.y + rect.height, HorizontalAlignment.RIGHT, VerticalAlignment.BOTTOM); + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public void setControlPoint(Point point, int index) { + controlPoints[index].setLocation(point); + + refreshDrawing(); } @EditableProperty @@ -130,8 +154,41 @@ public abstract class AbstractTubeSymbol extends AbstractComponent { public void setShowHeaters(boolean showHeaters) { this.showHeaters = showHeaters; - // Invalidate body + + refreshDrawing(); + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + + refreshDrawing(); + } + + protected void refreshDrawing() { + updateControlPoints(); + // make sure we have a new drawing body = null; + getBody(); + + if (this.orientation == Orientation.DEFAULT) + return; + + Point first = this.controlPoints[0]; + double angle = Double.parseDouble(this.orientation.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]); + } + } } /** @@ -142,4 +199,6 @@ public abstract class AbstractTubeSymbol extends AbstractComponent { protected abstract Shape[] getBody(); protected abstract Point getTextLocation(); + + protected abstract void updateControlPoints(); } diff --git a/diylc/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java b/diylc/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java index a7c9eb09..c032e31c 100644 --- a/diylc/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java @@ -21,14 +21,13 @@ import org.diylc.core.annotations.KeywordPolicy; public class DiodeSymbol extends AbstractTubeSymbol { private static final long serialVersionUID = 1L; - - protected Point[] controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), - new Point(0, 0)}; - + protected boolean directlyHeated = false; public DiodeSymbol() { super(); + this.controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), + new Point(0, 0)}; updateControlPoints(); } @@ -111,15 +110,6 @@ public class DiodeSymbol extends AbstractTubeSymbol { } @Override - public Point getControlPoint(int index) { - return controlPoints[index]; - } - - @Override - public int getControlPointCount() { - return controlPoints.length; - } - protected void updateControlPoints() { int pinSpacing = (int) PIN_SPACING.convertToPixels(); // Update control points. @@ -139,13 +129,6 @@ public class DiodeSymbol extends AbstractTubeSymbol { controlPoints[4].y = y + pinSpacing * 3; } - @Override - public void setControlPoint(Point point, int index) { - controlPoints[index].setLocation(point); - // Invalidate body - body = null; - } - @Override public VisibilityPolicy getControlPointVisibilityPolicy(int index) { if (directlyHeated) { @@ -181,8 +164,8 @@ public class DiodeSymbol extends AbstractTubeSymbol { public void setDirectlyHeated(boolean directlyHeated) { this.directlyHeated = directlyHeated; - // Invalidate body - body = null; + + refreshDrawing(); } public class HeaterValidator implements IPropertyValidator { diff --git a/diylc/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java b/diylc/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java index aabcc6c9..d0406862 100644 --- a/diylc/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java @@ -21,13 +21,12 @@ public class PentodeSymbol extends AbstractTubeSymbol { private static final long serialVersionUID = 1L; - protected Point[] controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), - new Point(0, 0), new Point(0, 0), new Point(0, 0)}; - protected boolean exposeSuppressorGrid = true; public PentodeSymbol() { super(); + this.controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), + new Point(0, 0), new Point(0, 0), new Point(0, 0)}; updateControlPoints(); } @@ -156,16 +155,6 @@ public class PentodeSymbol extends AbstractTubeSymbol { g2d.drawLine(width / 8, height * 5 / 8, width * 7 / 8, height * 5 / 8); } - @Override - public Point getControlPoint(int index) { - return controlPoints[index]; - } - - @Override - public int getControlPointCount() { - return controlPoints.length; - } - protected void updateControlPoints() { int pinSpacing = (int) PIN_SPACING.convertToPixels(); // Update control points. @@ -191,13 +180,6 @@ public class PentodeSymbol extends AbstractTubeSymbol { controlPoints[6].y = y + pinSpacing * 2; } - @Override - public void setControlPoint(Point point, int index) { - controlPoints[index].setLocation(point); - // Invalidate body - body = null; - } - @Override public VisibilityPolicy getControlPointVisibilityPolicy(int index) { if (showHeaters) { @@ -230,6 +212,7 @@ public class PentodeSymbol extends AbstractTubeSymbol { public void setExposeSuppressorGrid(boolean exposeSuppressorGrid) { this.exposeSuppressorGrid = exposeSuppressorGrid; - this.body = null; + + refreshDrawing(); } } diff --git a/diylc/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java b/diylc/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java index 0cf04cfc..811d10c0 100644 --- a/diylc/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java @@ -21,13 +21,12 @@ public class TriodeSymbol extends AbstractTubeSymbol { private static final long serialVersionUID = 1L; - protected Point[] controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), - new Point(0, 0)}; - protected boolean directlyHeated = false; public TriodeSymbol() { super(); + this.controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), + new Point(0, 0)}; updateControlPoints(); } @@ -127,16 +126,6 @@ public class TriodeSymbol extends AbstractTubeSymbol { g2d.drawLine(width / 8, height / 2, width * 7 / 8, height / 2); } - @Override - public Point getControlPoint(int index) { - return controlPoints[index]; - } - - @Override - public int getControlPointCount() { - return controlPoints.length; - } - protected void updateControlPoints() { int pinSpacing = (int) PIN_SPACING.convertToPixels(); // Update control points. @@ -156,13 +145,6 @@ public class TriodeSymbol extends AbstractTubeSymbol { controlPoints[4].y = y + pinSpacing * 3; } - @Override - public void setControlPoint(Point point, int index) { - controlPoints[index].setLocation(point); - // Invalidate body - body = null; - } - @Override public VisibilityPolicy getControlPointVisibilityPolicy(int index) { if (directlyHeated) { @@ -198,7 +180,7 @@ public class TriodeSymbol extends AbstractTubeSymbol { public void setDirectlyHeated(boolean directlyHeated) { this.directlyHeated = directlyHeated; - // Invalidate body - body = null; + + refreshDrawing(); } } diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index f176d0d2fa4b66a69cd767d8d39a617d7e672515..6c9b615428ddfe25978847c86261f85c62ba76c7 100644 GIT binary patch delta 15043 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 delta 14556 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 Battery schematic symbol added + + NEW_FEATURE + Tube symbols can be rotated + IMPROVEMENT Added percent text box next to the slider for editors like Alpha or Scale