source: branches/plotter2/src/Plotter2.cpp @ 2825

Last change on this file since 2825 was 2825, checked in by WataruKawasaki, 11 years ago

New Development: Yes

JIRA Issue: Yes (CAS-3620)

Ready for Test: Yes

Interface Changes: No

What Interface Changed:

Test Programs:

Put in Release Notes: Yes

Module(s): sd

Description: add a new sd module sd.plotter2, a new lightweight plotter based on pgplot.


File size: 28.4 KB
Line 
1#include "Plotter2.h"
2
3namespace asap {
4
5Plotter2RectInfo::Plotter2RectInfo() {
6    xmin = 0.0;
7    xmax = 1.0;
8    ymin = 0.0;
9    ymax = 1.0;
10    color = 15; // gray
11    fill  = 4;  // hatch
12    width = 1;
13}
14
15Plotter2RectInfo::~Plotter2RectInfo() {
16}
17
18Plotter2DataInfo::Plotter2DataInfo() {
19    xData.clear();
20    yData.clear();
21
22    drawLine  = true;
23    lineStyle = 1;       // solid line
24    lineWidth = 1;
25    lineColor = -1;      // undefined (default color should be assigned)
26
27    drawMarker  = false;
28    markerType  = 20;    // small circle
29    markerSize  = 1.0;
30    markerColor = 1;     // default foreground color (black)
31
32    hasData = false;     // has no data
33}
34
35Plotter2DataInfo::~Plotter2DataInfo() {
36}
37
38Plotter2ViewportInfo::Plotter2ViewportInfo() {
39    showViewport = true;
40
41    vpPosXMin = 0.1;
42    vpPosXMax = 0.9;
43    vpPosYMin = 0.1;
44    vpPosYMax = 0.9;
45
46    vpRangeXMin = 0.0;
47    vpRangeXMax = 1.0;
48    vpRangeYMin = 0.0;
49    vpRangeYMax = 1.0;
50    isAutoRangeX = true;
51    isAutoRangeY = true;
52    autoRangeMarginX = 0.0;
53    autoRangeMarginY = 0.1;
54
55    hasDataRange = false;
56
57    nMajorTickWithinTickNumsX = 2;
58    nMajorTickWithinTickNumsY = 2;
59    isAutoTickIntervalX = true;
60    isAutoTickIntervalY = true;
61
62    numLocationX = "l";
63    numLocationY = "b";
64
65    fontSizeDef = 1.0;
66
67    vpBColor = -1;
68
69    vData.clear();
70}
71
72Plotter2ViewportInfo::~Plotter2ViewportInfo() {
73    vData.clear();
74}
75
76void Plotter2ViewportInfo::adjustRange() {
77    if (hasDataRange) {
78        if (isAutoRangeX) {
79            adjustRangeX(&vpRangeXMin, &vpRangeXMax);
80        }
81        if (isAutoRangeY) {
82            adjustRangeY(&vpRangeYMin, &vpRangeYMax);
83        }
84    }
85}
86
87void Plotter2ViewportInfo::adjustRangeX(float* xmin, float* xmax) {
88    float xmargin = (maxXData - minXData) * autoRangeMarginX;
89    *xmin = minXData - xmargin;
90    *xmax = maxXData + xmargin;
91}
92
93void Plotter2ViewportInfo::adjustRangeY(float* ymin, float* ymax) {
94    float ymargin = (maxYData - minYData) * autoRangeMarginY;
95    *ymin = minYData - ymargin;
96    *ymax = maxYData + ymargin;
97}
98
99std::vector<float> Plotter2ViewportInfo::getRangeX() {
100    float minX, maxX;
101
102    if (isAutoRangeX) {
103        adjustRangeX(&minX, &maxX);
104    } else {
105        minX = vpRangeXMin;
106        maxX = vpRangeXMax;
107    }
108
109    std::vector<float> res;
110    res.clear();
111    res.push_back(minX);
112    res.push_back(maxX);
113
114    return res;
115}
116
117std::vector<float> Plotter2ViewportInfo::getRangeY() {
118    float minY, maxY;
119
120    if (isAutoRangeY) {
121        adjustRangeY(&minY, &maxY);
122    } else {
123        minY = vpRangeYMin;
124        maxY = vpRangeYMax;
125    }
126
127    std::vector<float> res;
128    res.clear();
129    res.push_back(minY);
130    res.push_back(maxY);
131
132    return res;
133}
134
135void Plotter2ViewportInfo::adjustTickInterval() {
136    if (hasDataRange) {
137        if (isAutoTickIntervalX) {
138            adjustTickIntervalX();
139        }
140        if (isAutoTickIntervalY) {
141            adjustTickIntervalY();
142        }
143    }
144}
145
146void Plotter2ViewportInfo::adjustTickIntervalX() {
147    adjustTickIntervalX(vpRangeXMin, vpRangeXMax);
148}
149
150void Plotter2ViewportInfo::adjustTickIntervalX(const float xmin, const float xmax) {
151    majorTickIntervalX = (float)pow(10.0, ceil(log10((xmax - xmin)/10.0)));
152    if ((xmax - xmin) / majorTickIntervalX < 2.0) {
153        majorTickIntervalX /= 10.0;
154    }
155    nMinorTickWithinMajorTicksX = 5;
156}
157
158void Plotter2ViewportInfo::adjustTickIntervalY() {
159    adjustTickIntervalY(vpRangeYMin, vpRangeYMax);
160}
161
162void Plotter2ViewportInfo::adjustTickIntervalY(const float ymin, const float ymax) {
163    majorTickIntervalY = (float)pow(10.0, ceil(log10((ymax - ymin)/10.0)));
164    if ((ymax - ymin) / majorTickIntervalY < 2.0) {
165        majorTickIntervalY /= 10.0;
166    }
167    nMinorTickWithinMajorTicksY = 5;
168}
169
170void Plotter2ViewportInfo::setData(const std::vector<float>& inXData, const std::vector<float>& inYData, const int id) {
171    if (!hasDataRange) {
172        minXData = inXData[0];
173        maxXData = inXData[0];
174        minYData = inYData[0];
175        maxYData = inYData[0];
176
177        hasDataRange = true;
178    }
179
180    Plotter2DataInfo* info = &vData[id];
181
182    info->xData.clear();
183    info->xData.reserve(inXData.size());
184    for (uint i = 0; i < inXData.size(); ++i) {
185        info->xData.push_back(inXData[i]);
186
187        if (!info->hasData) {
188            updateXDataRange(inXData[i]);
189        }
190    }
191
192    info->yData.clear();
193    info->yData.reserve(inYData.size());
194    for (uint i = 0; i < inYData.size(); ++i) {
195        info->yData.push_back(inYData[i]);
196
197        if (!info->hasData) {
198            updateYDataRange(inYData[i]);
199        }
200    }
201
202    if (info->hasData) {
203        updateAllDataRanges();
204    } else {
205        info->hasData = true;
206    }
207}
208
209void Plotter2ViewportInfo::updateXDataRange(const float data) {
210    if (data < minXData) {
211        minXData = data;
212    }
213    if (maxXData < data) {
214        maxXData = data;
215    }
216}
217
218void Plotter2ViewportInfo::updateYDataRange(const float data) {
219    if (data < minYData) {
220        minYData = data;
221    }
222    if (maxYData < data) {
223        maxYData = data;
224    }
225}
226
227void Plotter2ViewportInfo::updateAllDataRanges() {
228    minXData = vData[0].xData[0];
229    maxXData = minXData;
230    minYData = vData[0].yData[0];
231    maxYData = minYData;
232
233    for (uint i = 0; i < vData.size(); ++i) {
234        for (uint j = 0; j < vData[i].xData.size(); ++j) {
235            updateXDataRange(vData[i].xData[j]);
236            updateYDataRange(vData[i].yData[j]);
237        }
238    }
239}
240
241void Plotter2ViewportInfo::getWorldCoordByWindowCoord(const float winX, const float winY, float* worldX, float* worldY) {
242    float xratio = (winX - vpPosXMin) / (vpPosXMax - vpPosXMin);
243    if (winX < 0.0) {
244        xratio = 0.5;
245    }
246    *worldX = vpRangeXMin + xratio * (vpRangeXMax - vpRangeXMin);
247    float yratio = (winY - vpPosYMin) / (vpPosYMax - vpPosYMin);
248    if (winY < 0.0) {
249        yratio = 0.5;
250    }
251    *worldY = vpRangeYMin + yratio * (vpRangeYMax - vpRangeYMin);
252}
253
254Plotter2::Plotter2() {
255    filename = "";
256    device = "xwindow";
257    hasDevice = false;
258
259    vInfo.clear();
260    Plotter2ViewportInfo vi;
261    vInfo.push_back(vi);
262
263    hasDefaultViewport = true;
264    currentViewportId = 0;
265}
266
267Plotter2::~Plotter2() {
268    close();
269    vInfo.clear();
270}
271
272void Plotter2::setFileName(const std::string& inFilename) {
273    filename = inFilename;
274}
275
276void Plotter2::setDevice(const std::string& inDevice) {
277    device = inDevice;
278}
279
280void Plotter2::open() {
281    cpgopen((filename + "/" + device).c_str());
282    hasDevice = true;
283}
284
285int Plotter2::addViewport(const float xmin, const float xmax, const float ymin, const float ymax) {
286    Plotter2ViewportInfo vi;
287
288    vi.vpPosXMin = xmin;
289    vi.vpPosXMax = xmax;
290    vi.vpPosYMin = ymin;
291    vi.vpPosYMax = ymax;
292
293    vInfo.push_back(vi);
294    currentViewportId = vInfo.size() - 1;
295
296    return currentViewportId;
297}
298
299void Plotter2::setViewport(const float xmin, const float xmax, const float ymin, const float ymax, const int id) {
300    Plotter2ViewportInfo* vi = &vInfo[id];
301
302    vi->vpPosXMin = xmin;
303    vi->vpPosXMax = xmax;
304    vi->vpPosYMin = ymin;
305    vi->vpPosYMax = ymax;
306
307    hasDefaultViewport = false;
308}
309
310void Plotter2::showViewport(const int inVpid) {
311    int vpid = inVpid;
312    if (vpid < 0) {
313        vpid = vInfo.size() - 1;
314    }
315    if (vpid < 0) {
316        exit(0);
317    }
318
319    Plotter2ViewportInfo* vi = &vInfo[vpid];
320    vi->showViewport = true;
321}
322
323void Plotter2::hideViewport(const int inVpid) {
324    int vpid = inVpid;
325    if (vpid < 0) {
326        vpid = vInfo.size() - 1;
327    }
328    if (vpid < 0) {
329        exit(0);
330    }
331
332    Plotter2ViewportInfo* vi = &vInfo[vpid];
333    vi->showViewport = false;
334}
335
336bool Plotter2::getHasDefaultViewport() {
337    return hasDefaultViewport;
338}
339
340int Plotter2::getCurrentViewportId() {
341  return currentViewportId;
342}
343
344void Plotter2::getViewInfo() {
345    std::cout << "===================" << std::endl << std::flush;
346    for (uint i = 0; i < vInfo.size(); ++i) {
347        std::cout << "[" << i << "]  " << std::endl;
348        std::cout << "vpPos:  ";
349        std::cout << "xmin=" << vInfo[i].vpPosXMin << ", ";
350        std::cout << "xmax=" << vInfo[i].vpPosXMax << ", ";
351        std::cout << "ymin=" << vInfo[i].vpPosYMin << ", ";
352        std::cout << "ymax=" << vInfo[i].vpPosYMax << std::endl;
353
354        std::cout << "vpRange:  ";
355        std::cout << "xmin=" << vInfo[i].vpRangeXMin << ", ";
356        std::cout << "xmax=" << vInfo[i].vpRangeXMax << ", ";
357        std::cout << "ymin=" << vInfo[i].vpRangeYMin << ", ";
358        std::cout << "ymax=" << vInfo[i].vpRangeYMax << std::endl;;
359
360        std::cout << "vdatasize=" << vInfo[i].vData.size() << std::endl;
361        for (uint j = 0; j < vInfo[i].vData.size(); ++j) {
362            std::cout << "vdataxdatasize=" << vInfo[i].vData[j].xData.size() << ", ";
363            for (uint k = 0; k < vInfo[i].vData[j].xData.size(); ++k) {
364                std::cout << "(" << vInfo[i].vData[j].xData[k] << ", ";
365                std::cout << vInfo[i].vData[j].yData[k] << ") ";
366            }
367            std::cout << std::endl;
368        }
369        std::cout << "===================" << std::endl << std::flush;
370    }
371}
372
373void Plotter2::setRange(const float xmin, const float xmax, const float ymin, const float ymax, const int inVpid) {
374    setRangeX(xmin, xmax, inVpid);
375    setRangeY(ymin, ymax, inVpid);
376}
377
378void Plotter2::setRangeX(const float xmin, const float xmax, const int inVpid) {
379    int vpid = inVpid;
380    if (vpid < 0) {
381        vpid = vInfo.size() - 1;
382    }
383    if (vpid < 0) {
384        Plotter2ViewportInfo vi;
385        vInfo.push_back(vi);
386        vpid = 0;
387    }
388
389    Plotter2ViewportInfo* vi = &vInfo[vpid];
390    vi->vpRangeXMin = xmin;
391    vi->vpRangeXMax = xmax;
392    vi->isAutoRangeX = false;
393}
394
395void Plotter2::setRangeY(const float ymin, const float ymax, const int inVpid) {
396    int vpid = inVpid;
397    if (vpid < 0) {
398        vpid = vInfo.size() - 1;
399    }
400    if (vpid < 0) {
401        Plotter2ViewportInfo vi;
402        vInfo.push_back(vi);
403        vpid = 0;
404    }
405
406    Plotter2ViewportInfo* vi = &vInfo[vpid];
407    vi->vpRangeYMin = ymin;
408    vi->vpRangeYMax = ymax;
409    vi->isAutoRangeY = false;
410}
411
412std::vector<float> Plotter2::getRangeX(const int inVpid) {
413    int vpid = inVpid;
414    if (vpid < 0) {
415        vpid = vInfo.size() - 1;
416    }
417    if (vpid < 0) {
418        exit(0);
419    }
420
421    return vInfo[vpid].getRangeX();
422}
423
424std::vector<float> Plotter2::getRangeY(const int inVpid) {
425    int vpid = inVpid;
426    if (vpid < 0) {
427        vpid = vInfo.size() - 1;
428    }
429    if (vpid < 0) {
430        exit(0);
431    }
432
433    return vInfo[vpid].getRangeY();
434}
435
436void Plotter2::setAutoRange(const int inVpid) {
437    setAutoRangeX(inVpid);
438    setAutoRangeY(inVpid);
439}
440
441void Plotter2::setAutoRangeX(const int inVpid) {
442    int vpid = inVpid;
443    if (vpid < 0) {
444        vpid = vInfo.size() - 1;
445    }
446    if (vpid < 0) {
447        Plotter2ViewportInfo vi;
448        vInfo.push_back(vi);
449        vpid = 0;
450    }
451
452    Plotter2ViewportInfo* vi = &vInfo[vpid];
453    vi->isAutoRangeX = true;
454}
455
456void Plotter2::setAutoRangeY(const int inVpid) {
457    int vpid = inVpid;
458    if (vpid < 0) {
459        vpid = vInfo.size() - 1;
460    }
461    if (vpid < 0) {
462        Plotter2ViewportInfo vi;
463        vInfo.push_back(vi);
464        vpid = 0;
465    }
466
467    Plotter2ViewportInfo* vi = &vInfo[vpid];
468    vi->isAutoRangeY = true;
469}
470
471void Plotter2::setFontSizeDef(const float size, const int inVpid) {
472    int vpid = inVpid;
473    if (vpid < 0) {
474        vpid = vInfo.size() - 1;
475    }
476    if (vpid < 0) {
477        Plotter2ViewportInfo vi;
478        vInfo.push_back(vi);
479        vpid = 0;
480    }
481
482    Plotter2ViewportInfo* vi = &vInfo[vpid];
483    vi->fontSizeDef = size;
484}
485
486void Plotter2::setTicksX(const float interval, const int num, const int inVpid) {
487    int vpid = inVpid;
488    if (vpid < 0) {
489        vpid = vInfo.size() - 1;
490    }
491    if (vpid < 0) {
492        Plotter2ViewportInfo vi;
493        vInfo.push_back(vi);
494        vpid = 0;
495    }
496
497    Plotter2ViewportInfo* vi = &vInfo[vpid];
498    vi->majorTickIntervalX = interval;
499    vi->nMinorTickWithinMajorTicksX = num;
500    vi->isAutoTickIntervalX = false;
501}
502
503void Plotter2::setTicksY(const float interval, const int num, const int inVpid) {
504    int vpid = inVpid;
505    if (vpid < 0) {
506        vpid = vInfo.size() - 1;
507    }
508    if (vpid < 0) {
509        Plotter2ViewportInfo vi;
510        vInfo.push_back(vi);
511        vpid = 0;
512    }
513
514    Plotter2ViewportInfo* vi = &vInfo[vpid];
515    vi->majorTickIntervalY = interval;
516    vi->nMinorTickWithinMajorTicksY = num;
517    vi->isAutoTickIntervalY = false;
518}
519
520void Plotter2::setAutoTicks(const int inVpid) {
521    setAutoTicksX(inVpid);
522    setAutoTicksY(inVpid);
523}
524
525void Plotter2::setAutoTicksX(const int inVpid) {
526    int vpid = inVpid;
527    if (vpid < 0) {
528        vpid = vInfo.size() - 1;
529    }
530    if (vpid < 0) {
531        Plotter2ViewportInfo vi;
532        vInfo.push_back(vi);
533        vpid = 0;
534    }
535
536    Plotter2ViewportInfo* vi = &vInfo[vpid];
537    vi->isAutoTickIntervalX = true;
538}
539
540void Plotter2::setAutoTicksY(const int inVpid) {
541    int vpid = inVpid;
542    if (vpid < 0) {
543        vpid = vInfo.size() - 1;
544    }
545    if (vpid < 0) {
546        Plotter2ViewportInfo vi;
547        vInfo.push_back(vi);
548        vpid = 0;
549    }
550
551    Plotter2ViewportInfo* vi = &vInfo[vpid];
552    vi->isAutoTickIntervalY = true;
553}
554
555void Plotter2::setNumIntervalX(const float interval, const int inVpid) {
556    int vpid = inVpid;
557    if (vpid < 0) {
558        vpid = vInfo.size() - 1;
559    }
560    if (vpid < 0) {
561        Plotter2ViewportInfo vi;
562        vInfo.push_back(vi);
563        vpid = 0;
564    }
565
566    Plotter2ViewportInfo* vi = &vInfo[vpid];
567    vi->nMajorTickWithinTickNumsX = (int)(interval / vi->majorTickIntervalX);
568}
569
570void Plotter2::setNumIntervalY(const float interval, const int inVpid) {
571    int vpid = inVpid;
572    if (vpid < 0) {
573        vpid = vInfo.size() - 1;
574    }
575    if (vpid < 0) {
576        Plotter2ViewportInfo vi;
577        vInfo.push_back(vi);
578        vpid = 0;
579    }
580
581    Plotter2ViewportInfo* vi = &vInfo[vpid];
582    vi->nMajorTickWithinTickNumsY = (int)(interval / vi->majorTickIntervalY);
583}
584
585void Plotter2::setNumLocationX(const std::string& side, const int inVpid) {
586    int vpid = inVpid;
587    if (vpid < 0) {
588        vpid = vInfo.size() - 1;
589    }
590    if (vpid < 0) {
591        Plotter2ViewportInfo vi;
592        vInfo.push_back(vi);
593        vpid = 0;
594    }
595
596    Plotter2ViewportInfo* vi = &vInfo[vpid];
597    vi->numLocationX = side;
598}
599
600void Plotter2::setNumLocationY(const std::string& side, const int inVpid) {
601    int vpid = inVpid;
602    if (vpid < 0) {
603        vpid = vInfo.size() - 1;
604    }
605    if (vpid < 0) {
606        Plotter2ViewportInfo vi;
607        vInfo.push_back(vi);
608        vpid = 0;
609    }
610
611    Plotter2ViewportInfo* vi = &vInfo[vpid];
612    vi->numLocationY = side;
613}
614
615void Plotter2::setData(const std::vector<float>& xdata, const std::vector<float>& ydata, const int inVpid, const int inDataid) {
616    int vpid = inVpid;
617    if (vpid < 0) {
618        vpid = vInfo.size() - 1;
619    }
620    if (vpid < 0) {
621        Plotter2ViewportInfo vi;
622        vInfo.push_back(vi);
623        vpid = 0;
624    }
625
626    Plotter2ViewportInfo* vi = &vInfo[vpid];
627
628    int dataid = inDataid;
629    if (dataid < 0) {
630        Plotter2DataInfo di;
631        vi->vData.push_back(di);
632        dataid = vi->vData.size() - 1;
633    }
634
635    vi->setData(xdata, ydata, dataid);
636}
637
638void Plotter2::setLine(const int color, const int width, const int style, const int inVpid, const int inDataid) {
639    int vpid = inVpid;
640    if (vpid < 0) {
641        vpid = vInfo.size() - 1;
642    }
643    if (vpid < 0) {
644        Plotter2ViewportInfo vi;
645        vInfo.push_back(vi);
646        vpid = 0;
647    }
648
649    int dataid = inDataid;
650    if (dataid < 0) {
651        dataid = vInfo[vpid].vData.size() - 1;
652    }
653
654    Plotter2ViewportInfo* vi = &vInfo[vpid];
655    vi->vData[dataid].drawLine  = true;
656    vi->vData[dataid].lineColor = color;
657    vi->vData[dataid].lineWidth = width;
658    vi->vData[dataid].lineStyle = style;
659}
660
661void Plotter2::showLine(const int inVpid, const int inDataid) {
662    int vpid = inVpid;
663    if (vpid < 0) {
664        vpid = vInfo.size() - 1;
665    }
666    if (vpid < 0) {
667        exit(0);
668    }
669
670    int dataid = inDataid;
671    if (dataid < 0) {
672        dataid = vInfo[vpid].vData.size() - 1;
673    }
674    if (dataid < 0) {
675        exit(0);
676    }
677
678    Plotter2ViewportInfo* vi = &vInfo[vpid];
679    vi->vData[dataid].drawLine  = true;
680}
681
682void Plotter2::hideLine(const int inVpid, const int inDataid) {
683    int vpid = inVpid;
684    if (vpid < 0) {
685        vpid = vInfo.size() - 1;
686    }
687    if (vpid < 0) {
688        exit(0);
689    }
690
691    int dataid = inDataid;
692    if (dataid < 0) {
693        dataid = vInfo[vpid].vData.size() - 1;
694    }
695    if (dataid < 0) {
696        exit(0);
697    }
698
699    Plotter2ViewportInfo* vi = &vInfo[vpid];
700    vi->vData[dataid].drawLine  = false;
701}
702
703void Plotter2::setPoint(const int type, const float size, const int color, const int inVpid, const int inDataid) {
704    int vpid = inVpid;
705    if (vpid < 0) {
706        vpid = vInfo.size() - 1;
707    }
708    if (vpid < 0) {
709        Plotter2ViewportInfo vi;
710        vInfo.push_back(vi);
711        vpid = 0;
712    }
713
714    int dataid = inDataid;
715    if (dataid < 0) {
716        dataid = vInfo[vpid].vData.size() - 1;
717    }
718
719    Plotter2ViewportInfo* vi = &vInfo[vpid];
720    vi->vData[dataid].drawMarker  = true;
721    vi->vData[dataid].markerType  = type;
722    vi->vData[dataid].markerSize  = size;
723    vi->vData[dataid].markerColor = color;
724}
725
726void Plotter2::showPoint(const int inVpid, const int inDataid) {
727    int vpid = inVpid;
728    if (vpid < 0) {
729        vpid = vInfo.size() - 1;
730    }
731    if (vpid < 0) {
732        exit(0);
733    }
734
735    int dataid = inDataid;
736    if (dataid < 0) {
737        dataid = vInfo[vpid].vData.size() - 1;
738    }
739    if (dataid < 0) {
740        exit(0);
741    }
742
743    Plotter2ViewportInfo* vi = &vInfo[vpid];
744    vi->vData[dataid].drawMarker  = true;
745}
746
747void Plotter2::hidePoint(const int inVpid, const int inDataid) {
748    int vpid = inVpid;
749    if (vpid < 0) {
750        vpid = vInfo.size() - 1;
751    }
752    if (vpid < 0) {
753        exit(0);
754    }
755
756    int dataid = inDataid;
757    if (dataid < 0) {
758        dataid = vInfo[vpid].vData.size() - 1;
759    }
760    if (dataid < 0) {
761        exit(0);
762    }
763
764    Plotter2ViewportInfo* vi = &vInfo[vpid];
765    vi->vData[dataid].drawMarker  = false;
766}
767
768void Plotter2::setMaskX(const float xmin, const float xmax, const int color, const int fill, const int width, const float hsep, const int inVpid) {
769    int vpid = inVpid;
770    if (vpid < 0) {
771        vpid = vInfo.size() - 1;
772    }
773    if (vpid < 0) {
774        Plotter2ViewportInfo vi;
775        vInfo.push_back(vi);
776        vpid = 0;
777    }
778
779    Plotter2ViewportInfo* vi = &vInfo[vpid];
780
781    Plotter2RectInfo ri;
782    ri.xmin  = xmin;
783    ri.xmax  = xmax;
784    std::vector<float> yrange = vi->getRangeY();
785    float yexcess = 0.1*(yrange[1] - yrange[0]);
786    ri.ymin  = yrange[0] - yexcess;
787    ri.ymax  = yrange[1] + yexcess;
788    ri.color = color;
789    ri.fill  = fill;
790    ri.width = width;
791    ri.hsep  = hsep;
792
793    vi->vRect.push_back(ri);
794}
795
796void Plotter2::setLabelX(const std::string& label, const float inPosx, const float inPosy, const float size, const std::string& style, const int color, const int bgcolor, const int inVpid) {
797    int vpid = inVpid;
798    if (vpid < 0) {
799        vpid = vInfo.size() - 1;
800    }
801    if (vpid < 0) {
802        Plotter2ViewportInfo vi;
803        vInfo.push_back(vi);
804        vpid = 0;
805    }
806
807    Plotter2ViewportInfo* vi = &vInfo[vpid];
808
809    std::string styleString;
810    if (style == "") {
811      styleString = "";
812    } else if (style == "roman") {
813      styleString = "\\fr";
814    } else if (style == "italic") {
815      styleString = "\\fi";
816    } else if (style == "script") {
817      styleString = "\\fs";
818    }
819    vi->labelXString = styleString + label;
820
821    float posx = inPosx;
822    if (posx < 0.0) {
823        posx = 0.5*(vi->vpPosXMin + vi->vpPosXMax);
824    }
825    vi->labelXPosX   = posx;
826
827    float posy = inPosy;
828    if (posy < 0.0) {
829        posy = 0.35*vi->vpPosYMin;
830    }
831    vi->labelXPosY   = posy;
832
833    vi->labelXAngle  = 0.0;
834    vi->labelXFJust  = 0.5;
835    vi->labelXSize   = size;
836    vi->labelXColor  = color;
837    vi->labelXBColor = bgcolor;
838}
839
840void Plotter2::setLabelY(const std::string& label, const float inPosx, const float inPosy, const float size, const std::string& style, const int color, const int bgcolor, const int inVpid) {
841    int vpid = inVpid;
842    if (vpid < 0) {
843        vpid = vInfo.size() - 1;
844    }
845    if (vpid < 0) {
846        Plotter2ViewportInfo vi;
847        vInfo.push_back(vi);
848        vpid = 0;
849    }
850
851    Plotter2ViewportInfo* vi = &vInfo[vpid];
852
853    std::string styleString;
854    if (style == "") {
855      styleString = "";
856    } else if (style == "roman") {
857      styleString = "\\fr";
858    } else if (style == "italic") {
859      styleString = "\\fi";
860    } else if (style == "script") {
861      styleString = "\\fs";
862    }
863    vi->labelYString = styleString + label;
864
865    float posx = inPosx;
866    if (posx < 0.0) {
867        posx = 0.35*vi->vpPosXMin;
868    }
869    vi->labelYPosX   = posx;
870
871    float posy = inPosy;
872    if (posy < 0.0) {
873        posy = 0.5*(vi->vpPosYMin + vi->vpPosYMax);
874    }
875    vi->labelYPosY   = posy;
876
877    vi->labelYAngle  = 90.0;
878    vi->labelYFJust  = 0.5;
879    vi->labelYSize   = size;
880    vi->labelYColor  = color;
881    vi->labelYBColor = bgcolor;
882}
883
884void Plotter2::setTitle(const std::string& label, const float inPosx, const float inPosy, const float size, const std::string& style, const int color, const int bgcolor, const int inVpid) {
885    int vpid = inVpid;
886    if (vpid < 0) {
887        vpid = vInfo.size() - 1;
888    }
889    if (vpid < 0) {
890        Plotter2ViewportInfo vi;
891        vInfo.push_back(vi);
892        vpid = 0;
893    }
894
895    Plotter2ViewportInfo* vi = &vInfo[vpid];
896
897    std::string styleString;
898    if (style == "") {
899      styleString = "";
900    } else if (style == "roman") {
901      styleString = "\\fr";
902    } else if (style == "italic") {
903      styleString = "\\fi";
904    } else if (style == "script") {
905      styleString = "\\fs";
906    }
907    vi->titleString = styleString + label;
908
909    float posx = inPosx;
910    if (posx < 0.0) {
911        posx = 0.5*(vi->vpPosXMin + vi->vpPosXMax);
912    }
913    vi->titlePosX   = posx;
914
915    float posy = inPosy;
916    if (posy < 0.0) {
917        posy = vi->vpPosYMax + 0.25*(1.0 - vi->vpPosYMax);
918    }
919    vi->titlePosY   = posy;
920
921    vi->titleAngle  = 0.0;
922    vi->titleFJust  = 0.5;
923    vi->titleSize   = size;
924    vi->titleColor  = color;
925    vi->titleBColor = bgcolor;
926}
927
928void Plotter2::setViewportBackgroundColor(const int bgcolor, const int inVpid) {
929    int vpid = inVpid;
930    if (vpid < 0) {
931        vpid = vInfo.size() - 1;
932    }
933    if (vpid < 0) {
934        exit(0);
935    }
936
937    Plotter2ViewportInfo* vi = &vInfo[vpid];
938    vi->vpBColor = bgcolor;
939}
940
941  /*
942void Plotter2::setAnnotation(const std::string& label, const float posx, const float posy, const float angle, const float fjust, const float size, const std::string& style, const int color, const int bgcolor, const int inVpid) {
943    int vpid = inVpid;
944    if (vpid < 0) {
945        vpid = vInfo.size() - 1;
946    }
947    if (vpid < 0) {
948        Plotter2ViewportInfo vi;
949        vInfo.push_back(vi);
950        vpid = 0;
951    }
952
953    std::string styleString;
954    if (style == "") {
955      styleString = "";
956    } else if (style == "roman") {
957      styleString = "\\fr";
958    } else if (style == "italic") {
959      styleString = "\\fi";
960    } else if (style == "script") {
961      styleString = "\\fs";
962    }
963
964    Plotter2ViewportInfo* vi = &vInfo[vpid];
965    //vi->titleString = styleString + label;
966    //vi->titlePosX   = posx;
967    //vi->titlePosY   = posy;
968    //vi->titleAngle  = angle;
969    //vi->titleFJust  = fjust;
970    //vi->titleSize   = size;
971    //vi->titleColor  = color;
972    //vi->titleBColor = bgcolor;
973}
974  */
975
976void Plotter2::close() {
977    if (hasDevice) {
978        cpgclos();
979        hasDevice = false;
980    }
981}
982
983void Plotter2::plot() {
984    open();
985
986    cpgscr(0, 1.0, 1.0, 1.0); // set background color white
987    cpgscr(1, 0.0, 0.0, 0.0); // set foreground color black
988
989    for (uint i = 0; i < vInfo.size(); ++i) {
990        Plotter2ViewportInfo vi = vInfo[i];
991
992        if (vi.showViewport) {
993            cpgstbg(0); // reset background colour to the initial one (white)
994            cpgsci(1);  // reset foreground colour to the initial one (black)
995            cpgsls(1);  // reset line style to solid
996            cpgslw(1);  // reset line width to 1
997            cpgscf(1);  // reset font style to normal
998            cpgsch(vi.fontSizeDef);// reset font size
999            cpgsfs(1);  // reset fill style (solid)
1000
1001            cpgsvp(vi.vpPosXMin, vi.vpPosXMax, vi.vpPosYMin, vi.vpPosYMax);
1002            vi.adjustRange();
1003            vi.adjustTickInterval();
1004
1005            cpgswin(vi.vpRangeXMin, vi.vpRangeXMax, vi.vpRangeYMin, vi.vpRangeYMax);
1006
1007            if (vi.vpBColor >= 0) {
1008                cpgsci(vi.vpBColor);
1009                cpgrect(vi.vpRangeXMin, vi.vpRangeXMax, vi.vpRangeYMin, vi.vpRangeYMax);
1010                cpgsci(1);  // reset foreground colour to the initial one (black)
1011            }
1012
1013            // data
1014            for (uint j = 0; j < vi.vData.size(); ++j) {
1015                cpgstbg(0); // reset background colour to the initial one (white)
1016                cpgsci(1);  // reset foreground colour to the initial one (black)
1017                cpgsls(1);  // reset line style to solid
1018                cpgslw(1);  // reset line width to 1
1019                cpgscf(1);  // reset font style to normal
1020                cpgsch(vi.fontSizeDef);// reset font size
1021
1022                Plotter2DataInfo di = vi.vData[j];
1023                std::vector<float> vxdata = di.xData;
1024                int ndata = vxdata.size();
1025                float* pxdata = new float[ndata];
1026                float* pydata = new float[ndata];
1027                for (int k = 0; k < ndata; ++k) {
1028                    pxdata[k] = di.xData[k];
1029                    pydata[k] = di.yData[k];
1030                }
1031
1032                if (di.drawLine) {
1033                    cpgsls(di.lineStyle);
1034                    cpgslw(di.lineWidth);
1035                    int colorIdx = di.lineColor;
1036                    if (colorIdx < 0) {
1037                        colorIdx = (j + 1) % 15 + 1;
1038                    }
1039                    cpgsci(colorIdx);
1040                    cpgline(ndata, pxdata, pydata);
1041                }
1042
1043                if (di.drawMarker) {
1044                    cpgsch(di.markerSize);
1045                    cpgsci(di.markerColor);
1046                    cpgpt(ndata, pxdata, pydata, di.markerType);
1047                }
1048
1049                delete [] pxdata;
1050                delete [] pydata;
1051            }
1052
1053            // masks
1054            for (uint j = 0; j < vi.vRect.size(); ++j) {
1055                cpgstbg(0); // reset background colour to the initial one (white)
1056                cpgsci(1);  // reset foreground colour to the initial one (black)
1057                cpgsls(1);  // reset line style to solid
1058                cpgslw(1);  // reset line width to 1
1059                cpgscf(1);  // reset font style to normal
1060                cpgsch(vi.fontSizeDef);// reset font size
1061                cpgsfs(1);  // reset fill style (solid)
1062
1063                Plotter2RectInfo ri = vi.vRect[j];
1064                cpgsci(ri.color);
1065                cpgsfs(ri.fill);
1066                cpgslw(ri.width);
1067                cpgshs(45.0, ri.hsep, 0.0);
1068                float* mxdata = new float[4];
1069                float* mydata = new float[4];
1070                mxdata[0] = ri.xmin;
1071                mxdata[1] = ri.xmax;
1072                mxdata[2] = ri.xmax;
1073                mxdata[3] = ri.xmin;
1074                mydata[0] = ri.ymin;
1075                mydata[1] = ri.ymin;
1076                mydata[2] = ri.ymax;
1077                mydata[3] = ri.ymax;
1078                cpgpoly(4, mxdata, mydata);
1079            }
1080
1081            cpgstbg(0); // reset background colour to the initial one (white)
1082            cpgsci(1);  // reset foreground colour to the initial one (black)
1083            cpgsls(1);  // reset line style to solid
1084            cpgslw(1);  // reset line width to 1
1085            cpgscf(1);  // reset font style to normal
1086            cpgsch(vi.fontSizeDef);// reset font size
1087            cpgsfs(1);  // reset fill style (solid)
1088
1089            cpgbox("BCTS",  vi.majorTickIntervalX, vi.nMinorTickWithinMajorTicksX,
1090                   "BCTSV", vi.majorTickIntervalY, vi.nMinorTickWithinMajorTicksY);
1091
1092            std::string numformatx, numformaty;
1093            if (vi.numLocationX == "l") {
1094                numformatx = "N";
1095            } else if (vi.numLocationX == "r") {
1096                numformatx = "M";
1097            } else if (vi.numLocationX == "") {
1098                numformatx = "";
1099            }
1100            if (vi.numLocationY == "b") {
1101                numformaty = "NV";
1102            } else if (vi.numLocationY == "t") {
1103                numformaty = "MV";
1104            } else if (vi.numLocationY == "") {
1105                numformaty = "";
1106            }
1107
1108            cpgbox(numformatx.c_str(), vi.majorTickIntervalX * vi.nMajorTickWithinTickNumsX, 0,
1109                   numformaty.c_str(), vi.majorTickIntervalY * vi.nMajorTickWithinTickNumsY, 0);
1110
1111            float xpos, ypos;
1112
1113            // x-label
1114            vi.getWorldCoordByWindowCoord(vi.labelXPosX, vi.labelXPosY, &xpos, &ypos);
1115            cpgsch(vi.labelXSize);
1116            cpgsci(vi.labelXColor);
1117            cpgstbg(vi.labelXBColor); //outside viewports, works ONLY with /xwindow
1118            cpgptxt(xpos, ypos, vi.labelXAngle, vi.labelXFJust, vi.labelXString.c_str());
1119
1120            // y-label
1121            vi.getWorldCoordByWindowCoord(vi.labelYPosX, vi.labelYPosY, &xpos, &ypos);
1122            cpgsch(vi.labelYSize);
1123            cpgsci(vi.labelYColor);
1124            cpgstbg(vi.labelYBColor); //outside viewports, works ONLY with /xwindow
1125            cpgptxt(xpos, ypos, vi.labelYAngle, vi.labelYFJust, vi.labelYString.c_str());
1126
1127            // title
1128            vi.getWorldCoordByWindowCoord(vi.titlePosX, vi.titlePosY, &xpos, &ypos);
1129            cpgsch(vi.titleSize);
1130            cpgsci(vi.titleColor);
1131            cpgstbg(vi.titleBColor); //outside viewports, works ONLY with /xwindow
1132            cpgptxt(xpos, ypos, vi.titleAngle, vi.titleFJust, vi.titleString.c_str());
1133        }
1134
1135    }
1136
1137    close();
1138}
1139
1140} // namespace asap
Note: See TracBrowser for help on using the repository browser.