From 6c241b3180720f3b42d1937d8060129acadab965 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Mon, 18 Mar 2019 22:49:27 +0100 Subject: [PATCH] added third control point to leaded components to set label position --- diylc/diylc-library/lib/diylc-core.jar | Bin 277538 -> 277538 bytes .../components/AbstractLeadedComponent.java | 234 ++++++++++++------ diylc/diylc-swing/lib/diylc-core.jar | Bin 277538 -> 277538 bytes diylc/diylc-swing/library/main.jar | Bin 615764 -> 616679 bytes diylc/diylc-swing/update.xml | 6 +- 5 files changed, 165 insertions(+), 75 deletions(-) diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 19b852f8763cec0f2b634df9f51c61c09517b77c..53c10e4f5613857cc3c9e8d04d298322f5f19dfd 100644 GIT binary patch delta 5609 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 F{|(`zHU|Iz diff --git a/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java index d3ee99ab..180b4028 100644 --- a/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java +++ b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java @@ -37,9 +37,11 @@ import java.awt.geom.Rectangle2D; import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.awt.ShadedPaint; import org.diylc.common.Display; +import org.diylc.common.HorizontalAlignment; import org.diylc.common.IPlugInPort; import org.diylc.common.LineStyle; import org.diylc.common.ObjectCache; +import org.diylc.common.VerticalAlignment; import org.diylc.core.ComponentState; import org.diylc.core.IDrawingObserver; import org.diylc.core.Project; @@ -69,8 +71,10 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp protected Size length; protected Size width; - protected Point[] points = new Point[] {new Point((int) (-DEFAULT_SIZE.convertToPixels() / 2), 0), - new Point((int) (DEFAULT_SIZE.convertToPixels() / 2), 0)}; + @Deprecated + protected Point[] points; + protected Point[] newPoints = new Point[] {new Point((int) (-DEFAULT_SIZE.convertToPixels() / 2), 0), + new Point((int) (DEFAULT_SIZE.convertToPixels() / 2), 0), new Point(0, 0)}; protected Color bodyColor = Color.white; protected Color borderColor = Color.black; protected Color labelColor = LABEL_COLOR; @@ -78,6 +82,11 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp protected Display display = Display.NAME; private boolean flipStanding = false; private LabelOriantation labelOriantation = LabelOriantation.Directional; + protected boolean moveLabel = false; + + // parameters for adjusting the label control point + protected Double gamma = null; + protected Double p = null; protected AbstractLeadedComponent() { super(); @@ -94,22 +103,61 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp protected boolean IsCopperArea() { return false; } + + protected Point[] getNewPoints() { + // convert old points to new + if (points != null) { + newPoints = new Point[] { points[0], points[1], calculateLabelPosition(points[0], points[1]) }; + points = null; + // to make standing components backward compatible and not show a label until the user switches the display to something else + if (isStanding()) + display = Display.NONE; + } + return newPoints; + } + + protected Point calculateLabelPosition(Point point1, Point point2) { + double x = (point1.x + point2.x) / 2.0; + double y = (point1.y + point2.y) / 2.0; + return new Point((int) x, (int) y); + } @Override public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, IDrawingObserver drawingObserver) { - double distance = points[0].distance(points[1]); + if (gamma != null) { + // recalculate center position and theta, then adjust label point accordingly, while preserving alpha and p + double x = (getNewPoints()[1].x + getNewPoints()[0].x) / 2.0; + double y = (getNewPoints()[1].y + getNewPoints()[0].y) / 2.0; + double theta = Math.atan2(getNewPoints()[1].y - getNewPoints()[0].y, getNewPoints()[1].x - getNewPoints()[0].x); + double beta = gamma - (Math.PI / 2 - theta); + getNewPoints()[2].setLocation(x + Math.cos(beta) * p, y + Math.sin(beta) * p); + gamma = null; + p = null; + } + + double distance = getNewPoints()[0].distance(getNewPoints()[1]); Shape shape = getBodyShape(); // If there's no body, just draw the line connecting the ending points. if (shape == null) { drawLead(g2d, componentState, drawingObserver, IsCopperArea()); - } else if (supportsStandingMode() && length.convertToPixels() > points[0].distance(points[1])) { + return; + } + + AffineTransform oldTransform = g2d.getTransform(); + double width; + double length; + Rectangle shapeRect; + double theta = Math.atan2(getNewPoints()[1].y - getNewPoints()[0].y, getNewPoints()[1].x - getNewPoints()[0].x); + + if (isStanding()) { // When ending points are too close draw the component in standing // mode. - int width = getClosestOdd(this.width.convertToPixels()); + width = length = getClosestOdd(this.width.convertToPixels()); Shape body = - new Ellipse2D.Double((getFlipStanding() ? points[1] : points[0]).x - width / 2, - (getFlipStanding() ? points[1] : points[0]).y - width / 2, width, width); + new Ellipse2D.Double((getFlipStanding() ? getNewPoints()[1] : getNewPoints()[0]).x - width / 2, + (getFlipStanding() ? getNewPoints()[1] : getNewPoints()[0]).y - width / 2, width, width); + shapeRect = body.getBounds(); Composite oldComposite = g2d.getComposite(); if (alpha < MAX_ALPHA) { g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); @@ -138,11 +186,10 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp } } else { // Normal mode with component body in the center and two lead parts. - Rectangle shapeRect = shape.getBounds(); - double theta = Math.atan2(points[1].y - points[0].y, points[1].x - points[0].x); + shapeRect = shape.getBounds(); // Go back to the original transformation to draw leads. if (!outlineMode) { - AffineTransform textTransform = g2d.getTransform(); +// AffineTransform textTransform = g2d.getTransform(); // if (length.convertToPixels() > points[0].distance(points[1])) // { // g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, @@ -157,14 +204,14 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp Area leadArea = new Area(); - int endX = (int) (points[0].x + Math.cos(theta) * leadLength); - int endY = (int) (points[0].y + Math.sin(theta) * leadLength); - Line2D line = new Line2D.Double(points[0].x, points[0].y, endX, endY); + int endX = (int) (getNewPoints()[0].x + Math.cos(theta) * leadLength); + int endY = (int) (getNewPoints()[0].y + Math.sin(theta) * leadLength); + Line2D line = new Line2D.Double(getNewPoints()[0].x, getNewPoints()[0].y, endX, endY); leadArea.add(new Area(leadStroke.createStrokedShape(line))); - endX = (int) (points[1].x + Math.cos(theta - Math.PI) * leadLength); - endY = (int) (points[1].y + Math.sin(theta - Math.PI) * leadLength); - line = new Line2D.Double(points[1].x, points[1].y, endX, endY); + endX = (int) (getNewPoints()[1].x + Math.cos(theta - Math.PI) * leadLength); + endY = (int) (getNewPoints()[1].y + Math.sin(theta - Math.PI) * leadLength); + line = new Line2D.Double(getNewPoints()[1].x, getNewPoints()[1].y, endX, endY); leadArea.add(new Area(leadStroke.createStrokedShape(line))); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); @@ -178,13 +225,10 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp g2d.setColor(leadColor); drawLeads(g2d, theta, leadLength); } - g2d.setTransform(textTransform); +// g2d.setTransform(textTransform); } // Transform graphics to draw the body in the right place and at the - // right angle. - AffineTransform oldTransform = null; - double width; - double length; + // right angle. if (useShapeRectAsPosition()) { width = shapeRect.getHeight(); length = shapeRect.getWidth(); @@ -192,8 +236,7 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp width = getWidth().convertToPixels(); length = getLength().convertToPixels(); } - oldTransform = g2d.getTransform(); - g2d.translate((points[0].x + points[1].x - length) / 2, (points[0].y + points[1].y - width) / 2); + g2d.translate((getNewPoints()[0].x + getNewPoints()[1].x - length) / 2, (getNewPoints()[0].y + getNewPoints()[1].y - width) / 2); g2d.rotate(theta, length / 2, width / 2); // Draw body. Composite oldComposite = g2d.getComposite(); @@ -244,64 +287,88 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp decorateComponentBody(g2d, outlineMode); g2d.setComposite(oldComposite); } + } - // Draw label. - g2d.setFont(project.getFont()); - if (useShapeRectAsPosition()) { - g2d.translate(shapeRect.x, shapeRect.y); - } - 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 - : labelColor; - } - g2d.setColor(finalLabelColor); - FontMetrics fontMetrics = g2d.getFontMetrics(); - String label = ""; - label = display == Display.NAME ? getName() : (getValue() == null ? "" : getValue().toString()); - if (display == Display.NONE) { - label = ""; - } - if (display == Display.BOTH) { - label = getName() + " " + (getValue() == null ? "" : getValue().toString()); - } - Rectangle2D textRect = fontMetrics.getStringBounds(label, g2d); - // Don't offset in outline mode. - int offset = outlineMode ? 0 : getLabelOffset((int) length, (int) width, (int) textRect.getWidth()); - // Adjust label angle if needed to make sure that it's readable. - if ((theta >= Math.PI / 2 && theta <= Math.PI) || (theta < -Math.PI / 2 && theta > -Math.PI)) { - g2d.rotate(Math.PI, length / 2, width / 2); - offset = -offset; + // Draw label. + g2d.setFont(project.getFont()); + if (useShapeRectAsPosition()) { + g2d.translate(shapeRect.x, shapeRect.y); + } + 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 + : labelColor; + } + g2d.setColor(finalLabelColor); + FontMetrics fontMetrics = g2d.getFontMetrics(); + String label = ""; + label = display == Display.NAME ? getName() : (getValue() == null ? "" : getValue().toString()); + if (display == Display.NONE) { + label = ""; + } + if (display == Display.BOTH) { + label = getName() + " " + (getValue() == null ? "" : getValue().toString()); + } + Rectangle2D textRect = fontMetrics.getStringBounds(label, g2d); + // Don't offset in outline mode. + int offset = outlineMode ? 0 : getLabelOffset((int) length, (int) width, (int) textRect.getWidth()); + // Adjust label angle if needed to make sure that it's readable. + if ((theta >= Math.PI / 2 && theta <= Math.PI) || (theta < -Math.PI / 2 && theta > -Math.PI)) { + g2d.rotate(Math.PI, length / 2, width / 2); + offset = -offset; + } + if (getMoveLabel()) { + g2d.setTransform(oldTransform); + g2d.translate(getNewPoints()[2].x, getNewPoints()[2].y); + if (getLabelOriantation() != LabelOriantation.Horizontal) { + g2d.rotate(theta); } + drawCenteredText(g2d, label, offset, 0, HorizontalAlignment.CENTER, VerticalAlignment.CENTER); + g2d.setTransform(oldTransform); + } else { if (getLabelOriantation() == LabelOriantation.Horizontal) { g2d.setTransform(oldTransform); - double x = (points[0].x + points[1].x - length) / 2.0; - double y = (points[0].y + points[1].y - width) / 2.0; + double x = (getNewPoints()[0].x + getNewPoints()[1].x - length) / 2.0; + double y = (getNewPoints()[0].y + getNewPoints()[1].y - width) / 2.0; g2d.drawString(label, (int) (x + (length - textRect.getWidth()) / 2 + offset), (int)(y + calculateLabelYCoordinate(shapeRect, textRect, fontMetrics))); } else { g2d.drawString(label, (int) (length - textRect.getWidth()) / 2 + offset, calculateLabelYCoordinate(shapeRect, textRect, fontMetrics)); g2d.setTransform(oldTransform); - } + } } +// if (getLabelOriantation() == LabelOriantation.Horizontal) { +// +// drawCenteredText(g2d, label, getNewPoints()[2].x, getNewPoints()[2].x, HorizontalAlignment.CENTER, VerticalAlignment.CENTER); +// g2d.drawString(label, (int) (x + (length - textRect.getWidth()) / 2 + offset), +// (int)(y + calculateLabelYCoordinate(shapeRect, textRect, fontMetrics))); +// } else { +// g2d.drawString(label, (int) (length - textRect.getWidth()) / 2 + offset, +// calculateLabelYCoordinate(shapeRect, textRect, fontMetrics)); +// g2d.setTransform(oldTransform); +// } + } + + protected boolean isStanding() { + return supportsStandingMode() && this.length.convertToPixels() > getNewPoints()[0].distance(getNewPoints()[1]); } private void drawLeads(Graphics2D g2d, double theta, double leadLength) { - double endX = points[0].x + Math.cos(theta) * leadLength; - double endY = points[0].y + Math.sin(theta) * leadLength; - g2d.draw(new Line2D.Double(points[0].x, points[0].y, endX, endY)); + double endX = getNewPoints()[0].x + Math.cos(theta) * leadLength; + double endY = getNewPoints()[0].y + Math.sin(theta) * leadLength; + g2d.draw(new Line2D.Double(getNewPoints()[0].x, getNewPoints()[0].y, endX, endY)); - endX = points[1].x + Math.cos(theta - Math.PI) * leadLength; - endY = points[1].y + Math.sin(theta - Math.PI) * leadLength; - g2d.draw(new Line2D.Double(points[1].x, points[1].y, endX, endY)); + endX = getNewPoints()[1].x + Math.cos(theta - Math.PI) * leadLength; + endY = getNewPoints()[1].y + Math.sin(theta - Math.PI) * leadLength; + g2d.draw(new Line2D.Double(getNewPoints()[1].x, getNewPoints()[1].y, endX, endY)); } private void drawLead(Graphics2D g2d, ComponentState componentState, IDrawingObserver observer, boolean isCopperArea) { @@ -310,7 +377,7 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp float thickness = getLeadThickness(); - Line2D line = new Line2D.Double(points[0].x, points[0].y, points[1].x, points[1].y); + Line2D line = new Line2D.Double(getNewPoints()[0].x, getNewPoints()[0].y, getNewPoints()[1].x, getNewPoints()[1].y); if (shouldShadeLeads()) { // for some reason the stroked line gets approx 1px thicker when converted to shape @@ -447,27 +514,37 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp @Override public int getControlPointCount() { - return points.length; + return getNewPoints().length; } @Override public Point getControlPoint(int index) { - return (Point) points[index]; + return (Point) getNewPoints()[index]; } @Override public boolean isControlPointSticky(int index) { - return true; + return index < 2; } @Override public VisibilityPolicy getControlPointVisibilityPolicy(int index) { - return VisibilityPolicy.ALWAYS; + return getMoveLabel() || index < 2 ? VisibilityPolicy.ALWAYS : VisibilityPolicy.NEVER; } @Override - public void setControlPoint(Point point, int index) { - points[index].setLocation(point); + public void setControlPoint(Point point, int index) { + // when moving one of the ending points, try to retain the angle and distance from the center point to label point + if (index < 2 && gamma == null) { + double x = (getNewPoints()[1].x + getNewPoints()[0].x) / 2.0; + double y = (getNewPoints()[1].y + getNewPoints()[0].y) / 2.0; + double theta = Math.atan2(getNewPoints()[1].y - getNewPoints()[0].y, getNewPoints()[1].x - getNewPoints()[0].x); + double beta = Math.atan2(getNewPoints()[2].y - y, getNewPoints()[2].x - x); + gamma = beta + (Math.PI / 2 - theta); + p = getNewPoints()[2].distance(x, y); + } + + getNewPoints()[index].setLocation(point); } @EditableProperty(name = "Color") @@ -559,7 +636,16 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp public void setFlipStanding(boolean flipStanding) { this.flipStanding = flipStanding; } - + + @EditableProperty(name = "Moveable Label") + public boolean getMoveLabel() { + return moveLabel; + } + + public void setMoveLabel(boolean moveLabel) { + this.moveLabel = moveLabel; + } + public enum LabelOriantation { Directional, Horizontal } diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 19b852f8763cec0f2b634df9f51c61c09517b77c..53c10e4f5613857cc3c9e8d04d298322f5f19dfd 100644 GIT binary patch delta 5609 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 F{|(`zHU|Iz diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 156db406d58acf2e89afcbe6c3ee1ae4fcd74ed2..3822fade616ea1a6afb54616f8cbf5905a7eb298 100644 GIT binary patch delta 22231 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 delta 21223 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 X7tk3B;X*%j*_Wh=pZ^2i$58(R8s=#@ diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index 3b1b19b1..c4c2b280 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2629,7 +2629,11 @@ 2019-03-10 00:00:00.000 CET - + + + NEW_FEATURE + Added an optional third control point to leaded components that can be used to set component label position. This feature is off by default to keep things backwards compatible and is driven by "Movable Label" property + IMPROVEMENT Output SPICE node names in the "Nxxx" format