From 3a419ba3bc1c280bdacc3d625ba0c6cf4dc593cd Mon Sep 17 00:00:00 2001 From: bancika Date: Fri, 28 Jan 2011 20:05:37 +0000 Subject: [PATCH] added transistor --- .../DIYLC/config.xml | 16 +- .../DIYLC/library/main.jar | Bin 61372 -> 65466 bytes .../semiconductors/TransistorTO92.java | 225 ++++++++++++++++++ 3 files changed, 237 insertions(+), 4 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/semiconductors/TransistorTO92.java diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml index 8e0076bf..197268d1 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml @@ -1,15 +1,15 @@ - metric - true + lastPath + C:\Documents and Settings\Branislav Stojkovic\workspace\DIYLC\templates zoom 1.0 - lastPath - C:\Documents and Settings\Branislav Stojkovic\workspace\DIYLC\templates + metric + true default.org.diylc.components.misc.Label:Color @@ -20,4 +20,12 @@ 255 + + showTemplatesAtStartup + false + + + default.org.diylc.components.semiconductors.TransistorTO92:Orientation + DEFAULT + \ No newline at end of file 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 1ba116e28d53fe260d7d21cb2df509abcb45f3f1..698fe03f8b9e48f4fc5e3bcd602a0c46c8dcef11 100644 GIT binary patch delta 4731 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 O`SbQMfk5NifchVKiI&9x delta 721 zcmXxiUr1A77zXg2bG8ZdzybxsidvaJN0Uv}qkP<3DxmX3Bi)IzS zPu$9alZG}C2IS9r=*iin{rMKwmkZuY*dHkB;r`CG86EPovU#el{H;X}R;O7H*814z zX|!MPc5=9jij19ETAEbmM9jnlEgCp0+nB};uE|I)-N=k-mGa{l3L3GecrE~%(`!vjOfezHK&&a zF;}{H)viB>Rd}-|#SFTY>)?e_0lq6Y)h3rQWC87=X7Dz27oqmB^!e|F@MDK&$XeX#X?gb0SPeD$MIASeGKVs}F zJ-LH4p5f<-9cM3(^Oni@Bh>!IyFg2V_!1A1@=lqCGwhynv?bY%+ES9I)urws*;4$Y d<+)Zdv=qwxli&H { + + private static final long serialVersionUID = 1L; + + public static Color BODY_COLOR = Color.gray; + public static Color BORDER_COLOR = Color.gray.darker(); + 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 Size PIN_SIZE = new Size(0.03d, SizeUnit.in); + public static Size PIN_SPACING = new Size(0.1d, SizeUnit.in); + public static Size BODY_DIAMETER = new Size(0.2d, SizeUnit.in); + + private String value = ""; + private Orientation orientation = Orientation.DEFAULT; + private Point[] controlPoints = new Point[] { new Point(0, 0), new Point(0, 0), new Point(0, 0) }; + // new Point(0, pinSpacing.convertToPixels()), + // new Point(0, 2 * pinSpacing.convertToPixels()), + // new Point(0, 3 * pinSpacing.convertToPixels()), + // new Point(3 * pinSpacing.convertToPixels(), 0), + // new Point(3 * pinSpacing.convertToPixels(), + // pinSpacing.convertToPixels()), + // new Point(3 * pinSpacing.convertToPixels(), 2 * + // pinSpacing.convertToPixels()), + // new Point(3 * pinSpacing.convertToPixels(), 3 * + // pinSpacing.convertToPixels()) }; + private Area body; + + public TransistorTO92() { + super(); + updateControlPoints(); + } + + @EditableProperty + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + 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() { + int pinSpacing = PIN_SPACING.convertToPixels(); + // Update control points. + int x = controlPoints[0].x; + int y = controlPoints[0].y; + switch (orientation) { + case DEFAULT: + controlPoints[1].setLocation(x, y + pinSpacing); + controlPoints[2].setLocation(x, y + 2 * pinSpacing); + break; + case _90: + controlPoints[1].setLocation(x - pinSpacing, y); + controlPoints[2].setLocation(x - 2 * pinSpacing, y); + break; + case _180: + controlPoints[1].setLocation(x, y - pinSpacing); + controlPoints[2].setLocation(x, y - 2 * pinSpacing); + break; + case _270: + controlPoints[1].setLocation(x + pinSpacing, y); + controlPoints[2].setLocation(x + 2 * pinSpacing, y); + break; + default: + throw new RuntimeException("Unexpected orientation: " + orientation); + } + } + + public Area getBody() { + if (body == null) { + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int pinSpacing = PIN_SPACING.convertToPixels(); + int bodyDiameter = getClosestOdd(BODY_DIAMETER.convertToPixels()); + + switch (orientation) { + case DEFAULT: + body = new Area(new Ellipse2D.Double(x - bodyDiameter / 2, y + pinSpacing + - bodyDiameter / 2, bodyDiameter, bodyDiameter)); + body.subtract(new Area(new Rectangle2D.Double(x - bodyDiameter, y + pinSpacing + - bodyDiameter / 2, 3 * bodyDiameter / 4, bodyDiameter))); + break; + case _90: + body = new Area(new Ellipse2D.Double(x - pinSpacing - bodyDiameter / 2, y + - bodyDiameter / 2, bodyDiameter, bodyDiameter)); + body.subtract(new Area(new Rectangle2D.Double(x - pinSpacing - bodyDiameter / 2, y + - bodyDiameter, bodyDiameter, 3 * bodyDiameter / 4))); + break; + case _180: + body = new Area(new Ellipse2D.Double(x - bodyDiameter / 2, y - pinSpacing + - bodyDiameter / 2, bodyDiameter, bodyDiameter)); + body.subtract(new Area(new Rectangle2D.Double(x + bodyDiameter / 4, y - pinSpacing + - bodyDiameter / 2, 3 * bodyDiameter / 4, bodyDiameter))); + break; + case _270: + body = new Area(new Ellipse2D.Double(x + pinSpacing - bodyDiameter / 2, y + - bodyDiameter / 2, bodyDiameter, bodyDiameter)); + body.subtract(new Area(new Rectangle2D.Double(x + pinSpacing - bodyDiameter / 2, y + + bodyDiameter / 4, bodyDiameter, 3 * bodyDiameter / 4))); + break; + default: + throw new RuntimeException("Unexpected orientation: " + orientation); + } + } + return body; + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, Project project, + IDrawingObserver drawingObserver) { + int pinSize = PIN_SIZE.convertToPixels() / 2 * 2; + Area mainArea = 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(mainArea); + g2d.setComposite(oldComposite); + g2d.setColor(componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : BORDER_COLOR); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + g2d.draw(mainArea); + + for (Point point : controlPoints) { + g2d.setColor(PIN_COLOR); + g2d.fillOval(point.x - pinSize / 2, point.y - pinSize / 2, pinSize, pinSize); + g2d.setColor(PIN_BORDER_COLOR); + g2d.drawOval(point.x - pinSize / 2, point.y - pinSize / 2, pinSize, pinSize); + } + + // Draw label. + g2d.setFont(LABEL_FONT); + g2d.setColor(LABEL_COLOR); + FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); + Rectangle2D rect = fontMetrics.getStringBounds(getName(), 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(getName(), x, y); + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int margin = 3 * width / 32; + Area area = new Area(new Ellipse2D.Double(margin / 2, margin, width - 2 * margin, width - 2 + * margin)); + area.subtract(new Area(new Rectangle2D.Double(0, 0, 2 * margin, height))); + g2d.setColor(BODY_COLOR); + g2d.fill(area); + g2d.setColor(BORDER_COLOR); + g2d.draw(area); + } +}