/* * An optimized LineSegment which only uses the end point with the expectation * that a collection of points will represent a continuous set of line segments. * * Created on Nov 9, 2013 */ /* Copywrite 2013 Will Winder This file is part of Universal Gcode Sender (UGS). UGS 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. UGS 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 UGS. If not, see <http://www.gnu.org/licenses/>. */ package com.willwinder.universalgcodesender.types; import com.willwinder.universalgcodesender.gcode.util.Plane; import javax.vecmath.Point3d; /** * * @author wwinder */ final public class PointSegment { private int toolhead = 0; //DEFAULT TOOLHEAD ASSUMED TO BE 0! private double speed; private Point3d point; // Line properties private boolean isMetric = true; private boolean isZMovement = false; private boolean isArc = false; private boolean isFastTraverse = false; private int lineNumber; private ArcProperties arcProperties = null; private class ArcProperties { public boolean isClockwise; public double radius = 0.0; public Point3d center = null; public Plane plane = null; } public PointSegment() { this.lineNumber = -1; this.point = new Point3d(); } public PointSegment(PointSegment ps) { this(ps.point(), ps.getLineNumber()); this.setToolHead(ps.toolhead); this.setSpeed(ps.speed); this.setIsMetric(ps.isMetric); this.setIsZMovement(ps.isZMovement); this.setIsFastTraverse(ps.isFastTraverse); if (ps.isArc) { this.setArcCenter(ps.center()); this.setRadius(ps.getRadius()); this.setIsClockwise(ps.isClockwise()); } } public PointSegment(final Point3d b, final int num) { this(); this.point = new Point3d (b); this.lineNumber = num; } public PointSegment(final Point3d point, final int num, final Point3d center, final double radius, final boolean clockwise, Plane plane) { this(point, num); this.isArc = true; this.arcProperties = new ArcProperties(); this.arcProperties.center = new Point3d(center); this.arcProperties.radius = radius; this.arcProperties.isClockwise = clockwise; this.arcProperties.plane = plane; } public void setPoint(final Point3d point) { this.point = new Point3d(point); } public Point3d point() { return point; } public double[] points() { double[] points = {point.x, point.y, point.z}; return points; } public void setToolHead(final int head) { this.toolhead = head; } public int getToolhead() { return toolhead; } public void setLineNumber(final int num) { this.lineNumber = num; } public int getLineNumber() { return lineNumber; } public void setSpeed(final double s) { this.speed = s; } public double getSpeed() { return speed; } public void setIsZMovement(final boolean isZ) { this.isZMovement = isZ; } public boolean isZMovement() { return isZMovement; } public void setIsMetric(final boolean isMetric) { this.isMetric = isMetric; } public boolean isMetric() { return isMetric; } public void setIsArc(final boolean isA) { this.isArc = isA; } public boolean isArc() { return isArc; } public void setIsFastTraverse(final boolean isF) { this.isFastTraverse = isF; } public boolean isFastTraverse() { return this.isFastTraverse; } // Arc properties. public void setArcCenter(final Point3d center) { if (this.arcProperties == null) { this.arcProperties = new ArcProperties(); } this.arcProperties.center = new Point3d(center); this.setIsArc(true); } public double[] centerPoints() { if (this.arcProperties != null && this.arcProperties.center != null) { double[] points = {arcProperties.center.x, arcProperties.center.y, arcProperties.center.z}; return points; } return null; } public Point3d center() { if (this.arcProperties != null && this.arcProperties.center != null) { return this.arcProperties.center; } return null; } public void setIsClockwise(final boolean clockwise) { if (this.arcProperties == null) { this.arcProperties = new ArcProperties(); } this.arcProperties.isClockwise = clockwise; } public boolean isClockwise() { if (this.arcProperties != null && this.arcProperties.center != null) { return this.arcProperties.isClockwise; } return false; } public void setRadius(final double rad) { if (this.arcProperties == null) { this.arcProperties = new ArcProperties(); } this.arcProperties.radius = rad; } public double getRadius() { if (this.arcProperties != null && this.arcProperties.center != null) { return this.arcProperties.radius; } return 0; } public void setPlaneState(Plane plane) { this.arcProperties.plane = plane; } public Plane getPlaneState() { return this.arcProperties.plane; } public void convertToMetric() { if (this.isMetric) { return; } this.isMetric = true; this.point.scale(25.4); if (this.isArc && this.arcProperties != null) { this.arcProperties.center.scale(25.4); this.arcProperties.radius *= 25.4; } } }