use of com.willwinder.universalgcodesender.visualizer.LineSegment in project Universal-G-Code-Sender by winder.
the class GcodeModel method updateVertexBuffers.
/**
* Convert the gcodeLineList into vertex and color arrays.
*/
private void updateVertexBuffers() {
if (this.isDrawable) {
Color color;
int vertIndex = 0;
int colorIndex = 0;
byte[] c = new byte[3];
for (LineSegment ls : gcodeLineList) {
// Find the lines color.
if (ls.isArc()) {
color = arcColor;
} else if (ls.isFastTraverse()) {
color = rapidColor;
} else if (ls.isZMovement()) {
color = plungeColor;
} else {
color = linearColor;
}
// Override color if it is cutoff
if (ls.getLineNumber() < this.currentCommandNumber) {
color = completedColor;
}
// Draw it.
{
Position p1 = ls.getStart();
Position p2 = ls.getEnd();
c[0] = (byte) color.getRed();
c[1] = (byte) color.getGreen();
c[2] = (byte) color.getBlue();
// colors
// p1
lineColorData[colorIndex++] = c[0];
lineColorData[colorIndex++] = c[1];
lineColorData[colorIndex++] = c[2];
// p2
lineColorData[colorIndex++] = c[0];
lineColorData[colorIndex++] = c[1];
lineColorData[colorIndex++] = c[2];
// p1 location
lineVertexData[vertIndex++] = (float) p1.x;
lineVertexData[vertIndex++] = (float) p1.y;
lineVertexData[vertIndex++] = (float) p1.z;
// p2
lineVertexData[vertIndex++] = (float) p2.x;
lineVertexData[vertIndex++] = (float) p2.y;
lineVertexData[vertIndex++] = (float) p2.z;
}
}
this.colorArrayDirty = true;
this.vertexArrayDirty = true;
}
}
use of com.willwinder.universalgcodesender.visualizer.LineSegment in project Universal-G-Code-Sender by winder.
the class GcodeModel method generateObject.
/**
* Parse the gcodeFile and store the resulting geometry and data about it.
*/
private boolean generateObject() {
isDrawable = false;
if (this.gcodeFile == null) {
return false;
}
try {
GcodeViewParse gcvp = new GcodeViewParse();
logger.log(Level.INFO, "About to process {}", gcodeFile);
try {
IGcodeStreamReader gsr = new GcodeStreamReader(new File(gcodeFile));
gcodeLineList = gcvp.toObjFromReader(gsr, 0.3);
} catch (GcodeStreamReader.NotGcodeStreamFile e) {
List<String> linesInFile;
linesInFile = VisualizerUtils.readFiletoArrayList(this.gcodeFile);
gcodeLineList = gcvp.toObjRedux(linesInFile, 0.3);
}
// Convert LineSegments to points.
this.pointList = new ArrayList<>(gcodeLineList.size());
for (LineSegment ls : gcodeLineList) {
this.pointList.add(GcodeModel.toCartesian(ls));
}
gcodeLineList = pointList;
this.objectMin = gcvp.getMinimumExtremes();
this.objectMax = gcvp.getMaximumExtremes();
if (gcodeLineList.isEmpty()) {
return false;
}
// Grab the line number off the last line.
System.out.println("Object bounds: X (" + objectMin.x + ", " + objectMax.x + ")");
System.out.println(" Y (" + objectMin.y + ", " + objectMax.y + ")");
System.out.println(" Z (" + objectMin.z + ", " + objectMax.z + ")");
Position center = VisualizerUtils.findCenter(objectMin, objectMax);
System.out.println("Center = " + center.toString());
System.out.println("Num Line Segments :" + gcodeLineList.size());
objectSize.x = this.objectMax.x - this.objectMin.x;
objectSize.y = this.objectMax.y - this.objectMin.y;
objectSize.z = this.objectMax.z - this.objectMin.z;
/*
this.scaleFactorBase = VisualizerUtils.findScaleFactor(this.xSize, this.ySize, this.objectMin, this.objectMax);
this.scaleFactor = this.scaleFactorBase * this.zoomMultiplier;
this.dimensionsLabel = Localization.getString("VisualizerCanvas.dimensions") + ": "
+ Localization.getString("VisualizerCanvas.width") + "=" + format.format(objectWidth) + " "
+ Localization.getString("VisualizerCanvas.height") + "=" + format.format(objectHeight);
*/
// Now that the object is known, fill the buffers.
this.isDrawable = true;
this.numberOfVertices = gcodeLineList.size() * 2;
this.lineVertexData = new float[numberOfVertices * 3];
this.lineColorData = new byte[numberOfVertices * 3];
this.updateVertexBuffers();
} catch (GcodeParserException | IOException e) {
String error = Localization.getString("mainWindow.error.openingFile") + " : " + e.getLocalizedMessage();
logger.log(Level.SEVERE, error, e);
GUIHelpers.displayErrorDialog(error);
return false;
}
return true;
}
use of com.willwinder.universalgcodesender.visualizer.LineSegment in project Universal-G-Code-Sender by winder.
the class OutlineAction method generateOutlineCommands.
public List<GcodeCommand> generateOutlineCommands(File gcodeFile) throws IOException, GcodeParserException {
List<LineSegment> gcodeLineList = parseGcodeLinesFromFile(gcodeFile);
// We only care about carving motion, filter those commands out
List<PartialPosition> pointList = gcodeLineList.parallelStream().filter(lineSegment -> !lineSegment.isFastTraverse()).flatMap(lineSegment -> {
// We map both the start and end points in MM
PartialPosition start = PartialPosition.fromXY(lineSegment.getStart().getPositionIn(UnitUtils.Units.MM));
PartialPosition end = PartialPosition.fromXY(lineSegment.getEnd().getPositionIn(UnitUtils.Units.MM));
return Stream.of(start, end);
}).distinct().collect(Collectors.toList());
UnitUtils.Units preferredUnits = backend.getSettings().getPreferredUnits();
double jogFeedRateInMM = backend.getSettings().getJogFeedRate() * UnitUtils.scaleUnits(preferredUnits, UnitUtils.Units.MM);
List<PartialPosition> outline = MathUtils.generateConvexHull(pointList);
return outline.stream().map(point -> new GcodeCommand(GcodeUtils.generateMoveToCommand(Code.G1.name(), point, jogFeedRateInMM))).collect(Collectors.toList());
}
use of com.willwinder.universalgcodesender.visualizer.LineSegment in project Universal-G-Code-Sender by winder.
the class AbstractRotateAction method parseGcodeLinesFromFile.
private List<LineSegment> parseGcodeLinesFromFile(File gcodeFile) throws IOException, GcodeParserException {
List<LineSegment> result;
GcodeViewParse gcvp = new GcodeViewParse();
try (IGcodeStreamReader gsr = new GcodeStreamReader(gcodeFile)) {
result = gcvp.toObjFromReader(gsr, ARC_SEGMENT_LENGTH);
} catch (GcodeStreamReader.NotGcodeStreamFile e) {
List<String> linesInFile = VisualizerUtils.readFiletoArrayList(gcodeFile.getAbsolutePath());
result = gcvp.toObjRedux(linesInFile, ARC_SEGMENT_LENGTH);
}
return result;
}
use of com.willwinder.universalgcodesender.visualizer.LineSegment in project Universal-G-Code-Sender by winder.
the class MirrorAction method getCenter.
private Position getCenter(File gcodeFile) throws IOException, GcodeParserException {
List<LineSegment> lineSegments = parseGcodeLinesFromFile(gcodeFile);
// We only care about carving motion, filter those commands out
List<PartialPosition> pointList = lineSegments.parallelStream().filter(lineSegment -> !lineSegment.isFastTraverse()).flatMap(lineSegment -> {
PartialPosition start = PartialPosition.from(lineSegment.getStart());
PartialPosition end = PartialPosition.from(lineSegment.getEnd());
return Stream.of(start, end);
}).distinct().collect(Collectors.toList());
return MathUtils.getCenter(pointList);
}
Aggregations