From 93a4978e6848104f9059dff0b7f31b4a8fbc0352 Mon Sep 17 00:00:00 2001 From: bancika Date: Wed, 21 Mar 2012 02:42:12 +0000 Subject: [PATCH] single coil pickup --- .../components/guitar/HumbuckerPickup.java | 16 +- .../components/guitar/SingleCoilPickup.java | 254 ++++++++++++++++++ .../diylc-swing/library/main.jar | Bin 175375 -> 181231 bytes .../diylc-swing/update.xml | 6 +- 4 files changed, 268 insertions(+), 8 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java 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 index a9bc0449..41c91200 100644 --- 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 @@ -39,15 +39,15 @@ public class HumbuckerPickup extends AbstractTransparentComponent { 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 LENGTH = new Size(68.58d, 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 POLE_SIZE = new Size(3d, SizeUnit.mm); + private static Size POLE_SPACING = new Size(10.1d, SizeUnit.mm); private static Size COIL_SPACING = new Size(18d, SizeUnit.mm); private String value = ""; @@ -92,6 +92,7 @@ public class HumbuckerPickup extends AbstractTransparentComponent { g2d.draw(body[0]); g2d.draw(body[1]); if (!outlineMode) { + g2d.setColor(color.darker()); g2d.draw(body[3]); } @@ -153,11 +154,12 @@ public class HumbuckerPickup extends AbstractTransparentComponent { 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); + * poleSpacing - poleSize / 2, y - pointMargin + coilMargin - poleSize / 2, + poleSize, poleSize); poleArea.add(new Area(pole)); - pole = new Ellipse2D.Double( - x + pointMargin - length + poleMargin + i * poleSpacing, y - pointMargin - + width - coilMargin - poleSize, poleSize, poleSize); + pole = new Ellipse2D.Double(x + pointMargin - length + poleMargin + i * poleSpacing + - poleSize / 2, y - pointMargin + width - coilMargin - poleSize / 2, + poleSize, poleSize); poleArea.add(new Area(pole)); } body[3] = poleArea; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java new file mode 100644 index 00000000..b428a50f --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java @@ -0,0 +1,254 @@ +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.Polygon; +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 = "Strat Single Coil Pickup", category = "Guitar", author = "Branislav Stojkovic", description = "Strat-style single coil guitar pickup", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "PKP") +public class SingleCoilPickup extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + private static Color BODY_COLOR = Color.darkGray; + private static Color POINT_COLOR = Color.lightGray; + private static Size WIDTH = new Size(15.5d, SizeUnit.mm); + private static Size LENGTH = new Size(83.82d, SizeUnit.mm); + private static Size LIP_WIDTH = new Size(5d, SizeUnit.mm); + private static Size LIP_LENGTH = new Size(20d, SizeUnit.mm); + private static Size POINT_SIZE = new Size(3d, SizeUnit.mm); + private static Size HOLE_SIZE = new Size(2d, SizeUnit.mm); + private static Size HOLE_MARGIN = new Size(4d, SizeUnit.mm); + private static Size POLE_SIZE = new Size(3d, SizeUnit.mm); + private static Size POLE_SPACING = new Size(11.68d, 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.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : POINT_COLOR); + g2d.fill(body[1]); + 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 + .brighter(); + } + + g2d.setColor(finalBorderColor); + g2d.draw(body[0]); + if (!outlineMode) { + g2d.draw(body[2]); + } + + 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[3]; + + 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 pointSize = getClosestOdd(POINT_SIZE.convertToPixels()); + int holeSize = getClosestOdd(HOLE_SIZE.convertToPixels()); + int holeMargin = getClosestOdd(HOLE_MARGIN.convertToPixels()); + + Area mainArea = new Area(new RoundRectangle2D.Double(x - length / 2, y - lipWidth / 2 + - width, length, width, width, width)); + mainArea.add(new Area(new Polygon(new int[] { x - length / 2 + width / 2, + x + length / 2 - width / 2, x + lipLength / 2, x - lipLength / 2 }, new int[] { + y - lipWidth / 2, y - lipWidth / 2, y + lipWidth / 2, y + lipWidth / 2 }, 4))); + // Cutout holes + mainArea.subtract(new Area(new Ellipse2D.Double(x - length / 2 + holeMargin - holeSize + / 2, y - lipWidth / 2 - width / 2 - holeSize / 2, holeSize, holeSize))); + mainArea.subtract(new Area(new Ellipse2D.Double(x + length / 2 - holeMargin - holeSize + / 2, y - lipWidth / 2 - width / 2 - holeSize / 2, holeSize, holeSize))); + + body[0] = mainArea; + + body[1] = 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 poleMargin = (length - poleSpacing * 5) / 2; + Area poleArea = new Area(); + for (int i = 0; i < 6; i++) { + Ellipse2D pole = new Ellipse2D.Double( + x - length / 2 + poleMargin + i * poleSpacing, y - lipWidth / 2 - width / 2 + - poleSize / 2, poleSize, poleSize); + poleArea.add(new Area(pole)); + } + body[2] = 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) { + int bodyWidth = 8 * width / 32; + int bodyLength = 30 * width / 32; + g2d.setColor(BODY_COLOR); + g2d.fillRoundRect((width - bodyWidth) / 2, (height - bodyLength) / 2, bodyWidth, + bodyLength, bodyWidth, bodyWidth); + g2d.fillPolygon(new int[] { width * 9 / 16, width * 9 / 16, width * 11 / 16, width * 11 / 16 }, + new int[] { (height - bodyLength) / 2, (height + bodyLength) / 2, height * 5 / 8, + height * 3 / 8 }, 4); + + g2d.setColor(Color.lightGray); + g2d.drawLine(width / 2, 4 * width / 32, width / 2, 4 * width / 32); + g2d.drawLine(width / 2, height - 4 * width / 32, width / 2, height - 4 * width / 32); + } + + @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 4eb1c3218ef30053dbb2b259ef42569375d901a3..972b5013ee5cc15d6b0efa2ad2053c912d4df42b 100644 GIT binary patch delta 14490 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 I8XxZe0M2f|%K!iX delta 8644 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%0ANC|n>%4=@1%xP&K#%l-r5 z*fuEAaNJxqJsb!f$_;$N#IWZB4l&3^5a7kkN4y-+fSFYtW#9-ieqX^+xoT_#;sXIF zkc~Xex3L8vMJL?>PS=33A>fVi_0br3g&8L&7r+C|r&je&ooPyW003{ea%>vY5 z@IDK;0|VCVQog+dZzS1EO%>Q$jmHn*Z2e=c3q=N6D zK$!}F0@lA8k0R-SmKy`KTBOeC_pv~WYT#5KT>i;EL;TOq3A2w+*ibqQTV4s!!|c!r8_)VrdmdbuK;nZ3)d0a|Xi>=~ zB?Z`UpIGHB_9DX$hXxyW*5D1Yo`n$#$J-0iO6x6K&;5QR=sDW}DG5u$v23u+X zcq;{mPE5y67!!Uizyb$YEXkGhg91E+wjZuD0SsL+Qm0yg2JUxQE#%;mJBID51*l+l z?u14AU|47izYI#EPa~?LA(QE|eA8L`F11eLEqZb>9Jtkm9~OhJ%Wxh`7^Fes{iRJ zz}{XY3D{e5+UT%cVL~68|0XE-**RsZ``3sZj2uK_gT-%7lW2GYB{9&Cu`@0qalqp@ z06E;BXtO^4RA}i&LW6d83Ok4X=?OuzhErFL4UntC4<{xn%n=2hXRNR*i4eDJBFN1# z6#^l5ra$51XZ06A=0@NO+~~iD-v3|uzZU+d5p)hRz*AGy2+$!TK*0up8WVmKB47(a z6O#=l0G4Zz`qP1?e+ubTh?IBJ|j31J8&0kwSVuQ0}7D7`E+v;Y=*pK z;)B~w06XZ>3^2f6{vD&x_?>-gIVn!0Y#?;1l7K0Vr*r2}kRDS2y)LgI{q-|ZrKvIc zG(Lb7RC{|m)+TSEs1kG-Q~KM}b=!EtKH$Nyf8U;NX^brp%PE9mEm{EhmK^jsVL2o* zEOa(w-k(n=tbja*z1#{g!@Z%5P7b>Pt*m-z8Hk<9u1EnRjW&cnz9h7sj!8)? NEW_FEATURE - Humbucker Pickup + Humbucker pickup + + + NEW_FEATURE + Single coil pickup http://code.google.com/p/diy-layout-creator/downloads/list