From f0c197078480c9cacccb1ffe27d7443d91bc71e4 Mon Sep 17 00:00:00 2001 From: Bane Stojkovic Date: Fri, 14 Apr 2023 08:24:55 +0200 Subject: [PATCH] Proto board 780 draft --- .../components/boards/ProtoBoard780.java | 832 ++++++++++++++++++ diylc/diylc-swing/lib/diylc-core.jar | Bin 394298 -> 394298 bytes diylc/diylc-swing/library/main.jar | Bin 928864 -> 934867 bytes 3 files changed, 832 insertions(+) create mode 100644 diylc/diylc-library/src/org/diylc/components/boards/ProtoBoard780.java diff --git a/diylc/diylc-library/src/org/diylc/components/boards/ProtoBoard780.java b/diylc/diylc-library/src/org/diylc/components/boards/ProtoBoard780.java new file mode 100644 index 00000000..e9b20867 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/boards/ProtoBoard780.java @@ -0,0 +1,832 @@ +/* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 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 + * . + * + */ +package org.diylc.components.boards; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import org.diylc.awt.StringUtils; +import org.diylc.common.HorizontalAlignment; +import org.diylc.common.ObjectCache; +import org.diylc.common.VerticalAlignment; +import org.diylc.components.transform.ProtoBoardTransformer; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.BomPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.annotations.KeywordPolicy; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; + +@ComponentDescriptor(name = "Proto Board 780 Holes", category = "Boards", + author = "Branislav Stojkovic", + description = "Prototyping board similar to Radio Shack 276-168B or MPJA 33304", + instanceNamePrefix = "BB", zOrder = IDIYComponent.BOARD, + bomPolicy = BomPolicy.SHOW_ONLY_TYPE_NAME, autoEdit = false, + keywordPolicy = KeywordPolicy.SHOW_TYPE_NAME, enableCache = true, + transformer = ProtoBoardTransformer.class) +public class ProtoBoard780 extends AbstractProtoBoard { + + private static final long serialVersionUID = 1L; + + public static Color FILL_COLOR = Color.decode("#6B9B6B"); + public static Size SPACING = new Size(0.1d, SizeUnit.in); + public static Color SELECTION_COLOR = Color.red; + public static Color PAD_COLOR = COPPER_COLOR; + public static Color TRACE_COLOR = PAD_COLOR.brighter(); + public static Color UNDERSIDE_PAD_COLOR = Color.decode("#977DC4"); + public static Color UNDERSIDE_TRACE_COLOR = UNDERSIDE_PAD_COLOR.brighter(); + public static Color HOLE_COLOR = Color.white; + + public static float COORDINATE_FONT_SIZE = 9f; + public static Color COORDINATE_COLOR = Color.decode("#DDDDDD"); + + public static Color SEPARATOR_COLOR = Color.white; + public static Color SCREEN_COLOR = Color.decode("#CAD4CA"); + + public static Size PAD_SIZE = new Size(2d, SizeUnit.mm); + public static int ROW_COUNT = 33; + + public static Size WIDTH_SIZE = new Size(72d, SizeUnit.mm); + public static Size LENGTH_SIZE = new Size(95d, SizeUnit.mm); + + private static int[] SEGMENTS = new int[] {2, 3, 3, 3, 3, 2}; + private static int[] SEGMENTS_SUM = new int[] {0, 2, 5, 8, 11, 14}; + private static int[] GAPS = new int[] {1, 0, 2, 0, 0, 0}; + private static int[] SEGMENTS_STARTS = new int[] {0, 3, 6, 11, 14, 17}; + + protected Point2D point = new Point2D.Double(0, 0); + + protected Color boardColor = FILL_COLOR; + protected Color padColor = PAD_COLOR; + protected Color traceColor = TRACE_COLOR; + protected Color undersidePadColor = UNDERSIDE_PAD_COLOR; + protected Color undersideTraceColor = UNDERSIDE_TRACE_COLOR; + protected Color textColor = COORDINATE_COLOR; + + @SuppressWarnings("incomplete-switch") + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, + Project project, IDrawingObserver drawingObserver) { + if (checkPointsClipped(g2d.getClip())) { + return; + } + + // adjust the angle + double theta = 0; + switch (getOrientation()) { + case _90: + theta = Math.PI / 2; + break; + case _180: + theta = Math.PI; + break; + case _270: + theta = Math.PI * 3 / 2; + break; + } + if (theta != 0) { + g2d.rotate(theta, point.getX(), point.getY()); + } + + double spacing = SPACING.convertToPixels(); + + // draw body + g2d.setColor(boardColor); + int width = (int) WIDTH_SIZE.convertToPixels(); + int length = (int) LENGTH_SIZE.convertToPixels(); + + Shape rect = new Rectangle2D.Double(point.getX(), point.getY(), width, length); + g2d.fill(rect); + g2d.setColor( + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING + ? SELECTION_COLOR + : boardColor.darker()); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + + drawingObserver.stopTracking(); + + g2d.draw(rect); + + int padSize = getClosestOdd(PAD_SIZE.convertToPixels()); + int holeSize = getClosestOdd(padSize / 3); + + g2d.setFont(LABEL_FONT.deriveFont(COORDINATE_FONT_SIZE)); + + g2d.setColor(traceColor); + + + double offsetY = spacing * 0.5; + + for (int i = 0; i < 15; i++) { + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize - 2f)); + + g2d.setColor(padColor); + int padX = (int)(point.getX() + width / 2 - 7 * spacing + i * spacing); + drawingObserver.startTrackingContinuityArea(true); + g2d.drawLine(padX, (int)(point.getY() + offsetY), padX, (int)(point.getY() + spacing + offsetY)); + drawingObserver.stopTrackingContinuityArea(); + + for (int j = 0; j < 2; j++) { + int padY = (int)(point.getY() + spacing * j + offsetY); + + g2d.setColor(padColor); + + drawingObserver.startTrackingContinuityArea(true); + + g2d.fillOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + + drawingObserver.stopTrackingContinuityArea(); + + g2d.setColor(padColor.darker()); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); + + g2d.drawOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + + g2d.setColor(HOLE_COLOR); + g2d.fillOval(padX - holeSize / 2, padY - holeSize / 2, holeSize, holeSize); + } + } + + offsetY = spacing * 5.5; + + for (int i = 0; i < 25; i++) { + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize - 2f)); + + g2d.setColor(padColor); + int padX = (int)(point.getX() + width / 2 - 12 * spacing + i * spacing); +// drawingObserver.startTrackingContinuityArea(true); +// g2d.drawLine(padX, (int)(point.getY() + offsetY), padX, (int)(point.getY() + spacing + offsetY)); +// drawingObserver.stopTrackingContinuityArea(); + + for (int j = 0; j < 30; j++) { + int padY = (int)(point.getY() + spacing * j + offsetY); + + g2d.setColor(padColor); + + drawingObserver.startTrackingContinuityArea(true); + + g2d.fillOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + + drawingObserver.stopTrackingContinuityArea(); + + g2d.setColor(padColor.darker()); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); + + g2d.drawOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + + g2d.setColor(HOLE_COLOR); + g2d.fillOval(padX - holeSize / 2, padY - holeSize / 2, holeSize, holeSize); + } + } + + + // // draw segment connectors + // for (int y = 0; y < ROW_COUNT; y++) { + // for (int segment = 0; segment < SEGMENTS.length; segment++) { + // drawingObserver.setContinuityMarker("SEGMENT=" + segment + ";ROW=" + y); + // g2d.drawLine((int) (point.getX() + (xOffset + SEGMENTS_STARTS[segment]) * spacing), + // (int) (point.getY() + (yOffset + y) * spacing), + // (int) (point.getX() + (xOffset + SEGMENTS_STARTS[segment] + SEGMENTS[segment] - 1) * + // spacing), + // (int) (point.getY() + (yOffset + y) * spacing)); + // } + // } + // drawingObserver.setContinuityMarker(null); + // + // g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4)); + // + // // draw central mini pad connectors, top row + // for (int y = 0; y < ROW_COUNT; y++) { + // // top row + // g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3]) * spacing), (int) (point.getY() + + // (yOffset + y - 0.25d) * spacing + 1), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing), (int) (point.getY() + (yOffset + // + y - 0.25d) * spacing + 1)); + // g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 3) * spacing), (int) (point.getY() + // + (yOffset + y - 0.25d) * spacing + 1), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2.5) * spacing), (int) (point.getY() + (yOffset + // + y - 0.25d) * spacing + 1)); + // } + // + // g2d.setColor(undersideTraceColor); + // + // // bottom row. + // for (int y = 0; y < ROW_COUNT; y++) { + // g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3]) * spacing), (int) (point.getY() + + // (yOffset + y + 0.25d) * spacing + 1), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1) * spacing), (int) (point.getY() + (yOffset + + // y + 0.25d) * spacing + 1)); + // g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 3) * spacing), (int) (point.getY() + // + (yOffset + y + 0.25d) * spacing + 1), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2) * spacing), (int) (point.getY() + (yOffset + + // y + 0.25d) * spacing + 1)); + // } + // + // // 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)); + // + // g2d.setColor(traceColor); + // + // // traces to top and bottom 3 pads + // g2d.drawPolyline(new int[] { + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.2) * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.2) * spacing)}, + // new int[] { + // (int) (point.getY() + (yOffset - 1.5) * spacing), + // (int) (point.getY() + (yOffset - 1) * spacing), + // (int) (point.getY() + (yOffset - 0.3) * spacing)}, 3); + // g2d.drawPolyline(new int[] { + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2.5) * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.8) * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.8) * spacing)}, + // new int[] { + // (int) (point.getY() + (yOffset - 1.5) * spacing), + // (int) (point.getY() + (yOffset - 1) * spacing), + // (int) (point.getY() + (yOffset - 0.3) * spacing)}, 3); + // + // g2d.drawPolyline(new int[] { + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.2) * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.2) * spacing)}, + // new int[] { + // (int) (point.getY() + (yOffset + ROW_COUNT + 0.5) * spacing), + // (int) (point.getY() + (yOffset + ROW_COUNT) * spacing), + // (int) (point.getY() + (yOffset + ROW_COUNT - 0.35) * spacing)}, 3); + // g2d.drawPolyline(new int[] { + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2.5) * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.8) * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.8) * spacing)}, + // new int[] { + // (int) (point.getY() + (yOffset + ROW_COUNT + 0.5) * spacing), + // (int) (point.getY() + (yOffset + ROW_COUNT) * spacing), + // (int) (point.getY() + (yOffset + ROW_COUNT - 0.35) * spacing)}, 3); + // + // drawingObserver.stopTrackingContinuityArea(); + // + // int miniPadSize = getClosestOdd((2d * spacing - 6) / 5); + // + // // draw top mini pad traces + // g2d.setColor(traceColor); + // g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4)); + // drawingObserver.startTrackingContinuityArea(true); + // g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing), (int) + // (point.getY() + 1 * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing), (int) (point.getY() + 3.5 * + // spacing)); + // g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing + miniPadSize / 2), + // (int) (point.getY() + 1 * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing + miniPadSize / 2), (int) + // (point.getY() + 3.5 * spacing)); + // g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2.5) * spacing), (int) + // (point.getY() + 1 * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2.5) * spacing), (int) (point.getY() + 3.5 * + // spacing)); + // drawingObserver.stopTrackingContinuityArea(); + // + // g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + // + // // vertical separators + // g2d.setColor(SEPARATOR_COLOR); + // + // g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(2)); + // + // g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_STARTS[2] - 0.5) * spacing), (int) + // (point.getY() + (yOffset - 1) * spacing), + // (int) (point.getX() + (1 + SEGMENTS_STARTS[2] - 0.5) * spacing), (int) (point.getY() + + // (yOffset + ROW_COUNT -0.5) * spacing)); + // g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_STARTS[4] - 0.5) * spacing), (int) + // (point.getY() + (yOffset - 1) * spacing), + // (int) (point.getX() + (1 + SEGMENTS_STARTS[4] - 0.5) * spacing), (int) (point.getY() + + // (yOffset + ROW_COUNT -0.5) * spacing)); + // g2d.fillRect((int) (point.getX() + (1 + SEGMENTS_STARTS[1] - 1.25) * spacing), (int) + // (point.getY() + (yOffset - 1) * spacing), + // (int)(0.5 * spacing), (int) ((ROW_COUNT + 0.5) * spacing)); + // + // g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + // + // // draw main pads + // for (int segment = 0; segment < SEGMENTS.length; segment++) { + // for (int y = 0; y < ROW_COUNT; y++) { + // for (int x = 0; x < SEGMENTS[segment]; x++) { + // int padX = (int) (point.getX() + (xOffset + x) * spacing); + // int padY = (int) (point.getY() + (yOffset + y) * spacing); + // + // drawingObserver.startTrackingContinuityArea(true); + // drawingObserver.setContinuityMarker("SEGMENT=" + segment + ";ROW=" + y); + // + // g2d.setColor(padColor); + // if ((segment == 2 && x == 2) || (segment == 3 && x == 0)) + // g2d.fillRect(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // else + // g2d.fillOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // + // drawingObserver.setContinuityMarker(null); + // + // drawingObserver.stopTrackingContinuityArea(); + // + // g2d.setColor(padColor.darker()); + // if ((segment == 2 && x == 2) || (segment == 3 && x == 0)) + // g2d.drawRect(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // else + // g2d.drawOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // + // g2d.setColor(HOLE_COLOR); + // g2d.fillOval(padX - holeSize / 2, padY - holeSize / 2, holeSize, holeSize); + // + // // Draw horizontal labels + // if (y == 0) { + // g2d.setColor(textColor); + // StringUtils.drawCenteredText(g2d, Integer.toString(SEGMENTS_SUM[segment] + x + 1), padX, + // (int) (point.getY() + (yOffset) * spacing) - padSize / 2 - 2, + // HorizontalAlignment.CENTER, VerticalAlignment.TOP); + // } + // } + // } + // + // xOffset += SEGMENTS[segment] + GAPS[segment]; + // } + // + // // Draw top and bottom 3 pads + // for (int y = 0; y < 2; y++) { + // g2d.setColor(SEPARATOR_COLOR); + // g2d.drawRect((int) (point.getX() + (1 + SEGMENTS_SUM[3]) * spacing), (int) (point.getY() + + // (yOffset - 2 + y * (ROW_COUNT + 2)) * spacing), + // (int)(3 * spacing), (int)spacing); + // + // drawingObserver.startTrackingContinuityArea(true); + // + // for (int x = 0; x < 3; x++) { + // int padX = (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5 + x) * spacing); + // int padY = (int) (point.getY() + (yOffset - 1.5 + y * (ROW_COUNT + 2)) * spacing); + // + // g2d.setColor(padColor); + // + // if (x == 0) + // drawingObserver.setContinuityMarker("columnA"); + // else if (x == 2) + // drawingObserver.setContinuityMarker("columnC"); + // + // if (x == 2) + // g2d.fillRect(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // else + // g2d.fillOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // + // drawingObserver.setContinuityMarker(null); + // + // g2d.setColor(padColor.darker()); + // if (x == 2) + // g2d.drawRect(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // else + // g2d.drawOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // g2d.setColor(HOLE_COLOR); + // g2d.fillOval(padX - holeSize / 2, padY - holeSize / 2, holeSize, holeSize); + // } + // + // drawingObserver.stopTrackingContinuityArea(); + // } + // + // g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(2)); + // + // g2d.setColor(SCREEN_COLOR); + // g2d.fill(new Rectangle2D.Double(point.getX() + width - 1.5 * spacing, point.getY() + 2, + // spacing, 2 * spacing)); + // g2d.setColor(SEPARATOR_COLOR); + // g2d.draw(new Rectangle2D.Double(point.getX() + width - 5.5 * spacing, point.getY() + 2, 5 * + // spacing, 2 * spacing)); + // + // g2d.drawLine((int) (point.getX() + width - 5.5 * spacing), (int) (point.getY() + 2 * spacing) + // + 8, + // (int) (point.getX() + width - 5.5 * spacing), (int) (point.getY() + 3.5 * spacing)); + // g2d.drawLine((int) (point.getX() + width - 4.5 * spacing), (int) (point.getY() + 2 * spacing + // + 8), + // (int) (point.getX() + width - 4.5 * spacing), (int) (point.getY() + 3.5 * spacing)); + // g2d.drawLine((int) (point.getX() + width - 1.5 * spacing), (int) (point.getY() + 2 * spacing + // + 8), + // (int) (point.getX() + width - 1.5 * spacing), (int) (point.getY() + 3.5 * spacing)); + // + // g2d.setColor(traceColor); + // g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4)); + // + // drawingObserver.startTrackingContinuityArea(true); + // + // // Draw two horizontal traces in the top-right section + // g2d.drawLine((int) (point.getX() + width - 4 * spacing), (int) (point.getY() + 0.5 * + // spacing), (int) (point.getX() + width - (2) * spacing), (int) (point.getY() + 0.5 * + // spacing)); + // g2d.drawLine((int) (point.getX() + width - 4 * spacing), (int) (point.getY() + 1.5 * + // spacing), (int) (point.getX() + width - (2) * spacing), (int) (point.getY() + 1.5 * + // spacing)); + // + // // Draw top-right pads + // for (int x = 0; x < 6; x++) { + // int padX = (int) (point.getX() + width - (x + 1) * spacing); + // + // g2d.setColor(traceColor); + // g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4)); + // g2d.drawLine(padX, (int) (point.getY() + 0.5 * spacing), padX, (int) (point.getY() + 3 * + // spacing)); + // + // g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + // + // for (int y = 0; y < 3; y++) { + // + // int padY = (int) (point.getY() + (y + (y == 2 ? 0.5 : 0) + 0.5) * spacing); + // + // if (x == 0) + // drawingObserver.setContinuityMarker("-12V"); + // else if (x == 4) + // drawingObserver.setContinuityMarker("+12V"); + // else if (x == 5) + // drawingObserver.setContinuityMarker("+5V"); + // else + // drawingObserver.setContinuityMarker("GND"); + // + // g2d.setColor(padColor); + // if (x >= 4) + // g2d.fillRect(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // else + // g2d.fillOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // + // drawingObserver.setContinuityMarker(null); + // + // g2d.setColor(padColor.darker()); + // if (x >= 4) + // g2d.drawRect(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // else + // g2d.drawOval(padX - padSize / 2, padY - padSize / 2, padSize, padSize); + // g2d.setColor(HOLE_COLOR); + // g2d.fillOval(padX - holeSize / 2, padY - holeSize / 2, holeSize, holeSize); + // } + // } + // + // drawingObserver.stopTrackingContinuityArea(); + // + // // draw top mini pads + // g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + // for (int y = 0; y < 4; y++) { + // int padY = (int) (point.getY() + (0.5 * y + 1) * spacing); + // int[] padXs = new int[] {(int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing - + // miniPadSize - 2), (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing), + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing) - miniPadSize / 2 - 2, (int) + // (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing) + miniPadSize / 2 + 1, + // (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2.5) * spacing), (int) (point.getX() + (1 + + // SEGMENTS_SUM[3] + 2.5) * spacing + miniPadSize + 2)}; + // + // for (int i = 0; i < padXs.length; i++) { + // int padX = padXs[i]; + // drawingObserver.startTrackingContinuityArea(true); + // + // if (i == 0 || i == 2 || i == 5) { + // switch (y) { + // case 0: drawingObserver.setContinuityMarker("+5V"); + // break; + // case 1: drawingObserver.setContinuityMarker("+12V"); + // break; + // case 2: drawingObserver.setContinuityMarker("GND"); + // break; + // case 3: drawingObserver.setContinuityMarker("-12V"); + // break; + // } + // } + // + // g2d.setColor(padColor); + // g2d.fillRect(padX - miniPadSize / 2, padY - miniPadSize / 2, miniPadSize, miniPadSize); + // + // drawingObserver.setContinuityMarker(null); + // + // drawingObserver.stopTrackingContinuityArea(); + // g2d.setColor(padColor.darker()); + // g2d.drawRect(padX - miniPadSize / 2, padY - miniPadSize / 2, miniPadSize, miniPadSize); + // } + // } + // + // g2d.setColor(textColor); + // + // // Draw top labels + // StringUtils.drawCenteredText(g2d, "+5V", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * + // spacing), (int) (point.getY() + 1 * spacing) + 1, + // HorizontalAlignment.RIGHT, VerticalAlignment.CENTER); + // StringUtils.drawCenteredText(g2d, "+12V", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * + // spacing), (int) (point.getY() + 1.5 * spacing) + 1, + // HorizontalAlignment.RIGHT, VerticalAlignment.CENTER); + // StringUtils.drawCenteredText(g2d, "GND", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * + // spacing), (int) (point.getY() + 2 * spacing) + 1, + // HorizontalAlignment.RIGHT, VerticalAlignment.CENTER); + // StringUtils.drawCenteredText(g2d, "-12V", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * + // spacing), (int) (point.getY() + 2.5 * spacing) + 1, + // HorizontalAlignment.RIGHT, VerticalAlignment.CENTER); + // + // // Draw top-right labels + // int labelY = (int) (point.getY() + 3.8 * spacing) + 1; + // StringUtils.drawCenteredText(g2d, "+5V", (int) (point.getX() + width - 6 * spacing), labelY, + // HorizontalAlignment.CENTER, VerticalAlignment.TOP); + // StringUtils.drawCenteredText(g2d, "+", (int) (point.getX() + width - 5 * spacing) - 6, + // labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP); + // StringUtils.drawCenteredText(g2d, " 12V", (int) (point.getX() + width - 5 * spacing) + 2, + // labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP); + // StringUtils.drawCenteredText(g2d, "GND", (int) (point.getX() + width - 3 * spacing), labelY, + // HorizontalAlignment.CENTER, VerticalAlignment.TOP); + // StringUtils.drawCenteredText(g2d, "-12V", (int) (point.getX() + width - 1 * spacing), labelY, + // HorizontalAlignment.CENTER, VerticalAlignment.TOP); + // + // // Draw vertical labels + // byte A = "A".getBytes()[0]; + // byte a = "a".getBytes()[0]; + // for (int y = 0; y < ROW_COUNT; y++) { + // int padY = (int) (point.getY() + (yOffset + y) * spacing); + // String label; + // if (y >= 26) + // label = new String(new byte[] {(byte) (a + y - 26)}); + // else + // label = new String(new byte[] {(byte) (A + y)}); + // StringUtils.drawCenteredText(g2d, label, (int) (point.getX() + spacing * 0.35), padY, + // HorizontalAlignment.CENTER, VerticalAlignment.CENTER); + // StringUtils.drawCenteredText(g2d, label, (int) (point.getX() + width - spacing * 0.35), padY, + // HorizontalAlignment.CENTER, VerticalAlignment.CENTER); + // } + // + // g2d.setColor(textColor); + // g2d.setFont(LABEL_FONT.deriveFont(COORDINATE_FONT_SIZE + 2)); + // + // StringUtils.drawCenteredText(g2d, "P-0+o by:\nKristian Blåsol 2019", (int) (point.getX() + + // width * 0.70d), (int) (point.getY() + (yOffset + ROW_COUNT + 0.9) * spacing), + // HorizontalAlignment.LEFT, VerticalAlignment.TOP); + // + // // draw central mini pads + // for (int y = 0; y < ROW_COUNT; y++) { + // g2d.setColor(padColor); + // + // drawingObserver.startTrackingContinuityArea(true); + // + // // top row + // g2d.fillRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing) + 1, (int) + // (point.getY() + (yOffset + y - 0.5d) * spacing + 2), miniPadSize, miniPadSize); + // drawingObserver.setContinuityMarker("columnA"); + // g2d.fillRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing) + miniPadSize + 3, + // (int) (point.getY() + (yOffset + y - 0.5d) * spacing + 2), miniPadSize, miniPadSize); + // drawingObserver.setContinuityMarker("columnC"); + // g2d.fillRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing) + 3, (int) + // (point.getY() + (yOffset + y - 0.5d) * spacing + 2), miniPadSize, miniPadSize); + // drawingObserver.setContinuityMarker(null); + // g2d.fillRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing) + miniPadSize + 5, + // (int) (point.getY() + (yOffset + y - 0.5d) * spacing + 2), miniPadSize, miniPadSize); + // + // drawingObserver.stopTrackingContinuityArea(); + // + // g2d.setColor(padColor.darker()); + // 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); + // + // g2d.setColor(undersidePadColor); + // + // drawingObserver.startTrackingContinuityArea(true); + // + // // bottom row + // + // g2d.fillRect((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing) - miniPadSize / 2, + // (int) (point.getY() + (yOffset + y + 0.5d) * spacing - 1 - miniPadSize), miniPadSize, + // miniPadSize); + //// drawingObserver.setContinuityMarker("columnB"); + // g2d.fillRect((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); + //// drawingObserver.setContinuityMarker("null"); + // 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(); + // + // 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); + // + // 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); + // } + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int factor = 32 / width; + g2d.setColor(FILL_COLOR); + g2d.fillRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor); + g2d.setColor(FILL_COLOR.darker()); + g2d.drawRect(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor); + + g2d.setColor(PAD_COLOR.brighter()); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(2 / factor)); + + int size = (int) (8.0 / factor); + + g2d.drawLine(width / 3 - 2 / factor + size / 2, 6 / factor + size / 2, width, + 6 / factor + size / 2); + g2d.drawLine(width / 3 - 2 / factor + size / 2, 2 * width / 3 - 2 / factor + size / 2, width, + 2 * width / 3 - 2 / factor + size / 2); + + + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + + g2d.setColor(PAD_COLOR); + g2d.fillRect(width / 3 - 2 / factor, 6 / factor, size, size); + g2d.setColor(PAD_COLOR.darker()); + g2d.drawRect(width / 3 - 2 / factor, 6 / factor, size, size); + + g2d.setColor(PAD_COLOR); + g2d.fillOval(2 * width / 3 - 2 / factor, 6 / factor, size, size); + g2d.setColor(PAD_COLOR.darker()); + g2d.drawOval(2 * width / 3 - 2 / factor, 6 / factor, size, size); + + g2d.setColor(PAD_COLOR); + g2d.fillRect(width / 3 - 2 / factor, 2 * width / 3 - 2 / factor, size, size); + g2d.setColor(PAD_COLOR.darker()); + g2d.drawRect(width / 3 - 2 / factor, 2 * width / 3 - 2 / factor, size, size); + + g2d.setColor(PAD_COLOR); + g2d.fillOval(2 * width / 3 - 2 / factor, 2 * width / 3 - 2 / factor, size, size); + g2d.setColor(PAD_COLOR.darker()); + g2d.drawOval(2 * width / 3 - 2 / factor, 2 * width / 3 - 2 / factor, size, size); + + g2d.setColor(HOLE_COLOR); + g2d.fillOval(width / 3 - 2 / factor + size / 2 - 1, 6 / factor + size / 2 - 1, 3, 3); + g2d.fillOval(width / 3 - 2 / factor + size / 2 - 1, 2 * width / 3 - 2 / factor + size / 2 - 1, + 3, 3); + g2d.fillOval(2 * width / 3 - 2 / factor + size / 2 - 1, 6 / factor + size / 2 - 1, 3, 3); + g2d.fillOval(2 * width / 3 - 2 / factor + size / 2 - 1, + 2 * width / 3 - 2 / factor + size / 2 - 1, 3, 3); + } + + @EditableProperty(name = "Board Color") + public Color getBoardColor() { + return boardColor; + } + + public void setBoardColor(Color boardColor) { + this.boardColor = boardColor; + } + + @EditableProperty(name = "Pad Color") + public Color getPadColor() { + return padColor; + } + + public void setPadColor(Color padColor) { + this.padColor = padColor; + } + + @EditableProperty(name = "Trace Color") + public Color getTraceColor() { + return traceColor; + } + + public void setTraceColor(Color traceColor) { + this.traceColor = traceColor; + } + + @EditableProperty(name = "Underside Pad Color") + public Color getUndersidePadColor() { + return undersidePadColor; + } + + public void setUndersidePadColor(Color undersidePadColor) { + this.undersidePadColor = undersidePadColor; + } + + @EditableProperty(name = "Underside Trace Color") + public Color getUndersideTraceColor() { + return undersideTraceColor; + } + + public void setUndersideTraceColor(Color undersideTraceColor) { + this.undersideTraceColor = undersideTraceColor; + } + + @EditableProperty(name = "Text Color") + public Color getTextColor() { + return textColor; + } + + public void setTextColor(Color textColor) { + this.textColor = textColor; + } + + @Override + public int getControlPointCount() { + return 2; + } + + @Override + public boolean canPointMoveFreely(int pointIndex) { + return false; + } + + @SuppressWarnings("incomplete-switch") + @Override + public Point2D getControlPoint(int index) { + if (index == 0) + return point; + + // create a synthetic second control point for clipping check and to make sure that we cannot + // drag the right side of the board off the screen + + // adjust the angle + double theta = 0; + switch (getOrientation()) { + case _90: + theta = Math.PI / 2; + break; + case _180: + theta = Math.PI; + break; + case _270: + theta = Math.PI * 3 / 2; + break; + } + int width = (int) WIDTH_SIZE.convertToPixels(); + int length = (int) LENGTH_SIZE.convertToPixels(); + Point2D secondPoint = new Point2D.Double(point.getX() + width, point.getY() + length); + if (theta != 0) { + AffineTransform tx = AffineTransform.getRotateInstance(theta, point.getX(), point.getY()); + tx.transform(secondPoint, secondPoint); + } + return secondPoint; + } + + @Override + public boolean isControlPointSticky(int index) { + return false; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.NEVER; + } + + @Override + public void setControlPoint(Point2D point, int index) { + if (index == 0) + this.point.setLocation(point); + } + + @Override + public Void getValue() { + return null; + } + + @Override + public void setValue(Void value) {} + + @Override + public String getControlPointNodeName(int index) { + return null; + } + + @Override + public Rectangle2D getCachingBounds() { + Point2D finalSecondPoint = getControlPoint(1); + return new Rectangle2D.Double(Math.min(point.getX(), finalSecondPoint.getX()), + Math.min(point.getY(), finalSecondPoint.getY()), + Math.abs(finalSecondPoint.getX() - point.getX()) + 2, + Math.abs(finalSecondPoint.getY() - point.getY()) + 2); + } +} diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index b1dba32d37e51d2041cbd46a6e5dd5d580834d68..48b593277de24efd0a9187db88238ed7d1ffd510 100644 GIT binary patch delta 6995 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 delta 6995 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
EQlepy?qnl!9GpBX# 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 delta 17702 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