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
45
46
47
48
49
50
51
52

	/**
	 * 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;

	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)
fbe3c2bb   Benjamin Renard   First commit
53
	{
ba6124b0   Menouard AZIB   Add parameter id ...
54
55
56
57
58
	}

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

ba6124b0   Menouard AZIB   Add parameter id ...
60
61
62
63
64
	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
65

ba6124b0   Menouard AZIB   Add parameter id ...
66
67
68
69
70
71
72
73
74
75
76
77
78
79
		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
80
81
	}

ba6124b0   Menouard AZIB   Add parameter id ...
82
83
84
85
86
	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
87

ba6124b0   Menouard AZIB   Add parameter id ...
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
		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
103

ba6124b0   Menouard AZIB   Add parameter id ...
104
105
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
	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
137

ba6124b0   Menouard AZIB   Add parameter id ...
138
139
140
141
142
143
144
145
146
		// 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...
147

ba6124b0   Menouard AZIB   Add parameter id ...
148
149
150
151
152
153
154
155
		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
156

ba6124b0   Menouard AZIB   Add parameter id ...
157
158
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
		// 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
243

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

ba6124b0   Menouard AZIB   Add parameter id ...
251
252
253
254
255
	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...
256

ba6124b0   Menouard AZIB   Add parameter id ...
257
258
259
260
		// 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...
261

ba6124b0   Menouard AZIB   Add parameter id ...
262
263
264
265
		// 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...
266

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

ba6124b0   Menouard AZIB   Add parameter id ...
269
270
271
		// Reserve place in relation with the axis position
		switch (pAxis->_position)
		{
f6eaec4e   Benjamin Renard   Optimize plot ele...
272
273
274
275
276
277
278
279
280
		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 ...
281
282
			if (pAxis->_tick._position == Tick::TickPosition::OUTWARDS)
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
283
284
				double tickSize = getVerticalTickLength(pAxis.get(), legendCharSizePanel.second);
				bottomSpace += tickSize;
bdc50075   Benjamin Renard   Fix bug for posit...
285
				if (nbAxesBySide[PlotCommon::Position::POS_TOP] == 0)
ba6124b0   Menouard AZIB   Add parameter id ...
286
					// add space for oposite axis
bdc50075   Benjamin Renard   Fix bug for posit...
287
					topSpace += tickSize;
f6eaec4e   Benjamin Renard   Optimize plot ele...
288
289
			}

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

			// Reserve space for legend
ba6124b0   Menouard AZIB   Add parameter id ...
295
296
			if ((pAxis->_showLegend == true) && (nbLegendRows != 0))
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
297
				bottomSpace += PlPlotUtil::LINE_SPACE_TITLE * legendCharSizePanel.second;
58b353d5   Benjamin Renard   Set to version 3.4.0
298
299
300
301
				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...
302
				bottomSpace += (nbLegendRows + PlPlotUtil::LINE_SPACE_TITLE * (nbLegendRows + 1)) * legendCharSizePanel.second;
f6eaec4e   Benjamin Renard   Optimize plot ele...
303
304
305
306
307
308
309
310
311
312
313
314
			}

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

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

			// Reserve space for legend
ba6124b0   Menouard AZIB   Add parameter id ...
329
330
			if ((pAxis->_showLegend == true) && (nbLegendRows != 0))
			{
f6eaec4e   Benjamin Renard   Optimize plot ele...
331
				topSpace += PlPlotUtil::LINE_SPACE_TITLE * legendCharSizePanel.second;
58b353d5   Benjamin Renard   Set to version 3.4.0
332
333
334
335
				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...
336
337
338
339
340
341
				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 ...
342
			pAxis->setAxisOffset(leftSpace);
f6eaec4e   Benjamin Renard   Optimize plot ele...
343

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

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

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

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

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

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

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

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
418
419
420
	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...
421

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

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
457
458
459
460
461
462
463
464
	/**
	 * @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
465

ba6124b0   Menouard AZIB   Add parameter id ...
466
467
468
469
470
471
	/**
	 * @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
472

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
			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
503

ba6124b0   Menouard AZIB   Add parameter id ...
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
			// 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
519
				{
ba6124b0   Menouard AZIB   Add parameter id ...
520
521
					std::string lineToDraw = line.first;
					if (lineIndex == lines.size() - 1)
fbe3c2bb   Benjamin Renard   First commit
522
					{
ba6124b0   Menouard AZIB   Add parameter id ...
523
524
525
526
527
528
529
						// add unit if defined
						if (!pAxis->getAxisUnits().empty())
						{
							lineToDraw += " (";
							lineToDraw += pAxis->getAxisUnits();
							lineToDraw += ")";
						}
fbe3c2bb   Benjamin Renard   First commit
530
					}
ba6124b0   Menouard AZIB   Add parameter id ...
531
532
533
534
535
536
537
538
539
540
541
542
					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());
					lPosition += (1 + PlPlotUtil::LINE_SPACE_TITLE);
					if (line.second.isSet())
					{
						restoreColor(_pls, lSavedColor, _panel->_page->_mode);
					}
					++lineIndex;
fbe3c2bb   Benjamin Renard   First commit
543
				}
ba6124b0   Menouard AZIB   Add parameter id ...
544
				break;
fbe3c2bb   Benjamin Renard   First commit
545

ba6124b0   Menouard AZIB   Add parameter id ...
546
547
548
549
550
			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
551

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

ba6124b0   Menouard AZIB   Add parameter id ...
555
556
				// Draw lines, beginning by the last one
				for (auto line : boost::adaptors::reverse(lines))
fbe3c2bb   Benjamin Renard   First commit
557
				{
ba6124b0   Menouard AZIB   Add parameter id ...
558
559
					std::string lineToDraw = line.first;
					if (lineIndex == lines.size() - 1)
fbe3c2bb   Benjamin Renard   First commit
560
					{
ba6124b0   Menouard AZIB   Add parameter id ...
561
562
563
564
565
566
567
						// add unit if defined
						if (!pAxis->getAxisUnits().empty())
						{
							lineToDraw += " (";
							lineToDraw += pAxis->getAxisUnits();
							lineToDraw += ")";
						}
fbe3c2bb   Benjamin Renard   First commit
568
					}
ba6124b0   Menouard AZIB   Add parameter id ...
569
570
571
572
573
574
575
576
577
578
579
580
					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());
					lPosition += (1 + PlPlotUtil::LINE_SPACE_TITLE);
					if (line.second.isSet())
					{
						restoreColor(_pls, lSavedColor, _panel->_page->_mode);
					}
					++lineIndex;
fbe3c2bb   Benjamin Renard   First commit
581
				}
ba6124b0   Menouard AZIB   Add parameter id ...
582
				break;
fbe3c2bb   Benjamin Renard   First commit
583

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

ba6124b0   Menouard AZIB   Add parameter id ...
586
587
588
589
				_pls->vpor(pPlotAreaSize._x,
						   pPlotAreaSize._x + pAxis->getLegendOffset() + pPlotAreaSize._width,
						   pPlotAreaSize._y,
						   pPlotAreaSize._y + pPlotAreaSize._height);
fbe3c2bb   Benjamin Renard   First commit
590

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

ba6124b0   Menouard AZIB   Add parameter id ...
594
595
				// Draw lines, beginning by the first one
				for (auto line : lines)
fbe3c2bb   Benjamin Renard   First commit
596
				{
ba6124b0   Menouard AZIB   Add parameter id ...
597
598
					std::string lineToDraw = line.first;
					if (lineIndex == lines.size() - 1)
fbe3c2bb   Benjamin Renard   First commit
599
					{
ba6124b0   Menouard AZIB   Add parameter id ...
600
601
602
603
604
605
606
						// add unit if defined
						if (!pAxis->getAxisUnits().empty())
						{
							lineToDraw += " (";
							lineToDraw += pAxis->getAxisUnits();
							lineToDraw += ")";
						}
fbe3c2bb   Benjamin Renard   First commit
607
					}
ba6124b0   Menouard AZIB   Add parameter id ...
608
609
610
611
612
613
614
615
616
617
618
619
					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());
					lPosition += (1 + PlPlotUtil::LINE_SPACE_TITLE);
					if (line.second.isSet())
					{
						restoreColor(_pls, lSavedColor, _panel->_page->_mode);
					}
					++lineIndex;
fbe3c2bb   Benjamin Renard   First commit
620
				}
fbe3c2bb   Benjamin Renard   First commit
621

ba6124b0   Menouard AZIB   Add parameter id ...
622
				break;
fbe3c2bb   Benjamin Renard   First commit
623

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

ba6124b0   Menouard AZIB   Add parameter id ...
626
627
628
629
				_pls->vpor(pPlotAreaSize._x - pAxis->getLegendOffset(),
						   pPlotAreaSize._x + pPlotAreaSize._width,
						   pPlotAreaSize._y,
						   pPlotAreaSize._y + pPlotAreaSize._height);
fbe3c2bb   Benjamin Renard   First commit
630

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

ba6124b0   Menouard AZIB   Add parameter id ...
634
635
				// Draw lines, beginning by the last one
				for (auto line : boost::adaptors::reverse(lines))
fbe3c2bb   Benjamin Renard   First commit
636
				{
ba6124b0   Menouard AZIB   Add parameter id ...
637
638
					std::string lineToDraw = line.first;
					if (lineIndex == lines.size() - 1)
fbe3c2bb   Benjamin Renard   First commit
639
					{
ba6124b0   Menouard AZIB   Add parameter id ...
640
641
642
643
644
645
646
						// add unit if defined
						if (!pAxis->getAxisUnits().empty())
						{
							lineToDraw += " (";
							lineToDraw += pAxis->getAxisUnits();
							lineToDraw += ")";
						}
fbe3c2bb   Benjamin Renard   First commit
647
					}
ba6124b0   Menouard AZIB   Add parameter id ...
648
649
650
651
652
653
654
655
656
657
658
659
					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());
					lPosition += (1 + PlPlotUtil::LINE_SPACE_TITLE);
					if (line.second.isSet())
					{
						restoreColor(_pls, lSavedColor, _panel->_page->_mode);
					}
					++lineIndex;
fbe3c2bb   Benjamin Renard   First commit
660
				}
fbe3c2bb   Benjamin Renard   First commit
661

ba6124b0   Menouard AZIB   Add parameter id ...
662
				break;
fbe3c2bb   Benjamin Renard   First commit
663

ba6124b0   Menouard AZIB   Add parameter id ...
664
665
666
667
			case PlotCommon::Position::POS_CENTER:
			default:
				LOG4CXX_WARN(gLogger, "PanelPlotOutput::drawPlotArea: Unrecognized position for axis '" << pAxis->_position << "'");
			}
fbe3c2bb   Benjamin Renard   First commit
668

ba6124b0   Menouard AZIB   Add parameter id ...
669
670
671
672
			_pls->vpor(pPlotAreaSize._x,
					   pPlotAreaSize._x + pPlotAreaSize._width,
					   pPlotAreaSize._y,
					   pPlotAreaSize._y + pPlotAreaSize._height);
f6eaec4e   Benjamin Renard   Optimize plot ele...
673

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

ba6124b0   Menouard AZIB   Add parameter id ...
677
678
679
			// Restore initial color.
			restoreColor(_pls, lInitialColor, _panel->_page->_mode);
		}
fbe3c2bb   Benjamin Renard   First commit
680
	}
fbe3c2bb   Benjamin Renard   First commit
681

ba6124b0   Menouard AZIB   Add parameter id ...
682
683
684
685
	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
686

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

ba6124b0   Menouard AZIB   Add parameter id ...
690
691
692
693
694
695
696
697
698
699
700
701
702
		// 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
703

ba6124b0   Menouard AZIB   Add parameter id ...
704
705
706
707
708
		// 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
709

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

ba6124b0   Menouard AZIB   Add parameter id ...
713
714
715
716
717
		// 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
718

ba6124b0   Menouard AZIB   Add parameter id ...
719
		size_t lPos;
fbe3c2bb   Benjamin Renard   First commit
720

ba6124b0   Menouard AZIB   Add parameter id ...
721
722
723
724
		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
725

ba6124b0   Menouard AZIB   Add parameter id ...
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
		// 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
741

ba6124b0   Menouard AZIB   Add parameter id ...
742
743
744
		// Draw axis.
		_pls->box(pXAxisOptions.c_str(), xMajorTickSpace, xMinorTickNumber,
				  pYAxisOptions.c_str(), yMajorTickSpace, yMinorTickNumber);
fbe3c2bb   Benjamin Renard   First commit
745

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

ba6124b0   Menouard AZIB   Add parameter id ...
749
750
751
		// Set axis as drawn.
		pAxis->_drawn = true;
	}
fbe3c2bb   Benjamin Renard   First commit
752

ba6124b0   Menouard AZIB   Add parameter id ...
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
	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
777

ba6124b0   Menouard AZIB   Add parameter id ...
778
779
780
781
782
			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
783

ba6124b0   Menouard AZIB   Add parameter id ...
784
				size_t lPos;
fbe3c2bb   Benjamin Renard   First commit
785

ba6124b0   Menouard AZIB   Add parameter id ...
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
				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
826

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

ba6124b0   Menouard AZIB   Add parameter id ...
830
831
				// Draw tick mark.
				drawAxis(pXAxis, pTickConf, lTmpAxisOption, "");
fbe3c2bb   Benjamin Renard   First commit
832
			}
ba6124b0   Menouard AZIB   Add parameter id ...
833
834
835
836
837
838
839
840
841
		}
		// 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
842

ba6124b0   Menouard AZIB   Add parameter id ...
843
844
845
846
		// 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
847
		}
fbe3c2bb   Benjamin Renard   First commit
848

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

ba6124b0   Menouard AZIB   Add parameter id ...
852
853
		// Draw rest of axis.
		drawAxis(pXAxis, pTickConf, lAxisOption, "");
fbe3c2bb   Benjamin Renard   First commit
854
855
	}

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
862
863
864
		// 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
865

ba6124b0   Menouard AZIB   Add parameter id ...
866
867
868
869
870
871
872
		// 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
873

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

ba6124b0   Menouard AZIB   Add parameter id ...
876
877
878
879
880
881
882
883
884
885
886
		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
887

ba6124b0   Menouard AZIB   Add parameter id ...
888
889
890
891
892
			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
893

ba6124b0   Menouard AZIB   Add parameter id ...
894
				size_t lPos;
fbe3c2bb   Benjamin Renard   First commit
895

ba6124b0   Menouard AZIB   Add parameter id ...
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
				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
922

ba6124b0   Menouard AZIB   Add parameter id ...
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
				// 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
938

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

ba6124b0   Menouard AZIB   Add parameter id ...
942
943
				// Draw tick mark.
				drawAxis(pYAxis, pTickConf, "", lTmpAxisOption);
fbe3c2bb   Benjamin Renard   First commit
944
			}
fbe3c2bb   Benjamin Renard   First commit
945
		}
fbe3c2bb   Benjamin Renard   First commit
946

ba6124b0   Menouard AZIB   Add parameter id ...
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
		// 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
962

ba6124b0   Menouard AZIB   Add parameter id ...
963
964
965
		// 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
966

ba6124b0   Menouard AZIB   Add parameter id ...
967
968
969
970
971
		// 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
972

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
979
980
981
982
983
		// Restore default plot area
		_pls->vpor(pPlotAreaSize._x,
				   pPlotAreaSize._x + pPlotAreaSize._width,
				   pPlotAreaSize._y,
				   pPlotAreaSize._y + pPlotAreaSize._height);
fbe3c2bb   Benjamin Renard   First commit
984

ba6124b0   Menouard AZIB   Add parameter id ...
985
986
987
988
		// 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
989
990
991
992

#define COLORBAR_X_OFFSET 0.01
#define COLORBAR_BODY_WIDTH 0.0375

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1002
1003
1004
1005
1006
1007
1008
		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
1009

ba6124b0   Menouard AZIB   Add parameter id ...
1010
1011
		return axisWidth;
	}
fbe3c2bb   Benjamin Renard   First commit
1012

ba6124b0   Menouard AZIB   Add parameter id ...
1013
1014
1015
1016
	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
1017

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
		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...
1041
		}
fbe3c2bb   Benjamin Renard   First commit
1042

ba6124b0   Menouard AZIB   Add parameter id ...
1043
1044
1045
		PLFLT colorbar_width, colorbar_height;
		const int cont_color = 0;
		const PLFLT cont_width = 0.0;
fbe3c2bb   Benjamin Renard   First commit
1046

ba6124b0   Menouard AZIB   Add parameter id ...
1047
1048
1049
		// set legend
		const PLINT n_labels = (lAxisLegend.empty()) ? 0 : 1;
		std::string label = lAxisLegend;
fbe3c2bb   Benjamin Renard   First commit
1050

ba6124b0   Menouard AZIB   Add parameter id ...
1051
1052
1053
		const char *labels[n_labels];
		if (!lAxisLegend.empty())
			labels[0] = label.c_str();
fbe3c2bb   Benjamin Renard   First commit
1054

ba6124b0   Menouard AZIB   Add parameter id ...
1055
1056
1057
		// set axis options
		const PLINT n_axis_opts = 1;
		const char *axis_opts[n_axis_opts] = {
fbe3c2bb   Benjamin Renard   First commit
1058
			lAxisOption.c_str(),
ba6124b0   Menouard AZIB   Add parameter id ...
1059
		};
fbe3c2bb   Benjamin Renard   First commit
1060

ba6124b0   Menouard AZIB   Add parameter id ...
1061
1062
1063
1064
		PLFLT axis_ticks[n_axis_opts] = {
			0};
		PLINT axis_subticks[n_axis_opts] = {
			0};
fbe3c2bb   Benjamin Renard   First commit
1065

ba6124b0   Menouard AZIB   Add parameter id ...
1066
1067
1068
1069
1070
		// 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
1071

ba6124b0   Menouard AZIB   Add parameter id ...
1072
1073
		// set nb og colors
		const int nbCol = 20;
fbe3c2bb   Benjamin Renard   First commit
1074

ba6124b0   Menouard AZIB   Add parameter id ...
1075
1076
		PLINT num_values[1] = {
			nbCol + 1};
fbe3c2bb   Benjamin Renard   First commit
1077

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1084
1085
		PLFLT *values[1];
		values[0] = shedge;
fbe3c2bb   Benjamin Renard   First commit
1086

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

ba6124b0   Menouard AZIB   Add parameter id ...
1091
1092
1093
		// set color bar and legend position
		PLINT position = PL_POSITION_OUTSIDE | PL_POSITION_VIEWPORT;
		PLINT label_opts[1];
fbe3c2bb   Benjamin Renard   First commit
1094

ba6124b0   Menouard AZIB   Add parameter id ...
1095
1096
1097
		switch (pZAxis->_position)
		{
		case PlotCommon::Position::POS_LEFT:
fbe3c2bb   Benjamin Renard   First commit
1098
1099
			position |= PL_POSITION_LEFT;
			label_opts[0] = PL_COLORBAR_LABEL_LEFT;
b76d3cfc   Benjamin Renard   Fix color axis po...
1100
			_pls->vpor(pPlotAreaSize._x - pZAxis->getAxisOffset(), pPlotAreaSize._x + pPlotAreaSize._width, pPlotAreaSize._y, pPlotAreaSize._y + pPlotAreaSize._height);
fbe3c2bb   Benjamin Renard   First commit
1101
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
1102
		case PlotCommon::Position::POS_RIGHT:
fbe3c2bb   Benjamin Renard   First commit
1103
1104
			position |= PL_POSITION_RIGHT;
			label_opts[0] = PL_COLORBAR_LABEL_RIGHT;
b76d3cfc   Benjamin Renard   Fix color axis po...
1105
			_pls->vpor(pPlotAreaSize._x, pPlotAreaSize._x + pPlotAreaSize._width + pZAxis->getAxisOffset(), pPlotAreaSize._y, pPlotAreaSize._y + pPlotAreaSize._height);
fbe3c2bb   Benjamin Renard   First commit
1106
1107
1108
1109
1110
1111
			break;
		default:
		{
			std::stringstream lError;
			lError << "PanelPlotOutput::drawZAxis : Bad Z axis position";
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
1112
1113
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
		}
fbe3c2bb   Benjamin Renard   First commit
1114
		}
fbe3c2bb   Benjamin Renard   First commit
1115

ba6124b0   Menouard AZIB   Add parameter id ...
1116
		_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...
1117

ba6124b0   Menouard AZIB   Add parameter id ...
1118
		_pls->colorbar(
fbe3c2bb   Benjamin Renard   First commit
1119
1120
			&colorbar_width,
			&colorbar_height,
ba6124b0   Menouard AZIB   Add parameter id ...
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
			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
1168
	}
fbe3c2bb   Benjamin Renard   First commit
1169

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

ba6124b0   Menouard AZIB   Add parameter id ...
1173
1174
1175
1176
1177
1178
1179
		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
1180
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
ba6124b0   Menouard AZIB   Add parameter id ...
1181
1182
1183
1184
1185
1186
1187
		}
		else if (pSeries.hasXAxis())
		{
			// fill X range (plplot window).
			return (pAxis->getRange());
		}
		return Range();
fbe3c2bb   Benjamin Renard   First commit
1188
	}
fbe3c2bb   Benjamin Renard   First commit
1189

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

ba6124b0   Menouard AZIB   Add parameter id ...
1193
1194
1195
1196
1197
1198
1199
		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
1200
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
ba6124b0   Menouard AZIB   Add parameter id ...
1201
1202
1203
1204
1205
1206
1207
		}
		else if (pSeries.hasYAxis())
		{
			// fill Y range (plplot window).
			return (pAxis->getRange());
		}
		return Range();
fbe3c2bb   Benjamin Renard   First commit
1208
	}
fbe3c2bb   Benjamin Renard   First commit
1209

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

ba6124b0   Menouard AZIB   Add parameter id ...
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
		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
1229

ba6124b0   Menouard AZIB   Add parameter id ...
1230
1231
1232
1233
1234
1235
1236
	/**
	 * 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
1237

ba6124b0   Menouard AZIB   Add parameter id ...
1238
1239
1240
1241
1242
1243
1244
	/**
	 * 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
1245

ba6124b0   Menouard AZIB   Add parameter id ...
1246
1247
1248
1249
1250
1251
	/**
	 * 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
1252

ba6124b0   Menouard AZIB   Add parameter id ...
1253
1254
		if (lZAxis == nullptr)
			return false;
fbe3c2bb   Benjamin Renard   First commit
1255

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1260
1261
		if (isnan(value))
			return false;
fbe3c2bb   Benjamin Renard   First commit
1262

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

ba6124b0   Menouard AZIB   Add parameter id ...
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
		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
1278

ba6124b0   Menouard AZIB   Add parameter id ...
1279
1280
			correctedValue = log10(correctedValue);
		}
fbe3c2bb   Benjamin Renard   First commit
1281

ba6124b0   Menouard AZIB   Add parameter id ...
1282
1283
1284
1285
		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
1286

ba6124b0   Menouard AZIB   Add parameter id ...
1287
1288
		return true;
	}
fbe3c2bb   Benjamin Renard   First commit
1289

ba6124b0   Menouard AZIB   Add parameter id ...
1290
1291
1292
1293
1294
1295
1296
1297
	/**
	 * 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
1298

ba6124b0   Menouard AZIB   Add parameter id ...
1299
		Color lInitialColor;
fbe3c2bb   Benjamin Renard   First commit
1300

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

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1312
1313
1314
1315
1316
1317
1318
1319
		// 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
1320

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

ba6124b0   Menouard AZIB   Add parameter id ...
1325
1326
1327
1328
1329
			PLFLT col;
			for (int i = 0; i < pNbData; ++i)
			{
				if (!getColoredValue(pZData[i], filterZMin, filterZMax, false, col))
					continue;
fbe3c2bb   Benjamin Renard   First commit
1330

ba6124b0   Menouard AZIB   Add parameter id ...
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
				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
1362
					_pls->poin(1, &pXData[i], &pYData[i], static_cast<int>(pType));
ba6124b0   Menouard AZIB   Add parameter id ...
1363
1364
1365
				}
			}
		}
fbe3c2bb   Benjamin Renard   First commit
1366

ba6124b0   Menouard AZIB   Add parameter id ...
1367
1368
		// Restore color.
		restoreColor(_pls, lInitialColor, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
1369
1370
	}

ba6124b0   Menouard AZIB   Add parameter id ...
1371
1372
1373
1374
1375
1376
1377
1378
	/**
	 * 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
1379

ba6124b0   Menouard AZIB   Add parameter id ...
1380
1381
1382
1383
		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
1384

ba6124b0   Menouard AZIB   Add parameter id ...
1385
		Color lInitialColor;
fbe3c2bb   Benjamin Renard   First commit
1386

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

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1399
1400
		// draw lines.
		if ((pZData == NULL) || (lZAxis == nullptr))
fbe3c2bb   Benjamin Renard   First commit
1401
		{
ba6124b0   Menouard AZIB   Add parameter id ...
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
			_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
1419

ba6124b0   Menouard AZIB   Add parameter id ...
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
				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
1451
					_pls->line(2, &pXData[i], &pYData[i]);
ba6124b0   Menouard AZIB   Add parameter id ...
1452
1453
1454
				}
			}
		}
e257cfb9   Benjamin Renard   First implementat...
1455

ba6124b0   Menouard AZIB   Add parameter id ...
1456
1457
1458
		// Restore color.
		restoreColor(_pls, lInitialColor, _panel->_page->_mode);
	}
fbe3c2bb   Benjamin Renard   First commit
1459

ba6124b0   Menouard AZIB   Add parameter id ...
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
	/**
	 * 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
1471

ba6124b0   Menouard AZIB   Add parameter id ...
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
		// 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
1500

ba6124b0   Menouard AZIB   Add parameter id ...
1501
1502
1503
1504
1505
	/*
	 * @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
1506
	{
ba6124b0   Menouard AZIB   Add parameter id ...
1507
1508
1509
		// set color map
		_pls->spal1(
			ColormapManager::getInstance().getColorAxis(colorMapIndex).c_str(), true);
fbe3c2bb   Benjamin Renard   First commit
1510

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

ba6124b0   Menouard AZIB   Add parameter id ...
1514
1515
1516
		// plot matrix
		PLFLT x[4], y[4];
		PLFLT col;
f2db3c16   Benjamin Renard   Support variable ...
1517

ba6124b0   Menouard AZIB   Add parameter id ...
1518
		for (auto part : matrixGrid)
fbe3c2bb   Benjamin Renard   First commit
1519
		{
ba6124b0   Menouard AZIB   Add parameter id ...
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
			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
1531
				continue;
fbe3c2bb   Benjamin Renard   First commit
1532

ba6124b0   Menouard AZIB   Add parameter id ...
1533
			if (!part.isColorIndex)
fbe3c2bb   Benjamin Renard   First commit
1534
			{
ba6124b0   Menouard AZIB   Add parameter id ...
1535
1536
				if (!getColoredValue(part.value, minDataVal, maxDataVal, useLog0AsMin, col))
					continue;
fbe3c2bb   Benjamin Renard   First commit
1537
1538
1539
			}
			else
			{
ba6124b0   Menouard AZIB   Add parameter id ...
1540
1541
				Color dataValueColor(colorMapIndex, (int)part.value);
				restoreColor(_pls, dataValueColor, _panel->_page->_mode);
fbe3c2bb   Benjamin Renard   First commit
1542
				_pls->fill(4, x, y);
ba6124b0   Menouard AZIB   Add parameter id ...
1543
1544
				_pls->spal1(ColormapManager::getInstance().getColorAxis(colorMapIndex).c_str(), true);
				continue;
fbe3c2bb   Benjamin Renard   First commit
1545
			}
ba6124b0   Menouard AZIB   Add parameter id ...
1546
1547

			if (col <= 0.)
fbe3c2bb   Benjamin Renard   First commit
1548
			{
ba6124b0   Menouard AZIB   Add parameter id ...
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
				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
1574
1575
1576
			}
			else
			{
ba6124b0   Menouard AZIB   Add parameter id ...
1577
				_pls->col1(col);
fbe3c2bb   Benjamin Renard   First commit
1578
1579
1580
				_pls->fill(4, x, y);
			}
		}
fbe3c2bb   Benjamin Renard   First commit
1581

ba6124b0   Menouard AZIB   Add parameter id ...
1582
1583
		// restore to initial color context
		_pls->spal1(
fbe3c2bb   Benjamin Renard   First commit
1584
			ColormapManager::getInstance().get(_panel->_page->_mode,
ba6124b0   Menouard AZIB   Add parameter id ...
1585
1586
1587
1588
											   ColormapManager::DEFAULT_COLORMAP_1)
				.c_str(),
			true);
		_pls->scol0(0, lInitialColor._red, lInitialColor._green, lInitialColor._blue);
fbe3c2bb   Benjamin Renard   First commit
1589

ba6124b0   Menouard AZIB   Add parameter id ...
1590
1591
1592
		// Restore color.
		restoreColor(_pls, lInitialColor, _panel->_page->_mode);
	}
fbe3c2bb   Benjamin Renard   First commit
1593

ba6124b0   Menouard AZIB   Add parameter id ...
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
	/**
	 * 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
1606
	{
ba6124b0   Menouard AZIB   Add parameter id ...
1607
1608
		if (pType == LineType::EMPTY)
			return;
fbe3c2bb   Benjamin Renard   First commit
1609

ba6124b0   Menouard AZIB   Add parameter id ...
1610
1611
1612
1613
		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
1614

ba6124b0   Menouard AZIB   Add parameter id ...
1615
		Color lInitialColor;
fbe3c2bb   Benjamin Renard   First commit
1616

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

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

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1632
1633
1634
		// Restore color.
		restoreColor(_pls, lInitialColor, _panel->_page->_mode);
	}
fbe3c2bb   Benjamin Renard   First commit
1635

ba6124b0   Menouard AZIB   Add parameter id ...
1636
1637
1638
1639
1640
1641
	/**
	 * 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...
1642

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

ba6124b0   Menouard AZIB   Add parameter id ...
1645
1646
1647
1648
1649
1650
1651
1652
		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
1653

ba6124b0   Menouard AZIB   Add parameter id ...
1654
1655
1656
1657
1658
1659
1660
			if (pAxis->_scale == Axis::Scale::LOGARITHMIC)
			{
				x[0] = log10(x[0]);
				x[1] = log10(x[1]);
			}

			drawLines(
fbe3c2bb   Benjamin Renard   First commit
1661
1662
1663
1664
1665
1666
				LineType::LINE,
				constantLine->getStyle(),
				constantLine->getWidth(),
				constantLine->getColor(),
				2, x, y);

ba6124b0   Menouard AZIB   Add parameter id ...
1667
1668
			constantLine->setDrawn(true);
		}
fbe3c2bb   Benjamin Renard   First commit
1669
	}
fbe3c2bb   Benjamin Renard   First commit
1670

ba6124b0   Menouard AZIB   Add parameter id ...
1671
1672
1673
1674
1675
1676
	/**
	 * 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
1677

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

ba6124b0   Menouard AZIB   Add parameter id ...
1680
1681
1682
1683
		for (auto constantLine : pAxis->_constantLines)
		{
			if (constantLine->isDrawn())
				continue;
fbe3c2bb   Benjamin Renard   First commit
1684

ba6124b0   Menouard AZIB   Add parameter id ...
1685
1686
1687
1688
			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
1689

ba6124b0   Menouard AZIB   Add parameter id ...
1690
1691
1692
1693
1694
			if (pAxis->_scale == Axis::Scale::LOGARITHMIC)
			{
				y[0] = log10(y[0]);
				y[1] = log10(y[1]);
			}
fbe3c2bb   Benjamin Renard   First commit
1695

ba6124b0   Menouard AZIB   Add parameter id ...
1696
			drawLines(
fbe3c2bb   Benjamin Renard   First commit
1697
1698
1699
1700
1701
1702
				LineType::LINE,
				constantLine->getStyle(),
				constantLine->getWidth(),
				constantLine->getColor(),
				2, x, y);

ba6124b0   Menouard AZIB   Add parameter id ...
1703
1704
			constantLine->setDrawn(true);
		}
fbe3c2bb   Benjamin Renard   First commit
1705
	}
fbe3c2bb   Benjamin Renard   First commit
1706

ba6124b0   Menouard AZIB   Add parameter id ...
1707
1708
1709
1710
1711
1712
1713
	/**
	 * 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
1714

ba6124b0   Menouard AZIB   Add parameter id ...
1715
1716
1717
1718
		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
1719

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

ba6124b0   Menouard AZIB   Add parameter id ...
1722
1723
1724
1725
		for (auto textPlot : textPlots)
		{
			if (textPlot->isDrawn())
				continue;
fbe3c2bb   Benjamin Renard   First commit
1726

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
			// 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
1747

ba6124b0   Menouard AZIB   Add parameter id ...
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
			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
1761

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1768
1769
1770
			// 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
1771

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1778
1779
			textPlot->setDrawn(true);
		}
fbe3c2bb   Benjamin Renard   First commit
1780
	}
fbe3c2bb   Benjamin Renard   First commit
1781

ba6124b0   Menouard AZIB   Add parameter id ...
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
	/*
	 * @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
1792

ba6124b0   Menouard AZIB   Add parameter id ...
1793
1794
1795
		// Draw Interval ticks if required !
		if (itProps.getMode() == IntervalTickMode::NONE)
			return;
fbe3c2bb   Benjamin Renard   First commit
1796

ba6124b0   Menouard AZIB   Add parameter id ...
1797
1798
1799
		// 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
1800

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1806
1807
1808
1809
		// prepare data for plot
		double xData[2] = {NAN, NAN};
		double yData[2] = {NAN, NAN};
		double timeData[2] = {NAN, NAN};
fbe3c2bb   Benjamin Renard   First commit
1810

ba6124b0   Menouard AZIB   Add parameter id ...
1811
1812
1813
1814
1815
1816
1817
1818
1819
		// 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
1820

ba6124b0   Menouard AZIB   Add parameter id ...
1821
1822
1823
1824
1825
1826
1827
1828
		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
1829

ba6124b0   Menouard AZIB   Add parameter id ...
1830
1831
1832
1833
1834
1835
		// draw symbols
		drawSymbols(
			itProps.getSymbol().getType(),
			itProps.getSymbol().getSize(), 1.,
			itProps.getSymbol().getColor(),
			2, (double *)&xData, (double *)&yData, NULL);
fbe3c2bb   Benjamin Renard   First commit
1836

ba6124b0   Menouard AZIB   Add parameter id ...
1837
1838
		if (itProps.getMode() == IntervalTickMode::SYMBOL_ONLY)
			return;
fbe3c2bb   Benjamin Renard   First commit
1839

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

ba6124b0   Menouard AZIB   Add parameter id ...
1843
1844
1845
		TextPlot baseTextPlot;
		baseTextPlot._color = itProps.getColor();
		baseTextPlot.setFont(itProps.getFont());
fbe3c2bb   Benjamin Renard   First commit
1846

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

ba6124b0   Menouard AZIB   Add parameter id ...
1849
1850
1851
		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
1852

ba6124b0   Menouard AZIB   Add parameter id ...
1853
1854
1855
		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
1856

ba6124b0   Menouard AZIB   Add parameter id ...
1857
1858
1859
1860
1861
1862
1863
		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
1864

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
1871
1872
1873
			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
1874

ba6124b0   Menouard AZIB   Add parameter id ...
1875
1876
1877
			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
1878

ba6124b0   Menouard AZIB   Add parameter id ...
1879
1880
1881
1882
			if (itProps.getMode() == IntervalTickMode::INTERVAL_INDEX)
				stopTextPlot->_text = startTextPlot->_text;
			else
				stopTextPlot->_text = AMDA::TimeUtil::formatTimeDateInIso(timeData[1]);
fbe3c2bb   Benjamin Renard   First commit
1883

ba6124b0   Menouard AZIB   Add parameter id ...
1884
1885
			textPlots.push_back(stopTextPlot);
		}
fbe3c2bb   Benjamin Renard   First commit
1886

ba6124b0   Menouard AZIB   Add parameter id ...
1887
		drawTextPlots(lXAxis, lYAxis, lPlWindow, textPlots);
fbe3c2bb   Benjamin Renard   First commit
1888
1889
	}

ba6124b0   Menouard AZIB   Add parameter id ...
1890
1891
1892
1893
1894
1895
	/**
	 * @brief Draw parameters legend.
	 */
	void PanelPlotOutput::drawParamsLegend(void)
	{
		ParamsLegendProperties &legendProp = _panel->_paramsLegendProperties;
fbe3c2bb   Benjamin Renard   First commit
1896

ba6124b0   Menouard AZIB   Add parameter id ...
1897
1898
		if (!legendProp.isVisible() || legendProp.isDrawn())
			return;
fbe3c2bb   Benjamin Renard   First commit
1899

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

ba6124b0   Menouard AZIB   Add parameter id ...
1902
1903
		if (lines.empty())
			return;
fbe3c2bb   Benjamin Renard   First commit
1904

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

ba6124b0   Menouard AZIB   Add parameter id ...
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
		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
1918

ba6124b0   Menouard AZIB   Add parameter id ...
1919
1920
1921
		int index = 0;
		std::string symbol_str[nbLines];
		for (auto line : lines)
fbe3c2bb   Benjamin Renard   First commit
1922
		{
ba6124b0   Menouard AZIB   Add parameter id ...
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
			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
1944

ba6124b0   Menouard AZIB   Add parameter id ...
1945
1946
1947
1948
			text_colors[index] = legendProp.getColorIndex(_pls.get(), line.getTextColor(legendProp.isOnlyText()));
			texts[index] = line.getText();
			++index;
		}
fbe3c2bb   Benjamin Renard   First commit
1949

ba6124b0   Menouard AZIB   Add parameter id ...
1950
1951
		PLFLT legend_width, legend_height;
		PLINT opt = PL_LEGEND_BACKGROUND;
fbe3c2bb   Benjamin Renard   First commit
1952

ba6124b0   Menouard AZIB   Add parameter id ...
1953
1954
1955
		// show or hide bounding box
		if (legendProp.isBorderVisible())
			opt |= PL_LEGEND_BOUNDING_BOX;
fbe3c2bb   Benjamin Renard   First commit
1956

ba6124b0   Menouard AZIB   Add parameter id ...
1957
1958
1959
1960
		PLINT position = PL_POSITION_VIEWPORT;
		switch (legendProp.getPosition())
		{
		case ParamsLegendPosition::POS_INSIDE:
fbe3c2bb   Benjamin Renard   First commit
1961
1962
			position |= PL_POSITION_INSIDE | PL_POSITION_TOP | PL_POSITION_RIGHT;
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
1963
		case ParamsLegendPosition::POS_OUTSIDE:
fbe3c2bb   Benjamin Renard   First commit
1964
1965
			position |= PL_POSITION_OUTSIDE | PL_POSITION_RIGHT;
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
1966
		default:
fbe3c2bb   Benjamin Renard   First commit
1967
1968
			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 ...
1969
		}
fbe3c2bb   Benjamin Renard   First commit
1970

ba6124b0   Menouard AZIB   Add parameter id ...
1971
1972
1973
		// define offset
		PLFLT x_offset = 0.0;
		PLFLT y_offset = 0.0;
fbe3c2bb   Benjamin Renard   First commit
1974

ba6124b0   Menouard AZIB   Add parameter id ...
1975
1976
1977
		switch (legendProp.getPosition())
		{
		case ParamsLegendPosition::POS_INSIDE:
fbe3c2bb   Benjamin Renard   First commit
1978
1979
1980
			x_offset = LEGEND_INSIDE_OFFSET;
			y_offset = LEGEND_INSIDE_OFFSET * _panelPlotXYRatio;
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
1981
		case ParamsLegendPosition::POS_OUTSIDE:
8b6d84db   Benjamin Renard   Fix legend positi...
1982
			x_offset = LEGEND_OUTSIDE_OFFSET;
fbe3c2bb   Benjamin Renard   First commit
1983
1984
			y_offset = 0.0;
			break;
ba6124b0   Menouard AZIB   Add parameter id ...
1985
		default:
fbe3c2bb   Benjamin Renard   First commit
1986
1987
			x_offset = LEGEND_INSIDE_OFFSET;
			y_offset = LEGEND_INSIDE_OFFSET * _panelPlotXYRatio;
ba6124b0   Menouard AZIB   Add parameter id ...
1988
		}
fbe3c2bb   Benjamin Renard   First commit
1989

ba6124b0   Menouard AZIB   Add parameter id ...
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
		// 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
2040

ba6124b0   Menouard AZIB   Add parameter id ...
2041
2042
		// draw tthe legend
		_pls->legend(
fbe3c2bb   Benjamin Renard   First commit
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
			&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 ...
2062
			(const char **)texts,
fbe3c2bb   Benjamin Renard   First commit
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
			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 ...
2073
			(const char **)symbols);
fbe3c2bb   Benjamin Renard   First commit
2074

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

ba6124b0   Menouard AZIB   Add parameter id ...
2078
2079
		legendProp.setDrawn(true);
	}
fbe3c2bb   Benjamin Renard   First commit
2080

ba6124b0   Menouard AZIB   Add parameter id ...
2081
2082
2083
	/**
	 * @brief Draw text legends.
	 */
fbe3c2bb   Benjamin Renard   First commit
2084

ba6124b0   Menouard AZIB   Add parameter id ...
2085
2086
2087
2088
2089
2090
	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
2091

ba6124b0   Menouard AZIB   Add parameter id ...
2092
2093
2094
2095
		/*bool	leftTextLegendFound		= false;
		bool	rightTextLegendFound 	= false;
		bool	topTextLegendFound 		= false;
		bool	bottomTextLegendFound 	= false;*/
fbe3c2bb   Benjamin Renard   First commit
2096

ba6124b0   Menouard AZIB   Add parameter id ...
2097
2098
2099
2100
		for (auto textLegend : _panel->_textLegendPropertiesList)
		{
			if (textLegend->isDrawn())
				continue;
fbe3c2bb   Benjamin Renard   First commit
2101

ba6124b0   Menouard AZIB   Add parameter id ...
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
			// 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
2116
			{
ba6124b0   Menouard AZIB   Add parameter id ...
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
			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
2167
			}
fbe3c2bb   Benjamin Renard   First commit
2168

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

ba6124b0   Menouard AZIB   Add parameter id ...
2171
2172
2173
			textLegend->setDrawn(true);
		}
	}
fbe3c2bb   Benjamin Renard   First commit
2174

ba6124b0   Menouard AZIB   Add parameter id ...
2175
2176
2177
2178
2179
2180
	/**
	 * Draws Curve
	 */
	void PanelPlotOutput::drawCurvePlot(CurvePlot & /*curvePlot*/)
	{
		// Nothing to do - Deleguate to subclasses
fbe3c2bb   Benjamin Renard   First commit
2181
	}
fbe3c2bb   Benjamin Renard   First commit
2182

ba6124b0   Menouard AZIB   Add parameter id ...
2183
2184
2185
2186
2187
2188
2189
	/**
	 * @brief Write plot context
	 */
	void PanelPlotOutput::writeContext(ContextFileWriter &writer, AMDA::Parameters::TimeIntervalList::iterator currentTimeInterval)
	{
		if (!isStandalone())
			return;
fbe3c2bb   Benjamin Renard   First commit
2190

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
2196
2197
		for (ParameterAxesList::iterator it = _parameterAxesList.begin();
			 it != _parameterAxesList.end(); ++it)
24600903   Benjamin Renard   Add "hasSpectro" ...
2198
		{
ba6124b0   Menouard AZIB   Add parameter id ...
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
			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...
2210

ba6124b0   Menouard AZIB   Add parameter id ...
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
		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...
2228
				{
ba6124b0   Menouard AZIB   Add parameter id ...
2229
2230
2231
2232
2233
2234
2235
2236
					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...
2237
					{
ba6124b0   Menouard AZIB   Add parameter id ...
2238
2239
2240
2241
2242
2243
						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...
2244

ba6124b0   Menouard AZIB   Add parameter id ...
2245
2246
2247
2248
2249
							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...
2250

ba6124b0   Menouard AZIB   Add parameter id ...
2251
							if (it->_startTime >= currentTimeInterval->_startTime && it->_stopTime <= currentTimeInterval->_stopTime) // inside the interval
29818855   Erdogan Furkan   #5390 - Some modi...
2252
							{
ba6124b0   Menouard AZIB   Add parameter id ...
2253
2254
2255
2256
2257
2258
2259
								if (timeRatio * acceptedRatio < (stopTime - startTime) / _plotAreaBounds._width)
								{
									needTTWriter = true;
									data = it->getAllParameterData();
									if (data.size() > 0)
										needCatWriter = true;
								}
29818855   Erdogan Furkan   #5390 - Some modi...
2260
							}
ba6124b0   Menouard AZIB   Add parameter id ...
2261
							else if (it->_startTime <= currentTimeInterval->_startTime && it->_stopTime <= currentTimeInterval->_stopTime && it->_stopTime >= currentTimeInterval->_startTime) // begins before, ends inside
29818855   Erdogan Furkan   #5390 - Some modi...
2262
							{
ba6124b0   Menouard AZIB   Add parameter id ...
2263
2264
2265
2266
2267
2268
2269
2270
								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...
2271
							}
ba6124b0   Menouard AZIB   Add parameter id ...
2272
							else if (it->_startTime >= currentTimeInterval->_startTime && it->_startTime <= currentTimeInterval->_stopTime && it->_stopTime >= currentTimeInterval->_stopTime) // begins inside, ends after
29818855   Erdogan Furkan   #5390 - Some modi...
2273
							{
ba6124b0   Menouard AZIB   Add parameter id ...
2274
2275
2276
2277
2278
2279
2280
2281
								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...
2282
							}
3b531e56   Erdogan Furkan   Second Kernel mod...
2283

ba6124b0   Menouard AZIB   Add parameter id ...
2284
							if (needTTWriter)
3b531e56   Erdogan Furkan   Second Kernel mod...
2285
							{
ba6124b0   Menouard AZIB   Add parameter id ...
2286
2287
								writer.startElement("intervals");
								writer.addAttribute("name", inputTTOrCat._name.c_str());
22e48491   Benjamin Renard   Start TT id to 1
2288
								writer.addAttribute("id", std::to_string(it->_index + 1).c_str());
ba6124b0   Menouard AZIB   Add parameter id ...
2289
2290
2291
								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...
2292
								{
ba6124b0   Menouard AZIB   Add parameter id ...
2293
2294
2295
2296
2297
2298
									std::string allParams;
									for (auto i : data)
									{
										allParams += i.second[0] + "|";
									}
									writer.addAttribute("params", allParams.c_str());
29818855   Erdogan Furkan   #5390 - Some modi...
2299
								}
ba6124b0   Menouard AZIB   Add parameter id ...
2300
								writer.endElement();
3b531e56   Erdogan Furkan   Second Kernel mod...
2301
							}
3b531e56   Erdogan Furkan   Second Kernel mod...
2302
						}
eddfb311   Erdogan Furkan   9326 - Modificita...
2303
					}
eddfb311   Erdogan Furkan   9326 - Modificita...
2304
2305
				}
			}
24600903   Benjamin Renard   Add "hasSpectro" ...
2306

ba6124b0   Menouard AZIB   Add parameter id ...
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
			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" ...
2322

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
2330
2331
				if (lAxis == nullptr)
					continue;
8499fbdd   Benjamin Renard   Context file gene...
2332

ba6124b0   Menouard AZIB   Add parameter id ...
2333
2334
2335
				if (lAxis->_visible && lAxis->_used)
					lAxis->writeContext(writer);
			}
8499fbdd   Benjamin Renard   Context file gene...
2336

ba6124b0   Menouard AZIB   Add parameter id ...
2337
			writer.endElement();
85bb5117   Benjamin Renard   Give the possibil...
2338
2339
		}

85bb5117   Benjamin Renard   Give the possibil...
2340
		writer.endElement();
8499fbdd   Benjamin Renard   Context file gene...
2341
	}
85bb5117   Benjamin Renard   Give the possibil...
2342

ba6124b0   Menouard AZIB   Add parameter id ...
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
	/**
	 * @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...
2353

ba6124b0   Menouard AZIB   Add parameter id ...
2354
	void PanelPlotOutput::fillBackground(std::shared_ptr<plstream> &pls)
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2355
	{
ba6124b0   Menouard AZIB   Add parameter id ...
2356
2357
2358
		if (_panel->_plotAreaBackgroundColor._red != -1 && _panel->_plotAreaBackgroundColor._green != -1 && _panel->_plotAreaBackgroundColor._blue != -1)
		{
			Color plotAreaBackgroundColor = _panel->_plotAreaBackgroundColor;
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2359

ba6124b0   Menouard AZIB   Add parameter id ...
2360
2361
2362
2363
2364
2365
			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...
2366

ba6124b0   Menouard AZIB   Add parameter id ...
2367
2368
2369
2370
2371
			// 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...
2372

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

ba6124b0   Menouard AZIB   Add parameter id ...
2376
2377
2378
2379
			// 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...
2380

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

ba6124b0   Menouard AZIB   Add parameter id ...
2383
2384
2385
2386
			if (lInitialRed != -1 && lInitialGreen != -1 && lInitialBlue != -1)
			{
				pls->scol0(0, lInitialRed, lInitialGreen, lInitialBlue);
			}
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2387
2388
		}
	}
337411e4   Erdogan Furkan   #5390 - Kernel pa...
2389

ba6124b0   Menouard AZIB   Add parameter id ...
2390
2391
2392
2393
2394
2395
2396
	/**
	 * @brief Retrieve plot area bounds for the panel
	 */
	void PanelPlotOutput::getPlotAreaBounds(Bounds &plotAreaBounds)
	{
		plotAreaBounds = _plotAreaBounds;
	}
fbe3c2bb   Benjamin Renard   First commit
2397

ba6124b0   Menouard AZIB   Add parameter id ...
2398
2399
2400
2401
2402
2403
2404
2405
	/**
	 * @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
2406

ba6124b0   Menouard AZIB   Add parameter id ...
2407
2408
2409
2410
2411
2412
2413
	/**
	 * @brief Retrieve left axis tickMark width
	 */
	int PanelPlotOutput::getLeftAxisTickMarkWidth(void)
	{
		return _leftAxisTickMarkWidth;
	}
fbe3c2bb   Benjamin Renard   First commit
2414

ba6124b0   Menouard AZIB   Add parameter id ...
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
	/**
	 * @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
2430
2431
		}
	}
fbe3c2bb   Benjamin Renard   First commit
2432

ba6124b0   Menouard AZIB   Add parameter id ...
2433
2434
2435
2436
	/**
	 * @brief Get nb series to draw by y axis
	 */
	std::map<std::string, int> &PanelPlotOutput::getNbSeriesByYAxis()
8bb0f02b   Benjamin Renard   Set colors in axi...
2437
	{
ba6124b0   Menouard AZIB   Add parameter id ...
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
		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...
2449

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
2455
2456
				_nbSeriesByYAxisMap[yAxisId] += lSeries.getIndexList(_pParameterValues).size();
			}
8bb0f02b   Benjamin Renard   Set colors in axi...
2457
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2458
		return _nbSeriesByYAxisMap;
8bb0f02b   Benjamin Renard   Set colors in axi...
2459
	}
8bb0f02b   Benjamin Renard   Set colors in axi...
2460

ba6124b0   Menouard AZIB   Add parameter id ...
2461
2462
2463
2464
2465
2466
2467
2468
2469
	/**
	 * @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
2470

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

ba6124b0   Menouard AZIB   Add parameter id ...
2473
2474
2475
2476
2477
		if (_parameterAxesList.empty())
		{
			noData = false; // Do not draw No Data if the panel is empty
			_panel->drawEmptyPanel(_pls);
		}
08ec1dde   Benjamin Renard   Add propertie _us...
2478

ba6124b0   Menouard AZIB   Add parameter id ...
2479
2480
		if (isFirstInterval)
			_panel->_paramsLegendProperties.resetPlot();
fbe3c2bb   Benjamin Renard   First commit
2481

ba6124b0   Menouard AZIB   Add parameter id ...
2482
2483
2484
2485
		// Set pointer to ParameterData list
		if (_pParameterValues == NULL)
		{
			std::stringstream lError;
fbe3c2bb   Benjamin Renard   First commit
2486
			lError << "PanelPlotOutput::draw - Pointer to parameterValues is not set";
ba6124b0   Menouard AZIB   Add parameter id ...
2487
			BOOST_THROW_EXCEPTION(
fbe3c2bb   Benjamin Renard   First commit
2488
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
ba6124b0   Menouard AZIB   Add parameter id ...
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
		}

		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
2527

ba6124b0   Menouard AZIB   Add parameter id ...
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
				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...
2542

ba6124b0   Menouard AZIB   Add parameter id ...
2543
2544
2545
2546
2547
2548
2549
		// 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...
2550
				// Draw (configure) window for this series.
ba6124b0   Menouard AZIB   Add parameter id ...
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
				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...
2566
				}
d57f00dc   Benjamin Renard   Draw NO DATA
2567
			}
fbe3c2bb   Benjamin Renard   First commit
2568
		}
fbe3c2bb   Benjamin Renard   First commit
2569

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

ba6124b0   Menouard AZIB   Add parameter id ...
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
		// 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
2603

ba6124b0   Menouard AZIB   Add parameter id ...
2604
2605
		// Draw additional objects
		drawAdditionalObjects();
fbe3c2bb   Benjamin Renard   First commit
2606

ba6124b0   Menouard AZIB   Add parameter id ...
2607
2608
2609
		// Draw parameter legend
		if (isLastInterval || !_panel->_page->_superposeMode)
			drawParamsLegend();
fbe3c2bb   Benjamin Renard   First commit
2610

ba6124b0   Menouard AZIB   Add parameter id ...
2611
2612
		// Draw text legends
		drawTextLegends();
d57f00dc   Benjamin Renard   Draw NO DATA
2613

ba6124b0   Menouard AZIB   Add parameter id ...
2614
2615
2616
2617
2618
2619
		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...
2620
2621
		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...
2622
		boost::shared_ptr<Axis> lZAxis(_panel->getAxis(pSauvaud.getZAxisId()));
ba6124b0   Menouard AZIB   Add parameter id ...
2623

793c4351   Hacene SI HADJ MOHAND   creation de class...
2624
		Range lXRange, lYRange, lZRange;
ba6124b0   Menouard AZIB   Add parameter id ...
2625
2626
		if (pSauvaud.hasXAxis() && lXAxis.get() == nullptr)
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2627
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2628
2629
2630
			lError << "PanelPlotOutput::drawSauvaud"
				   << ": X axis with id '"
				   << pSauvaud.getXAxisId() << "' not found.";
793c4351   Hacene SI HADJ MOHAND   creation de class...
2631
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2632
2633
2634
2635
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
		}
		else if (pSauvaud.hasXAxis())
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2636
2637
2638
			// fill X range (plplot window).
			lXRange = lXAxis->getRange();
		}
fbe3c2bb   Benjamin Renard   First commit
2639

ba6124b0   Menouard AZIB   Add parameter id ...
2640
2641
		if (pSauvaud.hasYAxis() && lYAxis.get() == nullptr)
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2642
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2643
2644
2645
			lError << "PanelPlotOutput::drawSauvaud"
				   << ": Y axis with id '"
				   << pSauvaud.getYAxisId() << "' not found.";
793c4351   Hacene SI HADJ MOHAND   creation de class...
2646
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2647
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
793c4351   Hacene SI HADJ MOHAND   creation de class...
2648
			lYRange = Range();
ba6124b0   Menouard AZIB   Add parameter id ...
2649
2650
2651
		}
		else if (pSauvaud.hasYAxis())
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2652
2653
			// fill Y range (plplot window).
			lYRange = lYAxis->getRange();
ba6124b0   Menouard AZIB   Add parameter id ...
2654
			fixRange(lYRange, lYAxis->_scale == Axis::Scale::LOGARITHMIC);
793c4351   Hacene SI HADJ MOHAND   creation de class...
2655
2656
		}

ba6124b0   Menouard AZIB   Add parameter id ...
2657
2658
		if (pSauvaud.hasZAxis() && lZAxis.get() == nullptr)
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2659
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2660
2661
2662
			lError << "PanelPlotOutput::drawSauvaud"
				   << ": Z axis with id '"
				   << pSauvaud.getZAxisId() << "' not found.";
793c4351   Hacene SI HADJ MOHAND   creation de class...
2663
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2664
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
793c4351   Hacene SI HADJ MOHAND   creation de class...
2665
2666
			lZRange = Range();
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2667
2668
		else if (pSauvaud.hasZAxis())
		{
793c4351   Hacene SI HADJ MOHAND   creation de class...
2669
2670
2671
			// fill Z range (plplot window).
			lZRange = lZAxis->getRange();
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2672
2673

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

793c4351   Hacene SI HADJ MOHAND   creation de class...
2676
2677
2678
2679
2680
2681
		// 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 ...
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699

		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...
2700
		lTickConf = TickConf(lXMajorTickSpace, lXMinorTickNumber, lYMajorTickSpace, lYMinorTickNumber);
ba6124b0   Menouard AZIB   Add parameter id ...
2701
		Bounds areaBounds(_plotAreaBounds);
793c4351   Hacene SI HADJ MOHAND   creation de class...
2702

ba6124b0   Menouard AZIB   Add parameter id ...
2703
2704
2705
2706
2707
2708
		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...
2709
2710

		// Draw Y axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
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
		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...
2784
2785
2786
		}

		// Draw Z axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2787
2788
2789
		if (pSauvaud.hasZAxis() && (lZAxis != nullptr) && !lZAxis->_drawn)
		{
			drawZAxis(lZAxis, lPlWindow, _plotAreaBounds, lTickConf);
793c4351   Hacene SI HADJ MOHAND   creation de class...
2790
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2791
2792
2793
2794

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

			drawXAxis(lXAxis, lPlWindow, areaBounds, lTickConf);
ba6124b0   Menouard AZIB   Add parameter id ...
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806

			// 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
2807
2808
2809
2810
2811
2812
		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 ...
2813
2814
		if (pSpectro.hasXAxis() && lXAxis.get() == nullptr)
		{
fbe3c2bb   Benjamin Renard   First commit
2815
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2816
2817
2818
			lError << "PanelPlotOutput::drawSpectro"
				   << ": X axis with id '"
				   << pSpectro.getXAxisId() << "' not found.";
fbe3c2bb   Benjamin Renard   First commit
2819
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2820
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
fbe3c2bb   Benjamin Renard   First commit
2821
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2822
2823
		else if (pSpectro.hasXAxis())
		{
fbe3c2bb   Benjamin Renard   First commit
2824
2825
2826
2827
			// fill X range (plplot window).
			lXRange = lXAxis->getRange();
		}

ba6124b0   Menouard AZIB   Add parameter id ...
2828
2829
		if (pSpectro.hasYAxis() && lYAxis.get() == nullptr)
		{
fbe3c2bb   Benjamin Renard   First commit
2830
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2831
2832
2833
			lError << "PanelPlotOutput::drawSpectro"
				   << ": Y axis with id '"
				   << pSpectro.getYAxisId() << "' not found.";
fbe3c2bb   Benjamin Renard   First commit
2834
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2835
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
fbe3c2bb   Benjamin Renard   First commit
2836
2837
			lYRange = Range();
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2838
2839
		else if (pSpectro.hasYAxis())
		{
fbe3c2bb   Benjamin Renard   First commit
2840
2841
			// fill Y range (plplot window).
			lYRange = lYAxis->getRange();
ba6124b0   Menouard AZIB   Add parameter id ...
2842
			fixRange(lYRange, lYAxis->_scale == Axis::Scale::LOGARITHMIC);
fbe3c2bb   Benjamin Renard   First commit
2843
2844
		}

ba6124b0   Menouard AZIB   Add parameter id ...
2845
2846
		if (pSpectro.hasZAxis() && lZAxis.get() == nullptr)
		{
fbe3c2bb   Benjamin Renard   First commit
2847
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2848
2849
2850
			lError << "PanelPlotOutput::drawSpectro"
				   << ": Z axis with id '"
				   << pSpectro.getZAxisId() << "' not found.";
fbe3c2bb   Benjamin Renard   First commit
2851
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2852
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
fbe3c2bb   Benjamin Renard   First commit
2853
2854
			lZRange = Range();
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2855
2856
		else if (pSpectro.hasZAxis())
		{
fbe3c2bb   Benjamin Renard   First commit
2857
2858
2859
2860
2861
2862
			// fill Z range (plplot window).
			lZRange = lZAxis->getRange();
		}

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

fbe3c2bb   Benjamin Renard   First commit
2863
2864
2865
2866
2867
2868
2869
		// 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 ...
2870
2871
		if (pSpectro.hasXAxis())
		{
fbe3c2bb   Benjamin Renard   First commit
2872
2873
			// Calculate X tick
			lXMajorTickSpace = getMajorTickSpace(lXAxis.get(),
ba6124b0   Menouard AZIB   Add parameter id ...
2874
												 std::get<0>(lPlWindow), std::get<1>(lPlWindow));
fbe3c2bb   Benjamin Renard   First commit
2875
			lXMinorTickNumber = getMinorTickNumber(lXAxis.get(),
ba6124b0   Menouard AZIB   Add parameter id ...
2876
												   std::get<0>(lPlWindow), std::get<1>(lPlWindow), lXMajorTickSpace);
fbe3c2bb   Benjamin Renard   First commit
2877
2878
		}

ba6124b0   Menouard AZIB   Add parameter id ...
2879
2880
		if (pSpectro.hasYAxis())
		{
fbe3c2bb   Benjamin Renard   First commit
2881
2882
2883
			// 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 ...
2884
												   lYMajorTickSpace);
fbe3c2bb   Benjamin Renard   First commit
2885
2886
2887
2888
		}

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

fbe3c2bb   Benjamin Renard   First commit
2889
		// Draw Y axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2890
2891
		if (pSpectro.hasYAxis() && !lYAxis->_drawn)
		{
fbe3c2bb   Benjamin Renard   First commit
2892
2893
2894
2895
2896
2897
2898
2899

			drawYAxis(lYAxis, lPlWindow, _plotAreaBounds, lTickConf);

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

		// Draw X axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2900
2901
		if (pSpectro.hasXAxis() && !lXAxis->_drawn)
		{
fbe3c2bb   Benjamin Renard   First commit
2902
2903
2904
2905
2906
2907
2908
2909

			drawXAxis(lXAxis, lPlWindow, _plotAreaBounds, lTickConf);

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

		// Draw Z axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2910
2911
2912
		if (pSpectro.hasZAxis() && (lZAxis != nullptr) && !lZAxis->_drawn)
		{
			drawZAxis(lZAxis, lPlWindow, _plotAreaBounds, lTickConf);
fbe3c2bb   Benjamin Renard   First commit
2913
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2914
2915
2916
2917
2918
	}

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

ba6124b0   Menouard AZIB   Add parameter id ...
2920
		boost::shared_ptr<Axis> lXAxis(_panel->getAxis(pIntervals.getXAxisId()));
e257cfb9   Benjamin Renard   First implementat...
2921
2922
2923

		PlWindow lPlWindow;
		Range lXRange, lYRange;
ba6124b0   Menouard AZIB   Add parameter id ...
2924
2925
		if (lXAxis.get() == nullptr)
		{
e257cfb9   Benjamin Renard   First implementat...
2926
			std::stringstream lError;
ba6124b0   Menouard AZIB   Add parameter id ...
2927
2928
2929
			lError << "PanelPlotOutput::drawIntervals"
				   << ": X axis with id '"
				   << pIntervals.getXAxisId() << "' not found.";
e257cfb9   Benjamin Renard   First implementat...
2930
			BOOST_THROW_EXCEPTION(
ba6124b0   Menouard AZIB   Add parameter id ...
2931
				PanelPlotOutputException() << AMDA::ex_msg(lError.str()));
e257cfb9   Benjamin Renard   First implementat...
2932
		}
ba6124b0   Menouard AZIB   Add parameter id ...
2933
2934
2935
2936

		lXRange = lXAxis->getRange();

		lYRange = Range(0, 1);
e257cfb9   Benjamin Renard   First implementat...
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946

		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 ...
2947
2948
2949
2950
2951
2952
		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...
2953
2954

		// Draw X axis and legend
ba6124b0   Menouard AZIB   Add parameter id ...
2955
2956
		if (!lXAxis->_drawn)
		{
e257cfb9   Benjamin Renard   First implementat...
2957
2958
2959
2960
2961
2962
2963

			drawXAxis(lXAxis, lPlWindow, _plotAreaBounds, lTickConf);

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

ba6124b0   Menouard AZIB   Add parameter id ...
2964
2965
2966
		_pls->vpor(_plotAreaBounds._x, _plotAreaBounds._x + _plotAreaBounds._width,
				   _plotAreaBounds._y, _plotAreaBounds._y + _plotAreaBounds._height);
	}
e257cfb9   Benjamin Renard   First implementat...
2967

ba6124b0   Menouard AZIB   Add parameter id ...
2968
2969
2970
2971
2972
2973
	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
2974

ba6124b0   Menouard AZIB   Add parameter id ...
2975
2976
2977
2978
2979
2980
2981
2982
	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
2983

ba6124b0   Menouard AZIB   Add parameter id ...
2984
2985
2986
		Range lXRange = getXAxisRange(pSeries, lXAxis);
		Range lYRange = getYAxisRange(pSeries, lYAxis);
		// Range lZRange = getZAxisRange (pSeries, lZAxis);
fbe3c2bb   Benjamin Renard   First commit
2987

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

ba6124b0   Menouard AZIB   Add parameter id ...
2990
2991
2992
2993
2994
2995
		// Calculate X and Y tick
		TickConf lTickConf;
		double lXMajorTickSpace = nan("");
		int lXMinorTickNumber = 0;
		double lYMajorTickSpace = nan("");
		int lYMinorTickNumber = 0;
fbe3c2bb   Benjamin Renard   First commit
2996

ba6124b0   Menouard AZIB   Add parameter id ...
2997
2998
2999
3000
3001
3002
3003
3004
		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
3005

ba6124b0   Menouard AZIB   Add parameter id ...
3006
3007
3008
3009
3010
3011
3012
		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
3013

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

ba6124b0   Menouard AZIB   Add parameter id ...
3016
3017
3018
		// Draw Y axis and legend
		if (pSeries.hasYAxis() && !lYAxis->_drawn)
		{
fbe3c2bb   Benjamin Renard   First commit
3019

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

ba6124b0   Menouard AZIB   Add parameter id ...
3022
3023
3024
			// Draw legend.
			drawLegends(lYAxis, lPlWindow, _plotAreaBounds);
		}
fbe3c2bb   Benjamin Renard   First commit
3025

ba6124b0   Menouard AZIB   Add parameter id ...
3026
3027
3028
3029
		// Draw X axis and legend
		if (pSeries.hasXAxis() && !lXAxis->_drawn)
		{
			drawXAxis(lXAxis, lPlWindow, _plotAreaBounds, lTickConf);
fbe3c2bb   Benjamin Renard   First commit
3030

ba6124b0   Menouard AZIB   Add parameter id ...
3031
3032
3033
			// Draw legend.
			drawLegends(lXAxis, lPlWindow, _plotAreaBounds);
		}
fbe3c2bb   Benjamin Renard   First commit
3034

ba6124b0   Menouard AZIB   Add parameter id ...
3035
3036
3037
3038
3039
		// Draw Z axis and legend
		if (pSeries.hasZAxis() && (lZAxis != nullptr) && !lZAxis->_drawn)
		{
			drawZAxis(lZAxis, lPlWindow, _plotAreaBounds, lTickConf);
		}
fbe3c2bb   Benjamin Renard   First commit
3040
3041
	}

ba6124b0   Menouard AZIB   Add parameter id ...
3042
3043
3044
3045
3046
3047
3048
3049
	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
3050

ba6124b0   Menouard AZIB   Add parameter id ...
3051
3052
				if ((lXAxis == nullptr) || (lYAxis == nullptr))
					continue;
fbe3c2bb   Benjamin Renard   First commit
3053

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

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

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
3068
3069
3070
				lXAxis->_additionalObjDrawn = true;
				lYAxis->_additionalObjDrawn = true;
			}
fbe3c2bb   Benjamin Renard   First commit
3071

ba6124b0   Menouard AZIB   Add parameter id ...
3072
3073
3074
3075
			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...
3076

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

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

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

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
3094
3095
3096
				lXAxis->_additionalObjDrawn = true;
				lYAxis->_additionalObjDrawn = true;
			}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3097
		}
fbe3c2bb   Benjamin Renard   First commit
3098

ba6124b0   Menouard AZIB   Add parameter id ...
3099
3100
3101
3102
3103
3104
3105
		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...
3106

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

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

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

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
3124
3125
3126
				lXAxis->_additionalObjDrawn = true;
				lYAxis->_additionalObjDrawn = true;
			}
078ec265   Benjamin Renard   Give the possibil...
3127
		}
fbe3c2bb   Benjamin Renard   First commit
3128

ba6124b0   Menouard AZIB   Add parameter id ...
3129
3130
3131
3132
		// Draw curvePlots
		for (auto curvePlot : _panel->_curvePlots)
			drawCurvePlot(*curvePlot);
	}
fbe3c2bb   Benjamin Renard   First commit
3133

ba6124b0   Menouard AZIB   Add parameter id ...
3134
3135
3136
3137
	void PanelPlotOutput::setPlStream(std::shared_ptr<plstream> &pls)
	{
		_pls = pls;
	}
c45180e1   Benjamin Renard   Add _used propert...
3138

ba6124b0   Menouard AZIB   Add parameter id ...
3139
3140
3141
3142
	std::string PanelPlotOutput::drawOppositeSide(boost::shared_ptr<Axis> pAxis)
	{
		boost::shared_ptr<Axis> lNewAxis;
		std::string lOppositeSide;
c45180e1   Benjamin Renard   Add _used propert...
3143

ba6124b0   Menouard AZIB   Add parameter id ...
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
		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
3173
		}
fbe3c2bb   Benjamin Renard   First commit
3174

ba6124b0   Menouard AZIB   Add parameter id ...
3175
3176
		return lOppositeSide;
	}
fbe3c2bb   Benjamin Renard   First commit
3177

ba6124b0   Menouard AZIB   Add parameter id ...
3178
3179
3180
3181
3182
3183
	/*
	 * Create a sampled parameter from an original parameter and a sampling value
	 */
	AMDA::Parameters::ParameterSPtr PanelPlotOutput::createSampledParameter(AMDA::Parameters::ParameterSPtr &originalParam, float samplingValue)
	{
		AMDA::Parameters::ParameterSPtr sampledParam = _parameterManager.getSampledParameter(
fbe3c2bb   Benjamin Renard   First commit
3184
3185
3186
			originalParam->getId(),
			"classic",
			samplingValue,
854a7fcf   Benjamin Renard   First implementat...
3187
			originalParam->getGapThreshold(), true);
fbe3c2bb   Benjamin Renard   First commit
3188

ba6124b0   Menouard AZIB   Add parameter id ...
3189
3190
3191
3192
3193
		if (sampledParam == NULL)
		{
			LOG4CXX_ERROR(gLogger,
						  "ParamOutput::createSampledParameter : cannot create sampled parameter");
			BOOST_THROW_EXCEPTION(
fbe3c2bb   Benjamin Renard   First commit
3194
				AMDA::Parameters::ParamOutput_exception());
ba6124b0   Menouard AZIB   Add parameter id ...
3195
		}
fbe3c2bb   Benjamin Renard   First commit
3196

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

ba6124b0   Menouard AZIB   Add parameter id ...
3199
3200
		return sampledParam;
	}
fbe3c2bb   Benjamin Renard   First commit
3201

ba6124b0   Menouard AZIB   Add parameter id ...
3202
3203
3204
3205
3206
3207
3208
3209
	/*
	 * 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...
3210

ba6124b0   Menouard AZIB   Add parameter id ...
3211
		AMDA::Parameters::ParameterSPtr sampledParam = _parameterManager.getSampledParameterUnderRefParam(
fbe3c2bb   Benjamin Renard   First commit
3212
			originalParam->getId(),
ba6124b0   Menouard AZIB   Add parameter id ...
3213
			refParam->getId(), true);
fbe3c2bb   Benjamin Renard   First commit
3214

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
3228
	ParameterAxes *PanelPlotOutput::getParameterAxesByColorSerieId(int colorSerieId)
fbe3c2bb   Benjamin Renard   First commit
3229
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3230
3231
3232
3233
3234
		if (colorSerieId < 0)
			return NULL;

		for (ParameterAxesList::iterator it = _parameterAxesList.begin();
			 it != _parameterAxesList.end(); ++it)
fbe3c2bb   Benjamin Renard   First commit
3235
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3236
3237
3238
3239
3240
			for (auto serieProp : it->getColorSeriePropertiesList())
			{
				if (serieProp.getId() == colorSerieId)
					return &(*it);
			}
fbe3c2bb   Benjamin Renard   First commit
3241
		}
fbe3c2bb   Benjamin Renard   First commit
3242

ba6124b0   Menouard AZIB   Add parameter id ...
3243
3244
3245
		LOG4CXX_ERROR(gLogger, "ParamOutput::getColorSeriePropertiesById : Not founded : " << colorSerieId);
		return NULL;
	}
fbe3c2bb   Benjamin Renard   First commit
3246

ba6124b0   Menouard AZIB   Add parameter id ...
3247
	ParameterAxes *PanelPlotOutput::getParameterAxesByXSerieId(int xSerieId)
c46af5a8   Benjamin Renard   Implements multi ...
3248
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3249
3250
		for (ParameterAxesList::iterator it = _parameterAxesList.begin();
			 it != _parameterAxesList.end(); ++it)
c46af5a8   Benjamin Renard   Implements multi ...
3251
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3252
3253
3254
3255
3256
			for (auto serieProp : it->getXSeriePropertiesList())
			{
				if (serieProp.getId() == xSerieId)
					return &(*it);
			}
c46af5a8   Benjamin Renard   Implements multi ...
3257
		}
c46af5a8   Benjamin Renard   Implements multi ...
3258

ba6124b0   Menouard AZIB   Add parameter id ...
3259
3260
3261
		LOG4CXX_ERROR(gLogger, "ParamOutput::getXSeriePropertiesById : Not founded : " << xSerieId);
		return NULL;
	}
c46af5a8   Benjamin Renard   Implements multi ...
3262

ba6124b0   Menouard AZIB   Add parameter id ...
3263
3264
3265
3266
3267
3268
	/**
	 * 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
3269
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3270
3271
3272
3273
3274
3275
		// -- 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
3276
3277
				_parameterManager.getParameter(it->_originalParamId);

ba6124b0   Menouard AZIB   Add parameter id ...
3278
3279
			// original parameter sampling
			double samplingValue = getSamplingInTreeParameter(originalParam);
fbe3c2bb   Benjamin Renard   First commit
3280

ba6124b0   Menouard AZIB   Add parameter id ...
3281
3282
3283
3284
3285
3286
			// 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
3287

ba6124b0   Menouard AZIB   Add parameter id ...
3288
3289
3290
				AMDA::Parameters::ParameterSPtr originalColorParam;
				if (colorSerieParameterAxes != NULL)
					originalColorParam = _parameterManager.getParameter(colorSerieParameterAxes->_originalParamId);
fbe3c2bb   Benjamin Renard   First commit
3291

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
3297
3298
				// create parameter and link to the serie
				switch (ity->getResamplingProperties().getType())
fbe3c2bb   Benjamin Renard   First commit
3299
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3300
3301
3302
				case ResamplingType::MANUAL:
				{
					// create resampling parameters for param
2fc1f2f8   Benjamin Renard   Full rework for s...
3303
					usedParam = createSampledParameter(originalParam, ity->getResamplingProperties().getValue());
fbe3c2bb   Benjamin Renard   First commit
3304
3305
					break;
				}
ba6124b0   Menouard AZIB   Add parameter id ...
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
				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
3321
				}
ba6124b0   Menouard AZIB   Add parameter id ...
3322
3323
3324
3325
3326
				// 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
3327

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

ba6124b0   Menouard AZIB   Add parameter id ...
3330
3331
				// 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
3332
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3333
3334
3335
3336
3337
3338
3339
3340
					std::stringstream usedParamIndex;
					if (ity->getIndex().getDim1Index() != -1)
					{
						usedParamIndex << "[" << std::to_string(ity->getIndex().getDim1Index());
						if (ity->getIndex().getDim2Index() != -1)
							usedParamIndex << "," << std::to_string(ity->getIndex().getDim2Index());
						usedParamIndex << "]";
					}
fbe3c2bb   Benjamin Renard   First commit
3341

ba6124b0   Menouard AZIB   Add parameter id ...
3342
3343
3344
3345
3346
3347
3348
3349
					std::stringstream minParamIndex;
					if (errorBarProp.getErrorMinMax()->getIndexMin().getDim1Index() != -1)
					{
						minParamIndex << "[" << std::to_string(errorBarProp.getErrorMinMax()->getIndexMin().getDim1Index());
						if (errorBarProp.getErrorMinMax()->getIndexMin().getDim2Index() != -1)
							minParamIndex << "," << std::to_string(errorBarProp.getErrorMinMax()->getIndexMin().getDim2Index());
						minParamIndex << "]";
					}
fbe3c2bb   Benjamin Renard   First commit
3350

ba6124b0   Menouard AZIB   Add parameter id ...
3351
3352
3353
3354
3355
3356
3357
3358
					std::stringstream maxParamIndex;
					if (errorBarProp.getErrorMinMax()->getIndexMax().getDim1Index() != -1)
					{
						maxParamIndex << "[" << std::to_string(errorBarProp.getErrorMinMax()->getIndexMax().getDim1Index());
						if (errorBarProp.getErrorMinMax()->getIndexMax().getDim2Index() != -1)
							maxParamIndex << "," << std::to_string(errorBarProp.getErrorMinMax()->getIndexMax().getDim2Index());
						maxParamIndex << "]";
					}
fbe3c2bb   Benjamin Renard   First commit
3359

ba6124b0   Menouard AZIB   Add parameter id ...
3360
3361
3362
3363
3364
3365
					// 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;
					minExpr << "$" << usedParam->getId() << usedParamIndex.str()
							<< "-$" + minParam->getId() << minParamIndex.str();
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
3385
3386
					AMDA::Parameters::ParameterSPtr maxParam = createSampledParameterUnderReferenceParameter(originalMaxParam, usedParam);
					std::stringstream maxExpr;
					maxExpr << "$" << usedParam->getId() << usedParamIndex.str()
							<< "+$" + maxParam->getId() << maxParamIndex.str();
fbe3c2bb   Benjamin Renard   First commit
3387

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

ba6124b0   Menouard AZIB   Add parameter id ...
3391
3392
3393
3394
3395
3396
3397
3398
3399
					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
3400
3401
				}

ba6124b0   Menouard AZIB   Add parameter id ...
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
				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
3415
3416
			}

ba6124b0   Menouard AZIB   Add parameter id ...
3417
3418
3419
			// For spectro if defined
			std::shared_ptr<SpectroProperties> pSpecProp = it->getSpectroProperties();
			if (pSpecProp != nullptr)
fbe3c2bb   Benjamin Renard   First commit
3420
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3421
3422
3423
3424
3425
3426
3427
				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
3428

ba6124b0   Menouard AZIB   Add parameter id ...
3429
				if (abs(samplingValue - correctedSamplingValue) > 1.)
f2db3c16   Benjamin Renard   Support variable ...
3430
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3431
3432
3433
3434
					// 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 ...
3435
					{
ba6124b0   Menouard AZIB   Add parameter id ...
3436
3437
3438
3439
						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 ...
3440

ba6124b0   Menouard AZIB   Add parameter id ...
3441
3442
3443
3444
							AMDA::Parameters::ParameterSPtr originalTableParam = _parameterManager.getParameter(tableParamName);
							AMDA::Parameters::ParameterSPtr usedTableParam = createSampledParameter(originalTableParam, correctedSamplingValue);
							pSpecProp->addTableParam(tableParamKey, usedTableParam->getId());
						}
f2db3c16   Benjamin Renard   Support variable ...
3445
3446
					}
				}
ba6124b0   Menouard AZIB   Add parameter id ...
3447
				else
f2db3c16   Benjamin Renard   Support variable ...
3448
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3449
3450
3451
					// use original parameter
					usedParam = originalParam;
					if ((tableSPtr != nullptr) && tableSPtr->isVariable(&_parameterManager))
f2db3c16   Benjamin Renard   Support variable ...
3452
					{
ba6124b0   Menouard AZIB   Add parameter id ...
3453
3454
3455
3456
						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 ...
3457

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

ba6124b0   Menouard AZIB   Add parameter id ...
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
				// 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 ...
3476
			}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3477

ba6124b0   Menouard AZIB   Add parameter id ...
3478
3479
3480
			// For sauvaud if defined
			std::shared_ptr<SauvaudProperties> pSauvaudProp = it->getSauvaudProperties();
			if (pSauvaudProp != nullptr)
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3481
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3482
3483
3484
3485
3486
3487
3488
3489
3490
				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...
3491
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3492
3493
3494
3495
					// 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...
3496
					{
ba6124b0   Menouard AZIB   Add parameter id ...
3497
3498
3499
3500
						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...
3501

ba6124b0   Menouard AZIB   Add parameter id ...
3502
3503
3504
3505
							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...
3506
3507
					}
				}
ba6124b0   Menouard AZIB   Add parameter id ...
3508
				else
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3509
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3510
3511
3512
					// use original parameter
					usedParam = originalParam;
					if ((tableSPtr != nullptr) && tableSPtr->isVariable(&_parameterManager))
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3513
					{
ba6124b0   Menouard AZIB   Add parameter id ...
3514
3515
3516
3517
						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...
3518

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

				// 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...
3537
			}
ba6124b0   Menouard AZIB   Add parameter id ...
3538
3539
3540
3541

			// For intervals if defined
			std::shared_ptr<IntervalsProperties> pIntProp = it->getIntervalsProperties();
			if (pIntProp != nullptr)
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3542
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
				// 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...
3558

ba6124b0   Menouard AZIB   Add parameter id ...
3559
3560
3561
3562
				// 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...
3563
			}
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3564
		}
ba6124b0   Menouard AZIB   Add parameter id ...
3565
	}
e257cfb9   Benjamin Renard   First implementat...
3566

ba6124b0   Menouard AZIB   Add parameter id ...
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
	/**
	 * 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...
3579
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3580
3581
				timeInt += (crtTimeInterval->_stopTime - crtTimeInterval->_startTime);
				++crtTimeInterval;
e257cfb9   Benjamin Renard   First implementat...
3582
			}
ba6124b0   Menouard AZIB   Add parameter id ...
3583
3584
3585
3586
3587
3588
		}
		else
		{
			// find the biggest intervals size
			TimeIntervalList::iterator crtTimeInterval = _parameterManager.getInputIntervals()->begin();
			while (crtTimeInterval != _parameterManager.getInputIntervals()->end())
e257cfb9   Benjamin Renard   First implementat...
3589
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3590
3591
3592
				if ((crtTimeInterval->_stopTime - crtTimeInterval->_startTime) > timeInt)
					timeInt = crtTimeInterval->_stopTime - crtTimeInterval->_startTime;
				++crtTimeInterval;
e257cfb9   Benjamin Renard   First implementat...
3593
			}
e257cfb9   Benjamin Renard   First implementat...
3594
		}
fbe3c2bb   Benjamin Renard   First commit
3595

ba6124b0   Menouard AZIB   Add parameter id ...
3596
		if ((timeInt == 0) || (maxResolution == -1) || (timeInt / samplingValue < maxResolution))
fbe3c2bb   Benjamin Renard   First commit
3597
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3598
			return samplingValue;
fbe3c2bb   Benjamin Renard   First commit
3599
		}
ba6124b0   Menouard AZIB   Add parameter id ...
3600
3601
3602
3603
3604
		// 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
3605
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3606
			roundedSampling += 1;
fbe3c2bb   Benjamin Renard   First commit
3607
		}
ba6124b0   Menouard AZIB   Add parameter id ...
3608
		return roundedSampling;
fbe3c2bb   Benjamin Renard   First commit
3609
3610
	}

ba6124b0   Menouard AZIB   Add parameter id ...
3611
3612
3613
3614
3615
	/**
	 * @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
3616
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3617
3618
3619
		std::vector<AMDA::Common::ParameterIndexComponent> indexes;
		for (ParameterAxesList::iterator paramAxeIt = _parameterAxesList.begin();
			 paramAxeIt != _parameterAxesList.end(); ++paramAxeIt)
fbe3c2bb   Benjamin Renard   First commit
3620
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3621
3622
3623
			// get indexes for spectro
			std::shared_ptr<SpectroProperties> pSpecProp = paramAxeIt->getSpectroProperties();
			if (pSpecProp != nullptr)
fbe3c2bb   Benjamin Renard   First commit
3624
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3625
				if (pSpecProp->getParamId() == paramId)
fbe3c2bb   Benjamin Renard   First commit
3626
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3627
3628
3629
3630
3631
3632
3633
3634
					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
3635

ba6124b0   Menouard AZIB   Add parameter id ...
3636
3637
3638
3639
3640
3641
					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...
3642
3643
				}
			}
ba6124b0   Menouard AZIB   Add parameter id ...
3644
3645
3646
3647

			// get indexes for spectro
			std::shared_ptr<SauvaudProperties> pSauvaudProp = paramAxeIt->getSauvaudProperties();
			if (pSauvaudProp != nullptr)
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3648
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3649
				if (pSauvaudProp->getParamId() == paramId)
5f13f59c   Hacene SI HADJ MOHAND   in progress worki...
3650
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3651
3652
3653
3654
3655
3656
3657
3658
					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...
3659

ba6124b0   Menouard AZIB   Add parameter id ...
3660
3661
3662
3663
3664
3665
					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
3666
3667
				}
			}
fbe3c2bb   Benjamin Renard   First commit
3668

ba6124b0   Menouard AZIB   Add parameter id ...
3669
3670
3671
			// get indexes for intervals
			std::shared_ptr<IntervalsProperties> pIntProp = paramAxeIt->getIntervalsProperties();
			if (pIntProp != nullptr)
e257cfb9   Benjamin Renard   First implementat...
3672
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3673
				if (pIntProp->getParamId() == paramId)
e257cfb9   Benjamin Renard   First implementat...
3674
				{
ba6124b0   Menouard AZIB   Add parameter id ...
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
					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...
3690
3691
				}
			}
e257cfb9   Benjamin Renard   First implementat...
3692

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

ba6124b0   Menouard AZIB   Add parameter id ...
3696
			for (AMDA::Common::ParameterIndexComponent index : seriesIndexes)
fbe3c2bb   Benjamin Renard   First commit
3697
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
				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
3708
			}
fbe3c2bb   Benjamin Renard   First commit
3709
		}
fbe3c2bb   Benjamin Renard   First commit
3710

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

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
	/*
	 * @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...
3744

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
3757
3758
		// 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
3759

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
3766
3767
3768
3769
3770
3771
3772
	/*
	 * @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
3773
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3774
3775
3776
		LOG4CXX_DEBUG(gLogger, "PanelPlotOutput::getColoredComputedValuesFromSerieAndInterval");
		// get parameter data for this color serie
		ParameterData &data = (*_pParameterValues)[rSeriesProperties.getColorParamId()];
fbe3c2bb   Benjamin Renard   First commit
3777

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

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

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
3792
3793
3794
3795
3796
		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
3797

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

ba6124b0   Menouard AZIB   Add parameter id ...
3800
3801
3802
3803
3804
3805
		// 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
3806

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
	/*
	 * @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,
																	 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

ba6124b0   Menouard AZIB   Add parameter id ...
3831
3832
3833
		// get original min data for interval [startDate, stopDate]
		int minStartIndex;
		dataMin.getIntervalBounds(startDate, stopDate, minStartIndex, nbMinValues);
fbe3c2bb   Benjamin Renard   First commit
3834

ba6124b0   Menouard AZIB   Add parameter id ...
3835
3836
3837
3838
3839
		if (nbMinValues == 0)
		{
			LOG4CXX_DEBUG(gLogger, "PanelPlotOutput::getErrorComputedValuesFromSerieAndInterval - Cannot get min data for error bar");
			return false;
		}
fbe3c2bb   Benjamin Renard   First commit
3840

ba6124b0   Menouard AZIB   Add parameter id ...
3841
		double *minValuesInterval = dataMin.getValues(errorBarProp.getErrorMinMax()->getIndexMin(), minStartIndex);
fbe3c2bb   Benjamin Renard   First commit
3842

ba6124b0   Menouard AZIB   Add parameter id ...
3843
3844
		// 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
3845

ba6124b0   Menouard AZIB   Add parameter id ...
3846
3847
3848
3849
3850
		// 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
3851

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

		if (nbMaxValues == 0)
		{
			LOG4CXX_DEBUG(gLogger, "PanelPlotOutput::getErrorComputedValuesFromSerieAndInterval - Cannot get min data for error bar");
			delete[](*minComputedValues);
			return false;
		}
8c71f50a   Benjamin Renard   Improve execution...
3862

ba6124b0   Menouard AZIB   Add parameter id ...
3863
		double *maxValuesInterval = dataMax.getValues(errorBarProp.getErrorMinMax()->getIndexMax(), maxStartIndex);
fbe3c2bb   Benjamin Renard   First commit
3864

ba6124b0   Menouard AZIB   Add parameter id ...
3865
3866
		// 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
3867

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

ba6124b0   Menouard AZIB   Add parameter id ...
3871
3872
		return true;
	}
fbe3c2bb   Benjamin Renard   First commit
3873

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

ba6124b0   Menouard AZIB   Add parameter id ...
3881
		if ((lLineColor._colorIndex == -1) &&
fbe3c2bb   Benjamin Renard   First commit
3882
3883
3884
3885
			(lLineColor._red == -1) &&
			(lLineColor._green == -1) &&
			(lLineColor._blue == -1))
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3886
3887
3888
3889
3890
3891
3892
			// 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
3893
			{
ba6124b0   Menouard AZIB   Add parameter id ...
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
				// 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
3904
3905
			}
		}
fbe3c2bb   Benjamin Renard   First commit
3906

ba6124b0   Menouard AZIB   Add parameter id ...
3907
3908
		return lLineColor;
	}
fbe3c2bb   Benjamin Renard   First commit
3909

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

ba6124b0   Menouard AZIB   Add parameter id ...
3917
3918
3919
3920
3921
3922
3923
3924
		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
3925

ba6124b0   Menouard AZIB   Add parameter id ...
3926
3927
		return lSymbolColor;
	}
fbe3c2bb   Benjamin Renard   First commit
3928

ba6124b0   Menouard AZIB   Add parameter id ...
3929
3930
3931
3932
	/**
	 * @brief Configure params legend.
	 */
	void PanelPlotOutput::configureParamsLegend(double startTime, double stopTime, int intervalIndex)
fbe3c2bb   Benjamin Renard   First commit
3933
	{
ba6124b0   Menouard AZIB   Add parameter id ...
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
		_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
3944

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

ba6124b0   Menouard AZIB   Add parameter id ...
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
	/**
	 * @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
3962

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

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

ba6124b0   Menouard AZIB   Add parameter id ...
3972
		if (_panel->_paramsLegendProperties.isIntervalInfoVisible())
fbe3c2bb   Benjamin Renard   First commit
3973
		{
ba6124b0   Menouard AZIB   Add parameter id ...
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
			// 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
3990
		}
fbe3c2bb   Benjamin Renard   First commit
3991

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

ba6124b0   Menouard AZIB   Add parameter id ...
3997
3998
3999
4000
4001
4002
4003
4004
	/*
	 * @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
4005

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

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

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

		return paramLegendText.str();
fbe3c2bb   Benjamin Renard   First commit
4051
	}
ba6124b0   Menouard AZIB   Add parameter id ...
4052
4053
4054
4055
4056

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

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