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 extends IDIYComponent>>) 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.