Skip to content
Snippets Groups Projects
Commit 2bc92a8b authored by Andrey Ruzhanskiy's avatar Andrey Ruzhanskiy
Browse files

Merge branch 'feat/floatingPointData_svg-47' into 'master'

Add FloatingPointData SVG exporter for Boolean type

See merge request !21
parents 77291058 1df42dce
No related branches found
No related tags found
1 merge request!21Add FloatingPointData SVG exporter for Boolean type
...@@ -4,7 +4,10 @@ import de.tudresden.inf.mci.brailleplot.configparser.Format; ...@@ -4,7 +4,10 @@ import de.tudresden.inf.mci.brailleplot.configparser.Format;
import de.tudresden.inf.mci.brailleplot.configparser.JavaPropertiesConfigurationParser; import de.tudresden.inf.mci.brailleplot.configparser.JavaPropertiesConfigurationParser;
import de.tudresden.inf.mci.brailleplot.configparser.Printer; import de.tudresden.inf.mci.brailleplot.configparser.Printer;
import de.tudresden.inf.mci.brailleplot.layout.PlotCanvas;
import de.tudresden.inf.mci.brailleplot.layout.RasterCanvas; import de.tudresden.inf.mci.brailleplot.layout.RasterCanvas;
import de.tudresden.inf.mci.brailleplot.point.Point2DValued;
import de.tudresden.inf.mci.brailleplot.printabledata.FloatingPointData;
import de.tudresden.inf.mci.brailleplot.printerbackend.PrintDirector; import de.tudresden.inf.mci.brailleplot.printerbackend.PrintDirector;
import de.tudresden.inf.mci.brailleplot.printerbackend.PrinterCapability; import de.tudresden.inf.mci.brailleplot.printerbackend.PrinterCapability;
...@@ -22,11 +25,16 @@ import de.tudresden.inf.mci.brailleplot.datacontainers.CategoricalPointListConta ...@@ -22,11 +25,16 @@ import de.tudresden.inf.mci.brailleplot.datacontainers.CategoricalPointListConta
import de.tudresden.inf.mci.brailleplot.datacontainers.PointList; import de.tudresden.inf.mci.brailleplot.datacontainers.PointList;
import de.tudresden.inf.mci.brailleplot.diagrams.BarChart; import de.tudresden.inf.mci.brailleplot.diagrams.BarChart;
import de.tudresden.inf.mci.brailleplot.rendering.MasterRenderer; import de.tudresden.inf.mci.brailleplot.rendering.MasterRenderer;
import de.tudresden.inf.mci.brailleplot.svgexporter.BoolFloatingPointDataSvgExporter;
import de.tudresden.inf.mci.brailleplot.svgexporter.BoolMatrixDataSvgExporter; import de.tudresden.inf.mci.brailleplot.svgexporter.BoolMatrixDataSvgExporter;
import de.tudresden.inf.mci.brailleplot.svgexporter.SvgExporter; import de.tudresden.inf.mci.brailleplot.svgexporter.SvgExporter;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import tec.units.ri.quantity.Quantities;
import tec.units.ri.unit.MetricPrefix;
import javax.measure.Quantity;
import javax.measure.quantity.Length;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
...@@ -34,11 +42,13 @@ import java.io.Reader; ...@@ -34,11 +42,13 @@ import java.io.Reader;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.ConcurrentLinkedDeque;
import static tec.units.ri.unit.Units.METRE;
/** /**
* Main class. * Main class.
* Set up the application and run it. * Set up the application and run it.
* @author Georg Graßnick, Andrey Ruzhanskiy * @author Georg Graßnick, Andrey Ruzhanskiy
* @version 2019.08.16 * @version 2019.08.26
*/ */
public final class App { public final class App {
...@@ -177,6 +187,23 @@ public final class App { ...@@ -177,6 +187,23 @@ public final class App {
svgExporter.render(); svgExporter.render();
svgExporter.dump("boolMat"); svgExporter.dump("boolMat");
// FloatingPointData SVG exporting example
PlotCanvas floatCanvas = new PlotCanvas(indexV4Printer, a4Format);
FloatingPointData<Boolean> points = floatCanvas.getNewPage();
final int blockX = 230;
final int blockY = 400;
for (int y = 0; y < blockY; y += 2) {
for (int x = 0; x < blockX; x += 2) {
Point2DValued<Quantity<Length>, Boolean> point = new Point2DValued<>(Quantities.getQuantity(x, MetricPrefix.MILLI(METRE)), Quantities.getQuantity(y, MetricPrefix.MILLI(METRE)), true);
points.addPoint(point);
}
}
SvgExporter<PlotCanvas> floatSvgExporter = new BoolFloatingPointDataSvgExporter(floatCanvas);
floatSvgExporter.render();
floatSvgExporter.dump("floatingPointData");
// Check if some SpoolerService/Printservice exists // Check if some SpoolerService/Printservice exists
if (!PrintDirector.isPrintServiceOn()) { if (!PrintDirector.isPrintServiceOn()) {
throw new Exception("Can't find any Printservices on this System."); throw new Exception("Can't find any Printservices on this System.");
......
...@@ -14,7 +14,7 @@ import java.util.ListIterator; ...@@ -14,7 +14,7 @@ import java.util.ListIterator;
* Representation of a target onto which can be drawn. It wraps a {@link PrintableData} instance and specifies the size of the drawing area (in mm). * Representation of a target onto which can be drawn. It wraps a {@link PrintableData} instance and specifies the size of the drawing area (in mm).
* @param <T> The type of the managed {@link PrintableData} * @param <T> The type of the managed {@link PrintableData}
* @author Leonard Kupper, Georg Graßnick * @author Leonard Kupper, Georg Graßnick
* @version 2019.08.16 * @version 2019.08.26
*/ */
public abstract class AbstractCanvas<T extends PrintableData> { public abstract class AbstractCanvas<T extends PrintableData> {
...@@ -25,6 +25,10 @@ public abstract class AbstractCanvas<T extends PrintableData> { ...@@ -25,6 +25,10 @@ public abstract class AbstractCanvas<T extends PrintableData> {
Rectangle mPrintableArea; Rectangle mPrintableArea;
private double mDotDiameter;
private double mConstraintLeft;
private double mConstraintTop;
List<T> mPageContainer; List<T> mPageContainer;
AbstractCanvas(final Printer printer, final Format format) throws InsufficientRenderingAreaException { AbstractCanvas(final Printer printer, final Format format) throws InsufficientRenderingAreaException {
...@@ -88,6 +92,12 @@ public abstract class AbstractCanvas<T extends PrintableData> { ...@@ -88,6 +92,12 @@ public abstract class AbstractCanvas<T extends PrintableData> {
mPrintableArea = calculatePrintingArea(marginBox, constraintBox); mPrintableArea = calculatePrintingArea(marginBox, constraintBox);
mLogger.info("The calculated available printing area equals: {}", mPrintableArea); mLogger.info("The calculated available printing area equals: {}", mPrintableArea);
mDotDiameter = mPrinter.getProperty("raster.dotDiameter").toDouble();
// Constraints
mConstraintLeft = mPrinter.getProperty("constraint.left").toDouble();
mConstraintTop = mPrinter.getProperty("constraint.top").toDouble();
} }
/** /**
...@@ -126,6 +136,25 @@ public abstract class AbstractCanvas<T extends PrintableData> { ...@@ -126,6 +136,25 @@ public abstract class AbstractCanvas<T extends PrintableData> {
return mFormat.getProperty("page.height").toDouble(); return mFormat.getProperty("page.height").toDouble();
} }
/**
* Get the diameter of a dot in mm.
* @return The diameter of a dot in mm.
*/
public final double getDotDiameter() {
return mDotDiameter;
}
public final double getConstraintLeft() {
return mConstraintLeft;
}
public final double getConstraintTop() {
return mConstraintTop;
}
public abstract double getFullConstraintLeft();
public abstract double getFullConstraintTop();
/** /**
* Get the number of pages in the canvas. * Get the number of pages in the canvas.
* @return The number of pages. * @return The number of pages.
...@@ -142,4 +171,13 @@ public abstract class AbstractCanvas<T extends PrintableData> { ...@@ -142,4 +171,13 @@ public abstract class AbstractCanvas<T extends PrintableData> {
return mPageContainer.listIterator(); return mPageContainer.listIterator();
} }
public final T getCurrentPage() {
if (mPageContainer.size() < 1) {
return getNewPage();
}
return mPageContainer.get(mPageContainer.size() - 1);
}
public abstract T getNewPage();
} }
package de.tudresden.inf.mci.brailleplot.layout;
import de.tudresden.inf.mci.brailleplot.configparser.Format;
import de.tudresden.inf.mci.brailleplot.configparser.Printer;
import de.tudresden.inf.mci.brailleplot.printabledata.FloatingPointData;
import de.tudresden.inf.mci.brailleplot.printabledata.SimpleFloatingPointDataImpl;
/**
* Representation of a target onto which an image can be plotted.
* It wraps a {@link de.tudresden.inf.mci.brailleplot.printabledata.FloatingPointData} instance and describes the raster size and its layout.
* @author Georg Graßnick
* @version 2019.08.26
*/
public class PlotCanvas extends AbstractCanvas<FloatingPointData<Boolean>> {
public PlotCanvas(final Printer printer, final Format format) throws InsufficientRenderingAreaException {
super(printer, format);
}
public final FloatingPointData<Boolean> getNewPage() {
mPageContainer.add(new SimpleFloatingPointDataImpl<>(mPrinter, mFormat));
return getCurrentPage();
}
@Override
public double getFullConstraintLeft() {
return getConstraintLeft();
}
@Override
public double getFullConstraintTop() {
return getConstraintTop();
}
}
...@@ -18,8 +18,8 @@ import static java.lang.Math.floor; ...@@ -18,8 +18,8 @@ import static java.lang.Math.floor;
/** /**
* Representation of a target onto which an image can be rasterized. * Representation of a target onto which an image can be rasterized.
* It wraps a {@link de.tudresden.inf.mci.brailleplot.printabledata.MatrixData} instance and describes the raster size and its (not necessarily equidistant) layout. * It wraps a {@link de.tudresden.inf.mci.brailleplot.printabledata.MatrixData} instance and describes the raster size and its (not necessarily equidistant) layout.
* @author Leonard Kupper, georg Graßnick * @author Leonard Kupper, Georg Graßnick
* @version 2019.08.16 * @version 2019.08.26
*/ */
public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> {
...@@ -49,13 +49,15 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { ...@@ -49,13 +49,15 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> {
private double mVerticalDotDistance; private double mVerticalDotDistance;
private double mHorizontalCellDistance; private double mHorizontalCellDistance;
private double mVerticalCellDistance; private double mVerticalCellDistance;
private double mDotDiameter;
private int mRasterConstraintLeft; // cells
private int mRasterConstraintTop; // cells
/** /**
* Constructor. Creates a new RasterCanvas, which is a canvas that represents it pages as instances of * Constructor. Creates a new RasterCanvas, which is a canvas that represents it pages as instances of
* {@link MatrixData} and holds information about the layout and spacing of the underlying raster grid. * {@link MatrixData} and holds information about the layout and spacing of the underlying raster grid.
* The described grid is build from uniform 'cells' consisting of a variable amount of dots. * The described grid is build from uniform 'cells' consisting of a variable amount of dots.
* It is used as a target on which can be drawn by a {@link Rasterizer}. * It is used as a target on which can be drawn by a {@link de.tudresden.inf.mci.brailleplot.rendering.Rasterizer}.
* @param printer The {@link Printer} configuration to be used. * @param printer The {@link Printer} configuration to be used.
* @param format The {@link Format} configuration to be used. * @param format The {@link Format} configuration to be used.
* @param cellWidth The horizontal count of dots in a cell. * @param cellWidth The horizontal count of dots in a cell.
...@@ -85,12 +87,6 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { ...@@ -85,12 +87,6 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> {
return getCurrentPage(); return getCurrentPage();
} }
public final MatrixData<Boolean> getCurrentPage() {
if (mPageContainer.size() < 1) {
return getNewPage();
}
return mPageContainer.get(mPageContainer.size() - 1);
}
private void readConfig() { private void readConfig() {
...@@ -101,12 +97,13 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { ...@@ -101,12 +97,13 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> {
mVerticalDotDistance = mPrinter.getProperty("raster.dotDistance.vertical").toDouble(); mVerticalDotDistance = mPrinter.getProperty("raster.dotDistance.vertical").toDouble();
mHorizontalCellDistance = mPrinter.getProperty("raster.cellDistance.horizontal").toDouble(); mHorizontalCellDistance = mPrinter.getProperty("raster.cellDistance.horizontal").toDouble();
mVerticalCellDistance = mPrinter.getProperty("raster.cellDistance.vertical").toDouble(); mVerticalCellDistance = mPrinter.getProperty("raster.cellDistance.vertical").toDouble();
mDotDiameter = mPrinter.getProperty("raster.dotDiameter").toDouble();
// Calculate cell size in mm // Calculate cell size in mm
mCellHorizontalMM = mHorizontalDotDistance * (mCellWidth - 1) + mHorizontalCellDistance; // Full width of one cell + padding in mm mCellHorizontalMM = mHorizontalDotDistance * (mCellWidth - 1) + mHorizontalCellDistance; // Full width of one cell + padding in mm
mCellVerticalMM = mVerticalDotDistance * (mCellHeight - 1) + mVerticalCellDistance; // Full height of one cell + padding in mm mCellVerticalMM = mVerticalDotDistance * (mCellHeight - 1) + mVerticalCellDistance; // Full height of one cell + padding in mm
mRasterConstraintTop = mPrinter.getProperty("raster.constraint.top").toInt();
mRasterConstraintLeft = mPrinter.getProperty("raster.constraint.left").toInt();
} }
private void calculateRasterSize() throws InsufficientRenderingAreaException { private void calculateRasterSize() throws InsufficientRenderingAreaException {
...@@ -218,9 +215,6 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { ...@@ -218,9 +215,6 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> {
public final double getVerticalCellDistance() { public final double getVerticalCellDistance() {
return mVerticalCellDistance; return mVerticalCellDistance;
} }
public final double getDotDiameter() {
return mDotDiameter;
}
public final Rectangle getCellRectangle() { public final Rectangle getCellRectangle() {
return new Rectangle(mPrintingAreaCells); return new Rectangle(mPrintingAreaCells);
} }
...@@ -258,18 +252,42 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { ...@@ -258,18 +252,42 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> {
return dotY / mCellHeight; return dotY / mCellHeight;
} }
public final int getFullConstraintLeft() { public final int getRasterConstraintLeft() {
return (int) Math.round(mPrinter.getProperty("raster.constraint.left").toInt() * mCellHorizontalMM + mPrinter.getProperty("constraint.left").toDouble()); return mRasterConstraintLeft;
}
public final int getRasterConstraintTop() {
return mRasterConstraintTop;
}
/**
* Returns the full constraint of the printable Area from the left in mm.
* @return The margin to the left of the paper in mm, where printing is not possible.
*/
public final double getFullConstraintLeft() {
return getRasterConstraintLeft() * mCellHorizontalMM + getConstraintLeft();
} }
public final int getFullConstraintTop() { /**
return (int) Math.round(mPrinter.getProperty("raster.constraint.top").toInt() * mCellVerticalMM + mPrinter.getProperty("constraint.top").toDouble()); * Returns the full constraint of the printable Area from the top in mm.
* @return The margin to the top of the paper in mm, where printing is not possible.
*/
public final double getFullConstraintTop() {
return getRasterConstraintTop() * mCellVerticalMM + getConstraintTop();
} }
/**
* Get the X coordinates of all dots.
* @return The X coordinates of all dots in mm.
*/
public final List<Double> getXPositions() { public final List<Double> getXPositions() {
return Collections.unmodifiableList(mXPositions); return Collections.unmodifiableList(mXPositions);
} }
/**
* Get the Y coordinates of all dots.
* @return The Y coordinates of all dots in mm.
*/
public final List<Double> getYPositions() { public final List<Double> getYPositions() {
return Collections.unmodifiableList(mYPositions); return Collections.unmodifiableList(mYPositions);
} }
......
...@@ -13,6 +13,7 @@ import java.awt.Color; ...@@ -13,6 +13,7 @@ import java.awt.Color;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.ListIterator; import java.util.ListIterator;
import java.util.Objects; import java.util.Objects;
...@@ -38,6 +39,7 @@ abstract class AbstractSvgExporter<T extends AbstractCanvas, U extends Printable ...@@ -38,6 +39,7 @@ abstract class AbstractSvgExporter<T extends AbstractCanvas, U extends Printable
AbstractSvgExporter(final T canvas) { AbstractSvgExporter(final T canvas) {
Objects.requireNonNull(canvas); Objects.requireNonNull(canvas);
mCanvas = canvas; mCanvas = canvas;
mSvgs = new ArrayList<>(mCanvas.getPageCount());
} }
@Override @Override
......
package de.tudresden.inf.mci.brailleplot.svgexporter;
import de.tudresden.inf.mci.brailleplot.layout.PlotCanvas;
import de.tudresden.inf.mci.brailleplot.point.Point2DValued;
import de.tudresden.inf.mci.brailleplot.printabledata.FloatingPointData;
import org.jfree.graphics2d.svg.SVGGraphics2D;
import tec.units.ri.unit.MetricPrefix;
import javax.measure.Quantity;
import javax.measure.quantity.Length;
import java.util.Iterator;
import static tec.units.ri.unit.Units.METRE;
/**
* SVG exporter class that supports {@link PlotCanvas} as input.
* @author Georg Graßnick
* @version 2019.08.26
*/
public class BoolFloatingPointDataSvgExporter extends AbstractSvgExporter<PlotCanvas, FloatingPointData<Boolean>> {
public BoolFloatingPointDataSvgExporter(final PlotCanvas canvas) {
super(canvas);
}
@Override
protected void renderPage(final FloatingPointData<Boolean> points, final int dataIndex) {
int dotDiameter = (int) (mCanvas.getDotDiameter() * SCALE_FACTOR);
Iterator<Point2DValued<Quantity<Length>, Boolean>> it = points.getIterator();
SVGGraphics2D svg = mSvgs.get(dataIndex);
while (it.hasNext()) {
Point2DValued<Quantity<Length>, Boolean> p = it.next();
double x = p.getX().to(MetricPrefix.MILLI(METRE)).getValue().doubleValue();
double y = p.getY().to(MetricPrefix.MILLI(METRE)).getValue().doubleValue();
int xPos = (int) Math.round((x - dotDiameter / 2f + mCanvas.getFullConstraintLeft()) * SCALE_FACTOR);
int yPos = (int) Math.round((y - dotDiameter / 2f + mCanvas.getFullConstraintTop()) * SCALE_FACTOR);
svg.drawOval(xPos, yPos, dotDiameter, dotDiameter);
}
}
}
...@@ -4,7 +4,6 @@ import de.tudresden.inf.mci.brailleplot.printabledata.MatrixData; ...@@ -4,7 +4,6 @@ import de.tudresden.inf.mci.brailleplot.printabledata.MatrixData;
import de.tudresden.inf.mci.brailleplot.layout.RasterCanvas; import de.tudresden.inf.mci.brailleplot.layout.RasterCanvas;
import org.jfree.graphics2d.svg.SVGGraphics2D; import org.jfree.graphics2d.svg.SVGGraphics2D;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
...@@ -17,7 +16,6 @@ public class BoolMatrixDataSvgExporter extends AbstractSvgExporter<RasterCanvas, ...@@ -17,7 +16,6 @@ public class BoolMatrixDataSvgExporter extends AbstractSvgExporter<RasterCanvas,
public BoolMatrixDataSvgExporter(final RasterCanvas rasterCanvas) { public BoolMatrixDataSvgExporter(final RasterCanvas rasterCanvas) {
super(rasterCanvas); super(rasterCanvas);
mSvgs = new ArrayList<>(mCanvas.getPageCount());
} }
@Override @Override
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment