diff --git a/diylc/diylc-core/src/main/resources/update.xml b/diylc/diylc-core/src/main/resources/update.xml index 6944f89c4..c0a68ab70 100644 --- a/diylc/diylc-core/src/main/resources/update.xml +++ b/diylc/diylc-core/src/main/resources/update.xml @@ -633,6 +633,14 @@ NEW_FEATURE Added 'Value Notation' to the Config menu to show resistance, capacitance, inductance and voltage values in RKM notation, e.g. 4K7, 0R22, 2n2, 4u7 or 6V3, instead of decimal; values can be typed in either notation, and typing the unit together with the value, e.g. 4K7 or 2.2nF, sets the unit at the same time + + NEW_FEATURE + Resistors, capacitors, diodes, ICs, transistors, switches, jacks, tube sockets and other PCB parts have a new 'Board Side' property to place them on the bottom of the board; bottom parts are drawn faded on the canvas and solid in the board's Underside Display, and Gerber export puts their silkscreen on the bottom layer with the text mirrored + + + NEW_FEATURE + Components can be selected, dragged and stretched by clicking them in a board's Underside Display, not only in the main view + BUG_FIX Rotated labels in pasted components and building blocks were drawn in the wrong place and at the wrong angle while following the mouse, until the components were placed diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/MiniRelay.java b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/MiniRelay.java index c76ddae0b..2b2ff46e1 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/MiniRelay.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/MiniRelay.java @@ -36,8 +36,10 @@ import org.diylc.common.Display; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; import org.diylc.common.Orientation; +import org.diylc.common.PCBLayer; import org.diylc.components.AbstractLabeledComponent; import org.diylc.core.ComponentState; +import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; @@ -58,7 +60,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Mini Relay", author = "Branislav Stojkovic", category = "Electro-Mechanical", instanceNamePrefix = "RY", description = "Miniature PCB mount relay, like Omron G5V-1/G5V-2 or Fujitsu FTR-B3", zOrder = IDIYComponent.COMPONENT, enableCache = true) -public class MiniRelay extends AbstractLabeledComponent implements IGerberComponentSimple { +public class MiniRelay extends AbstractLabeledComponent implements IGerberComponentSimple, IBoardSideComponent { private static final long serialVersionUID = 1L; @@ -97,6 +99,7 @@ public class MiniRelay extends AbstractLabeledComponent implements IGerb private RelayType type = RelayType.DPDT; private RelaySize size = RelaySize.Miniature; private Voltage voltage = new Voltage(12d, VoltageUnit.V); + private PCBLayer boardSide; transient private Area[] body; public MiniRelay() { @@ -471,6 +474,16 @@ public class MiniRelay extends AbstractLabeledComponent implements IGerb return new Rectangle2D.Double(minX - margin, minY - margin, maxX - minX + 2 * margin, maxY - minY + 2 * margin); } + @EditableProperty(name = "Board Side") + @Override + public PCBLayer getBoardSide() { + return boardSide == null ? PCBLayer._2 : boardSide; + } + + public void setBoardSide(PCBLayer boardSide) { + this.boardSide = boardSide; + } + public static enum RelayType { SPDT, DPDT; } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/PlasticDCJack.java b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/PlasticDCJack.java index 73d62303d..843a14165 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/PlasticDCJack.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/PlasticDCJack.java @@ -36,9 +36,11 @@ import org.diylc.awt.StringUtils; import org.diylc.common.HorizontalAlignment; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; +import org.diylc.common.PCBLayer; import org.diylc.common.VerticalAlignment; import org.diylc.components.AbstractMultiPartComponent; import org.diylc.core.ComponentState; +import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; @@ -56,7 +58,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Plastic DC Jack", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Panel mount plastic DC jack", zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J", autoEdit = false, enableCache = true) -public class PlasticDCJack extends AbstractMultiPartComponent implements IGerberComponentSimple { +public class PlasticDCJack extends AbstractMultiPartComponent implements IGerberComponentSimple, IBoardSideComponent { private static final long serialVersionUID = 1L; @@ -71,6 +73,7 @@ public class PlasticDCJack extends AbstractMultiPartComponent implements private Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0), new Point2D.Double(0, 0), new Point2D.Double(0, 0)}; private String value = ""; private DCPolarity polarity = DCPolarity.CENTER_NEGATIVE; + private PCBLayer boardSide; transient private Area[] body; public PlasticDCJack() { @@ -294,4 +297,14 @@ public class PlasticDCJack extends AbstractMultiPartComponent implements public Integer getFontSizeOverride() { return super.getFontSizeOverride(); } + + @EditableProperty(name = "Board Side") + @Override + public PCBLayer getBoardSide() { + return boardSide == null ? PCBLayer._2 : boardSide; + } + + public void setBoardSide(PCBLayer boardSide) { + this.boardSide = boardSide; + } } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySelectorSwitch.java b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySelectorSwitch.java index 978b30f0d..3c54e7d98 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySelectorSwitch.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySelectorSwitch.java @@ -36,11 +36,13 @@ import org.diylc.common.HorizontalAlignment; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; import org.diylc.common.Orientation; +import org.diylc.common.PCBLayer; import org.diylc.common.VerticalAlignment; import org.diylc.components.AbstractMultiPartComponent; import org.diylc.components.transform.PotentiometerTransformer; import org.diylc.core.ComponentState; import org.diylc.core.CreationMethod; +import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; @@ -61,7 +63,7 @@ import org.diylc.utils.Constants; description = "Single pole rotary switch, typically used for impedance selector", zOrder = IDIYComponent.COMPONENT, transformer = PotentiometerTransformer.class, enableCache = true) -public class RotarySelectorSwitch extends AbstractMultiPartComponent implements IGerberComponentSimple { +public class RotarySelectorSwitch extends AbstractMultiPartComponent implements IGerberComponentSimple, IBoardSideComponent { private static final long serialVersionUID = 1L; @@ -83,6 +85,7 @@ public class RotarySelectorSwitch extends AbstractMultiPartComponent imp private boolean showLabels = true; private RotaryPositionCount positionCount = RotaryPositionCount.THREE; private SwitchTiming timing; + private PCBLayer boardSide; public RotarySelectorSwitch() { super(); @@ -370,6 +373,16 @@ public class RotarySelectorSwitch extends AbstractMultiPartComponent imp return false; } + @EditableProperty(name = "Board Side") + @Override + public PCBLayer getBoardSide() { + return boardSide == null ? PCBLayer._2 : boardSide; + } + + public void setBoardSide(PCBLayer boardSide) { + this.boardSide = boardSide; + } + public static enum RotaryPositionCount { TWO(2), THREE(3), FOUR(4); diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySwitchOpen.java b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySwitchOpen.java index a2f2719bd..c85d22188 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySwitchOpen.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/RotarySwitchOpen.java @@ -42,12 +42,14 @@ import org.diylc.awt.TwoCircleTangent; import org.diylc.common.HorizontalAlignment; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; +import org.diylc.common.PCBLayer; import org.diylc.common.VerticalAlignment; import org.diylc.components.AbstractAngledComponent; import org.diylc.components.guitar.RotarySwitchOpenPositionPropertyValueSource; import org.diylc.components.transform.AngledComponentTransformer; import org.diylc.core.Angle; import org.diylc.core.ComponentState; +import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.ISwitch; @@ -71,7 +73,7 @@ import org.diylc.utils.SwitchUtils; zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, enableCache = true, transformer = AngledComponentTransformer.class) public class RotarySwitchOpen extends AbstractAngledComponent - implements ISwitch, IGerberComponentSimple { + implements ISwitch, IGerberComponentSimple, IBoardSideComponent { private static final int ANGLE_OFFSET = -15; private static final int INNER_COMMON_ANGLE_OFFSET = -90; @@ -106,6 +108,7 @@ public class RotarySwitchOpen extends AbstractAngledComponent implements ISwitch, IGerberComponentSimple { +public class RotarySwitchSealed extends AbstractAngledComponent implements ISwitch, IGerberComponentSimple, IBoardSideComponent { private static final int OUTER_ANGLE_OFFSET = 15; private static final int INNER_ANGLE_OFFSET = 30; @@ -88,6 +90,7 @@ public class RotarySwitchSealed extends AbstractAngledComponent implements ISwitch, IGerberComponentSimple { +public class SlideSwitch extends AbstractTransparentComponent implements ISwitch, IGerberComponentSimple, IBoardSideComponent { private static final long serialVersionUID = 1L; @@ -95,6 +96,7 @@ public class SlideSwitch extends AbstractTransparentComponent i private Integer selectedPosition; private Boolean showMarkers; + private PCBLayer boardSide; public SlideSwitch() { super(); @@ -535,4 +537,14 @@ public class SlideSwitch extends AbstractTransparentComponent i return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); } + + @EditableProperty(name = "Board Side") + @Override + public PCBLayer getBoardSide() { + return boardSide == null ? PCBLayer._2 : boardSide; + } + + public void setBoardSide(PCBLayer boardSide) { + this.boardSide = boardSide; + } } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/TactileMicroSwitch.java b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/TactileMicroSwitch.java index f7eb8d1db..0304d1c71 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/TactileMicroSwitch.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/electromechanical/TactileMicroSwitch.java @@ -34,6 +34,7 @@ import org.diylc.common.Display; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; import org.diylc.common.Orientation; +import org.diylc.common.PCBLayer; import org.diylc.components.AbstractLabeledComponent; import org.diylc.components.guitar.LeverSwitchPositionPropertyValueSource; import org.diylc.core.*; @@ -51,7 +52,7 @@ import org.diylc.utils.Constants; description = "4-pin tactile momentary switch", zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, enableCache = true) public class TactileMicroSwitch extends AbstractLabeledComponent implements IGerberComponentSimple, - ISwitch { + ISwitch, IBoardSideComponent { private static final long serialVersionUID = 1L; @@ -79,6 +80,7 @@ public class TactileMicroSwitch extends AbstractLabeledComponent impleme private Size rowSpacing; private PinPairingMode pinPairingMode; private int selectedPosition; + private PCBLayer boardSide; public TactileMicroSwitch() { super(); @@ -518,6 +520,16 @@ public class TactileMicroSwitch extends AbstractLabeledComponent impleme this.selectedPosition = selectedPosition; } + @EditableProperty(name = "Board Side") + @Override + public PCBLayer getBoardSide() { + return boardSide == null ? PCBLayer._2 : boardSide; + } + + public void setBoardSide(PCBLayer boardSide) { + this.boardSide = boardSide; + } + public enum PinPairingMode { Opposite, Diagonal, Adjacent; } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/passive/AudioTransformer.java b/diylc/diylc-library/src/main/java/org/diylc/components/passive/AudioTransformer.java index 5b97c16b1..6907b4d43 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/passive/AudioTransformer.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/passive/AudioTransformer.java @@ -40,9 +40,11 @@ import org.diylc.common.HorizontalAlignment; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; import org.diylc.common.Orientation; +import org.diylc.common.PCBLayer; import org.diylc.common.VerticalAlignment; import org.diylc.components.AbstractMultiPartComponent; import org.diylc.core.ComponentState; +import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; @@ -62,7 +64,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Mini Signal Transformer", author = "Branislav Stojkovic", category = "Passive", instanceNamePrefix = "TR", description = "Miniature PCB-mount signal transformer with EI core", zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE) -public class AudioTransformer extends AbstractMultiPartComponent implements IGerberComponentSimple { +public class AudioTransformer extends AbstractMultiPartComponent implements IGerberComponentSimple, IBoardSideComponent { private static final long serialVersionUID = 1L; @@ -91,6 +93,7 @@ public class AudioTransformer extends AbstractMultiPartComponent impleme private Color labelColor = LABEL_COLOR; private boolean primaryCT = true; private boolean secondaryCT = true; + private PCBLayer boardSide; transient private Area[] body; @@ -525,4 +528,14 @@ public class AudioTransformer extends AbstractMultiPartComponent impleme public boolean canPointMoveFreely(int pointIndex) { return false; } + + @EditableProperty(name = "Board Side") + @Override + public PCBLayer getBoardSide() { + return boardSide == null ? PCBLayer._2 : boardSide; + } + + public void setBoardSide(PCBLayer boardSide) { + this.boardSide = boardSide; + } } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/passive/MultiSectionCapacitor.java b/diylc/diylc-library/src/main/java/org/diylc/components/passive/MultiSectionCapacitor.java index 47fa20dfe..7ee7fa4ef 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/passive/MultiSectionCapacitor.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/passive/MultiSectionCapacitor.java @@ -40,9 +40,11 @@ import org.diylc.common.HorizontalAlignment; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; import org.diylc.common.Orientation; +import org.diylc.common.PCBLayer; import org.diylc.common.VerticalAlignment; import org.diylc.components.AbstractLabeledComponent; import org.diylc.core.ComponentState; +import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; @@ -63,7 +65,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Multi-Section Capacitor", author = "Branislav Stojkovic", category = "Passive", instanceNamePrefix = "C", description = "Multi-section vertically mounted electrolytic capacitor, similar to JJ, CE and others", zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, enableCache = true) -public class MultiSectionCapacitor extends AbstractLabeledComponent implements IGerberComponentSimple { +public class MultiSectionCapacitor extends AbstractLabeledComponent implements IGerberComponentSimple, IBoardSideComponent { private static final long serialVersionUID = 1L; @@ -92,6 +94,7 @@ public class MultiSectionCapacitor extends AbstractLabeledComponent implements ISpiceMapper, IGerberComponentSimple, - IDatasheetSupport { + IDatasheetSupport, IBoardSideComponent { private static final long serialVersionUID = 1L; @@ -59,6 +61,7 @@ public abstract class AbstractTransistorPackage extends AbstractLabeledComponent protected TransistorDisplay display = TransistorDisplay.NAME; protected boolean folded = false; + private PCBLayer boardSide; public AbstractTransistorPackage() { } @@ -328,6 +331,16 @@ public abstract class AbstractTransistorPackage extends AbstractLabeledComponent } } + @EditableProperty(name = "Board Side") + @Override + public PCBLayer getBoardSide() { + return boardSide == null ? PCBLayer._2 : boardSide; + } + + public void setBoardSide(PCBLayer boardSide) { + this.boardSide = boardSide; + } + public enum TransistorDisplay { NAME, VALUE, NONE, BOTH, PINOUT; diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/BridgeRectifier.java b/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/BridgeRectifier.java index 68f19c530..49d590059 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/BridgeRectifier.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/BridgeRectifier.java @@ -39,6 +39,7 @@ import org.diylc.components.AbstractLabeledComponent; import org.diylc.components.RoundedPolygon; import org.diylc.components.AbstractLeadedComponent.LabelOrientation; import org.diylc.core.ComponentState; +import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; @@ -58,7 +59,7 @@ import org.diylc.utils.Constants; category = "Semiconductors", instanceNamePrefix = "BR", description = "Few variations of bridge rectifier chips", zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, enableCache = true) -public class BridgeRectifier extends AbstractLabeledComponent implements IGerberComponentSimple { +public class BridgeRectifier extends AbstractLabeledComponent implements IGerberComponentSimple, IBoardSideComponent { private static final long serialVersionUID = 1L; @@ -108,6 +109,7 @@ public class BridgeRectifier extends AbstractLabeledComponent implements @Deprecated private LabelOrientation labelOriantation; private LabelOrientation labelOrientation = LabelOrientation.Directional; + private PCBLayer boardSide; public BridgeRectifier() { super(); @@ -709,6 +711,16 @@ public class BridgeRectifier extends AbstractLabeledComponent implements bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); } + @EditableProperty(name = "Board Side") + @Override + public PCBLayer getBoardSide() { + return boardSide == null ? PCBLayer._2 : boardSide; + } + + public void setBoardSide(PCBLayer boardSide) { + this.boardSide = boardSide; + } + public static enum RectifierType { MiniDIP1("DFM A", PinShape.Square), MiniDIP2("DFM B", PinShape.Square), MiniRound1( diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/MultiwattIC.java b/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/MultiwattIC.java index 96932cc57..9dd6a8687 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/MultiwattIC.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/MultiwattIC.java @@ -37,6 +37,7 @@ import org.diylc.common.*; import org.diylc.components.AbstractMakerBoard; import org.diylc.components.AbstractTransparentComponent; import org.diylc.core.ComponentState; +import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; import org.diylc.core.IDatasheetSupport; import org.diylc.core.IDrawingObserver; @@ -61,7 +62,7 @@ import org.diylc.utils.Constants; enableCache = true, enableDatasheet = true, datasheetCreationStepCount = 2, datasheetModelColumn = 1) public class MultiwattIC extends AbstractTransparentComponent - implements IGerberComponentSimple, IDatasheetSupport { + implements IGerberComponentSimple, IDatasheetSupport, IBoardSideComponent { private static final long serialVersionUID = 1L; @@ -92,6 +93,7 @@ public class MultiwattIC extends AbstractTransparentComponent private Color tabBorderColor = TAB_BORDER_COLOR; private String pinNames = null; private PinLabels pinLabels = null; + private PCBLayer boardSide; transient private Area[] body; transient private String[] parsedPinNames; @@ -745,6 +747,16 @@ public class MultiwattIC extends AbstractTransparentComponent return new Rectangle2D.Double(minX - margin, minY - margin, maxX - minX + 2 * margin, maxY - minY + 2 * margin); } + @EditableProperty(name = "Board Side") + @Override + public PCBLayer getBoardSide() { + return boardSide == null ? PCBLayer._2 : boardSide; + } + + public void setBoardSide(PCBLayer boardSide) { + this.boardSide = boardSide; + } + public static enum MultiwattType { // Multiwatt-11: 6 pins on left, 5 pins on right (staggered) MULTIWATT_11(11, 6, 5, new Size(1.7d, SizeUnit.mm), "Multiwatt 11"), diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO1.java b/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO1.java index 2a1c40435..d41714dd0 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO1.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO1.java @@ -37,11 +37,9 @@ import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; -import org.diylc.common.PCBLayer; import org.diylc.common.Percentage; import org.diylc.components.transform.TO1Transformer; import org.diylc.core.ComponentState; -import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; @@ -62,7 +60,7 @@ import org.diylc.utils.Constants; zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO1Transformer.class, enableCache = true, enableDatasheet = true, datasheetCreationStepCount = 2, datasheetModelColumn = 1) -public class TransistorTO1 extends AbstractTransistorPackage implements IBoardSideComponent { +public class TransistorTO1 extends AbstractTransistorPackage { private static final long serialVersionUID = 1L; @@ -79,7 +77,6 @@ public class TransistorTO1 extends AbstractTransistorPackage implements IBoardSi private Size pinSpacing = PIN_SPACING; private Boolean flange = true; - private PCBLayer boardSide; public TransistorTO1() { super(); @@ -332,14 +329,4 @@ public class TransistorTO1 extends AbstractTransistorPackage implements IBoardSi protected boolean flipPinoutLabel() { return true; } - - @EditableProperty(name = "Board Side") - @Override - public PCBLayer getBoardSide() { - return boardSide == null ? PCBLayer._2 : boardSide; - } - - public void setBoardSide(PCBLayer boardSide) { - this.boardSide = boardSide; - } } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO220.java b/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO220.java index 10ce5923a..915cd7741 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO220.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO220.java @@ -37,11 +37,9 @@ import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; -import org.diylc.common.PCBLayer; import org.diylc.common.Percentage; import org.diylc.components.transform.TO220Transformer; import org.diylc.core.ComponentState; -import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; @@ -62,7 +60,7 @@ import org.diylc.utils.Constants; zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO220Transformer.class, enableCache = true, enableDatasheet = true, datasheetCreationStepCount = 2, datasheetModelColumn = 1) -public class TransistorTO220 extends AbstractTransistorPackage implements IBoardSideComponent { +public class TransistorTO220 extends AbstractTransistorPackage { private static final long serialVersionUID = 1L; @@ -85,7 +83,6 @@ public class TransistorTO220 extends AbstractTransistorPackage implements IBoard private Color tabColor = TAB_COLOR; private Color tabBorderColor = TAB_BORDER_COLOR; private Size leadLength = LEAD_LENGTH; - private PCBLayer boardSide; public TransistorTO220() { super(); @@ -440,14 +437,4 @@ public class TransistorTO220 extends AbstractTransistorPackage implements IBoard protected boolean flipPinoutLabel() { return true; } - - @EditableProperty(name = "Board Side") - @Override - public PCBLayer getBoardSide() { - return boardSide == null ? PCBLayer._2 : boardSide; - } - - public void setBoardSide(PCBLayer boardSide) { - this.boardSide = boardSide; - } } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO92.java b/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO92.java index ffc60831f..759ef6fa0 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO92.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/semiconductors/TransistorTO92.java @@ -36,11 +36,9 @@ import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; -import org.diylc.common.PCBLayer; import org.diylc.common.Percentage; import org.diylc.components.transform.TO92Transformer; import org.diylc.core.ComponentState; -import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; @@ -62,7 +60,7 @@ import org.diylc.utils.Constants; zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO92Transformer.class, enableCache = true, enableDatasheet = true, datasheetCreationStepCount = 2, datasheetModelColumn = 1) -public class TransistorTO92 extends AbstractTransistorPackage implements IBoardSideComponent { +public class TransistorTO92 extends AbstractTransistorPackage { private static final long serialVersionUID = 1L; @@ -74,7 +72,6 @@ public class TransistorTO92 extends AbstractTransistorPackage implements IBoardS public static Size BODY_DIAMETER = new Size(0.2d, SizeUnit.in); private Size pinSpacing = PIN_SPACING; - private PCBLayer boardSide; public TransistorTO92() { super(); @@ -288,14 +285,4 @@ public class TransistorTO92 extends AbstractTransistorPackage implements IBoardS g2d.fillOval(width / 2 - pinSize / 2, (height / 4) * (i + 1), pinSize, pinSize); } } - - @EditableProperty(name = "Board Side") - @Override - public PCBLayer getBoardSide() { - return boardSide == null ? PCBLayer._2 : boardSide; - } - - public void setBoardSide(PCBLayer boardSide) { - this.boardSide = boardSide; - } } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/tube/TubeSocket.java b/diylc/diylc-library/src/main/java/org/diylc/components/tube/TubeSocket.java index 781fb390d..db715f196 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/tube/TubeSocket.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/tube/TubeSocket.java @@ -38,12 +38,14 @@ import org.diylc.awt.StringUtils; import org.diylc.common.HorizontalAlignment; import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; +import org.diylc.common.PCBLayer; import org.diylc.common.VerticalAlignment; import org.diylc.components.AbstractAngledComponent; import org.diylc.components.AbstractMakerBoard; import org.diylc.components.semiconductors.PinLabels; import org.diylc.components.transform.AngledComponentTransformer; import org.diylc.core.ComponentState; +import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDatasheetSupport; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; @@ -68,7 +70,7 @@ import org.diylc.utils.Constants; transformer = AngledComponentTransformer.class, enableDatasheet = true, datasheetCreationStepCount = 2, datasheetModelColumn = 1) public class TubeSocket extends AbstractAngledComponent - implements IGerberComponentSimple, IDatasheetSupport { + implements IGerberComponentSimple, IDatasheetSupport, IBoardSideComponent { 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); @@ -109,6 +111,7 @@ public class TubeSocket extends AbstractAngledComponent private PinLabels pinLabels = null; private Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0)}; + private PCBLayer boardSide; public TubeSocket() { super(); @@ -484,6 +487,16 @@ public class TubeSocket extends AbstractAngledComponent return new Rectangle2D.Double(rect.getX() - margin, rect.getY() - margin, rect.getWidth() + 2 * margin, rect.getHeight() + 2 * margin); } + @EditableProperty(name = "Board Side") + @Override + public PCBLayer getBoardSide() { + return boardSide == null ? PCBLayer._2 : boardSide; + } + + public void setBoardSide(PCBLayer boardSide) { + this.boardSide = boardSide; + } + public static enum Base { B9A("Noval B9A"), OCTAL("Octal"), B7G("Small-button B7G"), B12C("Duodecar B12C"), UX4("UX4"); diff --git a/diylc/diylc-library/src/test/java/org/diylc/components/BoardSideComponentsTest.java b/diylc/diylc-library/src/test/java/org/diylc/components/BoardSideComponentsTest.java index d82fc6e5f..dfde8231e 100644 --- a/diylc/diylc-library/src/test/java/org/diylc/components/BoardSideComponentsTest.java +++ b/diylc/diylc-library/src/test/java/org/diylc/components/BoardSideComponentsTest.java @@ -28,11 +28,12 @@ import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; -import org.diylc.common.ComponentType; import org.diylc.common.PCBLayer; +import org.diylc.components.misc.Label; import org.diylc.core.IBoardSideComponent; import org.diylc.core.IDIYComponent; -import org.diylc.presenter.ComponentProcessor; +import org.diylc.core.gerber.GerberLayer; +import org.diylc.core.gerber.IGerberComponentSimple; import org.diylc.utils.ReflectionUtils; import org.junit.Test; @@ -55,14 +56,20 @@ public class BoardSideComponentsTest { } } - // a part moved to the bottom is seen mirrored from the top, so it must be possible to mirror it + // a part that writes its silkscreen to the top layer can sit on either side; Label is text rather + // than a mounted part, and PCBText has a layer of its own @Test - public void testBoardSideComponentsCanBeMirrored() throws Exception { - for (IDIYComponent component : createBoardSideComponents()) { - @SuppressWarnings("unchecked") - ComponentType type = ComponentProcessor.getInstance().extractComponentTypeFrom( - (Class>) component.getClass()); - assertTrue(component.getClass().getName(), type.getTransformer().canMirror(component)); + public void testEveryTopSilkscreenPartHasABoardSide() throws Exception { + for (Class type : ReflectionUtils.getIndexedClasses(IDIYComponent.class)) { + if (Modifier.isAbstract(type.getModifiers()) + || !IGerberComponentSimple.class.isAssignableFrom(type) || type == Label.class) { + continue; + } + IGerberComponentSimple component = + (IGerberComponentSimple) type.getDeclaredConstructor().newInstance(); + if (component.getGerberLayer() == GerberLayer.SilkscreenTop) { + assertTrue(type.getName(), component instanceof IBoardSideComponent); + } } } diff --git a/diylc/docs/plans/bottom-side-components.md b/diylc/docs/plans/bottom-side-components.md index 0c042eaf5..2403ef913 100644 --- a/diylc/docs/plans/bottom-side-components.md +++ b/diylc/docs/plans/bottom-side-components.md @@ -3,7 +3,7 @@ Let a component be mounted on the bottom of a PCB, so that its silkscreen goes to the bottom Gerber layers and the canvas shows it as a part on the far side of the board. -Status: 32 parts have a Board Side property, and Gerber export sends a bottom-side part's +Status: 45 parts have a Board Side property, and Gerber export sends a bottom-side part's silkscreen to the bottom layer with its text mirrored. Parts can be selected, dragged and stretched through the Underside Display mirror. The canvas draws a bottom-side part faded in the main view and solid in the mirror. The next steps below remain. @@ -61,26 +61,23 @@ solid in the mirror. The next steps below remain. ### diylc-library -- **Done.** Every part that uses the `SilkscreenTop` default and whose transformer can mirror it - implements `IBoardSideComponent`: a nullable `PCBLayer boardSide` field and a getter/setter pair - with `@EditableProperty(name = "Board Side")` on the getter, which returns `_2` (Top) when the - field is `null`. The key is in every language file. +- **Done.** Every part that uses the `SilkscreenTop` default implements `IBoardSideComponent`: a + nullable `PCBLayer boardSide` field and a getter/setter pair with + `@EditableProperty(name = "Board Side")` on the getter, which returns `_2` (Top) when the field + is `null`. The key is in every language file. 45 parts have it. - On a shared base, covering every subclass: `AbstractFilmCapacitor`, `AbstractPotentiometer`, - `AbstractRadialComponent`, `PassiveSMDComponent`. + `AbstractRadialComponent`, `AbstractTransistorPackage`, `PassiveSMDComponent`. - On the class itself: `Resistor`, `HeatSinkResistor`, `AxialElectrolyticCapacitor`, - `CrystalOscillator`, `ToroidalInductor`, `DiodePlastic`, `DiodeGlass`, `DIL_IC`, `SIL_IC`, - `TransistorTO1`, `TransistorTO92`, `TransistorTO220`, `CliffJack1_4`, `CliffJack1_8`, - `ClosedJack1_4`, `MiniToggleSwitch`, `PCBTerminalBlock`. The transistors are not done on - `AbstractTransistorPackage` because `TransistorTO126` cannot be mirrored, and a property on the - base cannot be hidden from one subclass. - - Left out because they cannot be mirrored: `TubeSocket`, `RotarySwitchOpen`, - `RotarySwitchSealed`, `RotarySelectorSwitch`, `SlideSwitch`, `PlasticDCJack`, - `TactileMicroSwitch`, `MiniRelay`, `AudioTransformer`, `MultiSectionCapacitor`, `MultiwattIC`, - `BridgeRectifier`, `TransistorTO126`. Making one of them mirrorable is what it takes to give it - a side. - - `Label` is left out too: it is text, not a mounted part, and `PCBText` already has a layer. - - `BoardSideComponentsTest` checks that every such part starts on Top, takes Bottom, and can be - mirrored. + `CrystalOscillator`, `ToroidalInductor`, `AudioTransformer`, `MultiSectionCapacitor`, + `DiodePlastic`, `DiodeGlass`, `BridgeRectifier`, `DIL_IC`, `SIL_IC`, `MultiwattIC`, + `TubeSocket`, `CliffJack1_4`, `CliffJack1_8`, `ClosedJack1_4`, `PlasticDCJack`, + `MiniToggleSwitch`, `SlideSwitch`, `TactileMicroSwitch`, `RotarySwitchOpen`, + `RotarySwitchSealed`, `RotarySelectorSwitch`, `MiniRelay`, `PCBTerminalBlock`. + - Whether a part can be mirrored does not matter: the app never mirrors it for the user. + - `Label` is left out: it is text, not a mounted part, and `PCBText` already has a layer. + - `BoardSideComponentsTest` checks that every such part starts on Top and takes Bottom, and + that every part writing `SilkscreenTop` has a side, so a new part cannot be left out by + accident. - `CopperTrace`, `CurvedTrace`, `GroundFill`, `SolderPad`, `PCBText` and `DrillHole` do **not** implement it. Their `PCBLayer` already says where they are.