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 bb39c9f5..dc6ff14f 100644 Binary files a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar and b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar differ diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/LabelPosition.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/LabelPosition.java new file mode 100644 index 00000000..7038824e --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/LabelPosition.java @@ -0,0 +1,11 @@ +package org.diylc.common; + +public enum LabelPosition { + + ABOVE, BELOW; + + @Override + public String toString() { + return name().substring(0, 1) + name().substring(1).toLowerCase(); + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java index 72d1b3f7..e8184394 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java @@ -63,14 +63,12 @@ public abstract class AbstractLeadedComponent 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 d744a258..82b15b1b 100644 Binary files a/ diy-layout-creator --username bancika@gmail.com/Library/lib/diylc.jar and b/ diy-layout-creator --username bancika@gmail.com/Library/lib/diylc.jar differ diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/CopperTrace.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/CopperTrace.java index fadfe010..2fcec7de 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/CopperTrace.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/CopperTrace.java @@ -24,7 +24,7 @@ public class CopperTrace extends AbstractLeadedComponent { 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; + } +}