This commit is contained in:
Bane Stojkovic
2026-11-10 22:50:16 +01:00
parent 9f6124f719
commit f73574641c
35 changed files with 729 additions and 67 deletions
@@ -26,6 +26,7 @@ import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Point2D;
import org.diylc.common.PCBLayer;
import org.diylc.components.transform.AbstractBoardTransformer;
import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
@@ -81,10 +82,12 @@ public class PerfBoard extends AbstractBoard implements ILayeredComponent {
y += spacing;
while (x < finalSecondPoint.getX() - spacing - diameter) {
x += spacing;
drawingObserver.startDrawingSide(PCBLayer._1);
g2d.setColor(padColor);
g2d.fillOval((int)(x - diameter / 2), (int)(y - diameter / 2), diameter, diameter);
g2d.setColor(padColor.darker());
g2d.drawOval((int)(x - diameter / 2), (int)(y - diameter / 2), diameter, diameter);
drawingObserver.stopDrawingSide();
g2d.setColor(Constants.CANVAS_COLOR);
g2d.fillOval((int)(x - holeDiameter / 2), (int)(y - holeDiameter / 2), holeDiameter, holeDiameter);
g2d.setColor(padColor.darker());
@@ -31,6 +31,7 @@ import java.awt.geom.Rectangle2D;
import org.diylc.awt.StringUtils;
import org.diylc.common.HorizontalAlignment;
import org.diylc.common.ObjectCache;
import org.diylc.common.PCBLayer;
import org.diylc.common.VerticalAlignment;
import org.diylc.components.transform.ProtoBoardTransformer;
import org.diylc.core.ComponentState;
@@ -169,6 +170,7 @@ public class ProtoBoard extends AbstractProtoBoard {
(int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2.5) * spacing), (int) (point.getY() + (yOffset + y - 0.25d) * spacing + 1));
}
drawingObserver.startDrawingSide(PCBLayer._1);
g2d.setColor(undersideTraceColor);
// bottom row.
@@ -182,6 +184,7 @@ public class ProtoBoard extends AbstractProtoBoard {
// vertical ground line
g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing), (int) (point.getY() + (yOffset - 1.5) * spacing),
(int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing), (int) (point.getY() + (yOffset + ROW_COUNT + 0.5) * spacing));
drawingObserver.stopDrawingSide();
g2d.setColor(traceColor);
@@ -494,6 +497,7 @@ public class ProtoBoard extends AbstractProtoBoard {
g2d.drawRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing) + 1, (int) (point.getY() + (yOffset + y - 0.5d) * spacing + 2), miniPadSize, miniPadSize);
g2d.drawRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing) + miniPadSize + 3, (int) (point.getY() + (yOffset + y - 0.5d) * spacing + 2), miniPadSize, miniPadSize);
drawingObserver.startDrawingSide(PCBLayer._1);
g2d.setColor(undersidePadColor);
drawingObserver.startTrackingContinuityArea(true);
@@ -507,15 +511,18 @@ public class ProtoBoard extends AbstractProtoBoard {
g2d.fillRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing) + miniPadSize / 2 + 3, (int) (point.getY() + (yOffset + y + 0.5d) * spacing - 1 - miniPadSize), miniPadSize, miniPadSize);
drawingObserver.stopTrackingContinuityArea();
drawingObserver.stopDrawingSide();
g2d.setColor(undersidePadColor.darker());
g2d.drawRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing) + 3, (int) (point.getY() + (yOffset + y - 0.5d) * spacing + 2), miniPadSize, miniPadSize);
g2d.drawRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing) + miniPadSize + 5, (int) (point.getY() + (yOffset + y - 0.5d) * spacing + 2), miniPadSize, miniPadSize);
drawingObserver.startDrawingSide(PCBLayer._1);
g2d.drawRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing) - miniPadSize / 2, (int) (point.getY() + (yOffset + y + 0.5d) * spacing - 1 - miniPadSize), miniPadSize, miniPadSize);
g2d.drawRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing) - miniPadSize * 3 / 2 - 2, (int) (point.getY() + (yOffset + y + 0.5d) * spacing - 1 - miniPadSize), miniPadSize, miniPadSize);
g2d.drawRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing) + miniPadSize / 2 + 3, (int) (point.getY() + (yOffset + y + 0.5d) * spacing - 1 - miniPadSize), miniPadSize, miniPadSize);
drawingObserver.stopDrawingSide();
}
}
@@ -28,6 +28,7 @@ import java.awt.geom.Rectangle2D;
import org.diylc.awt.StringUtils;
import org.diylc.common.HorizontalAlignment;
import org.diylc.common.ObjectCache;
import org.diylc.common.PCBLayer;
import org.diylc.common.VerticalAlignment;
import org.diylc.components.transform.ProtoBoardTransformer;
import org.diylc.core.ComponentState;
@@ -151,14 +152,17 @@ public class ProtoBoard780 extends AbstractProtoBoard {
g2d.setColor(traceColor);
int padX = (int) Math.round(point.getX() + width / 2 - 7 * spacing + i * spacing);
drawingObserver.startDrawingSide(PCBLayer._1);
drawingObserver.startTrackingContinuityArea(true);
g2d.drawLine(padX, (int) Math.round(point.getY() + offsetY), padX,
(int) Math.round(point.getY() + spacing + offsetY));
drawingObserver.stopTrackingContinuityArea();
drawingObserver.stopDrawingSide();
for (int j = 0; j < 2; j++) {
int padY = (int) Math.round(point.getY() + spacing * j + offsetY);
drawingObserver.startDrawingSide(PCBLayer._1);
g2d.setColor(padColor);
drawingObserver.startTrackingContinuityArea(true);
@@ -171,6 +175,7 @@ public class ProtoBoard780 extends AbstractProtoBoard {
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f));
g2d.drawOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize);
drawingObserver.stopDrawingSide();
g2d.setColor(HOLE_COLOR);
g2d.fillOval(padX - holeSize / 2, padY - holeSize / 2, holeSize, holeSize);
@@ -196,6 +201,7 @@ public class ProtoBoard780 extends AbstractProtoBoard {
offsetY = spacing * 5.5;
// draw 3-pad traces and vertical traces
drawingObserver.startDrawingSide(PCBLayer._1);
drawingObserver.startTrackingContinuityArea(true);
g2d.setColor(traceColor);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize - 2f));
@@ -239,6 +245,7 @@ public class ProtoBoard780 extends AbstractProtoBoard {
}
}
drawingObserver.stopTrackingContinuityArea();
drawingObserver.stopDrawingSide();
// draw main pads
for (int i = 0; i < 25; i++) {
@@ -254,6 +261,7 @@ public class ProtoBoard780 extends AbstractProtoBoard {
for (int j = 0; j < 30; j++) {
int padY = (int) Math.round(point.getY() + spacing * j + offsetY);
drawingObserver.startDrawingSide(PCBLayer._1);
g2d.setColor(padColor);
drawingObserver.startTrackingContinuityArea(true);
@@ -266,6 +274,7 @@ public class ProtoBoard780 extends AbstractProtoBoard {
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f));
g2d.drawOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize);
drawingObserver.stopDrawingSide();
g2d.setColor(HOLE_COLOR);
g2d.fillOval(padX - holeSize / 2, padY - holeSize / 2, holeSize, holeSize);
@@ -28,6 +28,7 @@ import java.awt.Shape;
import java.awt.geom.Point2D;
import org.diylc.common.OrientationHV;
import org.diylc.common.PCBLayer;
import org.diylc.components.transform.VeroBoardTransformer;
import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
@@ -85,6 +86,7 @@ public class TriPadBoard extends AbstractVeroBoard implements ILayeredComponent
spacesToDraw = (remainingSpace - stripSize) / spacing;
}
drawingObserver.startDrawingSide(PCBLayer._1);
g2d.setColor(stripColor);
drawingObserver.startTrackingContinuityArea(true);
g2d.fillRect((int)(x + spacing - stripSize / 2), (int)(y - stripSize / 2), (int)(spacing * (spacesToDraw - 1) + stripSize),
@@ -94,6 +96,7 @@ public class TriPadBoard extends AbstractVeroBoard implements ILayeredComponent
g2d.drawRect((int)(x + spacing - stripSize / 2), (int)(y - stripSize / 2), (int)(spacing * (spacesToDraw - 1) + stripSize),
stripSize);
drawingObserver.stopDrawingSide();
x += spacing * spacesToDraw;
}
@@ -123,6 +126,7 @@ public class TriPadBoard extends AbstractVeroBoard implements ILayeredComponent
spacesToDraw = (remainingSpace - stripSize) / spacing;
}
drawingObserver.startDrawingSide(PCBLayer._1);
g2d.setColor(stripColor);
drawingObserver.startTrackingContinuityArea(true);
g2d.fillRect((int)(x - stripSize / 2), (int)(y + spacing - stripSize / 2), stripSize, (int)(spacing * (spacesToDraw - 1)
@@ -131,6 +135,7 @@ public class TriPadBoard extends AbstractVeroBoard implements ILayeredComponent
g2d.setColor(stripColor.darker());
g2d.drawRect((int)(x - stripSize / 2), (int)(y + spacing - stripSize / 2), stripSize, (int)(spacing * (spacesToDraw - 1)
+ stripSize));
drawingObserver.stopDrawingSide();
y += spacing * spacesToDraw;
}
@@ -28,6 +28,7 @@ import java.awt.Shape;
import java.awt.geom.Point2D;
import org.diylc.common.OrientationHV;
import org.diylc.common.PCBLayer;
import org.diylc.components.transform.VeroBoardTransformer;
import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
@@ -74,12 +75,14 @@ public class VeroBoard extends AbstractVeroBoard implements ILayeredComponent {
while (y < finalSecondPoint.getY() - spacing - stripSize / 2) {
x = firstPoint.getX();
y += spacing;
drawingObserver.startDrawingSide(PCBLayer._1);
g2d.setColor(stripColor);
drawingObserver.startTrackingContinuityArea(true);
g2d.fillRect((int)(x + spacing / 2), (int)(y - stripSize / 2), (int) Math.round(finalSecondPoint.getX() - spacing - x), stripSize);
drawingObserver.stopTrackingContinuityArea();
g2d.setColor(stripColor.darker());
g2d.drawRect((int)(x + spacing / 2), (int)(y - stripSize / 2), (int) Math.round(finalSecondPoint.getX() - spacing - x), stripSize);
drawingObserver.stopDrawingSide();
while (x < finalSecondPoint.getX() - spacing - holeSize) {
x += spacing;
g2d.setColor(Constants.CANVAS_COLOR);
@@ -92,12 +95,14 @@ public class VeroBoard extends AbstractVeroBoard implements ILayeredComponent {
while (x < finalSecondPoint.getX() - spacing) {
x += spacing;
y = firstPoint.getY();
drawingObserver.startDrawingSide(PCBLayer._1);
g2d.setColor(stripColor);
drawingObserver.startTrackingContinuityArea(true);
g2d.fillRect((int)(x - stripSize / 2), (int)(y + spacing / 2), stripSize, (int) Math.round(finalSecondPoint.getY() - spacing - y));
drawingObserver.stopTrackingContinuityArea();
g2d.setColor(stripColor.darker());
g2d.drawRect((int)(x - stripSize / 2), (int)(y + spacing / 2), stripSize, (int) Math.round(finalSecondPoint.getY() - spacing - y));
drawingObserver.stopDrawingSide();
while (y < finalSecondPoint.getY() - spacing - holeSize) {
y += spacing;
g2d.setColor(Constants.CANVAS_COLOR);
@@ -34,7 +34,9 @@ import org.diylc.core.ComponentState;
import org.diylc.core.CreationMethod;
import org.diylc.core.IConnective;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IDrawingObserver;
import org.diylc.core.ILayeredComponent;
import org.diylc.core.Project;
import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.AiNote.Scope;
import org.diylc.core.annotations.AiNote;
@@ -72,6 +74,14 @@ public class CopperTrace extends AbstractLeadedComponent<Void> implements IConne
this.leadColor = COLOR;
}
@Override
public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode,
Project project, IDrawingObserver drawingObserver) {
drawingObserver.startDrawingSide(getLayer());
super.draw(g2d, componentState, outlineMode, project, drawingObserver);
drawingObserver.stopDrawingSide();
}
@Override
public void drawIcon(Graphics2D g2d, int width, int height) {
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(3));
@@ -87,9 +87,11 @@ public class CurvedTrace extends AbstractCurvedComponent<Void> implements IConne
componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: color;
g2d.setColor(curveColor);
drawingObserver.startDrawingSide(getLayer());
drawingObserver.startTrackingContinuityArea(true);
g2d.draw(curve);
drawingObserver.stopTrackingContinuityArea();
drawingObserver.stopDrawingSide();
}
@EditableProperty(name = "Width")
@@ -83,11 +83,13 @@ public class GroundFill extends AbstractTransparentComponent<Void>
xPoints[i] = (int)controlPoints[i].getX();
yPoints[i] = (int)controlPoints[i].getY();
}
drawingObserver.startDrawingSide(getLayer());
drawingObserver.startTrackingContinuityArea(true);
Composite oldComposite = applyAlpha(g2d, componentState);
g2d.fillPolygon(xPoints, yPoints, controlPoints.length);
g2d.setComposite(oldComposite);
drawingObserver.stopTrackingContinuityArea();
drawingObserver.stopDrawingSide();
// Do not track any changes that follow because the whole board has been
// tracked so far.
drawingObserver.stopTracking();
@@ -97,6 +97,7 @@ public class SolderPad extends AbstractTransparentComponent<Void>
gerberDrawingObserver.startGerberOutput(org.diylc.core.gerber.GerberLayer.SolderMaskBot, "Material", false);
}
Composite oldComposite = applyAlpha(g2d, componentState);
drawingObserver.startDrawingSide(getLayer());
if (type == Type.ROUND) {
g2d.fill(new Ellipse2D.Double(point.getX() - diameter / 2, point.getY() - diameter / 2,
@@ -111,6 +112,7 @@ public class SolderPad extends AbstractTransparentComponent<Void>
g2d.fill(new Rectangle2D.Double(point.getX() - diameter / 2, point.getY() - diameter / 2,
diameter, diameter));
}
drawingObserver.stopDrawingSide();
drawingObserver.stopTracking();
drawingObserver.stopTrackingContinuityArea();
if (gerberDrawingObserver != null)
@@ -121,9 +123,11 @@ public class SolderPad extends AbstractTransparentComponent<Void>
GerberLayer holeLayer = HoleType.PTH.equals(getHoleType()) ? GerberLayer.DrillPlated : GerberLayer.DrillNonPlated;
gerberDrawingObserver.startGerberOutput(holeLayer, GerberFunctions.COMPONENT_DRILL, false);
}
drawingObserver.startDrawingBothSides();
g2d.setColor(Constants.CANVAS_COLOR);
g2d.fill(new Ellipse2D.Double(point.getX() - holeDiameter / 2,
point.getY() - holeDiameter / 2, holeDiameter, holeDiameter));
drawingObserver.stopDrawingSide();
}
g2d.setComposite(oldComposite);
if (gerberDrawingObserver != null)
@@ -83,6 +83,8 @@ public class TraceCut extends AbstractTransparentComponent<Void> implements ILay
return;
}
Composite oldComposite = applyAlpha(g2d, componentState);
// the cut is what tells the user a strip is broken, so it stays crisp from either side
drawingObserver.startDrawingBothSides();
g2d.setStroke(ObjectCache.getInstance().fetchZoomableStroke(1f));
int size = getClosestOdd((int) this.size.convertToPixels());
int cutWidth = getClosestOdd((int) CUT_WIDTH.convertToPixels());
@@ -109,6 +111,7 @@ public class TraceCut extends AbstractTransparentComponent<Void> implements ILay
g2d.setColor(getBoardColor().darker());
g2d.drawOval((int) Math.round(point.getX() - holeSize / 2), (int) Math.round(point.getY() - holeSize / 2), holeSize, holeSize);
}
drawingObserver.stopDrawingSide();
g2d.setComposite(oldComposite);
}
@@ -156,7 +156,9 @@ public class PCBText extends AbstractComponent<Void> implements ILayeredComponen
@Override
public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project,
IDrawingObserver drawingObserver) {
drawingObserver.startDrawingSide(getLayer());
this.draw(g2d, componentState, outlineMode, project, drawingObserver, null);
drawingObserver.stopDrawingSide();
}
@Override
@@ -0,0 +1,57 @@
/*
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.serialization;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import org.diylc.common.PCBLayer;
import org.diylc.components.connectivity.CopperTrace;
import org.junit.Assert;
import org.junit.Test;
/**
* The inner PCB layers are deprecated but must keep loading from files that use them, with their
* layer and continuity id unchanged, because XStream resolves enum constants by name.
*/
public class InnerLayerCompatibilityTest {
private static XStream createXStream() {
XStream xStream = new XStream(new DomDriver("UTF-8"));
ProjectFileManager.configure(xStream);
return xStream;
}
@Test
@SuppressWarnings("deprecation")
public void innerLayerTraceLoadsUnchanged() {
CopperTrace trace = new CopperTrace();
trace.setLayer(PCBLayer._2);
String xml = createXStream().toXML(trace);
Assert.assertTrue(xml.contains("<layer>_2</layer>"));
CopperTrace loaded = (CopperTrace) createXStream().fromXML(xml.replace("<layer>_2</layer>", "<layer>_5</layer>"));
Assert.assertEquals(PCBLayer._5, loaded.getLayer());
Assert.assertEquals(5, loaded.getLayerId());
Assert.assertTrue(createXStream().toXML(loaded).contains("<layer>_5</layer>"));
}
}