From 5a57c58563d0359a6384366b7da101832eaecac0 Mon Sep 17 00:00:00 2001 From: bancika Date: Tue, 6 Dec 2016 12:20:51 +0100 Subject: [PATCH] added SMD capacitor and resistor --- diylc/diylc-library/lib/diylc-core.jar | Bin 229619 -> 229619 bytes .../TerminalStrip.java | 4 +- .../components/smd/PassiveSMDComponent.java | 389 ++++++++++++++++++ .../diylc/components/smd/SMDCapacitor.java | 35 ++ .../org/diylc/components/smd/SMDResistor.java | 35 ++ diylc/diylc-swing/lib/diylc-core.jar | Bin 229619 -> 229619 bytes diylc/diylc-swing/library/main.jar | Bin 323442 -> 332361 bytes diylc/diylc-swing/update.xml | 4 + 8 files changed, 465 insertions(+), 2 deletions(-) rename diylc/diylc-library/src/org/diylc/components/{connectivity => boards}/TerminalStrip.java (96%) create mode 100644 diylc/diylc-library/src/org/diylc/components/smd/PassiveSMDComponent.java create mode 100644 diylc/diylc-library/src/org/diylc/components/smd/SMDCapacitor.java create mode 100644 diylc/diylc-library/src/org/diylc/components/smd/SMDResistor.java diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 96a12e0b2ff3f7c3d326964cade545cfed3b2d45..f5ae33a5f79e00932ee00651cd63e7e53a953eae 100644 GIT binary patch delta 4477 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 T(dn*_H8ip4MHK$mMI!va53Hb5 diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/TerminalStrip.java b/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java similarity index 96% rename from diylc/diylc-library/src/org/diylc/components/connectivity/TerminalStrip.java rename to diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java index f4469911..cf952648 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/TerminalStrip.java +++ b/diylc/diylc-library/src/org/diylc/components/boards/TerminalStrip.java @@ -1,4 +1,4 @@ -package org.diylc.components.connectivity; +package org.diylc.components.boards; import java.awt.AlphaComposite; import java.awt.Color; @@ -27,7 +27,7 @@ import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; -@ComponentDescriptor(name = "Terminal Strip", author = "Branislav Stojkovic", category = "Connectivity", +@ComponentDescriptor(name = "Terminal Strip", author = "Branislav Stojkovic", category = "Boards", instanceNamePrefix = "TS", description = "Row of terminals for point-to-point construction", stretchable = false, zOrder = IDIYComponent.BOARD, keywordPolicy = KeywordPolicy.SHOW_TYPE_NAME) public class TerminalStrip extends AbstractTransparentComponent { diff --git a/diylc/diylc-library/src/org/diylc/components/smd/PassiveSMDComponent.java b/diylc/diylc-library/src/org/diylc/components/smd/PassiveSMDComponent.java new file mode 100644 index 00000000..71a6db80 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/smd/PassiveSMDComponent.java @@ -0,0 +1,389 @@ +package org.diylc.components.smd; + + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.geom.Area; +import java.awt.geom.Rectangle2D; +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.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.Theme; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; + +public abstract class PassiveSMDComponent extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + public static Color PIN_COLOR = Color.decode("#00B2EE"); + public static Color PIN_BORDER_COLOR = PIN_COLOR.darker(); + // public static Color LABEL_COLOR = Color.white; + public static int EDGE_RADIUS = 4; + public static Size PIN_SIZE = new Size(0.8d, SizeUnit.mm); + + protected T value; + private Orientation orientation = Orientation.DEFAULT; + + private SMDSize size = SMDSize._1206; + private Point[] controlPoints = new Point[] {new Point(0, 0), new Point(0, 0)}; + // protected Display display = Display.NAME; + protected Color bodyColor; + protected Color borderColor; + // private Color labelColor = LABEL_COLOR; + transient private Area[] body; + + public PassiveSMDComponent() { + super(); + updateControlPoints(); + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + updateControlPoints(); + // Reset body shape. + body = null; + } + + // @EditableProperty + // public Display getDisplay() { + // if (display == null) { + // display = Display.VALUE; + // } + // return display; + // } + // + // public void setDisplay(Display display) { + // this.display = display; + // } + + @EditableProperty + public SMDSize getSize() { + return size; + } + + public void setSize(SMDSize size) { + this.size = size; + 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]; + controlPoints[0] = firstPoint; + int pinSize = (int) PIN_SIZE.convertToPixels(); + int smdLength = (int) getSize().getLength().convertToPixels(); + int pinSpacing = smdLength - pinSize; + + // Update control points. + int dx1; + int dy1; + switch (orientation) { + case DEFAULT: + dx1 = 0; + dy1 = pinSpacing; + break; + case _90: + dx1 = -pinSpacing; + dy1 = 0; + break; + case _180: + dx1 = 0; + dy1 = -pinSpacing; + break; + case _270: + dx1 = pinSpacing; + dy1 = 0; + break; + default: + throw new RuntimeException("Unexpected orientation: " + orientation); + } + controlPoints[1] = new Point(firstPoint.x + dx1, firstPoint.y + dy1); + } + + public Area[] getBody() { + if (body == null) { + body = new Area[2]; + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int smdWidth = (int) getSize().getWidth().convertToPixels(); + int smdLength = (int) getSize().getLength().convertToPixels(); + int pinSize = (int) PIN_SIZE.convertToPixels(); + int width; + int height; + + // create main body + switch (orientation) { + case DEFAULT: + width = smdWidth; + height = smdLength; + x -= smdWidth / 2; + y -= pinSize / 2; + break; + case _90: + width = smdLength; + height = smdWidth; + x -= width - pinSize / 2; + y -= smdWidth / 2; + break; + case _180: + width = smdWidth; + height = smdLength; + x -= smdWidth / 2; + y -= height - pinSize / 2; + break; + case _270: + width = smdLength; + height = smdWidth; + x -= pinSize / 2; + y -= smdWidth / 2; + break; + default: + throw new RuntimeException("Unexpected orientation: " + orientation); + } + Area mainArea = new Area(new RoundRectangle2D.Double(x, y, width, height, EDGE_RADIUS, EDGE_RADIUS)); + + // create contact area + Area contactArea = new Area(); + if (width > height) { + contactArea.add(new Area(new Rectangle2D.Double(x, y, pinSize, height))); + contactArea.add(new Area(new Rectangle2D.Double(x + width - pinSize, y, pinSize, height))); + } else { + contactArea.add(new Area(new Rectangle2D.Double(x, y, width, pinSize))); + contactArea.add(new Area(new Rectangle2D.Double(x, y + height - pinSize, width, pinSize))); + } + contactArea.intersect(mainArea); + + mainArea.subtract(contactArea); + body[0] = mainArea; + body[1] = contactArea; + + } + return body; + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + if (checkPointsClipped(g2d.getClip())) { + return; + } + + // draw main area + 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 : getBodyColor()); + g2d.fill(mainArea); + g2d.setComposite(oldComposite); + + Color finalBorderColor; + if (outlineMode) { + Theme theme = + (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + 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); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + g2d.draw(mainArea); + + + // draw contact area + Area contactArea = getBody()[1]; + if (!outlineMode) { + g2d.setColor(PIN_COLOR); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); + } + g2d.fill(contactArea); + g2d.setComposite(oldComposite); + } + + if (outlineMode) { + Theme theme = + (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : theme.getOutlineColor(); + } else { + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : PIN_BORDER_COLOR; + } + g2d.setColor(finalBorderColor); + g2d.draw(contactArea); + + // // Draw label. + // g2d.setFont(LABEL_FONT); + // Color finalLabelColor; + // if (outlineMode) { + // Theme theme = + // (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, + // Constants.DEFAULT_THEME); + // finalLabelColor = + // componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? + // LABEL_COLOR_SELECTED + // : theme.getOutlineColor(); + // } else { + // finalLabelColor = + // componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? + // LABEL_COLOR_SELECTED + // : getLabelColor(); + // } + // g2d.setColor(finalLabelColor); + // FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); + // String label = ""; + // label = (getDisplay() == Display.NAME) ? getName() : getValue(); + // if (getDisplay() == Display.NONE) { + // label = ""; + // } + // if (getDisplay() == 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 = mainArea.getBounds(); + // int x = bounds.x + (bounds.width - textWidth) / 2; + // int y = bounds.y + (bounds.height - textHeight) / 2 + fontMetrics.getAscent(); + // g2d.drawString(label, x, y); + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int radius = 4 * width / 32; + int contactSize = 4 * width / 32; + int thickness = getClosestOdd(width / 2); + g2d.rotate(Math.PI / 4, width / 2, height / 2); + RoundRectangle2D rect = + new RoundRectangle2D.Double((width - thickness) / 2, 4 * width / 32, thickness, height - 8 * width / 32, + radius, radius); + g2d.setColor(getBodyColor()); + g2d.fill(rect); + g2d.setColor(getBorderColor()); + g2d.draw(rect); + Area contactArea = new Area(); + contactArea.add(new Area(new Rectangle2D.Double((width - thickness) / 2, 4 * width / 32, thickness, contactSize))); + contactArea.add(new Area(new Rectangle2D.Double((width - thickness) / 2, height - 8 * width / 32, thickness, + contactSize))); + contactArea.intersect(new Area(rect)); + g2d.setColor(PIN_COLOR); + g2d.fill(contactArea); + } + + @EditableProperty(name = "Body") + public Color getBodyColor() { + return bodyColor; + } + + public void setBodyColor(Color bodyColor) { + this.bodyColor = bodyColor; + } + + @EditableProperty(name = "Border") + public Color getBorderColor() { + return borderColor; + } + + public void setBorderColor(Color borderColor) { + this.borderColor = borderColor; + } + + // @EditableProperty(name = "Label") + // public Color getLabelColor() { + // if (labelColor == null) { + // labelColor = LABEL_COLOR; + // } + // return labelColor; + // } + // + // public void setLabelColor(Color labelColor) { + // this.labelColor = labelColor; + // } + + public static enum SMDSize { + + _0805(new Size(1.25d, SizeUnit.mm), new Size(2.0d, SizeUnit.mm)), _1206(new Size(1.6d, SizeUnit.mm), new Size(3.2d, + SizeUnit.mm)), _1210(new Size(2.5d, SizeUnit.mm), new Size(3.2d, SizeUnit.mm)), _1806(new Size(1.6d, + SizeUnit.mm), new Size(4.5d, SizeUnit.mm)), _1812(new Size(3.2d, SizeUnit.mm), new Size(4.5d, SizeUnit.mm)); + + private Size width; + private Size length; + + private SMDSize(Size width, Size length) { + this.width = width; + this.length = length; + } + + public Size getWidth() { + return width; + } + + public Size getLength() { + return length; + } + + @Override + public String toString() { + return name().replace("_", ""); + } + + public int getValue() { + return Integer.parseInt(toString()); + } + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/smd/SMDCapacitor.java b/diylc/diylc-library/src/org/diylc/components/smd/SMDCapacitor.java new file mode 100644 index 00000000..8529eb7d --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/smd/SMDCapacitor.java @@ -0,0 +1,35 @@ +package org.diylc.components.smd; + +import java.awt.Color; + +import org.diylc.core.IDIYComponent; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.annotations.KeywordPolicy; +import org.diylc.core.annotations.PositiveMeasureValidator; +import org.diylc.core.measures.Capacitance; + +@ComponentDescriptor(name = "SMD Capacitor", author = "Branislav Stojkovic", category = "SMD", + instanceNamePrefix = "C", description = "Surface mount capacitor", stretchable = false, + zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE) +public class SMDCapacitor extends PassiveSMDComponent { + + public static Color BODY_COLOR = Color.decode("#BD9347"); + public static Color BORDER_COLOR = BODY_COLOR.darker(); + + private static final long serialVersionUID = 1L; + + public SMDCapacitor() { + this.bodyColor = BODY_COLOR; + this.borderColor = BORDER_COLOR; + } + + @EditableProperty(validatorClass = PositiveMeasureValidator.class) + public Capacitance getValue() { + return value; + } + + public void setValue(Capacitance value) { + this.value = value; + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/smd/SMDResistor.java b/diylc/diylc-library/src/org/diylc/components/smd/SMDResistor.java new file mode 100644 index 00000000..3f024bd0 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/smd/SMDResistor.java @@ -0,0 +1,35 @@ +package org.diylc.components.smd; + +import java.awt.Color; + +import org.diylc.core.IDIYComponent; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.annotations.KeywordPolicy; +import org.diylc.core.annotations.PositiveMeasureValidator; +import org.diylc.core.measures.Resistance; + +@ComponentDescriptor(name = "SMD Resistor", author = "Branislav Stojkovic", category = "SMD", instanceNamePrefix = "C", + description = "Surface mount resistor", stretchable = false, zOrder = IDIYComponent.COMPONENT, + keywordPolicy = KeywordPolicy.SHOW_VALUE) +public class SMDResistor extends PassiveSMDComponent { + + public static Color BODY_COLOR = Color.gray; + public static Color BORDER_COLOR = Color.gray.darker(); + + private static final long serialVersionUID = 1L; + + public SMDResistor() { + this.bodyColor = BODY_COLOR; + this.borderColor = BORDER_COLOR; + } + + @EditableProperty(validatorClass = PositiveMeasureValidator.class) + public Resistance getValue() { + return value; + } + + public void setValue(Resistance value) { + this.value = value; + } +} diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 96a12e0b2ff3f7c3d326964cade545cfed3b2d45..f5ae33a5f79e00932ee00651cd63e7e53a953eae 100644 GIT binary patch delta 4477 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 T(dn*_H8ip4MHK$mMI!va53Hb5 diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 87619af764ac2ee13294babe6f96597a938b0049..072f790a9715591684d8f9c776d58df3e0197015 100644 GIT binary patch delta 21768 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 S#7>{3%2L_mLml=JsQe!mnqlz( delta 13062 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 NEW_FEATURE Terminal strip component added + + + NEW_FEATURE + SMD capacitor and resistor added NEW_FEATURE