00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "qwt_plot.h"
00011 #include "qwt_plot_dict.h"
00012 #include "qwt_math.h"
00013 #include "qwt_legend.h"
00014
00016 QwtPlotCurveIterator QwtPlot::curveIterator() const
00017 {
00018 return QwtPlotCurveIterator(*d_curves);
00019 }
00020
00030 long QwtPlot::closestCurve(int xpos, int ypos, int &dist) const
00031 {
00032 double x,y;
00033 int index;
00034 return closestCurve(xpos, ypos, dist, x,y, index);
00035 }
00036
00050 long QwtPlot::closestCurve(int xpos, int ypos, int &dist, double &xval,
00051 double &yval, int &index) const
00052 {
00053 QwtDiMap map[axisCnt];
00054 for ( int axis = 0; axis < axisCnt; axis++ )
00055 map[axis] = canvasMap(axis);
00056
00057 long rv = 0;
00058 double dmin = 1.0e10;
00059
00060 QwtPlotCurveIterator itc = curveIterator();
00061 for (QwtPlotCurve *c = itc.toFirst(); c != 0; c = ++itc )
00062 {
00063 for (int i=0; i<c->dataSize(); i++)
00064 {
00065 double cx = map[c->xAxis()].xTransform(c->x(i)) - double(xpos);
00066 double cy = map[c->yAxis()].xTransform(c->y(i)) - double(ypos);
00067
00068 double f = qwtSqr(cx) + qwtSqr(cy);
00069 if (f < dmin)
00070 {
00071 dmin = f;
00072 rv = itc.currentKey();
00073 xval = c->x(i);
00074 yval = c->y(i);
00075 index = i;
00076 }
00077 }
00078 }
00079
00080 dist = int(sqrt(dmin));
00081 return rv;
00082 }
00083
00084
00085
00091 int QwtPlot::curveStyle(long key) const
00092 {
00093 QwtPlotCurve *c = d_curves->find(key);
00094 return c ? c->style() : 0;
00095 }
00096
00103 QwtSymbol QwtPlot::curveSymbol(long key) const
00104 {
00105 QwtPlotCurve *c = d_curves->find(key);
00106 return c ? c->symbol() : QwtSymbol();
00107 }
00108
00113 QPen QwtPlot::curvePen(long key) const
00114 {
00115 QwtPlotCurve *c = d_curves->find(key);
00116 return c ? c->pen() : QPen();
00117 }
00118
00124 QBrush QwtPlot::curveBrush(long key) const
00125 {
00126 QwtPlotCurve *c = d_curves->find(key);
00127 return c ? c->brush() : QBrush();
00128 }
00133 int QwtPlot::curveOptions(long key) const
00134 {
00135 QwtPlotCurve *c = d_curves->find(key);
00136 return c ? c->options() : 0;
00137 }
00138
00143 int QwtPlot::curveSplineSize(long key) const
00144 {
00145 QwtPlotCurve *c = d_curves->find(key);
00146 return c ? c->splineSize() : 0;
00147 }
00148
00153 QString QwtPlot::curveTitle(long key) const
00154 {
00155 QwtPlotCurve *c = d_curves->find(key);
00156 return c ? c->title() : QString::null;
00157 }
00158
00162 QwtArray<long> QwtPlot::curveKeys() const
00163 {
00164 QwtArray<long> keys(d_curves->count());
00165
00166 int i = 0;
00167
00168 QwtPlotCurveIterator itc = curveIterator();
00169 for (const QwtPlotCurve *c = itc.toFirst(); c != 0; c = ++itc, i++ )
00170 keys[i] = itc.currentKey();
00171
00172 return keys;
00173 }
00174
00180 int QwtPlot::curveXAxis(long key) const
00181 {
00182 QwtPlotCurve *c = d_curves->find(key);
00183 return c ? c->xAxis() : -1;
00184 }
00185
00186
00192 int QwtPlot::curveYAxis(long key) const
00193 {
00194 QwtPlotCurve *c = d_curves->find(key);
00195 return c ? c->yAxis() : -1;
00196 }
00197
00198
00203 long QwtPlot::newCurveKey()
00204 {
00205 long newkey = d_curves->count() + 1;
00206
00207 if (newkey > 1)
00208 {
00209 if (d_curves->find(newkey))
00210
00211 {
00212
00213 newkey = 1;
00214 while (newkey <= long(d_curves->count()))
00215 {
00216 if (d_curves->find(newkey))
00217 newkey++;
00218 else
00219 break;
00220 }
00221
00222
00223 if (newkey > long(d_curves->count()))
00224 {
00225 while (!d_curves->find(newkey))
00226 {
00227 newkey++;
00228 if (newkey > 10000)
00229 {
00230 newkey = 0;
00231 break;
00232 }
00233 }
00234 }
00235 }
00236 }
00237 return newkey;
00238 }
00239
00247 long QwtPlot::insertCurve(QwtPlotCurve *curve)
00248 {
00249 if (curve == 0)
00250 return 0;
00251
00252 long key = newCurveKey();
00253 if (key == 0)
00254 return 0;
00255
00256 curve->reparent(this);
00257
00258 d_curves->insert(key, curve);
00259 if (d_autoLegend)
00260 {
00261 insertLegendItem(key);
00262 updateLayout();
00263 }
00264
00265 return key;
00266 }
00267
00276 long QwtPlot::insertCurve(const QString &title, int xAxis, int yAxis)
00277 {
00278 QwtPlotCurve *curve = new QwtPlotCurve(this);
00279 if (!curve)
00280 return 0;
00281
00282 curve->setAxis(xAxis, yAxis);
00283 curve->setTitle(title);
00284
00285 long key = insertCurve(curve);
00286 if ( key == 0 )
00287 delete curve;
00288
00289 return key;
00290 }
00291
00297 QwtPlotCurve *QwtPlot::curve(long key)
00298 {
00299 return d_curves->find(key);
00300 }
00301
00307 const QwtPlotCurve *QwtPlot::curve(long key) const
00308 {
00309 return d_curves->find(key);
00310 }
00311
00312
00317 bool QwtPlot::removeCurve(long key)
00318 {
00319 bool ok = d_curves->remove(key);
00320 if ( !ok )
00321 return FALSE;
00322
00323 QWidget *item = d_legend->findItem(key);
00324 if ( item )
00325 {
00326 delete item;
00327 updateLayout();
00328 }
00329
00330 autoRefresh();
00331 return TRUE;
00332 }
00333
00340 bool QwtPlot::setCurvePen(long key, const QPen &pen)
00341 {
00342 QwtPlotCurve *c = d_curves->find(key);
00343 if ( !c )
00344 return FALSE;
00345
00346 c->setPen(pen);
00347 updateLegendItem(key);
00348
00349 return TRUE;
00350 }
00351
00362 bool QwtPlot::setCurveBrush(long key, const QBrush &brush)
00363 {
00364 QwtPlotCurve *c = d_curves->find(key);
00365 if ( !c )
00366 return FALSE;
00367
00368 c->setBrush(brush);
00369 updateLegendItem(key);
00370
00371 return TRUE;
00372 }
00373
00380 bool QwtPlot::setCurveSymbol(long key, const QwtSymbol &symbol)
00381 {
00382 QwtPlotCurve *c = d_curves->find(key);
00383 if ( !c )
00384 return FALSE;
00385
00386 c->setSymbol(symbol);
00387 updateLegendItem(key);
00388
00389 return TRUE;
00390 }
00391
00407 bool QwtPlot::setCurveRawData(long key,
00408 const double *xData, const double *yData, int size)
00409 {
00410 QwtPlotCurve *c = d_curves->find(key);
00411 if ( !c )
00412 return FALSE;
00413
00414 c->setRawData(xData, yData, size);
00415 return TRUE;
00416 }
00417
00424 bool QwtPlot::setCurveTitle(long key, const QString &title)
00425 {
00426 QwtPlotCurve *c = d_curves->find(key);
00427 if ( !c )
00428 return FALSE;
00429
00430 c->setTitle(title);
00431 updateLegendItem(key);
00432
00433 return TRUE;
00434 }
00435
00449 bool QwtPlot::setCurveData(long key,
00450 const double *xData, const double *yData, int size)
00451 {
00452 QwtPlotCurve *c = d_curves->find(key);
00453 if ( !c )
00454 return FALSE;
00455
00456 c->setData(xData, yData, size);
00457 return TRUE;
00458 }
00459
00468 bool QwtPlot::setCurveData(long key,
00469 const QwtArray<double> &xData, const QwtArray<double> &yData)
00470 {
00471 QwtPlotCurve *c = d_curves->find(key);
00472 if ( !c )
00473 return FALSE;
00474
00475 c->setData(xData, yData);
00476 return TRUE;
00477 }
00478
00486 bool QwtPlot::setCurveData(long key, const QwtArray<QwtDoublePoint> &data)
00487 {
00488 QwtPlotCurve *c = d_curves->find(key);
00489 if ( !c )
00490 return FALSE;
00491
00492 c->setData(data);
00493 return TRUE;
00494 }
00495
00503 bool QwtPlot::setCurveData(long key, const QwtData &data)
00504 {
00505 QwtPlotCurve *c = d_curves->find(key);
00506 if ( !c )
00507 return FALSE;
00508
00509 c->setData(data);
00510 return TRUE;
00511 }
00512
00521 bool QwtPlot::setCurveStyle(long key, int s, int options)
00522 {
00523 QwtPlotCurve *c = d_curves->find(key);
00524 if ( !c )
00525 return FALSE;
00526
00527 c->setStyle(s, options);
00528 updateLegendItem(key);
00529
00530 return TRUE;
00531 }
00532
00540 bool QwtPlot::setCurveOptions(long key, int opt)
00541 {
00542 QwtPlotCurve *c = d_curves->find(key);
00543 if ( !c )
00544 return FALSE;
00545
00546 c->setOptions(opt);
00547 return TRUE;
00548 }
00549
00556 bool QwtPlot::setCurveSplineSize(long key, int s)
00557 {
00558 QwtPlotCurve *c = d_curves->find(key);
00559 if ( !c )
00560 return FALSE;
00561
00562 c->setSplineSize(s);
00563 return TRUE;
00564 }
00565
00566
00573 bool QwtPlot::setCurveXAxis(long key, int axis)
00574 {
00575 QwtPlotCurve *c = d_curves->find(key);
00576 if ( !c )
00577 return FALSE;
00578
00579 c->setXAxis(axis);
00580 return TRUE;
00581 }
00582
00589 bool QwtPlot::setCurveYAxis(long key, int axis)
00590 {
00591 QwtPlotCurve *c = d_curves->find(key);
00592 if ( !c )
00593 return FALSE;
00594
00595 c->setYAxis(axis);
00596 return TRUE;
00597 }
00598
00599
00609 bool QwtPlot::setCurveBaseline(long key, double ref)
00610 {
00611 QwtPlotCurve *c = d_curves->find(key);
00612 if ( !c )
00613 return FALSE;
00614
00615 c->setBaseline(ref);
00616 return TRUE;
00617 }
00618
00626 double QwtPlot::curveBaseline(long key) const
00627 {
00628 double rv = 0.0;
00629 QwtPlotCurve *c;
00630 if ((c = d_curves->find(key)))
00631 rv = c->baseline();
00632 return rv;
00633 }
00634
00644 void QwtPlot::insertLegendItem(long curveKey)
00645 {
00646 if ( d_legend->isReadOnly() )
00647 {
00648 QwtLegendLabel *label =
00649 new QwtLegendLabel(d_legend->contentsWidget());
00650 d_legend->insertItem(label, curveKey);
00651 }
00652 else
00653 {
00654 QwtLegendButton *button =
00655 new QwtLegendButton(d_legend->contentsWidget());
00656 connect(button, SIGNAL(clicked()), SLOT(lgdClicked()));
00657
00658 d_legend->insertItem(button, curveKey);
00659 }
00660
00661 updateLegendItem(curveKey);
00662 }
00663
00669 void QwtPlot::updateLegendItem(long curveKey)
00670 {
00671 const QwtPlotCurve *curve = d_curves->find(curveKey);
00672 if ( !curve )
00673 return;
00674
00675 QWidget *item = d_legend->findItem(curveKey);
00676 if (item && item->inherits("QwtLegendButton"))
00677 {
00678 QwtLegendButton *button = (QwtLegendButton *)item;
00679
00680 const bool doUpdate = button->isUpdatesEnabled();
00681 button->setUpdatesEnabled(FALSE);
00682
00683 updateLegendItem(curve, button);
00684
00685 button->setUpdatesEnabled(doUpdate);
00686 button->update();
00687 }
00688 if (item && item->inherits("QwtLegendLabel"))
00689 {
00690 QwtLegendLabel *label = (QwtLegendLabel *)item;
00691
00692 const bool doUpdate = label->isUpdatesEnabled();
00693 label->setUpdatesEnabled(FALSE);
00694
00695 updateLegendItem(curve, label);
00696
00697 label->setUpdatesEnabled(doUpdate);
00698 label->update();
00699 }
00700 }
00701
00708 void QwtPlot::updateLegendItem(
00709 const QwtPlotCurve *curve, QwtLegendItem *item)
00710 {
00711 if ( !curve || !item )
00712 return;
00713
00714 int policy = d_legend->displayPolicy();
00715
00716 if (policy == QwtLegend::Fixed)
00717 {
00718 int mode = d_legend->identifierMode();
00719
00720 if (mode & QwtLegendButton::ShowLine)
00721 item->setCurvePen(curve->pen());
00722
00723 if (mode & QwtLegendButton::ShowSymbol)
00724 item->setSymbol(curve->symbol());
00725
00726 if (mode & QwtLegendButton::ShowText)
00727 item->setTitle(curve->title());
00728 else
00729 item->setTitle(QString::null);
00730
00731 item->setIdentifierMode(mode);
00732 }
00733 else if (policy == QwtLegend::Auto)
00734 {
00735 int mode = 0;
00736
00737 if (QwtCurve::NoCurve != curve->style())
00738 {
00739 item->setCurvePen(curve->pen());
00740 mode |= QwtLegendButton::ShowLine;
00741 }
00742 if (QwtSymbol::None != curve->symbol().style())
00743 {
00744 item->setSymbol(curve->symbol());
00745 mode |= QwtLegendButton::ShowSymbol;
00746 }
00747 if ( !curve->title().isEmpty() )
00748 {
00749 item->setTitle(curve->title());
00750 mode |= QwtLegendButton::ShowText;
00751 }
00752 else
00753 {
00754 item->setTitle(QString::null);
00755 }
00756 item->setIdentifierMode(mode);
00757 }
00758 }
00759
00760
00761
00762
00763
00764