From ab10103e41bf76285832f4f7ad188bb9d2d40cc9 Mon Sep 17 00:00:00 2001 From: bancika Date: Mon, 19 Mar 2012 00:15:56 +0000 Subject: [PATCH] added humbucker pickup --- .../electromechanical/CliffJack1_4.java | 16 -- .../components/guitar/HumbuckerPickup.java | 252 ++++++++++++++++++ .../diylc-swing/library/main.jar | Bin 169613 -> 175375 bytes .../diylc-swing/update.xml | 6 +- 4 files changed, 257 insertions(+), 17 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/HumbuckerPickup.java diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java index 909d6423..36621a54 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java @@ -177,8 +177,6 @@ public class CliffJack1_4 extends AbstractTransparentComponent { Project project, IDrawingObserver drawingObserver) { Shape[] body = getBody(); - // Rectangle bounds = body.getBounds(); - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); if (componentState != ComponentState.DRAGGING) { Composite oldComposite = g2d.getComposite(); @@ -187,26 +185,12 @@ public class CliffJack1_4 extends AbstractTransparentComponent { / MAX_ALPHA)); } g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : BODY_COLOR); - // GradientPaint gradient; - // if (orientation == Orientation.DEFAULT || orientation == - // Orientation._180) { - // gradient = new GradientPaint(bounds.x, bounds.y, BORDER_COLOR, - // bounds.x, bounds.y - // + bounds.height / 2, BODY_COLOR, true); - // } else { - // gradient = new GradientPaint(bounds.x, bounds.y, BORDER_COLOR, - // bounds.x - // + bounds.width / 2, bounds.y, BODY_COLOR, true); - // } - // Paint oldPaint = g2d.getPaint(); - // g2d.setPaint(gradient); for (int i = 0; i < body.length - 1; i++) { // Nut is brighter colored. if (i == body.length - 2) g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : NUT_COLOR); g2d.fill(body[i]); } - // g2d.setPaint(oldPaint); g2d.setComposite(oldComposite); } diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/HumbuckerPickup.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/HumbuckerPickup.java new file mode 100644 index 00000000..7698d1c1 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/HumbuckerPickup.java @@ -0,0 +1,252 @@ +package org.diylc.components.guitar; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.RoundRectangle2D; + +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.HorizontalAlignment; +import org.diylc.common.IPlugInPort; +import org.diylc.common.ObjectCache; +import org.diylc.common.Orientation; +import org.diylc.common.VerticalAlignment; +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.Theme; +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; +import org.diylc.utils.Constants; + +@ComponentDescriptor(name = "Humbucker Pickup", category = "Guitar", author = "Branislav Stojkovic", description = "PAF-style humbucker guitar pickup", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "PCKP") +public class HumbuckerPickup extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + private static Color BODY_COLOR = Color.lightGray; + private static Color POINT_COLOR = Color.darkGray; + private static Size WIDTH = new Size(36.5d, SizeUnit.mm); + private static Size LENGTH = new Size(68.4d, SizeUnit.mm); + private static Size LIP_WIDTH = new Size(12.7d, SizeUnit.mm); + private static Size LIP_LENGTH = new Size(7.9d, SizeUnit.mm); + private static Size EDGE_RADIUS = new Size(4d, SizeUnit.mm); + private static Size POINT_MARGIN = new Size(5d, SizeUnit.mm); + private static Size POINT_SIZE = new Size(3d, SizeUnit.mm); + private static Size LIP_HOLE_SIZE = new Size(1.5d, SizeUnit.mm); + private static Size POLE_SIZE = new Size(2.5d, SizeUnit.mm); + private static Size POLE_SPACING = new Size(9.8d, SizeUnit.mm); + private static Size COIL_SPACING = new Size(18d, SizeUnit.mm); + + private String value = ""; + private Point controlPoint = new Point(0, 0); + transient Shape[] body; + private Orientation orientation = Orientation.DEFAULT; + private Color color = BODY_COLOR; + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, + Project project, IDrawingObserver drawingObserver) { + Shape[] body = getBody(); + + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); + if (componentState != ComponentState.DRAGGING) { + Composite oldComposite = g2d.getComposite(); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha + / MAX_ALPHA)); + } + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : color); + g2d.fill(body[0]); + g2d.fill(body[1]); + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : POINT_COLOR); + g2d.fill(body[2]); + g2d.setComposite(oldComposite); + } + + Color finalBorderColor; + if (outlineMode) { + Theme theme = (Theme) ConfigurationManager.getInstance().readObject( + IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + finalBorderColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : theme + .getOutlineColor(); + } else { + finalBorderColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : color.darker(); + } + + g2d.setColor(finalBorderColor); + g2d.draw(body[0]); + g2d.draw(body[1]); + if (!outlineMode) { + g2d.draw(body[3]); + } + + Color finalLabelColor; + if (outlineMode) { + Theme theme = (Theme) ConfigurationManager.getInstance().readObject( + IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + finalLabelColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED : theme + .getOutlineColor(); + } else { + finalLabelColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED + : LABEL_COLOR; + } + g2d.setColor(finalLabelColor); + g2d.setFont(LABEL_FONT); + Rectangle bounds = body[0].getBounds(); + drawCenteredText(g2d, value, bounds.x + bounds.width / 2, bounds.y + bounds.height / 2, + HorizontalAlignment.CENTER, VerticalAlignment.CENTER); + } + + public Shape[] getBody() { + if (body == null) { + body = new Shape[4]; + + int x = controlPoint.x; + int y = controlPoint.y; + int width = (int) WIDTH.convertToPixels(); + int length = (int) LENGTH.convertToPixels(); + int lipWidth = (int) LIP_WIDTH.convertToPixels(); + int lipLength = (int) LIP_LENGTH.convertToPixels(); + int edgeRadius = (int) EDGE_RADIUS.convertToPixels(); + int pointMargin = (int) POINT_MARGIN.convertToPixels(); + int pointSize = getClosestOdd(POINT_SIZE.convertToPixels()); + int lipHoleSize = getClosestOdd(LIP_HOLE_SIZE.convertToPixels()); + + body[0] = new Area(new RoundRectangle2D.Double(x + pointMargin - length, y + - pointMargin, length, width, edgeRadius, edgeRadius)); + body[1] = new Area(new RoundRectangle2D.Double(x + pointMargin - length - lipLength, y + - pointMargin + width / 2 - lipWidth / 2, length + 2 * lipLength, lipWidth, + edgeRadius / 2, edgeRadius / 2)); + Area lipArea = new Area(body[1]); + lipArea.subtract(new Area(body[0])); + lipArea.subtract(new Area(new Ellipse2D.Double( + x + pointMargin - length - lipLength / 2, y - pointMargin + width / 2 + - lipHoleSize / 2, lipHoleSize, lipHoleSize))); + lipArea.subtract(new Area(new Ellipse2D.Double(x + pointMargin + lipLength / 2, y + - pointMargin + width / 2 - lipHoleSize / 2, lipHoleSize, lipHoleSize))); + body[1] = lipArea; + body[2] = new Area(new Ellipse2D.Double(x - pointSize / 2, y - pointSize / 2, + pointSize, pointSize)); + + int poleSize = (int) POLE_SIZE.convertToPixels(); + int poleSpacing = (int) POLE_SPACING.convertToPixels(); + int coilSpacing = (int) COIL_SPACING.convertToPixels(); + int coilMargin = (width - coilSpacing) / 2; + int poleMargin = (length - poleSpacing * 5) / 2; + Area poleArea = new Area(); + for (int i = 0; i < 6; i++) { + Ellipse2D pole = new Ellipse2D.Double(x + pointMargin - length + poleMargin + i + * poleSpacing, y - pointMargin + coilMargin, poleSize, poleSize); + poleArea.add(new Area(pole)); + pole = new Ellipse2D.Double( + x + pointMargin - length + poleMargin + i * poleSpacing, y - pointMargin + + width - coilMargin - poleSize, poleSize, poleSize); + poleArea.add(new Area(pole)); + } + body[3] = poleArea; + + // Rotate if needed + if (orientation != Orientation.DEFAULT) { + double theta = 0; + switch (orientation) { + case _90: + theta = Math.PI / 2; + break; + case _180: + theta = Math.PI; + break; + case _270: + theta = Math.PI * 3 / 2; + break; + } + AffineTransform rotation = AffineTransform.getRotateInstance(theta, x, y); + for (Shape shape : body) { + Area area = (Area) shape; + area.transform(rotation); + } + } + } + return body; + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + // TODO Auto-generated method stub + + } + + @Override + public int getControlPointCount() { + return 1; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.WHEN_SELECTED; + } + + @Override + public boolean isControlPointSticky(int index) { + return true; + } + + @Override + public Point getControlPoint(int index) { + return controlPoint; + } + + @Override + public void setControlPoint(Point point, int index) { + this.controlPoint.setLocation(point); + // Invalidate the body + body = null; + } + + @EditableProperty(name = "Model") + @Override + public String getValue() { + return value; + } + + @Override + public void setValue(String value) { + this.value = value; + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + // Invalidate the body + body = null; + } + + @EditableProperty + public Color getColor() { + return color; + } + + public void setColor(Color color) { + this.color = color; + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/library/main.jar index b0a258483d2b92d1f6114dcfba66d784cbc1c5e4..4eb1c3218ef30053dbb2b259ef42569375d901a3 100644 GIT binary patch delta 14999 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 delta 9435 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 NEW_FEATURE Plastic DC jack - + + + NEW_FEATURE + Humbucker Pickup + http://code.google.com/p/diy-layout-creator/downloads/list