diff --git a/diylc/diylc-core/src/org/diylc/components/AbstractAngledComponent.java b/diylc/diylc-core/src/org/diylc/components/AbstractAngledComponent.java new file mode 100644 index 00000000..7071dfda --- /dev/null +++ b/diylc/diylc-core/src/org/diylc/components/AbstractAngledComponent.java @@ -0,0 +1,67 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ +package org.diylc.components; + +import java.awt.Shape; +import org.diylc.common.Orientation; +import org.diylc.core.Angle; +import org.diylc.core.annotations.EditableProperty; + +public abstract class AbstractAngledComponent extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + @Deprecated + protected transient Orientation orientation; + protected int angle; + + transient protected Shape[] body; + + protected abstract void updateControlPoints(); + + @EditableProperty + @SuppressWarnings("incomplete-switch") + public Angle getAngle() { + if (orientation != null) { + switch (orientation) { + case _90: + angle = 90; + break; + case _180: + angle = 180; + break; + case _270: + angle = 270; + break; + } + orientation = null; + } + return Angle.of(angle); + } + + public void setAngle(Angle angle) { + this.angle = angle.getValue(); + updateControlPoints(); + // Reset body shape + body = null; + } +} diff --git a/diylc/diylc-core/src/org/diylc/core/Angle.java b/diylc/diylc-core/src/org/diylc/core/Angle.java index daba2c01..7dc49204 100644 --- a/diylc/diylc-core/src/org/diylc/core/Angle.java +++ b/diylc/diylc-core/src/org/diylc/core/Angle.java @@ -46,7 +46,17 @@ public class Angle { private static Map valueCache = new HashMap(); public synchronized static Angle of(int angle) { - valueCache.computeIfAbsent(angle, (value) -> new Angle(value)); - return valueCache.get(angle); + int newValue = angle; + while (newValue < 0) + newValue += 360; + while (newValue >= 360) + newValue -= 360; + valueCache.computeIfAbsent(newValue, (value) -> new Angle(value)); + return valueCache.get(newValue); + } + + public Angle rotate(int direction) { + int newValue = value + direction * 90; + return Angle.of(newValue); } } diff --git a/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java b/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java index bea0874a..3c4c95c9 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java @@ -38,6 +38,7 @@ import org.diylc.common.IPlugInPort; import org.diylc.common.Orientation; import org.diylc.common.OrientationHV; import org.diylc.common.PropertyWrapper; +import org.diylc.core.Angle; import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; import org.diylc.core.Project; @@ -432,12 +433,10 @@ public class InstantiationManager { } else if (value instanceof OrientationHV) { angleProperty.setValue(OrientationHV.values()[(((OrientationHV) value).ordinal() + 1) % OrientationHV.values().length]); - } else if (angleProperty.getName().equalsIgnoreCase("angle")) { - int angle = (Integer) angleProperty.getValue(); - angle += 90; - if (angle >= 360) - angle -= 360; - angleProperty.setValue(angle); + } else if (value instanceof Angle) { + Angle angle = (Angle) angleProperty.getValue(); + Angle newAngle = angle.rotate(1); + angleProperty.setValue(newAngle); } angleProperty.writeTo(component); } diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index 43754600..b3845abd 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -4010,6 +4010,10 @@ NEW_FEATURE Added 'DP4T (6-Position Oak Grigsby)' as a new type of Lever Switch component + + NEW_FEATURE + Ability to rotate 'Lever Switch' and 'Schaller Megaswitch' by any angle + IMPROVEMENT Ability to rotate all guitar/bass pickups through the 'Transform Selection' feature or keyboard shortcut diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index fe3eb830..1a897f95 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-library/src/org/diylc/components/guitar/LeverSwitch.java b/diylc/diylc-library/src/org/diylc/components/guitar/LeverSwitch.java index 059d8f4e..26c3bf34 100644 --- a/diylc/diylc-library/src/org/diylc/components/guitar/LeverSwitch.java +++ b/diylc/diylc-library/src/org/diylc/components/guitar/LeverSwitch.java @@ -37,8 +37,8 @@ import java.util.List; import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; -import org.diylc.common.Orientation; -import org.diylc.components.AbstractTransparentComponent; +import org.diylc.components.AbstractAngledComponent; +import org.diylc.components.transform.AngledComponentTransformer; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; @@ -56,8 +56,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Lever Switch", category = "Guitar", author = "Branislav Stojkovic", description = "Strat-style lever switch", zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "SW", keywordPolicy = KeywordPolicy.SHOW_TAG, - keywordTag = "Guitar Wiring Diagram") -public class LeverSwitch extends AbstractTransparentComponent implements ISwitch { + keywordTag = "Guitar Wiring Diagram", transformer = AngledComponentTransformer.class) +public class LeverSwitch extends AbstractAngledComponent implements ISwitch { private static final long serialVersionUID = 1L; @@ -79,8 +79,6 @@ public class LeverSwitch extends AbstractTransparentComponent implements private String value = ""; private Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0)}; - transient Shape[] body; - private Orientation orientation = Orientation.DEFAULT; private LeverSwitchType type = LeverSwitchType.DP3T; private Boolean highlightCommon; @@ -205,21 +203,7 @@ public class LeverSwitch extends AbstractTransparentComponent implements } body[1] = waferArea; - double theta = 0; - // Rotate if needed - if (orientation != Orientation.DEFAULT) { - switch (orientation) { - case _90: - theta = Math.PI / 2; - break; - case _180: - theta = Math.PI; - break; - case _270: - theta = Math.PI * 3 / 2; - break; - } - } + double theta = Math.toRadians(getAngle().getValue()); Area terminalArea = new Area(); Area commonTerminalArea = new Area(); @@ -264,7 +248,7 @@ public class LeverSwitch extends AbstractTransparentComponent implements } @SuppressWarnings("incomplete-switch") - private void updateControlPoints() { + protected void updateControlPoints() { double x = controlPoints[0].getX(); double y = controlPoints[0].getY(); int waferSpacing = (int) WAFER_SPACING.convertToPixels(); @@ -314,19 +298,8 @@ public class LeverSwitch extends AbstractTransparentComponent implements } // Rotate if needed - if (orientation != Orientation.DEFAULT) { - double theta = 0; - switch (orientation) { - case _90: - theta = Math.PI / 2; - break; - case _180: - theta = Math.PI; - break; - case _270: - theta = Math.PI * 3 / 2; - break; - } + if (getAngle().getValue() != 0) { + double theta = Math.toRadians(getAngle().getValue()); AffineTransform rotation = AffineTransform.getRotateInstance(theta, x, y); for (Point2D point : controlPoints) { rotation.transform(point, point); @@ -403,11 +376,6 @@ public class LeverSwitch extends AbstractTransparentComponent implements this.value = value; } - @EditableProperty - public Orientation getOrientation() { - return orientation; - } - @EditableProperty public LeverSwitchType getType() { return type; @@ -418,13 +386,6 @@ public class LeverSwitch extends AbstractTransparentComponent implements updateControlPoints(); // Invalidate body this.body = null; - } - - public void setOrientation(Orientation orientation) { - this.orientation = orientation; - updateControlPoints(); - // Invalidate the body - body = null; } @EditableProperty(name = "Mark Common Lugs") diff --git a/diylc/diylc-library/src/org/diylc/components/guitar/SchallerMegaSwitch.java b/diylc/diylc-library/src/org/diylc/components/guitar/SchallerMegaSwitch.java index 99c668c2..d60c41d8 100644 --- a/diylc/diylc-library/src/org/diylc/components/guitar/SchallerMegaSwitch.java +++ b/diylc/diylc-library/src/org/diylc/components/guitar/SchallerMegaSwitch.java @@ -37,9 +37,10 @@ import org.diylc.awt.StringUtils; 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.AbstractTransparentComponent; +import org.diylc.components.AbstractAngledComponent; +import org.diylc.components.transform.AngledComponentTransformer; +import org.diylc.core.Angle; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; @@ -58,8 +59,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Schaller Megaswitch", category = "Guitar", author = "Branislav Stojkovic", description = "Several variations of Schaller Megaswitch", zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "SW", - keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "Guitar Wiring Diagram") -public class SchallerMegaSwitch extends AbstractTransparentComponent implements ISwitch { + keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "Guitar Wiring Diagram", transformer = AngledComponentTransformer.class) +public class SchallerMegaSwitch extends AbstractAngledComponent implements ISwitch { private static final long serialVersionUID = 1L; @@ -82,8 +83,6 @@ public class SchallerMegaSwitch extends AbstractTransparentComponent imp private String value = ""; private Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0)}; - transient Shape[] body; - private Orientation orientation = Orientation.DEFAULT; private MegaSwitchType type = MegaSwitchType.E; private Color labelColor = Color.gray; @@ -189,26 +188,21 @@ public class SchallerMegaSwitch extends AbstractTransparentComponent imp double y = (controlPoints[0].getY() + controlPoints[lastPointIdx].getY()) / 2 + getLabelDy() * 2.25; - double theta = 0; - switch (orientation) { - case DEFAULT: - case _180: - theta = -Math.PI / 2; - break; - case _90: - case _270: - theta = 0; - break; + double theta = Math.toRadians(getAngle().getValue()) - Math.PI / 2; + + if ((theta >= Math.PI / 2 && theta <= Math.PI) || (theta < -Math.PI / 2 && theta > -Math.PI)) { + theta += Math.PI; } - g2d.rotate(theta, x, y); + if (theta != 0) { + g2d.rotate(theta, x, y); + } g2d.setFont(project.getFont().deriveFont((float) (project.getFont().getSize2D() * 1.25))); StringUtils.drawCenteredText(g2d, "Schaller Megaswitch® " + type.toString(), x, y, HorizontalAlignment.CENTER, VerticalAlignment.CENTER); } - @SuppressWarnings("incomplete-switch") public Shape[] getBody() { if (body == null) { body = new Shape[4]; @@ -254,21 +248,7 @@ public class SchallerMegaSwitch extends AbstractTransparentComponent imp body[1] = waferArea; - double theta = 0; - // Rotate if needed - if (orientation != Orientation.DEFAULT) { - switch (orientation) { - case _90: - theta = Math.PI / 2; - break; - case _180: - theta = Math.PI; - break; - case _270: - theta = Math.PI * 3 / 2; - break; - } - } + double theta = Math.toRadians(getAngle().getValue()); Area terminalArea = new Area(); for (int i = 0; i < controlPoints.length; i++) { @@ -280,6 +260,12 @@ public class SchallerMegaSwitch extends AbstractTransparentComponent imp point.getY() - terminalSize / 4, terminalSize / 2, terminalSize / 2, terminalSize / 2, terminalSize / 2))); + if (theta != 0) { + // Skip the last two because terminals are already rotated + AffineTransform rotation = AffineTransform.getRotateInstance(theta, point.getX(), point.getY()); + terminal.transform(rotation); + } + terminalArea.add(terminal); } body[2] = terminalArea; @@ -299,7 +285,7 @@ public class SchallerMegaSwitch extends AbstractTransparentComponent imp } @SuppressWarnings("incomplete-switch") - private void updateControlPoints() { + protected void updateControlPoints() { double x = controlPoints[0].getX(); double y = controlPoints[0].getY(); double terminalSpacing = TERMINAL_SPACING.convertToPixels(); @@ -340,46 +326,26 @@ public class SchallerMegaSwitch extends AbstractTransparentComponent imp } // Rotate if needed - if (orientation != Orientation.DEFAULT) { - double theta = 0; - switch (orientation) { - case _90: - theta = Math.PI / 2; - break; - case _180: - theta = Math.PI; - break; - case _270: - theta = Math.PI * 3 / 2; - break; - } + if (getAngle().getValue() != 0) { + double theta = Math.toRadians(getAngle().getValue()); AffineTransform rotation = AffineTransform.getRotateInstance(theta, x, y); for (Point2D point : controlPoints) { rotation.transform(point, point); } } } + + @Override + public void setAngle(Angle angle) { + super.setAngle(angle); + updateLabelPositions(); + } private void updateLabelPositions() { double labelOffset = LABEL_OFFSET.convertToPixels(); - switch (orientation) { - case DEFAULT: - labelDx = -labelOffset; - labelDy = 0d; - break; - case _90: - labelDx = 0d; - labelDy = -labelOffset; - break; - case _180: - labelDx = labelOffset; - labelDy = 0d; - break; - case _270: - labelDx = 0d; - labelDy = labelOffset; - break; - } + double theta = Math.toRadians(getAngle().getValue()) - Math.PI; + labelDx = Math.cos(theta) * labelOffset; + labelDy = Math.sin(theta) * labelOffset; } private double getLabelDx() { @@ -477,11 +443,6 @@ public class SchallerMegaSwitch extends AbstractTransparentComponent imp this.labelColor = labelColor; } - @EditableProperty - public Orientation getOrientation() { - return orientation; - } - @EditableProperty public MegaSwitchType getType() { return type; @@ -494,14 +455,6 @@ public class SchallerMegaSwitch extends AbstractTransparentComponent imp this.body = null; } - public void setOrientation(Orientation orientation) { - this.orientation = orientation; - updateControlPoints(); - updateLabelPositions(); - // Invalidate the body - body = null; - } - public enum MegaSwitchType { E("E"), E_PLUS("E+"), M("M"), P("P"), S("S"), T("T"); diff --git a/diylc/diylc-library/src/org/diylc/components/transform/JumboTubeSocketTransformer.java b/diylc/diylc-library/src/org/diylc/components/transform/AngledComponentTransformer.java similarity index 81% rename from diylc/diylc-library/src/org/diylc/components/transform/JumboTubeSocketTransformer.java rename to diylc/diylc-library/src/org/diylc/components/transform/AngledComponentTransformer.java index 8a2649f9..389e6956 100644 --- a/diylc/diylc-library/src/org/diylc/components/transform/JumboTubeSocketTransformer.java +++ b/diylc/diylc-library/src/org/diylc/components/transform/AngledComponentTransformer.java @@ -24,15 +24,15 @@ package org.diylc.components.transform; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import org.diylc.common.IComponentTransformer; -import org.diylc.components.tube.Jumbo4PinTubeSocket; +import org.diylc.components.AbstractAngledComponent; import org.diylc.core.Angle; import org.diylc.core.IDIYComponent; -public class JumboTubeSocketTransformer implements IComponentTransformer { +public class AngledComponentTransformer implements IComponentTransformer { @Override public boolean canRotate(IDIYComponent component) { - return Jumbo4PinTubeSocket.class.isAssignableFrom(component.getClass()); + return AbstractAngledComponent.class.isAssignableFrom(component.getClass()); } @Override @@ -54,10 +54,10 @@ public class JumboTubeSocketTransformer implements IComponentTransformer { component.setControlPoint(p, index); } - Jumbo4PinTubeSocket tube = (Jumbo4PinTubeSocket) component; - Angle angle = tube.getAngle(); - Angle newAngle = Angle.of(angle.getValue() + direction * 90); - tube.setAngle(newAngle); + AbstractAngledComponent angledComponent = (AbstractAngledComponent) component; + Angle angle = angledComponent.getAngle(); + Angle newAngle = angle.rotate(direction); + angledComponent.setAngle(newAngle); } @Override diff --git a/diylc/diylc-library/src/org/diylc/components/transform/TubeSocketTransformer.java b/diylc/diylc-library/src/org/diylc/components/transform/TubeSocketTransformer.java deleted file mode 100644 index 0fb863f1..00000000 --- a/diylc/diylc-library/src/org/diylc/components/transform/TubeSocketTransformer.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - - DIY Layout Creator (DIYLC). - Copyright (c) 2009-2018 held jointly by the individual authors. - - This file is part of DIYLC. - - DIYLC is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DIYLC is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with DIYLC. If not, see . - -*/ -package org.diylc.components.transform; - -import java.awt.geom.AffineTransform; -import java.awt.geom.Point2D; -import org.diylc.common.IComponentTransformer; -import org.diylc.components.tube.TubeSocket; -import org.diylc.core.Angle; -import org.diylc.core.IDIYComponent; - -public class TubeSocketTransformer implements IComponentTransformer { - - @Override - public boolean canRotate(IDIYComponent component) { - return TubeSocket.class.isAssignableFrom(component.getClass()); - } - - @Override - public boolean canMirror(IDIYComponent component) { - return false; - } - - @Override - public boolean mirroringChangesCircuit() { - return false; - } - - @Override - public void rotate(IDIYComponent component, Point2D center, int direction) { - AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2 * direction, center.getX(), center.getY()); - for (int index = 0; index < component.getControlPointCount(); index++) { - Point2D p = new Point2D.Double(); - rotate.transform(component.getControlPoint(index), p); - component.setControlPoint(p, index); - } - - TubeSocket tube = (TubeSocket) component; - Angle angle = tube.getAngle(); - Angle newAngle = Angle.of(angle.getValue() + direction * 90); - tube.setAngle(newAngle); - } - - @Override - public void mirror(IDIYComponent component, Point2D center, int direction) { - } -} diff --git a/diylc/diylc-library/src/org/diylc/components/tube/Jumbo4PinTubeSocket.java b/diylc/diylc-library/src/org/diylc/components/tube/Jumbo4PinTubeSocket.java index 77ba1956..604112cd 100644 --- a/diylc/diylc-library/src/org/diylc/components/tube/Jumbo4PinTubeSocket.java +++ b/diylc/diylc-library/src/org/diylc/components/tube/Jumbo4PinTubeSocket.java @@ -34,11 +34,9 @@ import org.diylc.awt.StringUtils; 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.AbstractTransparentComponent; -import org.diylc.components.transform.JumboTubeSocketTransformer; -import org.diylc.core.Angle; +import org.diylc.components.AbstractAngledComponent; +import org.diylc.components.transform.AngledComponentTransformer; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; @@ -54,8 +52,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "4-pin Jumbo Tube Socket", category = "Tubes", author = "Branislav Stojkovic", description = "4-pin Jumbo ceramic tube socket for 211, 805 and 845 tubes", zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J", enableCache = true, - transformer = JumboTubeSocketTransformer.class) -public class Jumbo4PinTubeSocket extends AbstractTransparentComponent { + transformer = AngledComponentTransformer.class) +public class Jumbo4PinTubeSocket extends AbstractAngledComponent { private static final Size JUMBO_PIN_SPACING = new Size(98.5d, SizeUnit.mm); @@ -78,10 +76,7 @@ public class Jumbo4PinTubeSocket extends AbstractTransparentComponent { private static String[] electrodeLabels = new String[] {"G", "F", "P", "F"}; private String type = ""; - @Deprecated - private Orientation orientation; - // private Mount mount = Mount.CHASSIS; - private int angle; + private Color color = BODY_COLOR; private Color labelColor = LABEL_COLOR; @@ -89,40 +84,11 @@ public class Jumbo4PinTubeSocket extends AbstractTransparentComponent { private Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0)}; - transient private Shape[] body; - public Jumbo4PinTubeSocket() { super(); updateControlPoints(); } - @EditableProperty - @SuppressWarnings("incomplete-switch") - public Angle getAngle() { - if (orientation != null) { - switch (orientation) { - case _90: - angle = 90; - break; - case _180: - angle = 180; - break; - case _270: - angle = 270; - break; - } - orientation = null; - } - return Angle.of(angle); - } - - public void setAngle(Angle angle) { - this.angle = angle.getValue(); - updateControlPoints(); - // Reset body shape - body = null; - } - @EditableProperty public Color getColor() { if (color == null) { @@ -135,7 +101,7 @@ public class Jumbo4PinTubeSocket extends AbstractTransparentComponent { this.color = color; } - private void updateControlPoints() { + protected void updateControlPoints() { Point2D firstPoint = controlPoints[0]; int pinCount = 4; int pinSpacing = getClosestOdd(JUMBO_PIN_SPACING.convertToPixels()); diff --git a/diylc/diylc-library/src/org/diylc/components/tube/TubeSocket.java b/diylc/diylc-library/src/org/diylc/components/tube/TubeSocket.java index 9a1d8fc6..0a5b9c29 100644 --- a/diylc/diylc-library/src/org/diylc/components/tube/TubeSocket.java +++ b/diylc/diylc-library/src/org/diylc/components/tube/TubeSocket.java @@ -36,11 +36,9 @@ import org.diylc.awt.StringUtils; 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.AbstractTransparentComponent; -import org.diylc.components.transform.TubeSocketTransformer; -import org.diylc.core.Angle; +import org.diylc.components.AbstractAngledComponent; +import org.diylc.components.transform.AngledComponentTransformer; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; @@ -57,8 +55,8 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Tube Socket", author = "Branislav Stojkovic", category = "Tubes", instanceNamePrefix = "V", description = "Various types of tube/valve sockets", zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, enableCache = true, - transformer = TubeSocketTransformer.class) -public class TubeSocket extends AbstractTransparentComponent { + transformer = AngledComponentTransformer.class) +public class TubeSocket extends AbstractAngledComponent { private static final Size B9A_PIN_SPACING_CHASSIS = new Size(12.5d, SizeUnit.mm); private static final Size B9A_PIN_SPACING_PCB = new Size(21d, SizeUnit.mm); @@ -90,10 +88,6 @@ public class TubeSocket extends AbstractTransparentComponent { private Base base = Base.B9A; private String type = ""; - @Deprecated - private Orientation orientation; - // private Mount mount = Mount.CHASSIS; - private int angle; private Color color = BODY_COLOR; private String electrodeLabels = null; private Mount mount = Mount.CHASSIS; @@ -101,8 +95,6 @@ public class TubeSocket extends AbstractTransparentComponent { private Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0)}; - transient private Shape body; - public TubeSocket() { super(); updateControlPoints(); @@ -120,33 +112,6 @@ public class TubeSocket extends AbstractTransparentComponent { body = null; } - @EditableProperty - @SuppressWarnings("incomplete-switch") - public Angle getAngle() { - if (orientation != null) { - switch (orientation) { - case _90: - angle = 90; - break; - case _180: - angle = 180; - break; - case _270: - angle = 270; - break; - } - orientation = null; - } - return Angle.of(angle); - } - - public void setAngle(Angle angle) { - this.angle = angle.getValue(); - updateControlPoints(); - // Reset body shape - body = null; - } - @EditableProperty public Color getColor() { if (color == null) { @@ -168,7 +133,8 @@ public class TubeSocket extends AbstractTransparentComponent { // this.mount = mount; // } - private void updateControlPoints() { + @Override + protected void updateControlPoints() { Point2D firstPoint = controlPoints[0]; int pinCount; int pinSpacing; @@ -211,7 +177,7 @@ public class TubeSocket extends AbstractTransparentComponent { } } - public Shape getBody() { + public Shape[] getBody() { if (body == null) { int bodyDiameter; switch (base) { @@ -231,10 +197,10 @@ public class TubeSocket extends AbstractTransparentComponent { throw new RuntimeException("Unexpected base: " + base); } - body = + Ellipse2D baseShape = new Ellipse2D.Double(controlPoints[0].getX() - bodyDiameter / 2, controlPoints[0].getY() - bodyDiameter / 2, bodyDiameter, bodyDiameter); - Area bodyArea = new Area(body); + Area bodyArea = new Area(baseShape); int holeSize = getClosestOdd(base == Base.B12C ? B12C_HOLE_SIZE.convertToPixels() : HOLE_SIZE.convertToPixels()); bodyArea.subtract(new Area(new Ellipse2D.Double(controlPoints[0].getX() - holeSize / 2, controlPoints[0].getY() - holeSize / 2, holeSize, holeSize))); @@ -260,7 +226,7 @@ public class TubeSocket extends AbstractTransparentComponent { bodyArea.subtract(new Area(new Ellipse2D.Double(controlPoints[0].getX() - cutoutDiameter / 2, controlPoints[0].getY() + bodyDiameter / 2 - cutoutDiameter / 4, cutoutDiameter, cutoutDiameter))); } - body = bodyArea; + body = new Shape[] { bodyArea }; } return body; } @@ -272,14 +238,14 @@ public class TubeSocket extends AbstractTransparentComponent { g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); // Draw body - Shape body = getBody(); + Shape[] body = getBody(); Composite oldComposite = g2d.getComposite(); if (alpha < MAX_ALPHA) { g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); } if (componentState != ComponentState.DRAGGING) { g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : getColor()); - g2d.fill(body); + g2d.fill(body[0]); } g2d.setComposite(oldComposite); Color finalBorderColor; @@ -295,7 +261,7 @@ public class TubeSocket extends AbstractTransparentComponent { : getColor().darker(); } g2d.setColor(finalBorderColor); - g2d.draw(body); + g2d.draw(body[0]); drawingObserver.stopTracking(); @@ -449,7 +415,7 @@ public class TubeSocket extends AbstractTransparentComponent { @Override public Rectangle2D getCachingBounds() { - Rectangle2D rect = getBody().getBounds2D(); + Rectangle2D rect = getBody()[0].getBounds2D(); int margin = 40; // to catch the pins that are outside the body, if needed return new Rectangle2D.Double(rect.getX() - margin, rect.getY() - margin, rect.getWidth() + 2 * margin, rect.getHeight() + 2 * margin); } diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index fe3eb830..1a897f95 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 df4b6104..af7c0439 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ