diff --git a/src/main/java/de/tudresden/inf/mci/brailleplot/App.java b/src/main/java/de/tudresden/inf/mci/brailleplot/App.java index c703a1a3f49d8f9a0fe231cef7777e1fc7d9c0c7..611d592cde5ad56719276216af01c50fb23b9093 100644 --- a/src/main/java/de/tudresden/inf/mci/brailleplot/App.java +++ b/src/main/java/de/tudresden/inf/mci/brailleplot/App.java @@ -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.Printer; +import de.tudresden.inf.mci.brailleplot.layout.PlotCanvas; 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.PrinterCapability; @@ -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.diagrams.BarChart; 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.SvgExporter; import org.slf4j.Logger; 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.InputStream; import java.io.InputStreamReader; @@ -34,11 +42,13 @@ import java.io.Reader; import java.util.Optional; import java.util.concurrent.ConcurrentLinkedDeque; +import static tec.units.ri.unit.Units.METRE; + /** * Main class. * Set up the application and run it. * @author Georg Graßnick, Andrey Ruzhanskiy - * @version 2019.08.16 + * @version 2019.08.26 */ public final class App { @@ -177,6 +187,23 @@ public final class App { svgExporter.render(); 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 if (!PrintDirector.isPrintServiceOn()) { throw new Exception("Can't find any Printservices on this System."); diff --git a/src/main/java/de/tudresden/inf/mci/brailleplot/layout/AbstractCanvas.java b/src/main/java/de/tudresden/inf/mci/brailleplot/layout/AbstractCanvas.java index b28a3cc0525cc8734d8b7573bb0824c864aae0b2..9a37434c37acfcac081c9e0e6cdfa2391a9cd20a 100644 --- a/src/main/java/de/tudresden/inf/mci/brailleplot/layout/AbstractCanvas.java +++ b/src/main/java/de/tudresden/inf/mci/brailleplot/layout/AbstractCanvas.java @@ -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). * @param <T> The type of the managed {@link PrintableData} * @author Leonard Kupper, Georg Graßnick - * @version 2019.08.16 + * @version 2019.08.26 */ public abstract class AbstractCanvas<T extends PrintableData> { @@ -25,6 +25,10 @@ public abstract class AbstractCanvas<T extends PrintableData> { Rectangle mPrintableArea; + private double mDotDiameter; + private double mConstraintLeft; + private double mConstraintTop; + List<T> mPageContainer; AbstractCanvas(final Printer printer, final Format format) throws InsufficientRenderingAreaException { @@ -88,6 +92,12 @@ public abstract class AbstractCanvas<T extends PrintableData> { mPrintableArea = calculatePrintingArea(marginBox, constraintBox); 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> { 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. * @return The number of pages. @@ -142,4 +171,13 @@ public abstract class AbstractCanvas<T extends PrintableData> { return mPageContainer.listIterator(); } + public final T getCurrentPage() { + if (mPageContainer.size() < 1) { + return getNewPage(); + } + return mPageContainer.get(mPageContainer.size() - 1); + } + + public abstract T getNewPage(); + } diff --git a/src/main/java/de/tudresden/inf/mci/brailleplot/layout/PlotCanvas.java b/src/main/java/de/tudresden/inf/mci/brailleplot/layout/PlotCanvas.java new file mode 100644 index 0000000000000000000000000000000000000000..6a74413980f348ad78cc1a5a1de5130a758dc294 --- /dev/null +++ b/src/main/java/de/tudresden/inf/mci/brailleplot/layout/PlotCanvas.java @@ -0,0 +1,34 @@ +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(); + } +} diff --git a/src/main/java/de/tudresden/inf/mci/brailleplot/layout/RasterCanvas.java b/src/main/java/de/tudresden/inf/mci/brailleplot/layout/RasterCanvas.java index 9e88d921126e6552ffaf73ab746c9bd0ca08329c..6878b795c98e829d07d702e082b27e5f7d785bc4 100644 --- a/src/main/java/de/tudresden/inf/mci/brailleplot/layout/RasterCanvas.java +++ b/src/main/java/de/tudresden/inf/mci/brailleplot/layout/RasterCanvas.java @@ -18,8 +18,8 @@ import static java.lang.Math.floor; /** * 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. - * @author Leonard Kupper, georg Graßnick - * @version 2019.08.16 + * @author Leonard Kupper, Georg Graßnick + * @version 2019.08.26 */ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { @@ -49,13 +49,15 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { private double mVerticalDotDistance; private double mHorizontalCellDistance; 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 * {@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. - * 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 format The {@link Format} configuration to be used. * @param cellWidth The horizontal count of dots in a cell. @@ -85,12 +87,6 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { return getCurrentPage(); } - public final MatrixData<Boolean> getCurrentPage() { - if (mPageContainer.size() < 1) { - return getNewPage(); - } - return mPageContainer.get(mPageContainer.size() - 1); - } private void readConfig() { @@ -101,12 +97,13 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { mVerticalDotDistance = mPrinter.getProperty("raster.dotDistance.vertical").toDouble(); mHorizontalCellDistance = mPrinter.getProperty("raster.cellDistance.horizontal").toDouble(); mVerticalCellDistance = mPrinter.getProperty("raster.cellDistance.vertical").toDouble(); - mDotDiameter = mPrinter.getProperty("raster.dotDiameter").toDouble(); // Calculate cell size 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 + mRasterConstraintTop = mPrinter.getProperty("raster.constraint.top").toInt(); + mRasterConstraintLeft = mPrinter.getProperty("raster.constraint.left").toInt(); } private void calculateRasterSize() throws InsufficientRenderingAreaException { @@ -218,9 +215,6 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { public final double getVerticalCellDistance() { return mVerticalCellDistance; } - public final double getDotDiameter() { - return mDotDiameter; - } public final Rectangle getCellRectangle() { return new Rectangle(mPrintingAreaCells); } @@ -258,18 +252,42 @@ public class RasterCanvas extends AbstractCanvas<MatrixData<Boolean>> { return dotY / mCellHeight; } - public final int getFullConstraintLeft() { - return (int) Math.round(mPrinter.getProperty("raster.constraint.left").toInt() * mCellHorizontalMM + mPrinter.getProperty("constraint.left").toDouble()); + public final int getRasterConstraintLeft() { + 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() { 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() { return Collections.unmodifiableList(mYPositions); } diff --git a/src/main/java/de/tudresden/inf/mci/brailleplot/svgexporter/AbstractSvgExporter.java b/src/main/java/de/tudresden/inf/mci/brailleplot/svgexporter/AbstractSvgExporter.java index ed9e16d9c73850c447c6f1fc5bd55d9ce435e4a5..b14304b83c1e532f17e25e414c56da75dc851c16 100644 --- a/src/main/java/de/tudresden/inf/mci/brailleplot/svgexporter/AbstractSvgExporter.java +++ b/src/main/java/de/tudresden/inf/mci/brailleplot/svgexporter/AbstractSvgExporter.java @@ -13,6 +13,7 @@ import java.awt.Color; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; import java.util.List; import java.util.ListIterator; import java.util.Objects; @@ -38,6 +39,7 @@ abstract class AbstractSvgExporter<T extends AbstractCanvas, U extends Printable AbstractSvgExporter(final T canvas) { Objects.requireNonNull(canvas); mCanvas = canvas; + mSvgs = new ArrayList<>(mCanvas.getPageCount()); } @Override diff --git a/src/main/java/de/tudresden/inf/mci/brailleplot/svgexporter/BoolFloatingPointDataSvgExporter.java b/src/main/java/de/tudresden/inf/mci/brailleplot/svgexporter/BoolFloatingPointDataSvgExporter.java new file mode 100644 index 0000000000000000000000000000000000000000..5cbd8b63cb08431d0f23d5c0b719ed8baf2aaf4d --- /dev/null +++ b/src/main/java/de/tudresden/inf/mci/brailleplot/svgexporter/BoolFloatingPointDataSvgExporter.java @@ -0,0 +1,41 @@ +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); + } + } +} diff --git a/src/main/java/de/tudresden/inf/mci/brailleplot/svgexporter/BoolMatrixDataSvgExporter.java b/src/main/java/de/tudresden/inf/mci/brailleplot/svgexporter/BoolMatrixDataSvgExporter.java index a0649a3e659b609d036460c94769e9473e2870a7..72619483ccc5dd1b508b33f91ccc30c77ec3d017 100644 --- a/src/main/java/de/tudresden/inf/mci/brailleplot/svgexporter/BoolMatrixDataSvgExporter.java +++ b/src/main/java/de/tudresden/inf/mci/brailleplot/svgexporter/BoolMatrixDataSvgExporter.java @@ -4,7 +4,6 @@ import de.tudresden.inf.mci.brailleplot.printabledata.MatrixData; import de.tudresden.inf.mci.brailleplot.layout.RasterCanvas; import org.jfree.graphics2d.svg.SVGGraphics2D; -import java.util.ArrayList; import java.util.List; /** @@ -17,7 +16,6 @@ public class BoolMatrixDataSvgExporter extends AbstractSvgExporter<RasterCanvas, public BoolMatrixDataSvgExporter(final RasterCanvas rasterCanvas) { super(rasterCanvas); - mSvgs = new ArrayList<>(mCanvas.getPageCount()); } @Override