DAWorkbench 0.0.1
DAWorkbench API
载入中...
搜索中...
未找到
DAChartUtil.h
1#ifndef DACHARTUTIL_H
2#define DACHARTUTIL_H
3#include "DAFigureAPI.h"
4#include <QColor>
5#include <QFont>
6#include <QVector>
7#include <QRectF>
8#include "qwt_date.h"
9#include "qwt_plot.h"
10#include "qwt_symbol.h"
11#include "qwt_plot_item.h"
12#include <QPainterPath>
13#include <QList>
14#include "qwt_series_store.h"
15
16#include "qwt_plot_barchart.h"
17#include "qwt_plot_histogram.h"
18#include "qwt_plot_intervalcurve.h"
19#include "qwt_plot_multi_barchart.h"
20#include "qwt_plot_scaleitem.h"
21#include "qwt_plot_spectrocurve.h"
22#include "qwt_plot_tradingcurve.h"
23#include "qwt_plot_spectrogram.h"
24class QwtFigure;
25class QwtPlotItem;
26class QwtScaleDraw;
27class QwtDateScaleDraw;
28class QwtPlotCurve;
29class QwtPlotBarChart;
30namespace DA
31{
35class DAFIGURE_API DAChartUtil
36{
37public:
38 // 获取一个默认的绘图名称
39 static QString plotTitle(const QwtPlot* plot, const QwtFigure* fig);
40 // QwtPlotItem的名字
41 static QString plotItemName(const QwtPlotItem* item);
42 // QwtPlotItem的图标
43 static QIcon plotItemIcon(const QwtPlotItem* item);
44
45 // 更加强制的replot,就算设置为不实时刷新也能实现重绘
46 void replot(QwtPlot* chart);
47
48 // 根据筛选set获取item list
49 static QwtPlotItemList filterPlotItem(const QwtPlot* chart, const QSet< int >& enableRtti);
50
51 // 获取当前正在显示的区域
52 static QRectF getVisibleRegionRang(QwtPlot* chart);
53
54 // 获取当前正在显示的区域
55 static QRectF getVisibleRegionRang(QwtPlot* chart, int xAxis, int yAxis);
56
58 // 动态获取item的颜色,使用dynamic_cast,需要注意效率问题
59 static QColor dynamicGetItemColor(const QwtPlotItem* item, const QColor& defaultColor = Qt::black);
60
61 // 动态获取可绘图的item,使用dynamic_cast,需要注意效率问题
62 static QwtPlotItemList dynamicGetPlotChartItemList(const QwtPlot* chart);
63
64 // 动态判断是否是绘图item,使用dynamic_cast,需要注意效率问题
65 static bool dynamicCheckIsPlotChartItem(const QwtPlotItem* item);
66
67 // 动态获取XY series item,使用dynamic_cast,需要注意效率问题
68 static QwtPlotItemList dynamicGetXYSeriesItemList(const QwtPlot* chart);
69
70 // 动态获取plot chart item的数据点数,如果不是plot chart item,返回-1,使用dynamic_cast,需要注意效率问题
71 static int dynamicGetPlotChartItemDataCount(const QwtPlotItem* item);
72
74 // 确定是否为绘图item,例如QwtPlotItem::Rtti_PlotCurve就属于曲线属于绘图,例如QwtPlotItem::Rtti_PlotBarChart也属于绘图,
75 // 但QwtPlotItem::Rtti_PlotGrid和QwtPlotItem::Rtti_PlotMarker就不属于
76 static bool isPlotGraphicsItem(QwtPlotItem* item);
77 // 通过rtti获取item的颜色
78 static bool setPlotItemColor(QwtPlotItem* item, const QColor& color);
79 static QColor getPlotItemColor(const QwtPlotItem* item);
80 // 获取item的颜色
81 static QBrush getPlotItemBrush(const QwtPlotItem* item);
82 // 通过rtti获取可绘图的item,
83 static QwtPlotItemList getPlotChartItemList(const QwtPlot* chart);
84
85 // 通过rtti判断是否是绘图item
86 static bool checkIsPlotChartItem(const QwtPlotItem* item);
87
88 // 通过rtti获取XY series item
89 static QwtPlotItemList getXYSeriesItemList(const QwtPlot* chart);
90
91 // 通过rtti判断是否是XY series item
92 static bool checkIsXYSeriesItem(const QwtPlotItem* item);
93
94 // 通过rtti获取所有plot的数据范围,并做并集
95 static void
96 dataRange(const QwtPlot* chart, QwtInterval* yLeft, QwtInterval* yRight, QwtInterval* xBottom, QwtInterval* xTop);
97
99 // 坐标轴数据互转(把坐标轴转换为另外一个坐标轴数据而保持屏幕位置不变)
100 static QPointF transformValue(QwtPlot* chart, const QPointF& p, int orgXAxis, int orgYAxis, int otherXAxis, int otherYAxis);
101
102 // 坐标轴数据互转(把坐标轴转换为另外一个坐标轴数据而保持屏幕位置不变)
103 static QPainterPath
104 transformPath(QwtPlot* chart, const QPainterPath& p, int orgXAxis, int orgYAxis, int otherXAxis, int otherYAxis);
105
106 // 图中1像素在实际数据的偏移(正向)
107 static QPointF calcOnePixelOffset(QwtPlot* chart, int xaxis, int yaxis);
108
109 // 屏幕坐标转到对应的绘图坐标
110 static QPointF screenPointToPlotPoint(QwtPlot* chart, const QPointF& screen, int xAxis, int yAxis);
111
113
114 // 是否允许显示坐标轴
115 static void setAxisEnable(QwtPlot* chart, int axisID, bool b);
116
117 // 设置坐标轴的标题
118 static void setAxisTitle(QwtPlot* chart, int axisID, const QString& text);
119
120 // 设置坐标轴文字的字体
121 static void setAxisFont(QwtPlot* chart, int axisID, const QFont& font);
122
123 // 设置坐标轴文字的字体
124 static void setAxisFontColor(QwtPlot* chart, int axisID, const QColor& color);
125
126 // 设置坐标轴文字的旋转
127 static void setAxisLabelRotation(QwtPlot* chart, int axisID, double v);
128
129 // 设置坐标轴最小刻度
130 static void setAxisScaleMin(QwtPlot* chart, int axisID, double v);
131
132 // 设置坐标轴最大刻度
133 static void setAxisScaleMax(QwtPlot* chart, int axisID, double v);
134
135 // 指定坐标轴端点到窗体的距离-影响坐标轴标题的显示
136 static void setAxisBorderDistStart(QwtPlot* chart, int axisID, int v);
137
138 // 指定坐标轴端点到窗体的距离-影响坐标轴标题的显示
139 static void setAxisBorderDistEnd(QwtPlot* chart, int axisID, int v);
140
141 // 设置坐标轴和画板的偏移距离
142 static void setAxisMargin(QwtPlot* chart, int axisID, int v);
143
144 // 设置坐标轴的间隔
145 static void setAxisSpacing(QwtPlot* chart, int axisID, int v);
146
147 // 设置坐标轴文字的对齐方式
148 static void setAxisLabelAlignment(QwtPlot* chart, int axisID, Qt::Alignment v);
149
150 // 设置为普通线性坐标轴
151 static QwtScaleDraw* setAxisNormalScale(QwtPlot* chart, int axisID);
152
153 // 设置坐标轴为时间坐标
154 static QwtDateScaleDraw* setAxisDateTimeScale(QwtPlot* chart, int axisID, const QString& fullDateformat);
155
156 // 给时间坐标轴设置完整的日期格式
157 static void setupSmartDateFormat(QwtDateScaleDraw* scaleDraw, const QString& fullFormat);
158
159 // 获取时间坐标轴,若当前不是时间坐标轴,返回nullptr
160 static QwtDateScaleDraw* getAxisDateTimeScale(QwtPlot* chart, int axisID);
161
162 // 获取对应坐标轴的id,如 xTop会返回xBottom
163 static int otherAxis(int axisID);
164
165 // 判断是否是x轴
166 static bool isXAxis(int axisID);
167
168 // 判断是否是y轴
169 static bool isYAxis(int axisID);
170
177 template< typename T >
178 static void getSeriesData(QVector< T >& vec, const QwtSeriesStore< T >* series);
179
187 template< typename T >
188 static void getSeriesData(QVector< T >& vec, const QwtSeriesStore< T >* series, int startIndex, int endIndex);
189
190 // 获取item的数据
191 static int getItemDataSize(const QwtPlotItem* item);
192
193 // 获取一个曲线的xy值
194 static void getXYDatas(const QVector< QPointF >& xys, QVector< double >* xs, QVector< double >* ys);
195 static void getXYDatas(QVector< QPointF >& xys, const QwtSeriesStore< QPointF >* cur);
196 static void getXYDatas(QVector< double >* xs, QVector< double >* ys, const QwtSeriesStore< QPointF >* cur);
197 static size_t
198 getXYDatas(QVector< QPointF >& xys, QVector< int >* indexs, const QwtSeriesStore< QPointF >* cur, const QRectF& rang);
199 static size_t getXYDatas(QVector< double >* xs,
200 QVector< double >* ys,
201 QVector< int >* indexs,
202 const QwtSeriesStore< QPointF >* cur,
203 const QRectF& rang);
204
205 // 对2d数据点的提取操作
206 static size_t getXYDatas(QVector< QPointF >& xys,
207 QVector< int >* indexs,
208 const QwtSeriesStore< QPointF >* series,
209 const QPainterPath& rang);
210 static size_t getXYDatas(QVector< double >* xs,
211 QVector< double >* ys,
212 QVector< int >* indexs,
213 const QwtSeriesStore< QPointF >* series,
214 const QPainterPath& rang);
215
216 // 对3d数据提取
217 static void getXYZDatas(QVector< QwtPoint3D >& xyzs, const QwtSeriesStore< QwtPoint3D >* cur);
218
219 // 获取间隔数据
220 static void getIntervalSampleDatas(QVector< QwtIntervalSample >& intv, const QwtSeriesStore< QwtIntervalSample >* cur);
221
222 // 判断点是否在选择的范围内
223 static bool isPointInRange(const QPainterPath& range, const QPointF& point);
224 static bool isHistogramSampleInRange(const QPainterPath& selectRange, const QwtIntervalSample& val);
225 static bool isIntervalCurveSampleInRange(const QPainterPath& selectRange, const QwtIntervalSample& val);
226 static bool isMultiBarChartSampleInRange(const QPainterPath& selectRange, const QwtSetSample& val);
227 static bool isTradingCurveSampleInRange(const QPainterPath& selectRange, const QwtOHLCSample& val);
228 static bool isSpectroCurveSampleInRange(const QPainterPath& selectRange, const QwtPoint3D& val);
229
230 // 偏移
231 static void offsetPointSample(QPointF& sample, const double& xoffset, const double& yoffset);
232 static void offsetHistogramSample(QwtIntervalSample& sample, const double& xoffset, const double& yoffset);
233 static void offsetIntervalCurveSample(QwtIntervalSample& sample, const double& xoffset, const double& yoffset);
234 static void offsetMultiBarChartSample(QwtSetSample& sample, const double& xoffset, const double& yoffset);
235 static void offsetTradingCurveSample(QwtOHLCSample& sample, const double& xoffset, const double& yoffset);
236 static void offsetSpectroCurveSample(QwtPoint3D& sample, const double& xoffset, const double& yoffset);
237
238 // 把范围内的数据移除 返回移除的个数
239 static int removeDataInRang(const QRectF& removeRang, const QVector< QPointF >& rawData, QVector< QPointF >& newData);
240 static int removeDataInRang(const QPainterPath& removeRang, const QVector< QPointF >& rawData, QVector< QPointF >& newData);
241 static int removeDataInRang(const QRectF& removeRang, QwtSeriesStore< QPointF >* curve);
242 static int removeDataInRang(const QPainterPath& removeRang, QwtSeriesStore< QPointF >* curve);
243
245 template< typename T, typename PlotItemType >
246 static void setVectorSampleData(QwtPlotItem* item, const QVector< T >& datas);
247
248 template< typename T, typename PlotItemType >
249 static void getVectorSampleData(QwtPlotItem* item, QVector< T >& datas);
250
251 // setSample;
252 static void setPlotCurveSample(QwtPlotItem* p, const QVector< QPointF >& datas);
253 static void setPlotBarChartSample(QwtPlotItem* p, const QVector< QPointF >& datas);
254 static void setPlotHistogramSample(QwtPlotItem* p, const QVector< QwtIntervalSample >& datas);
255 static void setPlotIntervalCurveSample(QwtPlotItem* p, const QVector< QwtIntervalSample >& datas);
256 static void setPlotMultiBarChartSample(QwtPlotItem* p, const QVector< QwtSetSample >& datas);
257 static void setPlotTradingCurveSample(QwtPlotItem* p, const QVector< QwtOHLCSample >& datas);
258 static void setPlotSpectroCurveSample(QwtPlotItem* p, const QVector< QwtPoint3D >& datas);
259
260 // getSample
261 static void getPlotCurveSample(QwtPlotItem* p, QVector< QPointF >& datas);
262 static void getPlotBarChartSample(QwtPlotItem* p, QVector< QPointF >& datas);
263 static void getPlotHistogramSample(QwtPlotItem* p, QVector< QwtIntervalSample >& datas);
264 static void getPlotIntervalCurveSample(QwtPlotItem* p, QVector< QwtIntervalSample >& datas);
265 static void getPlotMultiBarChartSample(QwtPlotItem* p, QVector< QwtSetSample >& datas);
266 static void getPlotTradingCurveSample(QwtPlotItem* p, QVector< QwtOHLCSample >& datas);
267 static void getPlotSpectroCurveSample(QwtPlotItem* p, QVector< QwtPoint3D >& datas);
268
269 //
270
272
273 // 设置符号
274 static void setCurveSymbol(QwtPlotCurve* cur, QwtSymbol::Style style, const QSize& size = QSize(8, 8));
275 static void setCurveLinePenStyle(QwtPlotCurve* cur, Qt::PenStyle style);
276
277 // 设置曲线的样式
278 static void setCurvePenStyle(QwtPlotCurve* cur, Qt::PenStyle style);
279
281 // 获取屏幕位置离bar最近的点,类似于QwtPlotCurve::closestPoint
282 static int closestPoint(const QwtPlotBarChart* bar, const QPoint& pos, double* dist);
283
284 // 通过点数量推荐线宽
285 static qreal recommendCurveLinePenWidth(int pointsNumber);
286};
287
288template< typename T >
289void DAChartUtil::getSeriesData(QVector< T >& vec, const QwtSeriesStore< T >* series)
290{
291 const auto size = series->dataSize();
292
293 if (vec.size() < size) {
294 vec.reserve(static_cast< int >(size));
295 }
296 for (auto i = 0; i < size; ++i) {
297 vec.push_back(series->sample(i));
298 }
299}
300
301template< typename T >
302void DAChartUtil::getSeriesData(QVector< T >& vec, const QwtSeriesStore< T >* series, int startIndex, int endIndex)
303{
304 const int end = endIndex + 1;
305
306 for (int i = startIndex; i < end; ++i) {
307 vec.push_back(series->sample(i));
308 }
309}
310
311template< typename T, typename PlotItemType >
312void DAChartUtil::setVectorSampleData(QwtPlotItem* item, const QVector< T >& datas)
313{
314 static_cast< PlotItemType* >(item)->setSamples(datas);
315}
316
317template< typename T, typename PlotItemType >
318void DAChartUtil::getVectorSampleData(QwtPlotItem* item, QVector< T >& datas)
319{
320 PlotItemType* c = static_cast< PlotItemType* >(item);
321 const auto size = c->dataSize();
322
323 datas.reserve(static_cast< int >(size));
324 for (auto i = 0; i < size; ++i) {
325 datas.push_back(c->sample(i));
326 }
327}
328} // End Of Namespace DA
329#endif // SACHART_H
这是一个辅助类,用于绘图的辅助
Definition DAChartUtil.h:36
static void getSeriesData(QVector< T > &vec, const QwtSeriesStore< T > *series)
获取QwtSeriesStore<T>对应的值
Definition DAChartUtil.h:289
序列化类都是带异常的,使用中需要处理异常
Definition AppMainWindow.cpp:44