improveent

This commit is contained in:
Bane Stojkovic
2026-08-19 14:24:39 +02:00
parent 613fffb596
commit daaac2e81a
2 changed files with 178 additions and 97 deletions
@@ -59,6 +59,10 @@ public class ArduinoMega extends AbstractMakerBoard {
private static final long serialVersionUID = 1L;
public static Color ARDUINO_BLUE = Color.decode("#00878F");
public static Color ITALIAN_TEAL = Color.decode("#00979D");
public static Color RESET_BTN_COLOR = Color.decode("#CC3333");
public static Color SILK_COLOR = Color.WHITE;
public static Size BOARD_WIDTH = new Size(101.6d, SizeUnit.mm);
public static Size BOARD_HEIGHT = new Size(53.4d, SizeUnit.mm);
@@ -105,6 +109,7 @@ public class ArduinoMega extends AbstractMakerBoard {
protected void updateControlPoints() {
Point2D firstPoint = controlPoints[0];
double spacing = PIN_SPACING.convertToPixels(); // 20px for 0.1" (100 mils)
double gap02 = new Size(0.2d, SizeUnit.in).convertToPixels(); // 40px for 0.2"
// Reference: Pin 0 (NC) is at (boardX + 220.0, boardY + 400.0) [1100 mils, 100 mils from bottom-left]
// Board is 800px wide (4000 mils), 420px high (2100 mils)
@@ -116,39 +121,41 @@ public class ArduinoMega extends AbstractMakerBoard {
relativeOffsets[i][1] = 0;
}
// Analog Low A0..A7 pins 8..15 (bottom row, 2000..2700 mils, separated from VIN by 0.2" = 40px)
double a0X = 7 * spacing + 40; // 180px
double a0X = 7 * spacing + gap02; // 180px
for (int i = 0; i < 8; i++) {
relativeOffsets[8 + i][0] = a0X + i * spacing;
relativeOffsets[8 + i][1] = 0;
}
// Analog High A8..A15 pins 16..23 (bottom row, 2900..3600 mils, separated from A7 by 0.2" = 40px)
double a8X = a0X + 7 * spacing + 40; // 360px
double a8X = a0X + 7 * spacing + gap02; // 360px
for (int i = 0; i < 8; i++) {
relativeOffsets[16 + i][0] = a8X + i * spacing;
relativeOffsets[16 + i][1] = 0;
}
// Digital Low D0..D7 pins 24..31 (top row, 2500..1800 mils, Y=2000 mils)
double topRowY = -380;
double d0X = 280; // aligns with A5 at 2500 mils
double topRowY = -new Size(1.9d, SizeUnit.in).convertToPixels(); // -380px
double d0X = new Size(1.4d, SizeUnit.in).convertToPixels(); // aligns with A5 at 2500 mils (280px)
for (int i = 0; i < 8; i++) {
relativeOffsets[24 + i][0] = d0X - i * spacing;
relativeOffsets[24 + i][1] = topRowY;
}
// Digital High D8..D13/GND/AREF/SDA/SCL pins 32..41 (top row, 1640..740 mils, gap between D7 and D8 is 0.16" = 32px)
double d8X = 140 - 32; // 108px
double d7X = 7 * spacing; // 140px
double d7d8Gap = new Size(0.16d, SizeUnit.in).convertToPixels(); // 32px
double d8X = d7X - d7d8Gap; // 108px
for (int i = 0; i < 10; i++) {
relativeOffsets[32 + i][0] = d8X - i * spacing;
relativeOffsets[32 + i][1] = topRowY;
}
// Communication header D14..D21 pins 42..49 (top row, 2700..3400 mils, gap from D0 is 0.2" = 40px)
double d14X = d0X + 40; // 320px, aligns with A7 at 2700 mils
double d14X = d0X + gap02; // 320px, aligns with A7 at 2700 mils
for (int i = 0; i < 8; i++) {
relativeOffsets[42 + i][0] = d14X + i * spacing;
relativeOffsets[42 + i][1] = topRowY;
}
// Double digital header 2x18 at far right pins 50..85 (D22..D53, GNDx2, 5Vx2; X=3600, 3700 mils, Y=2000..300 mils)
double d22InnerX = 520; // (3700 - 1100) * 0.2
double d22OuterX = 540; // (3800 - 1100) * 0.2
double d22InnerX = new Size(2.6d, SizeUnit.in).convertToPixels(); // 520px: (3700 - 1100) * 0.2
double d22OuterX = new Size(2.7d, SizeUnit.in).convertToPixels(); // 540px: (3800 - 1100) * 0.2
for (int row = 0; row < 18; row++) {
double py = topRowY + row * spacing;
relativeOffsets[50 + row * 2][0] = d22InnerX;
@@ -157,8 +164,8 @@ public class ArduinoMega extends AbstractMakerBoard {
relativeOffsets[50 + row * 2 + 1][1] = py;
}
// Main ICSP header (2x3 pins, 86..91) for ATmega2560 at (2505, 1200) mils
double icspX = (2505 - 1100) * 0.2; // 281.0 px
double icspY = (100 - 1200) * 0.2; // -220.0 px
double icspX = new Size(1.405d, SizeUnit.in).convertToPixels(); // 281.0 px: (2505 - 1100) * 0.2
double icspY = -new Size(1.1d, SizeUnit.in).convertToPixels(); // -220.0 px: (100 - 1200) * 0.2
relativeOffsets[86] = new double[] {icspX, icspY};
relativeOffsets[87] = new double[] {icspX + spacing, icspY};
relativeOffsets[88] = new double[] {icspX, icspY + spacing};
@@ -167,8 +174,8 @@ public class ArduinoMega extends AbstractMakerBoard {
relativeOffsets[91] = new double[] {icspX + spacing, icspY + 2 * spacing};
// Top-Left ICSP header (2x3 pins, 92..97) for ATmega16U2 near USB jack at (820, 1870) mils
double icsp2X = (820 - 1100) * 0.2; // -56.0 px
double icsp2Y = (100 - 1870) * 0.2; // -354.0 px
double icsp2X = -new Size(0.28d, SizeUnit.in).convertToPixels(); // -56.0 px: (820 - 1100) * 0.2
double icsp2Y = -new Size(1.77d, SizeUnit.in).convertToPixels(); // -354.0 px: (100 - 1870) * 0.2
relativeOffsets[92] = new double[] {icsp2X, icsp2Y};
relativeOffsets[93] = new double[] {icsp2X, icsp2Y + spacing};
relativeOffsets[94] = new double[] {icsp2X - spacing, icsp2Y};
@@ -184,23 +191,38 @@ public class ArduinoMega extends AbstractMakerBoard {
Point2D p0 = controlPoints[0];
double x = p0.getX();
double y = p0.getY();
double boardX = x - 220.0;
double boardY = y - 400.0;
double boardX = x - new Size(1.1d, SizeUnit.in).convertToPixels();
double boardY = y - new Size(2.0d, SizeUnit.in).convertToPixels();
double boardW = BOARD_WIDTH.convertToPixels();
double boardH = BOARD_HEIGHT.convertToPixels();
double notchInset = new Size(0.1d, SizeUnit.in).convertToPixels();
double topCutoff = new Size(0.16d, SizeUnit.in).convertToPixels();
double y12 = new Size(0.06d, SizeUnit.in).convertToPixels();
double y102 = new Size(0.51d, SizeUnit.in).convertToPixels();
double y122 = new Size(0.61d, SizeUnit.in).convertToPixels();
double y380 = new Size(1.9d, SizeUnit.in).convertToPixels();
double y400 = new Size(2.0d, SizeUnit.in).convertToPixels();
double cornerRadius = new Size(1.0d, SizeUnit.mm).convertToPixels();
double c1 = cornerRadius * (1 - 0.5523);
double c2 = cornerRadius * 0.5523;
double y412 = boardH - cornerRadius;
Path2D.Double path = new Path2D.Double();
path.moveTo(boardX + 767.78, boardY + 0.00);
path.lineTo(boardX + 779.78, boardY + 12.00);
path.lineTo(boardX + 779.78, boardY + 102.00);
path.lineTo(boardX + 799.78, boardY + 122.00);
path.lineTo(boardX + 799.78, boardY + 380.00);
path.lineTo(boardX + 779.78, boardY + 400.00);
path.lineTo(boardX + 779.78, boardY + 412.00);
path.curveTo(boardX + 779.78, boardY + 416.44, boardX + 776.22, boardY + 419.78, boardX + 772.00, boardY + 419.78);
path.lineTo(boardX + 7.78, boardY + 419.78);
path.curveTo(boardX + 3.33, boardY + 419.78, boardX + 0.00, boardY + 416.22, boardX + 0.00, boardY + 412.00);
path.lineTo(boardX + 0.00, boardY + 7.78);
path.curveTo(boardX + 0.00, boardY + 3.33, boardX + 3.56, boardY + 0.00, boardX + 7.78, boardY + 0.00);
path.lineTo(boardX + 767.78, boardY + 0.00);
path.moveTo(boardX + boardW - topCutoff, boardY);
path.lineTo(boardX + boardW - notchInset, boardY + y12);
path.lineTo(boardX + boardW - notchInset, boardY + y102);
path.lineTo(boardX + boardW, boardY + y122);
path.lineTo(boardX + boardW, boardY + y380);
path.lineTo(boardX + boardW - notchInset, boardY + y400);
path.lineTo(boardX + boardW - notchInset, boardY + y412);
path.curveTo(boardX + boardW - notchInset, boardY + boardH - c1, boardX + boardW - notchInset - c2, boardY + boardH, boardX + boardW - notchInset - cornerRadius, boardY + boardH);
path.lineTo(boardX + cornerRadius, boardY + boardH);
path.curveTo(boardX + c1, boardY + boardH, boardX, boardY + boardH - c1, boardX, boardY + boardH - cornerRadius);
path.lineTo(boardX, boardY + cornerRadius);
path.curveTo(boardX, boardY + c1, boardX + c1, boardY, boardX + cornerRadius, boardY);
path.lineTo(boardX + boardW - topCutoff, boardY);
path.closePath();
return path;
}
@@ -221,8 +243,8 @@ public class ArduinoMega extends AbstractMakerBoard {
g2d.rotate(orientation.toRadians(), x, y);
}
double boardX = x - 220.0;
double boardY = y - 400.0;
double boardX = x - new Size(1.1d, SizeUnit.in).convertToPixels();
double boardY = y - new Size(2.0d, SizeUnit.in).convertToPixels();
Shape boardShape = getBodyShape();
@@ -240,42 +262,62 @@ public class ArduinoMega extends AbstractMakerBoard {
if (!outlineMode) {
// Mounting holes (6 mounting holes from technical design)
drawMountingHole(g2d, boardX + 110, boardY + 400, 24); // (550, 100 mils)
drawMountingHole(g2d, boardX + 120, boardY + 20, 24); // (600, 2000 mils)
drawMountingHole(g2d, boardX + 520, boardY + 140, 24); // (2600, 1400 mils)
drawMountingHole(g2d, boardX + 520, boardY + 360, 24); // (2600, 300 mils)
drawMountingHole(g2d, boardX + 710, boardY + 20, 24); // (3550, 2000 mils)
drawMountingHole(g2d, boardX + 760, boardY + 400, 24); // (3800, 100 mils)
double holeDiameter = new Size(0.12d, SizeUnit.in).convertToPixels();
drawMountingHole(g2d, boardX + new Size(0.55d, SizeUnit.in).convertToPixels(), boardY + new Size(2.0d, SizeUnit.in).convertToPixels(), holeDiameter); // (550, 100 mils)
drawMountingHole(g2d, boardX + new Size(0.6d, SizeUnit.in).convertToPixels(), boardY + new Size(0.1d, SizeUnit.in).convertToPixels(), holeDiameter); // (600, 2000 mils)
drawMountingHole(g2d, boardX + new Size(2.6d, SizeUnit.in).convertToPixels(), boardY + new Size(0.7d, SizeUnit.in).convertToPixels(), holeDiameter); // (2600, 1400 mils)
drawMountingHole(g2d, boardX + new Size(2.6d, SizeUnit.in).convertToPixels(), boardY + new Size(1.8d, SizeUnit.in).convertToPixels(), holeDiameter); // (2600, 300 mils)
drawMountingHole(g2d, boardX + new Size(3.55d, SizeUnit.in).convertToPixels(), boardY + new Size(0.1d, SizeUnit.in).convertToPixels(), holeDiameter); // (3550, 2000 mils)
drawMountingHole(g2d, boardX + new Size(3.8d, SizeUnit.in).convertToPixels(), boardY + new Size(2.0d, SizeUnit.in).convertToPixels(), holeDiameter); // (3800, 100 mils)
// USB Type-B Jack & DC Power Jack
drawMetalConnector(g2d, boardX - 28, boardY + 75, 103, 90, "USB");
drawChip(g2d, boardX - 14, boardY + 325, 104, 70, "DC IN");
drawMetalConnector(g2d, boardX - new Size(0.14d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.375d, SizeUnit.in).convertToPixels(),
new Size(0.515d, SizeUnit.in).convertToPixels(),
new Size(0.45d, SizeUnit.in).convertToPixels(), "USB");
drawChip(g2d, boardX - new Size(0.07d, SizeUnit.in).convertToPixels(),
boardY + new Size(1.625d, SizeUnit.in).convertToPixels(),
new Size(0.52d, SizeUnit.in).convertToPixels(),
new Size(0.35d, SizeUnit.in).convertToPixels(), "DC IN");
// ATmega2560 square QFP chip
drawChip(g2d, boardX + 365, boardY + 165, 80, 80, "ATmega2560");
drawChip(g2d, boardX + new Size(1.825d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.825d, SizeUnit.in).convertToPixels(),
new Size(0.4d, SizeUnit.in).convertToPixels(),
new Size(0.4d, SizeUnit.in).convertToPixels(), "ATmega2560");
// Reset Button near USB
g2d.setColor(Color.decode("#CC3333"));
g2d.fill(new Ellipse2D.Double(boardX + 38, boardY + 20, 18, 18));
g2d.setColor(Color.WHITE);
double rstBtnSize = new Size(0.09d, SizeUnit.in).convertToPixels();
g2d.setColor(RESET_BTN_COLOR);
g2d.fill(new Ellipse2D.Double(boardX + new Size(0.19d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.1d, SizeUnit.in).convertToPixels(), rstBtnSize, rstBtnSize));
g2d.setColor(SILK_COLOR);
g2d.setFont(SILK_FONT_SMALL);
StringUtils.drawCenteredText(g2d, "RST", boardX + 47, boardY + 48, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "RST", boardX + new Size(0.235d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.24d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
// Arduino Infinity Logo
drawArduinoLogo(g2d, boardX + 240, boardY + 80);
drawArduinoLogo(g2d, boardX + new Size(1.2d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.4d, SizeUnit.in).convertToPixels());
// Silkscreen text & branding
g2d.setColor(Color.WHITE);
g2d.setColor(SILK_COLOR);
g2d.setFont(SILK_FONT_LARGE);
StringUtils.drawCenteredText(g2d, "ARDUINO", boardX + 288, boardY + 145, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "MEGA 2560", boardX + 288, boardY + 165, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "ARDUINO", boardX + new Size(1.44d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.725d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "MEGA 2560", boardX + new Size(1.44d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.825d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
// Header silkscreen labels
g2d.setFont(SILK_FONT_SMALL);
StringUtils.drawCenteredText(g2d, "POWER", boardX + 290, boardY + 370, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "ANALOG IN", boardX + 630, boardY + 370, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "DIGITAL (PWM ~)", boardX + 370, boardY + 55, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "COMMUNICATION", boardX + 610, boardY + 55, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "POWER", boardX + new Size(1.45d, SizeUnit.in).convertToPixels(),
boardY + new Size(1.85d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "ANALOG IN", boardX + new Size(3.15d, SizeUnit.in).convertToPixels(),
boardY + new Size(1.85d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "DIGITAL (PWM ~)", boardX + new Size(1.85d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.275d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "COMMUNICATION", boardX + new Size(3.05d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.275d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
}
g2d.setTransform(oldTx);
@@ -333,7 +375,7 @@ public class ArduinoMega extends AbstractMakerBoard {
drawArduinoLogo(g2d, logoX, logoY, scale);
// MEGA text below logo
g2d.setColor(Color.WHITE);
g2d.setColor(SILK_COLOR);
int fontSize = Math.max(6, (int) Math.round(boardH * 0.26));
g2d.setFont(new Font("SansSerif", Font.BOLD, fontSize));
double textY = logoY + logoH + (boardY + boardH - (logoY + logoH)) / 2.0;
@@ -61,6 +61,8 @@ public class ArduinoUno extends AbstractMakerBoard {
public static Color ARDUINO_BLUE = Color.decode("#00878F");
public static Color ITALIAN_TEAL = Color.decode("#00979D");
public static Color RESET_BTN_COLOR = Color.decode("#CC3333");
public static Color SILK_COLOR = Color.WHITE;
public static Size BOARD_WIDTH = new Size(68.6d, SizeUnit.mm);
public static Size BOARD_HEIGHT = new Size(53.4d, SizeUnit.mm);
@@ -98,9 +100,10 @@ public class ArduinoUno extends AbstractMakerBoard {
@Override
protected void updateControlPoints() {
Point2D firstPoint = controlPoints[0];
double spacing = PIN_SPACING.convertToPixels(); // 20px for 0.1"
double spacing = PIN_SPACING.convertToPixels(); // 20px for 0.1" (100 mils)
double gap02 = new Size(0.2d, SizeUnit.in).convertToPixels(); // 40px for 0.2"
// Reference: Pin 0 (NC) is at (boardX + 219.78, boardY + 400.00)
// Reference: Pin 0 (NC) is at (boardX + 220.0, boardY + 400.0) [1100 mils, 100 mils from bottom-left]
// Board is 539.78px wide, 419.78px high
double[][] relativeOffsets = new double[PIN_NAMES.length][2];
@@ -110,28 +113,30 @@ public class ArduinoUno extends AbstractMakerBoard {
relativeOffsets[i][1] = 0;
}
// Analog pins 8..13 (bottom right row, separated from VIN by 0.2" = 40px)
double analogStartX = 7 * spacing + 40; // 180px
double analogStartX = 7 * spacing + gap02; // 180px
for (int i = 0; i < 6; i++) {
relativeOffsets[8 + i][0] = analogStartX + i * spacing;
relativeOffsets[8 + i][1] = 0;
}
// Digital Low pins 14..21 (top right row: D0..D7)
double topRowY = -380;
double d0X = 280; // aligns with A5
double topRowY = -new Size(1.9d, SizeUnit.in).convertToPixels(); // -380px
double d0X = new Size(1.4d, SizeUnit.in).convertToPixels(); // 280px (aligns with A5)
for (int i = 0; i < 8; i++) {
relativeOffsets[14 + i][0] = d0X - i * spacing;
relativeOffsets[14 + i][1] = topRowY;
}
// Digital High pins 22..31 (top left row: D8..D13, GND, AREF, SDA, SCL)
// Gap between D7 (140px) and D8 is 0.16" = 32px
double d8X = 140 - 32; // 108px
double d7X = 7 * spacing; // 140px
double d7d8Gap = new Size(0.16d, SizeUnit.in).convertToPixels(); // 32px
double d8X = d7X - d7d8Gap; // 108px
for (int i = 0; i < 10; i++) {
relativeOffsets[22 + i][0] = d8X - i * spacing;
relativeOffsets[22 + i][1] = topRowY;
}
// Main ICSP header (2x3 pins, 32..37) located on right side of board
double icspX = (257.7 - 131.2) * (20.0 / 9.0); // 281.11 px
double icspY = (91.0 - 190.0) * (20.0 / 9.0); // -220.00 px
double icspX = new Size(1.405d, SizeUnit.in).convertToPixels(); // 281.0 px
double icspY = -new Size(1.1d, SizeUnit.in).convertToPixels(); // -220.0 px
relativeOffsets[32] = new double[] {icspX, icspY};
relativeOffsets[33] = new double[] {icspX + spacing, icspY};
relativeOffsets[34] = new double[] {icspX, icspY + spacing};
@@ -140,8 +145,8 @@ public class ArduinoUno extends AbstractMakerBoard {
relativeOffsets[37] = new double[] {icspX + spacing, icspY + 2 * spacing};
// Top-Left ICSP header (2x3 pins, 38..43) for ATmega16U2
double icsp2X = (106.0 - 131.2) * (20.0 / 9.0); // -56.00 px
double icsp2Y = (30.7 - 190.0) * (20.0 / 9.0); // -354.00 px
double icsp2X = -new Size(0.28d, SizeUnit.in).convertToPixels(); // -56.0 px
double icsp2Y = -new Size(1.77d, SizeUnit.in).convertToPixels(); // -354.0 px
relativeOffsets[38] = new double[] {icsp2X, icsp2Y};
relativeOffsets[39] = new double[] {icsp2X, icsp2Y + spacing};
relativeOffsets[40] = new double[] {icsp2X - spacing, icsp2Y};
@@ -157,23 +162,38 @@ public class ArduinoUno extends AbstractMakerBoard {
Point2D p0 = controlPoints[0];
double x = p0.getX();
double y = p0.getY();
double boardX = x - (131.2 - 32.3) * (20.0 / 9.0); // x - 219.78
double boardY = y - (190.0 - 10.0) * (20.0 / 9.0); // y - 400.00
double boardX = x - new Size(1.1d, SizeUnit.in).convertToPixels();
double boardY = y - new Size(2.0d, SizeUnit.in).convertToPixels();
double boardW = BOARD_WIDTH.convertToPixels();
double boardH = BOARD_HEIGHT.convertToPixels();
double notchInset = new Size(0.1d, SizeUnit.in).convertToPixels();
double topCutoff = new Size(0.16d, SizeUnit.in).convertToPixels();
double y12 = new Size(0.06d, SizeUnit.in).convertToPixels();
double y102 = new Size(0.51d, SizeUnit.in).convertToPixels();
double y122 = new Size(0.61d, SizeUnit.in).convertToPixels();
double y380 = new Size(1.9d, SizeUnit.in).convertToPixels();
double y400 = new Size(2.0d, SizeUnit.in).convertToPixels();
double cornerRadius = new Size(1.0d, SizeUnit.mm).convertToPixels();
double c1 = cornerRadius * (1 - 0.5523);
double c2 = cornerRadius * 0.5523;
double y412 = boardH - cornerRadius;
Path2D.Double path = new Path2D.Double();
path.moveTo(boardX + 507.78, boardY + 0.00);
path.lineTo(boardX + 519.78, boardY + 12.00);
path.lineTo(boardX + 519.78, boardY + 102.00);
path.lineTo(boardX + 539.78, boardY + 122.00);
path.lineTo(boardX + 539.78, boardY + 380.00);
path.lineTo(boardX + 519.78, boardY + 400.00);
path.lineTo(boardX + 519.78, boardY + 412.00);
path.curveTo(boardX + 519.78, boardY + 416.44, boardX + 516.22, boardY + 419.78, boardX + 512.00, boardY + 419.78);
path.lineTo(boardX + 7.78, boardY + 419.78);
path.curveTo(boardX + 3.33, boardY + 419.78, boardX + 0.00, boardY + 416.22, boardX + 0.00, boardY + 412.00);
path.lineTo(boardX + 0.00, boardY + 7.78);
path.curveTo(boardX + 0.00, boardY + 3.33, boardX + 3.56, boardY + 0.00, boardX + 7.78, boardY + 0.00);
path.lineTo(boardX + 507.78, boardY + 0.00);
path.moveTo(boardX + boardW - topCutoff, boardY);
path.lineTo(boardX + boardW - notchInset, boardY + y12);
path.lineTo(boardX + boardW - notchInset, boardY + y102);
path.lineTo(boardX + boardW, boardY + y122);
path.lineTo(boardX + boardW, boardY + y380);
path.lineTo(boardX + boardW - notchInset, boardY + y400);
path.lineTo(boardX + boardW - notchInset, boardY + y412);
path.curveTo(boardX + boardW - notchInset, boardY + boardH - c1, boardX + boardW - notchInset - c2, boardY + boardH, boardX + boardW - notchInset - cornerRadius, boardY + boardH);
path.lineTo(boardX + cornerRadius, boardY + boardH);
path.curveTo(boardX + c1, boardY + boardH, boardX, boardY + boardH - c1, boardX, boardY + boardH - cornerRadius);
path.lineTo(boardX, boardY + cornerRadius);
path.curveTo(boardX, boardY + c1, boardX + c1, boardY, boardX + cornerRadius, boardY);
path.lineTo(boardX + boardW - topCutoff, boardY);
path.closePath();
return path;
}
@@ -195,8 +215,8 @@ public class ArduinoUno extends AbstractMakerBoard {
}
// Board bounding origin
double boardX = x - (131.2 - 32.3) * (20.0 / 9.0); // x - 219.78
double boardY = y - (190.0 - 10.0) * (20.0 / 9.0); // y - 400.00
double boardX = x - new Size(1.1d, SizeUnit.in).convertToPixels();
double boardY = y - new Size(2.0d, SizeUnit.in).convertToPixels();
Shape boardShape = getBodyShape();
@@ -214,40 +234,59 @@ public class ArduinoUno extends AbstractMakerBoard {
if (!outlineMode) {
// Mounting holes
drawMountingHole(g2d, boardX + 120, boardY + 20, 24);
drawMountingHole(g2d, boardX + 110, boardY + 400, 24);
drawMountingHole(g2d, boardX + 520, boardY + 140, 24);
drawMountingHole(g2d, boardX + 520, boardY + 360, 24);
double holeDiameter = new Size(0.12d, SizeUnit.in).convertToPixels();
drawMountingHole(g2d, boardX + new Size(0.6d, SizeUnit.in).convertToPixels(), boardY + new Size(0.1d, SizeUnit.in).convertToPixels(), holeDiameter);
drawMountingHole(g2d, boardX + new Size(0.55d, SizeUnit.in).convertToPixels(), boardY + new Size(2.0d, SizeUnit.in).convertToPixels(), holeDiameter);
drawMountingHole(g2d, boardX + new Size(2.6d, SizeUnit.in).convertToPixels(), boardY + new Size(0.7d, SizeUnit.in).convertToPixels(), holeDiameter);
drawMountingHole(g2d, boardX + new Size(2.6d, SizeUnit.in).convertToPixels(), boardY + new Size(1.8d, SizeUnit.in).convertToPixels(), holeDiameter);
// USB Type-B Jack & DC Power Jack
drawMetalConnector(g2d, boardX - 28, boardY + 75, 102, 90, "USB");
drawChip(g2d, boardX - 14, boardY + 323, 104, 71, "DC IN");
drawMetalConnector(g2d, boardX - new Size(0.14d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.375d, SizeUnit.in).convertToPixels(),
new Size(0.51d, SizeUnit.in).convertToPixels(),
new Size(0.45d, SizeUnit.in).convertToPixels(), "USB");
drawChip(g2d, boardX - new Size(0.07d, SizeUnit.in).convertToPixels(),
boardY + new Size(1.615d, SizeUnit.in).convertToPixels(),
new Size(0.52d, SizeUnit.in).convertToPixels(),
new Size(0.355d, SizeUnit.in).convertToPixels(), "DC IN");
// ATmega328P DIP chip
drawChip(g2d, boardX + 219, boardY + 269, 292, 44, "ATmega328P");
drawChip(g2d, boardX + new Size(1.095d, SizeUnit.in).convertToPixels(),
boardY + new Size(1.345d, SizeUnit.in).convertToPixels(),
new Size(1.46d, SizeUnit.in).convertToPixels(),
new Size(0.22d, SizeUnit.in).convertToPixels(), "ATmega328P");
// Reset Button near USB
g2d.setColor(Color.decode("#CC3333"));
g2d.fill(new Ellipse2D.Double(boardX + 38, boardY + 20, 18, 18));
g2d.setColor(Color.WHITE);
double rstBtnSize = new Size(0.09d, SizeUnit.in).convertToPixels();
g2d.setColor(RESET_BTN_COLOR);
g2d.fill(new Ellipse2D.Double(boardX + new Size(0.19d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.1d, SizeUnit.in).convertToPixels(), rstBtnSize, rstBtnSize));
g2d.setColor(SILK_COLOR);
g2d.setFont(SILK_FONT_SMALL);
StringUtils.drawCenteredText(g2d, "RST", boardX + 47, boardY + 48, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "RST", boardX + new Size(0.235d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.24d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
// Arduino Infinity Logo
drawArduinoLogo(g2d, boardX + 252.00, boardY + 88.22);
drawArduinoLogo(g2d, boardX + new Size(1.26d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.4411d, SizeUnit.in).convertToPixels());
// Silkscreen text & branding
g2d.setColor(Color.WHITE);
g2d.setColor(SILK_COLOR);
g2d.setFont(SILK_FONT_LARGE);
StringUtils.drawCenteredText(g2d, "ARDUINO", boardX + 300, boardY + 155, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "ARDUINO", boardX + new Size(1.5d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.775d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
g2d.setFont(SILK_FONT_LARGE);
StringUtils.drawCenteredText(g2d, "UNO", boardX + 405, boardY + 111, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "UNO", boardX + new Size(2.025d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.555d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
// Header silkscreen labels
g2d.setFont(SILK_FONT_SMALL);
StringUtils.drawCenteredText(g2d, "POWER", boardX + 290, boardY + 370, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "ANALOG IN", boardX + 450, boardY + 370, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "DIGITAL (PWM ~)", boardX + 410, boardY + 55, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "POWER", boardX + new Size(1.45d, SizeUnit.in).convertToPixels(),
boardY + new Size(1.85d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "ANALOG IN", boardX + new Size(2.25d, SizeUnit.in).convertToPixels(),
boardY + new Size(1.85d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "DIGITAL (PWM ~)", boardX + new Size(2.05d, SizeUnit.in).convertToPixels(),
boardY + new Size(0.275d, SizeUnit.in).convertToPixels(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
}
g2d.setTransform(oldTx);
@@ -305,7 +344,7 @@ public class ArduinoUno extends AbstractMakerBoard {
drawArduinoLogo(g2d, logoX, logoY, scale);
// UNO text below logo
g2d.setColor(Color.WHITE);
g2d.setColor(SILK_COLOR);
int fontSize = Math.max(7, (int) Math.round(boardH * 0.28));
g2d.setFont(new Font("SansSerif", Font.BOLD, fontSize));
double textY = logoY + logoH + (boardY + boardH - (logoY + logoH)) / 2.0;