87
90
void VectorCurve::drawVector(QPainter *painter,
88
91
const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to) const
92
for (int i = from; i <= to; i++)
94
const double x0 = x(i);
95
const double y0 = y(i);
96
const double angle = vectorEnd->x(i);
97
const double mag = vectorEnd->y(i);
99
int xs = 0, ys = 0, xe = 0, ye = 0;
103
xs = xMap.transform(x0);
104
ys = yMap.transform(y0);
105
xe = xMap.transform(x0 + mag*cos(angle));
106
ye = yMap.transform(y0 + mag*sin(angle));
111
double dxh = 0.5*mag*cos(angle);
112
double dyh = 0.5*mag*sin(angle);
113
xs = xMap.transform(x0 - dxh);
114
ys = yMap.transform(y0 - dyh);
115
xe = xMap.transform(x0 + dxh);
116
ye = yMap.transform(y0 + dyh);
94
for (int i = from; i <= to; i++){
95
const double x0 = x(i);
96
const double y0 = y(i);
97
const double angle = vectorEnd->x(i);
98
const double mag = vectorEnd->y(i);
100
int xs = 0, ys = 0, xe = 0, ye = 0;
103
xs = xMap.transform(x0);
104
ys = yMap.transform(y0);
105
xe = xMap.transform(x0 + mag*cos(angle));
106
ye = yMap.transform(y0 + mag*sin(angle));
111
double dxh = 0.5*mag*cos(angle);
112
double dyh = 0.5*mag*sin(angle);
113
xs = xMap.transform(x0 - dxh);
114
ys = yMap.transform(y0 - dyh);
115
xe = xMap.transform(x0 + dxh);
116
ye = yMap.transform(y0 + dyh);
121
xs = xMap.transform(x0 - mag*cos(angle));
122
ys = yMap.transform(y0 - mag*sin(angle));
123
xe = xMap.transform(x0);
124
ye = yMap.transform(y0);
121
xs = xMap.transform(x0 - mag*cos(angle));
122
ys = yMap.transform(y0 - mag*sin(angle));
123
xe = xMap.transform(x0);
124
ye = yMap.transform(y0);
127
QwtPainter::drawLine(painter, xs, ys, xe, ye);
128
drawArrowHead(painter, xs, ys, xe, ye);
127
QwtPainter::drawLine(painter, xs, ys, xe, ye);
128
drawArrowHead(painter, xs, ys, xe, ye);
133
for (int i = from; i <= to; i++)
135
const int xs = xMap.transform(x(i));
136
const int ys = yMap.transform(y(i));
137
const int xe = xMap.transform(vectorEnd->x(i));
138
const int ye = yMap.transform(vectorEnd->y(i));
139
QwtPainter::drawLine(painter, xs, ys, xe, ye);
140
drawArrowHead(painter, xs, ys, xe, ye);
131
for (int i = from; i <= to; i++){
132
const int xs = xMap.transform(x(i));
133
const int ys = yMap.transform(y(i));
134
const int xe = xMap.transform(vectorEnd->x(i));
135
const int ye = yMap.transform(vectorEnd->y(i));
136
QwtPainter::drawLine(painter, xs, ys, xe, ye);
137
drawArrowHead(painter, xs, ys, xe, ye);
218
212
void VectorCurve::setColor(const QColor& c)
220
if (d_pen.color() != c)
214
if (d_pen.color() != c)
224
218
void VectorCurve::setHeadLength(int l)
226
if (d_headLength != l)
220
if (d_headLength != l)
230
224
void VectorCurve::setHeadAngle(int a)
232
if (d_headAngle != a)
226
if (d_headAngle != a)
236
230
void VectorCurve::fillArrowHead(bool fill)
238
if (filledArrow != fill)
232
if (filledArrow != fill)
242
236
QwtDoubleRect VectorCurve::boundingRect() const
244
QwtDoubleRect rect = QwtPlotCurve::boundingRect();
245
QwtDoubleRect vrect = vectorEnd->boundingRect();
247
if (d_style == XYXY){
248
rect.setTop(QMIN((double)rect.top(), (double)vrect.top()));
249
rect.setBottom(QMAX((double)rect.bottom(), (double)vrect.bottom()));
250
rect.setLeft(QMIN((double)rect.left(), (double)vrect.left()));
251
rect.setRight(QMAX((double)rect.right(), (double)vrect.right()));
253
const double angle = vectorEnd->x(0);
254
double mag = vectorEnd->y(0);
258
rect.setTop(QMIN((double)rect.top(), (double)(rect.top()+mag*sin(angle))));
259
rect.setBottom(QMAX((double)rect.bottom(), (double)(rect.bottom()+mag*sin(angle))));
260
rect.setLeft(QMIN((double)rect.left(), (double)(rect.left()+mag*cos(angle))));
261
rect.setRight(QMAX((double)rect.right(), (double)(rect.right()+mag*cos(angle))));
238
QwtDoubleRect rect = QwtPlotCurve::boundingRect();
242
QwtDoubleRect vrect = vectorEnd->boundingRect();
244
if (d_style == XYXY){
245
rect.setTop(QMIN((double)rect.top(), (double)vrect.top()));
246
rect.setBottom(QMAX((double)rect.bottom(), (double)vrect.bottom()));
247
rect.setLeft(QMIN((double)rect.left(), (double)vrect.left()));
248
rect.setRight(QMAX((double)rect.right(), (double)vrect.right()));
250
const double angle = vectorEnd->x(0);
251
double mag = vectorEnd->y(0);
267
rect.setTop(QMIN((double)rect.top(), (double)(rect.top() - fabs(mag*sin(angle)))));
268
rect.setBottom(QMAX((double)rect.bottom(), (double)(rect.bottom() + fabs(mag*sin(angle)))));
269
rect.setLeft(QMIN((double)rect.left(), (double)(rect.left() - fabs(mag*cos(angle)))));
270
rect.setRight(QMAX((double)rect.right(), (double)(rect.right() + fabs(mag*cos(angle)))));
255
rect.setTop(QMIN((double)rect.top(), (double)(rect.top()+mag*sin(angle))));
256
rect.setBottom(QMAX((double)rect.bottom(), (double)(rect.bottom()+mag*sin(angle))));
257
rect.setLeft(QMIN((double)rect.left(), (double)(rect.left()+mag*cos(angle))));
258
rect.setRight(QMAX((double)rect.right(), (double)(rect.right()+mag*cos(angle))));
264
rect.setTop(QMIN((double)rect.top(), (double)(rect.top() - fabs(mag*sin(angle)))));
265
rect.setBottom(QMAX((double)rect.bottom(), (double)(rect.bottom() + fabs(mag*sin(angle)))));
266
rect.setLeft(QMIN((double)rect.left(), (double)(rect.left() - fabs(mag*cos(angle)))));
267
rect.setRight(QMAX((double)rect.right(), (double)(rect.right() + fabs(mag*cos(angle)))));
272
rect.setTop(QMIN((double)rect.top(), (double)(rect.top() - mag*sin(angle))));
273
rect.setBottom(QMAX((double)rect.bottom(), (double)(rect.bottom() - mag*sin(angle))));
274
rect.setLeft(QMIN((double)rect.left(), (double)(rect.left() - mag*cos(angle))));
275
rect.setRight(QMAX((double)rect.right(), (double)(rect.right() - mag*cos(angle))));
275
rect.setTop(QMIN((double)rect.top(), (double)(rect.top() - mag*sin(angle))));
276
rect.setBottom(QMAX((double)rect.bottom(), (double)(rect.bottom() - mag*sin(angle))));
277
rect.setLeft(QMIN((double)rect.left(), (double)(rect.left() - mag*cos(angle))));
278
rect.setRight(QMAX((double)rect.right(), (double)(rect.right() - mag*cos(angle))));
285
282
void VectorCurve::updateColumnNames(const QString& oldName, const QString& newName, bool updateTableName)
316
QString VectorCurve::plotAssociation()
313
QStringList VectorCurve::plotAssociation()
318
QString base = d_x_column + "(X)," + title().text() + "(Y)," + d_end_x_a;
320
base += "(A)," + d_end_y_m + "(M)";
322
base += "(X)," + d_end_y_m + "(Y)";
324
if (!d_labels_column.isEmpty())
325
base += "," + d_labels_column + "(L)";
315
QStringList lst = QStringList() << d_x_column + "(X)" << title().text() + "(Y)";
317
lst << d_end_x_a + "(A)" << d_end_y_m + "(M)";
319
lst << d_end_x_a + "(X)" << d_end_y_m + "(Y)";
321
if (!d_labels_column.isEmpty())
322
lst << d_labels_column + "(L)";
330
327
bool VectorCurve::updateData(Table *t, const QString& colName)
340
337
void VectorCurve::loadData()
345
342
int xcol = d_table->colIndex(d_x_column);
346
343
int ycol = d_table->colIndex(title().text());
347
int endXCol = d_table->colIndex(d_end_x_a);
348
int endYCol = d_table->colIndex(d_end_y_m);
344
int endXCol = d_table->colIndex(d_end_x_a.replace("_ ", "_"));
345
int endYCol = d_table->colIndex(d_end_y_m.replace("_ ", "_"));
350
347
int rows = abs(d_end_row - d_start_row) + 1;
351
QVector<double> X(rows), Y(rows), X2(rows), Y2(rows);
353
QLocale locale = ((Graph *)plot())->multiLayer()->locale();
348
QVector<double> X(rows), Y(rows), X2(rows), Y2(rows);
350
QLocale locale = ((Graph *)plot())->multiLayer()->locale();
354
351
for (int i = d_start_row; i <= d_end_row; i++){
355
352
QString xval = d_table->text(i, xcol);
356
353
QString yval = d_table->text(i, ycol);
357
354
QString xend = d_table->text(i, endXCol);
358
355
QString yend = d_table->text(i, endYCol);
359
356
if (!xval.isEmpty() && !yval.isEmpty() && !xend.isEmpty() && !yend.isEmpty()){
360
bool valid_data = true;
357
bool valid_data = true;
361
358
X[size] = locale.toDouble(xval, &valid_data);
364
Y[size] = locale.toDouble(yval, &valid_data);
361
Y[size] = locale.toDouble(yval, &valid_data);
367
364
X2[size] = locale.toDouble(xend, &valid_data);
370
Y2[size] = locale.toDouble(yend, &valid_data);
367
Y2[size] = locale.toDouble(yend, &valid_data);
379
X.resize(size); Y.resize(size); X2.resize(size); Y2.resize(size);
376
X.resize(size); Y.resize(size); X2.resize(size); Y2.resize(size);
380
377
setData(X.data(), Y.data(), size);
381
foreach(DataCurve *c, d_error_bars)
382
c->setData(X.data(), Y.data(), size);
378
foreach(ErrorBarsCurve *c, d_error_bars)
379
c->setData(X.data(), Y.data(), size);
383
380
setVectorEnd(X2, Y2);
386
383
VectorCurve::~VectorCurve()