From aa70df6d9b195dfbba0dfb9233eccf2ae644d183 Mon Sep 17 00:00:00 2001 From: bancika Date: Wed, 1 Apr 2020 20:53:46 +0200 Subject: [PATCH] Added "Pin Header" component --- .../src/org/diylc/presenter/update.xml | 4 + .../electromechanical/PinHeader.java | 300 ++++++++++++++++++ diylc/diylc-swing/library/main.jar | Bin 645271 -> 650908 bytes 3 files changed, 304 insertions(+) create mode 100644 diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index 76a1f2cb..ff3b5f90 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -2781,6 +2781,10 @@ NEW_FEATURE Added "P-0+o (Proto) Board" component by Kristian BlÄsol + + + NEW_FEATURE + Added "Pin Header" component IMPROVEMENT diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java new file mode 100644 index 00000000..8b17aa92 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java @@ -0,0 +1,300 @@ +/* + + 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.electromechanical; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.RoundRectangle2D; + +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.IPlugInPort; +import org.diylc.common.ObjectCache; +import org.diylc.common.Orientation; +import org.diylc.components.AbstractTransparentComponent; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.Theme; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; + +@ComponentDescriptor(name = "Pin Header", author = "Branislav Stojkovic", category = "Electro-Mechanical", + instanceNamePrefix = "PH", description = "PCB mount male pin header with editable number or pins and pin spacing", + zOrder = IDIYComponent.COMPONENT) +public class PinHeader extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + public static Color BODY_COLOR = Color.gray; + public static Color BORDER_COLOR = Color.gray.darker(); + public static Color PIN_COLOR = Color.decode("#00B2EE"); + public static Color PIN_BORDER_COLOR = PIN_COLOR.darker(); + public static Color INDENT_COLOR = Color.gray.darker(); + public static Color LABEL_COLOR = Color.white; + public static int EDGE_RADIUS = 6; + public static Size PIN_SIZE = new Size(0.03d, SizeUnit.in); + public static Size INDENT_SIZE = new Size(0.07d, SizeUnit.in); + public static Size BODY_MARGIN = new Size(0.05d, SizeUnit.in); + + public static Size MINI_PIN_SPACING = new Size(0.2d, SizeUnit.in); + public static Size MINI_ROW_SPACING = new Size(0.3d, SizeUnit.in); + public static Size MINI_WIDTH = new Size(20.1d, SizeUnit.mm); + public static Size MINI_HEIGHT = new Size(9.9d, SizeUnit.mm); + public static Size MINI_GAP = new Size(0.1d, SizeUnit.in); + + public static Size PIN_SPACING = new Size(0.1d, SizeUnit.in); + + private String value = ""; + private Orientation orientation = Orientation.DEFAULT; + + private Point[] controlPoints = new Point[] {new Point(0, 0)}; + private int rowCount = 2; + private int columnCount = 5; + private Size spacing = PIN_SPACING; + + transient private Area[] body; + + public PinHeader() { + super(); + updateControlPoints(); + } + + @EditableProperty + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + updateControlPoints(); + // Reset body shape. + body = null; + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public boolean isControlPointSticky(int index) { + return true; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.NEVER; + } + + @Override + public void setControlPoint(Point point, int index) { + controlPoints[index].setLocation(point); + body = null; + } + + private void updateControlPoints() { + Point firstPoint = controlPoints[0]; + int pinCount = rowCount * columnCount; + controlPoints = new Point[pinCount]; + controlPoints[0] = firstPoint; + double pinSpacing = spacing.convertToPixels(); + + for (int i = 0; i < columnCount; i++) + for (int j = 0; j < rowCount; j++) + controlPoints[i + j * columnCount] = new Point((int)Math.round(firstPoint.x + j * pinSpacing), (int)Math.round(firstPoint.y + i * pinSpacing)); + + // Apply rotation if necessary + double angle = getAngle(); + if (angle != 0) { + AffineTransform rotation = AffineTransform.getRotateInstance(angle, controlPoints[0].x, controlPoints[0].y); + for (int i = 1; i < controlPoints.length; i++) { + rotation.transform(controlPoints[i], controlPoints[i]); + } + } + } + + private double getAngle() { + // Apply rotation if necessary + double angle; + switch (orientation) { + case _90: + angle = Math.PI / 2; + break; + case _180: + angle = Math.PI; + break; + case _270: + angle = Math.PI * 3 / 2; + break; + default: + angle = 0; + } + + return angle; + } + + public Area[] getBody() { + if (body == null) { + body = new Area[2]; + int centerX = (controlPoints[0].x + controlPoints[controlPoints.length - 1].x) / 2; + int centerY = (controlPoints[0].y + controlPoints[controlPoints.length - 1].y) / 2; + double pinSpacing = spacing.convertToPixels(); + double width = Math.abs((controlPoints[0].x - controlPoints[controlPoints.length - 1].x)) + pinSpacing; + double height = Math.abs((controlPoints[0].y - controlPoints[controlPoints.length - 1].y)) + pinSpacing; + body[0] = + new Area(new RoundRectangle2D.Double(centerX - width / 2, centerY - height / 2, width, height, EDGE_RADIUS, + EDGE_RADIUS)); + } + return body; + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + if (checkPointsClipped(g2d.getClip())) { + return; + } + Area mainArea = getBody()[0]; + Composite oldComposite = g2d.getComposite(); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); + } + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : BODY_COLOR); + g2d.fill(mainArea); + g2d.setComposite(oldComposite); + + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + + Theme theme = (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2; + for (Point point : controlPoints) { + if (!outlineMode) { + g2d.setColor(PIN_COLOR); + g2d.fillRect(point.x - pinSize / 2, point.y - pinSize / 2, pinSize, pinSize); + } + g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR); + g2d.drawRect(point.x - pinSize / 2, point.y - pinSize / 2, pinSize, pinSize); + } + + Color finalBorderColor; + if (outlineMode) { + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : theme.getOutlineColor(); + } else { + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : BORDER_COLOR; + } + g2d.setColor(finalBorderColor); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + if (outlineMode) { + Area area = new Area(mainArea); + area.subtract(getBody()[1]); + g2d.draw(area); + } else { + g2d.draw(mainArea); + if (getBody()[1] != null) { + g2d.setColor(INDENT_COLOR); + g2d.fill(getBody()[1]); + } + } + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.setColor(BODY_COLOR); + g2d.fillRect(width / 3, 1, width / 3 + 1, height - 4); + g2d.setColor(BORDER_COLOR); + g2d.drawRect(width / 3, 1, width / 3 + 1, height - 4); + int pinSize = 2 * width / 32; + g2d.setColor(PIN_COLOR); + for (int i = 0; i < 4; i++) { + g2d.fillRect(width / 2 - pinSize - 1, (height / 5) * (i + 1) - 1, pinSize, pinSize); + g2d.fillRect(width / 2 + pinSize, (height / 5) * (i + 1) - 1, pinSize, pinSize); + } + } + + @EditableProperty(name = "Rows") + public int getRowCount() { + return rowCount; + } + public void setRowCount(int rowCount) { + this.rowCount = rowCount; + updateControlPoints(); + // Reset body shape. + body = null; + } + + @EditableProperty(name = "Columns") + public int getColumnCount() { + return columnCount; + } + + public void setColumnCount(int columnCount) { + this.columnCount = columnCount; + updateControlPoints(); + // Reset body shape. + body = null; + } + + @EditableProperty + public Size getSpacing() { + return spacing; + } + + public void setSpacing(Size spacing) { + this.spacing = spacing; + updateControlPoints(); + // Reset body shape. + body = null; + } + + @Override + public boolean canPointMoveFreely(int pointIndex) { + return false; + } +} diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index af23d57ebb29e73efd66e01a4fc9257a78c7cc89..5d32d765b08bbec515e60677d28b6a0841bfa71d 100644 GIT binary patch delta 23619 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 delta 18436 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