/*
* Helper functions for visualizer routines.
*/
/*
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.visualizer;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import javax.vecmath.Point3d;
/**
*
* @author wwinder
*/
public class VisualizerUtils {
public enum Color {
RED(255,100,100),
BLUE(0,255,255),
PURPLE(242,0,255),
YELLOW(237,255,0),
OTHER_YELLOW(234,212,7),
GREEN(33,255,0),
WHITE(255,255,255),
GRAY(80,80,80),
BLACK(0,0,0);
final byte[] rgb;
private Color(int r, int g, int b) {
rgb = new byte[]{(byte)r,(byte)g,(byte)b};
}
public byte[] getBytes() {
return rgb;
}
}
/**
* Returns the maximum side dimension of a box containing two points.
*/
public static double findMaxSide(Point3d min, Point3d max) {
double x = Math.abs(min.x) + Math.abs(max.x);
double y = Math.abs(min.y) + Math.abs(max.y);
double z = Math.abs(min.z) + Math.abs(max.z);
return Math.max(x, Math.max(y, z));
}
/**
* Returns the aspect ratio from two points.
*/
public static double findAspectRatio(Point3d min, Point3d max) {
double x = Math.abs(min.x) + Math.abs(max.x);
double y = Math.abs(min.y) + Math.abs(max.y);
return x / y;
}
/**
* Returns the center point on a line.
*/
public static Point3d findCenter(Point3d min, Point3d max) {
Point3d center = new Point3d();
center.x = (min.x + max.x) / 2.0;
center.y = (min.y + max.y) / 2.0;
center.z = (min.z + max.z) / 2.0;
return center;
}
/**
* Find a factor to scale an object by so that it fits in the window.
* The buffer factor is how much of a border to leave.
*/
public static double findScaleFactor(double x, double y, Point3d min, Point3d max, double bufferFactor) {
if (y == 0 || x == 0 || min == null || max == null) {
return 1;
}
double xObj = Math.abs(min.x) + Math.abs(max.x);
double yObj = Math.abs(min.y) + Math.abs(max.y);
double windowRatio = x / y;
double objRatio = xObj / yObj;
if (windowRatio < objRatio) {
return (1.0 / xObj) * windowRatio * bufferFactor;
} else {
return (1.0 / yObj) * bufferFactor;
}
}
/** Constructor to setup the GUI for this Component */
public static ArrayList<String> readFiletoArrayList(String gCode) throws IOException {
ArrayList<String> vect = new ArrayList<>();
File gCodeFile = new File(gCode);
FileInputStream fstream = new FileInputStream(gCodeFile);
DataInputStream dis = new DataInputStream(fstream);
BufferedReader fileStream = new BufferedReader(new InputStreamReader(dis));
String line;
while ((line = fileStream.readLine()) != null) {
vect.add(line);
}
return vect;
}
/**
* Determine the ratio of mouse movement to model movement for panning operations on a single axis.
* @param objectMin The lowest value on the axis from the model's size.
* @param objectMax The highest point on the axis from the model's size.
* @param movementRange The length of the axis in the window displaying the model.
* @return the ratio of the model size to the display size on that axis.
*/
public static double getRelativeMovementMultiplier(double objectMin, double objectMax, int movementRange) {
if (movementRange == 0)
return 0;
double objectAxis = Math.abs(objectMax - objectMin);
return objectAxis / (double)movementRange;
}
}