From 2d0eb136fe1ca00b3a7010bb04be4a3ef4613eb2 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Mon, 14 Jan 2019 13:40:34 +0100 Subject: [PATCH] "Fuse Holder" added --- diylc/diylc-library/lib/diylc-core.jar | Bin 242795 -> 242795 bytes .../electromechanical/FuseHolderPanel.java | 339 ++++++++++++++++++ diylc/diylc-swing/library/main.jar | Bin 524538 -> 530105 bytes diylc/diylc-swing/update.xml | 4 + 4 files changed, 343 insertions(+) create mode 100644 diylc/diylc-library/src/org/diylc/components/electromechanical/FuseHolderPanel.java diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 9747a846facadbab217bb481f46458d75b234a7b..b2a63ab2ff9fdeb2aefb5bf3c7f734e7eccfe2a9 100644 GIT binary patch delta 4309 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 delta 4309 zcmYjTd0dU@7r)Q*R78>`g_P`t5r*u0gi*J#GufA-sFW7bqJ6I`Z&_L_Wr@mdTv;Y# zm|vPPBbs51ZG3F;8`M~0V&*yLynoC;_xnBjInVaq=TFU_KQ%Yg&J;$iG@6zg%{!iH z=D^?bOy^JXSLe*S11w~H_&ctPVxI#T*g$~CY%oA)J{n*i?+>t@I|D>98(rRwwypn@ zSJ%if%wBv3DLn|H1f>+CAnY$O4q&K}6ToVt0TT2&qYMt%yTv!gpnhcb5a5S4&7i$( zUc&&hEqWONp6M8e^5jls81=^5AJMC;ivWA6ZFiJwyXz6-db*Bi^9==uBW9r`1`DHi}F@qKlFd; zS7-+MtgU@feXd(HyZp`6QsOFzqftRQff@HaEiq zt%tH!Aev>zwFdo;0#AX{rJqf&ER@qtGS)56uvDBPMQgp?furdBW047#tSjz}^2@_i z+NLBK<-^DCVrz*faOL$!^(El1Tln>_0E169L8<-*EUing{0L&&Y1)V4GZvVn^4xSh zG)5P`#bp1x)PVZa)pxLXZVeq0w<{N@%Vbqr@;a<_IzxX@@cEp+$eEv3y| zUw$J6yBPm_F?R9v&Ry)H`krG8=>GNNa?}^spTn-#yr>6R=h1Kg%aN=3Uvm>Qgd)WtX#!W=QMehUi+qI7ZQJq<|_ zECAJ?qL~%0tW`Xd8!l@eOi~9AN@GV*W1q#|U`^|6=1P-APd#?SLfbyl08G;gi3XLm9uOdR=QEe!l*#akXDa{g+}wK ztx}#O3vB+5b;UHg>uj5#bbHTJGL2sOb{Df&HWrB127fzF zgAMD+M^m-w-C}%#rMxmfeS^Fg#*6cMNRqFE^qOS27*BwW2K)Eevk`_%K}I zSVta+75^T{&*N<82JyqF@fym@kjV3pjih`Ok3%wY9QQ?XXd+*Rd0I{3lTqV7jVnl= z&fuv?g59_?W-fE*=I}xo&TF|5lJ7nEUU)+ctLO6ZNQxG40pB9S(ItEZYTB;g~~>A8wWb^vlPnA>BT>JaXTwLt?pwUx&xW@N6ruMomQo*P_NGn&Vf%&?$yn zqGn(m-;JaufnPw9mdp<#8J5O7Viz+rxdHPS>3Ai4lnhmcybLw|`*}@Q(2T9(pV}d* z<&9_>e4V#w51LVrxC}c@D{_tzQ|il0W9zqV*&4Zi-~|e)`^*b8`lZ=Kc$qc z6Vm{tzm3vvz32ym46;$?uNU?pgsqqVmSpDBDt=f`nJ4&&8DLNG5pICDePkyRZGFWU zz^{D8JirQHu>`Q=2ExD%Vm`=MHV7@C-9|$Hjbbjy)f*{qM?WzOim-* z<(=m*Hh}(nf8hn_6d=9?j8XAsfLH+XkWG|7W)sa!$@_De)l|DMq_ z=hw)ll!x81i$CrF{9ZB!7sdy0hX)e;|(f`4C6-=ERf! zXgtl`tm3Q$nsZ+Q_4^@#;0D&%Kf?*F)mH zWO?o-_D+%eEiqWd%PBHW$~LJok3^qTF&VHtRk#2)rOI<5(It)IlU1xuqr9Ed374nK zb1D6frBmGNbn+jSK^U1KZ>qFk&LBU_Op5c&l=~+2hcc;tlZvica(<~V$fCG<6^H03 zf2dBbo3z*H6o;f?lE9*?~w@7qgpje99>Vjks7%%iz~ z&ZB-h<&)oZcu`Ly&cV^4&Wi`;nKc??F1`TMp9Yyme442EB6;$vcbaGBy^8 z6`-G2ES3XS7L(lV5Isf-hr}AtzdA&Z?V`ivckVDYbPssg|`O{C(BY#Jg9rSWNrGB%X*0DxUaa}8f_FqC)9^(K2 diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/FuseHolderPanel.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/FuseHolderPanel.java new file mode 100644 index 00000000..6ba008bf --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/FuseHolderPanel.java @@ -0,0 +1,339 @@ +/* + + 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.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; + +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.Display; +import org.diylc.common.IPlugInPort; +import org.diylc.common.ObjectCache; +import org.diylc.common.Orientation; +import org.diylc.common.OrientationHV; +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 = "Fuse Holder", category = "Electro-Mechanical", author = "Branislav Stojkovic", + description = "Panel mounted fuse holder", stretchable = false, zOrder = IDIYComponent.COMPONENT, + instanceNamePrefix = "FH", autoEdit = false) +public class FuseHolderPanel extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + // common + private static Size 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); + private static Size INNER_DIAMETER = new Size(0.5d, SizeUnit.in); + private static Size OUTER_DIAMETER = new Size(0.6d, SizeUnit.in); + + private static Color BODY_COLOR = Color.decode("#555555"); + private static Color BORDER_COLOR = BODY_COLOR.darker(); + private static Color LABEL_COLOR = Color.white; + + protected Point[] controlPoints = new Point[] {new Point(0, 0), new Point(0, 0)}; + transient protected Area[] body; + protected String name; + protected String value = ""; + private OrientationHV orientation = OrientationHV.VERTICAL; + private boolean hasFuse = false; + private Display display = Display.VALUE; + + private Color bodyColor = BODY_COLOR; + private Color borderColor = BORDER_COLOR; + private Color labelColor = LABEL_COLOR; + + public FuseHolderPanel() { + super(); + updateControlPoints(); + } + + private void updateControlPoints() { + Point firstPoint = controlPoints[0]; + int spacing = (int) SPACING.convertToPixels(); + + controlPoints[1].setLocation(firstPoint.x + (orientation == OrientationHV.HORIZONTAL ? spacing : 0), firstPoint.y + (orientation == OrientationHV.HORIZONTAL ? 0 : spacing)); + } + + @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; + } + + @EditableProperty + @Override + public String getValue() { + return value; + } + + @Override + public void setValue(String value) { + this.value = value; + } + + @EditableProperty + public OrientationHV getOrientation() { + return orientation; + } + + public void setOrientation(OrientationHV 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 == OrientationHV.HORIZONTAL) { + 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); + } + } + + // Draw label. + g2d.setFont(project.getFont()); + Color finalLabelColor; + if (outlineMode) { + finalLabelColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED + : theme.getOutlineColor(); + } else { + finalLabelColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED + : labelColor; + } + g2d.setColor(finalLabelColor); + FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); + String label = ""; + label = display == Display.VALUE ? getValue() : getName(); + if (display == Display.NONE) { + label = ""; + } + if (display == Display.BOTH) { + label = getName() + " " + (getValue() == null ? "" : getValue().toString()); + } + Rectangle2D rect = fontMetrics.getStringBounds(label, g2d); + int textHeight = (int) (rect.getHeight()); + int textWidth = (int) (rect.getWidth()); + // Center text horizontally and vertically + Rectangle bounds = body[0].getBounds(); + int x = bounds.x + (bounds.width - textWidth) / 2; + int y = bounds.y + (bounds.height - textHeight) / 2 + fontMetrics.getAscent(); + g2d.drawString(label, x, y); + } + + public Area[] getBody() { + if (body == null) { + Point firstPoint = controlPoints[0]; + int spacing = (int) SPACING.convertToPixels(); + int outerDiameter = (int) OUTER_DIAMETER.convertToPixels(); + int innerDiameter = (int) INNER_DIAMETER.convertToPixels(); + + int dx = 0; + int dy = 0; + if (orientation == OrientationHV.HORIZONTAL) + dx = spacing / 2; + else + dy = spacing / 2; + body = new Area[2]; + body[0] = new Area(new Ellipse2D.Double(firstPoint.x + dx - outerDiameter / 2, firstPoint.y + dy - outerDiameter / 2, outerDiameter, outerDiameter)); + body[1] = new Area(new Ellipse2D.Double(firstPoint.x + dx - innerDiameter / 2, firstPoint.y + dy - innerDiameter / 2, innerDiameter, innerDiameter)); + } + return body; + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.setColor(BODY_COLOR); + int margin = (int) (2f * width / 32); + int terminal = (int) (5f * width / 32); + int terminalSpacingV = width / 4; + Shape body = new Ellipse2D.Double(margin, margin, width - 2 * margin, height - 2 * margin); + g2d.fill(body); + g2d.setColor(BORDER_COLOR); + g2d.draw(body); + g2d.setColor(METAL_COLOR); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(2f)); + g2d.drawLine(width / 2 - terminal / 2, height / 2 - terminalSpacingV / 2, width / 2 + terminal / 2, height / 2 - terminalSpacingV / 2); + g2d.drawLine(width / 2 - terminal / 2, height / 2 + terminalSpacingV / 2, width / 2 + terminal / 2, height / 2 + 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; + } + + @EditableProperty + public Display getDisplay() { + return display; + } + + public void setDisplay(Display display) { + this.display = display; + } + + @EditableProperty + public Color getLabelColor() { + return labelColor; + } + + public void setLabelColor(Color labelColor) { + this.labelColor = labelColor; + } +} diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 6fb9a847153285c8a97cfead7d816047407797fc..21f4c5fbb5e99feeec9dfefc8b8e83d935c06b0c 100644 GIT binary patch delta 14323 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 diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index 9c78a67c..cc11a652 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2209,6 +2209,10 @@ NEW_FEATURE When "High Quality Rendering" option is checked, some components are rendered with 3D shading for better looks + + + NEW_FEATURE + "Fuse Holder" added NEW_FEATURE