From 632dff3e2c7379d499c245a1e9a96943912e0d48 Mon Sep 17 00:00:00 2001 From: bancika Date: Tue, 15 Sep 2020 18:10:04 +0200 Subject: [PATCH] Allow rotate and mirror actions on Pin Header component --- .../src/org/diylc/presenter/update.xml | 4 + .../electromechanical/PinHeader.java | 3 +- .../transform/PinHeaderTransformer.java | 134 ++++++++++++++++++ 3 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 diylc/diylc-library/src/org/diylc/components/transform/PinHeaderTransformer.java diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index 08cd6742..18bc58d8 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -3185,6 +3185,10 @@ NEW_FEATURE On MacOS the app registers to open .DIY files + + + IMPROVEMENT + Allow rotate and mirror actions on Pin Header component https://github.com/bancika/diy-layout-creator/releases diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java index 72be8a2d..c37d902f 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/PinHeader.java @@ -36,6 +36,7 @@ import org.diylc.common.IPlugInPort; import org.diylc.common.ObjectCache; import org.diylc.common.Orientation; import org.diylc.components.AbstractTransparentComponent; +import org.diylc.components.transform.PinHeaderTransformer; import org.diylc.core.ComponentState; import org.diylc.core.IDIYComponent; import org.diylc.core.IDrawingObserver; @@ -50,7 +51,7 @@ import org.diylc.utils.Constants; @ComponentDescriptor(name = "Pin Header", author = "Branislav Stojkovic", category = "Electro-Mechanical", instanceNamePrefix = "PH", description = "PCB mount male pin header with editable number or pins and pin spacing", - zOrder = IDIYComponent.COMPONENT, enableCache = true) + zOrder = IDIYComponent.COMPONENT, enableCache = true, transformer = PinHeaderTransformer.class) public class PinHeader extends AbstractTransparentComponent { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-library/src/org/diylc/components/transform/PinHeaderTransformer.java b/diylc/diylc-library/src/org/diylc/components/transform/PinHeaderTransformer.java new file mode 100644 index 00000000..0261e526 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/transform/PinHeaderTransformer.java @@ -0,0 +1,134 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ +package org.diylc.components.transform; + +import java.awt.geom.AffineTransform; +import java.awt.geom.Point2D; + +import org.diylc.common.IComponentTransformer; +import org.diylc.common.Orientation; +import org.diylc.components.electromechanical.PinHeader; +import org.diylc.core.IDIYComponent; + +public class PinHeaderTransformer implements IComponentTransformer { + + @Override + public boolean canRotate(IDIYComponent component) { + return component.getClass().equals(PinHeader.class); + } + + @Override + public boolean canMirror(IDIYComponent component) { + return component.getClass().equals(PinHeader.class); + } + + @Override + public boolean mirroringChangesCircuit() { + return false; + } + + @Override + public void rotate(IDIYComponent component, Point2D center, int direction) { + AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2 * direction, center.getX(), center.getY()); + for (int index = 0; index < component.getControlPointCount(); index++) { + Point2D p = new Point2D.Double(); + rotate.transform(component.getControlPoint(index), p); + component.setControlPoint(p, index); + } + + PinHeader header = (PinHeader) component; + Orientation o = header.getOrientation(); + int oValue = o.ordinal(); + oValue += direction; + if (oValue < 0) + oValue = Orientation.values().length - 1; + if (oValue >= Orientation.values().length) + oValue = 0; + o = Orientation.values()[oValue]; + header.setOrientation(o); + } + + @Override + public void mirror(IDIYComponent component, Point2D center, int direction) { + PinHeader header = (PinHeader) component; + + if (direction == IComponentTransformer.HORIZONTAL) { + double dx = 2 * (center.getX() - header.getControlPoint(1).getX()); + double dy = 0; + Orientation o = header.getOrientation(); + switch (o) { + case DEFAULT: + dx += header.getControlPoint(0).getX() - header.getControlPoint(header.getControlPointCount() - 1).getX(); + break; + case _90: + o = Orientation._270; + dx -= 2 * (header.getControlPoint(0).getX() - header.getControlPoint(1).getX()); + dy -= header.getControlPoint(0).getY() - header.getControlPoint(header.getControlPointCount() - 1).getY(); + break; + case _180: + dx += header.getControlPoint(0).getX() - header.getControlPoint(header.getControlPointCount() - 1).getX(); + break; + case _270: + dx -= 2 * (header.getControlPoint(0).getX() - header.getControlPoint(1).getX()); + dy -= header.getControlPoint(0).getY() - header.getControlPoint(header.getControlPointCount() - 1).getY(); + o = Orientation._90; + break; + } + + for (int i = 0; i < header.getControlPointCount(); i++) { + Point2D p = header.getControlPoint(i); + header.setControlPoint(new Point2D.Double(p.getX() + dx, p.getY() + dy), i); + } + + header.setOrientation(o); + } else { + double dx = 0; + double dy = 2 * (center.getY() - header.getControlPoint(1).getY()); + Orientation o = header.getOrientation(); + switch (o) { + case DEFAULT: + dx -= header.getControlPoint(0).getX() - header.getControlPoint(header.getControlPointCount() - 1).getX(); + dy -= 2 * (header.getControlPoint(0).getY() - header.getControlPoint(1).getY()); + o = Orientation._180; + break; + case _90: + dy += header.getControlPoint(0).getY() - header.getControlPoint(header.getControlPointCount() - 1).getY(); + break; + case _180: + dx -= header.getControlPoint(0).getX() - header.getControlPoint(header.getControlPointCount() - 1).getX(); + dy -= 2 * (header.getControlPoint(0).getY() - header.getControlPoint(1).getY()); + o = Orientation.DEFAULT; + break; + case _270: + dy += header.getControlPoint(0).getY() - header.getControlPoint(header.getControlPointCount() - 1).getY(); + break; + } + + for (int i = 0; i < header.getControlPointCount(); i++) { + Point2D p = header.getControlPoint(i); + header.setControlPoint(new Point2D.Double(p.getX() + dx, p.getY() + dy), i); + } + + header.setOrientation(o); + } + } +}