From b181a86fa9fa4e4a622ea6d33c1d778fe0a08c3d Mon Sep 17 00:00:00 2001 From: bancika Date: Mon, 24 Sep 2012 14:23:30 +0000 Subject: [PATCH] Diode symbol --- .../diylc/components/tube/DiodeSymbol.java | 215 ++++++++++++++++++ .../diylc/components/tube/PentodeSymbol.java | 2 + .../diylc/components/tube/TriodeSymbol.java | 66 ++++-- 3 files changed, 269 insertions(+), 14 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java new file mode 100644 index 00000000..89798ae3 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java @@ -0,0 +1,215 @@ +package org.diylc.components.tube; + +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Shape; +import java.awt.geom.Ellipse2D; +import java.awt.geom.GeneralPath; + +import org.diylc.common.ObjectCache; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IPropertyValidator; +import org.diylc.core.ValidationException; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; + +@ComponentDescriptor(name = "Diode Symbol", author = "Branislav Stojkovic", category = "Tubes", instanceNamePrefix = "V", description = "Diode tube symbol", stretchable = false, zOrder = IDIYComponent.COMPONENT) +public class DiodeSymbol extends AbstractTubeSymbol { + + private static final long serialVersionUID = 1L; + + protected Point[] controlPoints = new Point[] { new Point(0, 0), + new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0) }; + + protected boolean directlyHeated = false; + + public DiodeSymbol() { + super(); + updateControlPoints(); + } + + public Shape[] getBody() { + if (body == null) { + body = new Shape[3]; + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int pinSpacing = (int) PIN_SPACING.convertToPixels(); + + // electrodes + GeneralPath polyline = new GeneralPath(); + + // plate + polyline.moveTo(x + pinSpacing * 3 / 2, y - pinSpacing); + polyline.lineTo(x + pinSpacing * 9 / 2, y - pinSpacing); + + // cathode + if (directlyHeated) { + polyline.moveTo(controlPoints[2].x, controlPoints[2].y + - pinSpacing); + polyline.lineTo(controlPoints[2].x + pinSpacing, + controlPoints[2].y - pinSpacing * 2); + polyline.lineTo(controlPoints[4].x, controlPoints[4].y + - pinSpacing); + } else { + polyline.moveTo(x + pinSpacing * 2, y + pinSpacing); + polyline.lineTo(x + pinSpacing * 4, y + pinSpacing); + } + + body[0] = polyline; + + // connectors + polyline = new GeneralPath(); + + // plate + polyline.moveTo(controlPoints[1].x, controlPoints[1].y); + polyline.lineTo(x + pinSpacing * 3, y - pinSpacing); + + // cathode + if (directlyHeated) { + polyline.moveTo(controlPoints[2].x, controlPoints[2].y); + polyline.lineTo(controlPoints[2].x, controlPoints[2].y + - pinSpacing); + + polyline.moveTo(controlPoints[4].x, controlPoints[4].y); + polyline.lineTo(controlPoints[4].x, controlPoints[4].y + - pinSpacing); + } else { + polyline.moveTo(controlPoints[2].x, controlPoints[2].y); + polyline.lineTo(x + pinSpacing * 2, y + pinSpacing); + + if (showHeaters) { + polyline.moveTo(controlPoints[3].x, controlPoints[3].y); + polyline.lineTo(controlPoints[3].x, controlPoints[3].y + - pinSpacing); + polyline.lineTo(controlPoints[3].x + pinSpacing / 2, + controlPoints[3].y - 3 * pinSpacing / 2); + + polyline.moveTo(controlPoints[4].x, controlPoints[4].y); + polyline.lineTo(controlPoints[4].x, controlPoints[4].y + - pinSpacing); + polyline.lineTo(controlPoints[4].x - pinSpacing / 2, + controlPoints[4].y - 3 * pinSpacing / 2); + } + } + + body[1] = polyline; + + // bulb + body[2] = new Ellipse2D.Double(x + pinSpacing / 2, y - pinSpacing + * 5 / 2, pinSpacing * 5, pinSpacing * 5); + } + return body; + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.setColor(COLOR); + + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + + g2d.drawLine(width / 4, height / 4, width * 3 / 4, height / 4); + g2d.drawLine(width / 2, height / 4, width / 2, 0); + + g2d.drawLine(width / 4 + 2 * width / 32, height * 3 / 4, width * 3 / 4 + - 4 * width / 32, height * 3 / 4); + g2d.drawLine(width / 4 + 2 * width / 32, height * 3 / 4, width / 4 + 2 + * width / 32, height - 1); + + g2d.drawOval(1, 1, width - 1 - 2 * width / 32, height - 1 - 2 * width + / 32); + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + protected void updateControlPoints() { + int pinSpacing = (int) PIN_SPACING.convertToPixels(); + // Update control points. + int x = controlPoints[0].x; + int y = controlPoints[0].y; + + controlPoints[1].x = x + pinSpacing * 3; + controlPoints[1].y = y - pinSpacing * 3; + + controlPoints[2].x = x + pinSpacing * 2; + controlPoints[2].y = y + pinSpacing * 3; + + controlPoints[3].x = x + pinSpacing * 3; + controlPoints[3].y = y + pinSpacing * 3; + + controlPoints[4].x = x + pinSpacing * 4; + controlPoints[4].y = y + pinSpacing * 3; + } + + @Override + public void setControlPoint(Point point, int index) { + controlPoints[index].setLocation(point); + // Invalidate body + body = null; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + if (directlyHeated) { + return index > 0 && index != 3 ? VisibilityPolicy.WHEN_SELECTED + : VisibilityPolicy.NEVER; + } else if (showHeaters) { + return index > 0 ? VisibilityPolicy.WHEN_SELECTED + : VisibilityPolicy.NEVER; + } else { + return index < 3 && index > 0 ? VisibilityPolicy.WHEN_SELECTED + : VisibilityPolicy.NEVER; + } + } + + @Override + public boolean isControlPointSticky(int index) { + if (directlyHeated) + return index > 0 && index != 3; + else if (showHeaters) { + return index > 0; + } else { + return index > 0 && index < 3; + } + } + + @Override + protected Point getTextLocation() { + int pinSpacing = (int) PIN_SPACING.convertToPixels(); + return new Point(controlPoints[0].x + pinSpacing * 5, + controlPoints[0].y + pinSpacing * 2); + } + + @EditableProperty(name = "Directly heated") + public boolean getDirectlyHeated() { + return directlyHeated; + } + + public void setDirectlyHeated(boolean directlyHeated) { + this.directlyHeated = directlyHeated; + // Invalidate body + body = null; + } + + public class HeaterValidator implements IPropertyValidator { + + @Override + public void validate(Object value) throws ValidationException { + if (value != null && value instanceof Boolean) { + boolean b = (Boolean) value; + if (!b && getDirectlyHeated()) { + throw new ValidationException( + "Must show heaters for directly heated tubes."); + } + } + } + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java index 6382b7d7..2c8ed848 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java @@ -171,6 +171,8 @@ public class PentodeSymbol extends AbstractTubeSymbol { g2d.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL, 0, new float[] { 3f }, 6f)); g2d.drawLine(width / 8, height / 2, width * 7 / 8, height / 2); + g2d.drawLine(width / 8, height * 3 / 8, width * 7 / 8, height * 3 / 8); + g2d.drawLine(width / 8, height * 5 / 8, width * 7 / 8, height * 5 / 8); } @Override diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java index 4f7c2928..6ca5c178 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java @@ -11,6 +11,7 @@ import org.diylc.common.ObjectCache; import org.diylc.core.IDIYComponent; import org.diylc.core.VisibilityPolicy; import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; @ComponentDescriptor(name = "Triode Symbol", author = "Branislav Stojkovic", category = "Tubes", instanceNamePrefix = "V", description = "Triode tube symbol", stretchable = false, zOrder = IDIYComponent.COMPONENT) public class TriodeSymbol extends AbstractTubeSymbol { @@ -20,6 +21,8 @@ public class TriodeSymbol extends AbstractTubeSymbol { protected Point[] controlPoints = new Point[] { new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0) }; + protected boolean directlyHeated = false; + public TriodeSymbol() { super(); updateControlPoints(); @@ -50,8 +53,17 @@ public class TriodeSymbol extends AbstractTubeSymbol { polyline.lineTo(x + pinSpacing * 9 / 2, y - pinSpacing); // cathode - polyline.moveTo(x + pinSpacing * 2, y + pinSpacing); - polyline.lineTo(x + pinSpacing * 4, y + pinSpacing); + if (directlyHeated) { + polyline.moveTo(controlPoints[2].x, controlPoints[2].y + - pinSpacing); + polyline.lineTo(controlPoints[2].x + pinSpacing, + controlPoints[2].y - pinSpacing * 2); + polyline.lineTo(controlPoints[4].x, controlPoints[4].y + - pinSpacing); + } else { + polyline.moveTo(x + pinSpacing * 2, y + pinSpacing); + polyline.lineTo(x + pinSpacing * 4, y + pinSpacing); + } body[0] = polyline; @@ -67,21 +79,31 @@ public class TriodeSymbol extends AbstractTubeSymbol { polyline.lineTo(x + pinSpacing * 3, y - pinSpacing); // cathode - polyline.moveTo(controlPoints[2].x, controlPoints[2].y); - polyline.lineTo(x + pinSpacing * 2, y + pinSpacing); - - if (showHeaters) { - polyline.moveTo(controlPoints[3].x, controlPoints[3].y); - polyline.lineTo(controlPoints[3].x, controlPoints[3].y + if (directlyHeated) { + polyline.moveTo(controlPoints[2].x, controlPoints[2].y); + polyline.lineTo(controlPoints[2].x, controlPoints[2].y - pinSpacing); - polyline.lineTo(controlPoints[3].x + pinSpacing / 2, - controlPoints[3].y - 3 * pinSpacing / 2); polyline.moveTo(controlPoints[4].x, controlPoints[4].y); polyline.lineTo(controlPoints[4].x, controlPoints[4].y - pinSpacing); - polyline.lineTo(controlPoints[4].x - pinSpacing / 2, - controlPoints[4].y - 3 * pinSpacing / 2); + } else { + polyline.moveTo(controlPoints[2].x, controlPoints[2].y); + polyline.lineTo(x + pinSpacing * 2, y + pinSpacing); + + if (showHeaters) { + polyline.moveTo(controlPoints[3].x, controlPoints[3].y); + polyline.lineTo(controlPoints[3].x, controlPoints[3].y + - pinSpacing); + polyline.lineTo(controlPoints[3].x + pinSpacing / 2, + controlPoints[3].y - 3 * pinSpacing / 2); + + polyline.moveTo(controlPoints[4].x, controlPoints[4].y); + polyline.lineTo(controlPoints[4].x, controlPoints[4].y + - pinSpacing); + polyline.lineTo(controlPoints[4].x - pinSpacing / 2, + controlPoints[4].y - 3 * pinSpacing / 2); + } } body[1] = polyline; @@ -154,7 +176,10 @@ public class TriodeSymbol extends AbstractTubeSymbol { @Override public VisibilityPolicy getControlPointVisibilityPolicy(int index) { - if (showHeaters) { + if (directlyHeated) { + return index != 3 ? VisibilityPolicy.WHEN_SELECTED + : VisibilityPolicy.NEVER; + } else if (showHeaters) { return VisibilityPolicy.WHEN_SELECTED; } else { return index < 3 ? VisibilityPolicy.WHEN_SELECTED @@ -164,7 +189,9 @@ public class TriodeSymbol extends AbstractTubeSymbol { @Override public boolean isControlPointSticky(int index) { - if (showHeaters) { + if (directlyHeated) { + return index != 3; + } else if (showHeaters) { return true; } else { return index < 3; @@ -177,4 +204,15 @@ public class TriodeSymbol extends AbstractTubeSymbol { return new Point(controlPoints[0].x + pinSpacing * 5, controlPoints[0].y + pinSpacing * 2); } + + @EditableProperty(name = "Directly heated") + public boolean getDirectlyHeated() { + return directlyHeated; + } + + public void setDirectlyHeated(boolean directlyHeated) { + this.directlyHeated = directlyHeated; + // Invalidate body + body = null; + } }