From 2cf6b573a7d3ffb9529a60aaa927659f420bfe7e Mon Sep 17 00:00:00 2001 From: bancika Date: Sun, 30 Jan 2011 21:31:42 +0000 Subject: [PATCH] added abstract class for leaded schematic symbols and resistor symbol --- .../DIYLC/library/main.jar | Bin 76025 -> 77710 bytes .../src/org/diylc/common/LabelPosition.java | 11 +++ .../components/AbstractLeadedComponent.java | 28 ++++--- .../AbstractSchematicLeadedSymbol.java | 72 +++++++++++++++++ .../Library/lib/diylc.jar | Bin 335525 -> 338318 bytes .../components/connectivity/CopperTrace.java | 18 +++-- .../components/passive/ResistorSymbol.java | 74 ++++++++++++++++++ 7 files changed, 185 insertions(+), 18 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/LabelPosition.java create mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractSchematicLeadedSymbol.java create mode 100644 diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/ResistorSymbol.java diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar index bb39c9f5197f10521274cda83139e73631357826..dc6ff14fd6eba84901f6d357f70e9816826db50a 100644 GIT binary patch delta 4929 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 Vi2w`?3dEOy5HkW{fgFoSrlT*k=rI_MUhRB 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 extends AbstractTransparentComp double distance = points[0].distance(points[1]); Shape shape = getBodyShape(); if (shape == null) { - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( - getLeadThickness().convertToPixels())); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(getLeadThickness())); g2d.setColor(shouldShadeLeads() ? getLeadColor(componentState).darker() : getLeadColor(componentState)); g2d.drawLine(points[0].x, points[0].y, points[1].x, points[1].y); if (shouldShadeLeads()) { - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( - getLeadThickness().convertToPixels() - 2)); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(getLeadThickness() - 2)); g2d.setColor(getLeadColor(componentState)); g2d.drawLine(points[0].x, points[0].y, points[1].x, points[1].y); } @@ -90,8 +88,10 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); } - g2d.setColor(bodyColor); - g2d.fill(shape); + if (bodyColor != null) { + g2d.setColor(bodyColor); + g2d.fill(shape); + } decorateComponentBody(g2d); g2d.setComposite(oldComposite); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); @@ -99,7 +99,7 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : borderColor); g2d.draw(shape); // Draw leads. - int leadThickness = getClosestOdd(getLeadThickness().convertToPixels()); + int leadThickness = getClosestOdd(getLeadThickness()); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness)); g2d.setColor(shouldShadeLeads() ? getLeadColor(componentState).darker() : getLeadColor(componentState)); @@ -123,7 +123,8 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp drawingObserver.stopTracking(); // Draw label. g2d.setFont(LABEL_FONT); - g2d.setColor(componentState == ComponentState.SELECTED ? LABEL_COLOR_SELECTED : labelColor); + g2d.setColor(componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED : labelColor); FontMetrics fontMetrics = g2d.getFontMetrics(); String label = display == Display.NAME ? getName() : getValue().toString(); // Adjust label angle if needed to make sure that it's readable. @@ -133,13 +134,18 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp } Rectangle2D textRect = fontMetrics.getStringBounds(label, g2d); g2d.drawString(label, (int) (shapeRect.width - textRect.getWidth()) / 2, - (int) (shapeRect.height - textRect.getHeight()) / 2 + fontMetrics.getAscent()); + calculateLabelYCoordinate(shapeRect, textRect, fontMetrics)); } protected void decorateComponentBody(Graphics2D g2d) { // Do nothing. } + protected int calculateLabelYCoordinate(Rectangle2D shapeRect, Rectangle2D textRect, + FontMetrics fontMetrics) { + return (int) (shapeRect.getHeight() - textRect.getHeight()) / 2 + fontMetrics.getAscent(); + } + protected boolean shouldShadeLeads() { return true; } @@ -165,8 +171,8 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp /** * @return default lead thickness. Override this method to change it. */ - protected Size getLeadThickness() { - return LEAD_THICKNESS; + protected int getLeadThickness() { + return LEAD_THICKNESS.convertToPixels(); } /** diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractSchematicLeadedSymbol.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractSchematicLeadedSymbol.java new file mode 100644 index 00000000..0e5c0591 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractSchematicLeadedSymbol.java @@ -0,0 +1,72 @@ +package org.diylc.components; + +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.geom.Rectangle2D; + +import org.diylc.common.LabelPosition; +import org.diylc.core.ComponentState; +import org.diylc.core.annotations.EditableProperty; + +public abstract class AbstractSchematicLeadedSymbol extends AbstractLeadedComponent { + + private static final long serialVersionUID = 1L; + + public static Color COLOR = Color.blue; + public static Color LEAD_COLOR = Color.black; + + protected LabelPosition labelPosition = LabelPosition.ABOVE; + + public AbstractSchematicLeadedSymbol() { + super(); + // We don't want to fill the body, so use null. + this.bodyColor = null; + this.borderColor = COLOR; + } + + @Override + public Color getBodyColor() { + return super.getBodyColor(); + } + + @Override + protected boolean shouldShadeLeads() { + return false; + } + + @Override + protected int getLeadThickness() { + return 1; + } + + @Override + protected int calculateLabelYCoordinate(Rectangle2D shapeRect, Rectangle2D textRect, + FontMetrics fontMetrics) { + if (labelPosition == LabelPosition.ABOVE) { + return -1; + } else { + return (int) (shapeRect.getHeight() + textRect.getHeight() - 1); + } + } + + @EditableProperty(name = "Label position") + public LabelPosition getLabelPosition() { + return labelPosition; + } + + @Override + @EditableProperty(name = "Color") + public Color getBorderColor() { + return super.getBorderColor(); + } + + public void setLabelPosition(LabelPosition labelPosition) { + this.labelPosition = labelPosition; + } + + @Override + protected Color getLeadColor(ComponentState componentState) { + return componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : LEAD_COLOR; + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/lib/diylc.jar b/ diy-layout-creator --username bancika@gmail.com/Library/lib/diylc.jar index d744a258b57d07a2bb711ac02711cd97b2128b1e..82b15b1b9aecb36739dfabbcf8a6f884404a0f46 100644 GIT binary patch delta 22410 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 delta 20466 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

{ public static Color COLOR = Color.black; private Color leadColor = COLOR; - private Size leadThickness = THICKNESS; + private Size thickness = THICKNESS; @Override public void drawIcon(Graphics2D g2d, int width, int height) { @@ -53,14 +53,18 @@ public class CopperTrace extends AbstractLeadedComponent { this.leadColor = leadColor; } - @Override - @EditableProperty(name = "Thickness") - public Size getLeadThickness() { - return leadThickness; + @EditableProperty(name = "Width") + public Size getThickness() { + return thickness; } - public void setLeadThickness(Size leadThickness) { - this.leadThickness = leadThickness; + public void setThickness(Size thickness) { + this.thickness = thickness; + } + + @Override + protected int getLeadThickness() { + return getThickness().convertToPixels(); } @Override diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/ResistorSymbol.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/ResistorSymbol.java new file mode 100644 index 00000000..8c87118e --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/ResistorSymbol.java @@ -0,0 +1,74 @@ +package org.diylc.components.passive; + +import java.awt.Graphics2D; +import java.awt.Shape; +import java.awt.geom.GeneralPath; + +import org.diylc.components.AbstractSchematicLeadedSymbol; +import org.diylc.core.CreationMethod; +import org.diylc.core.IDIYComponent; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Resistance; +import org.diylc.core.measures.ResistanceUnit; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; + +@ComponentDescriptor(name = "Resistor (schematic symbol)", author = "Branislav Stojkovic", category = "Passive", creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "R", description = "", zOrder = IDIYComponent.COMPONENT) +public class ResistorSymbol extends AbstractSchematicLeadedSymbol { + + private static final long serialVersionUID = 1L; + + public static Size DEFAULT_LENGTH = new Size(0.3, SizeUnit.in); + public static Size DEFAULT_WIDTH = new Size(0.08, SizeUnit.in); + + private Resistance value = new Resistance(100d, ResistanceUnit.K); + + @EditableProperty + public Resistance getValue() { + return value; + } + + public void setValue(Resistance value) { + this.value = value; + } + + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.rotate(-Math.PI / 4, width / 2, height / 2); + g2d.setColor(LEAD_COLOR); + g2d.drawLine(0, height / 2, 4, height / 2); + g2d.drawLine(width - 4, height / 2, width, height / 2); + g2d.setColor(COLOR); + g2d.drawPolyline(new int[] { 4, 6, 10, 14, 18, 22, 26, 28 }, new int[] { height / 2, + height / 2 + 2, height / 2 - 2, height / 2 + 2, height / 2 - 2, height / 2 + 2, + height / 2 - 2, height / 2 }, 8); + } + + @Override + protected Size getDefaultWidth() { + return DEFAULT_WIDTH; + } + + @Override + protected Size getDefaultLength() { + return DEFAULT_LENGTH; + } + + @Override + protected Shape getBodyShape() { + GeneralPath polyline = new GeneralPath(); + double length = getLength().convertToPixels(); + double width = getWidth().convertToPixels(); + polyline.moveTo(0, width / 2); + polyline.lineTo(length / 16, width); + polyline.lineTo(3 * length / 16, 0); + polyline.lineTo(5 * length / 16, width); + polyline.lineTo(7 * length / 16, 0); + polyline.lineTo(9 * length / 16, width); + polyline.lineTo(11 * length / 16, 0); + polyline.lineTo(13 * length / 16, width); + polyline.lineTo(15 * length / 16, 0); + polyline.lineTo(length, width / 2); + return polyline; + } +}