From dd4080accb6e68456e53822ec2aedc3cc8309d52 Mon Sep 17 00:00:00 2001 From: bancika Date: Sat, 15 Jan 2011 10:11:09 +0000 Subject: [PATCH] make grid spacing flexible --- .../DIYLC/config.xml | 2 +- .../DIYLC/library/main.jar | Bin 519334 -> 519484 bytes .../components/AbstractCurvedComponent.java | 10 +++- .../components/AbstractLeadedComponent.java | 6 +- .../DIYLC/src/org/diylc/core/Project.java | 15 ++++- .../src/org/diylc/core/measures/Size.java | 10 ++-- .../src/org/diylc/presenter/Presenter.java | 49 +++++++++------ .../DIYLC/src/org/diylc/utils/Constants.java | 11 ++-- .../Library/.classpath | 2 +- .../components/boards/AbstractBoard.java | 9 ++- .../components/connectivity/HookupWire.java | 2 +- .../src/org/diylc/components/misc/BOM.java | 2 +- .../components/misc/ProjectInformation.java | 1 - .../components/semiconductors/DIL_IC.java | 56 +++++++++++------- 14 files changed, 110 insertions(+), 65 deletions(-) diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml index d6460070..65688254 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml @@ -12,7 +12,7 @@ metric - true + false default.org.diylc.components.semiconductors.DIL_IC:Value diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar index e259da9cf0348acad3ffaa947fa0c745d793adee..fd61c492f4d7fec629e0bcd01d2e675ae1301cb0 100644 GIT binary patch delta 16886 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 Gg8e_C*qCqt delta 16606 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 W|LmlL%4CcS2z+qLmCp?Tp#KN@Duf#V diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractCurvedComponent.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractCurvedComponent.java index 5c35cecb..e3f145d8 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractCurvedComponent.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractCurvedComponent.java @@ -11,17 +11,21 @@ import java.awt.geom.CubicCurve2D; import org.diylc.core.ComponentState; import org.diylc.core.Project; import org.diylc.core.annotations.EditableProperty; -import org.diylc.utils.Constants; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; public abstract class AbstractCurvedComponent extends AbstractTransparentComponent { private static final long serialVersionUID = 1L; public static Color GUIDELINE_COLOR = Color.blue; + public static Size DEFAULT_SIZE = new Size(1d, SizeUnit.in); protected Point[] controlPoints = new Point[] { - new Point(-5 * Constants.GRID, -5 * Constants.GRID), new Point(0, -5 * Constants.GRID), - new Point(0, 5 * Constants.GRID), new Point(5 * Constants.GRID, 5 * Constants.GRID) }; + new Point(-DEFAULT_SIZE.convertToPixels() / 2, -DEFAULT_SIZE.convertToPixels() / 2), + new Point(0, -DEFAULT_SIZE.convertToPixels() / 2), + new Point(0, DEFAULT_SIZE.convertToPixels() / 2), + new Point(DEFAULT_SIZE.convertToPixels() / 2, DEFAULT_SIZE.convertToPixels() / 2) }; protected Color color = getDefaultColor(); diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java index 8684a7f9..72aaa07a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/components/AbstractLeadedComponent.java @@ -32,11 +32,13 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp public static Color LABEL_COLOR = Color.black; public static Color LABEL_COLOR_SELECTED = Color.red; public static Size LEAD_THICKNESS = new Size(0.3d, SizeUnit.mm); + public static Size DEFAULT_SIZE = new Size(1d, SizeUnit.in); protected Size width; protected Size height; - protected Point[] points = new Point[] { new Point((int) (-Constants.GRID * 5), 0), - new Point((int) (Constants.GRID * 5), 0) }; + protected Point[] points = new Point[] { + new Point((int) (-DEFAULT_SIZE.convertToPixels() / 2), 0), + new Point(DEFAULT_SIZE.convertToPixels() / 2, 0) }; protected Color bodyColor = getDefaultBodyColor(); protected Color borderColor = getDefaultBorderColor(); diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java index c659734b..bbeef943 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java @@ -24,12 +24,14 @@ public class Project implements Serializable { public static String DEFAULT_TITLE = "New Project"; public static Size DEFAULT_WIDTH = new Size(29d, SizeUnit.cm); public static Size DEFAULT_HEIGHT = new Size(21d, SizeUnit.cm); + public static Size DEFAULT_GRID_SPACING = new Size(0.2d, SizeUnit.in); private String title; private String author; private String description; private Size width; private Size height; + private Size gridSpacing; private List> components; private Set>> groups; @@ -40,9 +42,10 @@ public class Project implements Serializable { author = System.getProperty("user.name"); width = DEFAULT_WIDTH; height = DEFAULT_HEIGHT; + gridSpacing = DEFAULT_GRID_SPACING; } - public Project(String title, String author, String description, Size width, Size height, + public Project(String title, String author, String description, Size width, Size height, Size gridSpacing, List> components, Set>> groups) { super(); this.title = title; @@ -50,6 +53,7 @@ public class Project implements Serializable { this.description = description; this.width = width; this.height = height; + this.gridSpacing = gridSpacing; this.components = components; this.groups = groups; } @@ -98,6 +102,15 @@ public class Project implements Serializable { public void setHeight(Size height) { this.height = height; } + + @EditableProperty + public Size getGridSpacing() { + return gridSpacing; + } + + public void setGridSpacing(Size gridSpacing) { + this.gridSpacing = gridSpacing; + } /** * List of components sorted by z-order ascending. diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java index 9cf1701d..3be1be08 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/measures/Size.java @@ -17,10 +17,12 @@ public class Size extends AbstractMeasure { } public int convertToPixels() { - double factor = getUnit().getFactor() / SizeUnit.in.getFactor(); - int grids = (int) (factor * getValue() * Constants.GRIDS_PER_INCH); - double remainder = (factor * getValue() * Constants.GRIDS_PER_INCH) - grids; - return (int) Math.round(Constants.GRID * (grids + remainder)); +// double factor = getUnit().getFactor() / SizeUnit.in.getFactor(); +// int grids = (int) (factor * getValue() * Constants.GRIDS_PER_INCH); +// double remainder = (factor * getValue() * Constants.GRIDS_PER_INCH) - grids; +// return (int) Math.round(Constants.PIXELS_PER_INCH / Constants.GRIDS_PER_INCH +// * (grids + remainder)); + return (int) (getValue() * getUnit().getFactor() / SizeUnit.in.getFactor() * Constants.PIXELS_PER_INCH); } @Override diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java index 8dca5056..e6f3ef2e 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java @@ -58,7 +58,7 @@ public class Presenter implements IPlugInPort { private static final Logger LOG = Logger.getLogger(Presenter.class); - public static final VersionNumber CURRENT_VERSION = new VersionNumber(0, 0, 0); + public static final VersionNumber CURRENT_VERSION = new VersionNumber(0, 1, 0); public static final String DEFAULTS_KEY = "default."; public static final String METRIC_KEY = "metric"; @@ -235,7 +235,7 @@ public class Presenter implements IPlugInPort { g2dWrapper.fillRect(0, 0, d.width, d.height); if (drawOptions.contains(DrawOption.GRID)) { - double zoomStep = Constants.GRID * zoomLevel; + double zoomStep = currentProject.getGridSpacing().convertToPixels() * zoomLevel; g2dWrapper.setColor(Constants.GRID_COLOR); for (double i = zoomStep; i < d.width; i += zoomStep) { @@ -331,7 +331,8 @@ public class Presenter implements IPlugInPort { @Override public void injectGUIComponent(JComponent component, int position) throws BadPositionException { - LOG.info(String.format("injectGUIComponent(%s, %s)", component.getClass().getName(), position)); + LOG.info(String.format("injectGUIComponent(%s, %s)", component.getClass().getName(), + position)); view.addComponent(component, position); } @@ -620,24 +621,25 @@ public class Presenter implements IPlugInPort { int dx = (scaledPoint.x - previousDragPoint.x); int dy = (scaledPoint.y - previousDragPoint.y); if (snapToGrid) { - dx = (int) (Math.round(dx / Constants.GRID) * Constants.GRID); - dy = (int) (Math.round(dy / Constants.GRID) * Constants.GRID); + dx = roundToGrid(dx); + dy = roundToGrid(dy); } // Only repaint if there's an actual change. repaint = dx != 0 || dy != 0; - previousDragPoint.translate(dx, dy); + if (repaint) { + previousDragPoint.translate(dx, dy); - // Update all points. - for (Map.Entry, Set> entry : controlPointMap.entrySet()) { - IDIYComponent c = entry.getKey(); - for (Integer index : entry.getValue()) { - Point p = new Point(c.getControlPoint(index)); - p.translate(dx, dy); - c.setControlPoint(p, index); + // Update all points. + for (Map.Entry, Set> entry : controlPointMap.entrySet()) { + IDIYComponent c = entry.getKey(); + for (Integer index : entry.getValue()) { + Point p = new Point(c.getControlPoint(index)); + p.translate(dx, dy); + c.setControlPoint(p, index); + } } } - // dragStartPoint = point; } else if (selectedComponents.isEmpty()) { // If there's no selection, the only thing to do is update the // selection rectangle and refresh. @@ -654,6 +656,17 @@ public class Presenter implements IPlugInPort { return true; } + /** + * Rounds the number to the closest grid line. + * + * @param x + * @return + */ + private int roundToGrid(int x) { + int grid = currentProject.getGridSpacing().convertToPixels(); + return (Math.round(x / grid) * grid); + } + @Override public void dragEnded(Point point) { LOG.debug(String.format("dragEnded(%s)", point)); @@ -867,8 +880,8 @@ public class Presenter implements IPlugInPort { } double width = area.getBounds2D().getWidth(); double height = area.getBounds2D().getHeight(); - width /= Constants.GRID * Constants.GRIDS_PER_INCH; - height /= Constants.GRID * Constants.GRIDS_PER_INCH; + width /= Constants.PIXELS_PER_INCH; + height /= Constants.PIXELS_PER_INCH; if (isMetric) { width *= SizeUnit.in.getFactor() / SizeUnit.cm.getFactor(); height *= SizeUnit.in.getFactor() / SizeUnit.cm.getFactor(); @@ -935,8 +948,8 @@ public class Presenter implements IPlugInPort { int x = controlPoint.x + point.x; int y = controlPoint.y + point.y; if (snapToGrid) { - x = (int) (Math.round(x / Constants.GRID) * Constants.GRID); - y = (int) (Math.round(y / Constants.GRID) * Constants.GRID); + x = roundToGrid(x); + y = roundToGrid(y); } controlPoint.setLocation(x, y); component.setControlPoint(controlPoint, j); diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java index ceb795f9..5ddd7743 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/utils/Constants.java @@ -5,15 +5,12 @@ import java.awt.Color; import java.awt.Font; import java.awt.Stroke; -import org.diylc.core.measures.Size; -import org.diylc.core.measures.SizeUnit; - public class Constants { -// public static final int PIXELS_PER_INCH = Toolkit.getDefaultToolkit().getScreenResolution(); - public static int GRIDS_PER_INCH = 10; - public static Size GRID_SIZE = new Size(1d / GRIDS_PER_INCH, SizeUnit.in); - public static final int GRID = 10; + public static final int PIXELS_PER_INCH = 100;//Toolkit.getDefaultToolkit().getScreenResolution(); + public static int GRIDS_PER_INCH = 8; +// public static Size GRID_SIZE = new Size(1d / GRIDS_PER_INCH, SizeUnit.in); +// public static final int GRID = 20; public static Color CANVAS_COLOR = Color.white; public static Color GRID_COLOR = new Color(240, 240, 240); diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/.classpath b/ diy-layout-creator --username bancika@gmail.com/Library/.classpath index 74a976b1..5602a8e8 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/.classpath +++ b/ diy-layout-creator --username bancika@gmail.com/Library/.classpath @@ -2,6 +2,6 @@ - + diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java index 5ebd76f8..955bade3 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java @@ -11,7 +11,8 @@ import org.diylc.components.AbstractTransparentComponent; import org.diylc.core.ComponentState; import org.diylc.core.Project; import org.diylc.core.annotations.EditableProperty; -import org.diylc.utils.Constants; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; public abstract class AbstractBoard extends AbstractTransparentComponent { @@ -19,12 +20,14 @@ public abstract class AbstractBoard extends AbstractTransparentComponent public static Color BOARD_COLOR = Color.decode("#BCED91"); public static Color BORDER_COLOR = BOARD_COLOR.darker(); + public static Size DEFAULT_WIDTH = new Size(1.5d, SizeUnit.in); + public static Size DEFAULT_HEIGHT = new Size(1d, SizeUnit.in); protected String name; protected String value; protected Point[] controlPoints = new Point[] { - new Point((int) (-5 * Constants.GRID), (int) (-5 * Constants.GRID)), - new Point((int) (5 * Constants.GRID), (int) (5 * Constants.GRID)) }; + new Point(-DEFAULT_WIDTH.convertToPixels() / 2, -DEFAULT_HEIGHT.convertToPixels() / 2), + new Point(DEFAULT_WIDTH.convertToPixels() / 2, DEFAULT_HEIGHT.convertToPixels() / 2) }; protected Color boardColor = BOARD_COLOR; protected Color borderColor = BORDER_COLOR; diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/HookupWire.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/HookupWire.java index 9642f8ef..56f2a952 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/HookupWire.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/connectivity/HookupWire.java @@ -30,7 +30,7 @@ public class HookupWire extends AbstractCurvedComponent { @Override protected void drawCurve(CubicCurve2D curve, Graphics2D g2d, ComponentState componentState) { int thickness = (int) (Math.pow(Math.E, -1.12436 - 0.11594 * value.getValue()) - * Constants.GRID * Constants.GRIDS_PER_INCH * (1 + 2 * INSULATION_THICKNESS_PCT)); + * Constants.PIXELS_PER_INCH * (1 + 2 * INSULATION_THICKNESS_PCT)); g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR : color.darker()); g2d.setStroke(new BasicStroke(thickness)); diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/BOM.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/BOM.java index bf2786a4..33a37f0a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/BOM.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/BOM.java @@ -25,7 +25,7 @@ import org.diylc.utils.Constants; public class BOM extends AbstractComponent { public static Size DEFAULT_SIZE = new Size(10d, SizeUnit.cm); - public static Size SPACING = Constants.GRID_SIZE; + public static Size SPACING = new Size(0.1d, SizeUnit.in); public static Color COLOR = Color.black; public static String DEFAULT_TEXT = "No components to show in the Bill of Materials"; diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/ProjectInformation.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/ProjectInformation.java index a2dd961b..fcbe87f9 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/ProjectInformation.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/ProjectInformation.java @@ -20,7 +20,6 @@ import org.diylc.utils.Constants; public class ProjectInformation extends AbstractComponent { public static Size DEFAULT_SIZE = new Size(10d, SizeUnit.cm); - public static Size SPACING = Constants.GRID_SIZE; public static Color COLOR = Color.black; public static String DEFAULT_TEXT = "No components to show in the Bill of Materials"; diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/semiconductors/DIL_IC.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/semiconductors/DIL_IC.java index aa3981d7..f0ddad31 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/semiconductors/DIL_IC.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/semiconductors/DIL_IC.java @@ -41,13 +41,16 @@ public class DIL_IC extends AbstractTransparentComponent { private String value = ""; private Orientation orientation = Orientation.DEFAULT; private PinCount pinCount = PinCount._8; + private Size pinSpacing = new Size(0.1d, SizeUnit.in); private Size rowSpacing = new Size(0.3d, SizeUnit.in); - private Point[] controlPoints = new Point[] { new Point(0, 0), - new Point(0, (int) Constants.GRID), new Point(0, (int) (2 * Constants.GRID)), - new Point(0, (int) (3 * Constants.GRID)), new Point((int) (3 * Constants.GRID), 0), - new Point((int) (3 * Constants.GRID), (int) Constants.GRID), - new Point((int) (3 * Constants.GRID), (int) (2 * Constants.GRID)), - new Point((int) (3 * Constants.GRID), (int) (3 * Constants.GRID)) }; + private Point[] controlPoints = new Point[] { new Point(0, 0) }; +// new Point(0, pinSpacing.convertToPixels()), +// new Point(0, 2 * pinSpacing.convertToPixels()), +// new Point(0, 3 * pinSpacing.convertToPixels()), +// new Point(3 * pinSpacing.convertToPixels(), 0), +// new Point(3 * pinSpacing.convertToPixels(), pinSpacing.convertToPixels()), +// new Point(3 * pinSpacing.convertToPixels(), 2 * pinSpacing.convertToPixels()), +// new Point(3 * pinSpacing.convertToPixels(), 3 * pinSpacing.convertToPixels()) }; private Shape body; public DIL_IC() { @@ -87,6 +90,15 @@ public class DIL_IC extends AbstractTransparentComponent { body = null; } + @EditableProperty(name = "Pin spacing") + public Size getPinSpacing() { + return pinSpacing; + } + + public void setPinSpacing(Size pinSpacing) { + this.pinSpacing = pinSpacing; + } + @EditableProperty(name = "Row spacing") public Size getRowSpacing() { return rowSpacing; @@ -128,26 +140,26 @@ public class DIL_IC extends AbstractTransparentComponent { switch (orientation) { case DEFAULT: dx1 = 0; - dy1 = (int) (i * Constants.GRID); + dy1 = i * pinSpacing.convertToPixels(); dx2 = rowSpacing.convertToPixels(); - dy2 = (int) (i * Constants.GRID); + dy2 = i * pinSpacing.convertToPixels(); break; case _90: - dx1 = (int) (-i * Constants.GRID); + dx1 = -i * pinSpacing.convertToPixels(); dy1 = 0; - dx2 = (int) (-i * Constants.GRID); + dx2 = -i * pinSpacing.convertToPixels(); dy2 = rowSpacing.convertToPixels(); break; case _180: dx1 = 0; - dy1 = (int) (-i * Constants.GRID); + dy1 = -i * pinSpacing.convertToPixels(); dx2 = -rowSpacing.convertToPixels(); - dy2 = (int) (-i * Constants.GRID); + dy2 = -i * pinSpacing.convertToPixels(); break; case _270: - dx1 = (int) (i * Constants.GRID); + dx1 = i * pinSpacing.convertToPixels(); dy1 = 0; - dx2 = (int) (i * Constants.GRID); + dx2 = i * pinSpacing.convertToPixels(); dy2 = rowSpacing.convertToPixels(); break; default: @@ -169,26 +181,26 @@ public class DIL_IC extends AbstractTransparentComponent { switch (orientation) { case DEFAULT: width = rowSpacing.convertToPixels() - pinSize; - height = (int) ((pinCount.getValue() / 2) * Constants.GRID); + height = (pinCount.getValue() / 2) * pinSpacing.convertToPixels(); x += pinSize / 2; - y -= (int) (Constants.GRID / 2); + y -= pinSpacing.convertToPixels() / 2; break; case _90: - width = (int) ((pinCount.getValue() / 2) * Constants.GRID); + width = (pinCount.getValue() / 2) * pinSpacing.convertToPixels(); height = rowSpacing.convertToPixels() - pinSize; - x -= (int) (Constants.GRID / 2) + width - Constants.GRID; + x -= (pinSpacing.convertToPixels() / 2) + width - pinSpacing.convertToPixels(); y += pinSize / 2; break; case _180: width = rowSpacing.convertToPixels() - pinSize; - height = (int) ((pinCount.getValue() / 2) * Constants.GRID); + height = (pinCount.getValue() / 2) * pinSpacing.convertToPixels(); x -= rowSpacing.convertToPixels() - pinSize / 2; - y -= (int) (Constants.GRID / 2) + height - Constants.GRID; + y -= (pinSpacing.convertToPixels() / 2) + height - pinSpacing.convertToPixels(); break; case _270: - width = (int) ((pinCount.getValue() / 2) * Constants.GRID); + width = (pinCount.getValue() / 2) * pinSpacing.convertToPixels(); height = rowSpacing.convertToPixels() - pinSize; - x -= (int) (Constants.GRID / 2); + x -= pinSpacing.convertToPixels() / 2; y += pinSize / 2; break; default: