Resistors, capacitors, diodes, ICs, transistors and other PCB parts can be placed on the bottom of the board with the new 'Board Side' property; Gerber export puts their silkscreen on the bottom layer with the text mirrored

This commit is contained in:
Bane Stojkovic
2026-11-11 15:15:19 +01:00
parent 16f54fa479
commit df873df04a
36 changed files with 498 additions and 54 deletions
@@ -32,10 +32,12 @@ import org.diylc.appframework.miscutils.ConfigurationManager;
import org.diylc.common.IPlugInPort;
import org.diylc.common.ObjectCache;
import org.diylc.common.Orientation;
import org.diylc.common.PCBLayer;
import org.diylc.components.AbstractTransparentComponent;
import org.diylc.components.connectivity.PCBTerminalBlock.PCBTerminalBlockCount;
import org.diylc.components.transform.PCBTerminalBlockTransformer;
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;
@@ -52,7 +54,7 @@ import org.diylc.utils.Constants;
author = "Branislav Stojkovic", description = "Horizontal PCB terminal block with configurable pitch",
zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "TB",
enableCache = true, transformer = PCBTerminalBlockTransformer.class)
public class PCBTerminalBlock extends AbstractTransparentComponent<PCBTerminalBlockCount> implements IGerberComponentSimple {
public class PCBTerminalBlock extends AbstractTransparentComponent<PCBTerminalBlockCount> implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -72,6 +74,7 @@ public class PCBTerminalBlock extends AbstractTransparentComponent<PCBTerminalBl
private Size width = new Size(0.3d, SizeUnit.in);
private ScrewPosition screwPosition = ScrewPosition.Offset;
private String nodeNames = "";
private PCBLayer boardSide;
public PCBTerminalBlock() {
super();
@@ -370,6 +373,16 @@ public class PCBTerminalBlock extends AbstractTransparentComponent<PCBTerminalBl
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;
}
static enum PCBTerminalBlockCount {
_2("Two"), _3("Three"), _4("Four"), _5("Five"), _6("Six"), _7("Seven"), _8("Eight"), _9(
"Nine"), _10("Ten");
@@ -40,10 +40,12 @@ 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.CliffJackTransformer;
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;
description = "Cliff-style closed panel mount 1/4\" phono jack",
zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J", transformer = CliffJackTransformer.class,
enableCache = true)
public class CliffJack1_4 extends AbstractMultiPartComponent<JackType> implements IGerberComponentSimple {
public class CliffJack1_4 extends AbstractMultiPartComponent<JackType> implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -84,6 +86,7 @@ public class CliffJack1_4 extends AbstractMultiPartComponent<JackType> implement
@SuppressWarnings("unused")
@Deprecated
private transient String value = "";
private PCBLayer boardSide;
public CliffJack1_4() {
super();
@@ -373,4 +376,14 @@ public class CliffJack1_4 extends AbstractMultiPartComponent<JackType> implement
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;
}
}
@@ -36,10 +36,12 @@ 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.CliffJackTransformer;
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;
author = "Branislav Stojkovic", description = "Cliff-style closed 1/8\" phono jack",
zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J",
transformer = CliffJackTransformer.class, enableCache = true)
public class CliffJack1_8 extends AbstractMultiPartComponent<JackType> implements IGerberComponentSimple {
public class CliffJack1_8 extends AbstractMultiPartComponent<JackType> implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -80,6 +82,7 @@ public class CliffJack1_8 extends AbstractMultiPartComponent<JackType> implement
private Orientation orientation = Orientation.DEFAULT;
transient private Shape[] body;
private boolean nut = false;
private PCBLayer boardSide;
public CliffJack1_8() {
super();
@@ -394,4 +397,14 @@ public class CliffJack1_8 extends AbstractMultiPartComponent<JackType> implement
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;
}
}
@@ -41,10 +41,12 @@ 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.ClosedJackTransformer;
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 = "Closed 1/4\" Jack", category = "Electro-Mechanical", author = "Branislav Stojkovic",
description = "Enclosed panel mount 1/4\" phono jack", zOrder = IDIYComponent.COMPONENT,
instanceNamePrefix = "J", transformer = ClosedJackTransformer.class, enableCache = true)
public class ClosedJack1_4 extends AbstractMultiPartComponent<JackType> implements IGerberComponentSimple {
public class ClosedJack1_4 extends AbstractMultiPartComponent<JackType> implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -86,6 +88,7 @@ public class ClosedJack1_4 extends AbstractMultiPartComponent<JackType> implemen
@SuppressWarnings("unused")
@Deprecated
private transient String value = "";
private PCBLayer boardSide;
public ClosedJack1_4() {
super();
@@ -380,4 +383,14 @@ public class ClosedJack1_4 extends AbstractMultiPartComponent<JackType> implemen
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;
}
}
@@ -40,6 +40,7 @@ import org.diylc.components.AbstractTransparentComponent;
import org.diylc.components.guitar.ToggleSwitchPositionPropertyValueSource;
import org.diylc.components.transform.MiniToggleSwitchTransformer;
import org.diylc.core.ComponentState;
import org.diylc.core.IBoardSideComponent;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IDrawingObserver;
import org.diylc.core.ILayeredComponent;
@@ -62,7 +63,7 @@ import org.diylc.utils.SwitchUtils;
@ComponentDescriptor(name = "Mini Toggle Switch", category = "Electro-Mechanical", author = "Branislav Stojkovic",
description = "Panel mounted mini toggle switch", zOrder = IDIYComponent.COMPONENT,
instanceNamePrefix = "SW", enableCache = true, transformer = MiniToggleSwitchTransformer.class)
public class MiniToggleSwitch extends AbstractTransparentComponent<ToggleSwitchType> implements ISwitch, ILayeredComponent, IGerberComponentSimple {
public class MiniToggleSwitch extends AbstractTransparentComponent<ToggleSwitchType> implements ISwitch, ILayeredComponent, IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -96,6 +97,7 @@ public class MiniToggleSwitch extends AbstractTransparentComponent<ToggleSwitchT
@Deprecated
protected String name;
private PCBLayer boardSide;
public MiniToggleSwitch() {
super();
@@ -636,4 +638,14 @@ public class MiniToggleSwitch extends AbstractTransparentComponent<ToggleSwitchT
public int getLayerId() {
return hashCode();
}
@EditableProperty(name = "Board Side")
@Override
public PCBLayer getBoardSide() {
return boardSide == null ? PCBLayer._2 : boardSide;
}
public void setBoardSide(PCBLayer boardSide) {
this.boardSide = boardSide;
}
}
@@ -24,7 +24,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.components.AbstractLeadedComponent;
import org.diylc.core.IBoardSideComponent;
import org.diylc.core.Theme;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.PositiveMeasureValidator;
@@ -34,7 +36,7 @@ import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
import org.diylc.utils.Constants;
public abstract class AbstractFilmCapacitor extends AbstractLeadedComponent<Capacitance> implements IGerberComponentSimple {
public abstract class AbstractFilmCapacitor extends AbstractLeadedComponent<Capacitance> implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -49,6 +51,7 @@ public abstract class AbstractFilmCapacitor extends AbstractLeadedComponent<Capa
protected Boolean showOuterFoil = false;
protected Color outerFoilColor = OUTER_FOIL_COLOR;
protected String type;
private PCBLayer boardSide;
@EditableProperty(validatorClass = PositiveMeasureValidator.class)
public Capacitance getValue() {
@@ -145,4 +148,14 @@ public abstract class AbstractFilmCapacitor extends AbstractLeadedComponent<Capa
public void setOuterFoilColor(Color outerFoilColor) {
this.outerFoilColor = outerFoilColor;
}
@EditableProperty(name = "Board Side")
@Override
public PCBLayer getBoardSide() {
return boardSide == null ? PCBLayer._2 : boardSide;
}
public void setBoardSide(PCBLayer boardSide) {
this.boardSide = boardSide;
}
}
@@ -24,14 +24,16 @@ package org.diylc.components.passive;
import java.awt.geom.Point2D;
import org.diylc.common.Orientation;
import org.diylc.common.PCBLayer;
import org.diylc.components.AbstractLabeledComponent;
import org.diylc.core.IBoardSideComponent;
import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.PositiveMeasureValidator;
import org.diylc.core.gerber.IGerberComponentSimple;
import org.diylc.core.measures.Resistance;
public abstract class AbstractPotentiometer extends AbstractLabeledComponent<Resistance> implements IGerberComponentSimple {
public abstract class AbstractPotentiometer extends AbstractLabeledComponent<Resistance> implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -40,6 +42,7 @@ public abstract class AbstractPotentiometer extends AbstractLabeledComponent<Res
protected Resistance resistance = null;
protected Orientation orientation = Orientation.DEFAULT;
protected Taper taper = Taper.LIN;
private PCBLayer boardSide;
@Override
public int getControlPointCount() {
@@ -110,4 +113,14 @@ public abstract class AbstractPotentiometer extends AbstractLabeledComponent<Res
return null;
}
@EditableProperty(name = "Board Side")
@Override
public PCBLayer getBoardSide() {
return boardSide == null ? PCBLayer._2 : boardSide;
}
public void setBoardSide(PCBLayer boardSide) {
this.boardSide = boardSide;
}
}
@@ -23,7 +23,9 @@ package org.diylc.components.passive;
import java.awt.Rectangle;
import org.diylc.common.PCBLayer;
import org.diylc.components.AbstractLeadedComponent;
import org.diylc.core.IBoardSideComponent;
import org.diylc.core.annotations.AiNote;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.gerber.IGerberComponentSimple;
@@ -39,7 +41,7 @@ import org.diylc.core.measures.SizeUnit;
* @param <T>
*/
@AiNote("The two control points are the holes; the body's own leads are 'Lead Spacing' apart and centred between them, with lead wire drawn out to each hole. Place the points exactly 'Lead Spacing' apart for straight leads")
public abstract class AbstractRadialComponent<T> extends AbstractLeadedComponent<T> implements IGerberComponentSimple {
public abstract class AbstractRadialComponent<T> extends AbstractLeadedComponent<T> implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -48,6 +50,7 @@ public abstract class AbstractRadialComponent<T> extends AbstractLeadedComponent
protected Size pinSpacing = PIN_SPACING;
protected String type;
private PCBLayer boardSide;
@Override
protected int calculatePinSpacing(Rectangle shapeRect) {
@@ -74,4 +77,14 @@ public abstract class AbstractRadialComponent<T> extends AbstractLeadedComponent
public void setType(String type) {
this.type = type;
}
@EditableProperty(name = "Board Side")
@Override
public PCBLayer getBoardSide() {
return boardSide == null ? PCBLayer._2 : boardSide;
}
public void setBoardSide(PCBLayer boardSide) {
this.boardSide = boardSide;
}
}
@@ -29,10 +29,12 @@ import org.diylc.appframework.miscutils.ConfigurationManager;
import org.diylc.common.IPlugInPort;
import org.diylc.common.ObjectCache;
import org.diylc.common.PCBLayer;
import org.diylc.components.AbstractLeadedComponent;
import org.diylc.components.passive.CapacitorDatasheetService.CapacitorDatasheet;
import org.diylc.components.transform.SimpleComponentTransformer;
import org.diylc.core.CreationMethod;
import org.diylc.core.IBoardSideComponent;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IDatasheetSupport;
import org.diylc.core.Theme;
@@ -53,7 +55,7 @@ import org.diylc.utils.Constants;
description = "Axial electrolytic capacitor, similar to Sprague Atom, F&T, etc",
zOrder = IDIYComponent.COMPONENT, transformer = SimpleComponentTransformer.class,
enableCache = true, enableDatasheet = true, datasheetCreationStepCount = 3)
public class AxialElectrolyticCapacitor extends AbstractLeadedComponent<Capacitance> implements IDatasheetSupport, IGerberComponentSimple {
public class AxialElectrolyticCapacitor extends AbstractLeadedComponent<Capacitance> implements IDatasheetSupport, IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -73,6 +75,7 @@ public class AxialElectrolyticCapacitor extends AbstractLeadedComponent<Capacita
private Color tickColor = TICK_COLOR;
private boolean polarized = true;
private String type;
private PCBLayer boardSide;
public AxialElectrolyticCapacitor() {
super();
@@ -296,4 +299,14 @@ public class AxialElectrolyticCapacitor extends AbstractLeadedComponent<Capacita
return new Color((int) r, (int) g, (int) b, (int) a);
}
@EditableProperty(name = "Board Side")
@Override
public PCBLayer getBoardSide() {
return boardSide == null ? PCBLayer._2 : boardSide;
}
public void setBoardSide(PCBLayer boardSide) {
this.boardSide = boardSide;
}
}
@@ -28,9 +28,11 @@ import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import org.diylc.common.ObjectCache;
import org.diylc.common.PCBLayer;
import org.diylc.components.AbstractLeadedComponent;
import org.diylc.components.transform.SimpleComponentTransformer;
import org.diylc.core.CreationMethod;
import org.diylc.core.IBoardSideComponent;
import org.diylc.core.IDIYComponent;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.EditableProperty;
@@ -43,7 +45,7 @@ import org.diylc.core.measures.SizeUnit;
creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "X",
description = "Radial crystal oscillator", zOrder = IDIYComponent.COMPONENT,
transformer = SimpleComponentTransformer.class)
public class CrystalOscillator extends AbstractLeadedComponent<Frequency> implements IGerberComponentSimple {
public class CrystalOscillator extends AbstractLeadedComponent<Frequency> implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -59,6 +61,7 @@ public class CrystalOscillator extends AbstractLeadedComponent<Frequency> implem
private Size pinSpacing = PIN_SPACING;
private Frequency value;
private PCBLayer boardSide;
public CrystalOscillator() {
super();
@@ -133,4 +136,14 @@ public class CrystalOscillator extends AbstractLeadedComponent<Frequency> implem
protected Size getDefaultWidth() {
return DEFAULT_WIDTH;
}
@EditableProperty(name = "Board Side")
@Override
public PCBLayer getBoardSide() {
return boardSide == null ? PCBLayer._2 : boardSide;
}
public void setBoardSide(PCBLayer boardSide) {
this.boardSide = boardSide;
}
}
@@ -36,9 +36,11 @@ import java.awt.geom.Rectangle2D;
import org.diylc.appframework.miscutils.ConfigurationManager;
import org.diylc.common.IPlugInPort;
import org.diylc.common.ObjectCache;
import org.diylc.common.PCBLayer;
import org.diylc.components.AbstractLeadedComponent;
import org.diylc.components.transform.SimpleComponentTransformer;
import org.diylc.core.CreationMethod;
import org.diylc.core.IBoardSideComponent;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IDatasheetSupport;
import org.diylc.core.annotations.AiNote;
@@ -63,7 +65,7 @@ import org.diylc.utils.Constants;
zOrder = IDIYComponent.COMPONENT, transformer = SimpleComponentTransformer.class, enableCache = true,
enableDatasheet = true, datasheetCreationStepCount = 2, datasheetModelColumn = 1)
public class HeatSinkResistor extends AbstractLeadedComponent<Resistance>
implements IGerberComponentSimple, IDatasheetSupport {
implements IGerberComponentSimple, IDatasheetSupport, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -101,6 +103,7 @@ public class HeatSinkResistor extends AbstractLeadedComponent<Resistance>
* Top/bottom lip thickness; main body height = A − 2 × lip = D (HS25: A=28, D=14 → lip 7 mm each).
*/
private Size lipSize = DEFAULT_LIP_SIZE;
private PCBLayer boardSide;
public HeatSinkResistor() {
super();
@@ -544,6 +547,16 @@ public class HeatSinkResistor extends AbstractLeadedComponent<Resistance>
g2d.draw(a);
}
@EditableProperty(name = "Board Side")
@Override
public PCBLayer getBoardSide() {
return boardSide == null ? PCBLayer._2 : boardSide;
}
public void setBoardSide(PCBLayer boardSide) {
this.boardSide = boardSide;
}
public enum MountingHoleCount {
TWO_DIAGONAL("2 diagonal"),
FOUR("4 holes"),
@@ -32,10 +32,12 @@ import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import org.diylc.common.ObjectCache;
import org.diylc.common.PCBLayer;
import org.diylc.common.ResistorColorCode;
import org.diylc.components.AbstractLeadedComponent;
import org.diylc.components.transform.SimpleComponentTransformer;
import org.diylc.core.CreationMethod;
import org.diylc.core.IBoardSideComponent;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IDatasheetSupport;
import org.diylc.core.annotations.AiNote;
@@ -55,7 +57,7 @@ import org.diylc.core.measures.SizeUnit;
zOrder = IDIYComponent.COMPONENT, transformer = SimpleComponentTransformer.class, enableCache = true,
enableDatasheet = true, datasheetCreationStepCount = 2)
public class Resistor extends AbstractLeadedComponent<Resistance>
implements IGerberComponentSimple, IDatasheetSupport {
implements IGerberComponentSimple, IDatasheetSupport, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -72,6 +74,7 @@ public class Resistor extends AbstractLeadedComponent<Resistance>
private org.diylc.core.measures.Power powerNew = null;
private ResistorColorCode colorCode = ResistorColorCode._5_BAND;
private ResistorShape shape = ResistorShape.Standard;
private PCBLayer boardSide;
public Resistor() {
super();
@@ -263,6 +266,16 @@ public class Resistor extends AbstractLeadedComponent<Resistance>
return super.getFlipStanding();
}
@EditableProperty(name = "Board Side")
@Override
public PCBLayer getBoardSide() {
return boardSide == null ? PCBLayer._2 : boardSide;
}
public void setBoardSide(PCBLayer boardSide) {
this.boardSide = boardSide;
}
public enum ResistorShape {
Tubular, Tubular_Beveled, Standard;
@@ -28,9 +28,11 @@ import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import org.diylc.common.ObjectCache;
import org.diylc.common.PCBLayer;
import org.diylc.components.AbstractLeadedComponent;
import org.diylc.components.transform.SimpleComponentTransformer;
import org.diylc.core.CreationMethod;
import org.diylc.core.IBoardSideComponent;
import org.diylc.core.IDIYComponent;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.EditableProperty;
@@ -45,7 +47,7 @@ import org.diylc.core.measures.SizeUnit;
creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "L",
description = "Ferrite core toroidal inductor mounted vertically", zOrder = IDIYComponent.COMPONENT,
transformer = SimpleComponentTransformer.class)
public class ToroidalInductor extends AbstractLeadedComponent<Inductance> implements IGerberComponentSimple {
public class ToroidalInductor extends AbstractLeadedComponent<Inductance> implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -59,6 +61,7 @@ public class ToroidalInductor extends AbstractLeadedComponent<Inductance> implem
private Inductance value = null;
private Resistance resistance = null;
private PCBLayer boardSide;
public ToroidalInductor() {
super();
@@ -165,4 +168,14 @@ public class ToroidalInductor extends AbstractLeadedComponent<Inductance> implem
public void setResistance(Resistance resistance) {
this.resistance = resistance;
}
@EditableProperty(name = "Board Side")
@Override
public PCBLayer getBoardSide() {
return boardSide == null ? PCBLayer._2 : boardSide;
}
public void setBoardSide(PCBLayer boardSide) {
this.boardSide = boardSide;
}
}
@@ -39,11 +39,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.AbstractLabeledComponent;
import org.diylc.components.AbstractMakerBoard;
import org.diylc.components.transform.DIL_ICTransformer;
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;
@@ -69,7 +71,7 @@ import org.diylc.utils.Constants;
transformer = DIL_ICTransformer.class, enableCache = true, enableDatasheet = true,
datasheetCreationStepCount = 2, datasheetModelColumn = 1)
public class DIL_IC extends AbstractLabeledComponent<String>
implements IGerberComponentSimple, IDatasheetSupport {
implements IGerberComponentSimple, IDatasheetSupport, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -97,6 +99,7 @@ public class DIL_IC extends AbstractLabeledComponent<String>
private Color indentColor = INDENT_COLOR;
private DisplayNumbers displayNumbers = DISPLAY_NUMBERS;
private String pinNames = null;
private PCBLayer boardSide;
// new Point(0, pinSpacing.convertToPixels()),
// new Point(0, 2 * pinSpacing.convertToPixels()),
// new Point(0, 3 * pinSpacing.convertToPixels()),
@@ -695,6 +698,16 @@ public class DIL_IC extends AbstractLabeledComponent<String>
return name == null ? Integer.toString(pinNumber) : name;
}
@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 PinCount {
_4, _6, _8, _10, _12, _14, _16, _18, _20, _22, _24, _26, _28, _30, _32, _34, _36, _38, _40, _42, _44, _46, _48, _50;
@@ -28,9 +28,11 @@ import java.awt.geom.Rectangle2D;
import org.diylc.appframework.miscutils.ConfigurationManager;
import org.diylc.common.IPlugInPort;
import org.diylc.common.PCBLayer;
import org.diylc.components.AbstractLeadedComponent;
import org.diylc.components.transform.SimpleComponentTransformer;
import org.diylc.core.CreationMethod;
import org.diylc.core.IBoardSideComponent;
import org.diylc.core.IDatasheetSupport;
import org.diylc.core.IDIYComponent;
import org.diylc.core.Theme;
@@ -51,7 +53,7 @@ import org.diylc.utils.Constants;
transformer = SimpleComponentTransformer.class, enableCache = true, enableDatasheet = true,
datasheetCreationStepCount = 2, datasheetModelColumn = 1)
public class DiodeGlass extends AbstractLeadedComponent<String>
implements IGerberComponentSimple, IDatasheetSupport {
implements IGerberComponentSimple, IDatasheetSupport, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -67,6 +69,7 @@ public class DiodeGlass extends AbstractLeadedComponent<String>
private String value = "";
private Color markerColor = MARKER_COLOR;
private Color insideColor = INSIDE_COLOR;
private PCBLayer boardSide;
public DiodeGlass() {
super();
@@ -204,4 +207,14 @@ public class DiodeGlass extends AbstractLeadedComponent<String>
public void setInsideColor(Color insideColor) {
this.insideColor = insideColor;
}
@EditableProperty(name = "Board Side")
@Override
public PCBLayer getBoardSide() {
return boardSide == null ? PCBLayer._2 : boardSide;
}
public void setBoardSide(PCBLayer boardSide) {
this.boardSide = boardSide;
}
}
@@ -28,9 +28,11 @@ import java.awt.geom.Rectangle2D;
import org.diylc.appframework.miscutils.ConfigurationManager;
import org.diylc.common.IPlugInPort;
import org.diylc.common.PCBLayer;
import org.diylc.components.AbstractLeadedComponent;
import org.diylc.components.transform.SimpleComponentTransformer;
import org.diylc.core.CreationMethod;
import org.diylc.core.IBoardSideComponent;
import org.diylc.core.IDatasheetSupport;
import org.diylc.core.IDIYComponent;
import org.diylc.core.Theme;
@@ -51,7 +53,7 @@ import org.diylc.utils.Constants;
transformer = SimpleComponentTransformer.class, enableCache = true, enableDatasheet = true,
datasheetCreationStepCount = 2, datasheetModelColumn = 1)
public class DiodePlastic extends AbstractLeadedComponent<String>
implements IGerberComponentSimple, IDatasheetSupport {
implements IGerberComponentSimple, IDatasheetSupport, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -65,6 +67,7 @@ public class DiodePlastic extends AbstractLeadedComponent<String>
private String value = "";
private Color markerColor = MARKER_COLOR;
private PCBLayer boardSide;
public DiodePlastic() {
super();
@@ -178,4 +181,14 @@ public class DiodePlastic extends AbstractLeadedComponent<String>
public void setMarkerColor(Color markerColor) {
this.markerColor = markerColor;
}
@EditableProperty(name = "Board Side")
@Override
public PCBLayer getBoardSide() {
return boardSide == null ? PCBLayer._2 : boardSide;
}
public void setBoardSide(PCBLayer boardSide) {
this.boardSide = boardSide;
}
}
@@ -40,6 +40,7 @@ import org.diylc.components.AbstractMakerBoard;
import org.diylc.components.AbstractTransparentComponent;
import org.diylc.components.transform.SIL_ICTransformer;
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;
@@ -65,7 +66,7 @@ import org.diylc.utils.Constants;
enableCache = true, enableDatasheet = true, datasheetCreationStepCount = 2,
datasheetModelColumn = 1)
public class SIL_IC extends AbstractTransparentComponent<String>
implements IGerberComponentSimple, IDatasheetSupport {
implements IGerberComponentSimple, IDatasheetSupport, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -90,6 +91,7 @@ public class SIL_IC extends AbstractTransparentComponent<String>
private Color indentColor = INDENT_COLOR;
private String pinNames = null;
private PinLabels pinLabels = null;
private PCBLayer boardSide;
// new Point(0, pinSpacing.convertToPixels()),
// new Point(0, 2 * pinSpacing.convertToPixels()),
// new Point(0, 3 * pinSpacing.convertToPixels()),
@@ -553,6 +555,16 @@ public class SIL_IC extends AbstractTransparentComponent<String>
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 PinCount {
_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20;
@@ -37,9 +37,11 @@ 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;
@@ -60,7 +62,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 {
public class TransistorTO1 extends AbstractTransistorPackage implements IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -77,6 +79,7 @@ public class TransistorTO1 extends AbstractTransistorPackage {
private Size pinSpacing = PIN_SPACING;
private Boolean flange = true;
private PCBLayer boardSide;
public TransistorTO1() {
super();
@@ -329,4 +332,14 @@ public class TransistorTO1 extends AbstractTransistorPackage {
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;
}
}
@@ -37,9 +37,11 @@ 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;
@@ -60,7 +62,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 {
public class TransistorTO220 extends AbstractTransistorPackage implements IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -83,6 +85,7 @@ public class TransistorTO220 extends AbstractTransistorPackage {
private Color tabColor = TAB_COLOR;
private Color tabBorderColor = TAB_BORDER_COLOR;
private Size leadLength = LEAD_LENGTH;
private PCBLayer boardSide;
public TransistorTO220() {
super();
@@ -437,4 +440,14 @@ public class TransistorTO220 extends AbstractTransistorPackage {
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;
}
}
@@ -36,9 +36,11 @@ 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;
@@ -60,7 +62,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 {
public class TransistorTO92 extends AbstractTransistorPackage implements IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -72,6 +74,7 @@ public class TransistorTO92 extends AbstractTransistorPackage {
public static Size BODY_DIAMETER = new Size(0.2d, SizeUnit.in);
private Size pinSpacing = PIN_SPACING;
private PCBLayer boardSide;
public TransistorTO92() {
super();
@@ -285,4 +288,14 @@ public class TransistorTO92 extends AbstractTransistorPackage {
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;
}
}
@@ -37,8 +37,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.IDrawingObserver;
import org.diylc.core.Project;
import org.diylc.core.Theme;
@@ -49,7 +51,7 @@ import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
import org.diylc.utils.Constants;
public abstract class PassiveSMDComponent<T> extends AbstractLabeledComponent<T> implements IGerberComponentSimple {
public abstract class PassiveSMDComponent<T> extends AbstractLabeledComponent<T> implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -68,6 +70,7 @@ public abstract class PassiveSMDComponent<T> extends AbstractLabeledComponent<T>
protected Color bodyColor;
protected Color borderColor;
private Color labelColor = LABEL_COLOR;
private PCBLayer boardSide;
transient private Area[] body;
public PassiveSMDComponent() {
@@ -413,6 +416,16 @@ public abstract class PassiveSMDComponent<T> extends AbstractLabeledComponent<T>
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 SMDSize {
_0805(new Size(0.05d, SizeUnit.in), new Size(0.08d, SizeUnit.in)), _1206(new Size(1.6d, SizeUnit.mm), new Size(3.2d,
@@ -0,0 +1,80 @@
/*
DIY Layout Creator (DIYLC).
Copyright (c) 2009-2025 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 <http://www.gnu.org/licenses/>.
*/
package org.diylc.components;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
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.core.IBoardSideComponent;
import org.diylc.core.IDIYComponent;
import org.diylc.presenter.ComponentProcessor;
import org.diylc.utils.ReflectionUtils;
import org.junit.Test;
public class BoardSideComponentsTest {
@Test
public void testBoardSideComponentsStartOnTop() throws Exception {
for (IDIYComponent<?> component : createBoardSideComponents()) {
assertEquals(component.getClass().getName(), PCBLayer._2,
((IBoardSideComponent) component).getBoardSide());
}
}
@Test
public void testBoardSideCanBeChanged() throws Exception {
for (IDIYComponent<?> component : createBoardSideComponents()) {
component.getClass().getMethod("setBoardSide", PCBLayer.class).invoke(component, PCBLayer._1);
assertEquals(component.getClass().getName(), PCBLayer._1,
((IBoardSideComponent) component).getBoardSide());
}
}
// a part moved to the bottom is seen mirrored from the top, so it must be possible to mirror it
@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));
}
}
private static List<IDIYComponent<?>> createBoardSideComponents() throws Exception {
List<IDIYComponent<?>> components = new ArrayList<IDIYComponent<?>>();
for (Class<?> type : ReflectionUtils.getIndexedClasses(IDIYComponent.class)) {
if (IBoardSideComponent.class.isAssignableFrom(type)
&& !Modifier.isAbstract(type.getModifiers())) {
components.add((IDIYComponent<?>) type.getDeclaredConstructor().newInstance());
}
}
assertTrue(components.size() > 0);
return components;
}
}