001 package org.jgnuplot;
002
003 import java.io.BufferedWriter;
004 import java.io.File;
005 import java.io.FileWriter;
006 import java.io.IOException;
007 import java.util.Enumeration;
008 import java.util.List;
009 import java.util.Stack;
010 import java.util.StringTokenizer;
011 import java.util.Vector;
012
013 /**
014 * This class models the plot command.
015 *
016 * @author Pander
017 */
018 public class Plot {
019 private boolean itsPlotable;
020
021 private String itsTerminal;
022
023 private String itsOutputFileName;
024
025 private String itsTitle;
026
027 private String itsGrid;
028
029 private String itsDataFileSeparator;
030
031 private String itsKey;
032
033 private int itsParametric;
034
035 private int itsPolar;
036
037 private String itsSamples;
038
039 private String itsDummy;
040
041 private String itsClip;
042
043 private String itsAutoscale;
044
045 private String itsXLabel;
046
047 private String itsX2Label;
048
049 private String itsYLabel;
050
051 private String itsY2Label;
052
053 private String itsXTics;
054
055 private String itsX2Tics;
056
057 private String itsYTics;
058
059 private String itsY2Tics;
060
061 private String itsRanges;
062
063 private String itsXRange;
064
065 private String itsX2Range;
066
067 private String itsYRange;
068
069 private String itsY2Range;
070
071 private String itsTRange;
072
073 private String itsMXTics;
074
075 private String itsMYTics;
076
077 private String itsXData;
078
079 private String itsYData;
080
081 private String itsTimeFormat;
082
083 private String itsDataFileName;
084
085 private String itsSize;
086
087 private Stack<Graph> itsGraphs;
088
089 private List<String> itsExtra;
090
091 private String itsData;
092
093 private String itsLogscale;
094
095 private boolean itsCommandsOnOneLine;
096
097 private BufferedWriter itsOutputPlotFile;
098
099 private static String itsGnuplotExecutable;
100
101 private static String itsPlotDirectory;
102
103 private boolean itsAutoscaleAfterRanges;
104
105 /*
106 * private static int getInt(Vector theVector, int theElement) { return
107 * ((Integer)theVector.elementAt(theElement)).intValue(); }
108 */
109
110 public final void setAutoscaleAfterRanges() {
111 itsAutoscaleAfterRanges = true;
112 }
113
114 public final void setTitle(String theTitle) {
115 itsTitle = theTitle;
116 }
117
118 public final void setDataFileSeparator(String theDataFileSeparator) {
119 itsDataFileSeparator = theDataFileSeparator;
120 }
121
122 public final void setGrid(String theGrid) {
123 itsGrid = theGrid;
124 }
125
126 public final void setGrid() {
127 itsGrid = "";
128 }
129
130 public final void unsetGrid() {
131 itsGrid = null;
132 }
133
134 public final void setLogscale(String theLogscale) {
135 itsLogscale = theLogscale;
136 }
137
138 public final void setLogscale() {
139 itsLogscale = "";
140 }
141
142 public final void unsetLogscale() {
143 itsLogscale = null;
144 }
145
146 public final void setKey(String theKey) {
147 itsKey = theKey;
148 }
149
150 public final void unsetKey() {
151 itsKey = null;
152 }
153
154 public final void setParametric() {
155 itsParametric = State.ON;
156 }
157
158 public final void unsetParametric() {
159 itsParametric = State.OFF;
160 }
161
162 public final void setPolar() {
163 itsPolar = State.ON;
164 }
165
166 public final void unsetPolar() {
167 itsPolar = State.OFF;
168 }
169
170 public final void setSamples(String theSamples) {
171 itsSamples = theSamples;
172 }
173
174 public final void setDummy(String theDummy) {
175 itsDummy = theDummy;
176 }
177
178 public final void setClip(String theClip) {
179 itsClip = theClip;
180 }
181
182 public final void setClip() {
183 itsClip = "";
184 }
185
186 // comma separated
187 public final void setAutoscale(String theAutoscale) {
188 itsAutoscale = theAutoscale;
189 }
190
191 public final void setAutoscale() {
192 itsAutoscale = "";
193 }
194
195 public final void setOutput(String theTerminal, String theOutputFileName) {
196 itsTerminal = theTerminal;
197 // make path absolute for .plt file which is in temp directory
198 if (!theOutputFileName.startsWith(File.separator)
199 && theOutputFileName.charAt(1) != ':') {
200 itsOutputFileName = (new File("")).getAbsolutePath() + File.separator
201 + theOutputFileName;
202 }
203 itsOutputFileName = duplicateDoubleBackSlashes(theOutputFileName);
204 }
205
206 public final void setOutput(String theTerminal, String theOutputFileName,
207 String theSize) {
208 setOutput(theTerminal, theOutputFileName);
209 itsSize = theSize;
210 }
211
212 public Plot() {
213 clear();
214 itsExtra = new Vector<String>();
215 itsParametric = State.OFF;
216 itsPolar = State.OFF;
217 }
218
219 public final void clear() {
220 // TODO don't if all needs to be cleared or not, e.g.
221 // itsTerminal
222 itsPlotable = false;
223 itsGraphs = new Stack<Graph>();
224 itsTerminal = Terminal.NOT_SPECIFIED;
225 itsOutputFileName = null;
226 itsCommandsOnOneLine = false;
227 itsTitle = null;
228 }
229
230 public final void clearExtra() {
231 itsExtra = new Vector<String>();
232 }
233
234 public final void setCommandsOnOneLine(boolean theValue) {
235 itsCommandsOnOneLine = theValue;
236 }
237
238 public final void pushGraph(Graph theGraph) {
239 itsGraphs.push(new Graph(theGraph)); // TODO precaution for too
240 // enthousiastic Graph recycling
241 itsDataFileName = null;
242 evaluate();
243 }
244
245 public final Graph popGraph() {
246 Graph aGraph = null;
247 if (itsGraphs.size() != 0) {
248 aGraph = (Graph) itsGraphs.pop();
249 evaluate();
250 }
251 return aGraph;
252 }
253
254 private static String duplicateDoubleBackSlashes(String theString) {
255 return theString.replaceAll("\\\\", "\\\\\\\\");
256 }
257
258 public final void setDataFileName(String theDataFileName) { // TODO check when
259 // to
260 // use this
261 itsDataFileName = duplicateDoubleBackSlashes(theDataFileName);
262 itsGraphs.clear();
263 evaluate();
264 }
265
266 private void evaluate() {
267 if (itsGraphs.size() != 0 || itsDataFileName != null) {
268 itsPlotable = true;
269 }
270 else {
271 itsPlotable = false;
272 }
273 }
274
275 public final void setXLabel(String theXLabel) {
276 itsXLabel = theXLabel;
277 }
278
279 public final void setData(String theData) {
280 itsData = theData;
281 }
282
283 public final void setYLabel(String theYLabel) {
284 itsYLabel = theYLabel;
285 }
286
287 public final void setX2Label(String theX2Label) {
288 itsX2Label = theX2Label;
289 }
290
291 public final void setY2Label(String theY2Label) {
292 itsY2Label = theY2Label;
293 }
294
295 public final void setXTics(String theXTics) {
296 itsXTics = theXTics;
297 }
298
299 public final void setXTics() {
300 itsXTics = "";
301 }
302
303 public final void unsetXTics() {
304 itsXTics = null;
305 }
306
307 public final void setYTics(String theYTics) {
308 itsYTics = theYTics;
309 }
310
311 public final void setYTics() {
312 itsYTics = "";
313 }
314
315 public final void unsetYTics() {
316 itsYTics = null;
317 }
318
319 public final void setX2Tics(String theX2Tics) {
320 itsX2Tics = theX2Tics;
321 }
322
323 public final void setX2Tics() {
324 itsX2Tics = "";
325 }
326
327 public final void unsetX2Tics() {
328 itsX2Tics = null;
329 }
330
331 public final void setY2Tics(String theY2Tics) {
332 itsY2Tics = theY2Tics;
333 }
334
335 public final void setY2Tics() {
336 itsY2Tics = "";
337 }
338
339 public final void unsetY2Tics() {
340 itsY2Tics = null;
341 }
342
343 public final void setMXTics(String theMXTics) {
344 itsMXTics = theMXTics;
345 }
346
347 public final void setMYTics(String theMYTics) {
348 itsMYTics = theMYTics;
349 }
350
351 public final void setXData(String theXData) {
352 itsXData = theXData;
353 }
354
355 public final void setYData(String theYData) {
356 itsYData = theYData;
357 }
358
359 public final void setTimeFormat(String theTimeFormat) {
360 itsTimeFormat = theTimeFormat;
361 }
362
363 public static void setGnuplotExecutable(String theGnuplotExecutable) {
364 itsGnuplotExecutable = theGnuplotExecutable;
365 }
366
367 public static void setPlotDirectory(String thePlotDirectory) {
368 itsPlotDirectory = thePlotDirectory;
369 }
370
371 public final void setRanges(String theRanges) {
372 itsRanges = theRanges;
373 }
374
375 public final void setXRange(double theBegin, double theEnd) {
376 itsXRange = toRange(Double.toString(theBegin), Double.toString(theEnd));
377 }
378
379 public final void setXRange(int theBegin, int theEnd) {
380 itsXRange = toRange(Integer.toString(theBegin), Integer.toString(theEnd));
381 }
382
383 public final void setXRange(String theBegin, String theEnd) {
384 itsXRange = toRange(theBegin, theEnd);
385 }
386
387 public final void setX2Range(double theBegin, double theEnd) {
388 itsX2Range = toRange(Double.toString(theBegin), Double.toString(theEnd));
389 }
390
391 public final void setX2Range(int theBegin, int theEnd) {
392 itsX2Range = toRange(Integer.toString(theBegin), Integer.toString(theEnd));
393 }
394
395 public final void setX2Range(String theBegin, String theEnd) {
396 itsX2Range = toRange(theBegin, theEnd);
397 }
398
399 public final void setYRange(double theBegin, double theEnd) {
400 itsYRange = toRange(Double.toString(theBegin), Double.toString(theEnd));
401 }
402
403 public final void setYRange(int theBegin, int theEnd) {
404 itsYRange = toRange(Integer.toString(theBegin), Integer.toString(theEnd));
405 }
406
407 public final void setYRange(String theBegin, String theEnd) {
408 itsYRange = toRange(theBegin, theEnd);
409 }
410
411 public final void setY2Range(double theBegin, double theEnd) {
412 itsY2Range = toRange(Double.toString(theBegin), Double.toString(theEnd));
413 }
414
415 public final void setY2Range(int theBegin, int theEnd) {
416 itsY2Range = toRange(Integer.toString(theBegin), Integer.toString(theEnd));
417 }
418
419 public final void setY2Range(String theBegin, String theEnd) {
420 itsY2Range = toRange(theBegin, theEnd);
421 }
422
423 public final void setTRange(String theBegin, String theEnd) {
424 itsTRange = toRange(theBegin, theEnd);
425 }
426
427 private final String toRange(String theBegin, String theEnd) {
428 return "[" + String.valueOf(theBegin) + ":" + String.valueOf(theEnd)
429 + "]";
430 }
431
432 public final void addExtra(String theExtra) {
433 if (!theExtra.trim().startsWith("#") && theExtra.indexOf("=") != -1) {
434 String theKey = theExtra.substring(0, theExtra.indexOf("=")).trim();
435 Enumeration<String> aEnum = ((Vector) itsExtra).elements();
436 while (aEnum.hasMoreElements()) {
437 Object aExtra = aEnum.nextElement();
438 String aKey = (String) aExtra;
439 if (!aKey.trim().startsWith("#") && aKey.indexOf("=") != -1) {
440 aKey = aKey.substring(0, aKey.indexOf("=")).trim();
441 if (theKey.equals(aKey)) {
442 itsExtra.remove(aExtra);
443 break;
444 }
445 }
446 }
447 }
448 itsExtra.add(theExtra);
449 }
450
451 public final void plot() throws IOException, InterruptedException {
452 if (!itsPlotable) {
453 throw new IllegalArgumentException(
454 "Set data before calling plot method");
455 }
456 String aFileName = itsPlotDirectory + File.separator
457 + String.valueOf(System.currentTimeMillis()) + "-plt.txt";
458 /*
459 * BufferedWriter aOutputDataFile = new BufferedWriter(new
460 * FileWriter(aFileBaseName + ".dat")); Enumeration aDataEnum =
461 * itsData.elements(); while (aDataEnum.hasMoreElements()) {
462 * aOutputDataFile.write((String)aDataEnum.nextElement() + "\n"); }
463 * aOutputDataFile.close();
464 */
465 itsOutputPlotFile = new BufferedWriter(new FileWriter(aFileName));
466 if (itsTitle != null) {
467 itsOutputPlotFile.write("set title \"" + itsTitle + "\"");
468 if (itsCommandsOnOneLine) {
469 itsOutputPlotFile.write("; ");
470 }
471 else {
472 itsOutputPlotFile.write("\n");
473 }
474 }
475 if (itsDataFileSeparator != null) {
476 itsOutputPlotFile.write("set datafile separator \""
477 + itsDataFileSeparator + "\"");
478 if (itsCommandsOnOneLine) {
479 itsOutputPlotFile.write("; ");
480 }
481 else {
482 itsOutputPlotFile.write("\n");
483 }
484 }
485 if (itsGrid == null) {
486 itsOutputPlotFile.write("unset grid");
487 }
488 else {
489 itsOutputPlotFile.write("set grid");
490 if (!itsGrid.equals("")) {
491 itsOutputPlotFile.write(" " + itsGrid);
492 }
493 }
494 if (itsCommandsOnOneLine) {
495 itsOutputPlotFile.write("; ");
496 }
497 else {
498 itsOutputPlotFile.write("\n");
499 }
500 if (itsKey == null) {
501 itsOutputPlotFile.write("unset key");
502 }
503 else {
504 itsOutputPlotFile.write("set key " + itsKey);
505 }
506 if (itsCommandsOnOneLine) {
507 itsOutputPlotFile.write("; ");
508 }
509 else {
510 itsOutputPlotFile.write("\n");
511 }
512 switch (itsParametric) {
513 case State.ON:
514 itsOutputPlotFile.write("set parametric");
515 if (itsCommandsOnOneLine) {
516 itsOutputPlotFile.write("; ");
517 }
518 else {
519 itsOutputPlotFile.write("\n");
520 }
521 break;
522 case State.OFF:
523 itsOutputPlotFile.write("unset parametric");
524 if (itsCommandsOnOneLine) {
525 itsOutputPlotFile.write("; ");
526 }
527 else {
528 itsOutputPlotFile.write("\n");
529 }
530 break;
531 default:
532 throw new IllegalArgumentException("Invalid parametric state");
533 }
534 switch (itsPolar) {
535 case State.ON:
536 itsOutputPlotFile.write("set polar");
537 if (itsCommandsOnOneLine) {
538 itsOutputPlotFile.write("; ");
539 }
540 else {
541 itsOutputPlotFile.write("\n");
542 }
543 break;
544 case State.OFF:
545 itsOutputPlotFile.write("unset polar");
546 if (itsCommandsOnOneLine) {
547 itsOutputPlotFile.write("; ");
548 }
549 else {
550 itsOutputPlotFile.write("\n");
551 }
552 break;
553 default:
554 throw new IllegalArgumentException("Invalid polar state");
555 }
556 if (itsSamples != null) {
557 itsOutputPlotFile.write("set samples " + itsSamples);
558 if (itsCommandsOnOneLine) {
559 itsOutputPlotFile.write("; ");
560 }
561 else {
562 itsOutputPlotFile.write("\n");
563 }
564 }
565 if (itsDummy != null) {
566 itsOutputPlotFile.write("set dummy " + itsDummy);
567 if (itsCommandsOnOneLine) {
568 itsOutputPlotFile.write("; ");
569 }
570 else {
571 itsOutputPlotFile.write("\n");
572 }
573 }
574 if (itsClip != null) {
575 itsOutputPlotFile.write("set clip");
576 if (!itsClip.equals("")) {
577 itsOutputPlotFile.write(" " + itsClip);
578 }
579 if (itsCommandsOnOneLine) {
580 itsOutputPlotFile.write("; ");
581 }
582 else {
583 itsOutputPlotFile.write("\n");
584 }
585 }
586 if (itsXLabel != null) {
587 itsOutputPlotFile.write("set xlabel \"" + itsXLabel + "\"");
588 if (itsCommandsOnOneLine) {
589 itsOutputPlotFile.write("; ");
590 }
591 else {
592 itsOutputPlotFile.write("\n");
593 }
594 }
595 if (itsYLabel != null) {
596 itsOutputPlotFile.write("set ylabel \"" + itsYLabel + "\"");
597 if (itsCommandsOnOneLine) {
598 itsOutputPlotFile.write("; ");
599 }
600 else {
601 itsOutputPlotFile.write("\n");
602 }
603 }
604 if (itsX2Label != null) {
605 itsOutputPlotFile.write("set x2label \"" + itsX2Label + "\"");
606 if (itsCommandsOnOneLine) {
607 itsOutputPlotFile.write("; ");
608 }
609 else {
610 itsOutputPlotFile.write("\n");
611 }
612 }
613 if (itsY2Label != null) {
614 itsOutputPlotFile.write("set y2label \"" + itsY2Label + "\"");
615 if (itsCommandsOnOneLine) {
616 itsOutputPlotFile.write("; ");
617 }
618 else {
619 itsOutputPlotFile.write("\n");
620 }
621 }
622 if (itsXTics != null) {
623 itsOutputPlotFile.write("set xtics");
624 if (!itsXTics.equals("")) {
625 itsOutputPlotFile.write(" " + itsXTics);
626 }
627 if (itsCommandsOnOneLine) {
628 itsOutputPlotFile.write("; ");
629 }
630 else {
631 itsOutputPlotFile.write("\n");
632 }
633 }
634 if (itsYTics != null) {
635 itsOutputPlotFile.write("set ytics");
636 if (!itsYTics.equals("")) {
637 itsOutputPlotFile.write(" " + itsYTics);
638 }
639 if (itsCommandsOnOneLine) {
640 itsOutputPlotFile.write("; ");
641 }
642 else {
643 itsOutputPlotFile.write("\n");
644 }
645 }
646 if (itsX2Tics != null) {
647 itsOutputPlotFile.write("set x2tics");
648 if (!itsX2Tics.equals("")) {
649 itsOutputPlotFile.write(" " + itsX2Tics);
650 }
651 if (itsCommandsOnOneLine) {
652 itsOutputPlotFile.write("; ");
653 }
654 else {
655 itsOutputPlotFile.write("\n");
656 }
657 }
658 if (itsY2Tics != null) {
659 itsOutputPlotFile.write("set y2tics");
660 if (!itsY2Tics.equals("")) {
661 itsOutputPlotFile.write(" " + itsY2Tics);
662 }
663 if (itsCommandsOnOneLine) {
664 itsOutputPlotFile.write("; ");
665 }
666 else {
667 itsOutputPlotFile.write("\n");
668 }
669 }
670 else {
671 if (itsYTics == null && itsY2Label != null) {
672 // TODO should be according to all used axes
673 itsOutputPlotFile.write("set ytics nomirror");
674 if (itsCommandsOnOneLine) {
675 itsOutputPlotFile.write("; ");
676 }
677 else {
678 itsOutputPlotFile.write("\n");
679 }
680 itsOutputPlotFile.write("set y2tics nomirror");
681 if (itsCommandsOnOneLine) {
682 itsOutputPlotFile.write("; ");
683 }
684 else {
685 itsOutputPlotFile.write("\n");
686 }
687 }
688 }
689 if (itsMXTics != null) {
690 itsOutputPlotFile.write("set mxtics " + itsMXTics);
691 if (itsCommandsOnOneLine) {
692 itsOutputPlotFile.write("; ");
693 }
694 else {
695 itsOutputPlotFile.write("\n");
696 }
697 }
698 if (itsMYTics != null) {
699 itsOutputPlotFile.write("set mytics " + itsMYTics);
700 if (itsCommandsOnOneLine) {
701 itsOutputPlotFile.write("; ");
702 }
703 else {
704 itsOutputPlotFile.write("\n");
705 }
706 }
707 if (itsTimeFormat != null) {
708 itsOutputPlotFile.write("set timefmt '" + itsTimeFormat + "'");
709 if (itsCommandsOnOneLine) {
710 itsOutputPlotFile.write("; ");
711 }
712 else {
713 itsOutputPlotFile.write("\n");
714 }
715 }
716 if (itsXData != null) {
717 itsOutputPlotFile.write("set xdata " + itsXData);
718 if (itsCommandsOnOneLine) {
719 itsOutputPlotFile.write("; ");
720 }
721 else {
722 itsOutputPlotFile.write("\n");
723 }
724 }
725 if (itsYData != null) {
726 itsOutputPlotFile.write("set ydata " + itsYData);
727 if (itsCommandsOnOneLine) {
728 itsOutputPlotFile.write("; ");
729 }
730 else {
731 itsOutputPlotFile.write("\n");
732 }
733 }
734 if (itsTerminal != Terminal.NOT_SPECIFIED && itsOutputFileName != null) {
735 itsOutputPlotFile.write("set terminal " + itsTerminal);
736 if (itsSize != null) {
737 itsOutputPlotFile.write(" size " + itsSize);
738 }
739 if (itsCommandsOnOneLine) {
740 itsOutputPlotFile.write("; ");
741 }
742 else {
743 itsOutputPlotFile.write("\n");
744 }
745 itsOutputPlotFile.write("set output \"" + itsOutputFileName + "\"");
746 if (itsCommandsOnOneLine) {
747 itsOutputPlotFile.write("; ");
748
749 }
750 else {
751 itsOutputPlotFile.write("\n");
752 }
753 }
754 Enumeration<String> aEnum = ((Vector) itsExtra).elements();
755 while (aEnum.hasMoreElements()) {
756 itsOutputPlotFile.write((String) aEnum.nextElement());
757 if (itsCommandsOnOneLine) {
758 itsOutputPlotFile.write("; ");
759 }
760 else {
761 itsOutputPlotFile.write("\n");
762 }
763 }
764 if (itsLogscale == null) {
765 itsOutputPlotFile.write("unset logscale");
766 }
767 else {
768 itsOutputPlotFile.write("set logscale");
769 if (!itsLogscale.equals("")) {
770 itsOutputPlotFile.write(" " + itsLogscale);
771 }
772 }
773 if (itsCommandsOnOneLine) {
774 itsOutputPlotFile.write("; ");
775 }
776 else {
777 itsOutputPlotFile.write("\n");
778 }
779 if (!itsAutoscaleAfterRanges) {
780 if (itsAutoscale != null) {
781 itsOutputPlotFile.write("set autoscale");
782 if (!itsAutoscale.equals("")) {
783 StringTokenizer aST = new StringTokenizer(itsAutoscale, ",");
784 boolean aFirst = true;
785 while (aST.hasMoreElements()) {
786 if (aFirst) {
787 aFirst = false;
788 }
789 else {
790 itsOutputPlotFile.write(";set autoscale");
791 }
792 itsOutputPlotFile.write(" " + (String) aST.nextElement());
793 }
794 }
795 if (itsCommandsOnOneLine) {
796 itsOutputPlotFile.write("; ");
797 }
798 else {
799 itsOutputPlotFile.write("\n");
800 }
801 }
802 }
803 if (itsXRange != null) {
804 itsOutputPlotFile.write("set xrange " + itsXRange);
805 if (itsCommandsOnOneLine) {
806 itsOutputPlotFile.write("; ");
807 }
808 else {
809 itsOutputPlotFile.write("\n");
810 }
811 }
812 if (itsX2Range != null) {
813 itsOutputPlotFile.write("set x2range " + itsX2Range);
814 if (itsCommandsOnOneLine) {
815 itsOutputPlotFile.write("; ");
816 }
817 else {
818 itsOutputPlotFile.write("\n");
819 }
820 }
821 if (itsYRange != null) {
822 itsOutputPlotFile.write("set yrange " + itsYRange);
823 if (itsCommandsOnOneLine) {
824 itsOutputPlotFile.write("; ");
825
826 }
827 else {
828 itsOutputPlotFile.write("\n");
829 }
830 }
831 if (itsY2Range != null) {
832 itsOutputPlotFile.write("set y2range " + itsY2Range);
833 if (itsCommandsOnOneLine) {
834 itsOutputPlotFile.write("; ");
835 }
836 else {
837 itsOutputPlotFile.write("\n");
838 }
839 }
840 if (itsTRange != null) {
841 itsOutputPlotFile.write("set trange " + itsTRange);
842 if (itsCommandsOnOneLine) {
843 itsOutputPlotFile.write("; ");
844 }
845 else {
846 itsOutputPlotFile.write("\n");
847 }
848 }
849 if (itsAutoscaleAfterRanges) {
850 if (itsAutoscale != null) {
851 itsOutputPlotFile.write("set autoscale");
852 if (!itsAutoscale.equals("")) {
853 StringTokenizer aST = new StringTokenizer(itsAutoscale, ",");
854 boolean aFirst = true;
855 while (aST.hasMoreElements()) {
856 if (aFirst) {
857 aFirst = false;
858 }
859 else {
860 itsOutputPlotFile.write(";set autoscale");
861 }
862 itsOutputPlotFile.write(" " + (String) aST.nextElement());
863 }
864 }
865 if (itsCommandsOnOneLine) {
866 itsOutputPlotFile.write("; ");
867 }
868 else {
869 itsOutputPlotFile.write("\n");
870 }
871 }
872 }
873 itsOutputPlotFile.write("plot");
874 if (itsRanges != null) {
875 itsOutputPlotFile.write(" " + itsRanges);
876 }
877 if (itsGraphs.size() == 0) {
878 itsOutputPlotFile.write("\t\"" + itsDataFileName + "\"");
879 if (itsCommandsOnOneLine) {
880 itsOutputPlotFile.write("; ");
881 }
882 else {
883 itsOutputPlotFile.write("\n");
884 }
885 }
886 else {
887 for (int i = 0; i < itsGraphs.size(); i++) {
888 Graph aGraph = (Graph) itsGraphs.elementAt(i);
889 if (itsCommandsOnOneLine) {
890 itsOutputPlotFile.write(" ");
891 }
892 else {
893 itsOutputPlotFile.write("\t");
894 }
895 if (aGraph.isFunction()) {
896 // function
897 itsOutputPlotFile.write(aGraph.getFunction());
898 }
899 else {
900 // data file
901 itsOutputPlotFile.write("\""
902 + duplicateDoubleBackSlashes(aGraph.getDataFileName())
903 + "\"");
904 // columns to use
905 if (aGraph.getUsing() != null) {
906 itsOutputPlotFile.write(" using " + aGraph.getUsing());
907 }
908 // data modifiers
909 if (aGraph.getDataModifiers() != null) {
910 itsOutputPlotFile.write(" " + aGraph.getDataModifiers());
911 }
912 }
913 // axes to use
914 if (aGraph.getAxes() != null) {
915 itsOutputPlotFile.write(" axes " + aGraph.getAxes());
916 }
917 // title / name
918 if (aGraph.getName() != null) {
919 if (aGraph.getName().equals("")) {
920 itsOutputPlotFile.write(" notitle");
921 }
922 else {
923 itsOutputPlotFile.write(" title \"" + aGraph.getName() + "\"");
924 }
925 }
926 // style
927 if (aGraph.getStyle() != Style.NOT_SPECIFIED) {
928 itsOutputPlotFile.write(" with "
929 + Style.toString(aGraph.getStyle()));
930 if (aGraph.getLineType() != LineType.NOT_SPECIFIED) {
931 itsOutputPlotFile.write(" lt " + aGraph.getLineType());
932 }
933 if (aGraph.getPointType() != PointType.NOT_SPECIFIED
934 && (aGraph.getStyle() == Style.POINTS || aGraph.getStyle() == Style.LINESPOINTS)) {
935 itsOutputPlotFile.write(" pt " + aGraph.getPointType());
936 }
937 }
938 if (i != itsGraphs.size() - 1) {
939 itsOutputPlotFile.write(",");
940 }
941 if (!itsCommandsOnOneLine) {
942 if (i != itsGraphs.size() - 1) {
943 itsOutputPlotFile.write("\\");
944 }
945 itsOutputPlotFile.write("\n");
946 }
947 }
948 }
949 if (itsCommandsOnOneLine) {
950 itsOutputPlotFile.write("; ");
951 }
952 if (itsTerminal == Terminal.NOT_SPECIFIED && itsOutputFileName == null) {
953 itsOutputPlotFile.write("pause -1 \"Hit return to continue\"\n");
954 }
955 else {
956 itsOutputPlotFile.write("\n");
957 }
958 if (itsData != null) {
959 if (!itsCommandsOnOneLine) {
960 throw new IllegalArgumentException(
961 "Commands should be on one line when data has been set");
962 }
963 itsOutputPlotFile.write(itsData);
964 }
965 itsOutputPlotFile.close();
966 if (itsOutputFileName != null) {
967 File aFile = new File(itsOutputFileName);
968 aFile = new File(aFile.getParent());
969 if (!aFile.canWrite()) {
970 if (!aFile.mkdirs()) {
971 throw new IOException("Could not create directory "
972 + aFile.getParent());
973 }
974 }
975 }
976 Process aProcess = Runtime.getRuntime().exec(
977 itsGnuplotExecutable + " " + aFileName);
978 Thread.currentThread().sleep(1000);
979 aProcess.waitFor();
980 // TODO Remove temporary -plt.txt file and make it configurable for
981 // debug purposes via system properties. Better and preferred is to
982 // directly stream it into gnuplot.
983 }
984 }