Blame view

src/ParamOutputImpl/Plot/PanelPlotOutput.cc 127 KB
fbe3c2bb   Benjamin Renard   First commit
1
2
3
4
5
6
7
8
/*
 * PanelPlotOutput.cc
 *
 *  Created on: 29 oct. 2013
 *      Author: CS
 */

#include "PanelPlotOutput.hh"
ba6124b0   Menouard AZIB   Add parameter id ...
9
#include "Catalog.hh"
fbe3c2bb   Benjamin Renard   First commit
10
#include "ColorAxis.hh"
ba6124b0   Menouard AZIB   Add parameter id ...
11
12
#include "ColormapManager.hh"
#include "DecoratorPlot.hh"
fbe3c2bb   Benjamin Renard   First commit
13
#include "Page.hh"
fbe3c2bb   Benjamin Renard   First commit
14
#include "ParamMgr.hh"
ba6124b0   Menouard AZIB   Add parameter id ...
15
#include "ParameterManager.hh"
f6eaec4e   Benjamin Renard   Optimize plot ele...
16
#include "PlPlotUtil.hh"
ba6124b0   Menouard AZIB   Add parameter id ...
17
18
#include "PlotLogger.hh"
#include "ShadesTools.hh"
eddfb311   Erdogan Furkan   9326 - Modificita...
19
#include "TimeTableCatalogFactory.hh"
ba6124b0   Menouard AZIB   Add parameter id ...
20
#include "TimeUtil.hh"
fbe3c2bb   Benjamin Renard   First commit
21

8bb0f02b   Benjamin Renard   Set colors in axi...
22
#include <boost/range/adaptor/reversed.hpp>
ba6124b0   Menouard AZIB   Add parameter id ...
23
#include <string>
fbe3c2bb   Benjamin Renard   First commit
24
25
26
27

using namespace AMDA::Parameters;
using namespace AMDA::Info;

ba6124b0   Menouard AZIB   Add parameter id ...
28
namespace plot
fbe3c2bb   Benjamin Renard   First commit
29
{
ba6124b0   Menouard AZIB   Add parameter id ...
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

	/**
	 * Width character proportion is approximatively 0.83 times smaller than height.
	 */
	const float PanelPlotOutput::CHAR_RATIO = 5. / 6.;

	const float PanelPlotOutput::DEFAULT_TICK_LENGTH_FACTOR = 0.75;

	// Vertical is for Y axis.
	const float PanelPlotOutput::VERTICAL_TICK_LENGTH_LIMIT = 0.5;
	// Horizontal is for X axis.
	const float PanelPlotOutput::HORIZONTAL_TICK_LENGTH_LIMIT = 0.75;
	// margin in case of constante curve
	const float YAXISMARGIN = 0.05;

1d1a3b8a   Erdogan Furkan   Done for tickPlot...
45
46
47
48
49
50
51
52
53
54
	PanelPlotOutput::PanelPlotOutput(AMDA::Parameters::ParameterManager &manager, boost::shared_ptr<Panel> panel, bool isStandalone) : 
									_panel(panel),
									_parameterManager(manager),
									_pParameterValues(NULL),
									_timeIntervalListPtr(NULL),
									_panelPlotXYRatio(1),
									_leftAxisTickMarkWidth(0),
									_automaticSerieColorCursor(0),
									_isStandalone(isStandalone),
									_isHeightFixed(false)
fbe3c2bb   Benjamin Renard   First commit
55
	{
ba6124b0   Menouard AZIB   Add parameter id ...
56
57
58
59
60
	}

	PanelPlotOutput::~PanelPlotOutput()
	{
	}
fbe3c2bb   Benjamin Renard   First commit
61

ba6124b0   Menouard AZIB   Add parameter id ...
62
63
64
65
66
	double getVerticalTickLength(Axis *pAxis, double charHeight)
	{
		float horizontalTickLengthLimit = PanelPlotOutput::HORIZONTAL_TICK_LENGTH_LIMIT;
		float defaultTickLengthFactor = PanelPlotOutput::DEFAULT_TICK_LENGTH_FACTOR;
		double tickLengthFactor = pAxis->_tick._lengthFactor;
fbe3c2bb   Benjamin Renard   First commit
67

ba6124b0   Menouard AZIB   Add parameter id ...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
		if ((!isnan(tickLengthFactor)) && (tickLengthFactor > horizontalTickLengthLimit))
		{
			// 1 character size is equal to 0.75 tick length.
			return charHeight + (((tickLengthFactor - horizontalTickLengthLimit) * charHeight) / (defaultTickLengthFactor));
		}
		else if ((isnan(tickLengthFactor)) && (defaultTickLengthFactor > horizontalTickLengthLimit))
		{
			// 1 character size is equal to 0.75 tick length.
			return charHeight + (((defaultTickLengthFactor - horizontalTickLengthLimit) * charHeight) / (defaultTickLengthFactor));
		}
		else
		{
			return charHeight;
		}
fbe3c2bb   Benjamin Renard   First commit
82
83
	}

ba6124b0   Menouard AZIB   Add parameter id ...
84
85
86
87
88
	double getHorizontalTickLength(Axis *pAxis, double charHeight)
	{
		float verticalTickLengthLimit = PanelPlotOutput::VERTICAL_TICK_LENGTH_LIMIT;
		float defaultTickLengthFactor = PanelPlotOutput::DEFAULT_TICK_LENGTH_FACTOR;
		double tickLengthFactor = pAxis->_tick._lengthFactor;
fbe3c2bb   Benjamin Renard   First commit
89

ba6124b0   Menouard AZIB   Add parameter id ...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
		if ((!isnan(tickLengthFactor)) && (tickLengthFactor > verticalTickLengthLimit))
		{
			// 1 character size is equal to 0.75 tick length.
			return charHeight + (((tickLengthFactor - verticalTickLengthLimit) * charHeight * PanelPlotOutput::CHAR_RATIO) / (defaultTickLengthFactor));
		}
		else if ((isnan(tickLengthFactor)) && (defaultTickLengthFactor > verticalTickLengthLimit))
		{
			// 1 character size is equal to 0.75 tick length.
			return charHeight + (((defaultTickLengthFactor - verticalTickLengthLimit) * charHeight * PanelPlotOutput::CHAR_RATIO) / (defaultTickLengthFactor));
		}
		else
		{
			return charHeight;
		}
	}
fbe3c2bb   Benjamin Renard   First commit
105

ba6124b0   Menouard AZIB   Add parameter id ...
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
	void PanelPlotOutput::calculatePlotArea(const Bounds & /*panelBounds_*/, Bounds &bounds_)
	{
		double topSpace = 0;
		double bottomSpace = 0;
		double leftSpace = 0;
		double rightSpace = 0;

		// Init
		_plotAreaSideSet[PlotCommon::Position::POS_TOP] = false;
		_plotAreaSideSet[PlotCommon::Position::POS_BOTTOM] = false;
		_plotAreaSideSet[PlotCommon::Position::POS_RIGHT] = false;
		_plotAreaSideSet[PlotCommon::Position::POS_LEFT] = false;
		_plotAreaSideSet[PlotCommon::Position::POS_CENTER] = false;

		// Reserve space for title
		double titleHeight = 0;
		_panel->reserveSpaceForTitle(topSpace, bottomSpace, titleHeight);

		// Reserve space for axes

		//
		std::map<PlotCommon::Position, int> nbAxesBySide;
		nbAxesBySide[PlotCommon::Position::POS_TOP] = 0;
		nbAxesBySide[PlotCommon::Position::POS_BOTTOM] = 0;
		nbAxesBySide[PlotCommon::Position::POS_RIGHT] = 0;
		nbAxesBySide[PlotCommon::Position::POS_LEFT] = 0;
		for (Axes::iterator it = _panel->_axes.begin(); it != _panel->_axes.end(); ++it)
		{
			boost::shared_ptr<Axis> lAxis = it->second;
			if ((lAxis == nullptr) || (lAxis->_isZAxis) || (!lAxis->_used) || (!lAxis->_visible) || (lAxis->_position == PlotCommon::Position::POS_CENTER))
				continue;
			++nbAxesBySide[lAxis->_position];
		}
62024e03   Erdogan Furkan   Some modifications
139

ba6124b0   Menouard AZIB   Add parameter id ...
140
141
142
143
144
145
146
147
148
		// ZAxis must be drawn at last!
		for (Axes::iterator it = _panel->_axes.begin(); it != _panel->_axes.end(); ++it)
		{
			// Add X and Y axis
			boost::shared_ptr<Axis> lAxis = it->second;
			if ((lAxis == nullptr) || (lAxis->_isZAxis))
				continue;
			reserveSpaceForAxis(lAxis, titleHeight, nbAxesBySide, topSpace, bottomSpace, leftSpace, rightSpace);
		}
f6eaec4e   Benjamin Renard   Optimize plot ele...
149

ba6124b0   Menouard AZIB   Add parameter id ...
150
151
152
153
154
155
156
157
		for (Axes::iterator it = _panel->_axes.begin(); it != _panel->_axes.end(); ++it)
		{
			// Add Z axis
			boost::shared_ptr<Axis> lAxis = it->second;
			if ((lAxis == nullptr) || (!lAxis->_isZAxis))
				continue;
			reserveSpaceForAxis(lAxis, titleHeight, nbAxesBySide, topSpace, bottomSpace, leftSpace, rightSpace);
		}
fbe3c2bb   Benjamin Renard   First commit
158

ba6124b0   Menouard AZIB   Add parameter id ...
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
		// Get character size for panel.
		PlPlotUtil::setPlFont(_panel->getFont());
		CharSize lCharSizePanel = PlPlotUtil::getCharacterSizeInPlPage(_panel->_page);
		double panelCharWidth = lCharSizePanel.first;
		double panelCharHeight = lCharSizePanel.second;

		// add params legend right space when outside
		if (!_panel->_paramsLegendProperties.getLegendLines().empty() &&
			_panel->_paramsLegendProperties.isVisible() &&
			(_panel->_paramsLegendProperties.getPosition() == ParamsLegendPosition::POS_OUTSIDE))
		{
			PlPlotUtil::setPlFont(_panel->_paramsLegendProperties.getFont());
			CharSize lCharSizeLegend = PlPlotUtil::getCharacterSizeInPlPage(_panel->_page);
			double legendCharWidth = lCharSizeLegend.first;

			// set offset
			_panel->_paramsLegendProperties.setLeftOffset(rightSpace);

			// reserve place for legend
			rightSpace += _panel->_paramsLegendProperties.getEstimateWidth(legendCharWidth);
		}

		// Reserve space for text legend ( maximum 1 text legend by position
		/*bool	leftTextLegendFound		= false;
		bool	rightTextLegendFound 	= false;
		bool	topTextLegendFound 		= false;
		bool	bottomTextLegendFound 	= false; */

		for (auto textLegendProp : _panel->_textLegendPropertiesList)
		{
			bool toDraw = true;

			/*	switch (textLegendProp->getPosition()) {
				case TextLegendPosition::POS_LEFT :
					if (leftTextLegendFound)
						toDraw = false;
					leftTextLegendFound = true;
					break;
				case TextLegendPosition::POS_RIGHT :
					if (rightTextLegendFound)
						toDraw = false;
					rightTextLegendFound = true;
					break;
				case TextLegendPosition::POS_TOP :
					if (topTextLegendFound)
						toDraw = false;
					topTextLegendFound = true;
					break;
				case TextLegendPosition::POS_BOTTOM :
					if (bottomTextLegendFound)
						toDraw = false;
					bottomTextLegendFound = true;
					break;

			}*/

			if (toDraw)
				reserveSpaceForTextLegend(textLegendProp, titleHeight, topSpace, bottomSpace, leftSpace, rightSpace);
		}

		// Set specified left, right, top and bottom margins and display a warning
		// message if computed margins are bigger than specified ones
		if (_panel->_leftMargin != -1)
		{
			if ((_panel->_leftMargin * panelCharWidth) < leftSpace)
				LOG4CXX_WARN(gLogger, "Left margin for the panel was forced beyond computed size");
			leftSpace = _panel->_leftMargin * panelCharWidth;
		}
		if (_panel->_rightMargin != -1)
		{
			if ((_panel->_rightMargin * panelCharWidth) < rightSpace)
				LOG4CXX_WARN(gLogger, "Right margin for the panel was forced beyond computed size");
			rightSpace = _panel->_rightMargin * panelCharWidth;
		}
		if (_panel->_topMargin != -1)
		{
			if ((_panel->_topMargin * panelCharHeight) < topSpace)
				LOG4CXX_WARN(gLogger, "Top margin for the panel was forced beyond computed size");
			topSpace = _panel->_topMargin * panelCharHeight;
		}
		if (_panel->_bottomMargin != -1)
		{
			if ((_panel->_bottomMargin * panelCharHeight) < bottomSpace)
				LOG4CXX_WARN(gLogger, "Bottom margin for the panel was forced beyond computed size");
			bottomSpace = _panel->_bottomMargin * panelCharHeight;
		}
fbe3c2bb   Benjamin Renard   First commit
245

ba6124b0   Menouard AZIB   Add parameter id ...
246
247
248
249
250
251
		// Update plot area bounds
		bounds_._x += leftSpace;
		bounds_._y += bottomSpace;
		bounds_._width -= (leftSpace + rightSpace);
		bounds_._height -= (bottomSpace + topSpace);
	}
fbe3c2bb   Benjamin Renard   First commit
252

ba6124b0   Menouard AZIB   Add parameter id ...
253
254
255
256
257
	void PanelPlotOutput::reserveSpaceForAxis(boost::shared_ptr<Axis> &pAxis, double titleHeight, std::map<PlotCommon::Position, int> nbAxesBySide,
											  double &topSpace, double &bottomSpace, double &leftSpace, double &rightSpace)
	{
		if (pAxis == nullptr || !pAxis->_used || !pAxis->_visible)
			return;
f6eaec4e   Benjamin Renard   Optimize plot ele...
258

ba6124b0   Menouard AZIB   Add parameter id ...
259
260
261
262
		// Get number of line to draw for legend.
		int nbLegendRows = pAxis->_legend.getNbLines();
		if ((nbLegendRows == 0) && pAxis->_showLegend)
			nbLegendRows = 1;
f6eaec4e   Benjamin Renard   Optimize plot ele...
263

ba6124b0   Menouard AZIB   Add parameter id ...
264
265
266
267
		// Compute legend character size
		Font legendFont(pAxis->getLegendFont(this->_panel.get()));
		PlPlotUtil::setPlFont(legendFont);
		CharSize legendCharSizePanel = PlPlotUtil::getCharacterSizeInPlPage(_panel->_page);
f6eaec4e   Benjamin Renard   Optimize plot ele...
268

ba6124b0   Menouard AZIB   Add parameter id ...
269
		std::tuple<float, float> pageSize = _panel->_page->getSizeInMm();
f6eaec4e   Benjamin Renard   Optimize plot ele...
270

ba6124b0   Menouard AZIB   Add parameter id ...
271
272
273
		// Reserve place in relation with the axis position
		switch (pAxis->_position)
		{
f6eaec4e   Benjamin Renard   Optimize plot ele...
274
275
276
277
278
279
280
281
282
		case PlotCommon::Position::POS_BOTTOM:
			if (pAxis->isZAxis())
				LOG4CXX_WARN(gLogger, "PanelPlotOutput::calculatePlotArea: Unrecognized position for z axis '" << pAxis->_position << "'");

			// This attribute is used later (in function PanelPlotOutput::drawSeries).
			if (!pAxis->isZAxis())
				_plotAreaSideSet[pAxis->_position] = true;

			// Reserve space for ticks
ba6124b0   Menouard AZIB   Add parameter id ...
283
284
			if (pAxis->_tick._position == Tick::TickPosition::OUTWARDS)
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
285
286
				double tickSize = getVerticalTickLength(pAxis.get(), legendCharSizePanel.second);
				bottomSpace += tickSize;
bdc50075   Benjamin Renard   Fix bug for posit...
287
				if (nbAxesBySide[PlotCommon::Position::POS_TOP] == 0)
ba6124b0   Menouard AZIB   Add parameter id ...
288
					// add space for oposite axis
bdc50075   Benjamin Renard   Fix bug for posit...
289
					topSpace += tickSize;
f6eaec4e   Benjamin Renard   Optimize plot ele...
290
291
			}

ba6124b0   Menouard AZIB   Add parameter id ...
292
			// Reserve space for ticks labels
f6eaec4e   Benjamin Renard   Optimize plot ele...
293
294
295
296
			if (pAxis->_showTickMark == true)
				bottomSpace += legendCharSizePanel.second * (1 + 0.25);

			// Reserve space for legend
ba6124b0   Menouard AZIB   Add parameter id ...
297
298
			if ((pAxis->_showLegend == true) && (nbLegendRows != 0))
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
299
				bottomSpace += PlPlotUtil::LINE_SPACE_TITLE * legendCharSizePanel.second;
58b353d5   Benjamin Renard   Set to version 3.4.0
300
301
302
303
				double legendOffset = bottomSpace + 0.5 * legendCharSizePanel.second;
				if (!_panel->getTitle()->_text.empty() && (_panel->_titlePosition == PlotCommon::Position::POS_BOTTOM))
					legendOffset -= titleHeight;
				pAxis->setLegendOffset(legendOffset);
8bb0f02b   Benjamin Renard   Set colors in axi...
304
				bottomSpace += (nbLegendRows + PlPlotUtil::LINE_SPACE_TITLE * (nbLegendRows + 1)) * legendCharSizePanel.second;
f6eaec4e   Benjamin Renard   Optimize plot ele...
305
306
307
308
309
310
311
312
313
314
315
316
			}

			break;
		case PlotCommon::Position::POS_TOP:
			if (pAxis->isZAxis())
				LOG4CXX_WARN(gLogger, "PanelPlotOutput::calculatePlotArea: Unrecognized position for z axis '" << pAxis->_position << "'");

			// This attribute is used later (in function PanelPlotOutput::drawSeries).
			if (!pAxis->isZAxis())
				_plotAreaSideSet[pAxis->_position] = true;

			// Reserve space for ticks
ba6124b0   Menouard AZIB   Add parameter id ...
317
318
			if (pAxis->_tick._position == Tick::TickPosition::OUTWARDS)
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
319
320
				double tickSize = getVerticalTickLength(pAxis.get(), legendCharSizePanel.second);
				topSpace += tickSize;
bdc50075   Benjamin Renard   Fix bug for posit...
321
				if (nbAxesBySide[PlotCommon::Position::POS_BOTTOM] == 0)
ba6124b0   Menouard AZIB   Add parameter id ...
322
					// add space for oposite axis
bdc50075   Benjamin Renard   Fix bug for posit...
323
					bottomSpace += tickSize;
f6eaec4e   Benjamin Renard   Optimize plot ele...
324
325
			}

ba6124b0   Menouard AZIB   Add parameter id ...
326
			// Reserve space for ticks labels
f6eaec4e   Benjamin Renard   Optimize plot ele...
327
328
329
330
			if (pAxis->_showTickMark == true)
				topSpace += legendCharSizePanel.second * (1 + 0.25);

			// Reserve space for legend
ba6124b0   Menouard AZIB   Add parameter id ...
331
332
			if ((pAxis->_showLegend == true) && (nbLegendRows != 0))
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
333
				topSpace += PlPlotUtil::LINE_SPACE_TITLE * legendCharSizePanel.second;
58b353d5   Benjamin Renard   Set to version 3.4.0
334
335
336
337
				double legendOffset = topSpace - 0.5 * legendCharSizePanel.second;
				if (!_panel->getTitle()->_text.empty() && (_panel->_titlePosition == PlotCommon::Position::POS_TOP))
					legendOffset += titleHeight;
				pAxis->setLegendOffset(legendOffset);
f6eaec4e   Benjamin Renard   Optimize plot ele...
338
339
340
341
342
343
				topSpace += (nbLegendRows + PlPlotUtil::LINE_SPACE_TITLE * (nbLegendRows + 1)) * legendCharSizePanel.second;
			}

			break;
		case PlotCommon::Position::POS_LEFT:
			// Record axis offset used for multi-axes
ba6124b0   Menouard AZIB   Add parameter id ...
344
			pAxis->setAxisOffset(leftSpace);
f6eaec4e   Benjamin Renard   Optimize plot ele...
345

ba6124b0   Menouard AZIB   Add parameter id ...
346
347
			if (pAxis->isZAxis())
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
348
349
350
351
352
353
354
				leftSpace += estimateZAxisWidth(pAxis);
				break;
			}

			// This attribute is used later (in function PanelPlotOutput::drawSeries).
			_plotAreaSideSet[pAxis->_position] = true;

ba6124b0   Menouard AZIB   Add parameter id ...
355
			// Reserve space for ticks labels
f6eaec4e   Benjamin Renard   Optimize plot ele...
356
357
358
359
			if (pAxis->_showTickMark == true)
				leftSpace += legendCharSizePanel.first * (pAxis->getTickMarkSize().first + 2 * PlPlotUtil::LINE_SPACE_TITLE + 0.25);

			// Reserve space for ticks
ba6124b0   Menouard AZIB   Add parameter id ...
360
361
			if (pAxis->_tick._position == Tick::TickPosition::OUTWARDS)
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
362
363
				double tickSize = getHorizontalTickLength(pAxis.get(), legendCharSizePanel.second);
				leftSpace += tickSize;
bdc50075   Benjamin Renard   Fix bug for posit...
364
				if (nbAxesBySide[PlotCommon::Position::POS_RIGHT] == 0)
ba6124b0   Menouard AZIB   Add parameter id ...
365
					// add space for oposite axis
bdc50075   Benjamin Renard   Fix bug for posit...
366
					rightSpace += tickSize;
f6eaec4e   Benjamin Renard   Optimize plot ele...
367
368
369
			}

			// Reserve space for legend
ba6124b0   Menouard AZIB   Add parameter id ...
370
371
			if ((pAxis->_showLegend == true) && (nbLegendRows != 0))
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
372
373
				leftSpace += PlPlotUtil::LINE_SPACE_TITLE * legendCharSizePanel.second * std::get<1>(pageSize) / std::get<0>(pageSize);
				pAxis->setLegendOffset(leftSpace + 0.5 * legendCharSizePanel.second * std::get<1>(pageSize) / std::get<0>(pageSize));
ba6124b0   Menouard AZIB   Add parameter id ...
374
				leftSpace += (nbLegendRows + PlPlotUtil::LINE_SPACE_TITLE * (nbLegendRows + 1)) * legendCharSizePanel.second * std::get<1>(pageSize) / std::get<0>(pageSize);
f6eaec4e   Benjamin Renard   Optimize plot ele...
375
376
377
378
379
			}

			break;
		case PlotCommon::Position::POS_RIGHT:
			// Record axis offset used for multi-axes
b76d3cfc   Benjamin Renard   Fix color axis po...
380
			pAxis->setAxisOffset(rightSpace);
f6eaec4e   Benjamin Renard   Optimize plot ele...
381

ba6124b0   Menouard AZIB   Add parameter id ...
382
383
			if (pAxis->isZAxis())
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
384
385
386
387
388
389
390
				rightSpace += estimateZAxisWidth(pAxis);
				break;
			}

			// This attribute is used later (in function PanelPlotOutput::drawSeries).
			_plotAreaSideSet[pAxis->_position] = true;

ba6124b0   Menouard AZIB   Add parameter id ...
391
			// Reserve space for ticks labels
f6eaec4e   Benjamin Renard   Optimize plot ele...
392
393
394
395
			if (pAxis->_showTickMark == true)
				rightSpace += legendCharSizePanel.first * (pAxis->getTickMarkSize().first + 2 * PlPlotUtil::LINE_SPACE_TITLE + 0.25);

			// Reserve space for ticks
ba6124b0   Menouard AZIB   Add parameter id ...
396
397
			if (pAxis->_tick._position == Tick::TickPosition::OUTWARDS)
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
398
399
				double tickSize = getHorizontalTickLength(pAxis.get(), legendCharSizePanel.second);
				rightSpace += tickSize;
bdc50075   Benjamin Renard   Fix bug for posit...
400
				if (nbAxesBySide[PlotCommon::Position::POS_LEFT] == 0)
ba6124b0   Menouard AZIB   Add parameter id ...
401
					// add space for oposite axis
bdc50075   Benjamin Renard   Fix bug for posit...
402
					leftSpace += tickSize;
f6eaec4e   Benjamin Renard   Optimize plot ele...
403
404
			}

ba6124b0   Menouard AZIB   Add parameter id ...
405
406
407
			// Reserve space for legend
			if ((pAxis->_showLegend == true) && (nbLegendRows != 0))
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
408
				rightSpace += PlPlotUtil::LINE_SPACE_TITLE * legendCharSizePanel.second * std::get<1>(pageSize) / std::get<0>(pageSize);
bdc50075   Benjamin Renard   Fix bug for posit...
409
				pAxis->setLegendOffset(rightSpace + 0.5 * legendCharSizePanel.second * std::get<1>(pageSize) / std::get<0>(pageSize));
ba6124b0   Menouard AZIB   Add parameter id ...
410
				rightSpace += (nbLegendRows + PlPlotUtil::LINE_SPACE_TITLE * (nbLegendRows + 1)) * legendCharSizePanel.second * std::get<1>(pageSize) / std::get<0>(pageSize);
f6eaec4e   Benjamin Renard   Optimize plot ele...
411
412
			}

f6eaec4e   Benjamin Renard   Optimize plot ele...
413
414
415
416
			break;
		case PlotCommon::Position::POS_CENTER:
		default:
			LOG4CXX_WARN(gLogger, "PanelPlotOutput::drawPlotArea: Unrecognized position for axis '" << pAxis->_position << "'");
ba6124b0   Menouard AZIB   Add parameter id ...
417
		}
f6eaec4e   Benjamin Renard   Optimize plot ele...
418
	}
f6eaec4e   Benjamin Renard   Optimize plot ele...
419

ba6124b0   Menouard AZIB   Add parameter id ...
420
421
422
	void PanelPlotOutput::reserveSpaceForTextLegend(boost::shared_ptr<TextLegendProperties> &pTextLegendProp, double titleHeight, double &topSpace, double &bottomSpace, double &leftSpace, double &rightSpace)
	{
		int textLegendLinesNb = pTextLegendProp->getTextLinesNb();
f6eaec4e   Benjamin Renard   Optimize plot ele...
423

ba6124b0   Menouard AZIB   Add parameter id ...
424
425
		if (textLegendLinesNb == 0)
			return;
f6eaec4e   Benjamin Renard   Optimize plot ele...
426

ba6124b0   Menouard AZIB   Add parameter id ...
427
428
		PlPlotUtil::setPlFont(pTextLegendProp->getFont());
		CharSize lCharSizeLegend = PlPlotUtil::getCharacterSizeInPlPage(_panel->_page);
f6eaec4e   Benjamin Renard   Optimize plot ele...
429

ba6124b0   Menouard AZIB   Add parameter id ...
430
		std::tuple<float, float> pageSize = _panel->_page->getSizeInMm();
f6eaec4e   Benjamin Renard   Optimize plot ele...
431

ba6124b0   Menouard AZIB   Add parameter id ...
432
433
434
435
		switch (pTextLegendProp->getPosition())
		{
		case TextLegendPosition::POS_LEFT:
			pTextLegendProp->setOffset(leftSpace);
f6eaec4e   Benjamin Renard   Optimize plot ele...
436
437
			leftSpace += (textLegendLinesNb + PlPlotUtil::LINE_SPACE_TITLE * (textLegendLinesNb + 1)) * lCharSizeLegend.second * std::get<1>(pageSize) / std::get<0>(pageSize);
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
438
439
		case TextLegendPosition::POS_RIGHT:
			pTextLegendProp->setOffset(rightSpace);
f6eaec4e   Benjamin Renard   Optimize plot ele...
440
441
			rightSpace += (textLegendLinesNb + PlPlotUtil::LINE_SPACE_TITLE * (textLegendLinesNb + 1)) * lCharSizeLegend.second * std::get<1>(pageSize) / std::get<0>(pageSize);
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
442
		case TextLegendPosition::POS_TOP:
f6eaec4e   Benjamin Renard   Optimize plot ele...
443
			if (_panel->_titlePosition == PlotCommon::Position::POS_TOP)
ba6124b0   Menouard AZIB   Add parameter id ...
444
				pTextLegendProp->setOffset(topSpace - titleHeight);
f6eaec4e   Benjamin Renard   Optimize plot ele...
445
			else
ba6124b0   Menouard AZIB   Add parameter id ...
446
				pTextLegendProp->setOffset(topSpace);
f6eaec4e   Benjamin Renard   Optimize plot ele...
447
448
			topSpace += (textLegendLinesNb + PlPlotUtil::LINE_SPACE_TITLE * (textLegendLinesNb + 1)) * lCharSizeLegend.second;
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
449
		case TextLegendPosition::POS_BOTTOM:
f6eaec4e   Benjamin Renard   Optimize plot ele...
450
			if (_panel->_titlePosition == PlotCommon::Position::POS_BOTTOM)
ba6124b0   Menouard AZIB   Add parameter id ...
451
				pTextLegendProp->setOffset(bottomSpace - titleHeight);
f6eaec4e   Benjamin Renard   Optimize plot ele...
452
			else
ba6124b0   Menouard AZIB   Add parameter id ...
453
				pTextLegendProp->setOffset(bottomSpace);
f6eaec4e   Benjamin Renard   Optimize plot ele...
454
455
			bottomSpace += (textLegendLinesNb + PlPlotUtil::LINE_SPACE_TITLE * (textLegendLinesNb + 1)) * lCharSizeLegend.second;
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
456
		}
f6eaec4e   Benjamin Renard   Optimize plot ele...
457
	}
f6eaec4e   Benjamin Renard   Optimize plot ele...
458

ba6124b0   Menouard AZIB   Add parameter id ...
459
460
461
462
463
464
465
466
	/**
	 * @brief Compute panel XY ratio used for angular conversions
	 */
	void PanelPlotOutput::computePanelPlotXYRatio(void)
	{
		// panel plot XY ratio = page ratio * plot area bound size ratio
		_panelPlotXYRatio = (std::get<0>(_panel->_page->getSize()) / std::get<1>(_panel->_page->getSize())) * (_plotAreaBounds._width / _plotAreaBounds._height);
	}
fbe3c2bb   Benjamin Renard   First commit
467

ba6124b0   Menouard AZIB   Add parameter id ...
468
469
470
471
472
473
	/**
	 * @brief Draw legend for each axis.
	 */
	void PanelPlotOutput::drawLegends(boost::shared_ptr<Axis> &pAxis, PlWindow &pPlWindow, Bounds &pPlotAreaSize)
	{
		LOG4CXX_DEBUG(gLogger, "Drawing legend for axis " << pAxis->_id << " : " << pAxis->_legend.getText());
fbe3c2bb   Benjamin Renard   First commit
474

ba6124b0   Menouard AZIB   Add parameter id ...
475
476
477
		// Set legend font
		Font legendFont(pAxis->getLegendFont(this->_panel.get()));
		PlPlotUtil::setPlFont(legendFont);
fbe3c2bb   Benjamin Renard   First commit
478

ba6124b0   Menouard AZIB   Add parameter id ...
479
480
		// Get legend row info
		std::list<std::pair<std::string, Color>> lines = pAxis->_legend.getLines();
fbe3c2bb   Benjamin Renard   First commit
481

ba6124b0   Menouard AZIB   Add parameter id ...
482
483
484
485
486
		// Check if there is something to draw !
		if ((pAxis->_visible == true) &&
			(pAxis->_showLegend == true) &&
			(lines.size() != 0))
		{
f6eaec4e   Benjamin Renard   Optimize plot ele...
487

ba6124b0   Menouard AZIB   Add parameter id ...
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
			Color lInitialColor;
			// If legend has not it's own color set axis color.
			if ((pAxis->_legend.getColor()._colorIndex == -1) && ((pAxis->_legend.getColor()._red == -1) && (pAxis->_legend.getColor()._green == -1) && (pAxis->_legend.getColor()._blue == -1)))
			{
				lInitialColor = changeColor(_pls, pAxis->_color,
											_panel->_page->_mode);
			}
			else
			{
				Color legendColor = pAxis->_legend.getColor();
				lInitialColor = changeColor(_pls, legendColor,
											_panel->_page->_mode);
			}

			// Init position
			double lPosition = PlPlotUtil::LINE_SPACE_TITLE;
			unsigned int lineIndex = 0;
fbe3c2bb   Benjamin Renard   First commit
505

ba6124b0   Menouard AZIB   Add parameter id ...
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
			// Depending on the way to draw legend, for BOTTOM position we have to draw from first legend line to last.
			switch (pAxis->_position)
			{
			case PlotCommon::Position::POS_BOTTOM:

				_pls->vpor(pPlotAreaSize._x,
						   pPlotAreaSize._x + pPlotAreaSize._width,
						   pPlotAreaSize._y - pAxis->getLegendOffset(),
						   pPlotAreaSize._y - pAxis->getLegendOffset() + pPlotAreaSize._height);

				_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow),
						   std::get<2>(pPlWindow), std::get<3>(pPlWindow));

				// Draw lines, beginning by the first one
				for (auto line : lines)
fbe3c2bb   Benjamin Renard   First commit
521
				{
ba6124b0   Menouard AZIB   Add parameter id ...
522
523
					std::string lineToDraw = line.first;
					if (lineIndex == lines.size() - 1)
fbe3c2bb   Benjamin Renard   First commit
524
					{
ba6124b0   Menouard AZIB   Add parameter id ...
525
526
527
528
529
530
531
						// add unit if defined
						if (!pAxis->getAxisUnits().empty())
						{
							lineToDraw += " (";
							lineToDraw += pAxis->getAxisUnits();
							lineToDraw += ")";
						}
fbe3c2bb   Benjamin Renard   First commit
532
					}
ba6124b0   Menouard AZIB   Add parameter id ...
533
534
535
536
537
538
					Color lSavedColor;
					if (line.second.isSet())
					{
						lSavedColor = changeColor(_pls, line.second, _panel->_page->_mode);
					}
					_pls->mtex(getPlSide(pAxis->_position).c_str(), lPosition, 0.5, 0.5, lineToDraw.c_str());
f4f4fdcc   Erdogan Furkan   Done
539
540
541
					// Adding more height if needed
					addSpaceForExInd(lineToDraw, lPosition);

ba6124b0   Menouard AZIB   Add parameter id ...
542
543
544
545
546
547
					lPosition += (1 + PlPlotUtil::LINE_SPACE_TITLE);
					if (line.second.isSet())
					{
						restoreColor(_pls, lSavedColor, _panel->_page->_mode);
					}
					++lineIndex;
fbe3c2bb   Benjamin Renard   First commit
548
				}
ba6124b0   Menouard AZIB   Add parameter id ...
549
				break;
fbe3c2bb   Benjamin Renard   First commit
550

ba6124b0   Menouard AZIB   Add parameter id ...
551
552
553
554
555
			case PlotCommon::Position::POS_TOP:
				_pls->vpor(pPlotAreaSize._x,
						   pPlotAreaSize._x + pPlotAreaSize._width,
						   pPlotAreaSize._y + pAxis->getLegendOffset(),
						   pPlotAreaSize._y + pAxis->getLegendOffset() + pPlotAreaSize._height);
fbe3c2bb   Benjamin Renard   First commit
556

ba6124b0   Menouard AZIB   Add parameter id ...
557
558
				_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow),
						   std::get<2>(pPlWindow), std::get<3>(pPlWindow));
fbe3c2bb   Benjamin Renard   First commit
559

ba6124b0   Menouard AZIB   Add parameter id ...
560
561
				// Draw lines, beginning by the last one
				for (auto line : boost::adaptors::reverse(lines))
fbe3c2bb   Benjamin Renard   First commit
562
				{
ba6124b0   Menouard AZIB   Add parameter id ...
563
564
					std::string lineToDraw = line.first;
					if (lineIndex == lines.size() - 1)
fbe3c2bb   Benjamin Renard   First commit
565
					{
ba6124b0   Menouard AZIB   Add parameter id ...
566
567
568
569
570
571
572
						// add unit if defined
						if (!pAxis->getAxisUnits().empty())
						{
							lineToDraw += " (";
							lineToDraw += pAxis->getAxisUnits();
							lineToDraw += ")";
						}
fbe3c2bb   Benjamin Renard   First commit
573
					}
ba6124b0   Menouard AZIB   Add parameter id ...
574
575
576
577
578
579
					Color lSavedColor;
					if (line.second.isSet())
					{
						lSavedColor = changeColor(_pls, line.second, _panel->_page->_mode);
					}
					_pls->mtex(getPlSide(pAxis->_position).c_str(), lPosition, 0.5, 0.5, lineToDraw.c_str());
f4f4fdcc   Erdogan Furkan   Done
580
581
582
					// Adding more height if needed
					addSpaceForExInd(lineToDraw, lPosition);

ba6124b0   Menouard AZIB   Add parameter id ...
583
584
585
586
587
588
					lPosition += (1 + PlPlotUtil::LINE_SPACE_TITLE);
					if (line.second.isSet())
					{
						restoreColor(_pls, lSavedColor, _panel->_page->_mode);
					}
					++lineIndex;
fbe3c2bb   Benjamin Renard   First commit
589
				}
ba6124b0   Menouard AZIB   Add parameter id ...
590
				break;
fbe3c2bb   Benjamin Renard   First commit
591

ba6124b0   Menouard AZIB   Add parameter id ...
592
			case PlotCommon::Position::POS_RIGHT:
f6eaec4e   Benjamin Renard   Optimize plot ele...
593

ba6124b0   Menouard AZIB   Add parameter id ...
594
595
596
597
				_pls->vpor(pPlotAreaSize._x,
						   pPlotAreaSize._x + pAxis->getLegendOffset() + pPlotAreaSize._width,
						   pPlotAreaSize._y,
						   pPlotAreaSize._y + pPlotAreaSize._height);
fbe3c2bb   Benjamin Renard   First commit
598

ba6124b0   Menouard AZIB   Add parameter id ...
599
600
				_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow),
						   std::get<2>(pPlWindow), std::get<3>(pPlWindow));
fbe3c2bb   Benjamin Renard   First commit
601

ba6124b0   Menouard AZIB   Add parameter id ...
602
603
				// Draw lines, beginning by the first one
				for (auto line : lines)
fbe3c2bb   Benjamin Renard   First commit
604
				{
ba6124b0   Menouard AZIB   Add parameter id ...
605
606
					std::string lineToDraw = line.first;
					if (lineIndex == lines.size() - 1)
fbe3c2bb   Benjamin Renard   First commit
607
					{
ba6124b0   Menouard AZIB   Add parameter id ...
608
609
610
611
612
613
614
						// add unit if defined
						if (!pAxis->getAxisUnits().empty())
						{
							lineToDraw += " (";
							lineToDraw += pAxis->getAxisUnits();
							lineToDraw += ")";
						}
fbe3c2bb   Benjamin Renard   First commit
615
					}
ba6124b0   Menouard AZIB   Add parameter id ...
616
617
618
619
620
621
					Color lSavedColor;
					if (line.second.isSet())
					{
						lSavedColor = changeColor(_pls, line.second, _panel->_page->_mode);
					}
					_pls->mtex(getPlSide(pAxis->_position).c_str(), lPosition, 0.5, 0.5, lineToDraw.c_str());
f4f4fdcc   Erdogan Furkan   Done
622
623
624
					// Adding more height if needed
					addSpaceForExInd(lineToDraw, lPosition);

ba6124b0   Menouard AZIB   Add parameter id ...
625
626
627
628
629
630
					lPosition += (1 + PlPlotUtil::LINE_SPACE_TITLE);
					if (line.second.isSet())
					{
						restoreColor(_pls, lSavedColor, _panel->_page->_mode);
					}
					++lineIndex;
fbe3c2bb   Benjamin Renard   First commit
631
				}
fbe3c2bb   Benjamin Renard   First commit
632

ba6124b0   Menouard AZIB   Add parameter id ...
633
				break;
fbe3c2bb   Benjamin Renard   First commit
634

ba6124b0   Menouard AZIB   Add parameter id ...
635
			case PlotCommon::Position::POS_LEFT:
f6eaec4e   Benjamin Renard   Optimize plot ele...
636

ba6124b0   Menouard AZIB   Add parameter id ...
637
638
639
640
				_pls->vpor(pPlotAreaSize._x - pAxis->getLegendOffset(),
						   pPlotAreaSize._x + pPlotAreaSize._width,
						   pPlotAreaSize._y,
						   pPlotAreaSize._y + pPlotAreaSize._height);
fbe3c2bb   Benjamin Renard   First commit
641

ba6124b0   Menouard AZIB   Add parameter id ...
642
643
				_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow),
						   std::get<2>(pPlWindow), std::get<3>(pPlWindow));
fbe3c2bb   Benjamin Renard   First commit
644

ba6124b0   Menouard AZIB   Add parameter id ...
645
646
				// Draw lines, beginning by the last one
				for (auto line : boost::adaptors::reverse(lines))
fbe3c2bb   Benjamin Renard   First commit
647
				{
ba6124b0   Menouard AZIB   Add parameter id ...
648
649
					std::string lineToDraw = line.first;
					if (lineIndex == lines.size() - 1)
fbe3c2bb   Benjamin Renard   First commit
650
					{
ba6124b0   Menouard AZIB   Add parameter id ...
651
652
653
654
655
656
657
						// add unit if defined
						if (!pAxis->getAxisUnits().empty())
						{
							lineToDraw += " (";
							lineToDraw += pAxis->getAxisUnits();
							lineToDraw += ")";
						}
fbe3c2bb   Benjamin Renard   First commit
658
					}
ba6124b0   Menouard AZIB   Add parameter id ...
659
660
661
662
663
664
					Color lSavedColor;
					if (line.second.isSet())
					{
						lSavedColor = changeColor(_pls, line.second, _panel->_page->_mode);
					}
					_pls->mtex(getPlSide(pAxis->_position).c_str(), lPosition, 0.5, 0.5, lineToDraw.c_str());
f4f4fdcc   Erdogan Furkan   Done
665
666
667
					// Adding more height if needed
					addSpaceForExInd(lineToDraw, lPosition);

ba6124b0   Menouard AZIB   Add parameter id ...
668
669
670
671
672
673
					lPosition += (1 + PlPlotUtil::LINE_SPACE_TITLE);
					if (line.second.isSet())
					{
						restoreColor(_pls, lSavedColor, _panel->_page->_mode);
					}
					++lineIndex;
fbe3c2bb   Benjamin Renard   First commit
674
				}
fbe3c2bb   Benjamin Renard   First commit
675

ba6124b0   Menouard AZIB   Add parameter id ...
676
				break;
fbe3c2bb   Benjamin Renard   First commit
677

ba6124b0   Menouard AZIB   Add parameter id ...
678
679
680
681
			case PlotCommon::Position::POS_CENTER:
			default:
				LOG4CXX_WARN(gLogger, "PanelPlotOutput::drawPlotArea: Unrecognized position for axis '" << pAxis->_position << "'");
			}
fbe3c2bb   Benjamin Renard   First commit
682

ba6124b0   Menouard AZIB   Add parameter id ...
683
684
685
686
			_pls->vpor(pPlotAreaSize._x,
					   pPlotAreaSize._x + pPlotAreaSize._width,
					   pPlotAreaSize._y,
					   pPlotAreaSize._y + pPlotAreaSize._height);
f6eaec4e   Benjamin Renard   Optimize plot ele...
687

ba6124b0   Menouard AZIB   Add parameter id ...
688
689
			_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow),
					   std::get<2>(pPlWindow), std::get<3>(pPlWindow));
f6eaec4e   Benjamin Renard   Optimize plot ele...
690

ba6124b0   Menouard AZIB   Add parameter id ...
691
692
693
			// Restore initial color.
			restoreColor(_pls, lInitialColor, _panel->_page->_mode);
		}
fbe3c2bb   Benjamin Renard   First commit
694
	}
fbe3c2bb   Benjamin Renard   First commit
695

f4f4fdcc   Erdogan Furkan   Done
696
697
698
699
700
701
702
703
704
705
706
707
	void PanelPlotOutput::addSpaceForExInd(std::string &legend, double &lPosition){
		if(legend != ""){

			// We check if there is an exponent or an indice
			const char *exponent = std::strstr(legend.c_str(), "#u");
			const char *indice = std::strstr(legend.c_str(), "#d");

			if(exponent || indice)
				lPosition += 1;
		}
	}

ba6124b0   Menouard AZIB   Add parameter id ...
708
709
710
711
	void PanelPlotOutput::drawAxis(boost::shared_ptr<Axis> pAxis, TickConf &pTickConf,
								   std::string pXAxisOptions, std::string pYAxisOptions)
	{
		Color lInitialColor = changeColor(_pls, pAxis->_color, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
712

ba6124b0   Menouard AZIB   Add parameter id ...
713
714
		// Set axis thickness.
		_pls->width(pAxis->_thickness);
fbe3c2bb   Benjamin Renard   First commit
715

ba6124b0   Menouard AZIB   Add parameter id ...
716
717
718
719
720
721
722
723
724
725
726
727
728
		// Set tick (major and minor) length factor
		PLFLT lTickLenFact = DEFAULT_TICK_LENGTH_FACTOR;
		if (!isnan(pAxis->_tick._lengthFactor))
		{
			lTickLenFact = pAxis->_tick._lengthFactor;
		}
		else
		{
			// Nothing to do.
		}
		// 0 => keep tick height in millimeters.
		_pls->smaj(0, lTickLenFact);
		_pls->smin(0, lTickLenFact);
fbe3c2bb   Benjamin Renard   First commit
729

ba6124b0   Menouard AZIB   Add parameter id ...
730
731
732
733
734
		// if options contains "o" character we need to set label function
		if ((pXAxisOptions.find("o") != std::string::npos) || (pYAxisOptions.find("o") != std::string::npos))
		{
			_pls->slabelfunc(pAxis->_labelGenerator->_function, pAxis->_labelGenerator->_data);
		}
fbe3c2bb   Benjamin Renard   First commit
735

ba6124b0   Menouard AZIB   Add parameter id ...
736
737
		// Set line style (force to be plain)
		_pls->lsty(static_cast<int>(getPlLineStyle(LineStyle::PLAIN)));
fbe3c2bb   Benjamin Renard   First commit
738

ba6124b0   Menouard AZIB   Add parameter id ...
739
740
741
742
743
		// Set font to draw axes.
		Font axisFont(pAxis->getLegendFont(this->_panel.get()));
		axisFont.setStyle(Font::Style::NORMAL);
		axisFont.setWeight(Font::Weight::NORMAL);
		PlPlotUtil::setPlFont(axisFont);
fbe3c2bb   Benjamin Renard   First commit
744

ba6124b0   Menouard AZIB   Add parameter id ...
745
		size_t lPos;
fbe3c2bb   Benjamin Renard   First commit
746

ba6124b0   Menouard AZIB   Add parameter id ...
747
748
749
750
		double xMajorTickSpace = std::get<0>(pTickConf);
		double xMinorTickNumber = std::get<1>(pTickConf);
		double yMajorTickSpace = std::get<2>(pTickConf);
		double yMinorTickNumber = std::get<3>(pTickConf);
fbe3c2bb   Benjamin Renard   First commit
751

ba6124b0   Menouard AZIB   Add parameter id ...
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
		// if options contains "a" character we need to draw origin separately.
		if ((lPos = pXAxisOptions.find("a")) != std::string::npos)
		{
			pXAxisOptions.replace(lPos, 1, "");
			_pls->box("a", xMajorTickSpace, xMinorTickNumber, "", yMajorTickSpace, yMinorTickNumber);
		}
		else if ((lPos = pYAxisOptions.find("a")) != std::string::npos)
		{
			pYAxisOptions.replace(lPos, 1, "");
			_pls->box("", xMajorTickSpace, xMinorTickNumber, "a", yMajorTickSpace, yMinorTickNumber);
		}
		else
		{
			// Nothing to do.
		}
fbe3c2bb   Benjamin Renard   First commit
767

ba6124b0   Menouard AZIB   Add parameter id ...
768
769
770
		// Draw axis.
		_pls->box(pXAxisOptions.c_str(), xMajorTickSpace, xMinorTickNumber,
				  pYAxisOptions.c_str(), yMajorTickSpace, yMinorTickNumber);
fbe3c2bb   Benjamin Renard   First commit
771

ba6124b0   Menouard AZIB   Add parameter id ...
772
773
		// Restore initial color.
		restoreColor(_pls, lInitialColor, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
774

ba6124b0   Menouard AZIB   Add parameter id ...
775
776
777
		// Set axis as drawn.
		pAxis->_drawn = true;
	}
fbe3c2bb   Benjamin Renard   First commit
778

ba6124b0   Menouard AZIB   Add parameter id ...
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
	void PanelPlotOutput::drawXAxis(boost::shared_ptr<Axis> pXAxis, PlWindow &pPlWindow, Bounds &pPlotAreaSize, TickConf &pTickConf)
	{
		// Set option to draw origin.
		std::string lAxisOption = pXAxis->getPlotOpt();
		std::string lTmpAxisOption = "xi";

		// plplot doesn't provide solution to set space between tick and tick mark.
		// To do that we need to play with viewport position and size.
		// So axis will be drawn in two times:
		//		- first draw tick marks
		//		- second draw tick and edge
		// Custom space  between tick marks and tick is only done when tick length is greater than 0.75.
		// Get extra tick mark space (only if they are outwards)
		if (pXAxis->_tick._position == Tick::TickPosition::OUTWARDS)
		{
			float lTickLengthFactor = 0;
			if ((!isnan(pXAxis->_tick._lengthFactor)) && (pXAxis->_tick._lengthFactor > HORIZONTAL_TICK_LENGTH_LIMIT))
			{
				lTickLengthFactor = pXAxis->_tick._lengthFactor;
			}
			else if ((isnan(pXAxis->_tick._lengthFactor)) && (DEFAULT_TICK_LENGTH_FACTOR > HORIZONTAL_TICK_LENGTH_LIMIT))
			{
				lTickLengthFactor = DEFAULT_TICK_LENGTH_FACTOR;
			}
fbe3c2bb   Benjamin Renard   First commit
803

ba6124b0   Menouard AZIB   Add parameter id ...
804
805
806
807
808
			if (lTickLengthFactor != 0)
			{
				// 1 character size is equal to 0.75 tick length.
				PlPlotUtil::setPlFont(_panel->getFont());
				float lTickMarkSpace = (lTickLengthFactor - HORIZONTAL_TICK_LENGTH_LIMIT) * (PlPlotUtil::getCharacterSizeInPlPage(_panel->_page).second) / (DEFAULT_TICK_LENGTH_FACTOR);
fbe3c2bb   Benjamin Renard   First commit
809

ba6124b0   Menouard AZIB   Add parameter id ...
810
				size_t lPos;
fbe3c2bb   Benjamin Renard   First commit
811

ba6124b0   Menouard AZIB   Add parameter id ...
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
				if ((lPos = lAxisOption.find("m")) != std::string::npos)
				{
					lTmpAxisOption += "m";
					lAxisOption.replace(lPos, 1, "");
				}
				if ((lPos = lAxisOption.find("n")) != std::string::npos)
				{
					lTmpAxisOption += "n";
					lAxisOption.replace(lPos, 1, "");
				}
				if ((lPos = lAxisOption.find("o")) != std::string::npos)
				{
					lTmpAxisOption += "o";
					lAxisOption.replace(lPos, 1, "");
				}
				if ((lPos = lAxisOption.find("d")) != std::string::npos)
				{
					lTmpAxisOption += "d";
					lAxisOption.replace(lPos, 1, "");
				}
				if ((lPos = lAxisOption.find("f")) != std::string::npos)
				{
					lTmpAxisOption += "f";
					lAxisOption.replace(lPos, 1, "");
				}

				if (pXAxis->_position == PlotCommon::Position::POS_BOTTOM)
				{
					_pls->vpor(pPlotAreaSize._x,
							   pPlotAreaSize._x + pPlotAreaSize._width,
							   pPlotAreaSize._y - lTickMarkSpace,
							   pPlotAreaSize._y + pPlotAreaSize._height);
				}
				else
				{
					_pls->vpor(pPlotAreaSize._x,
							   pPlotAreaSize._x + pPlotAreaSize._width,
							   pPlotAreaSize._y,
							   pPlotAreaSize._y + pPlotAreaSize._height + lTickMarkSpace);
				}
fbe3c2bb   Benjamin Renard   First commit
852

ba6124b0   Menouard AZIB   Add parameter id ...
853
854
				_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow),
						   std::get<2>(pPlWindow), std::get<3>(pPlWindow));
fbe3c2bb   Benjamin Renard   First commit
855

ba6124b0   Menouard AZIB   Add parameter id ...
856
857
				// Draw tick mark.
				drawAxis(pXAxis, pTickConf, lTmpAxisOption, "");
fbe3c2bb   Benjamin Renard   First commit
858
			}
ba6124b0   Menouard AZIB   Add parameter id ...
859
860
861
862
863
864
865
866
867
		}
		// Restore default plot area
		_pls->vpor(pPlotAreaSize._x,
				   pPlotAreaSize._x + pPlotAreaSize._width,
				   pPlotAreaSize._y,
				   pPlotAreaSize._y + pPlotAreaSize._height);
		// Set window.
		_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow),
				   std::get<2>(pPlWindow), std::get<3>(pPlWindow));
fbe3c2bb   Benjamin Renard   First commit
868

ba6124b0   Menouard AZIB   Add parameter id ...
869
870
871
872
		// Check if origin must be drawn.
		if (std::get<0>(pPlWindow) != 0 && std::get<1>(pPlWindow) && pXAxis->_origin == 0)
		{
			lAxisOption += "a";
fbe3c2bb   Benjamin Renard   First commit
873
		}
fbe3c2bb   Benjamin Renard   First commit
874

ba6124b0   Menouard AZIB   Add parameter id ...
875
876
		// Check if opposite plot area side need to be drawn
		lAxisOption += drawOppositeSide(pXAxis);
fbe3c2bb   Benjamin Renard   First commit
877

ba6124b0   Menouard AZIB   Add parameter id ...
878
879
		// Draw rest of axis.
		drawAxis(pXAxis, pTickConf, lAxisOption, "");
fbe3c2bb   Benjamin Renard   First commit
880
881
	}

ba6124b0   Menouard AZIB   Add parameter id ...
882
883
	void PanelPlotOutput::drawYAxis(boost::shared_ptr<Axis> pYAxis, PlWindow &pPlWindow, Bounds &pPlotAreaSize, TickConf &pTickConf)
	{
fbe3c2bb   Benjamin Renard   First commit
884

ba6124b0   Menouard AZIB   Add parameter id ...
885
886
		// Get axis offset in case of multi-axes
		double axisOffset = pYAxis->getAxisOffset();
fbe3c2bb   Benjamin Renard   First commit
887

ba6124b0   Menouard AZIB   Add parameter id ...
888
889
890
		// Set option to draw origin ("v" is set to have numeric labels parallel to X axis).
		std::string lAxisOption = pYAxis->getPlotOpt();
		std::string lTmpAxisOption = "xiv";
fbe3c2bb   Benjamin Renard   First commit
891

ba6124b0   Menouard AZIB   Add parameter id ...
892
893
894
895
896
897
898
		// plplot doesn't provide solution to set space between tick and tick mark.
		// To do that we need to play with viewport position and size.
		// So axis will be drawn in two times:
		//		- first draw tick marks
		//		- second draw tick and edge
		// Custom space  between tick marks and tick is only done when tick length is greater than 0.5.
		// Get extra tick mark space (only if they are outwards)
fbe3c2bb   Benjamin Renard   First commit
899

ba6124b0   Menouard AZIB   Add parameter id ...
900
		pPlotAreaSize._width = pPlotAreaSize._width;
fbe3c2bb   Benjamin Renard   First commit
901

ba6124b0   Menouard AZIB   Add parameter id ...
902
903
904
905
906
907
908
909
910
911
912
		if (pYAxis->_tick._position == Tick::TickPosition::OUTWARDS)
		{
			float lTickLengthFactor = 0;
			if ((!isnan(pYAxis->_tick._lengthFactor)) && (pYAxis->_tick._lengthFactor > VERTICAL_TICK_LENGTH_LIMIT))
			{
				lTickLengthFactor = pYAxis->_tick._lengthFactor;
			}
			else if ((isnan(pYAxis->_tick._lengthFactor)) && (DEFAULT_TICK_LENGTH_FACTOR > VERTICAL_TICK_LENGTH_LIMIT))
			{
				lTickLengthFactor = DEFAULT_TICK_LENGTH_FACTOR;
			}
fbe3c2bb   Benjamin Renard   First commit
913

ba6124b0   Menouard AZIB   Add parameter id ...
914
915
916
917
918
			if (lTickLengthFactor != 0)
			{
				// 1 character size is equal to 0.75 tick length.
				PlPlotUtil::setPlFont(_panel->getFont());
				double lTickMarkSpace = (lTickLengthFactor - VERTICAL_TICK_LENGTH_LIMIT) * (PlPlotUtil::getCharacterSizeInPlPage(_panel->_page).second) / (DEFAULT_TICK_LENGTH_FACTOR);
fbe3c2bb   Benjamin Renard   First commit
919

ba6124b0   Menouard AZIB   Add parameter id ...
920
				size_t lPos;
fbe3c2bb   Benjamin Renard   First commit
921

ba6124b0   Menouard AZIB   Add parameter id ...
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
				if ((lPos = lAxisOption.find("m")) != std::string::npos)
				{
					lTmpAxisOption += "m";
					lAxisOption.replace(lPos, 1, "");
				}
				if ((lPos = lAxisOption.find("n")) != std::string::npos)
				{
					lTmpAxisOption += "n";
					lAxisOption.replace(lPos, 1, "");
				}
				if ((lPos = lAxisOption.find("o")) != std::string::npos)
				{
					lTmpAxisOption += "o";
					lAxisOption.replace(lPos, 1, "");
				}
				if ((lPos = lAxisOption.find("f")) != std::string::npos)
				{
					lTmpAxisOption += "f";
					lAxisOption.replace(lPos, 1, "");
				}
				if (lAxisOption.find("l") != std::string::npos)
				{
					// Do not remove on original axis option
					// because option is needed to draw logarithmic tick.
					lTmpAxisOption += "l";
				}
fbe3c2bb   Benjamin Renard   First commit
948

ba6124b0   Menouard AZIB   Add parameter id ...
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
				// Set plot area used to draw tick mark
				if (pYAxis->_position == PlotCommon::Position::POS_LEFT)
				{
					_pls->vpor(pPlotAreaSize._x - lTickMarkSpace - axisOffset,
							   pPlotAreaSize._x + pPlotAreaSize._width,
							   pPlotAreaSize._y,
							   pPlotAreaSize._y + pPlotAreaSize._height);
				}
				else
				{
					_pls->vpor(pPlotAreaSize._x,
							   pPlotAreaSize._x + pPlotAreaSize._width + lTickMarkSpace + axisOffset,
							   pPlotAreaSize._y,
							   pPlotAreaSize._y + pPlotAreaSize._height);
				}
fbe3c2bb   Benjamin Renard   First commit
964

ba6124b0   Menouard AZIB   Add parameter id ...
965
966
				_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow),
						   std::get<2>(pPlWindow), std::get<3>(pPlWindow));
fbe3c2bb   Benjamin Renard   First commit
967

ba6124b0   Menouard AZIB   Add parameter id ...
968
969
				// Draw tick mark.
				drawAxis(pYAxis, pTickConf, "", lTmpAxisOption);
fbe3c2bb   Benjamin Renard   First commit
970
			}
fbe3c2bb   Benjamin Renard   First commit
971
		}
fbe3c2bb   Benjamin Renard   First commit
972

ba6124b0   Menouard AZIB   Add parameter id ...
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
		// Set plot area used to draw tick
		if (pYAxis->_position == PlotCommon::Position::POS_LEFT)
		{
			_pls->vpor(pPlotAreaSize._x - axisOffset,
					   pPlotAreaSize._x + pPlotAreaSize._width,
					   pPlotAreaSize._y,
					   pPlotAreaSize._y + pPlotAreaSize._height);
		}
		else
		{
			_pls->vpor(pPlotAreaSize._x,
					   pPlotAreaSize._x + pPlotAreaSize._width + axisOffset,
					   pPlotAreaSize._y,
					   pPlotAreaSize._y + pPlotAreaSize._height);
		}
fbe3c2bb   Benjamin Renard   First commit
988

ba6124b0   Menouard AZIB   Add parameter id ...
989
990
991
		// Set window.
		_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow),
				   std::get<2>(pPlWindow), std::get<3>(pPlWindow));
fbe3c2bb   Benjamin Renard   First commit
992

ba6124b0   Menouard AZIB   Add parameter id ...
993
994
995
996
997
		// Check if origin must be drawn.
		if (std::get<0>(pPlWindow) != 0 && std::get<1>(pPlWindow) && pYAxis->_origin == 0)
		{
			lAxisOption += "a";
		}
fbe3c2bb   Benjamin Renard   First commit
998

ba6124b0   Menouard AZIB   Add parameter id ...
999
1000
		// Check if opposite plot area side need to be drawn
		lAxisOption += drawOppositeSide(pYAxis);
fbe3c2bb   Benjamin Renard   First commit
1001

ba6124b0   Menouard AZIB   Add parameter id ...
1002
1003
		// Draw rest of axis.
		drawAxis(pYAxis, pTickConf, "", lAxisOption);
fbe3c2bb   Benjamin Renard   First commit
1004

ba6124b0   Menouard AZIB   Add parameter id ...
1005
1006
1007
1008
1009
		// Restore default plot area
		_pls->vpor(pPlotAreaSize._x,
				   pPlotAreaSize._x + pPlotAreaSize._width,
				   pPlotAreaSize._y,
				   pPlotAreaSize._y + pPlotAreaSize._height);
fbe3c2bb   Benjamin Renard   First commit
1010

ba6124b0   Menouard AZIB   Add parameter id ...
1011
1012
1013
1014
		// Set window.
		_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow),
				   std::get<2>(pPlWindow), std::get<3>(pPlWindow));
	}
fbe3c2bb   Benjamin Renard   First commit
1015
1016
1017
1018

#define COLORBAR_X_OFFSET 0.01
#define COLORBAR_BODY_WIDTH 0.0375

ba6124b0   Menouard AZIB   Add parameter id ...
1019
1020
1021
	double PanelPlotOutput::estimateZAxisWidth(boost::shared_ptr<Axis> pZAxis)
	{
		double axisWidth = (COLORBAR_X_OFFSET + COLORBAR_BODY_WIDTH) * _panel->_bounds._width;
fbe3c2bb   Benjamin Renard   First commit
1022

ba6124b0   Menouard AZIB   Add parameter id ...
1023
1024
		PlPlotUtil::setPlFont(_panel->getFont());
		CharSize lCharSize = PlPlotUtil::getCharacterSizeInPlPage(_panel->_page);
fbe3c2bb   Benjamin Renard   First commit
1025

ba6124b0   Menouard AZIB   Add parameter id ...
1026
		int nbLineLegend = pZAxis->_legend.getNbLines();
fbe3c2bb   Benjamin Renard   First commit
1027

ba6124b0   Menouard AZIB   Add parameter id ...
1028
1029
1030
1031
1032
1033
1034
		if ((pZAxis->_showLegend == true) && (nbLineLegend != 0))
		{
			if (_panel->_page->_orientation == PlotCommon::Orientation::LANDSCAPE)
				axisWidth += lCharSize.second * (2 * nbLineLegend + 1);
			else
				axisWidth += lCharSize.first * (2 * nbLineLegend + 1);
		}
fbe3c2bb   Benjamin Renard   First commit
1035

ba6124b0   Menouard AZIB   Add parameter id ...
1036
1037
		return axisWidth;
	}
fbe3c2bb   Benjamin Renard   First commit
1038

ba6124b0   Menouard AZIB   Add parameter id ...
1039
1040
1041
1042
	void PanelPlotOutput::drawZAxis(boost::shared_ptr<Axis> pZAxis, PlWindow &pPlWindow, Bounds &pPlotAreaSize, TickConf & /*pTickConf*/)
	{
		Color lInitialColor;
		_pls->gcol0(0, lInitialColor._red, lInitialColor._green, lInitialColor._blue);
fbe3c2bb   Benjamin Renard   First commit
1043

ba6124b0   Menouard AZIB   Add parameter id ...
1044
1045
		// Set axis thickness.
		_pls->width(pZAxis->_thickness);
fbe3c2bb   Benjamin Renard   First commit
1046

ba6124b0   Menouard AZIB   Add parameter id ...
1047
1048
		// Set line style (force to be plain)
		_pls->lsty(static_cast<int>(getPlLineStyle(LineStyle::PLAIN)));
fbe3c2bb   Benjamin Renard   First commit
1049

ba6124b0   Menouard AZIB   Add parameter id ...
1050
1051
		// Set font to draw axes.
		PlPlotUtil::setPlFont(_panel->getFont());
fbe3c2bb   Benjamin Renard   First commit
1052

ba6124b0   Menouard AZIB   Add parameter id ...
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
		std::string lAxisOption = pZAxis->getPlotOpt();
		std::string lAxisLegend = "";
		std::list<std::pair<std::string, Color>> lines = pZAxis->_legend.getLines();
		for (auto line : lines)
		{
			if (line.first.empty())
			{
				continue;
			}
			if (!lAxisLegend.empty())
			{
				lAxisLegend += "\n";
			}
			lAxisLegend += line.first;
8bb0f02b   Benjamin Renard   Set colors in axi...
1067
		}
fbe3c2bb   Benjamin Renard   First commit
1068

ba6124b0   Menouard AZIB   Add parameter id ...
1069
1070
1071
		PLFLT colorbar_width, colorbar_height;
		const int cont_color = 0;
		const PLFLT cont_width = 0.0;
fbe3c2bb   Benjamin Renard   First commit
1072

ba6124b0   Menouard AZIB   Add parameter id ...
1073
1074
1075
		// set legend
		const PLINT n_labels = (lAxisLegend.empty()) ? 0 : 1;
		std::string label = lAxisLegend;
fbe3c2bb   Benjamin Renard   First commit
1076

ba6124b0   Menouard AZIB   Add parameter id ...
1077
1078
1079
		const char *labels[n_labels];
		if (!lAxisLegend.empty())
			labels[0] = label.c_str();
fbe3c2bb   Benjamin Renard   First commit
1080

ba6124b0   Menouard AZIB   Add parameter id ...
1081
1082
1083
		// set axis options
		const PLINT n_axis_opts = 1;
		const char *axis_opts[n_axis_opts] = {
fbe3c2bb   Benjamin Renard   First commit
1084
			lAxisOption.c_str(),
ba6124b0   Menouard AZIB   Add parameter id ...
1085
		};
fbe3c2bb   Benjamin Renard   First commit
1086

ba6124b0   Menouard AZIB   Add parameter id ...
1087
1088
1089
1090
		PLFLT axis_ticks[n_axis_opts] = {
			0};
		PLINT axis_subticks[n_axis_opts] = {
			0};
fbe3c2bb   Benjamin Renard   First commit
1091

ba6124b0   Menouard AZIB   Add parameter id ...
1092
1093
1094
1095
1096
		// if options contains "o" character we need to set label function
		if (lAxisOption.find("o") != std::string::npos)
		{
			_pls->slabelfunc(pZAxis->_labelGenerator->_function, pZAxis->_labelGenerator->_data);
		}
fbe3c2bb   Benjamin Renard   First commit
1097

ba6124b0   Menouard AZIB   Add parameter id ...
1098
1099
		// set nb og colors
		const int nbCol = 20;
fbe3c2bb   Benjamin Renard   First commit
1100

ba6124b0   Menouard AZIB   Add parameter id ...
1101
1102
		PLINT num_values[1] = {
			nbCol + 1};
fbe3c2bb   Benjamin Renard   First commit
1103

ba6124b0   Menouard AZIB   Add parameter id ...
1104
		Range r = pZAxis->getRange();
fbe3c2bb   Benjamin Renard   First commit
1105

ba6124b0   Menouard AZIB   Add parameter id ...
1106
		PLFLT *shedge = new PLFLT[nbCol + 1];
fbe3c2bb   Benjamin Renard   First commit
1107

ba6124b0   Menouard AZIB   Add parameter id ...
1108
		ShadesTools::computeEdgesLevels(r, nbCol + 1, shedge);
fbe3c2bb   Benjamin Renard   First commit
1109

ba6124b0   Menouard AZIB   Add parameter id ...
1110
1111
		PLFLT *values[1];
		values[0] = shedge;
fbe3c2bb   Benjamin Renard   First commit
1112

ba6124b0   Menouard AZIB   Add parameter id ...
1113
1114
		// set color map
		_pls->spal1(
fbe3c2bb   Benjamin Renard   First commit
1115
1116
			ColormapManager::getInstance().getColorAxis(pZAxis->_color._colorMapIndex).c_str(), true);

ba6124b0   Menouard AZIB   Add parameter id ...
1117
1118
1119
		// set color bar and legend position
		PLINT position = PL_POSITION_OUTSIDE | PL_POSITION_VIEWPORT;
		PLINT label_opts[1];
fbe3c2bb   Benjamin Renard   First commit
1120

ba6124b0   Menouard AZIB   Add parameter id ...
1121
1122
1123
		switch (pZAxis->_position)
		{
		case PlotCommon::Position::POS_LEFT:
fbe3c2bb   Benjamin Renard   First commit
1124
1125
			position |= PL_POSITION_LEFT;
			label_opts[0] = PL_COLORBAR_LABEL_LEFT;
b76d3cfc   Benjamin Renard   Fix color axis po...
1126
			_pls->vpor(pPlotAreaSize._x - pZAxis->getAxisOffset(), pPlotAreaSize._x + pPlotAreaSize._width, pPlotAreaSize._y, pPlotAreaSize._y + pPlotAreaSize._height);
fbe3c2bb   Benjamin Renard   First commit
1127
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
1128
		case PlotCommon::Position::POS_RIGHT:
fbe3c2bb   Benjamin Renard   First commit
1129
1130
			position |= PL_POSITION_RIGHT;
			label_opts[0] = PL_COLORBAR_LABEL_RIGHT;
b76d3cfc   Benjamin Renard   Fix color axis po...
1131
			_pls->vpor(pPlotAreaSize._x, pPlotAreaSize._x + pPlotAreaSize._width + pZAxis->getAxisOffset(), pPlotAreaSize._y, pPlotAreaSize._y + pPlotAreaSize._height);
fbe3c2bb   Benjamin Renard   First commit
1132
1133
1134
1135
1136
1137
			break;
		default:
		{
			std::stringstream lError;
			lError << "PanelPlotOutput::drawZAxis : Bad Z axis position";
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
1138
1139
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
		}
fbe3c2bb   Benjamin Renard   First commit
1140
		}
fbe3c2bb   Benjamin Renard   First commit
1141

ba6124b0   Menouard AZIB   Add parameter id ...
1142
		_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow), std::get<2>(pPlWindow), std::get<3>(pPlWindow));
b76d3cfc   Benjamin Renard   Fix color axis po...
1143

ba6124b0   Menouard AZIB   Add parameter id ...
1144
		_pls->colorbar(
fbe3c2bb   Benjamin Renard   First commit
1145
1146
			&colorbar_width,
			&colorbar_height,
ba6124b0   Menouard AZIB   Add parameter id ...
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
			PL_COLORBAR_GRADIENT, // PL_COLORBAR_SHADE,
			position,
			0.0, // COLORBAR_X_OFFSET,
			0.0,
			COLORBAR_BODY_WIDTH,
			0.875,
			0, /*bg_color*/
			1,
			1,
			0.0,
			0.0,
			cont_color,
			cont_width,
			n_labels,
			label_opts,
			labels,
			n_axis_opts,
			axis_opts,
			axis_ticks,
			axis_subticks,
			num_values,
			(const PLFLT *const *)values);

		// reset color map
		_pls->spal1(
			ColormapManager::getInstance().get(_panel->_page->_mode,
											   ColormapManager::DEFAULT_COLORMAP_1)
				.c_str(),
			true);

		_pls->scol0(0, lInitialColor._red, lInitialColor._green, lInitialColor._blue);

		delete[] shedge;

		// Restore initial color.
		restoreColor(_pls, lInitialColor, _panel->_page->_mode);

		// Restore default plot area
		_pls->vpor(pPlotAreaSize._x,
				   pPlotAreaSize._x + pPlotAreaSize._width,
				   pPlotAreaSize._y,
				   pPlotAreaSize._y + pPlotAreaSize._height);

		_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow), std::get<2>(pPlWindow), std::get<3>(pPlWindow));

		// Set axis as drawn.
		pZAxis->_drawn = true;
fbe3c2bb   Benjamin Renard   First commit
1194
	}
fbe3c2bb   Benjamin Renard   First commit
1195

ba6124b0   Menouard AZIB   Add parameter id ...
1196
1197
	Range PanelPlotOutput::getXAxisRange(SeriesProperties &pSeries, boost::shared_ptr<Axis> pAxis)
	{
fbe3c2bb   Benjamin Renard   First commit
1198

ba6124b0   Menouard AZIB   Add parameter id ...
1199
1200
1201
1202
1203
1204
1205
		if (pSeries.hasXAxis() && pAxis.get() == nullptr)
		{
			std::stringstream lError;
			lError << "PanelPlotOutput::drawSeries"
				   << ": X axis with id '"
				   << pSeries.getXAxisId() << "' not found.";
			BOOST_THROW_EXCEPTION(
fbe3c2bb   Benjamin Renard   First commit
1206
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
ba6124b0   Menouard AZIB   Add parameter id ...
1207
1208
1209
1210
1211
1212
1213
		}
		else if (pSeries.hasXAxis())
		{
			// fill X range (plplot window).
			return (pAxis->getRange());
		}
		return Range();
fbe3c2bb   Benjamin Renard   First commit
1214
	}
fbe3c2bb   Benjamin Renard   First commit
1215

ba6124b0   Menouard AZIB   Add parameter id ...
1216
1217
	Range PanelPlotOutput::getYAxisRange(SeriesProperties &pSeries, boost::shared_ptr<Axis> pAxis)
	{
fbe3c2bb   Benjamin Renard   First commit
1218

ba6124b0   Menouard AZIB   Add parameter id ...
1219
1220
1221
1222
1223
1224
1225
		if (pSeries.hasYAxis() && pAxis.get() == nullptr)
		{
			std::stringstream lError;
			lError << "PanelPlotOutput::drawSeries"
				   << ": Y axis with id '"
				   << pSeries.getYAxisId() << "' not found.";
			BOOST_THROW_EXCEPTION(
fbe3c2bb   Benjamin Renard   First commit
1226
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
ba6124b0   Menouard AZIB   Add parameter id ...
1227
1228
1229
1230
1231
1232
1233
		}
		else if (pSeries.hasYAxis())
		{
			// fill Y range (plplot window).
			return (pAxis->getRange());
		}
		return Range();
fbe3c2bb   Benjamin Renard   First commit
1234
	}
fbe3c2bb   Benjamin Renard   First commit
1235

ba6124b0   Menouard AZIB   Add parameter id ...
1236
1237
	Range PanelPlotOutput::getZAxisRange(SeriesProperties &pSeries, boost::shared_ptr<Axis> pAxis)
	{
fbe3c2bb   Benjamin Renard   First commit
1238

ba6124b0   Menouard AZIB   Add parameter id ...
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
		if (pSeries.hasZAxis() && pAxis.get() == nullptr)
		{
			std::stringstream lError;
			lError << "PanelPlotOutput::drawSeries"
				   << ": Z axis with id '"
				   << pSeries.getYAxisId() << "' not found.";
			BOOST_THROW_EXCEPTION(
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
		}
		else if (pSeries.hasZAxis())
		{
			// fill Z range (plplot window).
			return (pAxis->getRange());
		}
		return Range();
	}
fbe3c2bb   Benjamin Renard   First commit
1255

ba6124b0   Menouard AZIB   Add parameter id ...
1256
1257
1258
1259
1260
1261
1262
	/**
	 * Convert an X axis string value to a double X value
	 */
	double PanelPlotOutput::convertXAxisValue(const std::string &value)
	{
		return std::stod(value);
	}
fbe3c2bb   Benjamin Renard   First commit
1263

ba6124b0   Menouard AZIB   Add parameter id ...
1264
1265
1266
1267
1268
1269
1270
	/**
	 * Convert an Y axis string value to a double Y value
	 */
	double PanelPlotOutput::convertYAxisValue(const std::string &value)
	{
		return std::stod(value);
	}
fbe3c2bb   Benjamin Renard   First commit
1271

ba6124b0   Menouard AZIB   Add parameter id ...
1272
1273
1274
1275
1276
1277
	/**
	 * Get colored value associated to a data value. Return false if the value is filtered.
	 */
	bool PanelPlotOutput::getColoredValue(double value, double filterMin, double filterMax, bool useLog0AsMin, PLFLT &col)
	{
		boost::shared_ptr<ColorAxis> lZAxis = _panel->getColorAxis();
fbe3c2bb   Benjamin Renard   First commit
1278

ba6124b0   Menouard AZIB   Add parameter id ...
1279
1280
		if (lZAxis == nullptr)
			return false;
fbe3c2bb   Benjamin Renard   First commit
1281

ba6124b0   Menouard AZIB   Add parameter id ...
1282
		bool filterMinMax = (isNAN(filterMin) == false) || (isNAN(filterMax) == false);
fbe3c2bb   Benjamin Renard   First commit
1283

ba6124b0   Menouard AZIB   Add parameter id ...
1284
		Range r = lZAxis->getRange();
fbe3c2bb   Benjamin Renard   First commit
1285

ba6124b0   Menouard AZIB   Add parameter id ...
1286
1287
		if (isnan(value))
			return false;
fbe3c2bb   Benjamin Renard   First commit
1288

ba6124b0   Menouard AZIB   Add parameter id ...
1289
		if ((filterMinMax == true) && ((value < filterMin) || (value > filterMax)))
fbe3c2bb   Benjamin Renard   First commit
1290
			return false;
fbe3c2bb   Benjamin Renard   First commit
1291

ba6124b0   Menouard AZIB   Add parameter id ...
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
		double correctedValue = value;
		if (lZAxis->_scale == Axis::Scale::LOGARITHMIC)
		{
			if (correctedValue <= 0)
			{
				if (useLog0AsMin)
				{
					col = 0;
					return true;
				}
				return false;
			}
fbe3c2bb   Benjamin Renard   First commit
1304

ba6124b0   Menouard AZIB   Add parameter id ...
1305
1306
			correctedValue = log10(correctedValue);
		}
fbe3c2bb   Benjamin Renard   First commit
1307

ba6124b0   Menouard AZIB   Add parameter id ...
1308
1309
1310
1311
		if (!lZAxis->_reverse)
			col = (correctedValue - r.getMin()) / (r.getMax() - r.getMin());
		else
			col = (correctedValue - r.getMax()) / (r.getMin() - r.getMax());
fbe3c2bb   Benjamin Renard   First commit
1312

ba6124b0   Menouard AZIB   Add parameter id ...
1313
1314
		return true;
	}
fbe3c2bb   Benjamin Renard   First commit
1315

ba6124b0   Menouard AZIB   Add parameter id ...
1316
1317
1318
1319
1320
1321
1322
1323
	/**
	 * Draw list of symbols
	 */
	void PanelPlotOutput::drawSymbols(SymbolType pType, int pSize, double pFactor, Color pColor,
									  int pNbData, double *pXData, double *pYData, double *pZData, double filterZMin, double filterZMax)
	{
		if (pType == SymbolType::NO)
			return;
fbe3c2bb   Benjamin Renard   First commit
1324

ba6124b0   Menouard AZIB   Add parameter id ...
1325
		Color lInitialColor;
fbe3c2bb   Benjamin Renard   First commit
1326

ba6124b0   Menouard AZIB   Add parameter id ...
1327
1328
		// Set color.
		lInitialColor = changeColor(_pls, pColor, _panel->_page->_mode);
f6eaec4e   Benjamin Renard   Optimize plot ele...
1329

ba6124b0   Menouard AZIB   Add parameter id ...
1330
		PlPlotUtil::setPlFont(_panel->_page->getFont());
3befa3ce   Benjamin Renard   Fix a bug with sy...
1331

ba6124b0   Menouard AZIB   Add parameter id ...
1332
1333
		// Set size.
		_pls->ssym(pSize, pFactor);
fbe3c2bb   Benjamin Renard   First commit
1334

ba6124b0   Menouard AZIB   Add parameter id ...
1335
1336
		// Get colored axis
		boost::shared_ptr<ColorAxis> lZAxis = _panel->getColorAxis();
fbe3c2bb   Benjamin Renard   First commit
1337

ba6124b0   Menouard AZIB   Add parameter id ...
1338
1339
1340
1341
1342
1343
1344
1345
		// draw symbols
		if ((pZData == NULL) || (lZAxis == nullptr))
			_pls->poin(pNbData, pXData, pYData, static_cast<int>(pType));
		else
		{
			// set color map
			_pls->spal1(
				ColormapManager::getInstance().getColorAxis(lZAxis->_color._colorMapIndex).c_str(), true);
fbe3c2bb   Benjamin Renard   First commit
1346

ba6124b0   Menouard AZIB   Add parameter id ...
1347
1348
1349
			// get specific colors for min / max values
			Color minValColor = lZAxis->getMinValColor();
			Color maxValColor = lZAxis->getMaxValColor();
fbe3c2bb   Benjamin Renard   First commit
1350

ba6124b0   Menouard AZIB   Add parameter id ...
1351
1352
1353
1354
1355
			PLFLT col;
			for (int i = 0; i < pNbData; ++i)
			{
				if (!getColoredValue(pZData[i], filterZMin, filterZMax, false, col))
					continue;
fbe3c2bb   Benjamin Renard   First commit
1356

ba6124b0   Menouard AZIB   Add parameter id ...
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
				if (col <= 0.)
				{
					if (minValColor.isSet())
					{
						restoreColor(_pls, minValColor, _panel->_page->_mode);
						_pls->poin(1, &pXData[i], &pYData[i], static_cast<int>(pType));
						_pls->spal1(ColormapManager::getInstance().getColorAxis(lZAxis->_color._colorMapIndex).c_str(), true);
					}
					else
					{
						_pls->col1(0);
						_pls->poin(1, &pXData[i], &pYData[i], static_cast<int>(pType));
					}
				}
				else if (col >= 1.)
				{
					if (maxValColor.isSet())
					{
						restoreColor(_pls, maxValColor, _panel->_page->_mode);
						_pls->poin(1, &pXData[i], &pYData[i], static_cast<int>(pType));
						_pls->spal1(ColormapManager::getInstance().getColorAxis(lZAxis->_color._colorMapIndex).c_str(), true);
					}
					else
					{
						_pls->col1(1);
						_pls->poin(1, &pXData[i], &pYData[i], static_cast<int>(pType));
					}
				}
				else
				{
					_pls->col1(col);
fbe3c2bb   Benjamin Renard   First commit
1388
					_pls->poin(1, &pXData[i], &pYData[i], static_cast<int>(pType));
ba6124b0   Menouard AZIB   Add parameter id ...
1389
1390
1391
				}
			}
		}
fbe3c2bb   Benjamin Renard   First commit
1392

ba6124b0   Menouard AZIB   Add parameter id ...
1393
1394
		// Restore color.
		restoreColor(_pls, lInitialColor, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
1395
1396
	}

ba6124b0   Menouard AZIB   Add parameter id ...
1397
1398
1399
1400
1401
1402
1403
1404
	/**
	 * Draw list of lines
	 */
	void PanelPlotOutput::drawLines(LineType pType, LineStyle pStyle, int pWidth, Color &pColor,
									int pNbData, double *pXData, double *pYData, double *pZData, double filterZMin, double filterZMax)
	{
		if (pType == LineType::EMPTY)
			return;
fbe3c2bb   Benjamin Renard   First commit
1405

ba6124b0   Menouard AZIB   Add parameter id ...
1406
1407
1408
1409
		if (pType != LineType::LINE)
		{
			BOOST_THROW_EXCEPTION(PanelPlotOutputException() << AMDA::ex_msg("HISTO line type can't be used in time plot. Use LINE or EMPTY type"));
		}
fbe3c2bb   Benjamin Renard   First commit
1410

ba6124b0   Menouard AZIB   Add parameter id ...
1411
		Color lInitialColor;
fbe3c2bb   Benjamin Renard   First commit
1412

ba6124b0   Menouard AZIB   Add parameter id ...
1413
1414
		// Set color.
		lInitialColor = changeColor(_pls, pColor, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
1415

ba6124b0   Menouard AZIB   Add parameter id ...
1416
1417
		// Set line type.
		_pls->lsty(static_cast<int>(getPlLineStyle(pStyle)));
fbe3c2bb   Benjamin Renard   First commit
1418

ba6124b0   Menouard AZIB   Add parameter id ...
1419
1420
		// Set line thickness.
		_pls->width(pWidth);
fbe3c2bb   Benjamin Renard   First commit
1421

ba6124b0   Menouard AZIB   Add parameter id ...
1422
1423
		// Get colored axis
		boost::shared_ptr<ColorAxis> lZAxis = _panel->getColorAxis();
fbe3c2bb   Benjamin Renard   First commit
1424

ba6124b0   Menouard AZIB   Add parameter id ...
1425
1426
		// draw lines.
		if ((pZData == NULL) || (lZAxis == nullptr))
fbe3c2bb   Benjamin Renard   First commit
1427
		{
ba6124b0   Menouard AZIB   Add parameter id ...
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
			_pls->line(pNbData, pXData, pYData);
		}
		else
		{
			// set color map
			_pls->spal1(
				ColormapManager::getInstance().getColorAxis(lZAxis->_color._colorMapIndex).c_str(), true);

			// get specific colors for min / max values
			Color minValColor = lZAxis->getMinValColor();
			Color maxValColor = lZAxis->getMaxValColor();

			PLFLT col;
			for (int i = 0; i < pNbData - 1; ++i)
			{
				if (!getColoredValue(pZData[i], filterZMin, filterZMax, false, col))
					continue;
fbe3c2bb   Benjamin Renard   First commit
1445

ba6124b0   Menouard AZIB   Add parameter id ...
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
				if (col <= 0.)
				{
					if (minValColor.isSet())
					{
						restoreColor(_pls, minValColor, _panel->_page->_mode);
						_pls->line(2, &pXData[i], &pYData[i]);
						_pls->spal1(ColormapManager::getInstance().getColorAxis(lZAxis->_color._colorMapIndex).c_str(), true);
					}
					else
					{
						_pls->col1(0);
						_pls->line(2, &pXData[i], &pYData[i]);
					}
				}
				else if (col >= 1.)
				{
					if (maxValColor.isSet())
					{
						restoreColor(_pls, maxValColor, _panel->_page->_mode);
						_pls->line(2, &pXData[i], &pYData[i]);
						_pls->spal1(ColormapManager::getInstance().getColorAxis(lZAxis->_color._colorMapIndex).c_str(), true);
					}
					else
					{
						_pls->col1(1);
						_pls->line(2, &pXData[i], &pYData[i]);
					}
				}
				else
				{
					_pls->col1(col);
fbe3c2bb   Benjamin Renard   First commit
1477
					_pls->line(2, &pXData[i], &pYData[i]);
ba6124b0   Menouard AZIB   Add parameter id ...
1478
1479
1480
				}
			}
		}
e257cfb9   Benjamin Renard   First implementat...
1481

ba6124b0   Menouard AZIB   Add parameter id ...
1482
1483
1484
		// Restore color.
		restoreColor(_pls, lInitialColor, _panel->_page->_mode);
	}
fbe3c2bb   Benjamin Renard   First commit
1485

ba6124b0   Menouard AZIB   Add parameter id ...
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
	/**
	 * Draw a rectangle
	 */
	void PanelPlotOutput::drawRectangle(double xmin, double xmax, double ymin, double ymax, Color &color, double alpha)
	{
		if (!color.isSet())
		{
			return;
		}

		Color lInitialColor;
fbe3c2bb   Benjamin Renard   First commit
1497

ba6124b0   Menouard AZIB   Add parameter id ...
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
		// Set color.
		lInitialColor = changeColor(_pls, color, _panel->_page->_mode);

		// Draw rectangle
		PLFLT x[4], y[4];

		x[0] = xmin;
		x[1] = xmin;
		x[2] = xmax;
		x[3] = xmax;
		y[0] = ymin;
		y[1] = ymax;
		y[2] = ymax;
		y[3] = ymin;

		// Fill rectangle
		PLINT icol = 0;
		PLINT r, g, b = 0;
		PLFLT a = 0;
		_pls->gcol0a(icol, r, g, b, a);
		a = alpha;
		_pls->scol0a(icol, r, g, b, a);
		_pls->col0(icol);
		_pls->fill(4, x, y);

		// Restore color.
		restoreColor(_pls, lInitialColor, _panel->_page->_mode);
	}
fbe3c2bb   Benjamin Renard   First commit
1526

ba6124b0   Menouard AZIB   Add parameter id ...
1527
1528
1529
1530
1531
	/*
	 * @brief Draw a matrix
	 */
	void PanelPlotOutput::drawMatrix(MatrixGrid &matrixGrid, double minDataVal, double maxDataVal,
									 Color minValColor, Color maxValColor, int colorMapIndex, bool useLog0AsMin)
fbe3c2bb   Benjamin Renard   First commit
1532
	{
ba6124b0   Menouard AZIB   Add parameter id ...
1533
1534
1535
		// set color map
		_pls->spal1(
			ColormapManager::getInstance().getColorAxis(colorMapIndex).c_str(), true);
fbe3c2bb   Benjamin Renard   First commit
1536

ba6124b0   Menouard AZIB   Add parameter id ...
1537
1538
		Color lInitialColor;
		_pls->gcol0(0, lInitialColor._red, lInitialColor._green, lInitialColor._blue);
fbe3c2bb   Benjamin Renard   First commit
1539

ba6124b0   Menouard AZIB   Add parameter id ...
1540
1541
1542
		// plot matrix
		PLFLT x[4], y[4];
		PLFLT col;
f2db3c16   Benjamin Renard   Support variable ...
1543

ba6124b0   Menouard AZIB   Add parameter id ...
1544
		for (auto part : matrixGrid)
fbe3c2bb   Benjamin Renard   First commit
1545
		{
ba6124b0   Menouard AZIB   Add parameter id ...
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
			x[0] = part.x[0];
			x[1] = part.x[1];
			x[2] = x[1];
			x[3] = x[0];

			y[0] = part.y[0];
			y[1] = y[0];
			y[2] = part.y[1];
			y[3] = y[2];

			if (isNAN(part.value))
fbe3c2bb   Benjamin Renard   First commit
1557
				continue;
fbe3c2bb   Benjamin Renard   First commit
1558

ba6124b0   Menouard AZIB   Add parameter id ...
1559
			if (!part.isColorIndex)
fbe3c2bb   Benjamin Renard   First commit
1560
			{
ba6124b0   Menouard AZIB   Add parameter id ...
1561
1562
				if (!getColoredValue(part.value, minDataVal, maxDataVal, useLog0AsMin, col))
					continue;
fbe3c2bb   Benjamin Renard   First commit
1563
1564
1565
			}
			else
			{
ba6124b0   Menouard AZIB   Add parameter id ...
1566
1567
				Color dataValueColor(colorMapIndex, (int)part.value);
				restoreColor(_pls, dataValueColor, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
1568
				_pls->fill(4, x, y);
ba6124b0   Menouard AZIB   Add parameter id ...
1569
1570
				_pls->spal1(ColormapManager::getInstance().getColorAxis(colorMapIndex).c_str(), true);
				continue;
fbe3c2bb   Benjamin Renard   First commit
1571
			}
ba6124b0   Menouard AZIB   Add parameter id ...
1572
1573

			if (col <= 0.)
fbe3c2bb   Benjamin Renard   First commit
1574
			{
ba6124b0   Menouard AZIB   Add parameter id ...
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
				if (minValColor.isSet())
				{
					restoreColor(_pls, minValColor, _panel->_page->_mode);
					_pls->fill(4, x, y);
					_pls->spal1(ColormapManager::getInstance().getColorAxis(colorMapIndex).c_str(), true);
				}
				else
				{
					_pls->col1(0);
					_pls->fill(4, x, y);
				}
			}
			else if (col >= 1.)
			{
				if (maxValColor.isSet())
				{
					restoreColor(_pls, maxValColor, _panel->_page->_mode);
					_pls->fill(4, x, y);
					_pls->spal1(ColormapManager::getInstance().getColorAxis(colorMapIndex).c_str(), true);
				}
				else
				{
					_pls->col1(1);
					_pls->fill(4, x, y);
				}
fbe3c2bb   Benjamin Renard   First commit
1600
1601
1602
			}
			else
			{
ba6124b0   Menouard AZIB   Add parameter id ...
1603
				_pls->col1(col);
fbe3c2bb   Benjamin Renard   First commit
1604
1605
1606
				_pls->fill(4, x, y);
			}
		}
fbe3c2bb   Benjamin Renard   First commit
1607

ba6124b0   Menouard AZIB   Add parameter id ...
1608
1609
		// restore to initial color context
		_pls->spal1(
fbe3c2bb   Benjamin Renard   First commit
1610
			ColormapManager::getInstance().get(_panel->_page->_mode,
ba6124b0   Menouard AZIB   Add parameter id ...
1611
1612
1613
1614
											   ColormapManager::DEFAULT_COLORMAP_1)
				.c_str(),
			true);
		_pls->scol0(0, lInitialColor._red, lInitialColor._green, lInitialColor._blue);
fbe3c2bb   Benjamin Renard   First commit
1615

ba6124b0   Menouard AZIB   Add parameter id ...
1616
1617
1618
		// Restore color.
		restoreColor(_pls, lInitialColor, _panel->_page->_mode);
	}
fbe3c2bb   Benjamin Renard   First commit
1619

ba6124b0   Menouard AZIB   Add parameter id ...
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
	/**
	 * Draw errors segments
	 */
	void PanelPlotOutput::drawYErrors(
		LineType pType,
		LineStyle pStyle,
		int pWidth,
		Color &pColor,
		int pNbData,
		double *pXData,
		double *pYMinData,
		double *pYMaxData)
fbe3c2bb   Benjamin Renard   First commit
1632
	{
ba6124b0   Menouard AZIB   Add parameter id ...
1633
1634
		if (pType == LineType::EMPTY)
			return;
fbe3c2bb   Benjamin Renard   First commit
1635

ba6124b0   Menouard AZIB   Add parameter id ...
1636
1637
1638
1639
		if (pType != LineType::LINE)
		{
			BOOST_THROW_EXCEPTION(PanelPlotOutputException() << AMDA::ex_msg("HISTO line type can't be used in time plot. Use LINE or EMPTY type"));
		}
fbe3c2bb   Benjamin Renard   First commit
1640

ba6124b0   Menouard AZIB   Add parameter id ...
1641
		Color lInitialColor;
fbe3c2bb   Benjamin Renard   First commit
1642

ba6124b0   Menouard AZIB   Add parameter id ...
1643
1644
		// Set color.
		lInitialColor = changeColor(_pls, pColor, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
1645

ba6124b0   Menouard AZIB   Add parameter id ...
1646
1647
		// Set line type.
		_pls->lsty(static_cast<int>(getPlLineStyle(pStyle)));
fbe3c2bb   Benjamin Renard   First commit
1648

ba6124b0   Menouard AZIB   Add parameter id ...
1649
1650
		// Set line thickness.
		_pls->width(pWidth);
fbe3c2bb   Benjamin Renard   First commit
1651

ba6124b0   Menouard AZIB   Add parameter id ...
1652
1653
		// Set the default tich with
		_pls->smin(0, 0.5);
fbe3c2bb   Benjamin Renard   First commit
1654

ba6124b0   Menouard AZIB   Add parameter id ...
1655
1656
		// Draw error bars
		_pls->erry(pNbData, pXData, pYMinData, pYMaxData);
fbe3c2bb   Benjamin Renard   First commit
1657

ba6124b0   Menouard AZIB   Add parameter id ...
1658
1659
1660
		// Restore color.
		restoreColor(_pls, lInitialColor, _panel->_page->_mode);
	}
fbe3c2bb   Benjamin Renard   First commit
1661

ba6124b0   Menouard AZIB   Add parameter id ...
1662
1663
1664
1665
1666
1667
	/**
	 * Draws X constant lines linked to axis
	 */
	void PanelPlotOutput::drawXConstantLines(boost::shared_ptr<Axis> pAxis, PlWindow &pPlWindow)
	{
		double x[2], y[2];
078ec265   Benjamin Renard   Give the possibil...
1668

ba6124b0   Menouard AZIB   Add parameter id ...
1669
		_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow), std::get<2>(pPlWindow), std::get<3>(pPlWindow));
fbe3c2bb   Benjamin Renard   First commit
1670

ba6124b0   Menouard AZIB   Add parameter id ...
1671
1672
1673
1674
1675
1676
1677
1678
		for (auto constantLine : pAxis->_constantLines)
		{
			if (constantLine->isDrawn())
				continue;
			x[0] = convertXAxisValue(constantLine->getValue());
			x[1] = convertXAxisValue(constantLine->getValue());
			y[0] = std::get<2>(pPlWindow);
			y[1] = std::get<3>(pPlWindow);
fbe3c2bb   Benjamin Renard   First commit
1679

ba6124b0   Menouard AZIB   Add parameter id ...
1680
1681
1682
1683
1684
1685
1686
			if (pAxis->_scale == Axis::Scale::LOGARITHMIC)
			{
				x[0] = log10(x[0]);
				x[1] = log10(x[1]);
			}

			drawLines(
fbe3c2bb   Benjamin Renard   First commit
1687
1688
1689
1690
1691
1692
				LineType::LINE,
				constantLine->getStyle(),
				constantLine->getWidth(),
				constantLine->getColor(),
				2, x, y);

ba6124b0   Menouard AZIB   Add parameter id ...
1693
1694
			constantLine->setDrawn(true);
		}
fbe3c2bb   Benjamin Renard   First commit
1695
	}
fbe3c2bb   Benjamin Renard   First commit
1696

ba6124b0   Menouard AZIB   Add parameter id ...
1697
1698
1699
1700
1701
1702
	/**
	 * Draws Y constant lines linked to axis
	 */
	void PanelPlotOutput::drawYConstantLines(boost::shared_ptr<Axis> pAxis, PlWindow &pPlWindow)
	{
		double x[2], y[2];
fbe3c2bb   Benjamin Renard   First commit
1703

ba6124b0   Menouard AZIB   Add parameter id ...
1704
		_pls->wind(std::get<0>(pPlWindow), std::get<1>(pPlWindow), std::get<2>(pPlWindow), std::get<3>(pPlWindow));
078ec265   Benjamin Renard   Give the possibil...
1705

ba6124b0   Menouard AZIB   Add parameter id ...
1706
1707
1708
1709
		for (auto constantLine : pAxis->_constantLines)
		{
			if (constantLine->isDrawn())
				continue;
fbe3c2bb   Benjamin Renard   First commit
1710

ba6124b0   Menouard AZIB   Add parameter id ...
1711
1712
1713
1714
			x[0] = std::get<0>(pPlWindow);
			x[1] = std::get<1>(pPlWindow);
			y[0] = convertYAxisValue(constantLine->getValue());
			y[1] = convertYAxisValue(constantLine->getValue());
fbe3c2bb   Benjamin Renard   First commit
1715

ba6124b0   Menouard AZIB   Add parameter id ...
1716
1717
1718
1719
1720
			if (pAxis->_scale == Axis::Scale::LOGARITHMIC)
			{
				y[0] = log10(y[0]);
				y[1] = log10(y[1]);
			}
fbe3c2bb   Benjamin Renard   First commit
1721

ba6124b0   Menouard AZIB   Add parameter id ...
1722
			drawLines(
fbe3c2bb   Benjamin Renard   First commit
1723
1724
1725
1726
1727
1728
				LineType::LINE,
				constantLine->getStyle(),
				constantLine->getWidth(),
				constantLine->getColor(),
				2, x, y);

ba6124b0   Menouard AZIB   Add parameter id ...
1729
1730
			constantLine->setDrawn(true);
		}
fbe3c2bb   Benjamin Renard   First commit
1731
	}
fbe3c2bb   Benjamin Renard   First commit
1732

ba6124b0   Menouard AZIB   Add parameter id ...
1733
1734
1735
1736
1737
1738
1739
	/**
	 * Draws TextPlots
	 */
	void PanelPlotOutput::drawTextPlots(boost::shared_ptr<Axis> pXAxis, boost::shared_ptr<Axis> pYAxis, PlWindow &pPlWindow, const TextPlots &textPlots)
	{
		double x, y;
		double x1, x2, y1, y2;
fbe3c2bb   Benjamin Renard   First commit
1740

ba6124b0   Menouard AZIB   Add parameter id ...
1741
1742
1743
1744
		x1 = std::get<0>(pPlWindow);
		x2 = std::get<1>(pPlWindow);
		y1 = std::get<2>(pPlWindow);
		y2 = std::get<3>(pPlWindow);
fbe3c2bb   Benjamin Renard   First commit
1745

ba6124b0   Menouard AZIB   Add parameter id ...
1746
		_pls->wind(x1, x2, y1, y2);
078ec265   Benjamin Renard   Give the possibil...
1747

ba6124b0   Menouard AZIB   Add parameter id ...
1748
1749
1750
1751
		for (auto textPlot : textPlots)
		{
			if (textPlot->isDrawn())
				continue;
fbe3c2bb   Benjamin Renard   First commit
1752

ba6124b0   Menouard AZIB   Add parameter id ...
1753
1754
			if (!textPlot->_xAxisId.empty() && (textPlot->_xAxisId.compare(pXAxis->_id) != 0))
				continue;
078ec265   Benjamin Renard   Give the possibil...
1755

ba6124b0   Menouard AZIB   Add parameter id ...
1756
1757
			if (!textPlot->_yAxisId.empty() && (textPlot->_yAxisId.compare(pYAxis->_id) != 0))
				continue;
078ec265   Benjamin Renard   Give the possibil...
1758

ba6124b0   Menouard AZIB   Add parameter id ...
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
			// Compute x y position for the text
			if (textPlot->_x.find("%") != std::string::npos)
			{
				// Remove % before conversion
				int pos = textPlot->_x.find("%");
				std::string xPos = textPlot->_x;
				xPos.erase(pos);
				// Compute x value as a percent of the x value
				x = x1 + (x2 - x1) * std::stod(xPos) / 100.0;
			}
			else
			{
				x = convertXAxisValue(textPlot->_x);
			}
fbe3c2bb   Benjamin Renard   First commit
1773

ba6124b0   Menouard AZIB   Add parameter id ...
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
			if (textPlot->_y.find("%") != std::string::npos)
			{
				// Remove % before conversion
				int pos = textPlot->_y.find("%");
				std::string yPos = textPlot->_y;
				yPos.erase(pos);
				// Compute x value as a percent of the x value
				y = y1 + (y2 - y1) * std::stod(yPos) / 100.0;
			}
			else
			{
				y = convertYAxisValue(textPlot->_y);
			}
fbe3c2bb   Benjamin Renard   First commit
1787

ba6124b0   Menouard AZIB   Add parameter id ...
1788
1789
			// Select font family, size, style and weight
			PlPlotUtil::setPlFont(textPlot->getFont());
fbe3c2bb   Benjamin Renard   First commit
1790

ba6124b0   Menouard AZIB   Add parameter id ...
1791
1792
			// Set color
			Color lInitialColor = changeColor(_pls, textPlot->_color, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
1793

ba6124b0   Menouard AZIB   Add parameter id ...
1794
1795
1796
			// Compute dx & dy orientation
			double dx = cos(textPlot->_angle * M_PI / 180) * (x2 - x1) / 10.0;
			double dy = sin(textPlot->_angle * M_PI / 180) * (y2 - y1) / 10.0 * _panelPlotXYRatio;
fbe3c2bb   Benjamin Renard   First commit
1797

ba6124b0   Menouard AZIB   Add parameter id ...
1798
1799
			// Draw text
			_pls->ptex(x, y, dx, dy, textPlot->_align, textPlot->_text.c_str());
fbe3c2bb   Benjamin Renard   First commit
1800

ba6124b0   Menouard AZIB   Add parameter id ...
1801
1802
			// Restore initial color.
			restoreColor(_pls, lInitialColor, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
1803

ba6124b0   Menouard AZIB   Add parameter id ...
1804
1805
			textPlot->setDrawn(true);
		}
fbe3c2bb   Benjamin Renard   First commit
1806
	}
fbe3c2bb   Benjamin Renard   First commit
1807

ba6124b0   Menouard AZIB   Add parameter id ...
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
	/*
	 * @brief Draw interval
	 */
	void PanelPlotOutput::drawSerieInterval(SeriesProperties &pSeries,
											double *xValues, double *yValues, double *timeValues,
											int nbValues, int intervalIndex)
	{
		LOG4CXX_DEBUG(gLogger, "PanelPlotOutput::drawSerieInterval");

		IntervalTickProperties itProps = pSeries.getIntervalTickProperties();
fbe3c2bb   Benjamin Renard   First commit
1818

ba6124b0   Menouard AZIB   Add parameter id ...
1819
1820
1821
		// Draw Interval ticks if required !
		if (itProps.getMode() == IntervalTickMode::NONE)
			return;
fbe3c2bb   Benjamin Renard   First commit
1822

ba6124b0   Menouard AZIB   Add parameter id ...
1823
1824
1825
		// Get X and Y axis.
		boost::shared_ptr<Axis> lXAxis(_panel->getAxis(pSeries.getXAxisId()));
		boost::shared_ptr<Axis> lYAxis(_panel->getAxis(pSeries.getYAxisId()));
fbe3c2bb   Benjamin Renard   First commit
1826

ba6124b0   Menouard AZIB   Add parameter id ...
1827
1828
		Range lXRange = getXAxisRange(pSeries, lXAxis);
		Range lYRange = getYAxisRange(pSeries, lYAxis);
fbe3c2bb   Benjamin Renard   First commit
1829

ba6124b0   Menouard AZIB   Add parameter id ...
1830
		PlWindow lPlWindow = PlWindow(lXRange.getMin(), lXRange.getMax(), lYRange.getMin(), lYRange.getMax());
fbe3c2bb   Benjamin Renard   First commit
1831

ba6124b0   Menouard AZIB   Add parameter id ...
1832
1833
1834
1835
		// prepare data for plot
		double xData[2] = {NAN, NAN};
		double yData[2] = {NAN, NAN};
		double timeData[2] = {NAN, NAN};
fbe3c2bb   Benjamin Renard   First commit
1836

ba6124b0   Menouard AZIB   Add parameter id ...
1837
1838
1839
1840
1841
1842
1843
1844
1845
		// skip NAN values
		for (int i = 0; i < nbValues; ++i)
			if (!isNAN(xValues[i]) && !isNAN(yValues[i]))
			{
				xData[0] = xValues[i];
				yData[0] = yValues[i];
				timeData[0] = timeValues[i];
				break;
			}
fbe3c2bb   Benjamin Renard   First commit
1846

ba6124b0   Menouard AZIB   Add parameter id ...
1847
1848
1849
1850
1851
1852
1853
1854
		for (int i = nbValues - 1; i >= 0; --i)
			if (!isNAN(xValues[i]) && !isNAN(yValues[i]))
			{
				xData[1] = xValues[i];
				yData[1] = yValues[i];
				timeData[1] = timeValues[i];
				break;
			}
fbe3c2bb   Benjamin Renard   First commit
1855

ba6124b0   Menouard AZIB   Add parameter id ...
1856
1857
1858
1859
1860
1861
		// draw symbols
		drawSymbols(
			itProps.getSymbol().getType(),
			itProps.getSymbol().getSize(), 1.,
			itProps.getSymbol().getColor(),
			2, (double *)&xData, (double *)&yData, NULL);
fbe3c2bb   Benjamin Renard   First commit
1862

ba6124b0   Menouard AZIB   Add parameter id ...
1863
1864
		if (itProps.getMode() == IntervalTickMode::SYMBOL_ONLY)
			return;
fbe3c2bb   Benjamin Renard   First commit
1865

ba6124b0   Menouard AZIB   Add parameter id ...
1866
1867
		// Add start interval info to a list of TextPlot
		TextPlots textPlots;
fbe3c2bb   Benjamin Renard   First commit
1868

ba6124b0   Menouard AZIB   Add parameter id ...
1869
1870
1871
		TextPlot baseTextPlot;
		baseTextPlot._color = itProps.getColor();
		baseTextPlot.setFont(itProps.getFont());
fbe3c2bb   Benjamin Renard   First commit
1872

ba6124b0   Menouard AZIB   Add parameter id ...
1873
		boost::shared_ptr<TextPlot> startTextPlot(new TextPlot(baseTextPlot));
fbe3c2bb   Benjamin Renard   First commit
1874

ba6124b0   Menouard AZIB   Add parameter id ...
1875
1876
1877
		double xPos = (xData[0] - lXRange.getMin()) / (lXRange.getMax() - lXRange.getMin()) * 100;
		startTextPlot->_x = boost::lexical_cast<std::string>(xPos);
		startTextPlot->_x += "%";
fbe3c2bb   Benjamin Renard   First commit
1878

ba6124b0   Menouard AZIB   Add parameter id ...
1879
1880
1881
		double yPos = (yData[0] - lYRange.getMin()) / (lYRange.getMax() - lYRange.getMin()) * 100 + 1.5;
		startTextPlot->_y = boost::lexical_cast<std::string>(yPos);
		startTextPlot->_y += "%";
fbe3c2bb   Benjamin Renard   First commit
1882

ba6124b0   Menouard AZIB   Add parameter id ...
1883
1884
1885
1886
1887
1888
1889
		if (itProps.getMode() == IntervalTickMode::INTERVAL_INDEX)
		{
			startTextPlot->_text = "I";
			startTextPlot->_text += std::to_string(intervalIndex);
		}
		else
			startTextPlot->_text = AMDA::TimeUtil::formatTimeDateInIso(timeData[0]);
fbe3c2bb   Benjamin Renard   First commit
1890

ba6124b0   Menouard AZIB   Add parameter id ...
1891
		textPlots.push_back(startTextPlot);
fbe3c2bb   Benjamin Renard   First commit
1892

ba6124b0   Menouard AZIB   Add parameter id ...
1893
1894
1895
		if (itProps.getMode() != IntervalTickMode::START_TIME)
		{
			boost::shared_ptr<TextPlot> stopTextPlot(new TextPlot(baseTextPlot));
fbe3c2bb   Benjamin Renard   First commit
1896

ba6124b0   Menouard AZIB   Add parameter id ...
1897
1898
1899
			xPos = (xData[1] - lXRange.getMin()) / (lXRange.getMax() - lXRange.getMin()) * 100;
			stopTextPlot->_x = boost::lexical_cast<std::string>(xPos);
			stopTextPlot->_x += "%";
fbe3c2bb   Benjamin Renard   First commit
1900

ba6124b0   Menouard AZIB   Add parameter id ...
1901
1902
1903
			yPos = (yData[1] - lYRange.getMin()) / (lYRange.getMax() - lYRange.getMin()) * 100 + 1.5;
			stopTextPlot->_y = boost::lexical_cast<std::string>(yPos);
			stopTextPlot->_y += "%";
fbe3c2bb   Benjamin Renard   First commit
1904

ba6124b0   Menouard AZIB   Add parameter id ...
1905
1906
1907
1908
			if (itProps.getMode() == IntervalTickMode::INTERVAL_INDEX)
				stopTextPlot->_text = startTextPlot->_text;
			else
				stopTextPlot->_text = AMDA::TimeUtil::formatTimeDateInIso(timeData[1]);
fbe3c2bb   Benjamin Renard   First commit
1909

ba6124b0   Menouard AZIB   Add parameter id ...
1910
1911
			textPlots.push_back(stopTextPlot);
		}
fbe3c2bb   Benjamin Renard   First commit
1912

ba6124b0   Menouard AZIB   Add parameter id ...
1913
		drawTextPlots(lXAxis, lYAxis, lPlWindow, textPlots);
fbe3c2bb   Benjamin Renard   First commit
1914
1915
	}

ba6124b0   Menouard AZIB   Add parameter id ...
1916
1917
1918
1919
1920
1921
	/**
	 * @brief Draw parameters legend.
	 */
	void PanelPlotOutput::drawParamsLegend(void)
	{
		ParamsLegendProperties &legendProp = _panel->_paramsLegendProperties;
fbe3c2bb   Benjamin Renard   First commit
1922

ba6124b0   Menouard AZIB   Add parameter id ...
1923
1924
		if (!legendProp.isVisible() || legendProp.isDrawn())
			return;
fbe3c2bb   Benjamin Renard   First commit
1925

ba6124b0   Menouard AZIB   Add parameter id ...
1926
		std::list<LegendLineProperties> lines = legendProp.getLegendLines();
fbe3c2bb   Benjamin Renard   First commit
1927

ba6124b0   Menouard AZIB   Add parameter id ...
1928
1929
		if (lines.empty())
			return;
fbe3c2bb   Benjamin Renard   First commit
1930

ba6124b0   Menouard AZIB   Add parameter id ...
1931
1932
		// init arguments to call pllegend function
		PLINT nbLines = lines.size();
fbe3c2bb   Benjamin Renard   First commit
1933

ba6124b0   Menouard AZIB   Add parameter id ...
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
		PLINT opt_array[nbLines];
		PLINT text_colors[nbLines];
		PLINT line_colors[nbLines];
		PLINT line_styles[nbLines];
		PLFLT line_widths[nbLines];
		PLINT symbol_numbers[nbLines];
		PLINT symbol_colors[nbLines];
		PLFLT symbol_scales[nbLines];
		const char *symbols[nbLines];
		const char *texts[nbLines];
fbe3c2bb   Benjamin Renard   First commit
1944

ba6124b0   Menouard AZIB   Add parameter id ...
1945
1946
1947
		int index = 0;
		std::string symbol_str[nbLines];
		for (auto line : lines)
fbe3c2bb   Benjamin Renard   First commit
1948
		{
ba6124b0   Menouard AZIB   Add parameter id ...
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
			opt_array[index] = 0;
			// set line options
			if (!legendProp.isOnlyText() && line.isLineVisible())
			{
				opt_array[index] |= PL_LEGEND_LINE;
				line_colors[index] = legendProp.getColorIndex(_pls.get(), line.getLineProperties().getColor());
				line_styles[index] = static_cast<int>(getPlLineStyle(line.getLineProperties().getStyle()));
				line_widths[index] = line.getLineProperties().getWidth();
			}
			// set symbols options
			if (!legendProp.isOnlyText() && line.isSymbolsVisible())
			{
				opt_array[index] |= PL_LEGEND_SYMBOL;
				symbol_numbers[index] = LEGEND_NB_SYMBOLS_TO_DRAW;
				symbol_colors[index] = legendProp.getColorIndex(_pls.get(), line.getSymbolProperties().getColor());
				symbol_scales[index] = (double)line.getSymbolProperties().getSize() / PlPlotUtil::DEFAULT_CHARACTER_SIZE;
				std::stringstream workingstr;
				workingstr << "#(" << fontTypeToSymSymbol[line.getSymbolProperties().getType()] << ")";
				symbol_str[index] = workingstr.str();
				symbols[index] = symbol_str[index].c_str();
			}
fbe3c2bb   Benjamin Renard   First commit
1970

ba6124b0   Menouard AZIB   Add parameter id ...
1971
1972
1973
1974
			text_colors[index] = legendProp.getColorIndex(_pls.get(), line.getTextColor(legendProp.isOnlyText()));
			texts[index] = line.getText();
			++index;
		}
fbe3c2bb   Benjamin Renard   First commit
1975

ba6124b0   Menouard AZIB   Add parameter id ...
1976
1977
		PLFLT legend_width, legend_height;
		PLINT opt = PL_LEGEND_BACKGROUND;
fbe3c2bb   Benjamin Renard   First commit
1978

ba6124b0   Menouard AZIB   Add parameter id ...
1979
1980
1981
		// show or hide bounding box
		if (legendProp.isBorderVisible())
			opt |= PL_LEGEND_BOUNDING_BOX;
fbe3c2bb   Benjamin Renard   First commit
1982

ba6124b0   Menouard AZIB   Add parameter id ...
1983
1984
1985
1986
		PLINT position = PL_POSITION_VIEWPORT;
		switch (legendProp.getPosition())
		{
		case ParamsLegendPosition::POS_INSIDE:
fbe3c2bb   Benjamin Renard   First commit
1987
1988
			position |= PL_POSITION_INSIDE | PL_POSITION_TOP | PL_POSITION_RIGHT;
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
1989
		case ParamsLegendPosition::POS_OUTSIDE:
fbe3c2bb   Benjamin Renard   First commit
1990
1991
			position |= PL_POSITION_OUTSIDE | PL_POSITION_RIGHT;
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
1992
		default:
fbe3c2bb   Benjamin Renard   First commit
1993
1994
			LOG4CXX_WARN(gLogger, "Legend position not implemented => set to POS_INSIDE");
			position |= PL_POSITION_INSIDE | PL_POSITION_TOP | PL_POSITION_RIGHT;
ba6124b0   Menouard AZIB   Add parameter id ...
1995
		}
fbe3c2bb   Benjamin Renard   First commit
1996

ba6124b0   Menouard AZIB   Add parameter id ...
1997
1998
1999
		// define offset
		PLFLT x_offset = 0.0;
		PLFLT y_offset = 0.0;
fbe3c2bb   Benjamin Renard   First commit
2000

ba6124b0   Menouard AZIB   Add parameter id ...
2001
2002
2003
		switch (legendProp.getPosition())
		{
		case ParamsLegendPosition::POS_INSIDE:
fbe3c2bb   Benjamin Renard   First commit
2004
2005
2006
			x_offset = LEGEND_INSIDE_OFFSET;
			y_offset = LEGEND_INSIDE_OFFSET * _panelPlotXYRatio;
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
2007
		case ParamsLegendPosition::POS_OUTSIDE:
8b6d84db   Benjamin Renard   Fix legend positi...
2008
			x_offset = LEGEND_OUTSIDE_OFFSET;
fbe3c2bb   Benjamin Renard   First commit
2009
2010
			y_offset = 0.0;
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
2011
		default:
fbe3c2bb   Benjamin Renard   First commit
2012
2013
			x_offset = LEGEND_INSIDE_OFFSET;
			y_offset = LEGEND_INSIDE_OFFSET * _panelPlotXYRatio;
ba6124b0   Menouard AZIB   Add parameter id ...
2014
		}
fbe3c2bb   Benjamin Renard   First commit
2015

ba6124b0   Menouard AZIB   Add parameter id ...
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
		// show or hide line and symbols
		PLFLT plot_width = 0;
		if (!legendProp.isOnlyText())
			plot_width = LEGEND_LINE_SYM_WIDTH;

		// background color = panel color
		PLINT bg_color = legendProp.getColorIndex(_pls.get(), _panel->_backgroundColor);

		// bounding box
		PLINT bb_color = legendProp.getColorIndex(_pls.get(), legendProp.getBorderColor());
		PLINT bb_style = 1;

		// text option
		PLFLT text_offset = 0.0;
		if (!legendProp.isOnlyText())
			text_offset = LEGEND_TEXT_OFFSET;
		PLFLT text_scale = PlPlotUtil::getPlFontScaleFactor(legendProp.getFont());
		PLFLT text_spacing = LEGEND_TEXT_SPACING;
		PLFLT text_justification = LEGEND_TEXT_JUSTIFICATION;

		// colored boxes not used
		PLINT *box_colors = NULL;
		PLINT *box_patterns = NULL;
		PLFLT *box_scales = NULL;
		PLFLT *box_line_widths = NULL;

		// save color
		Color fakeColor;
		Color initialColor = changeColor(_pls, fakeColor,
										 _panel->_page->_mode);

		// set viewport
		_pls->vpor(_plotAreaBounds._x,
				   _plotAreaBounds._x + _plotAreaBounds._width + legendProp.getLeftOffset(),
				   _plotAreaBounds._y,
				   _plotAreaBounds._y + _plotAreaBounds._height);

		// set font
		PlPlotUtil::setPlFont(legendProp.getFont());

		// init cmap0 to draw legend
		std::vector<Color> colors = legendProp.getColorsMap();
		_pls->scmap0n(colors.size());
		index = 0;

		for (auto color : colors)
		{
			_pls->scol0(index, color._red, color._green, color._blue);
			++index;
		}
fbe3c2bb   Benjamin Renard   First commit
2066

ba6124b0   Menouard AZIB   Add parameter id ...
2067
2068
		// draw tthe legend
		_pls->legend(
fbe3c2bb   Benjamin Renard   First commit
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
			&legend_width,
			&legend_height,
			opt,
			position,
			x_offset,
			y_offset,
			plot_width,
			bg_color,
			bb_color,
			bb_style,
			0, /* nrow */
			0, /* ncolumn */
			nbLines,
			opt_array,
			text_offset,
			text_scale,
			text_spacing,
			text_justification,
			text_colors,
ba6124b0   Menouard AZIB   Add parameter id ...
2088
			(const char **)texts,
fbe3c2bb   Benjamin Renard   First commit
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
			box_colors,
			box_patterns,
			box_scales,
			box_line_widths,
			line_colors,
			line_styles,
			line_widths,
			symbol_colors,
			symbol_scales,
			symbol_numbers,
ba6124b0   Menouard AZIB   Add parameter id ...
2099
			(const char **)symbols);
fbe3c2bb   Benjamin Renard   First commit
2100

ba6124b0   Menouard AZIB   Add parameter id ...
2101
2102
		// Restore initial color.
		restoreColor(_pls, initialColor, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
2103

ba6124b0   Menouard AZIB   Add parameter id ...
2104
2105
		legendProp.setDrawn(true);
	}
fbe3c2bb   Benjamin Renard   First commit
2106

ba6124b0   Menouard AZIB   Add parameter id ...
2107
2108
2109
	/**
	 * @brief Draw text legends.
	 */
fbe3c2bb   Benjamin Renard   First commit
2110

ba6124b0   Menouard AZIB   Add parameter id ...
2111
2112
2113
2114
2115
2116
	void PanelPlotOutput::drawTextLegends(void)
	{
		double xmin = _plotAreaBounds._x;
		double xmax = _plotAreaBounds._x + _plotAreaBounds._width;
		double ymin = _plotAreaBounds._y;
		double ymax = _plotAreaBounds._y + _plotAreaBounds._height;
fbe3c2bb   Benjamin Renard   First commit
2117

ba6124b0   Menouard AZIB   Add parameter id ...
2118
2119
2120
2121
		/*bool	leftTextLegendFound		= false;
		bool	rightTextLegendFound 	= false;
		bool	topTextLegendFound 		= false;
		bool	bottomTextLegendFound 	= false;*/
fbe3c2bb   Benjamin Renard   First commit
2122

ba6124b0   Menouard AZIB   Add parameter id ...
2123
2124
2125
2126
		for (auto textLegend : _panel->_textLegendPropertiesList)
		{
			if (textLegend->isDrawn())
				continue;
fbe3c2bb   Benjamin Renard   First commit
2127

ba6124b0   Menouard AZIB   Add parameter id ...
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
			// Set color
			Color initialColor = changeColor(_pls, textLegend->getColor(), _panel->_page->_mode);

			// set font
			PlPlotUtil::setPlFont(textLegend->getFont());

			// If legend at a given position not already drawn :
			//-  Set viewport depending on legend position
			// - Retrieve text lines from text legend and draw them
			// - See calculatePlotArea to know how text legend position are calculated
			std::vector<std::string> textLines = textLegend->getTextLines();
			double disp = 1;

			switch (textLegend->getPosition())
62024e03   Erdogan Furkan   Some modifications
2142
			{
ba6124b0   Menouard AZIB   Add parameter id ...
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
			case TextLegendPosition::POS_LEFT:
				// if (leftTextLegendFound == false) {
				_pls->vpor(xmin - textLegend->getOffset(), xmax, ymin, ymax);
				for (int i = 0; i < (int)textLines.size(); i++)
				{
					_pls->mtex("l", disp, 0.5, 0.5, textLines.at(textLines.size() - 1 - i).c_str());
					disp += 1.5;
				}
				// leftTextLegendFound = true;
				// }
				break;

			case TextLegendPosition::POS_RIGHT:
				// if (rightTextLegendFound == false) {
				_pls->vpor(xmin, xmax + textLegend->getOffset(), ymin, ymax);
				for (int i = 0; i < (int)textLines.size(); i++)
				{
					_pls->mtex("r", disp, 0.5, 0.5, textLines.at(i).c_str());
					disp += 1.5;
				}
				// rightTextLegendFound = true;
				// }
				break;

			case TextLegendPosition::POS_TOP:
				// if (topTextLegendFound == false) {
				_pls->vpor(xmin, xmax, ymin, ymax + textLegend->getOffset());
				for (int i = 0; i < (int)textLines.size(); i++)
				{
					_pls->mtex("t", disp, 0.5, 0.5, textLines.at(textLines.size() - 1 - i).c_str());
					disp += 1.5;
				}
				// topTextLegendFound = true;
				// }
				break;

			case TextLegendPosition::POS_BOTTOM:
				// if (bottomTextLegendFound == false) {
				_pls->vpor(xmin, xmax, ymin - textLegend->getOffset(), ymax);
				for (int i = 0; i < (int)textLines.size(); i++)
				{
					_pls->mtex("b", disp, 0.5, 0.5, textLines.at(i).c_str());
					disp += 1.5;
				}
				// bottomTextLegendFound = true;
				// }
				break;

			default:
				break;
fbe3c2bb   Benjamin Renard   First commit
2193
			}
fbe3c2bb   Benjamin Renard   First commit
2194

ba6124b0   Menouard AZIB   Add parameter id ...
2195
			restoreColor(_pls, initialColor, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
2196

ba6124b0   Menouard AZIB   Add parameter id ...
2197
2198
2199
			textLegend->setDrawn(true);
		}
	}
fbe3c2bb   Benjamin Renard   First commit
2200

ba6124b0   Menouard AZIB   Add parameter id ...
2201
2202
2203
2204
2205
2206
	/**
	 * Draws Curve
	 */
	void PanelPlotOutput::drawCurvePlot(CurvePlot & /*curvePlot*/)
	{
		// Nothing to do - Deleguate to subclasses
fbe3c2bb   Benjamin Renard   First commit
2207
	}
fbe3c2bb   Benjamin Renard   First commit
2208

ba6124b0   Menouard AZIB   Add parameter id ...
2209
2210
2211
2212
2213
2214
2215
	/**
	 * @brief Write plot context
	 */
	void PanelPlotOutput::writeContext(ContextFileWriter &writer, AMDA::Parameters::TimeIntervalList::iterator currentTimeInterval)
	{
		if (!isStandalone())
			return;
fbe3c2bb   Benjamin Renard   First commit
2216

ba6124b0   Menouard AZIB   Add parameter id ...
2217
2218
		writer.startElement("panel");
		_panel->writeContext(_pls, writer);
7f7e3b39   Benjamin Renard   Fix a bug with st...
2219

ba6124b0   Menouard AZIB   Add parameter id ...
2220
		writer.startElement("parameters");
8499fbdd   Benjamin Renard   Context file gene...
2221

ba6124b0   Menouard AZIB   Add parameter id ...
2222
2223
		for (ParameterAxesList::iterator it = _parameterAxesList.begin();
			 it != _parameterAxesList.end(); ++it)
24600903   Benjamin Renard   Add "hasSpectro" ...
2224
		{
ba6124b0   Menouard AZIB   Add parameter id ...
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
			AMDA::Parameters::ParameterSPtr originalParam =
				_parameterManager.getParameter(it->_originalParamId);

			double resol = originalParam->getDataWriterTemplate()->getMinSampling();
			std::string resolstr = std::to_string(resol);
			writer.startElement("parameter");
			writer.addAttribute("id", originalParam->getId().c_str());
			writer.addAttribute("MinSampling", resolstr.c_str());
			writer.endElement();
		}
		writer.endElement();
eddfb311   Erdogan Furkan   9326 - Modificita...
2236

ba6124b0   Menouard AZIB   Add parameter id ...
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
		if (!_parameterAxesList.empty())
		{
			bool hasSpectro = false;
			bool hasSauvaud = false;
			for (auto parameter : _parameterAxesList)
			{
				if (parameter.getSpectroProperties() != nullptr)
				{
					hasSpectro = true;
					break;
				}
				if (parameter.getSauvaudProperties() != nullptr)
				{
					hasSauvaud = true;
					break;
				}
				if (parameter.getIntervalsProperties() != nullptr)
eddfb311   Erdogan Furkan   9326 - Modificita...
2254
				{
ba6124b0   Menouard AZIB   Add parameter id ...
2255
2256
2257
2258
2259
2260
2261
2262
					ParameterSPtr p = _parameterManager.getParameter(parameter._originalParamId);
					AMDA::Info::ParamInfoSPtr paramInfo = AMDA::Info::ParamMgr::getInstance()->getParamInfoFromId(p->getInfoId());
					std::map<std::string, std::string> inputAdditionals = paramInfo->getAdditionInfo();
					std::string ttOrCatPath = inputAdditionals["TTCatToParamPath"];

					// Load TT or Catalog
					std::string lReaderType = TimeTableCatalog::TimeTableCatalogFactory::getInstance().getReaderType(ttOrCatPath);
					if (!lReaderType.empty())
eddfb311   Erdogan Furkan   9326 - Modificita...
2263
					{
ba6124b0   Menouard AZIB   Add parameter id ...
2264
2265
2266
2267
2268
2269
						TimeTableCatalog::Catalog inputTTOrCat;
						inputTTOrCat.read(ttOrCatPath, lReaderType);
						for (std::vector<TimeTableCatalog::TimeInterval>::const_iterator it = inputTTOrCat.getIntervals().begin(); it != inputTTOrCat.getIntervals().end(); ++it)
						{
							double acceptedRatio = 0.005; // if the interval is too small, no more info given
							double timeRatio = (currentTimeInterval->_stopTime - currentTimeInterval->_startTime) / _plotAreaBounds._width;
29818855   Erdogan Furkan   #5390 - Some modi...
2270

ba6124b0   Menouard AZIB   Add parameter id ...
2271
2272
2273
2274
2275
							std::map<std::string, std::vector<std::string>> data;
							bool needTTWriter = false;
							bool needCatWriter = false;
							double startTime = it->_startTime;
							double stopTime = it->_stopTime;
1b52e70a   Erdogan Furkan   First Kernel modi...
2276

ba6124b0   Menouard AZIB   Add parameter id ...
2277
							if (it->_startTime >= currentTimeInterval->_startTime && it->_stopTime <= currentTimeInterval->_stopTime) // inside the interval
29818855   Erdogan Furkan   #5390 - Some modi...
2278
							{
ba6124b0   Menouard AZIB   Add parameter id ...
2279
2280
2281
2282
2283
2284
2285
								if (timeRatio * acceptedRatio < (stopTime - startTime) / _plotAreaBounds._width)
								{
									needTTWriter = true;
									data = it->getAllParameterData();
									if (data.size() > 0)
										needCatWriter = true;
								}
29818855   Erdogan Furkan   #5390 - Some modi...
2286
							}
ba6124b0   Menouard AZIB   Add parameter id ...
2287
							else if (it->_startTime <= currentTimeInterval->_startTime && it->_stopTime <= currentTimeInterval->_stopTime && it->_stopTime >= currentTimeInterval->_startTime) // begins before, ends inside
29818855   Erdogan Furkan   #5390 - Some modi...
2288
							{
ba6124b0   Menouard AZIB   Add parameter id ...
2289
2290
2291
2292
2293
2294
2295
2296
								startTime = currentTimeInterval->_startTime;
								if (timeRatio * acceptedRatio < (stopTime - startTime) / _plotAreaBounds._width)
								{
									needTTWriter = true;
									data = it->getAllParameterData();
									if (data.size() > 0)
										needCatWriter = true;
								}
29818855   Erdogan Furkan   #5390 - Some modi...
2297
							}
ba6124b0   Menouard AZIB   Add parameter id ...
2298
							else if (it->_startTime >= currentTimeInterval->_startTime && it->_startTime <= currentTimeInterval->_stopTime && it->_stopTime >= currentTimeInterval->_stopTime) // begins inside, ends after
29818855   Erdogan Furkan   #5390 - Some modi...
2299
							{
ba6124b0   Menouard AZIB   Add parameter id ...
2300
2301
2302
2303
2304
2305
2306
2307
								stopTime = currentTimeInterval->_stopTime;
								if (timeRatio * acceptedRatio < (stopTime - startTime) / _plotAreaBounds._width)
								{
									needTTWriter = true;
									data = it->getAllParameterData();
									if (data.size() > 0)
										needCatWriter = true;
								}
29818855   Erdogan Furkan   #5390 - Some modi...
2308
							}
3b531e56   Erdogan Furkan   Second Kernel mod...
2309

ba6124b0   Menouard AZIB   Add parameter id ...
2310
							if (needTTWriter)
3b531e56   Erdogan Furkan   Second Kernel mod...
2311
							{
ba6124b0   Menouard AZIB   Add parameter id ...
2312
2313
								writer.startElement("intervals");
								writer.addAttribute("name", inputTTOrCat._name.c_str());
22e48491   Benjamin Renard   Start TT id to 1
2314
								writer.addAttribute("id", std::to_string(it->_index + 1).c_str());
ba6124b0   Menouard AZIB   Add parameter id ...
2315
2316
2317
								writer.addAttribute("startTime", std::to_string(startTime).c_str());
								writer.addAttribute("stopTime", std::to_string(stopTime).c_str());
								if (needCatWriter)
29818855   Erdogan Furkan   #5390 - Some modi...
2318
								{
ba6124b0   Menouard AZIB   Add parameter id ...
2319
2320
2321
2322
2323
2324
									std::string allParams;
									for (auto i : data)
									{
										allParams += i.second[0] + "|";
									}
									writer.addAttribute("params", allParams.c_str());
29818855   Erdogan Furkan   #5390 - Some modi...
2325
								}
ba6124b0   Menouard AZIB   Add parameter id ...
2326
								writer.endElement();
3b531e56   Erdogan Furkan   Second Kernel mod...
2327
							}
3b531e56   Erdogan Furkan   Second Kernel mod...
2328
						}
eddfb311   Erdogan Furkan   9326 - Modificita...
2329
					}
eddfb311   Erdogan Furkan   9326 - Modificita...
2330
2331
				}
			}
24600903   Benjamin Renard   Add "hasSpectro" ...
2332

ba6124b0   Menouard AZIB   Add parameter id ...
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
			writer.startElement("plotArea");
			if (_panel->_page->_orientation == PlotCommon::Orientation::PORTRAIT)
			{
				writer.addAttribute("x", std::to_string(_plotAreaBounds._y * std::get<0>(_panel->_page->getSize())).c_str());
				writer.addAttribute("y", std::to_string(_plotAreaBounds._x * std::get<1>(_panel->_page->getSize())).c_str());
				writer.addAttribute("width", std::to_string(_plotAreaBounds._height * std::get<0>(_panel->_page->getSize())).c_str());
				writer.addAttribute("height", std::to_string(_plotAreaBounds._width * std::get<1>(_panel->_page->getSize())).c_str());
			}
			else
			{
				writer.addAttribute("x", std::to_string(_plotAreaBounds._x * std::get<0>(_panel->_page->getSize())).c_str());
				writer.addAttribute("y", std::to_string(_plotAreaBounds._y * std::get<1>(_panel->_page->getSize())).c_str());
				writer.addAttribute("width", std::to_string(_plotAreaBounds._width * std::get<0>(_panel->_page->getSize())).c_str());
				writer.addAttribute("height", std::to_string(_plotAreaBounds._height * std::get<1>(_panel->_page->getSize())).c_str());
			}
24600903   Benjamin Renard   Add "hasSpectro" ...
2348

ba6124b0   Menouard AZIB   Add parameter id ...
2349
2350
			writer.addAttribute("hasSpectro", hasSpectro ? "true" : "false");
			writer.addAttribute("hasSauvaud", hasSauvaud ? "true" : "false");
85bb5117   Benjamin Renard   Give the possibil...
2351

ba6124b0   Menouard AZIB   Add parameter id ...
2352
2353
2354
			for (Axes::iterator it = _panel->_axes.begin(); it != _panel->_axes.end(); ++it)
			{
				boost::shared_ptr<Axis> lAxis = it->second;
24600903   Benjamin Renard   Add "hasSpectro" ...
2355

ba6124b0   Menouard AZIB   Add parameter id ...
2356
2357
				if (lAxis == nullptr)
					continue;
8499fbdd   Benjamin Renard   Context file gene...
2358

ba6124b0   Menouard AZIB   Add parameter id ...
2359
2360
2361
				if (lAxis->_visible && lAxis->_used)
					lAxis->writeContext(writer);
			}
8499fbdd   Benjamin Renard   Context file gene...
2362

ba6124b0   Menouard AZIB   Add parameter id ...
2363
			writer.endElement();
85bb5117   Benjamin Renard   Give the possibil...
2364
2365
		}

85bb5117   Benjamin Renard   Give the possibil...
2366
		writer.endElement();
8499fbdd   Benjamin Renard   Context file gene...
2367
	}
85bb5117   Benjamin Renard   Give the possibil...
2368

ba6124b0   Menouard AZIB   Add parameter id ...
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
	/**
	 * @brief Compute the initial plot area for the panel
	 */
	void PanelPlotOutput::preparePlotArea(double /*startTime*/, double /*stopTime*/, int /*intervalIndex*/)
	{
		Bounds panelBounds = _panel->getBoundsInPlPage();
		_plotAreaBounds = panelBounds;
		calculatePlotArea(panelBounds, _plotAreaBounds);
		_panel->_paramsLegendProperties.resetPlot();
	}
8499fbdd   Benjamin Renard   Context file gene...
2379

ba6124b0   Menouard AZIB   Add parameter id ...
2380
	void PanelPlotOutput::fillBackground(std::shared_ptr<plstream> &pls)
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2381
	{
ba6124b0   Menouard AZIB   Add parameter id ...
2382
2383
2384
		if (_panel->_plotAreaBackgroundColor._red != -1 && _panel->_plotAreaBackgroundColor._green != -1 && _panel->_plotAreaBackgroundColor._blue != -1)
		{
			Color plotAreaBackgroundColor = _panel->_plotAreaBackgroundColor;
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2385

ba6124b0   Menouard AZIB   Add parameter id ...
2386
2387
2388
2389
2390
2391
			PLINT lInitialRed = -1, lInitialGreen = -1, lInitialBlue = -1;
			// Store initial color in first index.
			pls->gcol0(0, lInitialRed, lInitialGreen, lInitialBlue);
			pls->scol0(0, plotAreaBackgroundColor._red, plotAreaBackgroundColor._green,
					   plotAreaBackgroundColor._blue);
			pls->col0(0);
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2392

ba6124b0   Menouard AZIB   Add parameter id ...
2393
2394
2395
2396
2397
			// Compute panel coordinate in the page
			Bounds lBounds = _plotAreaBounds;
			// Specify viewport for the panel
			pls->vpor(_plotAreaBounds._x, _plotAreaBounds._x + _plotAreaBounds._width,
					  _plotAreaBounds._y, _plotAreaBounds._y + _plotAreaBounds._height);
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2398

ba6124b0   Menouard AZIB   Add parameter id ...
2399
2400
			// Set window size.
			pls->wind(0, 1, 0, 1);
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2401

ba6124b0   Menouard AZIB   Add parameter id ...
2402
2403
2404
2405
			// Fill background.
			PLFLT px[] = {0, 0, 1, 1};
			PLFLT py[] = {0, 1, 1, 0};
			pls->fill(4, px, py);
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2406

ba6124b0   Menouard AZIB   Add parameter id ...
2407
			pls->col0(0);
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2408

ba6124b0   Menouard AZIB   Add parameter id ...
2409
2410
2411
2412
			if (lInitialRed != -1 && lInitialGreen != -1 && lInitialBlue != -1)
			{
				pls->scol0(0, lInitialRed, lInitialGreen, lInitialBlue);
			}
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2413
2414
		}
	}
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2415

ba6124b0   Menouard AZIB   Add parameter id ...
2416
2417
2418
2419
2420
2421
2422
	/**
	 * @brief Retrieve plot area bounds for the panel
	 */
	void PanelPlotOutput::getPlotAreaBounds(Bounds &plotAreaBounds)
	{
		plotAreaBounds = _plotAreaBounds;
	}
fbe3c2bb   Benjamin Renard   First commit
2423

ba6124b0   Menouard AZIB   Add parameter id ...
2424
2425
2426
2427
2428
2429
2430
2431
	/**
	 * @brief Force the plot area horizontal position and width
	 */
	void PanelPlotOutput::forcePlotAreaPosAndWidth(double plotAreaX, double plotAreaWidth)
	{
		_plotAreaBounds._x = plotAreaX;
		_plotAreaBounds._width = plotAreaWidth;
	}
fbe3c2bb   Benjamin Renard   First commit
2432

ba6124b0   Menouard AZIB   Add parameter id ...
2433
2434
2435
2436
2437
2438
2439
	/**
	 * @brief Retrieve left axis tickMark width
	 */
	int PanelPlotOutput::getLeftAxisTickMarkWidth(void)
	{
		return _leftAxisTickMarkWidth;
	}
fbe3c2bb   Benjamin Renard   First commit
2440

ba6124b0   Menouard AZIB   Add parameter id ...
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
	/**
	 * @brief Force left axis tickmark width for the panel
	 */
	void PanelPlotOutput::forceLeftAxisTickMarkWidth(int leftAxisTickMarkWidth)
	{
		for (Axes::iterator it = _panel->_axes.begin(); it != _panel->_axes.end(); ++it)
		{
			boost::shared_ptr<Axis> lAxis = it->second;
			if (lAxis == nullptr)
				continue;
			// Look for a visible fleft Axis with legend and
			if ((lAxis->_visible) && (lAxis->_position == PlotCommon::Position::POS_LEFT))
			{
				lAxis->setFixedTickMarkWidth(leftAxisTickMarkWidth);
			}
fbe3c2bb   Benjamin Renard   First commit
2456
2457
		}
	}
fbe3c2bb   Benjamin Renard   First commit
2458

ba6124b0   Menouard AZIB   Add parameter id ...
2459
2460
2461
2462
	/**
	 * @brief Get nb series to draw by y axis
	 */
	std::map<std::string, int> &PanelPlotOutput::getNbSeriesByYAxis()
8bb0f02b   Benjamin Renard   Set colors in axi...
2463
	{
ba6124b0   Menouard AZIB   Add parameter id ...
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
		if (!_nbSeriesByYAxisMap.empty())
		{
			return _nbSeriesByYAxisMap;
		}
		SeriesProperties lSeries;
		for (auto parameter : _parameterAxesList)
		{
			for (auto lSeries : parameter.getYSeriePropertiesList())
			{
				if (!lSeries.hasYAxis())
					continue;
8bb0f02b   Benjamin Renard   Set colors in axi...
2475

ba6124b0   Menouard AZIB   Add parameter id ...
2476
				std::string yAxisId = lSeries.getYAxisId();
8bb0f02b   Benjamin Renard   Set colors in axi...
2477

ba6124b0   Menouard AZIB   Add parameter id ...
2478
2479
				if (_nbSeriesByYAxisMap.find(yAxisId) == _nbSeriesByYAxisMap.end())
					_nbSeriesByYAxisMap[yAxisId] = 0;
8bb0f02b   Benjamin Renard   Set colors in axi...
2480

ba6124b0   Menouard AZIB   Add parameter id ...
2481
2482
				_nbSeriesByYAxisMap[yAxisId] += lSeries.getIndexList(_pParameterValues).size();
			}
8bb0f02b   Benjamin Renard   Set colors in axi...
2483
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2484
		return _nbSeriesByYAxisMap;
8bb0f02b   Benjamin Renard   Set colors in axi...
2485
	}
8bb0f02b   Benjamin Renard   Set colors in axi...
2486

ba6124b0   Menouard AZIB   Add parameter id ...
2487
2488
2489
2490
2491
2492
2493
2494
2495
	/**
	 * @brief draw the plot for the current time interval
	 */
	bool PanelPlotOutput::draw(double startTime, double stopTime, int intervalIndex,
							   bool isFirstInterval, bool isLastInterval)
	{
		// Sets panel plplot viewport, draw background & title for the panel
		_panel->draw(_pls);
		fillBackground(_pls);
fbe3c2bb   Benjamin Renard   First commit
2496

ba6124b0   Menouard AZIB   Add parameter id ...
2497
		bool noData = true;
d57f00dc   Benjamin Renard   Draw NO DATA
2498

ba6124b0   Menouard AZIB   Add parameter id ...
2499
2500
2501
2502
2503
		if (_parameterAxesList.empty())
		{
			noData = false; // Do not draw No Data if the panel is empty
			_panel->drawEmptyPanel(_pls);
		}
08ec1dde   Benjamin Renard   Add propertie _us...
2504

ba6124b0   Menouard AZIB   Add parameter id ...
2505
2506
		if (isFirstInterval)
			_panel->_paramsLegendProperties.resetPlot();
fbe3c2bb   Benjamin Renard   First commit
2507

ba6124b0   Menouard AZIB   Add parameter id ...
2508
2509
2510
2511
		// Set pointer to ParameterData list
		if (_pParameterValues == NULL)
		{
			std::stringstream lError;
fbe3c2bb   Benjamin Renard   First commit
2512
			lError << "PanelPlotOutput::draw - Pointer to parameterValues is not set";
ba6124b0   Menouard AZIB   Add parameter id ...
2513
			BOOST_THROW_EXCEPTION(
fbe3c2bb   Benjamin Renard   First commit
2514
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
ba6124b0   Menouard AZIB   Add parameter id ...
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
		}

		LOG4CXX_DEBUG(gLogger, "Panel bounds = " << _panel->_bounds.toString());
		LOG4CXX_DEBUG(gLogger, "Plot area = " << _plotAreaBounds.toString());

		// Draw spectro
		for (auto parameter : _parameterAxesList)
		{
			if (parameter.getSpectroProperties() != nullptr)
			{
				// draw spectro
				LOG4CXX_DEBUG(gLogger, "Draw a spectro for parameter " << parameter._originalParamId);
				// Draw (configure) window for this series.
				drawSpectro(startTime, stopTime, parameter._originalParamId, *(parameter.getSpectroProperties()));

				ParameterData &data = (*_pParameterValues)[parameter.getSpectroProperties()->getParamId()];

				if (parameter.getSpectroProperties()->getIndexes().empty())
				{
					noData = data.noData();
				}
				else
				{
					for (auto index : parameter.getSpectroProperties()->getIndexes())
					{
						if (noData)
							noData = data.noData(index);
					}
				}
			}
			if (parameter.getSauvaudProperties() != nullptr)
			{
				// draw sauvaud
				LOG4CXX_DEBUG(gLogger, "Draw a sauvaud for parameter " << parameter._originalParamId);
				// Draw (configure) window for this series.
				drawSauvaud(startTime, stopTime, parameter._originalParamId, *(parameter.getSauvaudProperties()), 0, 1, "");

				ParameterData &data = (*_pParameterValues)[parameter.getSauvaudProperties()->getParamId()];
fbe3c2bb   Benjamin Renard   First commit
2553

ba6124b0   Menouard AZIB   Add parameter id ...
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
				if (parameter.getSauvaudProperties()->getIndexes().empty())
				{
					noData = data.noData();
				}
				else
				{
					for (auto index : parameter.getSauvaudProperties()->getIndexes())
					{
						if (noData)
							noData = data.noData(index);
					}
				}
			}
		}
2fc1f2f8   Benjamin Renard   Full rework for s...
2568

ba6124b0   Menouard AZIB   Add parameter id ...
2569
2570
2571
2572
2573
2574
2575
		// Draw intervals
		for (auto parameter : _parameterAxesList)
		{
			if (parameter.getIntervalsProperties() != nullptr)
			{
				// draw intervals
				LOG4CXX_DEBUG(gLogger, "Draw intervals for parameter " << parameter._originalParamId);
2fc1f2f8   Benjamin Renard   Full rework for s...
2576
				// Draw (configure) window for this series.
ba6124b0   Menouard AZIB   Add parameter id ...
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
				drawIntervals(startTime, stopTime, parameter._originalParamId, *(parameter.getIntervalsProperties()));

				ParameterData &data = (*_pParameterValues)[parameter.getIntervalsProperties()->getParamId()];

				if (parameter.getIntervalsProperties()->getIndexes().empty())
				{
					noData = data.noData();
				}
				else
				{
					for (auto index : parameter.getIntervalsProperties()->getIndexes())
					{
						if (noData)
							noData = data.noData(index);
					}
2fc1f2f8   Benjamin Renard   Full rework for s...
2592
				}
d57f00dc   Benjamin Renard   Draw NO DATA
2593
			}
fbe3c2bb   Benjamin Renard   First commit
2594
		}
fbe3c2bb   Benjamin Renard   First commit
2595

ba6124b0   Menouard AZIB   Add parameter id ...
2596
2597
		// Compute panel XY ratio used for angular conversions
		computePanelPlotXYRatio();
fbe3c2bb   Benjamin Renard   First commit
2598

ba6124b0   Menouard AZIB   Add parameter id ...
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
		// Draw fill area between parameter and constant or between parameters
		drawFills(startTime, stopTime);

		// Compute nb series to draw by y axis
		std::map<std::string, int> nbSeriesByYAxisMap = getNbSeriesByYAxis();
		SeriesProperties lSeries;
		// Draw series for parameters.
		for (auto parameter : _parameterAxesList)
		{
			// Get series index to draw for parameter
			// Draw each index of parameter
			for (auto lSeries : parameter.getYSeriePropertiesList())
			{
				for (auto lIndex : lSeries.getIndexList(_pParameterValues))
				{
					bool moreThanOneSerieForYAxis = false;
					if (lSeries.hasYAxis())
						moreThanOneSerieForYAxis = (nbSeriesByYAxisMap[lSeries.getYAxisId()] > 1);

					// Draw (configure) window for this series.
					drawSeries(startTime, stopTime, intervalIndex, parameter._originalParamId,
							   lSeries, lIndex, parameter, moreThanOneSerieForYAxis);
					ParameterData &data = (*_pParameterValues)[lSeries.getParamId()];
					if (noData)
					{
						noData = data.noData(lIndex);
					}
				}
			}
		}
fbe3c2bb   Benjamin Renard   First commit
2629

ba6124b0   Menouard AZIB   Add parameter id ...
2630
2631
		// Draw additional objects
		drawAdditionalObjects();
fbe3c2bb   Benjamin Renard   First commit
2632

ba6124b0   Menouard AZIB   Add parameter id ...
2633
2634
2635
		// Draw parameter legend
		if (isLastInterval || !_panel->_page->_superposeMode)
			drawParamsLegend();
fbe3c2bb   Benjamin Renard   First commit
2636

ba6124b0   Menouard AZIB   Add parameter id ...
2637
2638
		// Draw text legends
		drawTextLegends();
d57f00dc   Benjamin Renard   Draw NO DATA
2639

ba6124b0   Menouard AZIB   Add parameter id ...
2640
2641
2642
2643
2644
2645
		return !noData;
	}
	void PanelPlotOutput::drawSauvaud(double /*startDate*/, double /*stopDate*/, std::string /*pParamId*/,
									  SauvaudProperties &pSauvaud, int subIndex = 0, int subsNumber = 1, std::string opositeLegend = "")
	{
		// Get X, Y and Z axis.
793c4351   Hacene SI HADJ MOHAND   creation de class...
2646
2647
		boost::shared_ptr<Axis> lXAxis(_panel->getAxis(pSauvaud.getXAxisId()));
		boost::shared_ptr<Axis> lYAxis(_panel->getAxis(pSauvaud.getYAxisId()));
793c4351   Hacene SI HADJ MOHAND   creation de class...
2648
		boost::shared_ptr<Axis> lZAxis(_panel->getAxis(pSauvaud.getZAxisId()));
ba6124b0   Menouard AZIB   Add parameter id ...
2649

793c4351   Hacene SI HADJ MOHAND   creation de class...
2650
		Range lXRange, lYRange, lZRange;
ba6124b0   Menouard AZIB   Add parameter id ...
2651
2652
		if (pSauvaud.hasXAxis() && lXAxis.get() == nullptr)
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2653
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2654
2655
2656
			lError << "PanelPlotOutput::drawSauvaud"
				   << ": X axis with id '"
				   << pSauvaud.getXAxisId() << "' not found.";
793c4351   Hacene SI HADJ MOHAND   creation de class...
2657
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2658
2659
2660
2661
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
		}
		else if (pSauvaud.hasXAxis())
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2662
2663
2664
			// fill X range (plplot window).
			lXRange = lXAxis->getRange();
		}
fbe3c2bb   Benjamin Renard   First commit
2665

ba6124b0   Menouard AZIB   Add parameter id ...
2666
2667
		if (pSauvaud.hasYAxis() && lYAxis.get() == nullptr)
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2668
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2669
2670
2671
			lError << "PanelPlotOutput::drawSauvaud"
				   << ": Y axis with id '"
				   << pSauvaud.getYAxisId() << "' not found.";
793c4351   Hacene SI HADJ MOHAND   creation de class...
2672
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2673
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
793c4351   Hacene SI HADJ MOHAND   creation de class...
2674
			lYRange = Range();
ba6124b0   Menouard AZIB   Add parameter id ...
2675
2676
2677
		}
		else if (pSauvaud.hasYAxis())
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2678
2679
			// fill Y range (plplot window).
			lYRange = lYAxis->getRange();
ba6124b0   Menouard AZIB   Add parameter id ...
2680
			fixRange(lYRange, lYAxis->_scale == Axis::Scale::LOGARITHMIC);
793c4351   Hacene SI HADJ MOHAND   creation de class...
2681
2682
		}

ba6124b0   Menouard AZIB   Add parameter id ...
2683
2684
		if (pSauvaud.hasZAxis() && lZAxis.get() == nullptr)
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2685
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2686
2687
2688
			lError << "PanelPlotOutput::drawSauvaud"
				   << ": Z axis with id '"
				   << pSauvaud.getZAxisId() << "' not found.";
793c4351   Hacene SI HADJ MOHAND   creation de class...
2689
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2690
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
793c4351   Hacene SI HADJ MOHAND   creation de class...
2691
2692
			lZRange = Range();
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2693
2694
		else if (pSauvaud.hasZAxis())
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2695
2696
2697
			// fill Z range (plplot window).
			lZRange = lZAxis->getRange();
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2698
2699

		PlWindow lPlWindow;
793c4351   Hacene SI HADJ MOHAND   creation de class...
2700
2701
		lPlWindow = PlWindow(lXRange.getMin(), lXRange.getMax(), lYRange.getMin(), lYRange.getMax());

793c4351   Hacene SI HADJ MOHAND   creation de class...
2702
2703
2704
2705
2706
2707
		// Calculate X and Y tick
		TickConf lTickConf;
		double lXMajorTickSpace = nan("");
		int lXMinorTickNumber = 0;
		double lYMajorTickSpace = nan("");
		int lYMinorTickNumber = 0;
ba6124b0   Menouard AZIB   Add parameter id ...
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725

		if (pSauvaud.hasXAxis() && (subIndex == 0))
		{
			// Calculate X tick
			lXMajorTickSpace = getMajorTickSpace(lXAxis.get(),
												 std::get<0>(lPlWindow), std::get<1>(lPlWindow));
			lXMinorTickNumber = getMinorTickNumber(lXAxis.get(),
												   std::get<0>(lPlWindow), std::get<1>(lPlWindow), lXMajorTickSpace);
		}

		if (pSauvaud.hasYAxis() && (subIndex == subsNumber - 1))
		{
			// Calculate Y tick
			lYMajorTickSpace = getMajorTickSpace(lYAxis.get(), std::get<2>(lPlWindow), std::get<3>(lPlWindow));
			lYMinorTickNumber = getMinorTickNumber(lYAxis.get(), std::get<2>(lPlWindow), std::get<3>(lPlWindow),
												   lYMajorTickSpace);
		}

793c4351   Hacene SI HADJ MOHAND   creation de class...
2726
		lTickConf = TickConf(lXMajorTickSpace, lXMinorTickNumber, lYMajorTickSpace, lYMinorTickNumber);
ba6124b0   Menouard AZIB   Add parameter id ...
2727
		Bounds areaBounds(_plotAreaBounds);
793c4351   Hacene SI HADJ MOHAND   creation de class...
2728

ba6124b0   Menouard AZIB   Add parameter id ...
2729
2730
2731
2732
2733
2734
		double width = _plotAreaBounds._height / (subsNumber + 1);
		if (subsNumber > 0)
		{
			areaBounds._y = _plotAreaBounds._y + subIndex * (width + width / 10);
			areaBounds._height = width;
		}
793c4351   Hacene SI HADJ MOHAND   creation de class...
2735
2736

		// Draw Y axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
		if (pSauvaud.hasYAxis())
		{

			Label label(lYAxis->_legend.getFont(), lYAxis->_legend.getColor());

			Font font_(label.getFont());
			int size_ = font_.getSize();
			if (font_.getSize() == 0)
			{
				size_ = std::round(314.5 * width - 2.7);
				size_ = std::max(size_, 2);
				size_ = std::min(size_, 8);
				font_.setSize(size_);
				label.setFont(font_);
				lYAxis->_legend.setLabel(label);
			}
			bool changed = false;

			// Draw legend for the last spectro.
			if (subIndex == subsNumber - 1)
			{
				lYAxis->setShowTickMark(true);

				PlotCommon::Position pos_ = lYAxis->_position;
				Label label(lYAxis->_legend.getFont(), lYAxis->_legend.getColor());
				Font font_(label.getFont());
				std::string text_ = lYAxis->_legend.getText();
				if (!opositeLegend.empty())
				{
					label._text = opositeLegend;
					changed = true;
				}
				if (lYAxis->_scale == Axis::Scale::LOGARITHMIC && font_.getSize() > 3)
				{
					font_.setSize(3);
					changed = true;
				}
				lYAxis->_legend.clearLabels();
				lYAxis->_legend.setLabel(label);
				switch (pos_)
				{
				case PlotCommon::Position::POS_LEFT:
					lYAxis->_position = PlotCommon::Position::POS_RIGHT;
					break;
				case PlotCommon::Position::POS_RIGHT:
					lYAxis->_position = PlotCommon::Position::POS_LEFT;
					break;
				default:
					break;
				}
				drawYAxis(lYAxis, lPlWindow, areaBounds, lTickConf);
				if (!opositeLegend.empty())
					drawLegends(lYAxis, lPlWindow, areaBounds);
				lYAxis->_position = pos_;
				if (changed)
				{
					font_.setSize(size_);
					label.setFont(font_);
					label._text = text_;
					lYAxis->_legend.clearLabels();
					lYAxis->_legend.setLabel(label);
					changed = false;
				}
				drawLegends(lYAxis, lPlWindow, areaBounds);
			}
			else
			{
				lYAxis->setShowTickMark(false);
				if (subIndex < subsNumber)
					drawYAxis(lYAxis, lPlWindow, areaBounds, lTickConf);

				drawLegends(lYAxis, lPlWindow, areaBounds);
			}
793c4351   Hacene SI HADJ MOHAND   creation de class...
2810
2811
2812
		}

		// Draw Z axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2813
2814
2815
		if (pSauvaud.hasZAxis() && (lZAxis != nullptr) && !lZAxis->_drawn)
		{
			drawZAxis(lZAxis, lPlWindow, _plotAreaBounds, lTickConf);
793c4351   Hacene SI HADJ MOHAND   creation de class...
2816
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2817
2818
2819
2820

		// Draw X axis and legend
		if (pSauvaud.hasXAxis() && subIndex < subsNumber)
		{
b0205fd9   Hacene SI HADJ MOHAND   plot ok reste que...
2821
2822

			drawXAxis(lXAxis, lPlWindow, areaBounds, lTickConf);
ba6124b0   Menouard AZIB   Add parameter id ...
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832

			// Draw legend.
			if (subIndex == 0)
				drawLegends(lXAxis, lPlWindow, areaBounds);
		}
	}
	void PanelPlotOutput::drawSpectro(double /*startDate*/, double /*stopDate*/, std::string /*pParamId*/,
									  SpectroProperties &pSpectro)
	{
		// Get X, Y and Z axis.
fbe3c2bb   Benjamin Renard   First commit
2833
2834
2835
2836
2837
2838
		boost::shared_ptr<Axis> lXAxis(_panel->getAxis(pSpectro.getXAxisId()));
		boost::shared_ptr<Axis> lYAxis(_panel->getAxis(pSpectro.getYAxisId()));
		boost::shared_ptr<Axis> lZAxis(_panel->getAxis(pSpectro.getZAxisId()));

		PlWindow lPlWindow;
		Range lXRange, lYRange, lZRange;
ba6124b0   Menouard AZIB   Add parameter id ...
2839
2840
		if (pSpectro.hasXAxis() && lXAxis.get() == nullptr)
		{
fbe3c2bb   Benjamin Renard   First commit
2841
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2842
2843
2844
			lError << "PanelPlotOutput::drawSpectro"
				   << ": X axis with id '"
				   << pSpectro.getXAxisId() << "' not found.";
fbe3c2bb   Benjamin Renard   First commit
2845
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2846
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
fbe3c2bb   Benjamin Renard   First commit
2847
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2848
2849
		else if (pSpectro.hasXAxis())
		{
fbe3c2bb   Benjamin Renard   First commit
2850
2851
2852
2853
			// fill X range (plplot window).
			lXRange = lXAxis->getRange();
		}

ba6124b0   Menouard AZIB   Add parameter id ...
2854
2855
		if (pSpectro.hasYAxis() && lYAxis.get() == nullptr)
		{
fbe3c2bb   Benjamin Renard   First commit
2856
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2857
2858
2859
			lError << "PanelPlotOutput::drawSpectro"
				   << ": Y axis with id '"
				   << pSpectro.getYAxisId() << "' not found.";
fbe3c2bb   Benjamin Renard   First commit
2860
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2861
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
fbe3c2bb   Benjamin Renard   First commit
2862
2863
			lYRange = Range();
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2864
2865
		else if (pSpectro.hasYAxis())
		{
fbe3c2bb   Benjamin Renard   First commit
2866
2867
			// fill Y range (plplot window).
			lYRange = lYAxis->getRange();
ba6124b0   Menouard AZIB   Add parameter id ...
2868
			fixRange(lYRange, lYAxis->_scale == Axis::Scale::LOGARITHMIC);
fbe3c2bb   Benjamin Renard   First commit
2869
2870
		}

ba6124b0   Menouard AZIB   Add parameter id ...
2871
2872
		if (pSpectro.hasZAxis() && lZAxis.get() == nullptr)
		{
fbe3c2bb   Benjamin Renard   First commit
2873
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2874
2875
2876
			lError << "PanelPlotOutput::drawSpectro"
				   << ": Z axis with id '"
				   << pSpectro.getZAxisId() << "' not found.";
fbe3c2bb   Benjamin Renard   First commit
2877
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2878
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
fbe3c2bb   Benjamin Renard   First commit
2879
2880
			lZRange = Range();
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2881
2882
		else if (pSpectro.hasZAxis())
		{
fbe3c2bb   Benjamin Renard   First commit
2883
2884
2885
2886
2887
2888
			// fill Z range (plplot window).
			lZRange = lZAxis->getRange();
		}

		lPlWindow = PlWindow(lXRange.getMin(), lXRange.getMax(), lYRange.getMin(), lYRange.getMax());

fbe3c2bb   Benjamin Renard   First commit
2889
2890
2891
2892
2893
2894
2895
		// Calculate X and Y tick
		TickConf lTickConf;
		double lXMajorTickSpace = nan("");
		int lXMinorTickNumber = 0;
		double lYMajorTickSpace = nan("");
		int lYMinorTickNumber = 0;

ba6124b0   Menouard AZIB   Add parameter id ...
2896
2897
		if (pSpectro.hasXAxis())
		{
fbe3c2bb   Benjamin Renard   First commit
2898
2899
			// Calculate X tick
			lXMajorTickSpace = getMajorTickSpace(lXAxis.get(),
ba6124b0   Menouard AZIB   Add parameter id ...
2900
												 std::get<0>(lPlWindow), std::get<1>(lPlWindow));
fbe3c2bb   Benjamin Renard   First commit
2901
			lXMinorTickNumber = getMinorTickNumber(lXAxis.get(),
ba6124b0   Menouard AZIB   Add parameter id ...
2902
												   std::get<0>(lPlWindow), std::get<1>(lPlWindow), lXMajorTickSpace);
fbe3c2bb   Benjamin Renard   First commit
2903
2904
		}

ba6124b0   Menouard AZIB   Add parameter id ...
2905
2906
		if (pSpectro.hasYAxis())
		{
fbe3c2bb   Benjamin Renard   First commit
2907
2908
2909
			// Calculate Y tick
			lYMajorTickSpace = getMajorTickSpace(lYAxis.get(), std::get<2>(lPlWindow), std::get<3>(lPlWindow));
			lYMinorTickNumber = getMinorTickNumber(lYAxis.get(), std::get<2>(lPlWindow), std::get<3>(lPlWindow),
ba6124b0   Menouard AZIB   Add parameter id ...
2910
												   lYMajorTickSpace);
fbe3c2bb   Benjamin Renard   First commit
2911
2912
2913
2914
		}

		lTickConf = TickConf(lXMajorTickSpace, lXMinorTickNumber, lYMajorTickSpace, lYMinorTickNumber);

fbe3c2bb   Benjamin Renard   First commit
2915
		// Draw Y axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2916
2917
		if (pSpectro.hasYAxis() && !lYAxis->_drawn)
		{
fbe3c2bb   Benjamin Renard   First commit
2918
2919
2920
2921
2922
2923
2924
2925

			drawYAxis(lYAxis, lPlWindow, _plotAreaBounds, lTickConf);

			// Draw legend.
			drawLegends(lYAxis, lPlWindow, _plotAreaBounds);
		}

		// Draw X axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2926
2927
		if (pSpectro.hasXAxis() && !lXAxis->_drawn)
		{
fbe3c2bb   Benjamin Renard   First commit
2928
2929
2930
2931
2932
2933
2934
2935

			drawXAxis(lXAxis, lPlWindow, _plotAreaBounds, lTickConf);

			// Draw legend.
			drawLegends(lXAxis, lPlWindow, _plotAreaBounds);
		}

		// Draw Z axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2936
2937
2938
		if (pSpectro.hasZAxis() && (lZAxis != nullptr) && !lZAxis->_drawn)
		{
			drawZAxis(lZAxis, lPlWindow, _plotAreaBounds, lTickConf);
fbe3c2bb   Benjamin Renard   First commit
2939
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2940
2941
2942
2943
2944
	}

	void PanelPlotOutput::drawIntervals(double /*startDate*/, double /*stopDate*/, std::string /*pParamId*/,
										IntervalsProperties &pIntervals)
	{
fbe3c2bb   Benjamin Renard   First commit
2945

ba6124b0   Menouard AZIB   Add parameter id ...
2946
		boost::shared_ptr<Axis> lXAxis(_panel->getAxis(pIntervals.getXAxisId()));
e257cfb9   Benjamin Renard   First implementat...
2947
2948
2949

		PlWindow lPlWindow;
		Range lXRange, lYRange;
ba6124b0   Menouard AZIB   Add parameter id ...
2950
2951
		if (lXAxis.get() == nullptr)
		{
e257cfb9   Benjamin Renard   First implementat...
2952
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2953
2954
2955
			lError << "PanelPlotOutput::drawIntervals"
				   << ": X axis with id '"
				   << pIntervals.getXAxisId() << "' not found.";
e257cfb9   Benjamin Renard   First implementat...
2956
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2957
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
e257cfb9   Benjamin Renard   First implementat...
2958
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2959
2960
2961
2962

		lXRange = lXAxis->getRange();

		lYRange = Range(0, 1);
e257cfb9   Benjamin Renard   First implementat...
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972

		lPlWindow = PlWindow(lXRange.getMin(), lXRange.getMax(), lYRange.getMin(), lYRange.getMax());

		// Calculate X and Y tick
		TickConf lTickConf;
		double lXMajorTickSpace = nan("");
		int lXMinorTickNumber = 0;
		double lYMajorTickSpace = nan("");
		int lYMinorTickNumber = 0;

ba6124b0   Menouard AZIB   Add parameter id ...
2973
2974
2975
2976
2977
2978
		lXMajorTickSpace = getMajorTickSpace(lXAxis.get(),
											 std::get<0>(lPlWindow), std::get<1>(lPlWindow));
		lXMinorTickNumber = getMinorTickNumber(lXAxis.get(),
											   std::get<0>(lPlWindow), std::get<1>(lPlWindow), lXMajorTickSpace);

		lTickConf = TickConf(lXMajorTickSpace, lXMinorTickNumber, lYMajorTickSpace, lYMinorTickNumber);
e257cfb9   Benjamin Renard   First implementat...
2979
2980

		// Draw X axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2981
2982
		if (!lXAxis->_drawn)
		{
e257cfb9   Benjamin Renard   First implementat...
2983
2984
2985
2986
2987
2988
2989

			drawXAxis(lXAxis, lPlWindow, _plotAreaBounds, lTickConf);

			// Draw legend.
			drawLegends(lXAxis, lPlWindow, _plotAreaBounds);
		}

ba6124b0   Menouard AZIB   Add parameter id ...
2990
2991
2992
		_pls->vpor(_plotAreaBounds._x, _plotAreaBounds._x + _plotAreaBounds._width,
				   _plotAreaBounds._y, _plotAreaBounds._y + _plotAreaBounds._height);
	}
e257cfb9   Benjamin Renard   First implementat...
2993

ba6124b0   Menouard AZIB   Add parameter id ...
2994
2995
2996
2997
2998
2999
	void PanelPlotOutput::drawFills(double /*startDate*/, double /*stopDate*/)
	{
		// Nothing done here except setting the viewport, see subclasses for specific implementation
		_pls->vpor(_plotAreaBounds._x, _plotAreaBounds._x + _plotAreaBounds._width,
				   _plotAreaBounds._y, _plotAreaBounds._y + _plotAreaBounds._height);
	}
fbe3c2bb   Benjamin Renard   First commit
3000

ba6124b0   Menouard AZIB   Add parameter id ...
3001
3002
3003
3004
3005
3006
3007
3008
	void PanelPlotOutput::drawSeries(double /*startDate*/, double /*stopDate*/, int /*intervalIndex*/, std::string /*pParamId*/,
									 SeriesProperties &pSeries, AMDA::Common::ParameterIndexComponent /*pParamIndex*/,
									 ParameterAxes & /*param*/, bool /*moreThanOneSerieForAxis*/)
	{
		// Get X, Y and Z axis.
		boost::shared_ptr<Axis> lXAxis(_panel->getAxis(pSeries.getXAxisId()));
		boost::shared_ptr<Axis> lYAxis(_panel->getAxis(pSeries.getYAxisId()));
		boost::shared_ptr<Axis> lZAxis(_panel->getAxis(pSeries.getZAxisId()));
fbe3c2bb   Benjamin Renard   First commit
3009

ba6124b0   Menouard AZIB   Add parameter id ...
3010
3011
3012
		Range lXRange = getXAxisRange(pSeries, lXAxis);
		Range lYRange = getYAxisRange(pSeries, lYAxis);
		// Range lZRange = getZAxisRange (pSeries, lZAxis);
fbe3c2bb   Benjamin Renard   First commit
3013

ba6124b0   Menouard AZIB   Add parameter id ...
3014
		PlWindow lPlWindow = PlWindow(lXRange.getMin(), lXRange.getMax(), lYRange.getMin(), lYRange.getMax());
fbe3c2bb   Benjamin Renard   First commit
3015

ba6124b0   Menouard AZIB   Add parameter id ...
3016
3017
3018
3019
3020
3021
		// Calculate X and Y tick
		TickConf lTickConf;
		double lXMajorTickSpace = nan("");
		int lXMinorTickNumber = 0;
		double lYMajorTickSpace = nan("");
		int lYMinorTickNumber = 0;
fbe3c2bb   Benjamin Renard   First commit
3022

ba6124b0   Menouard AZIB   Add parameter id ...
3023
3024
3025
3026
3027
3028
3029
3030
		if (pSeries.hasXAxis())
		{
			// Calculate X tick
			lXMajorTickSpace = getMajorTickSpace(lXAxis.get(),
												 std::get<0>(lPlWindow), std::get<1>(lPlWindow));
			lXMinorTickNumber = getMinorTickNumber(lXAxis.get(),
												   std::get<0>(lPlWindow), std::get<1>(lPlWindow), lXMajorTickSpace);
		}
fbe3c2bb   Benjamin Renard   First commit
3031

ba6124b0   Menouard AZIB   Add parameter id ...
3032
3033
3034
3035
3036
3037
3038
		if (pSeries.hasYAxis())
		{
			// Calculate Y tick
			lYMajorTickSpace = getMajorTickSpace(lYAxis.get(), std::get<2>(lPlWindow), std::get<3>(lPlWindow));
			lYMinorTickNumber = getMinorTickNumber(lYAxis.get(), std::get<2>(lPlWindow), std::get<3>(lPlWindow),
												   lYMajorTickSpace);
		}
fbe3c2bb   Benjamin Renard   First commit
3039

ba6124b0   Menouard AZIB   Add parameter id ...
3040
		lTickConf = TickConf(lXMajorTickSpace, lXMinorTickNumber, lYMajorTickSpace, lYMinorTickNumber);
fbe3c2bb   Benjamin Renard   First commit
3041

ba6124b0   Menouard AZIB   Add parameter id ...
3042
3043
3044
		// Draw Y axis and legend
		if (pSeries.hasYAxis() && !lYAxis->_drawn)
		{
fbe3c2bb   Benjamin Renard   First commit
3045

ba6124b0   Menouard AZIB   Add parameter id ...
3046
			drawYAxis(lYAxis, lPlWindow, _plotAreaBounds, lTickConf);
fbe3c2bb   Benjamin Renard   First commit
3047

ba6124b0   Menouard AZIB   Add parameter id ...
3048
3049
3050
			// Draw legend.
			drawLegends(lYAxis, lPlWindow, _plotAreaBounds);
		}
fbe3c2bb   Benjamin Renard   First commit
3051

ba6124b0   Menouard AZIB   Add parameter id ...
3052
3053
3054
3055
		// Draw X axis and legend
		if (pSeries.hasXAxis() && !lXAxis->_drawn)
		{
			drawXAxis(lXAxis, lPlWindow, _plotAreaBounds, lTickConf);
fbe3c2bb   Benjamin Renard   First commit
3056

ba6124b0   Menouard AZIB   Add parameter id ...
3057
3058
3059
			// Draw legend.
			drawLegends(lXAxis, lPlWindow, _plotAreaBounds);
		}
fbe3c2bb   Benjamin Renard   First commit
3060

ba6124b0   Menouard AZIB   Add parameter id ...
3061
3062
3063
3064
3065
		// Draw Z axis and legend
		if (pSeries.hasZAxis() && (lZAxis != nullptr) && !lZAxis->_drawn)
		{
			drawZAxis(lZAxis, lPlWindow, _plotAreaBounds, lTickConf);
		}
fbe3c2bb   Benjamin Renard   First commit
3066
3067
	}

ba6124b0   Menouard AZIB   Add parameter id ...
3068
3069
3070
3071
3072
3073
3074
3075
	void PanelPlotOutput::drawAdditionalObjects()
	{
		for (auto parameter : _parameterAxesList)
		{
			if (parameter.getSpectroProperties() != nullptr)
			{
				boost::shared_ptr<Axis> lXAxis(_panel->getAxis(parameter.getSpectroProperties()->getXAxisId()));
				boost::shared_ptr<Axis> lYAxis(_panel->getAxis(parameter.getSpectroProperties()->getYAxisId()));
fbe3c2bb   Benjamin Renard   First commit
3076

ba6124b0   Menouard AZIB   Add parameter id ...
3077
3078
				if ((lXAxis == nullptr) || (lYAxis == nullptr))
					continue;
fbe3c2bb   Benjamin Renard   First commit
3079

ba6124b0   Menouard AZIB   Add parameter id ...
3080
3081
				Range lXRange = lXAxis->getRange();
				Range lYRange = lYAxis->getRange();
537e3ab0   Benjamin Renard   Fix a bug with In...
3082

ba6124b0   Menouard AZIB   Add parameter id ...
3083
				PlWindow lPlWindow = PlWindow(lXRange.getMin(), lXRange.getMax(), lYRange.getMin(), lYRange.getMax());
fbe3c2bb   Benjamin Renard   First commit
3084

ba6124b0   Menouard AZIB   Add parameter id ...
3085
3086
				if (!lXAxis->_additionalObjDrawn)
					drawXConstantLines(lXAxis, lPlWindow);
fbe3c2bb   Benjamin Renard   First commit
3087

ba6124b0   Menouard AZIB   Add parameter id ...
3088
3089
				if (!lYAxis->_additionalObjDrawn)
					drawYConstantLines(lYAxis, lPlWindow);
fbe3c2bb   Benjamin Renard   First commit
3090

ba6124b0   Menouard AZIB   Add parameter id ...
3091
3092
				if (!lXAxis->_additionalObjDrawn || !lYAxis->_additionalObjDrawn)
					drawTextPlots(lXAxis, lYAxis, lPlWindow, _panel->_textPlots);
fbe3c2bb   Benjamin Renard   First commit
3093

ba6124b0   Menouard AZIB   Add parameter id ...
3094
3095
3096
				lXAxis->_additionalObjDrawn = true;
				lYAxis->_additionalObjDrawn = true;
			}
fbe3c2bb   Benjamin Renard   First commit
3097

ba6124b0   Menouard AZIB   Add parameter id ...
3098
3099
3100
3101
			if (parameter.getSauvaudProperties() != nullptr)
			{
				boost::shared_ptr<Axis> lXAxis(_panel->getAxis(parameter.getSauvaudProperties()->getXAxisId()));
				boost::shared_ptr<Axis> lYAxis(_panel->getAxis(parameter.getSauvaudProperties()->getYAxisId()));
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3102

ba6124b0   Menouard AZIB   Add parameter id ...
3103
3104
				if ((lXAxis == nullptr) || (lYAxis == nullptr))
					continue;
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3105

ba6124b0   Menouard AZIB   Add parameter id ...
3106
3107
				Range lXRange = lXAxis->getRange();
				Range lYRange = lYAxis->getRange();
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3108

ba6124b0   Menouard AZIB   Add parameter id ...
3109
				PlWindow lPlWindow = PlWindow(lXRange.getMin(), lXRange.getMax(), lYRange.getMin(), lYRange.getMax());
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3110

ba6124b0   Menouard AZIB   Add parameter id ...
3111
3112
				if (!lXAxis->_additionalObjDrawn)
					drawXConstantLines(lXAxis, lPlWindow);
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3113

ba6124b0   Menouard AZIB   Add parameter id ...
3114
3115
				if (!lYAxis->_additionalObjDrawn)
					drawYConstantLines(lYAxis, lPlWindow);
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3116

ba6124b0   Menouard AZIB   Add parameter id ...
3117
3118
				if (!lXAxis->_additionalObjDrawn || !lYAxis->_additionalObjDrawn)
					drawTextPlots(lXAxis, lYAxis, lPlWindow, _panel->_textPlots);
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3119

ba6124b0   Menouard AZIB   Add parameter id ...
3120
3121
3122
				lXAxis->_additionalObjDrawn = true;
				lYAxis->_additionalObjDrawn = true;
			}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3123
		}
fbe3c2bb   Benjamin Renard   First commit
3124

ba6124b0   Menouard AZIB   Add parameter id ...
3125
3126
3127
3128
3129
3130
3131
		SeriesProperties lSeries;
		for (auto parameter : _parameterAxesList)
		{
			for (auto lSeries : parameter.getYSeriePropertiesList())
			{
				boost::shared_ptr<Axis> lXAxis(_panel->getAxis(lSeries.getXAxisId()));
				boost::shared_ptr<Axis> lYAxis(_panel->getAxis(lSeries.getYAxisId()));
078ec265   Benjamin Renard   Give the possibil...
3132

ba6124b0   Menouard AZIB   Add parameter id ...
3133
3134
				if ((lXAxis == nullptr) || (lYAxis == nullptr))
					continue;
c2b6616d   Benjamin Renard   Fix bug in drawAd...
3135

ba6124b0   Menouard AZIB   Add parameter id ...
3136
3137
				Range lXRange = lXAxis->getRange();
				Range lYRange = lYAxis->getRange();
078ec265   Benjamin Renard   Give the possibil...
3138

ba6124b0   Menouard AZIB   Add parameter id ...
3139
				PlWindow lPlWindow = PlWindow(lXRange.getMin(), lXRange.getMax(), lYRange.getMin(), lYRange.getMax());
078ec265   Benjamin Renard   Give the possibil...
3140

ba6124b0   Menouard AZIB   Add parameter id ...
3141
3142
				if (!lXAxis->_additionalObjDrawn)
					drawXConstantLines(lXAxis, lPlWindow);
078ec265   Benjamin Renard   Give the possibil...
3143

ba6124b0   Menouard AZIB   Add parameter id ...
3144
3145
				if (!lYAxis->_additionalObjDrawn)
					drawYConstantLines(lYAxis, lPlWindow);
078ec265   Benjamin Renard   Give the possibil...
3146

ba6124b0   Menouard AZIB   Add parameter id ...
3147
3148
				if (!lXAxis->_additionalObjDrawn || !lYAxis->_additionalObjDrawn)
					drawTextPlots(lXAxis, lYAxis, lPlWindow, _panel->_textPlots);
078ec265   Benjamin Renard   Give the possibil...
3149

ba6124b0   Menouard AZIB   Add parameter id ...
3150
3151
3152
				lXAxis->_additionalObjDrawn = true;
				lYAxis->_additionalObjDrawn = true;
			}
078ec265   Benjamin Renard   Give the possibil...
3153
		}
fbe3c2bb   Benjamin Renard   First commit
3154

ba6124b0   Menouard AZIB   Add parameter id ...
3155
3156
3157
3158
		// Draw curvePlots
		for (auto curvePlot : _panel->_curvePlots)
			drawCurvePlot(*curvePlot);
	}
fbe3c2bb   Benjamin Renard   First commit
3159

ba6124b0   Menouard AZIB   Add parameter id ...
3160
3161
3162
3163
	void PanelPlotOutput::setPlStream(std::shared_ptr<plstream> &pls)
	{
		_pls = pls;
	}
c45180e1   Benjamin Renard   Add _used propert...
3164

ba6124b0   Menouard AZIB   Add parameter id ...
3165
3166
3167
3168
	std::string PanelPlotOutput::drawOppositeSide(boost::shared_ptr<Axis> pAxis)
	{
		boost::shared_ptr<Axis> lNewAxis;
		std::string lOppositeSide;
c45180e1   Benjamin Renard   Add _used propert...
3169

ba6124b0   Menouard AZIB   Add parameter id ...
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
		switch (pAxis->_position)
		{
		case PlotCommon::Position::POS_BOTTOM:
			if (pAxis->_visible && !_plotAreaSideSet[PlotCommon::Position::POS_TOP])
			{
				lOppositeSide = "c";
			}
			break;
		case PlotCommon::Position::POS_TOP:
			if (pAxis->_visible && !_plotAreaSideSet[PlotCommon::Position::POS_BOTTOM])
			{
				lOppositeSide = "b";
			}
			break;
		case PlotCommon::Position::POS_LEFT:
			if (pAxis->_visible && !_plotAreaSideSet[PlotCommon::Position::POS_RIGHT])
			{
				lOppositeSide = "c";
			}
			break;
		case PlotCommon::Position::POS_RIGHT:
			if (pAxis->_visible && !_plotAreaSideSet[PlotCommon::Position::POS_LEFT])
			{
				lOppositeSide = "b";
			}
			break;
		case PlotCommon::Position::POS_CENTER:
		default:
			lOppositeSide = "";
fbe3c2bb   Benjamin Renard   First commit
3199
		}
fbe3c2bb   Benjamin Renard   First commit
3200

ba6124b0   Menouard AZIB   Add parameter id ...
3201
3202
		return lOppositeSide;
	}
fbe3c2bb   Benjamin Renard   First commit
3203

ba6124b0   Menouard AZIB   Add parameter id ...
3204
3205
3206
	/*
	 * Create a sampled parameter from an original parameter and a sampling value
	 */
07bf1e7c   Menouard AZIB   EveryThing works ...
3207
	AMDA::Parameters::ParameterSPtr PanelPlotOutput::createSampledParameter(AMDA::Parameters::ParameterSPtr &originalParam, float samplingValue, int gap)
ba6124b0   Menouard AZIB   Add parameter id ...
3208
	{
07bf1e7c   Menouard AZIB   EveryThing works ...
3209
		const int userGap = gap == -1 ? originalParam->getGapThreshold(): gap;
ba6124b0   Menouard AZIB   Add parameter id ...
3210
		AMDA::Parameters::ParameterSPtr sampledParam = _parameterManager.getSampledParameter(
fbe3c2bb   Benjamin Renard   First commit
3211
3212
3213
			originalParam->getId(),
			"classic",
			samplingValue,
07bf1e7c   Menouard AZIB   EveryThing works ...
3214
			userGap, true);
fbe3c2bb   Benjamin Renard   First commit
3215

ba6124b0   Menouard AZIB   Add parameter id ...
3216
3217
3218
3219
3220
		if (sampledParam == NULL)
		{
			LOG4CXX_ERROR(gLogger,
						  "ParamOutput::createSampledParameter : cannot create sampled parameter");
			BOOST_THROW_EXCEPTION(
fbe3c2bb   Benjamin Renard   First commit
3221
				AMDA::Parameters::ParamOutput_exception());
ba6124b0   Menouard AZIB   Add parameter id ...
3222
		}
fbe3c2bb   Benjamin Renard   First commit
3223

ba6124b0   Menouard AZIB   Add parameter id ...
3224
		LOG4CXX_INFO(gLogger, "ParamOutput::createSampledParameter : sampled parameter : " << sampledParam->getId() << " created");
fbe3c2bb   Benjamin Renard   First commit
3225

ba6124b0   Menouard AZIB   Add parameter id ...
3226
3227
		return sampledParam;
	}
fbe3c2bb   Benjamin Renard   First commit
3228

ba6124b0   Menouard AZIB   Add parameter id ...
3229
3230
3231
3232
3233
3234
3235
3236
	/*
	 * Create a sampled parameter from an original parameter and a reference parameter for time definition
	 */
	AMDA::Parameters::ParameterSPtr PanelPlotOutput::createSampledParameterUnderReferenceParameter(AMDA::Parameters::ParameterSPtr &originalParam, AMDA::Parameters::ParameterSPtr &refParam)
	{
		/*if (originalParam == refParam) {
			return originalParam;
		}*/
deefda79   Benjamin Renard   Addapt resampling...
3237

ba6124b0   Menouard AZIB   Add parameter id ...
3238
		AMDA::Parameters::ParameterSPtr sampledParam = _parameterManager.getSampledParameterUnderRefParam(
fbe3c2bb   Benjamin Renard   First commit
3239
			originalParam->getId(),
ba6124b0   Menouard AZIB   Add parameter id ...
3240
			refParam->getId(), true);
fbe3c2bb   Benjamin Renard   First commit
3241

ba6124b0   Menouard AZIB   Add parameter id ...
3242
3243
3244
3245
3246
		if (sampledParam == NULL)
		{
			LOG4CXX_ERROR(gLogger,
						  "ParamOutput::createSampledParameterUnderReferenceParameter : cannot create sampled parameter");
			BOOST_THROW_EXCEPTION(
fbe3c2bb   Benjamin Renard   First commit
3247
				AMDA::Parameters::ParamOutput_exception());
ba6124b0   Menouard AZIB   Add parameter id ...
3248
		}
fbe3c2bb   Benjamin Renard   First commit
3249

ba6124b0   Menouard AZIB   Add parameter id ...
3250
		LOG4CXX_INFO(gLogger, "ParamOutput::createSampledParameterUnderReferenceParameter : sampled parameter : " << sampledParam->getId() << " created");
fbe3c2bb   Benjamin Renard   First commit
3251

ba6124b0   Menouard AZIB   Add parameter id ...
3252
3253
		return sampledParam;
	}
fbe3c2bb   Benjamin Renard   First commit
3254

ba6124b0   Menouard AZIB   Add parameter id ...
3255
	ParameterAxes *PanelPlotOutput::getParameterAxesByColorSerieId(int colorSerieId)
fbe3c2bb   Benjamin Renard   First commit
3256
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3257
3258
3259
3260
3261
		if (colorSerieId < 0)
			return NULL;

		for (ParameterAxesList::iterator it = _parameterAxesList.begin();
			 it != _parameterAxesList.end(); ++it)
fbe3c2bb   Benjamin Renard   First commit
3262
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3263
3264
3265
3266
3267
			for (auto serieProp : it->getColorSeriePropertiesList())
			{
				if (serieProp.getId() == colorSerieId)
					return &(*it);
			}
fbe3c2bb   Benjamin Renard   First commit
3268
		}
fbe3c2bb   Benjamin Renard   First commit
3269

ba6124b0   Menouard AZIB   Add parameter id ...
3270
3271
3272
		LOG4CXX_ERROR(gLogger, "ParamOutput::getColorSeriePropertiesById : Not founded : " << colorSerieId);
		return NULL;
	}
fbe3c2bb   Benjamin Renard   First commit
3273

ba6124b0   Menouard AZIB   Add parameter id ...
3274
	ParameterAxes *PanelPlotOutput::getParameterAxesByXSerieId(int xSerieId)
c46af5a8   Benjamin Renard   Implements multi ...
3275
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3276
3277
		for (ParameterAxesList::iterator it = _parameterAxesList.begin();
			 it != _parameterAxesList.end(); ++it)
c46af5a8   Benjamin Renard   Implements multi ...
3278
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3279
3280
3281
3282
3283
			for (auto serieProp : it->getXSeriePropertiesList())
			{
				if (serieProp.getId() == xSerieId)
					return &(*it);
			}
c46af5a8   Benjamin Renard   Implements multi ...
3284
		}
c46af5a8   Benjamin Renard   Implements multi ...
3285

ba6124b0   Menouard AZIB   Add parameter id ...
3286
3287
3288
		LOG4CXX_ERROR(gLogger, "ParamOutput::getXSeriePropertiesById : Not founded : " << xSerieId);
		return NULL;
	}
c46af5a8   Benjamin Renard   Implements multi ...
3289

ba6124b0   Menouard AZIB   Add parameter id ...
3290
3291
3292
3293
3294
3295
	/**
	 * Create parameters needed for this plot.
	 * By default, the creation method create parameters for a time serie.
	 * Override it for other plot type
	 */
	void PanelPlotOutput::createParameters(std::list<std::string> &usedParametersId_)
fbe3c2bb   Benjamin Renard   First commit
3296
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3297
3298
3299
3300
3301
3302
		// -- for each y serie on each parameter, calculate
		// y serie sampling according to max resolution
		for (ParameterAxesList::iterator it = _parameterAxesList.begin();
			 it != _parameterAxesList.end(); ++it)
		{
			AMDA::Parameters::ParameterSPtr originalParam =
fbe3c2bb   Benjamin Renard   First commit
3303
3304
				_parameterManager.getParameter(it->_originalParamId);

ba6124b0   Menouard AZIB   Add parameter id ...
3305
3306
			// original parameter sampling
			double samplingValue = getSamplingInTreeParameter(originalParam);
fbe3c2bb   Benjamin Renard   First commit
3307

ba6124b0   Menouard AZIB   Add parameter id ...
3308
3309
3310
3311
3312
3313
			// For each series
			std::vector<SeriesProperties>::iterator ity;
			for (ity = it->getYSeriePropertiesList().begin(); ity != it->getYSeriePropertiesList().end();
				 ++ity)
			{
				ParameterAxes *colorSerieParameterAxes = getParameterAxesByColorSerieId(ity->getColorSerieId());
fbe3c2bb   Benjamin Renard   First commit
3314

ba6124b0   Menouard AZIB   Add parameter id ...
3315
3316
3317
				AMDA::Parameters::ParameterSPtr originalColorParam;
				if (colorSerieParameterAxes != NULL)
					originalColorParam = _parameterManager.getParameter(colorSerieParameterAxes->_originalParamId);
fbe3c2bb   Benjamin Renard   First commit
3318

ba6124b0   Menouard AZIB   Add parameter id ...
3319
3320
				// get corrected sampling value in relation with max resolution
				double correctedSamplingValue = getCorrectedSamplingValue(ity->getMaxResolution(), samplingValue);
fbe3c2bb   Benjamin Renard   First commit
3321

ba6124b0   Menouard AZIB   Add parameter id ...
3322
				AMDA::Parameters::ParameterSPtr usedParam;
fbe3c2bb   Benjamin Renard   First commit
3323

ba6124b0   Menouard AZIB   Add parameter id ...
3324
3325
				// create parameter and link to the serie
				switch (ity->getResamplingProperties().getType())
fbe3c2bb   Benjamin Renard   First commit
3326
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3327
3328
3329
				case ResamplingType::MANUAL:
				{
					// create resampling parameters for param
2fc1f2f8   Benjamin Renard   Full rework for s...
3330
					usedParam = createSampledParameter(originalParam, ity->getResamplingProperties().getValue());
fbe3c2bb   Benjamin Renard   First commit
3331
3332
					break;
				}
ba6124b0   Menouard AZIB   Add parameter id ...
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
				case ResamplingType::AUTO:
				case ResamplingType::YPARAM:
				case ResamplingType::XPARAM:
					if (abs(samplingValue - correctedSamplingValue) > 1.)
					{
						// more than one second between samplingValue and correctedSamplingValue
						//=> use resampling parameter
						usedParam = createSampledParameter(originalParam, correctedSamplingValue);
					}
					else
					{
						// use original parameter
						usedParam = originalParam;
					}
					break;
fbe3c2bb   Benjamin Renard   First commit
3348
				}
ba6124b0   Menouard AZIB   Add parameter id ...
3349
3350
3351
3352
3353
				// Add used parameter to parameters list
				if (std::find(usedParametersId_.begin(), usedParametersId_.end(), usedParam->getId()) == usedParametersId_.end())
					usedParametersId_.push_back(usedParam->getId());
				// link this paramter to the serie
				ity->setParamId(usedParam->getId());
fbe3c2bb   Benjamin Renard   First commit
3354

ba6124b0   Menouard AZIB   Add parameter id ...
3355
				ErrorBarProperties &errorBarProp = ity->getErrorBarProperties();
fbe3c2bb   Benjamin Renard   First commit
3356

ba6124b0   Menouard AZIB   Add parameter id ...
3357
3358
				// Compute min / max re-sampled parameters if min/max error bar are defined for the serie
				if (errorBarProp.getErrorMinMax() != nullptr)
fbe3c2bb   Benjamin Renard   First commit
3359
				{
fbe3c2bb   Benjamin Renard   First commit
3360

ba6124b0   Menouard AZIB   Add parameter id ...
3361
3362
3363
3364
					// Build expression for computed parameter = usedParam - minParam
					AMDA::Parameters::ParameterSPtr originalMinParam = _parameterManager.getParameter(errorBarProp.getErrorMinMax()->getOriginalParamMin());
					AMDA::Parameters::ParameterSPtr minParam = createSampledParameterUnderReferenceParameter(originalMinParam, usedParam);
					std::stringstream minExpr;
ab9fea4a   Erdogan Furkan   #7268 - Done
3365
					minExpr << "$" << usedParam->getId() << "-$" + minParam->getId();
fbe3c2bb   Benjamin Renard   First commit
3366

ba6124b0   Menouard AZIB   Add parameter id ...
3367
3368
					// create parameter from expression
					AMDA::Parameters::ParameterSPtr usedMinParam = _parameterManager.getParameterFromExpression(minExpr.str(), originalParam->getGapThreshold(), true);
fbe3c2bb   Benjamin Renard   First commit
3369

ba6124b0   Menouard AZIB   Add parameter id ...
3370
3371
3372
3373
3374
					if (usedMinParam == nullptr)
					{
						LOG4CXX_ERROR(gLogger, "PanelPlotOutput::createParameters - Cannot create parameter from expression " << minExpr.str());
						continue;
					}
fbe3c2bb   Benjamin Renard   First commit
3375

ba6124b0   Menouard AZIB   Add parameter id ...
3376
3377
3378
					if (std::find(usedParametersId_.begin(), usedParametersId_.end(), usedMinParam->getId()) == usedParametersId_.end())
						usedParametersId_.push_back(usedMinParam->getId());
					errorBarProp.getErrorMinMax()->setUsedParamMin(usedMinParam->getId());
fbe3c2bb   Benjamin Renard   First commit
3379

ba6124b0   Menouard AZIB   Add parameter id ...
3380
3381
					// Build expression for computed parameter = usedParam + maxParam
					AMDA::Parameters::ParameterSPtr originalMaxParam = _parameterManager.getParameter(errorBarProp.getErrorMinMax()->getOriginalParamMax());
e9782682   Benjamin Renard   Fix bug with erro...
3382

ba6124b0   Menouard AZIB   Add parameter id ...
3383
3384
					AMDA::Parameters::ParameterSPtr maxParam = createSampledParameterUnderReferenceParameter(originalMaxParam, usedParam);
					std::stringstream maxExpr;
ab9fea4a   Erdogan Furkan   #7268 - Done
3385
					maxExpr << "$" << usedParam->getId() << "+$" + maxParam->getId();
fbe3c2bb   Benjamin Renard   First commit
3386

ba6124b0   Menouard AZIB   Add parameter id ...
3387
3388
					// create parameter from expression
					AMDA::Parameters::ParameterSPtr usedMaxParam = _parameterManager.getParameterFromExpression(maxExpr.str(), originalParam->getGapThreshold(), true);
fbe3c2bb   Benjamin Renard   First commit
3389

ba6124b0   Menouard AZIB   Add parameter id ...
3390
3391
3392
3393
3394
3395
3396
3397
3398
					if (usedMaxParam == nullptr)
					{
						LOG4CXX_ERROR(gLogger, "PanelPlotOutput::createParameters - Cannot create parameter from expression " << maxExpr.str());
						continue;
					}

					if (std::find(usedParametersId_.begin(), usedParametersId_.end(), usedMaxParam->getId()) == usedParametersId_.end())
						usedParametersId_.push_back(usedMaxParam->getId());
					errorBarProp.getErrorMinMax()->setUsedParamMax(usedMaxParam->getId());
fbe3c2bb   Benjamin Renard   First commit
3399
3400
				}

ba6124b0   Menouard AZIB   Add parameter id ...
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
				if (originalColorParam != nullptr)
				{
					AMDA::Parameters::ParameterSPtr usedColorParam = createSampledParameterUnderReferenceParameter(originalColorParam, usedParam);
					// Add used color parameter to parameters list
					if (std::find(usedParametersId_.begin(), usedParametersId_.end(), usedColorParam->getId()) == usedParametersId_.end())
						usedParametersId_.push_back(usedColorParam->getId());
					// link this color parameter to the y serie
					ity->setColorParamId(usedColorParam->getId());
					// link the used parameter to the color serie
					colorSerieParameterAxes->getColorSeriePropertiesById(ity->getColorSerieId()).addParamId(usedParam->getId(), usedColorParam->getId());
					// activate the Z Axis
					ity->setZAxis(true);
				}
fbe3c2bb   Benjamin Renard   First commit
3414
3415
			}

ba6124b0   Menouard AZIB   Add parameter id ...
3416
3417
3418
			// For spectro if defined
			std::shared_ptr<SpectroProperties> pSpecProp = it->getSpectroProperties();
			if (pSpecProp != nullptr)
fbe3c2bb   Benjamin Renard   First commit
3419
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3420
3421
3422
3423
3424
3425
3426
				AMDA::Info::ParamInfoSPtr paramInfo = AMDA::Info::ParamMgr::getInstance()->getParamInfoFromId(originalParam->getInfoId());
				boost::shared_ptr<AMDA::Info::ParamTable> tableSPtr;
				if (paramInfo != nullptr)
					tableSPtr = paramInfo->getTable(pSpecProp->getRelatedDim());
				// get corrected sampling value in relation with max resolution
				double correctedSamplingValue = getCorrectedSamplingValue(pSpecProp->getMaxResolution(), samplingValue);
				AMDA::Parameters::ParameterSPtr usedParam;
fbe3c2bb   Benjamin Renard   First commit
3427

ba6124b0   Menouard AZIB   Add parameter id ...
3428
				if (abs(samplingValue - correctedSamplingValue) > 1.)
f2db3c16   Benjamin Renard   Support variable ...
3429
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3430
3431
3432
3433
					// more than one second between samplingValue and correctedSamplingValue
					//=> use resampling parameter
					usedParam = createSampledParameter(originalParam, correctedSamplingValue);
					if ((tableSPtr != nullptr) && tableSPtr->isVariable(&_parameterManager))
f2db3c16   Benjamin Renard   Support variable ...
3434
					{
ba6124b0   Menouard AZIB   Add parameter id ...
3435
3436
3437
3438
						for (std::map<std::string, std::string>::iterator it = tableSPtr->getTableParams(&_parameterManager).begin(); it != tableSPtr->getTableParams(&_parameterManager).end(); ++it)
						{
							std::string tableParamKey = it->first;
							std::string tableParamName = it->second;
f2db3c16   Benjamin Renard   Support variable ...
3439

ba6124b0   Menouard AZIB   Add parameter id ...
3440
3441
3442
3443
							AMDA::Parameters::ParameterSPtr originalTableParam = _parameterManager.getParameter(tableParamName);
							AMDA::Parameters::ParameterSPtr usedTableParam = createSampledParameter(originalTableParam, correctedSamplingValue);
							pSpecProp->addTableParam(tableParamKey, usedTableParam->getId());
						}
f2db3c16   Benjamin Renard   Support variable ...
3444
3445
					}
				}
ba6124b0   Menouard AZIB   Add parameter id ...
3446
				else
f2db3c16   Benjamin Renard   Support variable ...
3447
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3448
3449
3450
					// use original parameter
					usedParam = originalParam;
					if ((tableSPtr != nullptr) && tableSPtr->isVariable(&_parameterManager))
f2db3c16   Benjamin Renard   Support variable ...
3451
					{
ba6124b0   Menouard AZIB   Add parameter id ...
3452
3453
3454
3455
						for (std::map<std::string, std::string>::iterator it = tableSPtr->getTableParams(&_parameterManager).begin(); it != tableSPtr->getTableParams(&_parameterManager).end(); ++it)
						{
							std::string tableParamKey = it->first;
							std::string tableParamName = it->second;
f2db3c16   Benjamin Renard   Support variable ...
3456

ba6124b0   Menouard AZIB   Add parameter id ...
3457
3458
3459
							AMDA::Parameters::ParameterSPtr originalTableParam = _parameterManager.getParameter(tableParamName);
							pSpecProp->addTableParam(tableParamKey, originalTableParam->getId());
						}
f2db3c16   Benjamin Renard   Support variable ...
3460
3461
					}
				}
f2db3c16   Benjamin Renard   Support variable ...
3462

ba6124b0   Menouard AZIB   Add parameter id ...
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
				// Add used parameter to parameters list
				if (std::find(usedParametersId_.begin(), usedParametersId_.end(), usedParam->getId()) == usedParametersId_.end())
					usedParametersId_.push_back(usedParam->getId());
				pSpecProp->setParamId(usedParam->getId());
				// Add table parameters to parameters list
				for (std::map<std::string, std::string>::iterator it = pSpecProp->getTableParams().begin(); it != pSpecProp->getTableParams().end(); ++it)
				{
					std::string tableParamId = it->second;

					if (std::find(usedParametersId_.begin(), usedParametersId_.end(), tableParamId) == usedParametersId_.end())
						usedParametersId_.push_back(tableParamId);
				}
f2db3c16   Benjamin Renard   Support variable ...
3475
			}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3476

ba6124b0   Menouard AZIB   Add parameter id ...
3477
3478
3479
			// For sauvaud if defined
			std::shared_ptr<SauvaudProperties> pSauvaudProp = it->getSauvaudProperties();
			if (pSauvaudProp != nullptr)
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3480
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3481
3482
3483
3484
3485
3486
3487
3488
3489
				AMDA::Info::ParamInfoSPtr paramInfo = AMDA::Info::ParamMgr::getInstance()->getParamInfoFromId(originalParam->getInfoId());
				boost::shared_ptr<AMDA::Info::ParamTable> tableSPtr;
				if (paramInfo != nullptr)
					tableSPtr = paramInfo->getTable(pSauvaudProp->getRelatedDim());
				// get corrected sampling value in relation with max resolution
				double correctedSamplingValue = getCorrectedSamplingValue(pSauvaudProp->getMaxResolution(), samplingValue);
				AMDA::Parameters::ParameterSPtr usedParam;

				if (abs(samplingValue - correctedSamplingValue) > 1.)
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3490
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3491
3492
3493
3494
					// more than one second between samplingValue and correctedSamplingValue
					//=> use resampling parameter
					usedParam = createSampledParameter(originalParam, correctedSamplingValue);
					if ((tableSPtr != nullptr) && tableSPtr->isVariable(&_parameterManager))
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3495
					{
ba6124b0   Menouard AZIB   Add parameter id ...
3496
3497
3498
3499
						for (std::map<std::string, std::string>::iterator it = tableSPtr->getTableParams(&_parameterManager).begin(); it != tableSPtr->getTableParams(&_parameterManager).end(); ++it)
						{
							std::string tableParamKey = it->first;
							std::string tableParamName = it->second;
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3500

ba6124b0   Menouard AZIB   Add parameter id ...
3501
3502
3503
3504
							AMDA::Parameters::ParameterSPtr originalTableParam = _parameterManager.getParameter(tableParamName);
							AMDA::Parameters::ParameterSPtr usedTableParam = createSampledParameter(originalTableParam, correctedSamplingValue);
							pSauvaudProp->addTableParam(tableParamKey, usedTableParam->getId());
						}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3505
3506
					}
				}
ba6124b0   Menouard AZIB   Add parameter id ...
3507
				else
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3508
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3509
3510
3511
					// use original parameter
					usedParam = originalParam;
					if ((tableSPtr != nullptr) && tableSPtr->isVariable(&_parameterManager))
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3512
					{
ba6124b0   Menouard AZIB   Add parameter id ...
3513
3514
3515
3516
						for (std::map<std::string, std::string>::iterator it = tableSPtr->getTableParams(&_parameterManager).begin(); it != tableSPtr->getTableParams(&_parameterManager).end(); ++it)
						{
							std::string tableParamKey = it->first;
							std::string tableParamName = it->second;
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3517

ba6124b0   Menouard AZIB   Add parameter id ...
3518
3519
3520
							AMDA::Parameters::ParameterSPtr originalTableParam = _parameterManager.getParameter(tableParamName);
							pSauvaudProp->addTableParam(tableParamKey, originalTableParam->getId());
						}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3521
3522
					}
				}
ba6124b0   Menouard AZIB   Add parameter id ...
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535

				// Add used parameter to parameters list
				if (std::find(usedParametersId_.begin(), usedParametersId_.end(), usedParam->getId()) == usedParametersId_.end())
					usedParametersId_.push_back(usedParam->getId());
				pSauvaudProp->setParamId(usedParam->getId());
				// Add table parameters to parameters list
				for (std::map<std::string, std::string>::iterator it = pSauvaudProp->getTableParams().begin(); it != pSauvaudProp->getTableParams().end(); ++it)
				{
					std::string tableParamId = it->second;

					if (std::find(usedParametersId_.begin(), usedParametersId_.end(), tableParamId) == usedParametersId_.end())
						usedParametersId_.push_back(tableParamId);
				}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3536
			}
ba6124b0   Menouard AZIB   Add parameter id ...
3537
3538
3539
3540

			// For intervals if defined
			std::shared_ptr<IntervalsProperties> pIntProp = it->getIntervalsProperties();
			if (pIntProp != nullptr)
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3541
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
				// get corrected sampling value in relation with max resolution
				double correctedSamplingValue = getCorrectedSamplingValue(pIntProp->getMaxResolution(), samplingValue);
				AMDA::Parameters::ParameterSPtr usedParam;

				if (abs(samplingValue - correctedSamplingValue) > 1.)
				{
					// more than one second between samplingValue and correctedSamplingValue
					//=> use resampling parameter
					usedParam = createSampledParameter(originalParam, correctedSamplingValue);
				}
				else
				{
					// use original parameter
					usedParam = originalParam;
				}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3557

ba6124b0   Menouard AZIB   Add parameter id ...
3558
3559
3560
3561
				// Add used parameter to parameters list
				if (std::find(usedParametersId_.begin(), usedParametersId_.end(), usedParam->getId()) == usedParametersId_.end())
					usedParametersId_.push_back(usedParam->getId());
				pIntProp->setParamId(usedParam->getId());
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3562
			}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3563
		}
ba6124b0   Menouard AZIB   Add parameter id ...
3564
	}
e257cfb9   Benjamin Renard   First implementat...
3565

ba6124b0   Menouard AZIB   Add parameter id ...
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
	/**
	 * Gets sampling value from resolution (point-per-plot) according to
	 * the plot time interval and the base parameter sampling value.
	 */
	double PanelPlotOutput::getCorrectedSamplingValue(int maxResolution, double samplingValue)
	{
		double timeInt = 0.;
		if (_panel->_page->_superposeMode)
		{
			// merge all intervals size
			TimeIntervalList::iterator crtTimeInterval = _parameterManager.getInputIntervals()->begin();
			while (crtTimeInterval != _parameterManager.getInputIntervals()->end())
e257cfb9   Benjamin Renard   First implementat...
3578
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3579
3580
				timeInt += (crtTimeInterval->_stopTime - crtTimeInterval->_startTime);
				++crtTimeInterval;
e257cfb9   Benjamin Renard   First implementat...
3581
			}
ba6124b0   Menouard AZIB   Add parameter id ...
3582
3583
3584
3585
3586
3587
		}
		else
		{
			// find the biggest intervals size
			TimeIntervalList::iterator crtTimeInterval = _parameterManager.getInputIntervals()->begin();
			while (crtTimeInterval != _parameterManager.getInputIntervals()->end())
e257cfb9   Benjamin Renard   First implementat...
3588
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3589
3590
3591
				if ((crtTimeInterval->_stopTime - crtTimeInterval->_startTime) > timeInt)
					timeInt = crtTimeInterval->_stopTime - crtTimeInterval->_startTime;
				++crtTimeInterval;
e257cfb9   Benjamin Renard   First implementat...
3592
			}
e257cfb9   Benjamin Renard   First implementat...
3593
		}
fbe3c2bb   Benjamin Renard   First commit
3594

ba6124b0   Menouard AZIB   Add parameter id ...
3595
		if ((timeInt == 0) || (maxResolution == -1) || (timeInt / samplingValue < maxResolution))
fbe3c2bb   Benjamin Renard   First commit
3596
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3597
			return samplingValue;
fbe3c2bb   Benjamin Renard   First commit
3598
		}
ba6124b0   Menouard AZIB   Add parameter id ...
3599
3600
3601
3602
3603
		// get the exact sampling
		double correctedSampling = timeInt / maxResolution;
		// rounded it to the next int sampling
		double roundedSampling = (int)correctedSampling;
		if (roundedSampling < correctedSampling)
fbe3c2bb   Benjamin Renard   First commit
3604
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3605
			roundedSampling += 1;
fbe3c2bb   Benjamin Renard   First commit
3606
		}
ba6124b0   Menouard AZIB   Add parameter id ...
3607
		return roundedSampling;
fbe3c2bb   Benjamin Renard   First commit
3608
3609
	}

ba6124b0   Menouard AZIB   Add parameter id ...
3610
3611
3612
3613
3614
	/**
	 * @brief Get the list of indexes used for a parameter
	 */
	std::vector<AMDA::Common::ParameterIndexComponent> PanelPlotOutput::getParamUsedIndexes(std::string paramId,
																							int dim1Size, int dim2Size)
fbe3c2bb   Benjamin Renard   First commit
3615
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3616
3617
3618
		std::vector<AMDA::Common::ParameterIndexComponent> indexes;
		for (ParameterAxesList::iterator paramAxeIt = _parameterAxesList.begin();
			 paramAxeIt != _parameterAxesList.end(); ++paramAxeIt)
fbe3c2bb   Benjamin Renard   First commit
3619
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3620
3621
3622
			// get indexes for spectro
			std::shared_ptr<SpectroProperties> pSpecProp = paramAxeIt->getSpectroProperties();
			if (pSpecProp != nullptr)
fbe3c2bb   Benjamin Renard   First commit
3623
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3624
				if (pSpecProp->getParamId() == paramId)
fbe3c2bb   Benjamin Renard   First commit
3625
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3626
3627
3628
3629
3630
3631
3632
3633
					if (pSpecProp->getIndexes().empty())
					{
						// get used indexes by the spectro thanks to the index definition in the request
						AMDA::Common::ParameterIndexComponentList indexList;
						AMDA::Common::ParameterIndexesTool::parse(pSpecProp->getIndexDef(),
																  dim1Size, dim2Size, indexList);
						pSpecProp->setIndexes(indexList);
					}
fbe3c2bb   Benjamin Renard   First commit
3634

ba6124b0   Menouard AZIB   Add parameter id ...
3635
3636
3637
3638
3639
3640
					for (auto index : pSpecProp->getIndexes())
					{
						if (std::find(indexes.begin(), indexes.end(), index) != indexes.end())
							continue;
						indexes.push_back(index);
					}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3641
3642
				}
			}
ba6124b0   Menouard AZIB   Add parameter id ...
3643
3644
3645
3646

			// get indexes for spectro
			std::shared_ptr<SauvaudProperties> pSauvaudProp = paramAxeIt->getSauvaudProperties();
			if (pSauvaudProp != nullptr)
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3647
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3648
				if (pSauvaudProp->getParamId() == paramId)
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3649
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3650
3651
3652
3653
3654
3655
3656
3657
					if (pSauvaudProp->getIndexes().empty())
					{
						// get used indexes by the spectro thanks to the index definition in the request
						AMDA::Common::ParameterIndexComponentList indexList;
						AMDA::Common::ParameterIndexesTool::parse(pSauvaudProp->getIndexDef(),
																  dim1Size, dim2Size, indexList);
						pSauvaudProp->setIndexes(indexList);
					}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3658

ba6124b0   Menouard AZIB   Add parameter id ...
3659
3660
3661
3662
3663
3664
					for (auto index : pSauvaudProp->getIndexes())
					{
						if (std::find(indexes.begin(), indexes.end(), index) != indexes.end())
							continue;
						indexes.push_back(index);
					}
fbe3c2bb   Benjamin Renard   First commit
3665
3666
				}
			}
fbe3c2bb   Benjamin Renard   First commit
3667

ba6124b0   Menouard AZIB   Add parameter id ...
3668
3669
3670
			// get indexes for intervals
			std::shared_ptr<IntervalsProperties> pIntProp = paramAxeIt->getIntervalsProperties();
			if (pIntProp != nullptr)
e257cfb9   Benjamin Renard   First implementat...
3671
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3672
				if (pIntProp->getParamId() == paramId)
e257cfb9   Benjamin Renard   First implementat...
3673
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
					if (pIntProp->getIndexes().empty())
					{
						// get used indexes by the intervals thanks to the index definition in the request
						AMDA::Common::ParameterIndexComponentList indexList;
						AMDA::Common::ParameterIndexesTool::parse(pIntProp->getIndexDef(),
																  dim1Size, dim2Size, indexList);
						pIntProp->setIndexes(indexList);
					}

					for (auto index : pIntProp->getIndexes())
					{
						if (std::find(indexes.begin(), indexes.end(), index) != indexes.end())
							continue;
						indexes.push_back(index);
					}
e257cfb9   Benjamin Renard   First implementat...
3689
3690
				}
			}
e257cfb9   Benjamin Renard   First implementat...
3691

ba6124b0   Menouard AZIB   Add parameter id ...
3692
3693
			// get indexes for series of this ParameterAxe
			std::vector<AMDA::Common::ParameterIndexComponent> seriesIndexes = paramAxeIt->getParamUsedIndexes(paramId);
fbe3c2bb   Benjamin Renard   First commit
3694

ba6124b0   Menouard AZIB   Add parameter id ...
3695
			for (AMDA::Common::ParameterIndexComponent index : seriesIndexes)
fbe3c2bb   Benjamin Renard   First commit
3696
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
				if ((index.getDim1Index() == -1) && (index.getDim2Index() == -1))
				{
					//-1 => all indexes
					indexes.clear();
					indexes.push_back(AMDA::Common::ParameterIndexComponent(-1, -1));
					return indexes;
				}
				if (std::find(indexes.begin(), indexes.end(), index) != indexes.end())
					continue;
				indexes.push_back(index);
fbe3c2bb   Benjamin Renard   First commit
3707
			}
fbe3c2bb   Benjamin Renard   First commit
3708
		}
fbe3c2bb   Benjamin Renard   First commit
3709

ba6124b0   Menouard AZIB   Add parameter id ...
3710
3711
		if (indexes.empty())
			indexes.push_back(AMDA::Common::ParameterIndexComponent(-1, -1));
fbe3c2bb   Benjamin Renard   First commit
3712

ba6124b0   Menouard AZIB   Add parameter id ...
3713
3714
		return indexes;
	}
fbe3c2bb   Benjamin Renard   First commit
3715

ba6124b0   Menouard AZIB   Add parameter id ...
3716
3717
3718
3719
3720
3721
3722
	/*
	 * @brief Set pointer to params values
	 */
	void PanelPlotOutput::setParameterValues(std::map<std::string, ParameterData> *pParameterValues)
	{
		_pParameterValues = pParameterValues;
	}
fbe3c2bb   Benjamin Renard   First commit
3723

ba6124b0   Menouard AZIB   Add parameter id ...
3724
3725
3726
3727
	/*
	 * @brief Set a pointer to the time intervals list
	 */
	void PanelPlotOutput::setTimeIntervalListPtr(AMDA::Parameters::TimeIntervalList *timeIntervalListPtr)
fbe3c2bb   Benjamin Renard   First commit
3728
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3729
		_timeIntervalListPtr = timeIntervalListPtr;
fbe3c2bb   Benjamin Renard   First commit
3730
3731
	}

ba6124b0   Menouard AZIB   Add parameter id ...
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
	/*
	 * @brief Get computed values (in relation with the y axis definition) for a y serie and a time interval
	 * Do not forget to delete computedValues !!
	 * Don't delete timeValues !!
	 */
	bool PanelPlotOutput::getComputedValuesFromSerieAndInterval(double startDate, double stopDate, SeriesProperties &rSeriesProperties,
																AMDA::Common::ParameterIndexComponent index, double **computedValues, double **timeValues, int &nbValues)
	{
		LOG4CXX_DEBUG(gLogger, "PanelPlotOutput::getComputedValuesFromSerieAndInterval");
		// get parameter data for this serie
		ParameterData &data = (*_pParameterValues)[rSeriesProperties.getParamId()];
8c71f50a   Benjamin Renard   Improve execution...
3743

ba6124b0   Menouard AZIB   Add parameter id ...
3744
3745
3746
		// get original data for interval [startDate, stopDate]
		int startIndex;
		data.getIntervalBounds(startDate, stopDate, startIndex, nbValues);
fbe3c2bb   Benjamin Renard   First commit
3747

ba6124b0   Menouard AZIB   Add parameter id ...
3748
3749
3750
3751
3752
		if (nbValues == 0)
		{
			LOG4CXX_DEBUG(gLogger, "PanelPlotOutput::getComputedValuesFromSerieAndInterval - Cannot find data for serie with id " << rSeriesProperties.getId());
			return false;
		}
fbe3c2bb   Benjamin Renard   First commit
3753

ba6124b0   Menouard AZIB   Add parameter id ...
3754
		double *valuesInterval = data.getValues(index, startIndex);
fbe3c2bb   Benjamin Renard   First commit
3755

ba6124b0   Menouard AZIB   Add parameter id ...
3756
3757
		// get computed data for interval [startDate, stopDate] in relation with the serie y axis
		(*computedValues) = _panel->getAxis(rSeriesProperties.getYAxisId())->getComputedValues(valuesInterval, nbValues, rSeriesProperties.getMin(), rSeriesProperties.getMax());
fbe3c2bb   Benjamin Renard   First commit
3758

ba6124b0   Menouard AZIB   Add parameter id ...
3759
3760
		// get time values
		(*timeValues) = &data.getTimes()[startIndex];
fbe3c2bb   Benjamin Renard   First commit
3761

ba6124b0   Menouard AZIB   Add parameter id ...
3762
		return true;
fbe3c2bb   Benjamin Renard   First commit
3763
3764
	}

ba6124b0   Menouard AZIB   Add parameter id ...
3765
3766
3767
3768
3769
3770
3771
	/*
	 * @brief Get computed values (in relation with the color axis definition) for a color serie and a time interval
	 * Do not forget to delete computedValues !!
	 * Don't delete timeValues !!
	 */
	bool PanelPlotOutput::getColoredComputedValuesFromSerieAndInterval(double startDate, double stopDate, SeriesProperties &rSeriesProperties,
																	   double **computedValues, double **timeValues, int &nbValues)
fbe3c2bb   Benjamin Renard   First commit
3772
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3773
3774
3775
		LOG4CXX_DEBUG(gLogger, "PanelPlotOutput::getColoredComputedValuesFromSerieAndInterval");
		// get parameter data for this color serie
		ParameterData &data = (*_pParameterValues)[rSeriesProperties.getColorParamId()];
fbe3c2bb   Benjamin Renard   First commit
3776

ba6124b0   Menouard AZIB   Add parameter id ...
3777
		ParameterAxes *colorSerieParameterAxes = getParameterAxesByColorSerieId(rSeriesProperties.getColorSerieId());
8c71f50a   Benjamin Renard   Improve execution...
3778

ba6124b0   Menouard AZIB   Add parameter id ...
3779
3780
3781
3782
3783
		if (colorSerieParameterAxes == NULL)
		{
			LOG4CXX_DEBUG(gLogger, "PanelPlotOutput::getColoredComputedValuesFromSerieAndInterval - Cannot retrieve parameter axe");
			return false;
		}
fbe3c2bb   Benjamin Renard   First commit
3784

ba6124b0   Menouard AZIB   Add parameter id ...
3785
		ColorSeriesProperties &colorSerieProp = colorSerieParameterAxes->getColorSeriePropertiesById(rSeriesProperties.getColorSerieId());
fbe3c2bb   Benjamin Renard   First commit
3786

ba6124b0   Menouard AZIB   Add parameter id ...
3787
3788
3789
		// get original data for interval [startDate, stopDate]
		int startIndex;
		data.getIntervalBounds(startDate, stopDate, startIndex, nbValues);
fbe3c2bb   Benjamin Renard   First commit
3790

ba6124b0   Menouard AZIB   Add parameter id ...
3791
3792
3793
3794
3795
		if (nbValues == 0)
		{
			LOG4CXX_DEBUG(gLogger, "PanelPlotOutput::getColoredComputedValuesFromSerieAndInterval - Cannot find data for color serie with id " << colorSerieProp.getId());
			return false;
		}
fbe3c2bb   Benjamin Renard   First commit
3796

ba6124b0   Menouard AZIB   Add parameter id ...
3797
		double *valuesInterval = data.getValues(colorSerieProp.getIndex(), startIndex);
fbe3c2bb   Benjamin Renard   First commit
3798

ba6124b0   Menouard AZIB   Add parameter id ...
3799
3800
3801
3802
3803
3804
		// get computed data for interval [startDate, stopDate] in relation with the color axis
		(*computedValues) = _panel->getColorAxis()->getComputedValues(
			valuesInterval,
			nbValues,
			colorSerieProp.getMin(),
			colorSerieProp.getMax());
fbe3c2bb   Benjamin Renard   First commit
3805

ba6124b0   Menouard AZIB   Add parameter id ...
3806
3807
		// get time values
		(*timeValues) = &data.getTimes()[startIndex];
fbe3c2bb   Benjamin Renard   First commit
3808

ba6124b0   Menouard AZIB   Add parameter id ...
3809
		return true;
fbe3c2bb   Benjamin Renard   First commit
3810
3811
	}

ba6124b0   Menouard AZIB   Add parameter id ...
3812
3813
3814
3815
3816
3817
	/*
	 * @brief Get computed values (in relation with the y axis definition) for a y serie and a time interval
	 * Do not forget to delete computedValues !!
	 * Don't delete timeValues !!
	 */
	bool PanelPlotOutput::getErrorComputedValuesFromSerieAndInterval(double startDate, double stopDate, SeriesProperties &rSeriesProperties,
ab9fea4a   Erdogan Furkan   #7268 - Done
3818
																	 AMDA::Common::ParameterIndexComponent &pParamIndex,
ba6124b0   Menouard AZIB   Add parameter id ...
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
																	 double **minComputedValues, double **minTimeValues, int &nbMinValues,
																	 double **maxComputedValues, double **maxTimeValues, int &nbMaxValues)
	{
		LOG4CXX_DEBUG(gLogger, "PanelPlotOutput::getErrorComputedValuesFromSrieAndInterval");

		ErrorBarProperties &errorBarProp = rSeriesProperties.getErrorBarProperties();
		if (errorBarProp.getErrorMinMax() == nullptr)
			return false;

		// get parameter dataMin for this color bar
		ParameterData &dataMin = (*_pParameterValues)[errorBarProp.getErrorMinMax()->getUsedParamMin()];
8c71f50a   Benjamin Renard   Improve execution...
3830

ab9fea4a   Erdogan Furkan   #7268 - Done
3831
3832
3833
3834
		if(((pParamIndex.getDim1Index() != -1) && (pParamIndex.getDim1Index() >= dataMin.getDim1Size())) || ((pParamIndex.getDim2Index() != -1) && (pParamIndex.getDim2Index() >= dataMin.getDim2Size()))){
			LOG4CXX_ERROR(gLogger, "PanelPlotOutput::getErrorComputedValuesFromSerieAndInterval - Errorbar index outside of parameter index");
			return false;
		}
ba6124b0   Menouard AZIB   Add parameter id ...
3835
3836
3837
		// get original min data for interval [startDate, stopDate]
		int minStartIndex;
		dataMin.getIntervalBounds(startDate, stopDate, minStartIndex, nbMinValues);
fbe3c2bb   Benjamin Renard   First commit
3838

ba6124b0   Menouard AZIB   Add parameter id ...
3839
3840
		if (nbMinValues == 0)
		{
ab9fea4a   Erdogan Furkan   #7268 - Done
3841
			LOG4CXX_ERROR(gLogger, "PanelPlotOutput::getErrorComputedValuesFromSerieAndInterval - Cannot get min data for error bar");
ba6124b0   Menouard AZIB   Add parameter id ...
3842
3843
			return false;
		}
fbe3c2bb   Benjamin Renard   First commit
3844

ab9fea4a   Erdogan Furkan   #7268 - Done
3845
		double *minValuesInterval = dataMin.getValues(pParamIndex, minStartIndex);
ba6124b0   Menouard AZIB   Add parameter id ...
3846
3847
		// get computed min data for interval [startDate, stopDate] in relation with the serie y axis
		(*minComputedValues) = _panel->getAxis(rSeriesProperties.getYAxisId())->getComputedValues(minValuesInterval, nbMinValues, rSeriesProperties.getMin(), rSeriesProperties.getMax());
fbe3c2bb   Benjamin Renard   First commit
3848

ba6124b0   Menouard AZIB   Add parameter id ...
3849
3850
3851
3852
3853
		// get time values
		(*minTimeValues) = &dataMin.getTimes()[minStartIndex];

		// get parameter dataMax for this color bar
		ParameterData &dataMax = (*_pParameterValues)[errorBarProp.getErrorMinMax()->getUsedParamMax()];
fbe3c2bb   Benjamin Renard   First commit
3854

ba6124b0   Menouard AZIB   Add parameter id ...
3855
3856
3857
3858
3859
3860
		// get original max data for interval [startDate, stopDate]
		int maxStartIndex;
		dataMax.getIntervalBounds(startDate, stopDate, maxStartIndex, nbMaxValues);

		if (nbMaxValues == 0)
		{
ab9fea4a   Erdogan Furkan   #7268 - Done
3861
			LOG4CXX_ERROR(gLogger, "PanelPlotOutput::getErrorComputedValuesFromSerieAndInterval - Cannot get max data for error bar");
ba6124b0   Menouard AZIB   Add parameter id ...
3862
3863
3864
			delete[](*minComputedValues);
			return false;
		}
8c71f50a   Benjamin Renard   Improve execution...
3865

ab9fea4a   Erdogan Furkan   #7268 - Done
3866
		double *maxValuesInterval = dataMax.getValues(pParamIndex, maxStartIndex);
fbe3c2bb   Benjamin Renard   First commit
3867

ba6124b0   Menouard AZIB   Add parameter id ...
3868
3869
		// get computed max data for interval [startDate, stopDate] in relation with the serie y axis
		(*maxComputedValues) = _panel->getAxis(rSeriesProperties.getYAxisId())->getComputedValues(maxValuesInterval, nbMaxValues, rSeriesProperties.getMin(), rSeriesProperties.getMax());
fbe3c2bb   Benjamin Renard   First commit
3870

ba6124b0   Menouard AZIB   Add parameter id ...
3871
3872
		// get time values
		(*maxTimeValues) = &dataMax.getTimes()[maxStartIndex];
fbe3c2bb   Benjamin Renard   First commit
3873

ba6124b0   Menouard AZIB   Add parameter id ...
3874
3875
		return true;
	}
fbe3c2bb   Benjamin Renard   First commit
3876

ba6124b0   Menouard AZIB   Add parameter id ...
3877
3878
3879
3880
	/*
	 * @brief Return the color to draw the line of a serie
	 */
	Color PanelPlotOutput::getSerieLineColor(SeriesProperties &rSeriesProperties, bool moreThanOneSerieForAxis)
fbe3c2bb   Benjamin Renard   First commit
3881
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3882
		Color lLineColor = rSeriesProperties.getLineProperties().getColor();
fbe3c2bb   Benjamin Renard   First commit
3883

ba6124b0   Menouard AZIB   Add parameter id ...
3884
		if ((lLineColor._colorIndex == -1) &&
fbe3c2bb   Benjamin Renard   First commit
3885
3886
3887
3888
			(lLineColor._red == -1) &&
			(lLineColor._green == -1) &&
			(lLineColor._blue == -1))
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3889
3890
3891
3892
3893
3894
3895
			// if line color not defined, try to use the serie color
			lLineColor = rSeriesProperties.getColor();

			if ((lLineColor._colorIndex == -1) &&
				(lLineColor._red == -1) &&
				(lLineColor._green == -1) &&
				(lLineColor._blue == -1))
fbe3c2bb   Benjamin Renard   First commit
3896
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
				// if color not defined
				if (!_panel->_page->_superposeMode && !moreThanOneSerieForAxis)
				{
					lLineColor = _panel->getAxis(rSeriesProperties.getYAxisId())->_color;
				}
				else
				{
					// get a default color
					getDefaultColor(_panel->_page->_mode, _automaticSerieColorCursor, lLineColor);
				}
fbe3c2bb   Benjamin Renard   First commit
3907
3908
			}
		}
fbe3c2bb   Benjamin Renard   First commit
3909

ba6124b0   Menouard AZIB   Add parameter id ...
3910
3911
		return lLineColor;
	}
fbe3c2bb   Benjamin Renard   First commit
3912

ba6124b0   Menouard AZIB   Add parameter id ...
3913
3914
3915
3916
	/*
	 * @brief Return the color to draw the symbols of a serie
	 */
	Color PanelPlotOutput::getSerieSymbolColor(SeriesProperties &rSeriesProperties, Color &pLineColor)
fbe3c2bb   Benjamin Renard   First commit
3917
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3918
		Color lSymbolColor = rSeriesProperties.getSymbolProperties().getColor();
fbe3c2bb   Benjamin Renard   First commit
3919

ba6124b0   Menouard AZIB   Add parameter id ...
3920
3921
3922
3923
3924
3925
3926
3927
		if ((lSymbolColor._colorIndex == -1) &&
			(lSymbolColor._red == -1) &&
			(lSymbolColor._green == -1) &&
			(lSymbolColor._blue == -1))
		{
			// if not defined, use the line color
			lSymbolColor = pLineColor;
		}
fbe3c2bb   Benjamin Renard   First commit
3928

ba6124b0   Menouard AZIB   Add parameter id ...
3929
3930
		return lSymbolColor;
	}
fbe3c2bb   Benjamin Renard   First commit
3931

ba6124b0   Menouard AZIB   Add parameter id ...
3932
3933
3934
3935
	/**
	 * @brief Configure params legend.
	 */
	void PanelPlotOutput::configureParamsLegend(double startTime, double stopTime, int intervalIndex)
fbe3c2bb   Benjamin Renard   First commit
3936
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
		_panel->_paramsLegendProperties.resetPlot();

		for (auto parameter : _parameterAxesList)
		{
			for (auto lSeries : parameter.getYSeriePropertiesList())
			{
				for (auto lIndex : lSeries.getIndexList(_pParameterValues))
				{
					// for the legend configuration, we don't need to know the line and symbol colors
					Color fakeColor(0, 0, 0);
fbe3c2bb   Benjamin Renard   First commit
3947

ba6124b0   Menouard AZIB   Add parameter id ...
3948
3949
3950
					addSerieToParamsLegend(lSeries, lIndex, parameter._originalParamId,
										   fakeColor, fakeColor, startTime, stopTime, intervalIndex);
				}
2fc1f2f8   Benjamin Renard   Full rework for s...
3951
			}
fbe3c2bb   Benjamin Renard   First commit
3952
3953
		}
	}
fbe3c2bb   Benjamin Renard   First commit
3954

ba6124b0   Menouard AZIB   Add parameter id ...
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
	/**
	 * @brief Add a serie to the param legend
	 */
	void PanelPlotOutput::addSerieToParamsLegend(SeriesProperties &lSeriesProperties,
												 AMDA::Common::ParameterIndexComponent &index, std::string originalParamId,
												 Color &lineColor, Color &symbolColor,
												 double startTime, double stopTime, int intervalIndex)
	{
		if (!_panel->_paramsLegendProperties.isVisible())
			return;
fbe3c2bb   Benjamin Renard   First commit
3965

ba6124b0   Menouard AZIB   Add parameter id ...
3966
		LOG4CXX_DEBUG(gLogger, "PanelPlotOutput::addSerieToParamsLegend");
fbe3c2bb   Benjamin Renard   First commit
3967

ba6124b0   Menouard AZIB   Add parameter id ...
3968
3969
3970
3971
3972
3973
		std::stringstream fullLegendText;
		if (_panel->_paramsLegendProperties.isParamInfoVisible())
		{
			// add params info
			fullLegendText << getSerieParamsLegendString(lSeriesProperties, index, originalParamId);
		}
fbe3c2bb   Benjamin Renard   First commit
3974

ba6124b0   Menouard AZIB   Add parameter id ...
3975
		if (_panel->_paramsLegendProperties.isIntervalInfoVisible())
fbe3c2bb   Benjamin Renard   First commit
3976
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
			// add interval info
			if (!fullLegendText.str().empty())
				fullLegendText << "; ";
			switch (_panel->_paramsLegendProperties.getIntervalInfoType())
			{
			case ParamsLegendProperties::IntervalInfoType::INDEX:
				fullLegendText << "I";
				fullLegendText << intervalIndex;
				break;
			case ParamsLegendProperties::IntervalInfoType::STARTSTOP:
				fullLegendText << "[";
				fullLegendText << AMDA::TimeUtil::formatTimeDateInIso(startTime);
				fullLegendText << ", ";
				fullLegendText << AMDA::TimeUtil::formatTimeDateInIso(stopTime);
				fullLegendText << "]";
			}
fbe3c2bb   Benjamin Renard   First commit
3993
		}
fbe3c2bb   Benjamin Renard   First commit
3994

ba6124b0   Menouard AZIB   Add parameter id ...
3995
3996
3997
3998
		// push this legend to the params legend properties
		_panel->_paramsLegendProperties.addSerie(lSeriesProperties,
												 fullLegendText.str().c_str(), lineColor, symbolColor);
	}
fbe3c2bb   Benjamin Renard   First commit
3999

ba6124b0   Menouard AZIB   Add parameter id ...
4000
4001
4002
4003
4004
4005
4006
4007
	/*
	 * @brief Return the associated params legend to a serie
	 */
	std::string PanelPlotOutput::getSerieParamsLegendString(SeriesProperties &rSeriesProperties,
															AMDA::Common::ParameterIndexComponent &index, std::string originalParamId)
	{
		// Retrieve ParamInfo Manager
		ParamMgr *piMgr = ParamMgr::getInstance();
fbe3c2bb   Benjamin Renard   First commit
4008

ba6124b0   Menouard AZIB   Add parameter id ...
4009
4010
4011
		// Try to retrieve informations from paramInfo
		ParameterSPtr p = _parameterManager.getParameter(rSeriesProperties.getParamId());
		ParamInfoSPtr paramInfo = piMgr->getParamInfoFromId(p->getInfoId());
fbe3c2bb   Benjamin Renard   First commit
4012

ba6124b0   Menouard AZIB   Add parameter id ...
4013
4014
		// Build parameter text legend depending on the availability of paramInfo
		std::stringstream paramLegendText;
fbe3c2bb   Benjamin Renard   First commit
4015

ba6124b0   Menouard AZIB   Add parameter id ...
4016
		if (paramInfo)
fbe3c2bb   Benjamin Renard   First commit
4017
		{
ba6124b0   Menouard AZIB   Add parameter id ...
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
			if ((index.getDim1Index() == -1) && (index.getDim2Index() == -1))
			{
				// parameter legend text = short_name
				paramLegendText << paramInfo->getShortName();
			}
			else
			{
				if (paramInfo->getComponents(index).empty() == false)
					// parameter legend text = components at index lIndex]
					paramLegendText << paramInfo->getComponents(index);
				else
				{
					// parameter legend text = short_name [lIndex]
					paramLegendText << paramInfo->getShortName() << "[" << index.getDim1Index();
					if (index.getDim2Index() != -1)
						paramLegendText << "," << index.getDim2Index();
					paramLegendText << "]";
				}
			}
fbe3c2bb   Benjamin Renard   First commit
4037
4038
4039
		}
		else
		{
ba6124b0   Menouard AZIB   Add parameter id ...
4040
4041
4042
			if ((index.getDim1Index() == -1) && (index.getDim2Index() == -1))
				// parameter legend text = _originalParamId
				paramLegendText << originalParamId;
fbe3c2bb   Benjamin Renard   First commit
4043
4044
			else
			{
ba6124b0   Menouard AZIB   Add parameter id ...
4045
4046
				// parameter legend text = _originalParamId [lIndex]
				paramLegendText << originalParamId << "[" << index.getDim1Index();
fbe3c2bb   Benjamin Renard   First commit
4047
4048
4049
4050
4051
				if (index.getDim2Index() != -1)
					paramLegendText << "," << index.getDim2Index();
				paramLegendText << "]";
			}
		}
ba6124b0   Menouard AZIB   Add parameter id ...
4052
4053

		return paramLegendText.str();
fbe3c2bb   Benjamin Renard   First commit
4054
	}
ba6124b0   Menouard AZIB   Add parameter id ...
4055
4056
4057
4058
4059

	/*
	 * Dumps properties for test.
	 */
	void PanelPlotOutput::dump(std::ostream &out)
fbe3c2bb   Benjamin Renard   First commit
4060
	{
ba6124b0   Menouard AZIB   Add parameter id ...
4061
4062
4063
4064
		out << *(_panel->_page) << std::endl;
		out << *_panel << std::endl;
		std::string prefix = "parameter.";
		for (auto parameter : _parameterAxesList)
fbe3c2bb   Benjamin Renard   First commit
4065
		{
ba6124b0   Menouard AZIB   Add parameter id ...
4066
			parameter.dump(out, prefix);
fbe3c2bb   Benjamin Renard   First commit
4067
4068
4069
		}
	}

ba6124b0   Menouard AZIB   Add parameter id ...
4070
} /* namespace plot */