diff --git a/diylc/diylc-core/src/org/diylc/common/ObjectCache.java b/diylc/diylc-core/src/org/diylc/common/ObjectCache.java index 7b29facf..d4d3fff1 100644 --- a/diylc/diylc-core/src/org/diylc/common/ObjectCache.java +++ b/diylc/diylc-core/src/org/diylc/common/ObjectCache.java @@ -64,12 +64,12 @@ public class ObjectCache { return stroke; } - public Stroke fetchStroke(float width, float[] dash, float phase) { - String key = width + "|" + Arrays.toString(dash) + "|" + phase; + public Stroke fetchStroke(float width, float[] dash, float phase, int cap) { + String key = width + "|" + Arrays.toString(dash) + "|" + phase + "|" + phase; if (dashStrokeMap.containsKey(key)) { return dashStrokeMap.get(key); } - Stroke stroke = new BasicStroke(width, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 0, dash, phase); + Stroke stroke = new BasicStroke(width, cap, BasicStroke.JOIN_ROUND, 0, dash, phase); dashStrokeMap.put(key, stroke); return stroke; } diff --git a/diylc/diylc-core/src/org/diylc/presenter/G2DWrapper.java b/diylc/diylc-core/src/org/diylc/presenter/G2DWrapper.java index 2500123f..73df4b3f 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/G2DWrapper.java +++ b/diylc/diylc-core/src/org/diylc/presenter/G2DWrapper.java @@ -408,7 +408,7 @@ class G2DWrapper extends Graphics2D implements IDrawingObserver { BasicStroke bs = (BasicStroke) s; // make thin lines even thinner to compensate for zoom factor if (bs.getLineWidth() <= 2 && !(s instanceof ZoomableStroke)) - s = ObjectCache.getInstance().fetchStroke((float) (bs.getLineWidth() / zoom), bs.getDashArray(), bs.getDashPhase()); + s = ObjectCache.getInstance().fetchStroke((float) (bs.getLineWidth() / zoom), bs.getDashArray(), bs.getDashPhase(), bs.getEndCap()); } canvasGraphics.setStroke(s); } diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 8b2c7d5e..20714dc8 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java index f81108ea..be36fabb 100644 --- a/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java +++ b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java @@ -18,6 +18,7 @@ package org.diylc.components; import java.awt.AlphaComposite; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Composite; import java.awt.FontMetrics; @@ -322,10 +323,10 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp break; case DASHED: stroke = - ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness * 2, thickness * 4}, thickness * 4); + ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness * 2, thickness * 4}, thickness * 4, BasicStroke.CAP_SQUARE); break; case DOTTED: - stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness / 4, thickness * 4}, 0); + stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness / 4, thickness * 4}, 0, BasicStroke.CAP_ROUND); break; } diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java b/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java index 59419ed8..395f572b 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/CurvedTrace.java @@ -21,6 +21,7 @@ import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Path2D; +import org.diylc.common.LineStyle; import org.diylc.common.ObjectCache; import org.diylc.common.PCBLayer; import org.diylc.common.SimpleComponentTransformer; @@ -105,4 +106,9 @@ public class CurvedTrace extends AbstractCurvedComponent { public void setAlpha(Byte alpha) { super.setAlpha(alpha); } + + @Override + public LineStyle getStyle() { + return super.getStyle(); + } } diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java b/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java index 4e854e6c..f23cee31 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/HookupWire.java @@ -17,6 +17,7 @@ */ package org.diylc.components.connectivity; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Shape; @@ -67,10 +68,10 @@ public class HookupWire extends AbstractCurvedComponent { break; case DASHED: stroke = - ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness * 2, thickness * 3}, thickness * 4); + ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness * 2, thickness * 3}, thickness * 4, BasicStroke.CAP_SQUARE); break; case DOTTED: - stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness / 4, thickness * 3}, 0); + stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness / 4, thickness * 3}, 0, BasicStroke.CAP_ROUND); break; } Shape s = stroke.createStrokedShape(curve); diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/Line.java b/diylc/diylc-library/src/org/diylc/components/connectivity/Line.java index d787fe85..d3dee978 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/Line.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/Line.java @@ -21,6 +21,7 @@ */ package org.diylc.components.connectivity; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; @@ -81,10 +82,10 @@ public class Line extends AbstractLeadedComponent { stroke = ObjectCache.getInstance().fetchZoomableStroke(thickness); break; case DASHED: - stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness * 2, thickness * 4}, thickness * 4); + stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness * 2, thickness * 4}, thickness * 4, BasicStroke.CAP_SQUARE); break; case DOTTED: - stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness, thickness * 5}, 0); + stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] {thickness, thickness * 5}, 0, BasicStroke.CAP_ROUND); break; } g2d.setStroke(stroke); diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/TwistedWire.java b/diylc/diylc-library/src/org/diylc/components/connectivity/TwistedWire.java index 0a0737b7..c49ef436 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/TwistedWire.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/TwistedWire.java @@ -17,6 +17,7 @@ */ package org.diylc.components.connectivity; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; @@ -53,40 +54,29 @@ public class TwistedWire extends AbstractCurvedComponent { public static Color COLOR = Color.green; public static Color COLOR2 = Color.blue; + public static Color STRIPE_COLOR = Color.yellow; + public static Color STRIPE_COLOR2 = Color.decode("#FF00FF"); public static double INSULATION_THICKNESS_PCT = 0.3; protected AWG gauge = AWG._22; private Color color2 = COLOR2; + private Color stripeColor = STRIPE_COLOR; + private Color stripeColor2 = STRIPE_COLOR2; + private boolean stripe1 = false; + private boolean stripe2 = false; // cached areas transient private Area firstLeadArea = null; transient private Area secondLeadArea = null; + + transient private Area firstLeadStripeArea = null; + transient private Area secondLeadStripeArea = null; @Override protected Color getDefaultColor() { return COLOR; - } - - @EditableProperty(name = "Color 1") - public Color getLeadColor() { - return color; - } - - @EditableProperty(name = "Color 2") - public Color getColor2() { - return color2; - } - - public void setColor2(Color color2) { - this.color2 = color2; - } - - @Override - public LineStyle getStyle() { - // prevent from editing - return super.getStyle(); - } + } @Override protected void drawCurve(Path2D curve, Graphics2D g2d, ComponentState componentState, IDrawingObserver drawingObserver) { @@ -99,13 +89,36 @@ public class TwistedWire extends AbstractCurvedComponent { componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : color2; - if (firstLeadArea == null || secondLeadArea == null) - recalculate(curve, thickness); + if (firstLeadArea == null || secondLeadArea == null) { + firstLeadArea = new Area(); + secondLeadArea = new Area(); + recalculate(curve, thickness, firstLeadArea, secondLeadArea, false); + + if (stripe1 || stripe2) { + firstLeadStripeArea = new Area(); + secondLeadStripeArea = new Area(); + recalculate(curve, thickness, firstLeadStripeArea, secondLeadStripeArea, true); + firstLeadStripeArea.intersect(firstLeadArea); + secondLeadStripeArea.intersect(secondLeadArea); + } + } g2d.setColor(curveColor1); g2d.fill(firstLeadArea); + + if (stripe1 && componentState == ComponentState.NORMAL) { + g2d.setColor(stripeColor); + g2d.fill(firstLeadStripeArea); + } + g2d.setColor(curveColor2); g2d.fill(secondLeadArea); + + if (stripe2 && componentState == ComponentState.NORMAL) { + g2d.setColor(stripeColor2); + g2d.fill(secondLeadStripeArea); + } + if (componentState == ComponentState.NORMAL) { g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); g2d.setColor(color.darker()); @@ -148,6 +161,8 @@ public class TwistedWire extends AbstractCurvedComponent { // invalidate cached areas this.firstLeadArea = null; this.secondLeadArea = null; + this.firstLeadStripeArea = null; + this.secondLeadStripeArea = null; } @Override @@ -157,6 +172,8 @@ public class TwistedWire extends AbstractCurvedComponent { // invalidate cached areas this.firstLeadArea = null; this.secondLeadArea = null; + this.firstLeadStripeArea = null; + this.secondLeadStripeArea = null; } @Override @@ -166,6 +183,8 @@ public class TwistedWire extends AbstractCurvedComponent { // invalidate cached areas this.firstLeadArea = null; this.secondLeadArea = null; + this.firstLeadStripeArea = null; + this.secondLeadStripeArea = null; } @Override @@ -176,9 +195,81 @@ public class TwistedWire extends AbstractCurvedComponent { @Override public void setValue(Void value) {} + @EditableProperty(name = "Color 1") + public Color getLeadColor() { + return color; + } + + @EditableProperty(name = "Color 2") + public Color getColor2() { + return color2; + } + + public void setColor2(Color color2) { + this.color2 = color2; + } + + @Override + public LineStyle getStyle() { + // prevent from editing + return super.getStyle(); + } + + @EditableProperty(name = "Stripe 1") + public Color getStripeColor() { + return stripeColor; + } + + public void setStripeColor(Color stripeColor) { + this.stripeColor = stripeColor; + } + + @EditableProperty(name = "Stripe 2") + public Color getStripeColor2() { + return stripeColor2; + } + + public void setStripeColor2(Color stripeColor2) { + this.stripeColor2 = stripeColor2; + } + + @EditableProperty(name = "Show Stripe 1") + public boolean getStripe1() { + return stripe1; + } + + public void setStripe1(boolean stripe1) { + this.stripe1 = stripe1; + + if (stripe1) { + // invalidate cached areas + this.firstLeadArea = null; + this.secondLeadArea = null; + this.firstLeadStripeArea = null; + this.secondLeadStripeArea = null; + } + } + + @EditableProperty(name = "Show Stripe 2") + public boolean getStripe2() { + return stripe2; + } + + public void setStripe2(boolean stripe2) { + this.stripe2 = stripe2; + + if (stripe2) { + // invalidate cached areas + this.firstLeadArea = null; + this.secondLeadArea = null; + this.firstLeadStripeArea = null; + this.secondLeadStripeArea = null; + } + } + // hard-core math below :) - public void recalculate(Path2D path, float thickness) { + public void recalculate(Path2D path, float thickness, Area firstLeadArea, Area secondLeadArea, boolean stripe) { PathIterator iterator = path.getPathIterator(null); float[] coords = new float[6]; Point current = new Point(); @@ -210,8 +301,13 @@ public class TwistedWire extends AbstractCurvedComponent { } iterator.next(); } - - Stroke stroke = ObjectCache.getInstance().fetchBasicStroke(thickness); + + Stroke stroke; + + if (stripe) + stroke = ObjectCache.getInstance().fetchStroke(thickness, new float[] { thickness / 2, thickness * 2 }, thickness * 10, BasicStroke.CAP_BUTT); + else + stroke = ObjectCache.getInstance().fetchBasicStroke(thickness); double segmentLength = thickness * 6; @@ -220,9 +316,6 @@ public class TwistedWire extends AbstractCurvedComponent { for (CubicCurve2D curve : curves) polygon.addAll(split(curve, segmentLength)); - firstLeadArea = new Area(); - secondLeadArea = new Area(); - List firstCurves = new ArrayList(); List secondCurves = new ArrayList(); diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 8b2c7d5e..20714dc8 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index f0ba44e3..f97b8bcc 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ