From 92f9c0c89a5b0de5332cab1d198136e2f91c1b7b Mon Sep 17 00:00:00 2001 From: Bane Stojkovic Date: Mon, 12 Dec 2022 01:03:07 +0100 Subject: [PATCH] Added 'PCB Terminal Block' component --- .../src/org/diylc/presenter/update.xml | 6 +- diylc/diylc-library/lib/diylc-core.jar | Bin 391620 -> 391630 bytes .../connectivity/PCBTerminalBlock.java | 325 ++++++++++++++++++ .../PCBTerminalBlockTransformer.java | 109 ++++++ diylc/diylc-swing/dict.txt | 5 + diylc/diylc-swing/lib/diylc-core.jar | Bin 391620 -> 391630 bytes diylc/diylc-swing/library/main.jar | Bin 912589 -> 921388 bytes 7 files changed, 444 insertions(+), 1 deletion(-) create mode 100644 diylc/diylc-library/src/org/diylc/components/connectivity/PCBTerminalBlock.java create mode 100644 diylc/diylc-library/src/org/diylc/components/transform/PCBTerminalBlockTransformer.java diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index c249d74c..614d3cd9 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -4237,7 +4237,11 @@ NEW_FEATURE Added 'Solder Lug' component - + + + NEW_FEATURE + Added 'PCB Terminal Block' component + IMPROVEMENT Use scroll buttons in 'Tabbed Toolbar' instead of arranging tabs into multiple lines when the screen is not large enough to show them all diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index e1e1e0251edc827cdc4ea21cbd4d0c6753095e30..f75afc7a096e99149fc18cea62a1bf692f72c6a7 100644 GIT binary patch delta 8017 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 delta 8182 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 D5olud diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/PCBTerminalBlock.java b/diylc/diylc-library/src/org/diylc/components/connectivity/PCBTerminalBlock.java new file mode 100644 index 00000000..24453970 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/PCBTerminalBlock.java @@ -0,0 +1,325 @@ +/* + * + * 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.connectivity; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +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.components.connectivity.PCBTerminalBlock.PCBTerminalBlockCount; +import org.diylc.components.transform.PCBTerminalBlockTransformer; +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 = "PCB Terminal Block", category = "Connectivity", + author = "Branislav Stojkovic", description = "Horizontal PCB terminal block with 5mm pitch", + zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "TB", autoEdit = false, + enableCache = true, transformer = PCBTerminalBlockTransformer.class) +public class PCBTerminalBlock extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + private static Size SPACING = new Size(5d, SizeUnit.mm); + private static Size WIDTH = new Size(7.7d, SizeUnit.mm); + private static Size CIRCLE_SIZE = new Size(3d, SizeUnit.mm); + private static Size OFFSET = new Size(4.5d, SizeUnit.mm); + + private static Color BODY_COLOR = Color.decode("#90AB66"); + private static Color BORDER_COLOR = BODY_COLOR.darker(); + private static Color CIRCLE_COLOR = LIGHT_METAL_COLOR; + + protected Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0)}; + transient protected Shape[] body; + protected PCBTerminalBlockCount count = PCBTerminalBlockCount._3; + private Orientation orientation = Orientation.DEFAULT; + + private Color bodyColor = BODY_COLOR; + private Color borderColor = BORDER_COLOR; + + public PCBTerminalBlock() { + super(); + updateControlPoints(); + } + + private void updateControlPoints() { + Point2D firstPoint = controlPoints[0]; + int spacing = (int) SPACING.convertToPixels(); + controlPoints = new Point2D[count.getCount()]; + controlPoints[0] = firstPoint; + + for (int i = 1; i < controlPoints.length; i++) { + controlPoints[i] = new Point2D.Double(firstPoint.getX(), firstPoint.getY() + spacing * i); + } + + if (orientation != Orientation.DEFAULT) { + AffineTransform xform = AffineTransform.getRotateInstance(orientation.toRadians(), + firstPoint.getX(), firstPoint.getY()); + for (int i = 1; i < controlPoints.length; i++) { + xform.transform(controlPoints[i], controlPoints[i]); + } + } + } + + @Override + public Point2D 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 int getControlPointCount() { + return controlPoints.length; + } + + @Override + public void setControlPoint(Point2D point, int index) { + controlPoints[index].setLocation(point); + // Reset body shape. + body = null; + } + + @EditableProperty(name = "Pins") + @Override + public PCBTerminalBlockCount getValue() { + return count; + } + + @Override + public void setValue(PCBTerminalBlockCount value) { + this.count = value; + updateControlPoints(); + // Reset body shape. + body = null; + } + + @EditableProperty + public Orientation getOrientation() { + if (orientation == null) { + orientation = Orientation.DEFAULT; + } + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + updateControlPoints(); + // Reset body shape. + body = null; + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, + Project project, IDrawingObserver drawingObserver) { + if (checkPointsClipped(g2d.getClip())) { + return; + } + Shape[] body = getBody(); + Theme theme = (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, + Constants.DEFAULT_THEME); + // Draw body if available. + if (body != null) { + 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 : getBodyColor()); + g2d.fill(body[0]); + g2d.setComposite(oldComposite); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + Color finalBorderColor; + if (outlineMode) { + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING + ? SELECTION_COLOR + : theme.getOutlineColor(); + } else { + g2d.setColor(getBorderColor()); + g2d.draw(body[1]); + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING + ? SELECTION_COLOR + : getBorderColor(); + } + g2d.setColor(finalBorderColor); + g2d.draw(body[0]); + } + // Do not track these changes because the whole switch has been tracked + // so far. + drawingObserver.stopTracking(); + // Draw lugs. + int circleDiameter = getClosestOdd((int) CIRCLE_SIZE.convertToPixels()); + + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(2f)); + for (Point2D p : controlPoints) { + if (outlineMode) { + // g2d.setColor(Constants.TRANSPARENT_COLOR); + // drawingObserver.startTrackingContinuityArea(true); + // g2d.fillRect((int)(p.getX() - lugWidth / 2), (int)(p.getY() - lugHeight / 2), lugWidth, + // lugHeight); + // drawingObserver.stopTrackingContinuityArea(); + + g2d.setColor(theme.getOutlineColor()); + } else { + g2d.setColor(CIRCLE_COLOR); + g2d.fillOval((int) (p.getX() - circleDiameter / 2), (int) (p.getY() - circleDiameter / 2), + circleDiameter, circleDiameter); + + g2d.setColor(CIRCLE_COLOR.darker()); + g2d.drawLine((int) (p.getX() + Math.cos(Math.PI / 4) * circleDiameter / 2), + (int) (p.getY() + Math.sin(Math.PI / 4) * circleDiameter / 2), + (int) (p.getX() + Math.cos(5 * Math.PI / 4) * circleDiameter / 2), + (int) (p.getY() + Math.sin(5 * Math.PI / 4) * circleDiameter / 2)); + } + } + } + + public Shape[] getBody() { + if (body == null) { + body = new Shape[2]; + Point2D firstPoint = controlPoints[0]; + int spacing = (int) SPACING.convertToPixels(); + int pointCount = count.getCount(); + int width = (int) WIDTH.convertToPixels(); + int offset = (int) OFFSET.convertToPixels(); + + body[0] = new Rectangle2D.Double(firstPoint.getX() - offset, firstPoint.getY() - spacing / 2, + width, pointCount * spacing); + body[1] = new Rectangle2D.Double(firstPoint.getX() - spacing / 2, firstPoint.getY() - spacing / 2, + spacing, pointCount * spacing); + + if (orientation != Orientation.DEFAULT) { + AffineTransform xform = AffineTransform.getRotateInstance(orientation.toRadians(), + firstPoint.getX(), firstPoint.getY()); + Area b = new Area(body[0]); + b.transform(xform); + body[0] = b; + + b = new Area(body[1]); + b.transform(xform); + body[1] = b; + } + } + return body; + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int circleSize = 6 * width / 32; + g2d.setColor(BODY_COLOR); + g2d.fillRect((int) (width / 4d - 2), 1, width / 2, height - 2); + g2d.setColor(BORDER_COLOR); + g2d.drawRect((int) (width / 4d - 2), 1, width / 2, height - 2); + g2d.drawRect((int) (width / 3d), 1, (int) (width / 3d), height - 2); + for (int i = 1; i <= 3; i++) { + g2d.setColor(CIRCLE_COLOR); + g2d.fillOval(width / 2 - circleSize / 2, (int) (i * height / 4d - circleSize / 2), circleSize, circleSize); + } + } + + @EditableProperty(name = "Body") + public Color getBodyColor() { + if (bodyColor == null) + bodyColor = BODY_COLOR; + return bodyColor; + } + + public void setBodyColor(Color bodyColor) { + this.bodyColor = bodyColor; + } + + @EditableProperty(name = "Border") + public Color getBorderColor() { + if (borderColor == null) + borderColor = BORDER_COLOR; + return borderColor; + } + + public void setBorderColor(Color borderColor) { + this.borderColor = borderColor; + } + + + @Override + public String getControlPointNodeName(int index) { + // we don't want the block to produce any nodes, it just makes connections + return null; + } + + @Override + public boolean canPointMoveFreely(int pointIndex) { + return false; + } + + @Override + public Rectangle2D getCachingBounds() { + int margin = 20; + Rectangle2D bounds = getBody()[0].getBounds2D(); + return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, + bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin); + } + + static enum PCBTerminalBlockCount { + _2("Two"), _3("Three"), _4("Four"), _5("Five"), _6("Six"), _7("Seven"), _8("Eight"), _9( + "Nine"), _10("Ten"); + + private String label; + + PCBTerminalBlockCount(String label) { + this.label = label; + } + + public int getCount() { + return Integer.parseInt(name().substring(1)); + } + + @Override + public String toString() { + return label; + } + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/transform/PCBTerminalBlockTransformer.java b/diylc/diylc-library/src/org/diylc/components/transform/PCBTerminalBlockTransformer.java new file mode 100644 index 00000000..4d251313 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/transform/PCBTerminalBlockTransformer.java @@ -0,0 +1,109 @@ +/* + + 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.transform; + +import java.awt.geom.AffineTransform; +import java.awt.geom.Point2D; +import org.diylc.common.IComponentTransformer; +import org.diylc.common.Orientation; +import org.diylc.components.connectivity.PCBTerminalBlock; +import org.diylc.core.IDIYComponent; + +public class PCBTerminalBlockTransformer implements IComponentTransformer { + + @Override + public boolean canRotate(IDIYComponent component) { + return component.getClass().equals(PCBTerminalBlock.class); + } + + @Override + public boolean canMirror(IDIYComponent component) { + return component.getClass().equals(PCBTerminalBlock.class); + } + + @Override + public boolean mirroringChangesCircuit() { + return false; + } + + @Override + public void rotate(IDIYComponent component, Point2D center, int direction) { + AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2 * direction, center.getX(), center.getY()); + for (int index = 0; index < component.getControlPointCount(); index++) { + Point2D p = new Point2D.Double(); + rotate.transform(component.getControlPoint(index), p); + component.setControlPoint(p, index); + } + + PCBTerminalBlock block = (PCBTerminalBlock) component; + Orientation o = block.getOrientation(); + int oValue = o.ordinal(); + oValue += direction; + if (oValue < 0) + oValue = Orientation.values().length - 1; + if (oValue >= Orientation.values().length) + oValue = 0; + o = Orientation.values()[oValue]; + block.setOrientation(o); + } + + @SuppressWarnings("incomplete-switch") + @Override + public void mirror(IDIYComponent component, Point2D center, int direction) { + PCBTerminalBlock block = (PCBTerminalBlock) component; + double dx = center.getX() - block.getControlPoint(0).getX(); + double dy = center.getY() - block.getControlPoint(0).getY(); + if (direction == IComponentTransformer.HORIZONTAL) { + Orientation o = block.getOrientation(); + switch (o) { + case _90: + o = Orientation._270; + break; + case _270: + o = Orientation._90; + } + + for (int i = 0; i < block.getControlPointCount(); i++) { + Point2D p = block.getControlPoint(i); + block.setControlPoint(new Point2D.Double(p.getX() + 2 * dx, p.getY()), i); + } + + block.setOrientation(o); + } else { + Orientation o = block.getOrientation(); + switch (o) { + case DEFAULT: + o = Orientation._180; + break; + case _180: + o = Orientation.DEFAULT; + } + + for (int i = 0; i < block.getControlPointCount(); i++) { + Point2D p = block.getControlPoint(i); + block.setControlPoint(new Point2D.Double(p.getX(), p.getY() + 2 * dy), i); + } + + block.setOrientation(o); + } + } +} diff --git a/diylc/diylc-swing/dict.txt b/diylc/diylc-swing/dict.txt index 9565c0e9..692971ab 100644 --- a/diylc/diylc-swing/dict.txt +++ b/diylc/diylc-swing/dict.txt @@ -49,6 +49,7 @@ AWG Alternate And Angle Offset +Apply Model B-C-E BJT Background Box @@ -85,6 +86,7 @@ Double Rods Drop E+ E-B-C BJT +Eight English Espaņol Filament Voltage @@ -107,6 +109,7 @@ Maximum number of switching combinations exceeded. Allowed: %s, actual: %s NPN Nand Nederlands +Nine Non-shorting Nor Not @@ -145,6 +148,8 @@ Source Style Source Type Srpski Stroke +TB2 +Ten Terminal Timing Tubular Beveled diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index e1e1e0251edc827cdc4ea21cbd4d0c6753095e30..f75afc7a096e99149fc18cea62a1bf692f72c6a7 100644 GIT binary patch delta 8017 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 delta 8182 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 D5olud diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index c7d64e0598561ee8eb9fb26d91fa178a6c237879..2857fa787715c520670c9adcb29e2730dbd014ec 100644 GIT binary patch delta 25084 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 delta 16072 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 wGj;l%l%W|GOF1t76ccf!5TBN8qpj1H)=m)&Kwi