Added PageFitPrintStrategy and related files to print multiple fins, transitions, and nosecones onto the same page(s)
This commit is contained in:
parent
bd680c7e14
commit
64c3b0c83a
@ -1,3 +1,7 @@
|
|||||||
|
2012-05-09 Jason Blood
|
||||||
|
|
||||||
|
* Add PageFitPrintStrategy and related files to print multiple fins, transitions, and nosecones onto the same page(s)
|
||||||
|
|
||||||
2012-04-19 Sampo Niskanen
|
2012-04-19 Sampo Niskanen
|
||||||
|
|
||||||
* Allow opening recovery device on stage separation
|
* Allow opening recovery device on stage separation
|
||||||
|
@ -6,7 +6,7 @@ import javax.swing.*;
|
|||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
public abstract class AbstractPrintableTransition extends JPanel {
|
public abstract class AbstractPrintableTransition extends PrintableComponent {
|
||||||
/**
|
/**
|
||||||
* The stroke of the transition arc.
|
* The stroke of the transition arc.
|
||||||
*/
|
*/
|
||||||
@ -21,7 +21,7 @@ public abstract class AbstractPrintableTransition extends JPanel {
|
|||||||
* The Y margin.
|
* The Y margin.
|
||||||
*/
|
*/
|
||||||
protected int marginY = (int) PrintUnit.INCHES.toPoints(0.25f);
|
protected int marginY = (int) PrintUnit.INCHES.toPoints(0.25f);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor. Initialize this printable with the component to be printed.
|
* Constructor. Initialize this printable with the component to be printed.
|
||||||
*
|
*
|
||||||
@ -29,8 +29,6 @@ public abstract class AbstractPrintableTransition extends JPanel {
|
|||||||
* @param transition the component to be printed
|
* @param transition the component to be printed
|
||||||
*/
|
*/
|
||||||
public AbstractPrintableTransition(boolean isDoubleBuffered, Transition transition) {
|
public AbstractPrintableTransition(boolean isDoubleBuffered, Transition transition) {
|
||||||
super(isDoubleBuffered);
|
|
||||||
setBackground(Color.white);
|
|
||||||
init(transition);
|
init(transition);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,7 +47,7 @@ public abstract class AbstractPrintableTransition extends JPanel {
|
|||||||
* @param g2 the graphics context
|
* @param g2 the graphics context
|
||||||
*/
|
*/
|
||||||
protected abstract void draw(Graphics2D g2);
|
protected abstract void draw(Graphics2D g2);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a generated image of the transition. May then be used wherever AWT images can be used, or converted to
|
* Returns a generated image of the transition. May then be used wherever AWT images can be used, or converted to
|
||||||
* another image/picture format and used accordingly.
|
* another image/picture format and used accordingly.
|
||||||
@ -80,6 +78,7 @@ public abstract class AbstractPrintableTransition extends JPanel {
|
|||||||
|
|
||||||
g2.setColor(Color.BLACK);
|
g2.setColor(Color.BLACK);
|
||||||
g2.setStroke(thinStroke);
|
g2.setStroke(thinStroke);
|
||||||
|
g2.translate(getOffsetX(), getOffsetY());
|
||||||
|
|
||||||
draw(g2);
|
draw(g2);
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import com.itextpdf.text.pdf.PdfBoolean;
|
|||||||
import com.itextpdf.text.pdf.PdfName;
|
import com.itextpdf.text.pdf.PdfName;
|
||||||
import com.itextpdf.text.pdf.PdfWriter;
|
import com.itextpdf.text.pdf.PdfWriter;
|
||||||
import net.sf.openrocket.document.OpenRocketDocument;
|
import net.sf.openrocket.document.OpenRocketDocument;
|
||||||
|
import net.sf.openrocket.gui.print.visitor.PageFitPrintStrategy;
|
||||||
import net.sf.openrocket.gui.print.visitor.FinMarkingGuideStrategy;
|
import net.sf.openrocket.gui.print.visitor.FinMarkingGuideStrategy;
|
||||||
import net.sf.openrocket.gui.print.visitor.FinSetPrintStrategy;
|
import net.sf.openrocket.gui.print.visitor.FinSetPrintStrategy;
|
||||||
import net.sf.openrocket.gui.print.visitor.PartsDetailVisitorStrategy;
|
import net.sf.openrocket.gui.print.visitor.PartsDetailVisitorStrategy;
|
||||||
@ -53,6 +54,10 @@ public class PrintController {
|
|||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Used to combine multiple components onto fewer sheets of paper
|
||||||
|
PageFitPrintStrategy pageFitPrint = new PageFitPrintStrategy(idoc, writer);
|
||||||
|
|
||||||
while (toBePrinted.hasNext()) {
|
while (toBePrinted.hasNext()) {
|
||||||
PrintableContext printableContext = toBePrinted.next();
|
PrintableContext printableContext = toBePrinted.next();
|
||||||
|
|
||||||
@ -65,23 +70,23 @@ public class PrintController {
|
|||||||
idoc.newPage();
|
idoc.newPage();
|
||||||
break;
|
break;
|
||||||
case FIN_TEMPLATE:
|
case FIN_TEMPLATE:
|
||||||
final FinSetPrintStrategy finWriter = new FinSetPrintStrategy(idoc, writer, stages);
|
final FinSetPrintStrategy finWriter = new FinSetPrintStrategy(idoc, writer, stages, pageFitPrint);
|
||||||
finWriter.writeToDocument(doc.getRocket());
|
finWriter.writeToDocument(doc.getRocket());
|
||||||
break;
|
break;
|
||||||
case PARTS_DETAIL:
|
case PARTS_DETAIL:
|
||||||
final PartsDetailVisitorStrategy detailVisitor = new PartsDetailVisitorStrategy(idoc, writer, stages);
|
final PartsDetailVisitorStrategy detailVisitor = new PartsDetailVisitorStrategy(idoc, writer, stages);
|
||||||
detailVisitor.writeToDocument(doc.getRocket());
|
detailVisitor.writeToDocument(doc.getRocket());
|
||||||
detailVisitor.close();
|
detailVisitor.close();
|
||||||
idoc.newPage();
|
idoc.newPage();
|
||||||
break;
|
break;
|
||||||
case TRANSITION_TEMPLATE:
|
case TRANSITION_TEMPLATE:
|
||||||
final TransitionStrategy tranWriter = new TransitionStrategy(idoc, writer, stages);
|
final TransitionStrategy tranWriter = new TransitionStrategy(idoc, writer, stages, pageFitPrint);
|
||||||
tranWriter.writeToDocument(doc.getRocket(), false);
|
tranWriter.writeToDocument(doc.getRocket(), false);
|
||||||
idoc.newPage();
|
idoc.newPage();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NOSE_CONE_TEMPLATE:
|
case NOSE_CONE_TEMPLATE:
|
||||||
final TransitionStrategy coneWriter = new TransitionStrategy(idoc, writer, stages);
|
final TransitionStrategy coneWriter = new TransitionStrategy(idoc, writer, stages, pageFitPrint);
|
||||||
coneWriter.writeToDocument(doc.getRocket(), true);
|
coneWriter.writeToDocument(doc.getRocket(), true);
|
||||||
idoc.newPage();
|
idoc.newPage();
|
||||||
break;
|
break;
|
||||||
@ -93,6 +98,10 @@ public class PrintController {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Write out parts that we are going to combine onto single sheets of paper
|
||||||
|
pageFitPrint.writeToDocument(doc.getRocket());
|
||||||
|
idoc.newPage();
|
||||||
|
|
||||||
//Stupid iText throws a really nasty exception if there is no data when close is called.
|
//Stupid iText throws a really nasty exception if there is no data when close is called.
|
||||||
if (writer.getCurrentDocumentSize() <= 140) {
|
if (writer.getCurrentDocumentSize() <= 140) {
|
||||||
writer.setPageEmpty(false);
|
writer.setPageEmpty(false);
|
||||||
|
96
core/src/net/sf/openrocket/gui/print/PrintableComponent.java
Normal file
96
core/src/net/sf/openrocket/gui/print/PrintableComponent.java
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* PrintableComponent.java
|
||||||
|
*/
|
||||||
|
package net.sf.openrocket.gui.print;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.print.PageFormat;
|
||||||
|
import java.awt.print.Printable;
|
||||||
|
import java.awt.print.PrinterException;
|
||||||
|
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Common interface for components we want to print. Used by PageFitPrintStrategy
|
||||||
|
*
|
||||||
|
* @author Jason Blood <dyster2000@gmail.com>
|
||||||
|
*/
|
||||||
|
public class PrintableComponent extends JPanel implements Printable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The printing offsets
|
||||||
|
*/
|
||||||
|
private int offsetX = 0;
|
||||||
|
private int offsetY = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*/
|
||||||
|
public PrintableComponent() {
|
||||||
|
super(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From the java.awt.print.Printable interface.
|
||||||
|
* <p/>
|
||||||
|
* Prints the page at the specified index into the specified {@link java.awt.Graphics} context in the specified
|
||||||
|
* format. A <code>PrinterJob</code> calls the <code>Printable</code> interface to request that a page be rendered
|
||||||
|
* into the context specified by <code>graphics</code>. The format of the page to be drawn is specified by
|
||||||
|
* <code>pageFormat</code>. The zero based index of the requested page is specified by <code>pageIndex</code>. If
|
||||||
|
* the requested page does not exist then this method returns NO_SUCH_PAGE; otherwise PAGE_EXISTS is returned. The
|
||||||
|
* <code>Graphics</code> class or subclass implements the {@link java.awt.print.PrinterGraphics} interface to
|
||||||
|
* provide additional information. If the <code>Printable</code> object aborts the print job then it throws a
|
||||||
|
* {@link java.awt.print.PrinterException}.
|
||||||
|
* <p/>
|
||||||
|
* Note: This is not currently used in OpenRocket. It's only here for reference.
|
||||||
|
*
|
||||||
|
* @param graphics the context into which the page is drawn
|
||||||
|
* @param pageFormat the size and orientation of the page being drawn
|
||||||
|
* @param pageIndex the zero based index of the page to be drawn
|
||||||
|
*
|
||||||
|
* @return PAGE_EXISTS if the page is rendered successfully or NO_SUCH_PAGE if <code>pageIndex</code> specifies a
|
||||||
|
* non-existent page.
|
||||||
|
*
|
||||||
|
* @throws java.awt.print.PrinterException
|
||||||
|
* thrown when the print job is terminated.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int print (final Graphics graphics, final PageFormat pageFormat, final int pageIndex)
|
||||||
|
throws PrinterException {
|
||||||
|
|
||||||
|
Graphics2D g2d = (Graphics2D) graphics;
|
||||||
|
PrintUtilities.translateToJavaOrigin(g2d, pageFormat);
|
||||||
|
PrintUtilities.disableDoubleBuffering(this);
|
||||||
|
paint(g2d);
|
||||||
|
PrintUtilities.enableDoubleBuffering(this);
|
||||||
|
return Printable.PAGE_EXISTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the offset this component will be printed to the page
|
||||||
|
* @param x X offset to print at.
|
||||||
|
* @param x Y offset to print at.
|
||||||
|
*/
|
||||||
|
public void setPrintOffset(int x, int y) {
|
||||||
|
offsetX = x;
|
||||||
|
offsetY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the X offset this component will be printed to the page
|
||||||
|
* @return X offset to print at.
|
||||||
|
*/
|
||||||
|
public int getOffsetX() {
|
||||||
|
return offsetX;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the Y offset this component will be printed to the page
|
||||||
|
* @return Y offset to print at.
|
||||||
|
*/
|
||||||
|
public int getOffsetY() {
|
||||||
|
return offsetY;
|
||||||
|
}
|
||||||
|
}
|
@ -19,7 +19,7 @@ import java.awt.print.PrinterException;
|
|||||||
* modified) and rendering it within a JPanel. The JPanel is not actually visualized on a display, but instead renders
|
* modified) and rendering it within a JPanel. The JPanel is not actually visualized on a display, but instead renders
|
||||||
* it to a print device.
|
* it to a print device.
|
||||||
*/
|
*/
|
||||||
public class PrintableFinSet extends JPanel implements Printable {
|
public class PrintableFinSet extends PrintableComponent {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The object that represents the shape (outline) of the fin. This gets drawn onto the Swing component.
|
* The object that represents the shape (outline) of the fin. This gets drawn onto the Swing component.
|
||||||
@ -58,9 +58,9 @@ public class PrintableFinSet extends JPanel implements Printable {
|
|||||||
* @param points an array of points.
|
* @param points an array of points.
|
||||||
*/
|
*/
|
||||||
public PrintableFinSet (Coordinate[] points) {
|
public PrintableFinSet (Coordinate[] points) {
|
||||||
super(false);
|
//super(false);
|
||||||
init(points);
|
init(points);
|
||||||
setBackground(Color.white);
|
//setBackground(Color.white);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -108,42 +108,6 @@ public class PrintableFinSet extends JPanel implements Printable {
|
|||||||
return marginY;
|
return marginY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* From the java.awt.print.Printable interface.
|
|
||||||
* <p/>
|
|
||||||
* Prints the page at the specified index into the specified {@link java.awt.Graphics} context in the specified
|
|
||||||
* format. A <code>PrinterJob</code> calls the <code>Printable</code> interface to request that a page be rendered
|
|
||||||
* into the context specified by <code>graphics</code>. The format of the page to be drawn is specified by
|
|
||||||
* <code>pageFormat</code>. The zero based index of the requested page is specified by <code>pageIndex</code>. If
|
|
||||||
* the requested page does not exist then this method returns NO_SUCH_PAGE; otherwise PAGE_EXISTS is returned. The
|
|
||||||
* <code>Graphics</code> class or subclass implements the {@link java.awt.print.PrinterGraphics} interface to
|
|
||||||
* provide additional information. If the <code>Printable</code> object aborts the print job then it throws a
|
|
||||||
* {@link java.awt.print.PrinterException}.
|
|
||||||
* <p/>
|
|
||||||
* Note: This is not currently used in OpenRocket. It's only here for reference.
|
|
||||||
*
|
|
||||||
* @param graphics the context into which the page is drawn
|
|
||||||
* @param pageFormat the size and orientation of the page being drawn
|
|
||||||
* @param pageIndex the zero based index of the page to be drawn
|
|
||||||
*
|
|
||||||
* @return PAGE_EXISTS if the page is rendered successfully or NO_SUCH_PAGE if <code>pageIndex</code> specifies a
|
|
||||||
* non-existent page.
|
|
||||||
*
|
|
||||||
* @throws java.awt.print.PrinterException
|
|
||||||
* thrown when the print job is terminated.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public int print (final Graphics graphics, final PageFormat pageFormat, final int pageIndex)
|
|
||||||
throws PrinterException {
|
|
||||||
|
|
||||||
Graphics2D g2d = (Graphics2D) graphics;
|
|
||||||
PrintUtilities.translateToJavaOrigin(g2d, pageFormat);
|
|
||||||
PrintUtilities.disableDoubleBuffering(this);
|
|
||||||
paint(g2d);
|
|
||||||
PrintUtilities.enableDoubleBuffering(this);
|
|
||||||
return Printable.PAGE_EXISTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a generated image of the fin set. May then be used wherever AWT images can be used, or converted to
|
* Returns a generated image of the fin set. May then be used wherever AWT images can be used, or converted to
|
||||||
* another image/picture format and used accordingly.
|
* another image/picture format and used accordingly.
|
||||||
@ -174,8 +138,7 @@ public class PrintableFinSet extends JPanel implements Printable {
|
|||||||
* @param g the Java2D graphics context
|
* @param g the Java2D graphics context
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void paintComponent (Graphics g) {
|
public void paintComponent(Graphics g) {
|
||||||
super.paintComponent(g);
|
|
||||||
Graphics2D g2d = (Graphics2D) g;
|
Graphics2D g2d = (Graphics2D) g;
|
||||||
|
|
||||||
int x = 0;
|
int x = 0;
|
||||||
@ -189,11 +152,10 @@ public class PrintableFinSet extends JPanel implements Printable {
|
|||||||
y = marginY + Math.abs(minY);
|
y = marginY + Math.abs(minY);
|
||||||
}
|
}
|
||||||
// Reset the origin.
|
// Reset the origin.
|
||||||
g2d.translate(x, y);
|
g2d.translate(x + getOffsetX(), y + getOffsetY());
|
||||||
g2d.setPaint(TemplateProperties.getFillColor());
|
g2d.setPaint(TemplateProperties.getFillColor());
|
||||||
g2d.fill(polygon);
|
g2d.fill(polygon);
|
||||||
g2d.setPaint(TemplateProperties.getLineColor());
|
g2d.setPaint(TemplateProperties.getLineColor());
|
||||||
g2d.draw(polygon);
|
g2d.draw(polygon);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
package net.sf.openrocket.gui.print;
|
package net.sf.openrocket.gui.print;
|
||||||
|
|
||||||
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.awt.Shape;
|
import java.awt.Shape;
|
||||||
|
import java.awt.print.PageFormat;
|
||||||
|
import java.awt.print.Printable;
|
||||||
|
import java.awt.print.PrinterException;
|
||||||
|
|
||||||
import net.sf.openrocket.gui.rocketfigure.TransitionShapes;
|
import net.sf.openrocket.gui.rocketfigure.TransitionShapes;
|
||||||
import net.sf.openrocket.rocketcomponent.NoseCone;
|
import net.sf.openrocket.rocketcomponent.NoseCone;
|
||||||
@ -48,7 +52,7 @@ public class PrintableNoseCone extends AbstractPrintableTransition {
|
|||||||
|
|
||||||
if (shapes != null && shapes.length > 0) {
|
if (shapes != null && shapes.length > 0) {
|
||||||
Rectangle r = shapes[0].getBounds();
|
Rectangle r = shapes[0].getBounds();
|
||||||
g2.translate(marginX + r.getHeight() / 2, marginY);
|
g2.translate(marginX + r.getHeight() / 2 + getOffsetX(), marginY + getOffsetY());
|
||||||
g2.rotate(Math.PI / 2);
|
g2.rotate(Math.PI / 2);
|
||||||
for (Shape shape : shapes) {
|
for (Shape shape : shapes) {
|
||||||
g2.draw(shape);
|
g2.draw(shape);
|
||||||
|
@ -1,12 +1,16 @@
|
|||||||
package net.sf.openrocket.gui.print;
|
package net.sf.openrocket.gui.print;
|
||||||
|
|
||||||
import java.awt.BasicStroke;
|
import java.awt.BasicStroke;
|
||||||
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.geom.Arc2D;
|
import java.awt.geom.Arc2D;
|
||||||
import java.awt.geom.GeneralPath;
|
import java.awt.geom.GeneralPath;
|
||||||
import java.awt.geom.Line2D;
|
import java.awt.geom.Line2D;
|
||||||
import java.awt.geom.Path2D;
|
import java.awt.geom.Path2D;
|
||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
|
import java.awt.print.PageFormat;
|
||||||
|
import java.awt.print.Printable;
|
||||||
|
import java.awt.print.PrinterException;
|
||||||
|
|
||||||
import net.sf.openrocket.rocketcomponent.Transition;
|
import net.sf.openrocket.rocketcomponent.Transition;
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ import com.itextpdf.text.Rectangle;
|
|||||||
import com.itextpdf.text.pdf.PdfContentByte;
|
import com.itextpdf.text.pdf.PdfContentByte;
|
||||||
import com.itextpdf.text.pdf.PdfWriter;
|
import com.itextpdf.text.pdf.PdfWriter;
|
||||||
import net.sf.openrocket.gui.print.ITextHelper;
|
import net.sf.openrocket.gui.print.ITextHelper;
|
||||||
|
import net.sf.openrocket.gui.print.PrintUnit;
|
||||||
import net.sf.openrocket.gui.print.PrintableFinSet;
|
import net.sf.openrocket.gui.print.PrintableFinSet;
|
||||||
import net.sf.openrocket.logging.LogHelper;
|
import net.sf.openrocket.logging.LogHelper;
|
||||||
import net.sf.openrocket.rocketcomponent.FinSet;
|
import net.sf.openrocket.rocketcomponent.FinSet;
|
||||||
@ -17,7 +18,9 @@ import net.sf.openrocket.startup.Application;
|
|||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.ListIterator;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -45,6 +48,11 @@ public class FinSetPrintStrategy {
|
|||||||
*/
|
*/
|
||||||
protected Set<Integer> stages;
|
protected Set<Integer> stages;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strategy for fitting multiple components onto a page.
|
||||||
|
*/
|
||||||
|
protected PageFitPrintStrategy pageFitPrint;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
@ -52,10 +60,11 @@ public class FinSetPrintStrategy {
|
|||||||
* @param theWriter The direct iText writer
|
* @param theWriter The direct iText writer
|
||||||
* @param theStages The stages to be printed by this strategy
|
* @param theStages The stages to be printed by this strategy
|
||||||
*/
|
*/
|
||||||
public FinSetPrintStrategy(Document doc, PdfWriter theWriter, Set<Integer> theStages) {
|
public FinSetPrintStrategy(Document doc, PdfWriter theWriter, Set<Integer> theStages, PageFitPrintStrategy pageFit) {
|
||||||
document = doc;
|
document = doc;
|
||||||
writer = theWriter;
|
writer = theWriter;
|
||||||
stages = theStages;
|
stages = theStages;
|
||||||
|
pageFitPrint = pageFit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -98,14 +107,14 @@ public class FinSetPrintStrategy {
|
|||||||
java.awt.Dimension finSize = pfs.getSize();
|
java.awt.Dimension finSize = pfs.getSize();
|
||||||
final Dimension pageSize = getPageSize();
|
final Dimension pageSize = getPageSize();
|
||||||
if (fitsOnOnePage(pageSize, finSize.getWidth(), finSize.getHeight())) {
|
if (fitsOnOnePage(pageSize, finSize.getWidth(), finSize.getHeight())) {
|
||||||
printOnOnePage(pfs);
|
pageFitPrint.addComponent(pfs);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
BufferedImage image = (BufferedImage) pfs.createImage();
|
BufferedImage image = (BufferedImage) pfs.createImage();
|
||||||
ITextHelper.renderImageAcrossPages(new Rectangle(pageSize.getWidth(), pageSize.getHeight()),
|
ITextHelper.renderImageAcrossPages(new Rectangle(pageSize.getWidth(), pageSize.getHeight()),
|
||||||
document, writer, image);
|
document, writer, image);
|
||||||
|
document.newPage();
|
||||||
}
|
}
|
||||||
document.newPage();
|
|
||||||
}
|
}
|
||||||
catch (DocumentException e) {
|
catch (DocumentException e) {
|
||||||
log.error("Could not render fin.", e);
|
log.error("Could not render fin.", e);
|
||||||
@ -153,19 +162,6 @@ public class FinSetPrintStrategy {
|
|||||||
return wRatio <= 1.0d && hRatio <= 1.0d;
|
return wRatio <= 1.0d && hRatio <= 1.0d;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Print the fin set.
|
|
||||||
*
|
|
||||||
* @param thePfs the printable fin set
|
|
||||||
*/
|
|
||||||
private void printOnOnePage (final PrintableFinSet thePfs) {
|
|
||||||
Dimension d = getPageSize();
|
|
||||||
PdfContentByte cb = writer.getDirectContent();
|
|
||||||
Graphics2D g2 = cb.createGraphics(d.width, d.height);
|
|
||||||
thePfs.print(g2);
|
|
||||||
g2.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the dimensions of the paper page.
|
* Get the dimensions of the paper page.
|
||||||
*
|
*
|
||||||
|
@ -0,0 +1,171 @@
|
|||||||
|
/*
|
||||||
|
* PageFitPrintStrategy.java
|
||||||
|
*/
|
||||||
|
package net.sf.openrocket.gui.print.visitor;
|
||||||
|
|
||||||
|
import com.itextpdf.text.Document;
|
||||||
|
import com.itextpdf.text.pdf.PdfContentByte;
|
||||||
|
import com.itextpdf.text.pdf.PdfWriter;
|
||||||
|
import net.sf.openrocket.gui.print.PrintUnit;
|
||||||
|
import net.sf.openrocket.gui.print.PrintableComponent;
|
||||||
|
import net.sf.openrocket.logging.LogHelper;
|
||||||
|
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||||
|
import net.sf.openrocket.startup.Application;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.ListIterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A strategy for drawing multiple rocket components onto as few pages as possible.
|
||||||
|
*
|
||||||
|
* @author Jason Blood <dyster2000@gmail.com>
|
||||||
|
*/
|
||||||
|
public class PageFitPrintStrategy {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The logger.
|
||||||
|
*/
|
||||||
|
private static final LogHelper log = Application.getLogger();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The iText document.
|
||||||
|
*/
|
||||||
|
protected Document document;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The direct iText writer.
|
||||||
|
*/
|
||||||
|
protected PdfWriter writer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The stages selected.
|
||||||
|
*/
|
||||||
|
protected Set<Integer> stages;
|
||||||
|
|
||||||
|
protected ArrayList<PrintableComponent> componentToPrint;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param doc The iText document
|
||||||
|
* @param theWriter The direct iText writer
|
||||||
|
* @param theStages The stages to be printed by this strategy
|
||||||
|
*/
|
||||||
|
public PageFitPrintStrategy(Document doc, PdfWriter theWriter) {
|
||||||
|
document = doc;
|
||||||
|
writer = theWriter;
|
||||||
|
componentToPrint = new ArrayList<PrintableComponent>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a component we want to print.
|
||||||
|
*
|
||||||
|
* @param component The component to add for printing
|
||||||
|
*/
|
||||||
|
public void addComponent(PrintableComponent component) {
|
||||||
|
componentToPrint.add(component);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recurse through the given rocket component.
|
||||||
|
*
|
||||||
|
* @param root the root component; all children will be printed recursively
|
||||||
|
*/
|
||||||
|
public void writeToDocument (final RocketComponent root) {
|
||||||
|
fitPrintComponents();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterate through the components to print fitting them onto pages as best possible.
|
||||||
|
*/
|
||||||
|
private void fitPrintComponents() {
|
||||||
|
final Dimension pageSize = getPageSize();
|
||||||
|
double wPage = pageSize.getWidth();
|
||||||
|
double hPage = pageSize.getHeight();
|
||||||
|
int marginX = (int)(PrintUnit.POINTS_PER_INCH * 0.3f);
|
||||||
|
int marginY = (int)(PrintUnit.POINTS_PER_INCH * 0.3f);
|
||||||
|
PdfContentByte cb = writer.getDirectContent();
|
||||||
|
|
||||||
|
while (componentToPrint.size() > 0) {
|
||||||
|
int pageY = 0;
|
||||||
|
Boolean anyAddedToRow;
|
||||||
|
|
||||||
|
Graphics2D g2 = cb.createGraphics(pageSize.width, pageSize.height);
|
||||||
|
|
||||||
|
do {
|
||||||
|
// Fill the row
|
||||||
|
int rowX = 0;
|
||||||
|
int rowY = pageY;
|
||||||
|
ListIterator<PrintableComponent> entry = componentToPrint.listIterator();
|
||||||
|
anyAddedToRow = false;
|
||||||
|
|
||||||
|
while (entry.hasNext()) {
|
||||||
|
PrintableComponent component = entry.next();
|
||||||
|
java.awt.Dimension dim = component.getSize();
|
||||||
|
if ((rowX + dim.width < wPage) && (rowY + dim.height < hPage)) {
|
||||||
|
component.setPrintOffset(rowX, rowY);
|
||||||
|
rowX += dim.width + marginX;
|
||||||
|
if (rowY + dim.height + marginY > pageY)
|
||||||
|
pageY = rowY + dim.height + marginY;
|
||||||
|
entry.remove();
|
||||||
|
component.print(g2);
|
||||||
|
anyAddedToRow = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (anyAddedToRow);
|
||||||
|
|
||||||
|
g2.dispose();
|
||||||
|
document.newPage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the dimensions of the paper page.
|
||||||
|
*
|
||||||
|
* @return an internal Dimension
|
||||||
|
*/
|
||||||
|
protected Dimension getPageSize () {
|
||||||
|
return new Dimension(document.getPageSize().getWidth(),
|
||||||
|
document.getPageSize().getHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convenience class to model a dimension.
|
||||||
|
*/
|
||||||
|
class Dimension {
|
||||||
|
/** Width, in points. */
|
||||||
|
public float width;
|
||||||
|
/** Height, in points. */
|
||||||
|
public float height;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* @param w width
|
||||||
|
* @param h height
|
||||||
|
*/
|
||||||
|
public Dimension (float w, float h) {
|
||||||
|
width = w;
|
||||||
|
height = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the width.
|
||||||
|
*
|
||||||
|
* @return the width
|
||||||
|
*/
|
||||||
|
public float getWidth () {
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the height.
|
||||||
|
*
|
||||||
|
* @return the height
|
||||||
|
*/
|
||||||
|
public float getHeight () {
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -45,6 +45,11 @@ public class TransitionStrategy {
|
|||||||
*/
|
*/
|
||||||
protected Set<Integer> stages;
|
protected Set<Integer> stages;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Strategy for fitting multiple components onto a page.
|
||||||
|
*/
|
||||||
|
protected PageFitPrintStrategy pageFitPrint;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
@ -52,10 +57,11 @@ public class TransitionStrategy {
|
|||||||
* @param theWriter The direct iText writer
|
* @param theWriter The direct iText writer
|
||||||
* @param theStagesToVisit The stages to be visited by this strategy
|
* @param theStagesToVisit The stages to be visited by this strategy
|
||||||
*/
|
*/
|
||||||
public TransitionStrategy(Document doc, PdfWriter theWriter, Set<Integer> theStagesToVisit) {
|
public TransitionStrategy(Document doc, PdfWriter theWriter, Set<Integer> theStagesToVisit, PageFitPrintStrategy pageFit) {
|
||||||
document = doc;
|
document = doc;
|
||||||
writer = theWriter;
|
writer = theWriter;
|
||||||
stages = theStagesToVisit;
|
stages = theStagesToVisit;
|
||||||
|
pageFitPrint = pageFit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -107,7 +113,8 @@ public class TransitionStrategy {
|
|||||||
java.awt.Dimension size = pfs.getSize();
|
java.awt.Dimension size = pfs.getSize();
|
||||||
final Dimension pageSize = getPageSize();
|
final Dimension pageSize = getPageSize();
|
||||||
if (fitsOnOnePage(pageSize, size.getWidth(), size.getHeight())) {
|
if (fitsOnOnePage(pageSize, size.getWidth(), size.getHeight())) {
|
||||||
printOnOnePage(pfs);
|
pageFitPrint.addComponent(pfs);
|
||||||
|
//printOnOnePage(pfs);
|
||||||
} else {
|
} else {
|
||||||
BufferedImage image = (BufferedImage) pfs.createImage();
|
BufferedImage image = (BufferedImage) pfs.createImage();
|
||||||
ITextHelper.renderImageAcrossPages(new Rectangle(pageSize.getWidth(), pageSize.getHeight()),
|
ITextHelper.renderImageAcrossPages(new Rectangle(pageSize.getWidth(), pageSize.getHeight()),
|
||||||
@ -141,14 +148,14 @@ public class TransitionStrategy {
|
|||||||
*
|
*
|
||||||
* @param theTransition the printable transition
|
* @param theTransition the printable transition
|
||||||
*/
|
*/
|
||||||
private void printOnOnePage(final AbstractPrintableTransition theTransition) {
|
/*private void printOnOnePage(final AbstractPrintableTransition theTransition) {
|
||||||
Dimension d = getPageSize();
|
Dimension d = getPageSize();
|
||||||
PdfContentByte cb = writer.getDirectContent();
|
PdfContentByte cb = writer.getDirectContent();
|
||||||
Graphics2D g2 = cb.createGraphics(d.width, d.height);
|
Graphics2D g2 = cb.createGraphics(d.width, d.height);
|
||||||
theTransition.print(g2);
|
theTransition.print(g2);
|
||||||
g2.dispose();
|
g2.dispose();
|
||||||
document.newPage();
|
document.newPage();
|
||||||
}
|
}*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the dimensions of the paper page.
|
* Get the dimensions of the paper page.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user