00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include "qwt_plot.h"
00013
#include "qwt_plot_dict.h"
00014
#include "qwt_math.h"
00015
00017 QwtPlotMarkerIterator
QwtPlot::markerIterator()
const
00018
{
00019
return QwtPlotMarkerIterator(*d_markers);
00020 }
00021
00029 long QwtPlot::closestMarker(
int xpos,
int ypos,
int &dist)
const
00030
{
00031
QwtDiMap map[axisCnt];
00032
for (
int axis = 0; axis < axisCnt; axis++ )
00033 map[axis] =
canvasMap(axis);
00034
00035
long rv = 0;
00036
double dmin = 1.0e10;
00037
00038 QwtPlotMarkerIterator itm =
markerIterator();
00039
for (
QwtPlotMarker *m = itm.toFirst(); m != 0; m = ++itm )
00040 {
00041
double cx = map[m->
xAxis()].
xTransform(m->
xValue());
00042
double cy = map[m->
yAxis()].xTransform(m->
yValue());
00043
00044
if (m->
lineStyle() == QwtMarker::HLine)
00045 {
00046
if (m->
symbol().
style() == QwtSymbol::None)
00047 cx = double(xpos);
00048 }
00049
else if (m->
lineStyle() == QwtMarker::VLine)
00050 {
00051
if (m->
symbol().
style() == QwtSymbol::None)
00052 cy = double(ypos);
00053 }
00054
00055
double f =
qwtSqr(cx -
double(xpos)) +
qwtSqr(cy -
double(ypos));
00056
if (f < dmin)
00057 {
00058 dmin = f;
00059 rv = itm.currentKey();
00060 }
00061 }
00062
00063 dist = int(sqrt(dmin));
00064
return rv;
00065 }
00066
00068
long QwtPlot::newMarkerKey()
00069 {
00070
long newkey = d_markers->count() + 1;
00071
00072
if (newkey > 1)
00073 {
00074
if (d_markers->find(newkey))
00075
00076 {
00077
00078 newkey = 1;
00079
while (newkey <= long(d_markers->count()))
00080 {
00081
if (d_markers->find(newkey))
00082 newkey++;
00083
else
00084
break;
00085 }
00086
00087
00088
if (newkey > long(d_markers->count()))
00089 {
00090
while (!d_markers->find(newkey))
00091 {
00092 newkey++;
00093
if (newkey > 10000)
00094 {
00095 newkey = 0;
00096
break;
00097 }
00098 }
00099 }
00100 }
00101 }
00102
return newkey;
00103
00104 }
00105
00113 long QwtPlot::insertLineMarker(
const QString &label,
int axis)
00114 {
00115 QwtMarker::LineStyle lineStyle = QwtMarker::NoLine;
00116
int xAxis = QwtPlot::xBottom;
00117
int yAxis = QwtPlot::yLeft;
00118
00119
switch(axis)
00120 {
00121
case yLeft:
00122
case yRight:
00123 yAxis = axis;
00124 lineStyle = QwtMarker::HLine;
00125
break;
00126
case xTop:
00127
case xBottom:
00128 xAxis = axis;
00129 lineStyle = QwtMarker::VLine;
00130
break;
00131 }
00132
00133
QwtPlotMarker *
marker =
new QwtPlotMarker(
this);
00134
if ( marker == 0 )
00135
return 0;
00136
00137 marker->
setAxis(xAxis, yAxis);
00138 marker->
setLabel(label);
00139 marker->
setLineStyle(lineStyle);
00140 marker->
setLabelAlignment(Qt::AlignRight|Qt::AlignTop);
00141
00142
long key =
insertMarker(marker);
00143
if ( key == 0 )
00144
delete marker;
00145
00146
return key;
00147 }
00148
00156 long QwtPlot::insertMarker(
const QString &label,
int xAxis,
int yAxis)
00157 {
00158
QwtPlotMarker *
marker =
new QwtPlotMarker(
this);
00159
if ( marker == 0 )
00160
return 0;
00161
00162 marker->
setAxis(xAxis, yAxis);
00163 marker->
setLabel(label);
00164
00165
long key =
insertMarker(marker);
00166
if ( key == 0 )
00167
delete marker;
00168
00169
return key;
00170 }
00171
00177 long QwtPlot::insertMarker(
QwtPlotMarker *marker)
00178 {
00179
if ( marker == 0 )
00180
return 0;
00181
00182
long key = newMarkerKey();
00183
if ( key == 0 )
00184
return 0;
00185
00186 marker->
reparent(
this);
00187 d_markers->insert(key, marker);
00188
00189
autoRefresh();
00190
00191
return key;
00192 }
00193
00200 QwtPlotMarker *
QwtPlot::marker(
long key)
00201 {
00202
return d_markers->find(key);
00203 }
00204
00211 const QwtPlotMarker *
QwtPlot::marker(
long key)
const
00212
{
00213
return d_markers->find(key);
00214 }
00215
00219 QwtArray<long>
QwtPlot::markerKeys()
const
00220
{
00221 QwtArray<long> keys(d_markers->count());
00222
00223
int i = 0;
00224
00225 QwtPlotMarkerIterator itm =
markerIterator();
00226
for (
const QwtPlotMarker *m = itm.toFirst(); m != 0; m = ++itm, i++ )
00227 keys[i] = itm.currentKey();
00228
00229
return keys;
00230 }
00231
00235 QFont
QwtPlot::markerFont(
long key)
const
00236
{
00237
QwtPlotMarker *m = d_markers->find(key);
00238
if (m)
00239
return m->
font();
00240
else
00241
return QFont();
00242 }
00243
00248 const QString
QwtPlot::markerLabel(
long key)
const
00249
{
00250
QwtPlotMarker *m = d_markers->find(key);
00251
if (m)
00252
return m->
label();
00253
else
00254
return QString::null;
00255 }
00256
00261 int QwtPlot::markerLabelAlign(
long key)
const
00262
{
00263
QwtPlotMarker *m = d_markers->find(key);
00264
if (m)
00265
return m->
labelAlignment();
00266
else
00267
return 0;
00268 }
00269
00274 QPen
QwtPlot::markerLabelPen(
long key)
const
00275
{
00276
QwtPlotMarker *m = d_markers->find(key);
00277
if (m)
00278
return m->
labelPen();
00279
else
00280
return QPen();
00281
00282 }
00283
00288 QPen
QwtPlot::markerLinePen(
long key)
const
00289
{
00290
QwtPlotMarker *m = d_markers->find(key);
00291
if (m)
00292
return m->
linePen();
00293
else
00294
return QPen();
00295
00296 }
00297
00302 QwtMarker::LineStyle
QwtPlot::markerLineStyle(
long key)
const
00303
{
00304
QwtPlotMarker *m = d_markers->find(key);
00305
if (m)
00306
return m->
lineStyle();
00307
else
00308
return QwtMarker::NoLine;
00309 }
00310
00318 void QwtPlot::markerPos(
long key,
double &mx,
double &my )
const
00319
{
00320
QwtPlotMarker *m = d_markers->find(key);
00321
if (m)
00322 {
00323 mx = m->
xValue();
00324 my = m->
yValue();
00325 }
00326
else
00327 {
00328 mx = 0;
00329 my = 0;
00330 }
00331 }
00332
00337 QwtSymbol QwtPlot::markerSymbol(
long key)
const
00338
{
00339
QwtPlotMarker *m = d_markers->find(key);
00340
if (m)
00341
return m->
symbol();
00342
else
00343
return QwtSymbol();
00344 }
00345
00346
00351 int QwtPlot::markerXAxis(
long key)
const
00352
{
00353
QwtPlotMarker *m = d_markers->find(key);
00354
if (m)
00355
return m->
xAxis();
00356
else
00357
return -1;
00358
00359 }
00360
00361
00366 int QwtPlot::markerYAxis(
long key)
const
00367
{
00368
QwtPlotMarker *m = d_markers->find(key);
00369
if (m)
00370
return m->
yAxis();
00371
else
00372
return -1;
00373
00374 }
00375
00380 bool QwtPlot::removeMarker(
long key)
00381 {
00382
if (d_markers->remove(key))
00383 {
00384
autoRefresh();
00385
return TRUE;
00386 }
00387
else
00388
return FALSE;
00389 }
00390
00391
00396 bool QwtPlot::setMarkerXAxis(
long key,
int axis)
00397 {
00398
QwtPlotMarker *m;
00399
if ((m = d_markers->find(key)))
00400 {
00401 m->
setXAxis(axis);
00402
return TRUE;
00403 }
00404
else
00405
return FALSE;
00406 }
00407
00414 bool QwtPlot::setMarkerYAxis(
long key,
int axis)
00415 {
00416
QwtPlotMarker *m;
00417
if ((m = d_markers->find(key)))
00418 {
00419 m->
setYAxis(axis);
00420
return TRUE;
00421 }
00422
else
00423
return FALSE;
00424 }
00425
00432 bool QwtPlot::setMarkerFont(
long key,
const QFont &f)
00433 {
00434
int rv = FALSE;
00435
00436
QwtPlotMarker *m;
00437
if ((m = d_markers->find(key)))
00438 {
00439 m->
setFont(f);
00440 rv = TRUE;
00441 }
00442
return rv;
00443 }
00444
00451 bool QwtPlot::setMarkerLinePen(
long key,
const QPen &p)
00452 {
00453
int rv = FALSE;
00454
00455
QwtPlotMarker *m;
00456
if ((m = d_markers->find(key)))
00457 {
00458 m->
setLinePen(p);
00459 rv = TRUE;
00460 }
00461
return rv;
00462
00463 }
00464
00465
00473 bool QwtPlot::setMarkerLineStyle(
long key, QwtMarker::LineStyle st)
00474 {
00475
int rv = FALSE;
00476
QwtPlotMarker *m;
00477
if ((m = d_markers->find(key)))
00478 {
00479 m->
setLineStyle(st);
00480 rv = TRUE;
00481 }
00482
return rv;
00483 }
00484
00491 bool QwtPlot::setMarkerPen(
long key,
const QPen &p)
00492 {
00493
int rv = FALSE;
00494
00495
QwtPlotMarker *m;
00496
if ((m = d_markers->find(key)))
00497 {
00498 m->
setLinePen(p);
00499 m->
setLabelPen(p);
00500 rv = TRUE;
00501 }
00502
return rv;
00503 }
00504
00505
00513 bool QwtPlot::setMarkerPos(
long key,
double xval,
double yval)
00514 {
00515
int rv = FALSE;
00516
00517
QwtPlotMarker *m;
00518
if ((m = d_markers->find(key)))
00519 {
00520 m->
setXValue(xval);
00521 m->
setYValue(yval);
00522 rv = TRUE;
00523 }
00524
return rv;
00525 }
00526
00533 bool QwtPlot::setMarkerXPos(
long key,
double val)
00534 {
00535
int rv = FALSE;
00536
00537
QwtPlotMarker *m;
00538
if ((m = d_markers->find(key)))
00539 {
00540 m->
setXValue(val);
00541 rv = TRUE;
00542 }
00543
return rv;
00544 }
00545
00552 bool QwtPlot::setMarkerYPos(
long key,
double val)
00553 {
00554
int rv = FALSE;
00555
00556
QwtPlotMarker *m;
00557
if ((m = d_markers->find(key)))
00558 {
00559 m->
setYValue(val);
00560 rv = TRUE;
00561 }
00562
return rv;
00563 }
00564
00571 bool QwtPlot::setMarkerSymbol(
long key,
const QwtSymbol &s)
00572 {
00573
int rv = FALSE;
00574
QwtPlotMarker *m;
00575
if ((m = d_markers->find(key)))
00576 {
00577 m->
setSymbol(s);
00578 rv = TRUE;
00579 }
00580
return rv;
00581 }
00582
00589 bool QwtPlot::setMarkerLabelText(
long key,
const QString &text)
00590 {
00591
QwtPlotMarker *m;
00592
if ((m = d_markers->find(key)))
00593 {
00594 m->
setLabelText(text);
00595
return TRUE;
00596 }
00597
return FALSE;
00598 }
00599
00610 bool QwtPlot::setMarkerLabel(
long key,
const QString &text,
const QFont &font,
00611
const QColor &color,
const QPen &pen,
const QBrush &brush)
00612 {
00613
QwtPlotMarker *m;
00614
if ((m = d_markers->find(key)))
00615 {
00616 m->
setLabel(text, font, color, pen, brush);
00617
return TRUE;
00618 }
00619
return FALSE;
00620 }
00621
00633 bool QwtPlot::setMarkerLabelAlign(
long key,
int align)
00634 {
00635
int rv = FALSE;
00636
QwtPlotMarker *m;
00637
if ((m = d_markers->find(key)))
00638 {
00639 m->
setLabelAlignment(align);
00640 rv = TRUE;
00641 }
00642
return rv;
00643 }
00644
00651 bool QwtPlot::setMarkerLabelPen(
long key,
const QPen &p)
00652 {
00653
int rv = FALSE;
00654
QwtPlotMarker *m;
00655
if ((m = d_markers->find(key)))
00656 {
00657 m->
setLabelPen(p);
00658 rv = TRUE;
00659 }
00660
return rv;
00661 }
00662
00663
00664
00665