Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

qwt_plot_curve.cpp

00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- ***************************** 00002 * Qwt Widget Library 00003 * Copyright (C) 1997 Josef Wilgen 00004 * Copyright (C) 2002 Uwe Rathmann 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the Qwt License, Version 1.0 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) // size > 0: check if key exists 00208 { 00209 if (d_curves->find(newkey)) // key size+1 exists => there must be a 00210 // free key <= size 00211 { 00212 // find the first available key <= size 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 // This can't happen. Just paranoia. 00223 if (newkey > long(d_curves->count())) 00224 { 00225 while (!d_curves->find(newkey)) 00226 { 00227 newkey++; 00228 if (newkey > 10000) // prevent infinite loop 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 // Local Variables: 00761 // mode: C++ 00762 // c-file-style: "stroustrup" 00763 // indent-tabs-mode: nil 00764 // End:

Generated on Tue Nov 16 21:12:20 2004 for Qwt User's Guide by doxygen 1.3.8