From 185eb9d1d3f7902a44f58ccc46152485d160fdbb Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Sun, 13 Jan 2019 11:59:20 +0100 Subject: [PATCH] added IEC socket --- .../org/diylc/components/RoundedPolygon.java | 64 +++ .../electromechanical/IECSocket.java | 405 ++++++++++++++++++ diylc/diylc-swing/library/main.jar | Bin 498522 -> 506726 bytes diylc/diylc-swing/update.xml | 4 + 4 files changed, 473 insertions(+) create mode 100644 diylc/diylc-library/src/org/diylc/components/RoundedPolygon.java create mode 100644 diylc/diylc-library/src/org/diylc/components/electromechanical/IECSocket.java diff --git a/diylc/diylc-library/src/org/diylc/components/RoundedPolygon.java b/diylc/diylc-library/src/org/diylc/components/RoundedPolygon.java new file mode 100644 index 00000000..18e6adca --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/RoundedPolygon.java @@ -0,0 +1,64 @@ +/* + + 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; + +import java.awt.Point; +import java.awt.geom.Path2D; + +public class RoundedPolygon extends Path2D.Double { + + private static final long serialVersionUID = 1L; + + public RoundedPolygon(Point[] points, double[] radiuses) { + super(); + moveTo(points[0].x, points[0].y); + for (int i = 0; i < points.length - 1; i++) { + Point first = points[i]; + Point second = points[i + 1 >= points.length ? i + 1 - points.length : i + 1]; + Point third = points[i + 2 >= points.length ? i + 2 - points.length : i + 2]; + + Point p1 = new Point(0, 0); + Point p2 = new Point(0, 0); + locateTwoPoints(first, second, third, radiuses.length <= i ? radiuses[radiuses.length - 1] : radiuses[i], p1, p2); + lineTo(p1.x, p1.y); + quadTo(second.x, second.y, p2.x, p2.y); + } + closePath(); + } + + private void locateTwoPoints(Point first, Point second, Point third, double radius, Point p1, Point p2) { + double d1 = distance(first, second); + double d2 = distance(second, third); + double t1 = 1 - radius / d1; + double t2 = radius / d2; + interpolate(first, second, t1, p1); + interpolate(second, third, t2, p2); + } + + private void interpolate(Point p1, Point p2, double t, Point p) { + p.setLocation((int)Math.round(p1.x * (1-t) + p2.x * t), (int)Math.round(p1.y * (1-t) + p2.y * t)); + } + + private double distance(Point p1, Point p2) { + return Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/IECSocket.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/IECSocket.java new file mode 100644 index 00000000..b81f2172 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/IECSocket.java @@ -0,0 +1,405 @@ +/* + + 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.Ellipse2D; +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.components.RoundedPolygon; +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 = "IEC Socket", category = "Electro-Mechanical", author = "Branislav Stojkovic", + description = "Panel mounted IEC power socket", stretchable = false, zOrder = IDIYComponent.COMPONENT, + instanceNamePrefix = "IEC", autoEdit = false) +public class IECSocket extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + // common + private static Size HORIZONTAL_SPACING = new Size(0.3d, SizeUnit.in); + private static Size VERTICAL_SPACING = new Size(0.2d, SizeUnit.in); + private static Size LUG_WIDTH = new Size(4d, SizeUnit.mm); + private static Size LUG_THICKNESS = new Size(0.8d, SizeUnit.mm); + + // simple + private static Size SIMPLE_CUTOUT_LENGTH = new Size(27.5d, SizeUnit.mm); + private static Size SIMPLE_CUTOUT_WIDTH = new Size(19.5d, SizeUnit.mm); + private static Size SIMPLE_BASE_LENGTH = new Size(30.8d, SizeUnit.mm); + private static Size SIMPLE_BASE_WIDTH = new Size(22.6d, SizeUnit.mm); + private static Size SIMPLE_BASE_RADIUS = new Size(3d, SizeUnit.mm); + private static Size SIMPLE_CUTOUT_SLANT = new Size(5d, SizeUnit.mm); + private static Size SIMPLE_CUTOUT_RADIUS = new Size(1d, SizeUnit.mm); + private static Size SIMPLE_LENGTH = new Size(50d, SizeUnit.mm); + private static Size SIMPLE_OUTER_RADIUS = new Size(6d, SizeUnit.mm); + private static Size HOLE_SPACING = new Size(40d, SizeUnit.mm); + private static Size HOLE_DIAMETER = new Size(3d, SizeUnit.mm); + + private static Color BODY_COLOR = Color.decode("#555555"); + private static Color BORDER_COLOR = BODY_COLOR.darker(); + + protected Point[] controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0)}; + transient protected Area[] body; + protected String name; + protected String value; + private Orientation orientation = Orientation.DEFAULT; + private boolean hasFuse = false; + + private Color bodyColor = BODY_COLOR; + private Color borderColor = BORDER_COLOR; + + public IECSocket() { + super(); + updateControlPoints(); + } + + @SuppressWarnings("incomplete-switch") + private void updateControlPoints() { + Point firstPoint = controlPoints[0]; + int hSpacing = (int) HORIZONTAL_SPACING.convertToPixels(); + int vSpacing = (int) VERTICAL_SPACING.convertToPixels(); + + controlPoints[1].setLocation(firstPoint.x - hSpacing, firstPoint.y + vSpacing); + controlPoints[2].setLocation(firstPoint.x + hSpacing, firstPoint.y + vSpacing); + + if (orientation != Orientation.DEFAULT) { + double theta = 0; + switch (orientation) { + case _90: + theta = Math.PI / 2; + break; + case _180: + theta = Math.PI; + break; + case _270: + theta = Math.PI * 3 / 2; + break; + } + AffineTransform rotation = AffineTransform.getRotateInstance(theta, firstPoint.x, firstPoint.y); + + for (int i = 1; i < controlPoints.length; i++) { + rotation.transform(controlPoints[i], controlPoints[i]); + } + } + } + + @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 int getControlPointCount() { + return controlPoints.length; + } + + @Override + public void setControlPoint(Point point, int index) { + controlPoints[index].setLocation(point); + // Reset body shape. + body = null; + } + + @EditableProperty + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String getValue() { + return value; + } + + @Override + public void setValue(String value) { + this.value = value; + } + + @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; + } + + @EditableProperty(name = "Fuse") + public boolean getHasFuse() { + return hasFuse; + } + + public void setHasFuse(boolean hasFuse) { + this.hasFuse = hasFuse; + body = null; + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + if (checkPointsClipped(g2d.getClip())) { + return; + } + Area[] 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()); + for (Area a : body) + if (a != null) { + g2d.fill(a); + break; + } + 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 { + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : getBorderColor(); + } + g2d.setColor(finalBorderColor); + for (Area a : body) + if (a != null) + g2d.draw(a); + } + // Do not track these changes because the whole switch has been tracked + // so far. + drawingObserver.stopTracking(); + + // Draw lugs. + int lugWidth = getClosestOdd((int) LUG_WIDTH.convertToPixels()); + int lugHeight = getClosestOdd((int) LUG_THICKNESS.convertToPixels()); + + if (orientation == Orientation._90 || orientation == Orientation._270) { + int p = lugHeight; + lugHeight = lugWidth; + lugWidth = p; + } + + for (Point p : controlPoints) { + if (outlineMode) { + g2d.setColor(theme.getOutlineColor()); + g2d.drawRect(p.x - lugWidth / 2, p.y - lugHeight / 2, lugWidth, lugHeight); + } else { + g2d.setColor(METAL_COLOR); + g2d.fillRect(p.x - lugWidth / 2, p.y - lugHeight / 2, lugWidth, lugHeight); + } + } + } + + @SuppressWarnings("incomplete-switch") + public Area[] getBody() { + if (body == null) { + Point firstPoint = controlPoints[0]; + int vSpacing = (int) VERTICAL_SPACING.convertToPixels(); + + double cutoutRadius; + double cutoutLength; + double cutoutWidth; + double cutoutSlant; + double baseLength; + double baseWidth = SIMPLE_BASE_WIDTH.convertToPixels();; + double baseRadius; + double length; + double outerRadius; + double holeDiameter = HOLE_DIAMETER.convertToPixels(); + double holeSpacing = HOLE_SPACING.convertToPixels(); + + body = new Area[3]; + + if (hasFuse) { + + } else { + cutoutRadius = SIMPLE_CUTOUT_RADIUS.convertToPixels(); + baseRadius = SIMPLE_BASE_RADIUS.convertToPixels(); + cutoutLength = SIMPLE_CUTOUT_LENGTH.convertToPixels(); + cutoutWidth = SIMPLE_CUTOUT_WIDTH.convertToPixels(); + cutoutSlant = SIMPLE_CUTOUT_SLANT.convertToPixels(); + baseLength = SIMPLE_BASE_LENGTH.convertToPixels(); + length = SIMPLE_LENGTH.convertToPixels(); + outerRadius = SIMPLE_OUTER_RADIUS.convertToPixels(); + + Point[] outerPoints = new Point[] { + new Point((int) Math.round(firstPoint.x), (int) Math.round(firstPoint.y + vSpacing / 2 - baseWidth / 2)), + new Point((int) Math.round(firstPoint.x + baseLength / 2), (int) Math.round(firstPoint.y + vSpacing / 2 - baseWidth / 2)), + new Point((int) Math.round(firstPoint.x + length / 2), (int) Math.round(firstPoint.y + vSpacing / 2)), + new Point((int) Math.round(firstPoint.x + baseLength / 2), (int) Math.round(firstPoint.y + vSpacing / 2 + baseWidth / 2)), + new Point((int) Math.round(firstPoint.x - baseLength / 2), (int) Math.round(firstPoint.y + vSpacing / 2 + baseWidth / 2)), + new Point((int) Math.round(firstPoint.x - length / 2), (int) Math.round(firstPoint.y + vSpacing / 2)), + new Point((int) Math.round(firstPoint.x - baseLength / 2), (int) Math.round(firstPoint.y + vSpacing / 2 - baseWidth / 2)), + }; + + double[] outerRadiuses = new double[] { + baseRadius / 2, + outerRadius, + baseRadius / 2, + baseRadius / 2, + outerRadius, + baseRadius / 2 + }; + + body[0] = new Area(new RoundedPolygon(outerPoints, outerRadiuses)); + body[0].subtract(new Area(new Ellipse2D.Double(firstPoint.x - holeSpacing / 2 - holeDiameter / 2, firstPoint.y + vSpacing / 2 - holeDiameter / 2, holeDiameter, holeDiameter))); + body[0].subtract(new Area(new Ellipse2D.Double(firstPoint.x + holeSpacing / 2 - holeDiameter / 2, firstPoint.y + vSpacing / 2 - holeDiameter / 2, holeDiameter, holeDiameter))); + + body[1] = new Area(new RoundRectangle2D.Double(firstPoint.x - baseLength / 2, firstPoint.y + vSpacing / 2 - baseWidth / 2, baseLength, baseWidth, baseRadius, baseRadius)); + + Point[] cutoutPoints = new Point[] { + new Point(firstPoint.x, (int) (firstPoint.y + vSpacing / 2 - cutoutWidth / 2)), + new Point((int) (firstPoint.x + cutoutLength / 2 - cutoutSlant), (int) (firstPoint.y + vSpacing / 2 - cutoutWidth / 2)), + new Point((int) (firstPoint.x + cutoutLength / 2), (int) (firstPoint.y + vSpacing / 2 - cutoutWidth / 2 + cutoutSlant)), + new Point((int) (firstPoint.x + cutoutLength / 2), (int) (firstPoint.y + vSpacing / 2 + cutoutWidth / 2)), + new Point((int) (firstPoint.x - cutoutLength / 2), (int) (firstPoint.y + vSpacing / 2 + cutoutWidth / 2)), + new Point((int) (firstPoint.x - cutoutLength / 2), (int) (firstPoint.y + vSpacing / 2 - cutoutWidth / 2 + cutoutSlant)), + new Point((int) (firstPoint.x - cutoutLength / 2 + cutoutSlant), (int) (firstPoint.y + vSpacing / 2 - cutoutWidth / 2)), + }; + + double[] cutoutRadiuses = new double[] { + cutoutRadius, + }; + + body[2] = new Area(new RoundedPolygon(cutoutPoints, cutoutRadiuses)); + } + + if (orientation != Orientation.DEFAULT) { + double theta = 0; + switch (orientation) { + case _90: + theta = Math.PI / 2; + break; + case _180: + theta = Math.PI; + break; + case _270: + theta = Math.PI * 3 / 2; + break; + } + AffineTransform rotation = AffineTransform.getRotateInstance(theta, firstPoint.x, firstPoint.y); + for (Area a : body) + if (a != null) + a.transform(rotation); + } + } + return body; + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.setColor(BODY_COLOR); + int margin = (int) (2f * width / 32); + int slant = (int) (5f * width / 32); + int terminal = (int) (4f * width / 32); + int terminalSpacingH = (int) (6f * width / 32); + int terminalSpacingV = (int) (4f * width / 32); + RoundedPolygon poly = new RoundedPolygon(new Point[] { + new Point(width / 2, height / 5), + new Point(width - margin - slant, height / 5), + new Point(width - margin, height / 5 + slant), + new Point(width - margin, height * 4 / 5), + new Point(margin, height * 4 / 5), + new Point(margin, height / 5 + slant), + new Point(margin + slant, height / 5), + }, new double[] { 2d }); + g2d.fill(poly); + g2d.setColor(BORDER_COLOR); + g2d.draw(poly); + g2d.setColor(METAL_COLOR); + for (int i = -1; i <= 1; i++) { + g2d.drawLine(width / 2 + terminalSpacingH * i - terminal / 2, height / 2 + terminalSpacingV * Math.abs(i) - terminalSpacingV / 2, + width / 2 + terminalSpacingH * i + terminal / 2, height / 2 + terminalSpacingV * Math.abs(i) - terminalSpacingV / 2); + } + } + + @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; + } +} diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 49440c3a4d329659def0b85b2ae2afcb100c888c..70b4bee886ea2b9bb977184a20ffc228d73dcd78 100644 GIT binary patch delta 26692 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 "Tantalum Capacitor" added + + NEW_FEATURE + "IEC Socket" added + NEW_FEATURE "Logic Gate (symbol)" added with 8 main gate types