Review fixes: a drag in the Underside Display picks the part a click would, the part being placed there is drawn like the parts already there, a bottom Dot no longer adds an empty silkscreen page; one helper decides a part's board side and copper layers share an interface

This commit is contained in:
Bane Stojkovic
2026-11-11 17:32:46 +01:00
parent 5ef6952ef4
commit 13b31e6dd5
43 changed files with 345 additions and 170 deletions
@@ -36,6 +36,7 @@ import org.diylc.core.IConnective;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IDrawingObserver;
import org.diylc.core.ILayeredComponent;
import org.diylc.core.IPCBLayerComponent;
import org.diylc.core.Project;
import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.AiNote.Scope;
@@ -58,7 +59,8 @@ import org.diylc.core.measures.SizeUnit;
description = "Straight copper trace", zOrder = IDIYComponent.TRACE, bomPolicy = BomPolicy.NEVER_SHOW,
keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "PCB",
transformer = SimpleComponentTransformer.class)
public class CopperTrace extends AbstractLeadedComponent<Void> implements IConnective, ILayeredComponent, IGerberComponentSimple {
public class CopperTrace extends AbstractLeadedComponent<Void>
implements IConnective, ILayeredComponent, IGerberComponentSimple, IPCBLayerComponent {
private static final long serialVersionUID = 1L;
@@ -116,6 +118,7 @@ public class CopperTrace extends AbstractLeadedComponent<Void> implements IConne
}
@EditableProperty
@Override
public PCBLayer getLayer() {
if (layer == null) {
layer = PCBLayer._1;
@@ -123,6 +126,7 @@ public class CopperTrace extends AbstractLeadedComponent<Void> implements IConne
return layer;
}
@Override
public void setLayer(PCBLayer layer) {
this.layer = layer;
}
@@ -38,6 +38,7 @@ import org.diylc.core.IConnective;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IDrawingObserver;
import org.diylc.core.ILayeredComponent;
import org.diylc.core.IPCBLayerComponent;
import org.diylc.core.annotations.AiNote.Scope;
import org.diylc.core.annotations.AiNote;
import org.diylc.core.annotations.BomPolicy;
@@ -58,7 +59,8 @@ import org.diylc.core.measures.SizeUnit;
zOrder = IDIYComponent.TRACE, bomPolicy = BomPolicy.NEVER_SHOW,
keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "PCB", transformer = SimpleComponentTransformer.class,
enableCache = true, creationMethod = CreationMethod.POINT_BY_POINT)
public class CurvedTrace extends AbstractCurvedComponent<Void> implements IConnective, ILayeredComponent, IGerberComponentSimple {
public class CurvedTrace extends AbstractCurvedComponent<Void>
implements IConnective, ILayeredComponent, IGerberComponentSimple, IPCBLayerComponent {
private static final long serialVersionUID = 1L;
@@ -104,6 +106,7 @@ public class CurvedTrace extends AbstractCurvedComponent<Void> implements IConne
}
@EditableProperty
@Override
public PCBLayer getLayer() {
if (layer == null) {
layer = PCBLayer._1;
@@ -111,6 +114,7 @@ public class CurvedTrace extends AbstractCurvedComponent<Void> implements IConne
return layer;
}
@Override
public void setLayer(PCBLayer layer) {
this.layer = layer;
}
@@ -38,6 +38,7 @@ import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IDrawingObserver;
import org.diylc.core.ILayeredComponent;
import org.diylc.core.IPCBLayerComponent;
import org.diylc.core.Project;
import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.BomPolicy;
@@ -53,7 +54,7 @@ import org.diylc.core.measures.SizeUnit;
instanceNamePrefix = "GF", description = "Polygonal ground fill area", zOrder = IDIYComponent.TRACE,
bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class)
public class GroundFill extends AbstractTransparentComponent<Void>
implements ILayeredComponent, IGerberComponentSimple {
implements ILayeredComponent, IGerberComponentSimple, IPCBLayerComponent {
private static final long serialVersionUID = 1L;
@@ -152,6 +153,7 @@ public class GroundFill extends AbstractTransparentComponent<Void>
}
@EditableProperty
@Override
public PCBLayer getLayer() {
if (layer == null) {
layer = PCBLayer._1;
@@ -159,6 +161,7 @@ public class GroundFill extends AbstractTransparentComponent<Void>
return layer;
}
@Override
public void setLayer(PCBLayer layer) {
this.layer = layer;
}
@@ -54,7 +54,8 @@ 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, IBoardSideComponent {
public class PCBTerminalBlock extends AbstractTransparentComponent<PCBTerminalBlockCount>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -35,6 +35,7 @@ import org.diylc.core.IConnective;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IDrawingObserver;
import org.diylc.core.ILayeredComponent;
import org.diylc.core.IPCBLayerComponent;
import org.diylc.core.Project;
import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.AiNote.Scope;
@@ -60,7 +61,7 @@ import org.diylc.utils.Constants;
keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "PCB",
transformer = SimpleComponentTransformer.class, enableCache = true)
public class SolderPad extends AbstractTransparentComponent<Void>
implements IConnective, ILayeredComponent, IGerberComponentCustom {
implements IConnective, ILayeredComponent, IGerberComponentCustom, IPCBLayerComponent {
private static final long serialVersionUID = 1L;
@@ -190,6 +191,7 @@ public class SolderPad extends AbstractTransparentComponent<Void>
}
@EditableProperty
@Override
public PCBLayer getLayer() {
if (layer == null) {
layer = PCBLayer._1;
@@ -197,6 +199,7 @@ public class SolderPad extends AbstractTransparentComponent<Void>
return layer;
}
@Override
public void setLayer(PCBLayer layer) {
this.layer = layer;
}
@@ -64,7 +64,8 @@ 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, IBoardSideComponent {
public class CliffJack1_4 extends AbstractMultiPartComponent<JackType>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -58,7 +58,8 @@ 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, IBoardSideComponent {
public class CliffJack1_8 extends AbstractMultiPartComponent<JackType>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -64,7 +64,8 @@ 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, IBoardSideComponent {
public class ClosedJack1_4 extends AbstractMultiPartComponent<JackType>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -60,7 +60,8 @@ 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<String> implements IGerberComponentSimple, IBoardSideComponent {
public class MiniRelay extends AbstractLabeledComponent<String>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -63,7 +63,8 @@ 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, IBoardSideComponent {
public class MiniToggleSwitch extends AbstractTransparentComponent<ToggleSwitchType>
implements ISwitch, ILayeredComponent, IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -58,7 +58,8 @@ 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<String> implements IGerberComponentSimple, IBoardSideComponent {
public class PlasticDCJack extends AbstractMultiPartComponent<String>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -63,7 +63,8 @@ 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<String> implements IGerberComponentSimple, IBoardSideComponent {
public class RotarySelectorSwitch extends AbstractMultiPartComponent<String>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -62,7 +62,8 @@ import org.diylc.utils.Constants;
instanceNamePrefix = "SW", description = "Sealed plastic rotary switch in several different switching configurations",
zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, enableCache = true,
transformer = AngledComponentTransformer.class)
public class RotarySwitchSealed extends AbstractAngledComponent<RotarySwitchSealedType> implements ISwitch, IGerberComponentSimple, IBoardSideComponent {
public class RotarySwitchSealed extends AbstractAngledComponent<RotarySwitchSealedType>
implements ISwitch, IGerberComponentSimple, IBoardSideComponent {
private static final int OUTER_ANGLE_OFFSET = 15;
private static final int INNER_ANGLE_OFFSET = 30;
@@ -62,7 +62,8 @@ import org.diylc.utils.SwitchUtils;
author = "Branislav Stojkovic", description = "Panel mounted slide switch",
zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "SW",
enableCache = true, transformer = MiniToggleSwitchTransformer.class)
public class SlideSwitch extends AbstractTransparentComponent<SlideSwitchType> implements ISwitch, IGerberComponentSimple, IBoardSideComponent {
public class SlideSwitch extends AbstractTransparentComponent<SlideSwitchType>
implements ISwitch, IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -41,6 +41,7 @@ import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IDrawingObserver;
import org.diylc.core.ILayeredComponent;
import org.diylc.core.IPCBLayerComponent;
import org.diylc.core.Project;
import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.BomPolicy;
@@ -53,7 +54,8 @@ import org.diylc.core.gerber.IGerberDrawingObserver;
@ComponentDescriptor(name = "PCB Text", author = "Branislav Stojkovic", category = "Misc",
description = "Mirrored text for PCB artwork", instanceNamePrefix = "L", zOrder = IDIYComponent.TRACE,
flexibleZOrder = false, bomPolicy = BomPolicy.NEVER_SHOW, transformer = TextTransformer.class)
public class PCBText extends AbstractComponent<Void> implements ILayeredComponent, IGerberComponentCustom {
public class PCBText extends AbstractComponent<Void>
implements ILayeredComponent, IGerberComponentCustom, IPCBLayerComponent {
public static String DEFAULT_TEXT = "Double click to edit text";
@@ -324,6 +326,7 @@ public class PCBText extends AbstractComponent<Void> implements ILayeredComponen
}
@EditableProperty
@Override
public PCBLayer getLayer() {
if (layer == null) {
layer = PCBLayer._1;
@@ -331,6 +334,7 @@ public class PCBText extends AbstractComponent<Void> implements ILayeredComponen
return layer;
}
@Override
public void setLayer(PCBLayer layer) {
this.layer = layer;
}
@@ -36,7 +36,8 @@ 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, IBoardSideComponent {
public abstract class AbstractFilmCapacitor extends AbstractLeadedComponent<Capacitance>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -33,7 +33,8 @@ 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, IBoardSideComponent {
public abstract class AbstractPotentiometer extends AbstractLabeledComponent<Resistance>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -41,7 +41,8 @@ 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, IBoardSideComponent {
public abstract class AbstractRadialComponent<T> extends AbstractLeadedComponent<T>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -64,7 +64,8 @@ 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<String> implements IGerberComponentSimple, IBoardSideComponent {
public class AudioTransformer extends AbstractMultiPartComponent<String>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -55,7 +55,8 @@ 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, IBoardSideComponent {
public class AxialElectrolyticCapacitor extends AbstractLeadedComponent<Capacitance>
implements IDatasheetSupport, IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -45,7 +45,8 @@ 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, IBoardSideComponent {
public class CrystalOscillator extends AbstractLeadedComponent<Frequency>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -65,7 +65,8 @@ 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<Capacitance[]> implements IGerberComponentSimple, IBoardSideComponent {
public class MultiSectionCapacitor extends AbstractLabeledComponent<Capacitance[]>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -47,7 +47,8 @@ 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, IBoardSideComponent {
public class ToroidalInductor extends AbstractLeadedComponent<Inductance>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -59,7 +59,8 @@ 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<String> implements IGerberComponentSimple, IBoardSideComponent {
public class BridgeRectifier extends AbstractLabeledComponent<String>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;
@@ -51,7 +51,8 @@ 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, IBoardSideComponent {
public abstract class PassiveSMDComponent<T> extends AbstractLabeledComponent<T>
implements IGerberComponentSimple, IBoardSideComponent {
private static final long serialVersionUID = 1L;