From c945dc89adc13b1daa7da6f5db2ee32ae38801d1 Mon Sep 17 00:00:00 2001 From: bancika Date: Wed, 11 Jan 2017 15:33:41 +0100 Subject: [PATCH] Ability to rotate tube sockets for arbitrary angle --- .../transform/DefaultTransformer.java | 33 +++++++ .../transform/LeadedComponentTransformer.java | 48 ++++++++++ diylc/diylc-library/lib/diylc-core.jar | Bin 232763 -> 234345 bytes .../org/diylc/components/tube/TubeSocket.java | 86 +++++++++--------- diylc/diylc-swing/lib/diylc-core.jar | Bin 232763 -> 234345 bytes diylc/diylc-swing/library/main.jar | Bin 391602 -> 391464 bytes diylc/diylc-swing/update.xml | 8 +- 7 files changed, 129 insertions(+), 46 deletions(-) create mode 100644 diylc/diylc-core/src/org/diylc/components/transform/DefaultTransformer.java create mode 100644 diylc/diylc-core/src/org/diylc/components/transform/LeadedComponentTransformer.java diff --git a/diylc/diylc-core/src/org/diylc/components/transform/DefaultTransformer.java b/diylc/diylc-core/src/org/diylc/components/transform/DefaultTransformer.java new file mode 100644 index 00000000..2761e708 --- /dev/null +++ b/diylc/diylc-core/src/org/diylc/components/transform/DefaultTransformer.java @@ -0,0 +1,33 @@ +package org.diylc.components.transform; + +import java.awt.Point; + +import org.diylc.common.IComponentTransformer; +import org.diylc.core.IDIYComponent; + +public class DefaultTransformer implements IComponentTransformer { + + @Override + public boolean canRotate(IDIYComponent component) { + return false; + } + + @Override + public boolean canMirror(IDIYComponent component) { + return false; + } + + @Override + public boolean mirroringChangesCircuit() { + return false; + } + + @Override + public void rotate(IDIYComponent component, Point center, int direction) { + } + + @Override + public void mirror(IDIYComponent component, Point center, int direction) { + } + +} diff --git a/diylc/diylc-core/src/org/diylc/components/transform/LeadedComponentTransformer.java b/diylc/diylc-core/src/org/diylc/components/transform/LeadedComponentTransformer.java new file mode 100644 index 00000000..dd77e1d2 --- /dev/null +++ b/diylc/diylc-core/src/org/diylc/components/transform/LeadedComponentTransformer.java @@ -0,0 +1,48 @@ +package org.diylc.components.transform; + +import java.awt.Point; +import java.awt.geom.AffineTransform; + +import org.diylc.common.IComponentTransformer; +import org.diylc.core.IDIYComponent; + +public class LeadedComponentTransformer implements IComponentTransformer { + + @Override + public boolean canRotate(IDIYComponent component) { + return true; + } + + @Override + public boolean canMirror(IDIYComponent component) { + return true; + } + + @Override + public boolean mirroringChangesCircuit() { + return false; + } + + @Override + public void rotate(IDIYComponent component, Point center, int direction) { + AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2 * direction, center.x, center.y); + for (int index = 0; index < component.getControlPointCount(); index++) { + Point p = new Point(component.getControlPoint(index)); + rotate.transform(p, p); + component.setControlPoint(p, index); + } + } + + @Override + public void mirror(IDIYComponent component, Point center, int direction) { + for (int i = 0; i < component.getControlPointCount(); i++) { + Point p = component.getControlPoint(i); + if (direction == IComponentTransformer.HORIZONTAL) { + component.setControlPoint(new Point(p.x - 2 * (p.x - center.x), p.y), i); + } else { + component.setControlPoint(new Point(p.x, p.y - 2 * (p.y - center.y)), i); + } + } + } + +} diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index eb2e6cb11b046482eb15bdc45662f11e39a1fa74..8a7d81ee8c5ff21ace5dac97065c7f0e1fb319f7 100644 GIT binary patch delta 10467 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 { private static final long serialVersionUID = 1L; - private static Color BODY_COLOR = Color.decode("#FFFFE0"); + private static Color BODY_COLOR = Color.decode("#F7F7EF"); private static Color BORDER_COLOR = Color.decode("#8E8E38"); public static Color PIN_COLOR = Color.decode("#00B2EE"); public static Color PIN_BORDER_COLOR = PIN_COLOR.darker(); @@ -44,8 +44,9 @@ public class TubeSocket extends AbstractTransparentComponent { private Base base = Base.B9A; private String type = ""; - private Orientation orientation = Orientation.DEFAULT; + private Orientation orientation; // private Mount mount = Mount.CHASSIS; + private int angle; private Point[] controlPoints = new Point[] {new Point(0, 0)}; @@ -67,14 +68,41 @@ public class TubeSocket extends AbstractTransparentComponent { // Reset body shape body = null; } +// +// @EditableProperty +// public Orientation getOrientation() { +// return orientation; +// } +// +// public void setOrientation(Orientation orientation) { +// this.orientation = orientation; +// updateControlPoints(); +// // Reset body shape +// body = null; +// } @EditableProperty - public Orientation getOrientation() { - return orientation; + @SuppressWarnings("incomplete-switch") + public int getAngle() { + if (orientation != null) { + switch (orientation) { + case _90: + angle = 90; + break; + case _180: + angle = 180; + break; + case _270: + angle = 270; + break; + } + orientation = null; + } + return angle; } - public void setOrientation(Orientation orientation) { - this.orientation = orientation; + public void setAngle(int angle) { + this.angle = angle; updateControlPoints(); // Reset body shape body = null; @@ -115,31 +143,15 @@ public class TubeSocket extends AbstractTransparentComponent { } double angleIncrement = Math.PI * 2 / (hasEmptySpace ? (pinCount + 1) : pinCount); double initialAngleOffset = hasEmptySpace ? angleIncrement : (angleIncrement / 2); - double initialAngle; - switch (orientation) { - case DEFAULT: - initialAngle = Math.PI / 2 + initialAngleOffset; - break; - case _90: - initialAngle = Math.PI + initialAngleOffset; - break; - case _180: - initialAngle = 3 * Math.PI / 2 + initialAngleOffset; - break; - case _270: - initialAngle = initialAngleOffset; - break; - default: - throw new RuntimeException("Unexpected orientation: " + orientation); - } + controlPoints = new Point[pinCount + 1]; - double angle = initialAngle; + double theta = initialAngleOffset + Math.toRadians(getAngle()); controlPoints[0] = firstPoint; for (int i = 0; i < pinCount; i++) { controlPoints[i + 1] = - new Point((int) (firstPoint.getX() + Math.cos(angle) * pinCircleDiameter / 2), - (int) (firstPoint.getY() + Math.sin(angle) * pinCircleDiameter / 2)); - angle += angleIncrement; + new Point((int) (firstPoint.getX() + Math.cos(theta) * pinCircleDiameter / 2), + (int) (firstPoint.getY() + Math.sin(theta) * pinCircleDiameter / 2)); + theta += angleIncrement; } } @@ -168,23 +180,9 @@ public class TubeSocket extends AbstractTransparentComponent { / 2, holeSize, holeSize))); if (base == Base.OCTAL) { int tickSize = getClosestOdd(TICK_SIZE.convertToPixels()); - double angle = 0; - switch (orientation) { - case DEFAULT: - angle = Math.PI / 2; - break; - case _90: - angle = Math.PI; - break; - case _180: - angle = 3 * Math.PI / 2; - break; - case _270: - angle = 0; - break; - } - int centerX = (int) (controlPoints[0].x + Math.cos(angle) * holeSize / 2); - int centerY = (int) (controlPoints[0].y + Math.sin(angle) * holeSize / 2); + double theta = Math.toRadians(getAngle()); + int centerX = (int) (controlPoints[0].x + Math.cos(theta) * holeSize / 2); + int centerY = (int) (controlPoints[0].y + Math.sin(theta) * holeSize / 2); bodyArea.subtract(new Area(new Ellipse2D.Double(centerX - tickSize / 2, centerY - tickSize / 2, tickSize, tickSize))); } diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index eb2e6cb11b046482eb15bdc45662f11e39a1fa74..8a7d81ee8c5ff21ace5dac97065c7f0e1fb319f7 100644 GIT binary patch delta 10467 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 delta 10678 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 NEW_FEATURE Show/hide the grid - + + + IMPROVEMENT + Ability to rotate tube sockets for arbitrary angle + IMPROVEMENT Applying a template shouldn't affect component placement IMPROVEMENT - Improved rotation and mirroring of multiple components + Improved rotation and mirroring of multiple components at the same time https://github.com/bancika/diy-layout-creator/releases