import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfWriter;
import net.sf.openrocket.document.OpenRocketDocument;
+import net.sf.openrocket.gui.print.components.Rule;
+import net.sf.openrocket.gui.print.visitor.CenteringRingStrategy;
import net.sf.openrocket.gui.print.visitor.FinMarkingGuideStrategy;
import net.sf.openrocket.gui.print.visitor.FinSetPrintStrategy;
+import net.sf.openrocket.gui.print.visitor.PageFitPrintStrategy;
import net.sf.openrocket.gui.print.visitor.PartsDetailVisitorStrategy;
import net.sf.openrocket.gui.print.visitor.TransitionStrategy;
* file.
*/
public class PrintController {
-
- /**
- * Print the selected components to a PDF document.
- *
- * @param doc the OR document
- * @param toBePrinted the user chosen items to print
- * @param outputFile the file being written to
- * @param settings the print settings
- */
- public void print(OpenRocketDocument doc, Iterator<PrintableContext> toBePrinted, OutputStream outputFile,
- PrintSettings settings) {
-
- Document idoc = new Document(getSize(settings));
- PdfWriter writer = null;
- try {
- writer = PdfWriter.getInstance(idoc, outputFile);
- writer.setStrictImageSequence(true);
-
- writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
- writer.addViewerPreference(PdfName.PICKTRAYBYPDFSIZE, PdfBoolean.PDFTRUE);
- try {
- idoc.open();
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- }
- while (toBePrinted.hasNext()) {
- PrintableContext printableContext = toBePrinted.next();
-
- Set<Integer> stages = printableContext.getStageNumber();
-
- switch (printableContext.getPrintable()) {
- case DESIGN_REPORT:
- DesignReport dp = new DesignReport(doc, idoc);
- dp.writeToDocument(writer);
- idoc.newPage();
- break;
- case FIN_TEMPLATE:
- final FinSetPrintStrategy finWriter = new FinSetPrintStrategy(idoc,
- writer,
- stages);
- finWriter.writeToDocument(doc.getRocket());
- break;
- case PARTS_DETAIL:
- final PartsDetailVisitorStrategy detailVisitor = new PartsDetailVisitorStrategy(idoc,
- writer,
- stages);
- detailVisitor.writeToDocument(doc.getRocket());
- detailVisitor.close();
- idoc.newPage();
- break;
- case TRANSITION_TEMPLATE:
- final TransitionStrategy tranWriter = new TransitionStrategy(idoc, writer, stages);
- tranWriter.writeToDocument(doc.getRocket(), false);
- idoc.newPage();
- break;
-
- case NOSE_CONE_TEMPLATE:
- final TransitionStrategy coneWriter = new TransitionStrategy(idoc, writer, stages);
- coneWriter.writeToDocument(doc.getRocket(), true);
- idoc.newPage();
- break;
-
- case FIN_MARKING_GUIDE:
- final FinMarkingGuideStrategy fmg = new FinMarkingGuideStrategy(idoc, writer);
- fmg.writeToDocument(doc.getRocket());
- idoc.newPage();
- break;
+
+ /**
+ * Print the selected components to a PDF document.
+ *
+ * @param doc the OR document
+ * @param toBePrinted the user chosen items to print
+ * @param outputFile the file being written to
+ * @param settings the print settings
+ * @param rotation the angle the rocket figure is rotated
+ */
+ public void print(OpenRocketDocument doc, Iterator<PrintableContext> toBePrinted, OutputStream outputFile,
+ PrintSettings settings, double rotation) {
+
+ Document idoc = new Document(getSize(settings));
+ PdfWriter writer = null;
+ try {
+ writer = PdfWriter.getInstance(idoc, outputFile);
+ writer.setStrictImageSequence(true);
+
+ writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
+ writer.addViewerPreference(PdfName.PICKTRAYBYPDFSIZE, PdfBoolean.PDFTRUE);
+ try {
+ idoc.open();
+ Thread.sleep(1000);
+ }
+ catch (InterruptedException e) {
+ }
+
+ // Used to combine multiple components onto fewer sheets of paper
+ PageFitPrintStrategy pageFitPrint = new PageFitPrintStrategy(idoc, writer);
+
+ boolean addRule = false;
+
+ while (toBePrinted.hasNext()) {
+ PrintableContext printableContext = toBePrinted.next();
+
+ Set<Integer> stages = printableContext.getStageNumber();
+
+ switch (printableContext.getPrintable()) {
+ case DESIGN_REPORT:
+ DesignReport dp = new DesignReport(doc, idoc, rotation);
+ dp.writeToDocument(writer);
+ idoc.newPage();
+ break;
+
+ case FIN_TEMPLATE:
+ final FinSetPrintStrategy finWriter = new FinSetPrintStrategy(idoc, writer, stages, pageFitPrint);
+ finWriter.writeToDocument(doc.getRocket());
+ addRule = true;
+ break;
+
+ case PARTS_DETAIL:
+ final PartsDetailVisitorStrategy detailVisitor = new PartsDetailVisitorStrategy(idoc, writer, stages);
+ detailVisitor.writeToDocument(doc.getRocket());
+ detailVisitor.close();
+ idoc.newPage();
+ break;
+
+ case TRANSITION_TEMPLATE:
+ final TransitionStrategy tranWriter = new TransitionStrategy(idoc, writer, stages, pageFitPrint);
+ if (tranWriter.writeToDocument(doc.getRocket(), false)) {
+ addRule = true;
+ }
+ break;
+
+ case NOSE_CONE_TEMPLATE:
+ final TransitionStrategy coneWriter = new TransitionStrategy(idoc, writer, stages, pageFitPrint);
+ if (coneWriter.writeToDocument(doc.getRocket(), true)) {
+ addRule = true;
+ }
+ break;
+
+ case CENTERING_RING_TEMPLATE:
+ final CenteringRingStrategy crWriter = new CenteringRingStrategy(idoc, writer, stages,
+ pageFitPrint);
+ crWriter.writeToDocument(doc.getRocket());
+ addRule = true;
+ break;
+
+ case FIN_MARKING_GUIDE:
+ final FinMarkingGuideStrategy fmg = new FinMarkingGuideStrategy(idoc, writer);
+ fmg.writeToDocument(doc.getRocket());
+ idoc.newPage();
+ addRule = true;
+ break;
+ }
+ }
+
+ if (addRule) {
+ //Add a ruler to the output.
+ pageFitPrint.addComponent(new Rule(Rule.Orientation.BOTTOM));
+ }
+
+ // 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.
+ if (writer.getCurrentDocumentSize() <= 140) {
+ writer.setPageEmpty(false);
+ }
+ writer.close();
+ idoc.close();
+ }
+ catch (DocumentException e) {
+ }
+ catch (ExceptionConverter ec) {
+ }
+ finally {
+ if (outputFile != null) {
+ try {
+ outputFile.close();
+ }
+ catch (IOException e) {
}
- }
- //Stupid iText throws a really nasty exception if there is no data when close is called.
- if (writer.getCurrentDocumentSize() <= 140) {
- writer.setPageEmpty(false);
- }
- writer.close();
- idoc.close();
- } catch (DocumentException e) {
- } catch (ExceptionConverter ec) {
- } finally {
- if (outputFile != null) {
- try {
- outputFile.close();
- } catch (IOException e) {
- }
- }
- }
- }
-
- /**
- * Get the correct paper size from the print settings.
- *
- * @param settings the print settings
- * @return the paper size
- */
- private Rectangle getSize(PrintSettings settings) {
- PaperSize size = settings.getPaperSize();
- PaperOrientation orientation = settings.getPaperOrientation();
- return orientation.orient(size.getSize());
- }
-
+ }
+ }
+ }
+
+ /**
+ * Get the correct paper size from the print settings.
+ *
+ * @param settings the print settings
+ *
+ * @return the paper size
+ */
+ private Rectangle getSize(PrintSettings settings) {
+ PaperSize size = settings.getPaperSize();
+ PaperOrientation orientation = settings.getPaperOrientation();
+ return orientation.orient(size.getSize());
+ }
+
}