| [2830] | 1 | #include "Plotter2.h"
 | 
|---|
 | 2 | 
 | 
|---|
 | 3 | namespace asap {
 | 
|---|
 | 4 | 
 | 
|---|
| [2896] | 5 | Plotter2AnnotationInfo::Plotter2AnnotationInfo() {
 | 
|---|
 | 6 |     text = "";
 | 
|---|
 | 7 |     posx = 0.0;
 | 
|---|
 | 8 |     posy = 0.0;
 | 
|---|
 | 9 |     angle = 0.0;
 | 
|---|
 | 10 |     fjust = 0.0;
 | 
|---|
 | 11 |     size = 1.0;
 | 
|---|
 | 12 |     color = 1;    // black
 | 
|---|
 | 13 |     bgcolor = -1; // transparent
 | 
|---|
 | 14 | }
 | 
|---|
 | 15 | 
 | 
|---|
 | 16 | Plotter2AnnotationInfo::~Plotter2AnnotationInfo() {
 | 
|---|
 | 17 | }
 | 
|---|
 | 18 | 
 | 
|---|
 | 19 | Plotter2ArrowInfo::Plotter2ArrowInfo() {
 | 
|---|
 | 20 |     xhead = 1.0;
 | 
|---|
 | 21 |     xtail = 0.0;
 | 
|---|
 | 22 |     yhead = 1.0;
 | 
|---|
 | 23 |     ytail = 0.0;
 | 
|---|
 | 24 |     color = 1;         // black
 | 
|---|
 | 25 |     width = 1;
 | 
|---|
 | 26 |     lineStyle = 1;     // solid line
 | 
|---|
 | 27 |     headSize = 1.0;
 | 
|---|
 | 28 |     headFillStyle = 1; // solid
 | 
|---|
 | 29 |     headAngle = 45.0;
 | 
|---|
 | 30 |     headVent = 0.3;
 | 
|---|
 | 31 | }
 | 
|---|
 | 32 | 
 | 
|---|
 | 33 | Plotter2ArrowInfo::~Plotter2ArrowInfo() {
 | 
|---|
 | 34 | }
 | 
|---|
 | 35 | 
 | 
|---|
| [2830] | 36 | Plotter2RectInfo::Plotter2RectInfo() {
 | 
|---|
 | 37 |     xmin = 0.0;
 | 
|---|
 | 38 |     xmax = 1.0;
 | 
|---|
 | 39 |     ymin = 0.0;
 | 
|---|
 | 40 |     ymax = 1.0;
 | 
|---|
 | 41 |     color = 15; // gray
 | 
|---|
 | 42 |     fill  = 4;  // hatch
 | 
|---|
 | 43 |     width = 1;
 | 
|---|
 | 44 | }
 | 
|---|
 | 45 | 
 | 
|---|
 | 46 | Plotter2RectInfo::~Plotter2RectInfo() {
 | 
|---|
 | 47 | }
 | 
|---|
 | 48 | 
 | 
|---|
 | 49 | Plotter2DataInfo::Plotter2DataInfo() {
 | 
|---|
 | 50 |     xData.clear();
 | 
|---|
 | 51 |     yData.clear();
 | 
|---|
 | 52 | 
 | 
|---|
 | 53 |     drawLine  = true;
 | 
|---|
 | 54 |     lineStyle = 1;       // solid line
 | 
|---|
 | 55 |     lineWidth = 1;
 | 
|---|
 | 56 |     lineColor = -1;      // undefined (default color should be assigned)
 | 
|---|
 | 57 | 
 | 
|---|
 | 58 |     drawMarker  = false;
 | 
|---|
 | 59 |     markerType  = 20;    // small circle
 | 
|---|
 | 60 |     markerSize  = 1.0;
 | 
|---|
 | 61 |     markerColor = 1;     // default foreground color (black)
 | 
|---|
 | 62 | 
 | 
|---|
 | 63 |     hasData = false;     // has no data
 | 
|---|
 | 64 | }
 | 
|---|
 | 65 | 
 | 
|---|
 | 66 | Plotter2DataInfo::~Plotter2DataInfo() {
 | 
|---|
 | 67 | }
 | 
|---|
 | 68 | 
 | 
|---|
 | 69 | Plotter2ViewportInfo::Plotter2ViewportInfo() {
 | 
|---|
 | 70 |     showViewport = true;
 | 
|---|
 | 71 | 
 | 
|---|
 | 72 |     vpPosXMin = 0.1;
 | 
|---|
 | 73 |     vpPosXMax = 0.9;
 | 
|---|
 | 74 |     vpPosYMin = 0.1;
 | 
|---|
 | 75 |     vpPosYMax = 0.9;
 | 
|---|
 | 76 | 
 | 
|---|
 | 77 |     vpRangeXMin = 0.0;
 | 
|---|
 | 78 |     vpRangeXMax = 1.0;
 | 
|---|
 | 79 |     vpRangeYMin = 0.0;
 | 
|---|
 | 80 |     vpRangeYMax = 1.0;
 | 
|---|
 | 81 |     isAutoRangeX = true;
 | 
|---|
 | 82 |     isAutoRangeY = true;
 | 
|---|
 | 83 |     autoRangeMarginX = 0.0;
 | 
|---|
 | 84 |     autoRangeMarginY = 0.1;
 | 
|---|
 | 85 | 
 | 
|---|
 | 86 |     hasDataRange = false;
 | 
|---|
 | 87 | 
 | 
|---|
| [2861] | 88 |     isAutoTickIntervalX = true;
 | 
|---|
 | 89 |     isAutoTickIntervalY = true;
 | 
|---|
 | 90 |     majorTickIntervalX = 0.1;
 | 
|---|
 | 91 |     majorTickIntervalY = 0.1;
 | 
|---|
| [2830] | 92 |     nMajorTickWithinTickNumsX = 2;
 | 
|---|
 | 93 |     nMajorTickWithinTickNumsY = 2;
 | 
|---|
| [2861] | 94 |     nMinorTickWithinMajorTicksX = 5;
 | 
|---|
 | 95 |     nMinorTickWithinMajorTicksY = 5;
 | 
|---|
| [2830] | 96 | 
 | 
|---|
| [2861] | 97 |     numLocationX = "b";
 | 
|---|
 | 98 |     numLocationY = "l";
 | 
|---|
| [2830] | 99 | 
 | 
|---|
 | 100 |     fontSizeDef = 1.0;
 | 
|---|
 | 101 | 
 | 
|---|
| [2861] | 102 |     vData.clear();
 | 
|---|
 | 103 |     vRect.clear();
 | 
|---|
| [2896] | 104 |     vArro.clear();
 | 
|---|
 | 105 |     vAnno.clear();
 | 
|---|
| [2861] | 106 | 
 | 
|---|
 | 107 |     labelXString = "";
 | 
|---|
 | 108 |     labelXPosX = 0.5;
 | 
|---|
 | 109 |     labelXPosY = 0.05;
 | 
|---|
 | 110 |     labelXAngle = 0.0;
 | 
|---|
 | 111 |     labelXFJust = 0.5;
 | 
|---|
 | 112 |     labelXSize = fontSizeDef * 1.1;
 | 
|---|
 | 113 |     labelXColor = 1;
 | 
|---|
 | 114 |     labelXBColor = 0;
 | 
|---|
 | 115 | 
 | 
|---|
 | 116 |     labelYString = "";
 | 
|---|
 | 117 |     labelYPosX = 0.05;
 | 
|---|
 | 118 |     labelYPosY = 0.5;
 | 
|---|
 | 119 |     labelYAngle = 90.0;
 | 
|---|
 | 120 |     labelYFJust = 0.5;
 | 
|---|
 | 121 |     labelYSize = fontSizeDef * 1.1;
 | 
|---|
 | 122 |     labelYColor = 1;
 | 
|---|
 | 123 |     labelYBColor = 0;
 | 
|---|
 | 124 | 
 | 
|---|
 | 125 |     titleString = "";
 | 
|---|
 | 126 |     titlePosX = 0.5;
 | 
|---|
 | 127 |     titlePosY = 0.95;
 | 
|---|
 | 128 |     titleAngle = 0.0;
 | 
|---|
 | 129 |     titleFJust = 0.5;
 | 
|---|
 | 130 |     titleSize = fontSizeDef * 1.5;
 | 
|---|
 | 131 |     titleColor = 1;
 | 
|---|
 | 132 |     titleBColor = 0;
 | 
|---|
 | 133 | 
 | 
|---|
| [2830] | 134 |     vpBColor = -1; // transparent (<0)
 | 
|---|
 | 135 | }
 | 
|---|
 | 136 | 
 | 
|---|
 | 137 | Plotter2ViewportInfo::~Plotter2ViewportInfo() {
 | 
|---|
 | 138 |     vData.clear();
 | 
|---|
| [2896] | 139 |     vRect.clear();
 | 
|---|
 | 140 |     vArro.clear();
 | 
|---|
 | 141 |     vAnno.clear();
 | 
|---|
| [2830] | 142 | }
 | 
|---|
 | 143 | 
 | 
|---|
 | 144 | void Plotter2ViewportInfo::adjustRange() {
 | 
|---|
 | 145 |     if (hasDataRange) {
 | 
|---|
 | 146 |         if (isAutoRangeX) {
 | 
|---|
 | 147 |             adjustRangeX(&vpRangeXMin, &vpRangeXMax);
 | 
|---|
 | 148 |         }
 | 
|---|
 | 149 |         if (isAutoRangeY) {
 | 
|---|
 | 150 |             adjustRangeY(&vpRangeYMin, &vpRangeYMax);
 | 
|---|
 | 151 |         }
 | 
|---|
 | 152 |     }
 | 
|---|
 | 153 | }
 | 
|---|
 | 154 | 
 | 
|---|
 | 155 | void Plotter2ViewportInfo::adjustRangeX(float* xmin, float* xmax) {
 | 
|---|
 | 156 |     float xmargin = (maxXData - minXData) * autoRangeMarginX;
 | 
|---|
 | 157 |     *xmin = minXData - xmargin;
 | 
|---|
 | 158 |     *xmax = maxXData + xmargin;
 | 
|---|
 | 159 | }
 | 
|---|
 | 160 | 
 | 
|---|
 | 161 | void Plotter2ViewportInfo::adjustRangeY(float* ymin, float* ymax) {
 | 
|---|
 | 162 |     float ymargin = (maxYData - minYData) * autoRangeMarginY;
 | 
|---|
 | 163 |     *ymin = minYData - ymargin;
 | 
|---|
 | 164 |     *ymax = maxYData + ymargin;
 | 
|---|
 | 165 | }
 | 
|---|
 | 166 | 
 | 
|---|
 | 167 | std::vector<float> Plotter2ViewportInfo::getRangeX() {
 | 
|---|
 | 168 |     float minX, maxX;
 | 
|---|
 | 169 | 
 | 
|---|
 | 170 |     if (isAutoRangeX) {
 | 
|---|
 | 171 |         adjustRangeX(&minX, &maxX);
 | 
|---|
 | 172 |     } else {
 | 
|---|
 | 173 |         minX = vpRangeXMin;
 | 
|---|
 | 174 |         maxX = vpRangeXMax;
 | 
|---|
 | 175 |     }
 | 
|---|
 | 176 | 
 | 
|---|
 | 177 |     std::vector<float> res;
 | 
|---|
 | 178 |     res.clear();
 | 
|---|
 | 179 |     res.push_back(minX);
 | 
|---|
 | 180 |     res.push_back(maxX);
 | 
|---|
 | 181 | 
 | 
|---|
 | 182 |     return res;
 | 
|---|
 | 183 | }
 | 
|---|
 | 184 | 
 | 
|---|
 | 185 | std::vector<float> Plotter2ViewportInfo::getRangeY() {
 | 
|---|
 | 186 |     float minY, maxY;
 | 
|---|
 | 187 | 
 | 
|---|
 | 188 |     if (isAutoRangeY) {
 | 
|---|
 | 189 |         adjustRangeY(&minY, &maxY);
 | 
|---|
 | 190 |     } else {
 | 
|---|
 | 191 |         minY = vpRangeYMin;
 | 
|---|
 | 192 |         maxY = vpRangeYMax;
 | 
|---|
 | 193 |     }
 | 
|---|
 | 194 | 
 | 
|---|
 | 195 |     std::vector<float> res;
 | 
|---|
 | 196 |     res.clear();
 | 
|---|
 | 197 |     res.push_back(minY);
 | 
|---|
 | 198 |     res.push_back(maxY);
 | 
|---|
 | 199 | 
 | 
|---|
 | 200 |     return res;
 | 
|---|
 | 201 | }
 | 
|---|
 | 202 | 
 | 
|---|
 | 203 | void Plotter2ViewportInfo::adjustTickInterval() {
 | 
|---|
 | 204 |     if (hasDataRange) {
 | 
|---|
 | 205 |         if (isAutoTickIntervalX) {
 | 
|---|
| [2861] | 206 |             adjustTickIntervalX(vpRangeXMin, vpRangeXMax);
 | 
|---|
| [2830] | 207 |         }
 | 
|---|
 | 208 |         if (isAutoTickIntervalY) {
 | 
|---|
| [2861] | 209 |             adjustTickIntervalY(vpRangeYMin, vpRangeYMax);
 | 
|---|
| [2830] | 210 |         }
 | 
|---|
 | 211 |     }
 | 
|---|
 | 212 | }
 | 
|---|
 | 213 | 
 | 
|---|
 | 214 | void Plotter2ViewportInfo::adjustTickIntervalX(const float xmin, const float xmax) {
 | 
|---|
 | 215 |     majorTickIntervalX = (float)pow(10.0, ceil(log10((xmax - xmin)/10.0)));
 | 
|---|
| [2861] | 216 |     if ((xmax - xmin) / majorTickIntervalX < 4.0) {
 | 
|---|
 | 217 |         majorTickIntervalX /= 2.0;
 | 
|---|
| [2830] | 218 |     }
 | 
|---|
| [2861] | 219 |     if ((xmax - xmin) / majorTickIntervalX < 4.0) {
 | 
|---|
 | 220 |         majorTickIntervalX /= 2.0;
 | 
|---|
 | 221 |     }
 | 
|---|
| [2830] | 222 | }
 | 
|---|
 | 223 | 
 | 
|---|
 | 224 | void Plotter2ViewportInfo::adjustTickIntervalY(const float ymin, const float ymax) {
 | 
|---|
 | 225 |     majorTickIntervalY = (float)pow(10.0, ceil(log10((ymax - ymin)/10.0)));
 | 
|---|
| [2861] | 226 |     if ((ymax - ymin) / majorTickIntervalY < 4.0) {
 | 
|---|
 | 227 |         majorTickIntervalY /= 2.0;
 | 
|---|
| [2830] | 228 |     }
 | 
|---|
| [2861] | 229 |     if ((ymax - ymin) / majorTickIntervalY < 4.0) {
 | 
|---|
 | 230 |         majorTickIntervalY /= 2.0;
 | 
|---|
 | 231 |     }
 | 
|---|
| [2830] | 232 | }
 | 
|---|
 | 233 | 
 | 
|---|
 | 234 | void Plotter2ViewportInfo::setData(const std::vector<float>& inXData, const std::vector<float>& inYData, const int id) {
 | 
|---|
 | 235 |     if (!hasDataRange) {
 | 
|---|
 | 236 |         minXData = inXData[0];
 | 
|---|
 | 237 |         maxXData = inXData[0];
 | 
|---|
 | 238 |         minYData = inYData[0];
 | 
|---|
 | 239 |         maxYData = inYData[0];
 | 
|---|
 | 240 | 
 | 
|---|
 | 241 |         hasDataRange = true;
 | 
|---|
 | 242 |     }
 | 
|---|
 | 243 | 
 | 
|---|
 | 244 |     Plotter2DataInfo* info = &vData[id];
 | 
|---|
 | 245 | 
 | 
|---|
 | 246 |     info->xData.clear();
 | 
|---|
 | 247 |     info->xData.reserve(inXData.size());
 | 
|---|
| [2834] | 248 |     for (unsigned int i = 0; i < inXData.size(); ++i) {
 | 
|---|
| [2830] | 249 |         info->xData.push_back(inXData[i]);
 | 
|---|
 | 250 | 
 | 
|---|
 | 251 |         if (!info->hasData) {
 | 
|---|
 | 252 |             updateXDataRange(inXData[i]);
 | 
|---|
 | 253 |         }
 | 
|---|
 | 254 |     }
 | 
|---|
 | 255 | 
 | 
|---|
 | 256 |     info->yData.clear();
 | 
|---|
 | 257 |     info->yData.reserve(inYData.size());
 | 
|---|
| [2834] | 258 |     for (unsigned int i = 0; i < inYData.size(); ++i) {
 | 
|---|
| [2830] | 259 |         info->yData.push_back(inYData[i]);
 | 
|---|
 | 260 | 
 | 
|---|
 | 261 |         if (!info->hasData) {
 | 
|---|
 | 262 |             updateYDataRange(inYData[i]);
 | 
|---|
 | 263 |         }
 | 
|---|
 | 264 |     }
 | 
|---|
 | 265 | 
 | 
|---|
 | 266 |     if (info->hasData) {
 | 
|---|
 | 267 |         updateAllDataRanges();
 | 
|---|
 | 268 |     } else {
 | 
|---|
 | 269 |         info->hasData = true;
 | 
|---|
 | 270 |     }
 | 
|---|
| [2861] | 271 | 
 | 
|---|
 | 272 |     adjustRange();
 | 
|---|
 | 273 |     adjustTickInterval();
 | 
|---|
| [2830] | 274 | }
 | 
|---|
 | 275 | 
 | 
|---|
 | 276 | void Plotter2ViewportInfo::updateXDataRange(const float data) {
 | 
|---|
 | 277 |     if (data < minXData) {
 | 
|---|
 | 278 |         minXData = data;
 | 
|---|
 | 279 |     }
 | 
|---|
 | 280 |     if (maxXData < data) {
 | 
|---|
 | 281 |         maxXData = data;
 | 
|---|
 | 282 |     }
 | 
|---|
 | 283 | }
 | 
|---|
 | 284 | 
 | 
|---|
 | 285 | void Plotter2ViewportInfo::updateYDataRange(const float data) {
 | 
|---|
 | 286 |     if (data < minYData) {
 | 
|---|
 | 287 |         minYData = data;
 | 
|---|
 | 288 |     }
 | 
|---|
 | 289 |     if (maxYData < data) {
 | 
|---|
 | 290 |         maxYData = data;
 | 
|---|
 | 291 |     }
 | 
|---|
 | 292 | }
 | 
|---|
 | 293 | 
 | 
|---|
 | 294 | void Plotter2ViewportInfo::updateAllDataRanges() {
 | 
|---|
 | 295 |     minXData = vData[0].xData[0];
 | 
|---|
 | 296 |     maxXData = minXData;
 | 
|---|
 | 297 |     minYData = vData[0].yData[0];
 | 
|---|
 | 298 |     maxYData = minYData;
 | 
|---|
 | 299 | 
 | 
|---|
| [2834] | 300 |     for (unsigned int i = 0; i < vData.size(); ++i) {
 | 
|---|
 | 301 |         for (unsigned int j = 0; j < vData[i].xData.size(); ++j) {
 | 
|---|
| [2830] | 302 |             updateXDataRange(vData[i].xData[j]);
 | 
|---|
 | 303 |             updateYDataRange(vData[i].yData[j]);
 | 
|---|
 | 304 |         }
 | 
|---|
 | 305 |     }
 | 
|---|
 | 306 | }
 | 
|---|
 | 307 | 
 | 
|---|
 | 308 | void Plotter2ViewportInfo::getWorldCoordByWindowCoord(const float winX, const float winY, float* worldX, float* worldY) {
 | 
|---|
 | 309 |     float xratio = (winX - vpPosXMin) / (vpPosXMax - vpPosXMin);
 | 
|---|
 | 310 |     if (winX < 0.0) {
 | 
|---|
 | 311 |         xratio = 0.5;
 | 
|---|
 | 312 |     }
 | 
|---|
 | 313 |     *worldX = vpRangeXMin + xratio * (vpRangeXMax - vpRangeXMin);
 | 
|---|
 | 314 |     float yratio = (winY - vpPosYMin) / (vpPosYMax - vpPosYMin);
 | 
|---|
 | 315 |     if (winY < 0.0) {
 | 
|---|
 | 316 |         yratio = 0.5;
 | 
|---|
 | 317 |     }
 | 
|---|
 | 318 |     *worldY = vpRangeYMin + yratio * (vpRangeYMax - vpRangeYMin);
 | 
|---|
 | 319 | }
 | 
|---|
 | 320 | 
 | 
|---|
 | 321 | Plotter2::Plotter2() {
 | 
|---|
 | 322 |     filename = "";
 | 
|---|
 | 323 |     device = "xwindow";
 | 
|---|
 | 324 |     hasDevice = false;
 | 
|---|
 | 325 | 
 | 
|---|
 | 326 |     vInfo.clear();
 | 
|---|
 | 327 |     Plotter2ViewportInfo vi;
 | 
|---|
 | 328 |     vInfo.push_back(vi);
 | 
|---|
 | 329 | 
 | 
|---|
 | 330 |     hasDefaultViewport = true;
 | 
|---|
 | 331 |     currentViewportId = 0;
 | 
|---|
| [2895] | 332 | 
 | 
|---|
 | 333 |     width = 8.82796; // default viewsurface width seems to be this value.
 | 
|---|
 | 334 |     aspect = 0.75;   // default viewsurface aspect
 | 
|---|
| [2830] | 335 | }
 | 
|---|
 | 336 | 
 | 
|---|
 | 337 | Plotter2::~Plotter2() {
 | 
|---|
 | 338 |     close();
 | 
|---|
 | 339 |     vInfo.clear();
 | 
|---|
 | 340 | }
 | 
|---|
 | 341 | 
 | 
|---|
 | 342 | std::string Plotter2::getFileName() {
 | 
|---|
 | 343 |     return filename;
 | 
|---|
 | 344 | }
 | 
|---|
 | 345 | 
 | 
|---|
 | 346 | void Plotter2::setFileName(const std::string& inFilename) {
 | 
|---|
 | 347 |     filename = inFilename;
 | 
|---|
 | 348 | }
 | 
|---|
 | 349 | 
 | 
|---|
 | 350 | std::string Plotter2::getDevice() {
 | 
|---|
 | 351 |     return device;
 | 
|---|
 | 352 | }
 | 
|---|
 | 353 | 
 | 
|---|
 | 354 | void Plotter2::setDevice(const std::string& inDevice) {
 | 
|---|
 | 355 |     device = inDevice;
 | 
|---|
 | 356 | }
 | 
|---|
 | 357 | 
 | 
|---|
 | 358 | void Plotter2::open() {
 | 
|---|
 | 359 |     cpgopen((filename + "/" + device).c_str());
 | 
|---|
 | 360 |     hasDevice = true;
 | 
|---|
 | 361 | }
 | 
|---|
 | 362 | 
 | 
|---|
| [2895] | 363 | float Plotter2::getViewSurfaceWidth() {
 | 
|---|
 | 364 |     return width;
 | 
|---|
 | 365 | }
 | 
|---|
 | 366 | 
 | 
|---|
 | 367 | float Plotter2::getViewSurfaceAspect() {
 | 
|---|
 | 368 |     return aspect;
 | 
|---|
 | 369 | }
 | 
|---|
 | 370 | 
 | 
|---|
 | 371 | void Plotter2::setViewSurface(const float inWidth, const float inAspect) {
 | 
|---|
 | 372 |     width = inWidth;
 | 
|---|
 | 373 |     aspect = inAspect;
 | 
|---|
 | 374 | }
 | 
|---|
 | 375 | 
 | 
|---|
| [2830] | 376 | int Plotter2::addViewport(const float xmin, const float xmax, const float ymin, const float ymax) {
 | 
|---|
 | 377 |     Plotter2ViewportInfo vi;
 | 
|---|
 | 378 | 
 | 
|---|
 | 379 |     vi.vpPosXMin = xmin;
 | 
|---|
 | 380 |     vi.vpPosXMax = xmax;
 | 
|---|
 | 381 |     vi.vpPosYMin = ymin;
 | 
|---|
 | 382 |     vi.vpPosYMax = ymax;
 | 
|---|
 | 383 | 
 | 
|---|
 | 384 |     vInfo.push_back(vi);
 | 
|---|
 | 385 |     currentViewportId = vInfo.size() - 1;
 | 
|---|
 | 386 | 
 | 
|---|
 | 387 |     return currentViewportId;
 | 
|---|
 | 388 | }
 | 
|---|
 | 389 | 
 | 
|---|
 | 390 | void Plotter2::setViewport(const float xmin, const float xmax, const float ymin, const float ymax, const int id) {
 | 
|---|
| [2896] | 391 |   if (id >= (int)vInfo.size()) {
 | 
|---|
 | 392 |       return;
 | 
|---|
 | 393 |     }
 | 
|---|
| [2830] | 394 |     Plotter2ViewportInfo* vi = &vInfo[id];
 | 
|---|
 | 395 | 
 | 
|---|
 | 396 |     vi->vpPosXMin = xmin;
 | 
|---|
 | 397 |     vi->vpPosXMax = xmax;
 | 
|---|
 | 398 |     vi->vpPosYMin = ymin;
 | 
|---|
 | 399 |     vi->vpPosYMax = ymax;
 | 
|---|
 | 400 | 
 | 
|---|
 | 401 |     hasDefaultViewport = false;
 | 
|---|
 | 402 | }
 | 
|---|
 | 403 | 
 | 
|---|
 | 404 | void Plotter2::showViewport(const int inVpid) {
 | 
|---|
 | 405 |     int vpid = inVpid;
 | 
|---|
| [2896] | 406 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 407 |         return;
 | 
|---|
 | 408 |     }
 | 
|---|
| [2830] | 409 |     if (vpid < 0) {
 | 
|---|
 | 410 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 411 |     }
 | 
|---|
 | 412 |     if (vpid < 0) {
 | 
|---|
 | 413 |         exit(0);
 | 
|---|
 | 414 |     }
 | 
|---|
 | 415 | 
 | 
|---|
 | 416 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 417 |     vi->showViewport = true;
 | 
|---|
 | 418 | }
 | 
|---|
 | 419 | 
 | 
|---|
 | 420 | void Plotter2::hideViewport(const int inVpid) {
 | 
|---|
 | 421 |     int vpid = inVpid;
 | 
|---|
| [2896] | 422 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 423 |         return;
 | 
|---|
 | 424 |     }
 | 
|---|
| [2830] | 425 |     if (vpid < 0) {
 | 
|---|
 | 426 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 427 |     }
 | 
|---|
 | 428 |     if (vpid < 0) {
 | 
|---|
 | 429 |         exit(0);
 | 
|---|
 | 430 |     }
 | 
|---|
 | 431 | 
 | 
|---|
 | 432 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 433 |     vi->showViewport = false;
 | 
|---|
 | 434 | }
 | 
|---|
 | 435 | 
 | 
|---|
 | 436 | bool Plotter2::getHasDefaultViewport() {
 | 
|---|
 | 437 |     return hasDefaultViewport;
 | 
|---|
 | 438 | }
 | 
|---|
 | 439 | 
 | 
|---|
 | 440 | int Plotter2::getCurrentViewportId() {
 | 
|---|
| [2860] | 441 |     return currentViewportId;
 | 
|---|
| [2830] | 442 | }
 | 
|---|
 | 443 | 
 | 
|---|
 | 444 | void Plotter2::getViewInfo() {
 | 
|---|
| [2861] | 445 |     std::string colorNames[16] = {"white", "black", "red", "green", 
 | 
|---|
 | 446 |                                   "blue", "cyan", "magenta", "yellow", 
 | 
|---|
 | 447 |                                   "orange", "yellowgreen", "emerald", "skyblue", 
 | 
|---|
 | 448 |                                   "purple", "pink", "gray", "lightgray"};
 | 
|---|
 | 449 |     std::string lstyleNames[6] = {"", "solid", "dashed", "dash-dotted", "dotted", "dash-dot-dot-dotted"};
 | 
|---|
 | 450 |     std::string fstyleNames[5] = {"", "solid", "outline", "hatched", "crosshatched"};
 | 
|---|
 | 451 | 
 | 
|---|
| [2834] | 452 |     for (unsigned int i = 0; i < vInfo.size(); ++i) {
 | 
|---|
| [2861] | 453 |         std::cout << "Viewport [ID = " << i << "] (" << (i+1) << "/" << vInfo.size() << ") ";
 | 
|---|
 | 454 |         std::cout << "=============================================================" << std::endl;
 | 
|---|
| [2830] | 455 | 
 | 
|---|
| [2861] | 456 |         std::cout << "  Visible: " << (vInfo[i].showViewport ? "Yes" : "No") << std::endl;
 | 
|---|
| [2830] | 457 | 
 | 
|---|
| [2861] | 458 |         std::cout << "  Position in Window Coordinate: ";
 | 
|---|
 | 459 |         std::cout << "X(left=" << vInfo[i].vpPosXMin << ",right=" << vInfo[i].vpPosXMax << "), ";
 | 
|---|
 | 460 |         std::cout << "Y(bottom=" << vInfo[i].vpPosYMin << ",top=" << vInfo[i].vpPosYMax << ")" << std::endl;
 | 
|---|
 | 461 | 
 | 
|---|
 | 462 |         std::cout << "  Display Range: ";
 | 
|---|
 | 463 |         std::cout << "X(" << (vInfo[i].isAutoRangeX ? "automatic" : "manual") << ", ";
 | 
|---|
 | 464 |         std::cout << "min=" << vInfo[i].vpRangeXMin << ", max=" << vInfo[i].vpRangeXMax << "), ";
 | 
|---|
 | 465 |         std::cout << "Y(" << (vInfo[i].isAutoRangeY ? "automatic" : "manual") << ", ";
 | 
|---|
 | 466 |         std::cout << "min=" << vInfo[i].vpRangeYMin << ", max=" << vInfo[i].vpRangeYMax << ")" << std::endl;
 | 
|---|
 | 467 | 
 | 
|---|
 | 468 |         std::cout << "  Numbering/Ticks:" << std::endl;
 | 
|---|
 | 469 |         std::cout << "    X(" << ((vInfo[i].numLocationX == "b") ? "bottom" : ((vInfo[i].numLocationX == "t") ? "top" : (vInfo[i].numLocationX + " [*INVAILD*]"))) << ", interval[" << (vInfo[i].isAutoTickIntervalX ? "automatic" : "manual") << ", ";
 | 
|---|
 | 470 |         std::cout << "numbering=" << (vInfo[i].majorTickIntervalX * vInfo[i].nMajorTickWithinTickNumsX) << ", ";
 | 
|---|
 | 471 |         std::cout << "majortick=" << vInfo[i].majorTickIntervalX << ", ";
 | 
|---|
 | 472 |         std::cout << "minortick=" << (vInfo[i].majorTickIntervalX / vInfo[i].nMinorTickWithinMajorTicksX) << "])" << std::endl;
 | 
|---|
 | 473 |         std::cout << "    Y(" << ((vInfo[i].numLocationY == "l") ? "left" : ((vInfo[i].numLocationY == "r") ? "right" : (vInfo[i].numLocationY + " [*INVAILD*]"))) << ", interval[" << (vInfo[i].isAutoTickIntervalY ? "automatic" : "manual") << ", ";
 | 
|---|
 | 474 |         std::cout << "numbering=" << (vInfo[i].majorTickIntervalY * vInfo[i].nMajorTickWithinTickNumsY) << ", ";
 | 
|---|
 | 475 |         std::cout << "majortick=" << vInfo[i].majorTickIntervalY << ", ";
 | 
|---|
 | 476 |         std::cout << "minortick=" << (vInfo[i].majorTickIntervalY / vInfo[i].nMinorTickWithinMajorTicksY) << "])" << std::endl;
 | 
|---|
 | 477 | 
 | 
|---|
 | 478 |         std::cout << "  X Label: ";
 | 
|---|
 | 479 |         if (vInfo[i].labelXString != "") {
 | 
|---|
 | 480 |             std::cout << "\"" << vInfo[i].labelXString << "\"" << std::endl;
 | 
|---|
 | 481 |             std::cout << "    position=(" << vInfo[i].labelXPosX << "," << vInfo[i].labelXPosY << "), ";
 | 
|---|
 | 482 |             std::cout << "justification=" << vInfo[i].labelXFJust << ", ";
 | 
|---|
 | 483 |             std::cout << "angle=" << vInfo[i].labelXAngle << "deg, ";
 | 
|---|
 | 484 |             std::cout << "fontsize=" << vInfo[i].labelXSize << std::endl;
 | 
|---|
 | 485 |         } else {
 | 
|---|
 | 486 |             std::cout << "No" << std::endl;
 | 
|---|
 | 487 |         }
 | 
|---|
 | 488 | 
 | 
|---|
 | 489 |         std::cout << "  Y Label: ";
 | 
|---|
 | 490 |         if (vInfo[i].labelYString != "") {
 | 
|---|
 | 491 |             std::cout << "\"" << vInfo[i].labelYString << "\"" << std::endl;
 | 
|---|
 | 492 |             std::cout << "    position=(" << vInfo[i].labelYPosX << "," << vInfo[i].labelYPosY << "), ";
 | 
|---|
 | 493 |             std::cout << "justification=" << vInfo[i].labelYFJust << ", ";
 | 
|---|
 | 494 |             std::cout << "angle=" << vInfo[i].labelYAngle << "deg, ";
 | 
|---|
 | 495 |             std::cout << "fontsize=" << vInfo[i].labelYSize << std::endl;
 | 
|---|
 | 496 |         } else {
 | 
|---|
 | 497 |             std::cout << "No" << std::endl;
 | 
|---|
 | 498 |         }
 | 
|---|
 | 499 | 
 | 
|---|
 | 500 |         std::cout << "  Title: ";
 | 
|---|
 | 501 |         if (vInfo[i].titleString != "") {
 | 
|---|
 | 502 |             std::cout << "\"" << vInfo[i].titleString << "\"" << std::endl;
 | 
|---|
 | 503 |             std::cout << "    position=(" << vInfo[i].titlePosX << "," << vInfo[i].titlePosY << "), ";
 | 
|---|
 | 504 |             std::cout << "justification=" << vInfo[i].titleFJust << ", ";
 | 
|---|
 | 505 |             std::cout << "angle=" << vInfo[i].titleAngle << "deg, ";
 | 
|---|
 | 506 |             std::cout << "fontsize=" << vInfo[i].titleSize << std::endl;
 | 
|---|
 | 507 |         } else {
 | 
|---|
 | 508 |             std::cout << "No" << std::endl;
 | 
|---|
 | 509 |         }
 | 
|---|
 | 510 | 
 | 
|---|
 | 511 |         std::cout << "  Background Color = ";
 | 
|---|
 | 512 |         if (vInfo[i].vpBColor < 0) {
 | 
|---|
 | 513 |             std::cout << "transparent" << std::endl;
 | 
|---|
 | 514 |         } else if (vInfo[i].vpBColor < 16) {
 | 
|---|
 | 515 |             std::cout << colorNames[vInfo[i].vpBColor] << std::endl;
 | 
|---|
 | 516 |         } else {
 | 
|---|
 | 517 |             std::cout << "index:" << vInfo[i].vpBColor << " [INVAILD VALUE!]" << std::endl;
 | 
|---|
 | 518 |         }
 | 
|---|
 | 519 | 
 | 
|---|
| [2834] | 520 |         for (unsigned int j = 0; j < vInfo[i].vData.size(); ++j) {
 | 
|---|
| [2861] | 521 |             std::cout << "  Dataset [ID = " << j << "] (" << (j+1) << "/" << vInfo[i].vData.size() << ") ";
 | 
|---|
 | 522 |             std::cout << "----------------------------------------------" << std::endl;
 | 
|---|
 | 523 | 
 | 
|---|
 | 524 |             bool showDataset = (vInfo[i].vData[j].drawLine || vInfo[i].vData[j].drawMarker);
 | 
|---|
 | 525 |             bool showViewport = vInfo[i].showViewport;
 | 
|---|
 | 526 |             std::cout << "    Visible: " << (showViewport ? "" : "(");
 | 
|---|
 | 527 |             std::cout << (showDataset ? "Yes" : "No") << (showViewport ? "" : ")") << std::endl;
 | 
|---|
 | 528 |             std::cout << "    Number of Data Points: " << vInfo[i].vData[j].xData.size() << std::endl;
 | 
|---|
 | 529 |             if (vInfo[i].vData[j].drawLine) {
 | 
|---|
 | 530 |                 std::cout << "    Line: color=";
 | 
|---|
 | 531 |                 if (vInfo[i].vData[j].lineColor < 0) {
 | 
|---|
 | 532 |                   int defaultColorIdx = (j + 1) % 15 + 1;
 | 
|---|
 | 533 |                     std::cout << "default(" << colorNames[defaultColorIdx] << ")";
 | 
|---|
 | 534 |                 } else if (vInfo[i].vData[j].lineColor < 16) {
 | 
|---|
 | 535 |                     std::cout << colorNames[vInfo[i].vData[j].lineColor];
 | 
|---|
 | 536 |                 } else {
 | 
|---|
 | 537 |                     std::cout << "index:" << vInfo[i].vData[j].lineColor << " [*INVAILD*]";
 | 
|---|
 | 538 |                 }
 | 
|---|
 | 539 |                 std::cout << ", width=" << vInfo[i].vData[j].lineWidth;
 | 
|---|
 | 540 |                 std::cout << ", style=" << lstyleNames[vInfo[i].vData[j].lineStyle] << std::endl;
 | 
|---|
| [2830] | 541 |             }
 | 
|---|
| [2861] | 542 |             if (vInfo[i].vData[j].drawMarker) {
 | 
|---|
 | 543 |                 std::cout << "    Marker: color=";
 | 
|---|
 | 544 |                 if (vInfo[i].vData[j].markerColor < 0) {
 | 
|---|
 | 545 |                     std::cout << "default";
 | 
|---|
 | 546 |                 } else if (vInfo[i].vData[j].markerColor < 16) {
 | 
|---|
 | 547 |                     std::cout << colorNames[vInfo[i].vData[j].markerColor];
 | 
|---|
 | 548 |                 } else {
 | 
|---|
 | 549 |                     std::cout << "index:" << vInfo[i].vData[j].markerColor << " [*INVAILD*]";
 | 
|---|
 | 550 |                 }
 | 
|---|
 | 551 |                 std::cout << ", shape=" << vInfo[i].vData[j].markerType;
 | 
|---|
 | 552 |                 std::cout << ", size=" << vInfo[i].vData[j].markerSize << std::endl;
 | 
|---|
 | 553 |             }
 | 
|---|
 | 554 | 
 | 
|---|
| [2830] | 555 |         }
 | 
|---|
| [2861] | 556 | 
 | 
|---|
 | 557 |         for (unsigned int j = 0; j < vInfo[i].vRect.size(); ++j) {
 | 
|---|
 | 558 |             std::cout << "  XMask [ID = " << j << "] (" << (j+1) << "/" << vInfo[i].vRect.size() << ") ";
 | 
|---|
 | 559 |             std::cout << "----------------------------------------------" << std::endl;
 | 
|---|
 | 560 |             std::cout << "    Range: (min=" << vInfo[i].vRect[j].xmin << ", max=" << vInfo[i].vRect[j].xmax << ")" << std::endl;
 | 
|---|
 | 561 |             std::cout << "    Attributes: (color=" << colorNames[vInfo[i].vRect[j].color];
 | 
|---|
 | 562 |             std::string fstyle = fstyleNames[vInfo[i].vRect[j].fill];
 | 
|---|
 | 563 |             std::cout << ", fillstyle=" << fstyle;
 | 
|---|
 | 564 |             if (fstyle == "outline") {
 | 
|---|
 | 565 |                 std::cout << ", outlinewidth=" << vInfo[i].vRect[j].width;
 | 
|---|
 | 566 |             }
 | 
|---|
 | 567 |             if ((fstyle == "hatched")||(fstyle == "crosshatched")) {
 | 
|---|
 | 568 |                 std::cout << ", hatchspacing=" << vInfo[i].vRect[j].hsep;
 | 
|---|
 | 569 |             }
 | 
|---|
 | 570 |             std::cout << ")" << std::endl;
 | 
|---|
 | 571 |         }
 | 
|---|
| [2830] | 572 |     }
 | 
|---|
| [2861] | 573 |     std::cout << "=====================================================================================" << std::endl << std::flush;
 | 
|---|
| [2830] | 574 | }
 | 
|---|
 | 575 | 
 | 
|---|
 | 576 | void Plotter2::setRange(const float xmin, const float xmax, const float ymin, const float ymax, const int inVpid) {
 | 
|---|
 | 577 |     setRangeX(xmin, xmax, inVpid);
 | 
|---|
 | 578 |     setRangeY(ymin, ymax, inVpid);
 | 
|---|
 | 579 | }
 | 
|---|
 | 580 | 
 | 
|---|
 | 581 | void Plotter2::setRangeX(const float xmin, const float xmax, const int inVpid) {
 | 
|---|
 | 582 |     int vpid = inVpid;
 | 
|---|
| [2896] | 583 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 584 |         return;
 | 
|---|
 | 585 |     }
 | 
|---|
| [2830] | 586 |     if (vpid < 0) {
 | 
|---|
 | 587 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 588 |     }
 | 
|---|
 | 589 |     if (vpid < 0) {
 | 
|---|
 | 590 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 591 |         vInfo.push_back(vi);
 | 
|---|
 | 592 |         vpid = 0;
 | 
|---|
 | 593 |     }
 | 
|---|
 | 594 | 
 | 
|---|
 | 595 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 596 |     vi->vpRangeXMin = xmin;
 | 
|---|
 | 597 |     vi->vpRangeXMax = xmax;
 | 
|---|
 | 598 |     vi->isAutoRangeX = false;
 | 
|---|
 | 599 | }
 | 
|---|
 | 600 | 
 | 
|---|
 | 601 | void Plotter2::setRangeY(const float ymin, const float ymax, const int inVpid) {
 | 
|---|
 | 602 |     int vpid = inVpid;
 | 
|---|
| [2896] | 603 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 604 |         return;
 | 
|---|
 | 605 |     }
 | 
|---|
| [2830] | 606 |     if (vpid < 0) {
 | 
|---|
 | 607 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 608 |     }
 | 
|---|
 | 609 |     if (vpid < 0) {
 | 
|---|
 | 610 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 611 |         vInfo.push_back(vi);
 | 
|---|
 | 612 |         vpid = 0;
 | 
|---|
 | 613 |     }
 | 
|---|
 | 614 | 
 | 
|---|
 | 615 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 616 |     vi->vpRangeYMin = ymin;
 | 
|---|
 | 617 |     vi->vpRangeYMax = ymax;
 | 
|---|
 | 618 |     vi->isAutoRangeY = false;
 | 
|---|
 | 619 | }
 | 
|---|
 | 620 | 
 | 
|---|
 | 621 | std::vector<float> Plotter2::getRangeX(const int inVpid) {
 | 
|---|
 | 622 |     int vpid = inVpid;
 | 
|---|
| [2896] | 623 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 624 |         exit(0);
 | 
|---|
 | 625 |     }
 | 
|---|
| [2830] | 626 |     if (vpid < 0) {
 | 
|---|
 | 627 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 628 |     }
 | 
|---|
 | 629 |     if (vpid < 0) {
 | 
|---|
 | 630 |         exit(0);
 | 
|---|
 | 631 |     }
 | 
|---|
 | 632 | 
 | 
|---|
 | 633 |     return vInfo[vpid].getRangeX();
 | 
|---|
 | 634 | }
 | 
|---|
 | 635 | 
 | 
|---|
 | 636 | std::vector<float> Plotter2::getRangeY(const int inVpid) {
 | 
|---|
 | 637 |     int vpid = inVpid;
 | 
|---|
| [2896] | 638 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 639 |         exit(0);
 | 
|---|
 | 640 |     }
 | 
|---|
| [2830] | 641 |     if (vpid < 0) {
 | 
|---|
 | 642 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 643 |     }
 | 
|---|
 | 644 |     if (vpid < 0) {
 | 
|---|
 | 645 |         exit(0);
 | 
|---|
 | 646 |     }
 | 
|---|
 | 647 | 
 | 
|---|
 | 648 |     return vInfo[vpid].getRangeY();
 | 
|---|
 | 649 | }
 | 
|---|
 | 650 | 
 | 
|---|
 | 651 | void Plotter2::setAutoRange(const int inVpid) {
 | 
|---|
 | 652 |     setAutoRangeX(inVpid);
 | 
|---|
 | 653 |     setAutoRangeY(inVpid);
 | 
|---|
 | 654 | }
 | 
|---|
 | 655 | 
 | 
|---|
 | 656 | void Plotter2::setAutoRangeX(const int inVpid) {
 | 
|---|
 | 657 |     int vpid = inVpid;
 | 
|---|
| [2896] | 658 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 659 |         exit(0);
 | 
|---|
 | 660 |     }
 | 
|---|
| [2830] | 661 |     if (vpid < 0) {
 | 
|---|
 | 662 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 663 |     }
 | 
|---|
 | 664 |     if (vpid < 0) {
 | 
|---|
 | 665 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 666 |         vInfo.push_back(vi);
 | 
|---|
 | 667 |         vpid = 0;
 | 
|---|
 | 668 |     }
 | 
|---|
 | 669 | 
 | 
|---|
 | 670 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 671 |     vi->isAutoRangeX = true;
 | 
|---|
 | 672 | }
 | 
|---|
 | 673 | 
 | 
|---|
 | 674 | void Plotter2::setAutoRangeY(const int inVpid) {
 | 
|---|
 | 675 |     int vpid = inVpid;
 | 
|---|
| [2896] | 676 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 677 |         exit(0);
 | 
|---|
 | 678 |     }
 | 
|---|
| [2830] | 679 |     if (vpid < 0) {
 | 
|---|
 | 680 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 681 |     }
 | 
|---|
 | 682 |     if (vpid < 0) {
 | 
|---|
 | 683 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 684 |         vInfo.push_back(vi);
 | 
|---|
 | 685 |         vpid = 0;
 | 
|---|
 | 686 |     }
 | 
|---|
 | 687 | 
 | 
|---|
 | 688 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 689 |     vi->isAutoRangeY = true;
 | 
|---|
 | 690 | }
 | 
|---|
 | 691 | 
 | 
|---|
 | 692 | void Plotter2::setFontSizeDef(const float size, const int inVpid) {
 | 
|---|
 | 693 |     int vpid = inVpid;
 | 
|---|
| [2896] | 694 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 695 |         exit(0);
 | 
|---|
 | 696 |     }
 | 
|---|
| [2830] | 697 |     if (vpid < 0) {
 | 
|---|
 | 698 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 699 |     }
 | 
|---|
 | 700 |     if (vpid < 0) {
 | 
|---|
 | 701 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 702 |         vInfo.push_back(vi);
 | 
|---|
 | 703 |         vpid = 0;
 | 
|---|
 | 704 |     }
 | 
|---|
 | 705 | 
 | 
|---|
 | 706 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 707 |     vi->fontSizeDef = size;
 | 
|---|
 | 708 | }
 | 
|---|
 | 709 | 
 | 
|---|
 | 710 | void Plotter2::setTicksX(const float interval, const int num, const int inVpid) {
 | 
|---|
 | 711 |     int vpid = inVpid;
 | 
|---|
| [2896] | 712 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 713 |         exit(0);
 | 
|---|
 | 714 |     }
 | 
|---|
| [2830] | 715 |     if (vpid < 0) {
 | 
|---|
 | 716 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 717 |     }
 | 
|---|
 | 718 |     if (vpid < 0) {
 | 
|---|
 | 719 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 720 |         vInfo.push_back(vi);
 | 
|---|
 | 721 |         vpid = 0;
 | 
|---|
 | 722 |     }
 | 
|---|
 | 723 | 
 | 
|---|
 | 724 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 725 |     vi->majorTickIntervalX = interval;
 | 
|---|
 | 726 |     vi->nMinorTickWithinMajorTicksX = num;
 | 
|---|
 | 727 |     vi->isAutoTickIntervalX = false;
 | 
|---|
 | 728 | }
 | 
|---|
 | 729 | 
 | 
|---|
 | 730 | void Plotter2::setTicksY(const float interval, const int num, const int inVpid) {
 | 
|---|
 | 731 |     int vpid = inVpid;
 | 
|---|
| [2896] | 732 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 733 |         exit(0);
 | 
|---|
 | 734 |     }
 | 
|---|
| [2830] | 735 |     if (vpid < 0) {
 | 
|---|
 | 736 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 737 |     }
 | 
|---|
 | 738 |     if (vpid < 0) {
 | 
|---|
 | 739 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 740 |         vInfo.push_back(vi);
 | 
|---|
 | 741 |         vpid = 0;
 | 
|---|
 | 742 |     }
 | 
|---|
 | 743 | 
 | 
|---|
 | 744 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 745 |     vi->majorTickIntervalY = interval;
 | 
|---|
 | 746 |     vi->nMinorTickWithinMajorTicksY = num;
 | 
|---|
 | 747 |     vi->isAutoTickIntervalY = false;
 | 
|---|
 | 748 | }
 | 
|---|
 | 749 | 
 | 
|---|
 | 750 | void Plotter2::setAutoTicks(const int inVpid) {
 | 
|---|
 | 751 |     setAutoTicksX(inVpid);
 | 
|---|
 | 752 |     setAutoTicksY(inVpid);
 | 
|---|
 | 753 | }
 | 
|---|
 | 754 | 
 | 
|---|
 | 755 | void Plotter2::setAutoTicksX(const int inVpid) {
 | 
|---|
 | 756 |     int vpid = inVpid;
 | 
|---|
| [2896] | 757 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 758 |         exit(0);
 | 
|---|
 | 759 |     }
 | 
|---|
| [2830] | 760 |     if (vpid < 0) {
 | 
|---|
 | 761 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 762 |     }
 | 
|---|
 | 763 |     if (vpid < 0) {
 | 
|---|
 | 764 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 765 |         vInfo.push_back(vi);
 | 
|---|
 | 766 |         vpid = 0;
 | 
|---|
 | 767 |     }
 | 
|---|
 | 768 | 
 | 
|---|
 | 769 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 770 |     vi->isAutoTickIntervalX = true;
 | 
|---|
 | 771 | }
 | 
|---|
 | 772 | 
 | 
|---|
 | 773 | void Plotter2::setAutoTicksY(const int inVpid) {
 | 
|---|
 | 774 |     int vpid = inVpid;
 | 
|---|
| [2896] | 775 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 776 |         exit(0);
 | 
|---|
 | 777 |     }
 | 
|---|
| [2830] | 778 |     if (vpid < 0) {
 | 
|---|
 | 779 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 780 |     }
 | 
|---|
 | 781 |     if (vpid < 0) {
 | 
|---|
 | 782 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 783 |         vInfo.push_back(vi);
 | 
|---|
 | 784 |         vpid = 0;
 | 
|---|
 | 785 |     }
 | 
|---|
 | 786 | 
 | 
|---|
 | 787 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 788 |     vi->isAutoTickIntervalY = true;
 | 
|---|
 | 789 | }
 | 
|---|
 | 790 | 
 | 
|---|
 | 791 | void Plotter2::setNumIntervalX(const float interval, const int inVpid) {
 | 
|---|
 | 792 |     int vpid = inVpid;
 | 
|---|
| [2896] | 793 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 794 |         exit(0);
 | 
|---|
 | 795 |     }
 | 
|---|
| [2830] | 796 |     if (vpid < 0) {
 | 
|---|
 | 797 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 798 |     }
 | 
|---|
 | 799 |     if (vpid < 0) {
 | 
|---|
 | 800 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 801 |         vInfo.push_back(vi);
 | 
|---|
 | 802 |         vpid = 0;
 | 
|---|
 | 803 |     }
 | 
|---|
 | 804 | 
 | 
|---|
 | 805 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 806 |     vi->nMajorTickWithinTickNumsX = (int)(interval / vi->majorTickIntervalX);
 | 
|---|
 | 807 | }
 | 
|---|
 | 808 | 
 | 
|---|
 | 809 | void Plotter2::setNumIntervalY(const float interval, const int inVpid) {
 | 
|---|
 | 810 |     int vpid = inVpid;
 | 
|---|
| [2896] | 811 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 812 |         exit(0);
 | 
|---|
 | 813 |     }
 | 
|---|
| [2830] | 814 |     if (vpid < 0) {
 | 
|---|
 | 815 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 816 |     }
 | 
|---|
 | 817 |     if (vpid < 0) {
 | 
|---|
 | 818 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 819 |         vInfo.push_back(vi);
 | 
|---|
 | 820 |         vpid = 0;
 | 
|---|
 | 821 |     }
 | 
|---|
 | 822 | 
 | 
|---|
 | 823 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 824 |     vi->nMajorTickWithinTickNumsY = (int)(interval / vi->majorTickIntervalY);
 | 
|---|
 | 825 | }
 | 
|---|
 | 826 | 
 | 
|---|
 | 827 | void Plotter2::setNumLocationX(const std::string& side, const int inVpid) {
 | 
|---|
 | 828 |     int vpid = inVpid;
 | 
|---|
| [2896] | 829 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 830 |         exit(0);
 | 
|---|
 | 831 |     }
 | 
|---|
| [2830] | 832 |     if (vpid < 0) {
 | 
|---|
 | 833 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 834 |     }
 | 
|---|
 | 835 |     if (vpid < 0) {
 | 
|---|
 | 836 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 837 |         vInfo.push_back(vi);
 | 
|---|
 | 838 |         vpid = 0;
 | 
|---|
 | 839 |     }
 | 
|---|
 | 840 | 
 | 
|---|
 | 841 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 842 |     vi->numLocationX = side;
 | 
|---|
 | 843 | }
 | 
|---|
 | 844 | 
 | 
|---|
 | 845 | void Plotter2::setNumLocationY(const std::string& side, const int inVpid) {
 | 
|---|
 | 846 |     int vpid = inVpid;
 | 
|---|
| [2896] | 847 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 848 |         exit(0);
 | 
|---|
 | 849 |     }
 | 
|---|
| [2830] | 850 |     if (vpid < 0) {
 | 
|---|
 | 851 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 852 |     }
 | 
|---|
 | 853 |     if (vpid < 0) {
 | 
|---|
 | 854 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 855 |         vInfo.push_back(vi);
 | 
|---|
 | 856 |         vpid = 0;
 | 
|---|
 | 857 |     }
 | 
|---|
 | 858 | 
 | 
|---|
 | 859 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 860 |     vi->numLocationY = side;
 | 
|---|
 | 861 | }
 | 
|---|
 | 862 | 
 | 
|---|
 | 863 | void Plotter2::setData(const std::vector<float>& xdata, const std::vector<float>& ydata, const int inVpid, const int inDataid) {
 | 
|---|
 | 864 |     int vpid = inVpid;
 | 
|---|
| [2896] | 865 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 866 |         exit(0);
 | 
|---|
 | 867 |     }
 | 
|---|
| [2830] | 868 |     if (vpid < 0) {
 | 
|---|
 | 869 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 870 |     }
 | 
|---|
 | 871 |     if (vpid < 0) {
 | 
|---|
 | 872 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 873 |         vInfo.push_back(vi);
 | 
|---|
 | 874 |         vpid = 0;
 | 
|---|
 | 875 |     }
 | 
|---|
 | 876 | 
 | 
|---|
 | 877 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 878 | 
 | 
|---|
 | 879 |     int dataid = inDataid;
 | 
|---|
 | 880 |     if (dataid < 0) {
 | 
|---|
 | 881 |         Plotter2DataInfo di;
 | 
|---|
 | 882 |         vi->vData.push_back(di);
 | 
|---|
 | 883 |         dataid = vi->vData.size() - 1;
 | 
|---|
| [2896] | 884 |     } else if (dataid >= (int)vi->vData.size()) {
 | 
|---|
 | 885 |         exit(0);
 | 
|---|
| [2830] | 886 |     }
 | 
|---|
 | 887 | 
 | 
|---|
 | 888 |     vi->setData(xdata, ydata, dataid);
 | 
|---|
 | 889 | }
 | 
|---|
 | 890 | 
 | 
|---|
 | 891 | void Plotter2::setLine(const int color, const int width, const int style, const int inVpid, const int inDataid) {
 | 
|---|
 | 892 |     int vpid = inVpid;
 | 
|---|
| [2896] | 893 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 894 |         exit(0);
 | 
|---|
 | 895 |     }
 | 
|---|
| [2830] | 896 |     if (vpid < 0) {
 | 
|---|
 | 897 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 898 |     }
 | 
|---|
 | 899 |     if (vpid < 0) {
 | 
|---|
 | 900 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 901 |         vInfo.push_back(vi);
 | 
|---|
 | 902 |         vpid = 0;
 | 
|---|
 | 903 |     }
 | 
|---|
 | 904 | 
 | 
|---|
| [2896] | 905 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 906 | 
 | 
|---|
| [2830] | 907 |     int dataid = inDataid;
 | 
|---|
 | 908 |     if (dataid < 0) {
 | 
|---|
| [2896] | 909 |         dataid = vi->vData.size() - 1;
 | 
|---|
 | 910 |     } else if (dataid >= (int)vi->vData.size()) {
 | 
|---|
 | 911 |         exit(0);
 | 
|---|
| [2830] | 912 |     }
 | 
|---|
 | 913 | 
 | 
|---|
| [2896] | 914 |     Plotter2DataInfo* di = &vi->vData[dataid];
 | 
|---|
 | 915 |     di->drawLine  = true;
 | 
|---|
 | 916 |     di->lineColor = color;
 | 
|---|
 | 917 |     di->lineWidth = width;
 | 
|---|
 | 918 |     di->lineStyle = style;
 | 
|---|
 | 919 |     //vi->vData[dataid].lineStyle = style;
 | 
|---|
| [2830] | 920 | }
 | 
|---|
 | 921 | 
 | 
|---|
 | 922 | void Plotter2::showLine(const int inVpid, const int inDataid) {
 | 
|---|
 | 923 |     int vpid = inVpid;
 | 
|---|
| [2896] | 924 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 925 |         exit(0);
 | 
|---|
 | 926 |     }
 | 
|---|
| [2830] | 927 |     if (vpid < 0) {
 | 
|---|
 | 928 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 929 |     }
 | 
|---|
 | 930 |     if (vpid < 0) {
 | 
|---|
 | 931 |         exit(0);
 | 
|---|
 | 932 |     }
 | 
|---|
 | 933 | 
 | 
|---|
 | 934 |     int dataid = inDataid;
 | 
|---|
| [2896] | 935 |     if (dataid >= (int)vInfo[vpid].vData.size()) {
 | 
|---|
 | 936 |         exit(0);
 | 
|---|
 | 937 |     }
 | 
|---|
| [2830] | 938 |     if (dataid < 0) {
 | 
|---|
 | 939 |         dataid = vInfo[vpid].vData.size() - 1;
 | 
|---|
 | 940 |     }
 | 
|---|
 | 941 |     if (dataid < 0) {
 | 
|---|
 | 942 |         exit(0);
 | 
|---|
 | 943 |     }
 | 
|---|
 | 944 | 
 | 
|---|
 | 945 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 946 |     vi->vData[dataid].drawLine  = true;
 | 
|---|
 | 947 | }
 | 
|---|
 | 948 | 
 | 
|---|
 | 949 | void Plotter2::hideLine(const int inVpid, const int inDataid) {
 | 
|---|
 | 950 |     int vpid = inVpid;
 | 
|---|
| [2896] | 951 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 952 |         exit(0);
 | 
|---|
 | 953 |     }
 | 
|---|
| [2830] | 954 |     if (vpid < 0) {
 | 
|---|
 | 955 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 956 |     }
 | 
|---|
 | 957 |     if (vpid < 0) {
 | 
|---|
 | 958 |         exit(0);
 | 
|---|
 | 959 |     }
 | 
|---|
 | 960 | 
 | 
|---|
 | 961 |     int dataid = inDataid;
 | 
|---|
| [2896] | 962 |     if (dataid >= (int)vInfo[vpid].vData.size()) {
 | 
|---|
 | 963 |         exit(0);
 | 
|---|
 | 964 |     }
 | 
|---|
| [2830] | 965 |     if (dataid < 0) {
 | 
|---|
 | 966 |         dataid = vInfo[vpid].vData.size() - 1;
 | 
|---|
 | 967 |     }
 | 
|---|
 | 968 |     if (dataid < 0) {
 | 
|---|
 | 969 |         exit(0);
 | 
|---|
 | 970 |     }
 | 
|---|
 | 971 | 
 | 
|---|
 | 972 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 973 |     vi->vData[dataid].drawLine  = false;
 | 
|---|
 | 974 | }
 | 
|---|
 | 975 | 
 | 
|---|
 | 976 | void Plotter2::setPoint(const int type, const float size, const int color, const int inVpid, const int inDataid) {
 | 
|---|
 | 977 |     int vpid = inVpid;
 | 
|---|
| [2896] | 978 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 979 |         exit(0);
 | 
|---|
 | 980 |     }
 | 
|---|
| [2830] | 981 |     if (vpid < 0) {
 | 
|---|
 | 982 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 983 |     }
 | 
|---|
 | 984 |     if (vpid < 0) {
 | 
|---|
 | 985 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 986 |         vInfo.push_back(vi);
 | 
|---|
 | 987 |         vpid = 0;
 | 
|---|
 | 988 |     }
 | 
|---|
 | 989 | 
 | 
|---|
 | 990 |     int dataid = inDataid;
 | 
|---|
| [2896] | 991 |     if (dataid >= (int)vInfo[vpid].vData.size()) {
 | 
|---|
 | 992 |         exit(0);
 | 
|---|
 | 993 |     }
 | 
|---|
| [2830] | 994 |     if (dataid < 0) {
 | 
|---|
 | 995 |         dataid = vInfo[vpid].vData.size() - 1;
 | 
|---|
 | 996 |     }
 | 
|---|
 | 997 | 
 | 
|---|
 | 998 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 999 |     vi->vData[dataid].drawMarker  = true;
 | 
|---|
 | 1000 |     vi->vData[dataid].markerType  = type;
 | 
|---|
 | 1001 |     vi->vData[dataid].markerSize  = size;
 | 
|---|
 | 1002 |     vi->vData[dataid].markerColor = color;
 | 
|---|
 | 1003 | }
 | 
|---|
 | 1004 | 
 | 
|---|
 | 1005 | void Plotter2::showPoint(const int inVpid, const int inDataid) {
 | 
|---|
 | 1006 |     int vpid = inVpid;
 | 
|---|
| [2896] | 1007 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 1008 |         exit(0);
 | 
|---|
 | 1009 |     }
 | 
|---|
| [2830] | 1010 |     if (vpid < 0) {
 | 
|---|
 | 1011 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 1012 |     }
 | 
|---|
 | 1013 |     if (vpid < 0) {
 | 
|---|
 | 1014 |         exit(0);
 | 
|---|
 | 1015 |     }
 | 
|---|
 | 1016 | 
 | 
|---|
 | 1017 |     int dataid = inDataid;
 | 
|---|
| [2896] | 1018 |     if (dataid >= (int)vInfo[vpid].vData.size()) {
 | 
|---|
 | 1019 |         exit(0);
 | 
|---|
 | 1020 |     }
 | 
|---|
| [2830] | 1021 |     if (dataid < 0) {
 | 
|---|
 | 1022 |         dataid = vInfo[vpid].vData.size() - 1;
 | 
|---|
 | 1023 |     }
 | 
|---|
 | 1024 |     if (dataid < 0) {
 | 
|---|
 | 1025 |         exit(0);
 | 
|---|
 | 1026 |     }
 | 
|---|
 | 1027 | 
 | 
|---|
 | 1028 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 1029 |     vi->vData[dataid].drawMarker  = true;
 | 
|---|
 | 1030 | }
 | 
|---|
 | 1031 | 
 | 
|---|
 | 1032 | void Plotter2::hidePoint(const int inVpid, const int inDataid) {
 | 
|---|
 | 1033 |     int vpid = inVpid;
 | 
|---|
| [2896] | 1034 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 1035 |         exit(0);
 | 
|---|
 | 1036 |     }
 | 
|---|
| [2830] | 1037 |     if (vpid < 0) {
 | 
|---|
 | 1038 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 1039 |     }
 | 
|---|
 | 1040 |     if (vpid < 0) {
 | 
|---|
 | 1041 |         exit(0);
 | 
|---|
 | 1042 |     }
 | 
|---|
 | 1043 | 
 | 
|---|
 | 1044 |     int dataid = inDataid;
 | 
|---|
| [2896] | 1045 |     if (dataid >= (int)vInfo[vpid].vData.size()) {
 | 
|---|
 | 1046 |         exit(0);
 | 
|---|
 | 1047 |     }
 | 
|---|
| [2830] | 1048 |     if (dataid < 0) {
 | 
|---|
 | 1049 |         dataid = vInfo[vpid].vData.size() - 1;
 | 
|---|
 | 1050 |     }
 | 
|---|
 | 1051 |     if (dataid < 0) {
 | 
|---|
 | 1052 |         exit(0);
 | 
|---|
 | 1053 |     }
 | 
|---|
 | 1054 | 
 | 
|---|
 | 1055 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 1056 |     vi->vData[dataid].drawMarker  = false;
 | 
|---|
 | 1057 | }
 | 
|---|
 | 1058 | 
 | 
|---|
 | 1059 | void Plotter2::setMaskX(const float xmin, const float xmax, const int color, const int fill, const int width, const float hsep, const int inVpid) {
 | 
|---|
 | 1060 |     int vpid = inVpid;
 | 
|---|
| [2896] | 1061 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 1062 |         exit(0);
 | 
|---|
 | 1063 |     }
 | 
|---|
| [2830] | 1064 |     if (vpid < 0) {
 | 
|---|
 | 1065 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 1066 |     }
 | 
|---|
 | 1067 |     if (vpid < 0) {
 | 
|---|
 | 1068 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 1069 |         vInfo.push_back(vi);
 | 
|---|
 | 1070 |         vpid = 0;
 | 
|---|
 | 1071 |     }
 | 
|---|
 | 1072 | 
 | 
|---|
 | 1073 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 1074 | 
 | 
|---|
 | 1075 |     Plotter2RectInfo ri;
 | 
|---|
 | 1076 |     ri.xmin  = xmin;
 | 
|---|
 | 1077 |     ri.xmax  = xmax;
 | 
|---|
| [2861] | 1078 |     //y-range of xmask should be calculated in plot().
 | 
|---|
 | 1079 |     //std::vector<float> yrange = vi->getRangeY();
 | 
|---|
 | 1080 |     //float yexcess = 0.1*(yrange[1] - yrange[0]);
 | 
|---|
 | 1081 |     //ri.ymin  = yrange[0] - yexcess;
 | 
|---|
 | 1082 |     //ri.ymax  = yrange[1] + yexcess;
 | 
|---|
| [2830] | 1083 |     ri.color = color;
 | 
|---|
 | 1084 |     ri.fill  = fill;
 | 
|---|
 | 1085 |     ri.width = width;
 | 
|---|
 | 1086 |     ri.hsep  = hsep;
 | 
|---|
 | 1087 | 
 | 
|---|
 | 1088 |     vi->vRect.push_back(ri);
 | 
|---|
 | 1089 | }
 | 
|---|
 | 1090 | 
 | 
|---|
| [2896] | 1091 | void Plotter2::setArrow(const float xtail, const float xhead, const float ytail, 
 | 
|---|
 | 1092 |                           const float yhead, const int color, const int width, 
 | 
|---|
 | 1093 |                           const int lineStyle, const float headSize, 
 | 
|---|
 | 1094 |                           const int headFillStyle, const float headAngle, 
 | 
|---|
 | 1095 |                           const float headVent, const int inVpid, const int inArrowid) {
 | 
|---|
 | 1096 |     int vpid = inVpid;
 | 
|---|
 | 1097 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 1098 |         exit(0);
 | 
|---|
 | 1099 |     }
 | 
|---|
 | 1100 |     if (vpid < 0) {
 | 
|---|
 | 1101 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 1102 |     }
 | 
|---|
 | 1103 |     if (vpid < 0) {
 | 
|---|
 | 1104 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 1105 |         vInfo.push_back(vi);
 | 
|---|
 | 1106 |         vpid = 0;
 | 
|---|
 | 1107 |     }
 | 
|---|
 | 1108 | 
 | 
|---|
 | 1109 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 1110 | 
 | 
|---|
 | 1111 |     int arrowid = inArrowid;
 | 
|---|
 | 1112 |     if (arrowid < 0) {
 | 
|---|
 | 1113 |         Plotter2ArrowInfo ai;
 | 
|---|
 | 1114 |         vi->vArro.push_back(ai);
 | 
|---|
 | 1115 |         arrowid = vi->vArro.size() - 1;
 | 
|---|
 | 1116 |     } else if (arrowid >= (int)vi->vArro.size()) {
 | 
|---|
 | 1117 |         exit(0);
 | 
|---|
 | 1118 |     }
 | 
|---|
 | 1119 | 
 | 
|---|
 | 1120 |     Plotter2ArrowInfo* ai = &vi->vArro[arrowid];
 | 
|---|
 | 1121 | 
 | 
|---|
 | 1122 |     ai->xhead = xhead;
 | 
|---|
 | 1123 |     ai->xtail = xtail;
 | 
|---|
 | 1124 |     ai->yhead = yhead;
 | 
|---|
 | 1125 |     ai->ytail = ytail;
 | 
|---|
 | 1126 |     ai->color = color;
 | 
|---|
 | 1127 |     ai->width = width;
 | 
|---|
 | 1128 |     ai->lineStyle = lineStyle;
 | 
|---|
 | 1129 |     ai->headSize = headSize;
 | 
|---|
 | 1130 |     ai->headFillStyle = headFillStyle;
 | 
|---|
 | 1131 |     ai->headAngle = headAngle;
 | 
|---|
 | 1132 |     ai->headVent = headVent;
 | 
|---|
 | 1133 | }
 | 
|---|
 | 1134 | 
 | 
|---|
 | 1135 | void 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, const int inAnnid) {
 | 
|---|
 | 1136 |     int vpid = inVpid;
 | 
|---|
 | 1137 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 1138 |         exit(0);
 | 
|---|
 | 1139 |     }
 | 
|---|
 | 1140 |     if (vpid < 0) {
 | 
|---|
 | 1141 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 1142 |     }
 | 
|---|
 | 1143 |     if (vpid < 0) {
 | 
|---|
 | 1144 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 1145 |         vInfo.push_back(vi);
 | 
|---|
 | 1146 |         vpid = 0;
 | 
|---|
 | 1147 |     }
 | 
|---|
 | 1148 | 
 | 
|---|
 | 1149 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 1150 | 
 | 
|---|
 | 1151 |     int annotationid = inAnnid;
 | 
|---|
 | 1152 |     if (annotationid < 0) {
 | 
|---|
 | 1153 |         Plotter2AnnotationInfo ai;
 | 
|---|
 | 1154 |         vi->vAnno.push_back(ai);
 | 
|---|
 | 1155 |         annotationid = vi->vAnno.size() - 1;
 | 
|---|
 | 1156 |     } else if (annotationid >= (int)vi->vAnno.size()) {
 | 
|---|
 | 1157 |         exit(0);
 | 
|---|
 | 1158 |     }
 | 
|---|
 | 1159 | 
 | 
|---|
 | 1160 |     Plotter2AnnotationInfo* ai = &vi->vAnno[annotationid];
 | 
|---|
 | 1161 | 
 | 
|---|
 | 1162 |     std::string styleString;
 | 
|---|
 | 1163 |     if (style == "") {
 | 
|---|
 | 1164 |       styleString = "";
 | 
|---|
 | 1165 |     } else if (style == "roman") {
 | 
|---|
 | 1166 |       styleString = "\\fr";
 | 
|---|
 | 1167 |     } else if (style == "italic") {
 | 
|---|
 | 1168 |       styleString = "\\fi";
 | 
|---|
 | 1169 |     } else if (style == "script") {
 | 
|---|
 | 1170 |       styleString = "\\fs";
 | 
|---|
 | 1171 |     }
 | 
|---|
 | 1172 | 
 | 
|---|
 | 1173 |     ai->text = styleString + label;
 | 
|---|
 | 1174 |     ai->posx = posx;
 | 
|---|
 | 1175 |     ai->posy = posy;
 | 
|---|
 | 1176 |     ai->angle = angle;
 | 
|---|
 | 1177 |     ai->fjust = fjust;
 | 
|---|
 | 1178 |     ai->size = size;
 | 
|---|
 | 1179 |     ai->color = color;
 | 
|---|
 | 1180 |     ai->bgcolor = bgcolor;
 | 
|---|
 | 1181 | }
 | 
|---|
 | 1182 | 
 | 
|---|
| [2830] | 1183 | void 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) {
 | 
|---|
 | 1184 |     int vpid = inVpid;
 | 
|---|
| [2896] | 1185 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 1186 |         exit(0);
 | 
|---|
 | 1187 |     }
 | 
|---|
| [2830] | 1188 |     if (vpid < 0) {
 | 
|---|
 | 1189 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 1190 |     }
 | 
|---|
 | 1191 |     if (vpid < 0) {
 | 
|---|
 | 1192 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 1193 |         vInfo.push_back(vi);
 | 
|---|
 | 1194 |         vpid = 0;
 | 
|---|
 | 1195 |     }
 | 
|---|
 | 1196 | 
 | 
|---|
 | 1197 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 1198 | 
 | 
|---|
 | 1199 |     std::string styleString;
 | 
|---|
 | 1200 |     if (style == "") {
 | 
|---|
 | 1201 |       styleString = "";
 | 
|---|
 | 1202 |     } else if (style == "roman") {
 | 
|---|
 | 1203 |       styleString = "\\fr";
 | 
|---|
 | 1204 |     } else if (style == "italic") {
 | 
|---|
 | 1205 |       styleString = "\\fi";
 | 
|---|
 | 1206 |     } else if (style == "script") {
 | 
|---|
 | 1207 |       styleString = "\\fs";
 | 
|---|
 | 1208 |     }
 | 
|---|
 | 1209 |     vi->labelXString = styleString + label;
 | 
|---|
 | 1210 | 
 | 
|---|
 | 1211 |     float posx = inPosx;
 | 
|---|
 | 1212 |     if (posx < 0.0) {
 | 
|---|
 | 1213 |         posx = 0.5*(vi->vpPosXMin + vi->vpPosXMax);
 | 
|---|
 | 1214 |     }
 | 
|---|
 | 1215 |     vi->labelXPosX   = posx;
 | 
|---|
 | 1216 | 
 | 
|---|
 | 1217 |     float posy = inPosy;
 | 
|---|
 | 1218 |     if (posy < 0.0) {
 | 
|---|
 | 1219 |         posy = 0.35*vi->vpPosYMin;
 | 
|---|
 | 1220 |     }
 | 
|---|
 | 1221 |     vi->labelXPosY   = posy;
 | 
|---|
 | 1222 | 
 | 
|---|
 | 1223 |     vi->labelXAngle  = 0.0;
 | 
|---|
 | 1224 |     vi->labelXFJust  = 0.5;
 | 
|---|
 | 1225 |     vi->labelXSize   = size;
 | 
|---|
 | 1226 |     vi->labelXColor  = color;
 | 
|---|
 | 1227 |     vi->labelXBColor = bgcolor;
 | 
|---|
 | 1228 | }
 | 
|---|
 | 1229 | 
 | 
|---|
 | 1230 | void 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) {
 | 
|---|
 | 1231 |     int vpid = inVpid;
 | 
|---|
| [2896] | 1232 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 1233 |         exit(0);
 | 
|---|
 | 1234 |     }
 | 
|---|
| [2830] | 1235 |     if (vpid < 0) {
 | 
|---|
 | 1236 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 1237 |     }
 | 
|---|
 | 1238 |     if (vpid < 0) {
 | 
|---|
 | 1239 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 1240 |         vInfo.push_back(vi);
 | 
|---|
 | 1241 |         vpid = 0;
 | 
|---|
 | 1242 |     }
 | 
|---|
 | 1243 | 
 | 
|---|
 | 1244 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 1245 | 
 | 
|---|
 | 1246 |     std::string styleString;
 | 
|---|
 | 1247 |     if (style == "") {
 | 
|---|
 | 1248 |       styleString = "";
 | 
|---|
 | 1249 |     } else if (style == "roman") {
 | 
|---|
 | 1250 |       styleString = "\\fr";
 | 
|---|
 | 1251 |     } else if (style == "italic") {
 | 
|---|
 | 1252 |       styleString = "\\fi";
 | 
|---|
 | 1253 |     } else if (style == "script") {
 | 
|---|
 | 1254 |       styleString = "\\fs";
 | 
|---|
 | 1255 |     }
 | 
|---|
 | 1256 |     vi->labelYString = styleString + label;
 | 
|---|
 | 1257 | 
 | 
|---|
 | 1258 |     float posx = inPosx;
 | 
|---|
 | 1259 |     if (posx < 0.0) {
 | 
|---|
 | 1260 |         posx = 0.35*vi->vpPosXMin;
 | 
|---|
 | 1261 |     }
 | 
|---|
 | 1262 |     vi->labelYPosX   = posx;
 | 
|---|
 | 1263 | 
 | 
|---|
 | 1264 |     float posy = inPosy;
 | 
|---|
 | 1265 |     if (posy < 0.0) {
 | 
|---|
 | 1266 |         posy = 0.5*(vi->vpPosYMin + vi->vpPosYMax);
 | 
|---|
 | 1267 |     }
 | 
|---|
 | 1268 |     vi->labelYPosY   = posy;
 | 
|---|
 | 1269 | 
 | 
|---|
 | 1270 |     vi->labelYAngle  = 90.0;
 | 
|---|
 | 1271 |     vi->labelYFJust  = 0.5;
 | 
|---|
 | 1272 |     vi->labelYSize   = size;
 | 
|---|
 | 1273 |     vi->labelYColor  = color;
 | 
|---|
 | 1274 |     vi->labelYBColor = bgcolor;
 | 
|---|
 | 1275 | }
 | 
|---|
 | 1276 | 
 | 
|---|
 | 1277 | void 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) {
 | 
|---|
 | 1278 |     int vpid = inVpid;
 | 
|---|
| [2896] | 1279 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 1280 |         exit(0);
 | 
|---|
 | 1281 |     }
 | 
|---|
| [2830] | 1282 |     if (vpid < 0) {
 | 
|---|
 | 1283 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 1284 |     }
 | 
|---|
 | 1285 |     if (vpid < 0) {
 | 
|---|
 | 1286 |         Plotter2ViewportInfo vi;
 | 
|---|
 | 1287 |         vInfo.push_back(vi);
 | 
|---|
 | 1288 |         vpid = 0;
 | 
|---|
 | 1289 |     }
 | 
|---|
 | 1290 | 
 | 
|---|
 | 1291 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 1292 | 
 | 
|---|
 | 1293 |     std::string styleString;
 | 
|---|
 | 1294 |     if (style == "") {
 | 
|---|
 | 1295 |       styleString = "";
 | 
|---|
 | 1296 |     } else if (style == "roman") {
 | 
|---|
 | 1297 |       styleString = "\\fr";
 | 
|---|
 | 1298 |     } else if (style == "italic") {
 | 
|---|
 | 1299 |       styleString = "\\fi";
 | 
|---|
 | 1300 |     } else if (style == "script") {
 | 
|---|
 | 1301 |       styleString = "\\fs";
 | 
|---|
 | 1302 |     }
 | 
|---|
 | 1303 |     vi->titleString = styleString + label;
 | 
|---|
 | 1304 | 
 | 
|---|
 | 1305 |     float posx = inPosx;
 | 
|---|
 | 1306 |     if (posx < 0.0) {
 | 
|---|
 | 1307 |         posx = 0.5*(vi->vpPosXMin + vi->vpPosXMax);
 | 
|---|
 | 1308 |     }
 | 
|---|
 | 1309 |     vi->titlePosX   = posx;
 | 
|---|
 | 1310 | 
 | 
|---|
 | 1311 |     float posy = inPosy;
 | 
|---|
 | 1312 |     if (posy < 0.0) {
 | 
|---|
 | 1313 |         posy = vi->vpPosYMax + 0.25*(1.0 - vi->vpPosYMax);
 | 
|---|
 | 1314 |     }
 | 
|---|
 | 1315 |     vi->titlePosY   = posy;
 | 
|---|
 | 1316 | 
 | 
|---|
 | 1317 |     vi->titleAngle  = 0.0;
 | 
|---|
 | 1318 |     vi->titleFJust  = 0.5;
 | 
|---|
 | 1319 |     vi->titleSize   = size;
 | 
|---|
 | 1320 |     vi->titleColor  = color;
 | 
|---|
 | 1321 |     vi->titleBColor = bgcolor;
 | 
|---|
 | 1322 | }
 | 
|---|
 | 1323 | 
 | 
|---|
 | 1324 | void Plotter2::setViewportBackgroundColor(const int bgcolor, const int inVpid) {
 | 
|---|
 | 1325 |     int vpid = inVpid;
 | 
|---|
| [2896] | 1326 |     if (vpid >= (int)vInfo.size()) {
 | 
|---|
 | 1327 |         exit(0);
 | 
|---|
 | 1328 |     }
 | 
|---|
| [2830] | 1329 |     if (vpid < 0) {
 | 
|---|
 | 1330 |         vpid = vInfo.size() - 1;
 | 
|---|
 | 1331 |     }
 | 
|---|
 | 1332 |     if (vpid < 0) {
 | 
|---|
 | 1333 |         exit(0);
 | 
|---|
 | 1334 |     }
 | 
|---|
 | 1335 | 
 | 
|---|
 | 1336 |     Plotter2ViewportInfo* vi = &vInfo[vpid];
 | 
|---|
 | 1337 |     vi->vpBColor = bgcolor;
 | 
|---|
 | 1338 | }
 | 
|---|
 | 1339 | 
 | 
|---|
 | 1340 | void Plotter2::close() {
 | 
|---|
 | 1341 |     if (hasDevice) {
 | 
|---|
 | 1342 |         cpgclos();
 | 
|---|
 | 1343 |         hasDevice = false;
 | 
|---|
 | 1344 |     }
 | 
|---|
 | 1345 | }
 | 
|---|
 | 1346 | 
 | 
|---|
| [2896] | 1347 | void Plotter2::resetAttributes(const Plotter2ViewportInfo& vi) {
 | 
|---|
 | 1348 |     cpgstbg(0); // reset background colour to the initial one (white)
 | 
|---|
 | 1349 |     cpgsci(1);  // reset foreground colour to the initial one (black)
 | 
|---|
 | 1350 |     cpgsls(1);  // reset line style to solid
 | 
|---|
 | 1351 |     cpgslw(1);  // reset line width to 1
 | 
|---|
 | 1352 |     cpgscf(1);  // reset font style to normal
 | 
|---|
 | 1353 |     cpgsch(vi.fontSizeDef);// reset font size
 | 
|---|
 | 1354 |     cpgsfs(1);  // reset fill style (solid)
 | 
|---|
 | 1355 | }
 | 
|---|
 | 1356 | 
 | 
|---|
| [2830] | 1357 | void Plotter2::plot() {
 | 
|---|
 | 1358 |     open();
 | 
|---|
 | 1359 | 
 | 
|---|
| [2895] | 1360 |     if ((width > 0.0) && (aspect > 0.0)) {
 | 
|---|
 | 1361 |         cpgpap(width, aspect);
 | 
|---|
 | 1362 |     }
 | 
|---|
 | 1363 | 
 | 
|---|
| [2830] | 1364 |     cpgscr(0, 1.0, 1.0, 1.0); // set background color white
 | 
|---|
 | 1365 |     cpgscr(1, 0.0, 0.0, 0.0); // set foreground color black
 | 
|---|
 | 1366 | 
 | 
|---|
| [2834] | 1367 |     for (unsigned int i = 0; i < vInfo.size(); ++i) {
 | 
|---|
| [2830] | 1368 |         Plotter2ViewportInfo vi = vInfo[i];
 | 
|---|
 | 1369 | 
 | 
|---|
 | 1370 |         if (vi.showViewport) {
 | 
|---|
| [2896] | 1371 |             resetAttributes(vi);
 | 
|---|
| [2830] | 1372 | 
 | 
|---|
 | 1373 |             // setup viewport
 | 
|---|
 | 1374 |             cpgsvp(vi.vpPosXMin, vi.vpPosXMax, vi.vpPosYMin, vi.vpPosYMax);
 | 
|---|
 | 1375 |             cpgswin(vi.vpRangeXMin, vi.vpRangeXMax, vi.vpRangeYMin, vi.vpRangeYMax);
 | 
|---|
 | 1376 | 
 | 
|---|
 | 1377 |             // background color (default is transparent)
 | 
|---|
 | 1378 |             if (vi.vpBColor >= 0) {
 | 
|---|
 | 1379 |                 cpgsci(vi.vpBColor);
 | 
|---|
 | 1380 |                 cpgrect(vi.vpRangeXMin, vi.vpRangeXMax, vi.vpRangeYMin, vi.vpRangeYMax);
 | 
|---|
 | 1381 |                 cpgsci(1);  // reset foreground colour to the initial one (black)
 | 
|---|
 | 1382 |             }
 | 
|---|
 | 1383 | 
 | 
|---|
 | 1384 |             // data
 | 
|---|
| [2834] | 1385 |             for (unsigned int j = 0; j < vi.vData.size(); ++j) {
 | 
|---|
| [2896] | 1386 |                 resetAttributes(vi);
 | 
|---|
| [2830] | 1387 | 
 | 
|---|
 | 1388 |                 Plotter2DataInfo di = vi.vData[j];
 | 
|---|
 | 1389 |                 std::vector<float> vxdata = di.xData;
 | 
|---|
 | 1390 |                 int ndata = vxdata.size();
 | 
|---|
 | 1391 |                 float* pxdata = new float[ndata];
 | 
|---|
 | 1392 |                 float* pydata = new float[ndata];
 | 
|---|
 | 1393 |                 for (int k = 0; k < ndata; ++k) {
 | 
|---|
 | 1394 |                     pxdata[k] = di.xData[k];
 | 
|---|
 | 1395 |                     pydata[k] = di.yData[k];
 | 
|---|
 | 1396 |                 }
 | 
|---|
 | 1397 | 
 | 
|---|
 | 1398 |                 if (di.drawLine) {
 | 
|---|
 | 1399 |                     cpgsls(di.lineStyle);
 | 
|---|
 | 1400 |                     cpgslw(di.lineWidth);
 | 
|---|
 | 1401 |                     int colorIdx = di.lineColor;
 | 
|---|
 | 1402 |                     if (colorIdx < 0) {
 | 
|---|
 | 1403 |                         colorIdx = (j + 1) % 15 + 1;
 | 
|---|
 | 1404 |                     }
 | 
|---|
 | 1405 |                     cpgsci(colorIdx);
 | 
|---|
 | 1406 |                     cpgline(ndata, pxdata, pydata);
 | 
|---|
 | 1407 |                 }
 | 
|---|
 | 1408 | 
 | 
|---|
 | 1409 |                 if (di.drawMarker) {
 | 
|---|
 | 1410 |                     cpgsch(di.markerSize);
 | 
|---|
 | 1411 |                     cpgsci(di.markerColor);
 | 
|---|
 | 1412 |                     cpgpt(ndata, pxdata, pydata, di.markerType);
 | 
|---|
 | 1413 |                 }
 | 
|---|
 | 1414 | 
 | 
|---|
 | 1415 |                 delete [] pxdata;
 | 
|---|
 | 1416 |                 delete [] pydata;
 | 
|---|
 | 1417 |             }
 | 
|---|
 | 1418 | 
 | 
|---|
| [2861] | 1419 |             //calculate y-range of xmasks
 | 
|---|
 | 1420 |             std::vector<float> yrange = vi.getRangeY();
 | 
|---|
 | 1421 |             float yexcess = 0.1*(yrange[1] - yrange[0]);
 | 
|---|
 | 1422 |             float xmaskymin = yrange[0] - yexcess;
 | 
|---|
 | 1423 |             float xmaskymax = yrange[1] + yexcess;
 | 
|---|
 | 1424 | 
 | 
|---|
| [2830] | 1425 |             // masks
 | 
|---|
| [2834] | 1426 |             for (unsigned int j = 0; j < vi.vRect.size(); ++j) {
 | 
|---|
| [2896] | 1427 |                 resetAttributes(vi);
 | 
|---|
| [2830] | 1428 | 
 | 
|---|
 | 1429 |                 Plotter2RectInfo ri = vi.vRect[j];
 | 
|---|
 | 1430 |                 cpgsci(ri.color);
 | 
|---|
 | 1431 |                 cpgsfs(ri.fill);
 | 
|---|
 | 1432 |                 cpgslw(ri.width);
 | 
|---|
 | 1433 |                 cpgshs(45.0, ri.hsep, 0.0);
 | 
|---|
 | 1434 |                 float* mxdata = new float[4];
 | 
|---|
 | 1435 |                 float* mydata = new float[4];
 | 
|---|
 | 1436 |                 mxdata[0] = ri.xmin;
 | 
|---|
 | 1437 |                 mxdata[1] = ri.xmax;
 | 
|---|
 | 1438 |                 mxdata[2] = ri.xmax;
 | 
|---|
 | 1439 |                 mxdata[3] = ri.xmin;
 | 
|---|
| [2861] | 1440 |                 mydata[0] = xmaskymin;
 | 
|---|
 | 1441 |                 mydata[1] = xmaskymin;
 | 
|---|
 | 1442 |                 mydata[2] = xmaskymax;
 | 
|---|
 | 1443 |                 mydata[3] = xmaskymax;
 | 
|---|
| [2830] | 1444 |                 cpgpoly(4, mxdata, mydata);
 | 
|---|
 | 1445 |             }
 | 
|---|
 | 1446 | 
 | 
|---|
| [2896] | 1447 |             // arrows
 | 
|---|
 | 1448 |             for (unsigned int j = 0; j < vi.vArro.size(); ++j) {
 | 
|---|
 | 1449 |                 resetAttributes(vi);
 | 
|---|
| [2830] | 1450 | 
 | 
|---|
| [2896] | 1451 |                 Plotter2ArrowInfo ai = vi.vArro[j];
 | 
|---|
 | 1452 |                 cpgsci(ai.color);
 | 
|---|
 | 1453 |                 cpgslw(ai.width);
 | 
|---|
 | 1454 |                 cpgsls(ai.lineStyle);
 | 
|---|
 | 1455 |                 cpgsch(ai.headSize);
 | 
|---|
 | 1456 |                 cpgsah(ai.headFillStyle, ai.headAngle, ai.headVent);
 | 
|---|
 | 1457 |                 cpgarro(ai.xtail, ai.ytail, ai.xhead, ai.yhead);
 | 
|---|
 | 1458 |             }
 | 
|---|
 | 1459 | 
 | 
|---|
 | 1460 |             // annotations
 | 
|---|
 | 1461 |             for (unsigned int j = 0; j < vi.vAnno.size(); ++j) {
 | 
|---|
 | 1462 |                 resetAttributes(vi);
 | 
|---|
 | 1463 | 
 | 
|---|
 | 1464 |                 Plotter2AnnotationInfo ai = vi.vAnno[j];
 | 
|---|
 | 1465 |                 cpgsch(ai.size);
 | 
|---|
 | 1466 |                 cpgsci(ai.color);
 | 
|---|
 | 1467 |                 cpgstbg(ai.bgcolor);
 | 
|---|
 | 1468 |                 cpgptxt(ai.posx, ai.posy, ai.angle, ai.fjust, ai.text.c_str());
 | 
|---|
 | 1469 |             }
 | 
|---|
 | 1470 | 
 | 
|---|
 | 1471 |             // viewport outline and ticks
 | 
|---|
 | 1472 |             resetAttributes(vi);
 | 
|---|
 | 1473 | 
 | 
|---|
| [2830] | 1474 |             cpgbox("BCTS",  vi.majorTickIntervalX, vi.nMinorTickWithinMajorTicksX, 
 | 
|---|
 | 1475 |                    "BCTSV", vi.majorTickIntervalY, vi.nMinorTickWithinMajorTicksY);
 | 
|---|
 | 1476 | 
 | 
|---|
| [2896] | 1477 |             // viewport numberings
 | 
|---|
| [2830] | 1478 |             std::string numformatx, numformaty;
 | 
|---|
| [2861] | 1479 |             if (vi.numLocationX == "b") {
 | 
|---|
| [2830] | 1480 |                 numformatx = "N";
 | 
|---|
| [2861] | 1481 |             } else if (vi.numLocationX == "t") {
 | 
|---|
| [2830] | 1482 |                 numformatx = "M";
 | 
|---|
 | 1483 |             } else if (vi.numLocationX == "") {
 | 
|---|
 | 1484 |                 numformatx = "";
 | 
|---|
 | 1485 |             }
 | 
|---|
| [2861] | 1486 |             if (vi.numLocationY == "l") {
 | 
|---|
| [2830] | 1487 |                 numformaty = "NV";
 | 
|---|
| [2861] | 1488 |             } else if (vi.numLocationY == "r") {
 | 
|---|
| [2830] | 1489 |                 numformaty = "MV";
 | 
|---|
 | 1490 |             } else if (vi.numLocationY == "") {
 | 
|---|
 | 1491 |                 numformaty = "";
 | 
|---|
 | 1492 |             }
 | 
|---|
 | 1493 | 
 | 
|---|
 | 1494 |             cpgbox(numformatx.c_str(), vi.majorTickIntervalX * vi.nMajorTickWithinTickNumsX, 0, 
 | 
|---|
 | 1495 |                    numformaty.c_str(), vi.majorTickIntervalY * vi.nMajorTickWithinTickNumsY, 0);
 | 
|---|
 | 1496 | 
 | 
|---|
 | 1497 |             float xpos, ypos;
 | 
|---|
 | 1498 | 
 | 
|---|
 | 1499 |             // x-label
 | 
|---|
 | 1500 |             vi.getWorldCoordByWindowCoord(vi.labelXPosX, vi.labelXPosY, &xpos, &ypos);
 | 
|---|
 | 1501 |             cpgsch(vi.labelXSize);
 | 
|---|
 | 1502 |             cpgsci(vi.labelXColor);
 | 
|---|
 | 1503 |             cpgstbg(vi.labelXBColor); //outside viewports, works ONLY with /xwindow
 | 
|---|
 | 1504 |             cpgptxt(xpos, ypos, vi.labelXAngle, vi.labelXFJust, vi.labelXString.c_str());
 | 
|---|
 | 1505 | 
 | 
|---|
 | 1506 |             // y-label
 | 
|---|
 | 1507 |             vi.getWorldCoordByWindowCoord(vi.labelYPosX, vi.labelYPosY, &xpos, &ypos);
 | 
|---|
 | 1508 |             cpgsch(vi.labelYSize);
 | 
|---|
 | 1509 |             cpgsci(vi.labelYColor);
 | 
|---|
 | 1510 |             cpgstbg(vi.labelYBColor); //outside viewports, works ONLY with /xwindow
 | 
|---|
 | 1511 |             cpgptxt(xpos, ypos, vi.labelYAngle, vi.labelYFJust, vi.labelYString.c_str());
 | 
|---|
 | 1512 | 
 | 
|---|
 | 1513 |             // title
 | 
|---|
 | 1514 |             vi.getWorldCoordByWindowCoord(vi.titlePosX, vi.titlePosY, &xpos, &ypos);
 | 
|---|
 | 1515 |             cpgsch(vi.titleSize);
 | 
|---|
 | 1516 |             cpgsci(vi.titleColor);
 | 
|---|
 | 1517 |             cpgstbg(vi.titleBColor); //outside viewports, works ONLY with /xwindow
 | 
|---|
 | 1518 |             cpgptxt(xpos, ypos, vi.titleAngle, vi.titleFJust, vi.titleString.c_str());
 | 
|---|
 | 1519 |         }
 | 
|---|
 | 1520 | 
 | 
|---|
 | 1521 |     }
 | 
|---|
 | 1522 | 
 | 
|---|
 | 1523 |     close();
 | 
|---|
 | 1524 | }
 | 
|---|
 | 1525 | 
 | 
|---|
 | 1526 | } // namespace asap
 | 
|---|