From 4665d5d42e1d7ef4a3d0e7193d38b18f0ae28c21 Mon Sep 17 00:00:00 2001 From: bancika Date: Sat, 26 Feb 2011 21:05:40 +0000 Subject: [PATCH] added tube --- .../DIYLC/library/main.jar | Bin 96463 -> 97038 bytes .../diylc/core/measures/CapacitanceUnit.java | 2 +- .../DIYLC/update.xml | 8 + .../Library/.classpath | 2 +- .../components/misc/ProjectInformation.java | 108 ------ .../passive/TrimmerPotentiometer.java | 1 - .../components/semiconductors/DIL_IC.java | 6 +- .../org/diylc/components/tube/TubeSocket.java | 309 ++++++++++++++++++ 8 files changed, 322 insertions(+), 114 deletions(-) delete mode 100644 diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/ProjectInformation.java create mode 100644 diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/tube/TubeSocket.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 1924c119fbb2c593b0ec50d0d3f30f0317c5d24c..d58e1a183d5caaabbc2f9f16ce7820e254b520c6 100644 GIT binary patch delta 4829 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 s=npu6%CV_`fv(I`|==O~GpSce6qAKk+Nxc>n+a delta 4252 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 Ruler ticks don't always match with the grid + + BUG_FIX + Micro symbol doesn't get exported to PDF + IMPROVEMENT DIL IC now has more pin options @@ -244,6 +248,10 @@ NEW_FEATURE Added support for themes + + NEW_FEATURE + Added tube socket + NEW_FEATURE Sticky points may be turned off diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/.classpath b/ diy-layout-creator --username bancika@gmail.com/Library/.classpath index 0fed21e8..9f8613f1 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/.classpath +++ b/ diy-layout-creator --username bancika@gmail.com/Library/.classpath @@ -4,6 +4,6 @@ - + diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/ProjectInformation.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/ProjectInformation.java deleted file mode 100644 index eed5f6c3..00000000 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/ProjectInformation.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.diylc.components.misc; - -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.geom.Rectangle2D; - -import org.diylc.components.AbstractComponent; -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.measures.Size; -import org.diylc.core.measures.SizeUnit; - -@ComponentDescriptor(name = "Project Information", author = "Branislav Stojkovic", category = "Misc", description = "Draws a box with general project information", instanceNamePrefix = "BOM", zOrder = IDIYComponent.TEXT, stretchable = false) -public class ProjectInformation extends AbstractComponent { - - public static Size DEFAULT_SIZE = new Size(10d, SizeUnit.cm); - public static Color COLOR = Color.black; - public static String DEFAULT_TEXT = "No components to show in the Bill of Materials"; - - private static final long serialVersionUID = 1L; - - private Point point = new Point(0, 0); - - @Override - public void draw(Graphics2D g2d, ComponentState componentState, Project project, - IDrawingObserver drawingObserver) { - g2d.setFont(LABEL_FONT); - g2d.setColor(componentState == ComponentState.DRAGGING - || componentState == ComponentState.SELECTED ? SELECTION_COLOR : COLOR); - // FontMetrics fontMetrics = g2d.getFontMetrics(); - g2d.drawString(project.getTitle(), point.x, point.y); - } - - @Override - public void drawIcon(Graphics2D g2d, int width, int height) { - g2d.setColor(Color.white); - g2d.fillRect(width / 8, 0, 6 * width / 8, height - 1); - g2d.setColor(Color.black); - g2d.drawRect(width / 8, 0, 6 * width / 8, height - 1); - g2d.setFont(LABEL_FONT.deriveFont(1f * 9 * width / 32).deriveFont(Font.PLAIN)); - - FontMetrics fontMetrics = g2d.getFontMetrics(); - Rectangle2D rect = fontMetrics.getStringBounds("BOM", g2d); - - int textHeight = (int) (rect.getHeight()); - int textWidth = (int) (rect.getWidth()); - - // Center text horizontally and vertically. - int x = (width - textWidth) / 2 + 1; - int y = textHeight + 2; - - g2d.drawString("BOM", x, y); - - g2d.setFont(g2d.getFont().deriveFont(1f * 5 * width / 32)); - - fontMetrics = g2d.getFontMetrics(); - rect = fontMetrics.getStringBounds("resistors", g2d); - x = (width - textWidth) / 2 + 1; - y = height / 2 + 2; - g2d.drawString("resistors", x, y); - y += rect.getHeight() - 1; - g2d.drawString("tubes", x, y); - y += rect.getHeight() - 1; - g2d.drawString("diodes", x, y); - } - - @Override - public int getControlPointCount() { - return 1; - } - - @Override - public Point getControlPoint(int index) { - return point; - } - - @Override - public boolean isControlPointSticky(int index) { - return false; - } - - @Override - public VisibilityPolicy getControlPointVisibilityPolicy(int index) { - return VisibilityPolicy.NEVER; - } - - @Override - public void setControlPoint(Point point, int index) { - this.point.setLocation(point); - } - - @Override - public Void getValue() { - return null; - } - - @Override - public void setValue(Void value) { - } -} diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/TrimmerPotentiometer.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/TrimmerPotentiometer.java index e103a3b0..8b03bc26 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/TrimmerPotentiometer.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/passive/TrimmerPotentiometer.java @@ -19,7 +19,6 @@ import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; -import org.diylc.core.Theme; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; import org.diylc.core.measures.Size; diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/semiconductors/DIL_IC.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/semiconductors/DIL_IC.java index af7f16a4..d2cd4bb9 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/semiconductors/DIL_IC.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/semiconductors/DIL_IC.java @@ -19,7 +19,6 @@ 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; @@ -57,7 +56,7 @@ public class DIL_IC extends AbstractTransparentComponent { // pinSpacing.convertToPixels()), // new Point(3 * pinSpacing.convertToPixels(), 3 * // pinSpacing.convertToPixels()) }; - transient private Area body[]; + transient private Area[] body; public DIL_IC() { super(); @@ -80,7 +79,8 @@ public class DIL_IC extends AbstractTransparentComponent { public void setOrientation(Orientation orientation) { this.orientation = orientation; - // Reset body shape; + updateControlPoints(); + // Reset body shape. body = null; } diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/tube/TubeSocket.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/tube/TubeSocket.java new file mode 100644 index 00000000..127f1588 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/tube/TubeSocket.java @@ -0,0 +1,309 @@ +package org.diylc.components.tube; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Shape; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; + +import org.diylc.common.ObjectCache; +import org.diylc.common.Orientation; +import org.diylc.components.AbstractTransparentComponent; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +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; + +@ComponentDescriptor(name = "Tube Socket", author = "Branislav Stojkovic", category = "Tubes", instanceNamePrefix = "V", description = "Various types of tube/valve sockets", stretchable = false, zOrder = IDIYComponent.COMPONENT) +public class TubeSocket extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + private static Color BODY_COLOR = Color.decode("#FFFFE0"); + private static Color BORDER_COLOR = Color.decode("#8E8E38"); + public static Color PIN_COLOR = Color.decode("#00B2EE"); + public static Color PIN_BORDER_COLOR = PIN_COLOR.darker(); + public static Size PIN_SIZE = new Size(1d, SizeUnit.mm); + public static Size HOLE_SIZE = new Size(5d, SizeUnit.mm); + public static Size TICK_SIZE = new Size(2d, SizeUnit.mm); + + private Base base = Base.B9A; + private String type = ""; + private Orientation orientation = Orientation.DEFAULT; + // private Mount mount = Mount.CHASSIS; + + private Point[] controlPoints = new Point[] { new Point(0, 0) }; + + transient private Shape body; + + public TubeSocket() { + super(); + updateControlPoints(); + } + + @EditableProperty + public Base getBase() { + return base; + } + + public void setBase(Base base) { + this.base = base; + updateControlPoints(); + // Reset body shape + body = null; + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + updateControlPoints(); + // Reset body shape + body = null; + } + + // @EditableProperty + // public Mount getMount() { + // return mount; + // } + // + // public void setMount(Mount mount) { + // this.mount = mount; + // } + + private void updateControlPoints() { + Point firstPoint = controlPoints[0]; + int pinCount; + int pinCircleDiameter; + boolean hasEmptySpace; + switch (base) { + case B7G: + pinCount = 7; + pinCircleDiameter = getClosestOdd(new Size(12d, SizeUnit.mm).convertToPixels()); + hasEmptySpace = true; + break; + case OCTAL: + pinCount = 8; + pinCircleDiameter = getClosestOdd(new Size(17.5d, SizeUnit.mm).convertToPixels()); + hasEmptySpace = false; + break; + case B9A: + pinCount = 9; + pinCircleDiameter = getClosestOdd(new Size(14d, SizeUnit.mm).convertToPixels()); + hasEmptySpace = true; + break; + default: + throw new RuntimeException("Unexpected base: " + base); + } + double angleIncrement = Math.PI * 2 / (hasEmptySpace ? (pinCount + 1) : pinCount); + double initialAngleOffset = hasEmptySpace ? angleIncrement : (angleIncrement / 2); + double initialAngle; + switch (orientation) { + case DEFAULT: + initialAngle = Math.PI / 2 + initialAngleOffset; + break; + case _90: + initialAngle = Math.PI + initialAngleOffset; + break; + case _180: + initialAngle = 3 * Math.PI / 2 + initialAngleOffset; + break; + case _270: + initialAngle = initialAngleOffset; + break; + default: + throw new RuntimeException("Unexpected orientation: " + orientation); + } + controlPoints = new Point[pinCount + 1]; + double angle = initialAngle; + controlPoints[0] = firstPoint; + for (int i = 0; i < pinCount; i++) { + controlPoints[i + 1] = new Point((int) (firstPoint.getX() + Math.cos(angle) + * pinCircleDiameter / 2), (int) (firstPoint.getY() + Math.sin(angle) + * pinCircleDiameter / 2)); + angle += angleIncrement; + } + } + + public Shape getBody() { + if (body == null) { + int bodyDiameter; + switch (base) { + case B7G: + bodyDiameter = getClosestOdd(new Size(17d, SizeUnit.mm).convertToPixels()); + break; + case B9A: + bodyDiameter = getClosestOdd(new Size(19d, SizeUnit.mm).convertToPixels()); + break; + case OCTAL: + bodyDiameter = getClosestOdd(new Size(24.5d, SizeUnit.mm).convertToPixels()); + break; + default: + throw new RuntimeException("Unexpected base: " + base); + } + body = new Ellipse2D.Double(controlPoints[0].x - bodyDiameter / 2, controlPoints[0].y + - bodyDiameter / 2, bodyDiameter, bodyDiameter); + Area bodyArea = new Area(body); + int holeSize = getClosestOdd(HOLE_SIZE.convertToPixels()); + bodyArea.subtract(new Area(new Ellipse2D.Double(controlPoints[0].x - holeSize / 2, + controlPoints[0].y - holeSize / 2, holeSize, holeSize))); + if (base == Base.OCTAL) { + int tickSize = getClosestOdd(TICK_SIZE.convertToPixels()); + double angle = 0; + switch (orientation) { + case DEFAULT: + angle = Math.PI / 2; + break; + case _90: + angle = Math.PI; + break; + case _180: + angle = 3 * Math.PI / 2; + break; + case _270: + angle = 0; + break; + } + int centerX = (int) (controlPoints[0].x + Math.cos(angle) * holeSize / 2); + int centerY = (int) (controlPoints[0].y + Math.sin(angle) * holeSize / 2); + bodyArea.subtract(new Area(new Ellipse2D.Double(centerX - tickSize / 2, centerY + - tickSize / 2, tickSize, tickSize))); + } + body = bodyArea; + } + return body; + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, Project project, + IDrawingObserver drawingObserver) { + // g2d.setColor(Color.black); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + // for (int i = 0; i < controlPoints.length; i++) { + // g2d.drawString(Integer.toString(i), controlPoints[i].x, + // controlPoints[i].y); + // } + // Draw body + Shape body = getBody(); + Composite oldComposite = g2d.getComposite(); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha + / MAX_ALPHA)); + } + g2d.setColor(BODY_COLOR); + g2d.fill(body); + g2d.setComposite(oldComposite); + g2d.setColor(componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : BORDER_COLOR); + g2d.draw(body); + // Draw pins + int pinSize = getClosestOdd(PIN_SIZE.convertToPixels()); + for (int i = 1; i < controlPoints.length; i++) { + g2d.setColor(PIN_COLOR); + g2d.fillOval(controlPoints[i].x - pinSize / 2, controlPoints[i].y - pinSize / 2, + pinSize, pinSize); + g2d.setColor(PIN_BORDER_COLOR); + g2d.drawOval(controlPoints[i].x - pinSize / 2, controlPoints[i].y - pinSize / 2, + pinSize, pinSize); + } + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + Area area = new Area(new Ellipse2D.Double(1, 1, width - 2, width - 2)); + int center = width / 2; + area.subtract(new Area(new Ellipse2D.Double(center - 2, center - 2, 5, 5))); + g2d.setColor(BODY_COLOR); + g2d.fill(area); + g2d.setColor(BORDER_COLOR); + g2d.draw(area); + + int radius = width / 2 - 6; + for (int i = 0; i < 8; i++) { + int x = (int) (center + Math.cos(i * Math.PI / 4) * radius); + int y = (int) (center + Math.sin(i * Math.PI / 4) * radius); + g2d.setColor(PIN_COLOR); + g2d.fillOval(x - 1, y - 1, 3, 3); + g2d.setColor(PIN_BORDER_COLOR); + g2d.drawOval(x - 1, y - 1, 3, 3); + } + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.NEVER; + } + + @Override + @EditableProperty(name = "Type") + public String getValue() { + return type; + } + + @Override + public void setValue(String value) { + this.type = value; + } + + @Override + public boolean isControlPointSticky(int index) { + return index > 0; + } + + @Override + public void setControlPoint(Point point, int index) { + controlPoints[index].setLocation(point); + body = null; + } + + static enum Base { + B9A("Noval B9A"), OCTAL("Octal"), B7G("Small-button B7G"); + + String name; + + private Base(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } + } + + static enum Mount { + CHASSIS("Chassis"), PCB("PCB"); + + String name; + + private Mount(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } + } +}