DAWorkbench 0.0.1
DAWorkbench API
载入中...
搜索中...
未找到
DAChartSerialize.h
1#ifndef DACHARTSERIALIZE_H
2#define DACHARTSERIALIZE_H
3#include "DAFigureAPI.h"
4#include <string>
5#include <QDataStream>
6#include <functional>
7#include "qwt_text.h"
8#include "qwt_samples.h"
9// DAChart
10#include "DAChartPlotItemFactory.h"
11
12class QwtPlotItem;
13class QwtSymbol;
14class QwtPlotCanvas;
15class QFrame;
16class QwtScaleWidget;
17class QwtPlot;
18class QwtColorMap;
19class QwtLinearColorMap;
20class QwtAlphaColorMap;
21class QwtHueColorMap;
22class QwtSaturationValueColorMap;
23class QwtScaleDraw;
24class QwtColumnSymbol;
25class QwtIntervalSymbol;
26// QwtPlotItem
27class QwtPlotCurve;
28class QwtPlotGrid;
29class QwtPlotScaleItem;
30class QwtPlotLegendItem;
31class QwtPlotMarker;
32class QwtPlotSpectroCurve;
33class QwtPlotIntervalCurve;
34class QwtPlotHistogram;
35class QwtPlotSpectrogram;
36class QwtPlotGraphicItem;
37class QwtPlotTradingCurve;
38class QwtPlotBarChart;
39class QwtPlotMultiBarChart;
40class QwtPlotShapeItem;
41class QwtPlotTextLabel;
42class QwtPlotZoneItem;
43class QwtPlotVectorField;
44
48namespace DA
49{
51const int gc_dachart_version = 1;
52const std::uint32_t gc_dachart_magic_mark = 0x5A6B4CF1;
53const std::uint32_t gc_dachart_magic_mark2 = 0xAA123456;
54const std::uint32_t gc_dachart_magic_mark3 = 0x12345678;
55const std::uint32_t gc_dachart_magic_mark4 = 0xAAB23498;
56const QDataStream::Version gc_datastream_version = QDataStream::Qt_5_12;
57
58class DAFIGURE_API DABadSerializeExpection : public std::exception
59{
60public:
62 DABadSerializeExpection(const char* why);
63 DABadSerializeExpection(const std::string& why);
65 const char* what() const noexcept;
66
67private:
68 std::string mWhy;
69};
70
74class DAFIGURE_API DAChartItemSerialize
75{
76public:
77 class Header
78 {
79 public:
80 Header();
81 ~Header();
82 std::uint32_t magic;
83 int version;
84 int rtti;
85 unsigned char byte[ 20 ];
86 // 是否正确的header
87 bool isValid() const;
88
89 friend QDataStream& operator<<(QDataStream& out, const DA::DAChartItemSerialize::Header& f);
90 friend QDataStream& operator>>(QDataStream& in, DA::DAChartItemSerialize::Header& f);
91 };
92
93public:
97 using FpSerializeOut = std::function< QByteArray(const QwtPlotItem*) >; // QByteArray serializeOut(QwtPlotItem* item)
98 using FpSerializeIn = std::function< QwtPlotItem*(const QByteArray&) >; // QwtPlotItem* serializeIn(int rtti,const QByteArray& d)
99public:
107 static void registSerializeFun(int rtti, FpSerializeIn fpIn, FpSerializeOut fpOut);
108
114 static bool isSupportSerialize(int rtti);
115
121 static FpSerializeIn getSerializeInFun(int rtti) noexcept;
122
128 static FpSerializeOut getSerializeOutFun(int rtti);
134 QByteArray serializeOut(const QwtPlotItem* item) const;
135 QwtPlotItem* serializeIn(const QByteArray& byte) const noexcept;
136
144 int getRtti(const QByteArray& byte) const noexcept;
145
146public:
147 //
176 template< typename T, int RTTI >
177 static QwtPlotItem* serializeIn_T(const QByteArray& byte)
178 {
179 return deserializeImpl< T >(byte, RTTI);
180 }
181
182 template< typename T >
183 static QByteArray serializeOut_T(const QwtPlotItem* item)
184 {
185 return serializeImpl< T >(item);
186 }
187
188private:
189 // 序列化/反序列化的通用实现
190 template< typename T >
191 static QwtPlotItem* deserializeImpl(const QByteArray& byte, int expectedRtti)
192 {
193 QDataStream st(byte);
194 st.setVersion(gc_datastream_version);
195
196 Header h;
197 st >> h;
198 if (!h.isValid() || expectedRtti != h.rtti) {
199 return nullptr;
200 }
201
202 QwtPlotItem* item = DAChartPlotItemFactory::createItem(expectedRtti);
203 if (item) {
204 st >> static_cast< T* >(item);
205 }
206 return item;
207 }
208
209 template< typename T >
210 static QByteArray serializeImpl(const QwtPlotItem* item)
211 {
212 QByteArray byte;
213 QDataStream st(&byte, QIODevice::WriteOnly);
214 st.setVersion(gc_datastream_version);
215
216 Header h;
217 h.rtti = item->rtti();
218 st << h << static_cast< const T* >(item);
219 return byte;
220 }
221
222protected:
223 static QHash< int, std::pair< FpSerializeIn, FpSerializeOut > >& serializeFun();
224};
225
226} // end namespace DA
227
228// 由于Qwt都在全局命名空间,按照ADL原则,编译器会在全局命名空间找对应的序列化函数
229
230// QFrame的序列化
231DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QFrame* f);
232DAFIGURE_API QDataStream& operator>>(QDataStream& in, QFrame* f);
233
234// QwtText的序列化
235DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtText& t);
236DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtText& t);
237// QwtSymbol的序列化
238DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtSymbol* t);
239DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtSymbol* t);
240// QwtIntervalSymbol的序列化
241DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtIntervalSymbol* t);
242DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtIntervalSymbol* t);
243// QwtColumnSymbol的序列化
244DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtColumnSymbol* t);
245DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtColumnSymbol* t);
246
247// QwtScaleWidget指针的序列化
248DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtScaleWidget* w);
249DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtScaleWidget* w);
250// QwtScaleDraw指针的序列化
251DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtScaleDraw* w);
252DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtScaleDraw* w);
253
254// QwtPlotItem指针的序列化
255DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtPlotItem* item);
256DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtPlotItem* item);
257// QwtPlotCurve指针的序列化
258DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtPlotCurve* item);
259DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtPlotCurve* item);
260// QwtPlotGrid(Rtti_PlotGrid)指针的序列化
261DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtPlotGrid* item);
262DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtPlotGrid* item);
263// QwtPlotScaleItem(Rtti_PlotScale)指针的序列化
264DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtPlotScaleItem* item);
265DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtPlotScaleItem* item);
266// QwtPlotLegendItem(Rtti_PlotLegend)指针的序列化
267DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtPlotLegendItem* item);
268DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtPlotLegendItem* item);
269// QwtPlotMarker(Rtti_PlotMarker)指针的序列化
270DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtPlotMarker* item);
271DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtPlotMarker* item);
272// QwtPlotSpectroCurve(Rtti_PlotSpectroCurve)指针的序列化
273DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtPlotSpectroCurve* item);
274DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtPlotSpectroCurve* item);
275// QwtPlotBarChart指针的序列化
276DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtPlotBarChart* item);
277DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtPlotBarChart* item);
278// QwtPlotIntervalCurve指针的序列化
279DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtPlotIntervalCurve* item);
280DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtPlotIntervalCurve* item);
281
282// QwtPlotCanvas的序列化
283DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtPlotCanvas* c);
284DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtPlotCanvas* c);
285// QwtColorMap的序列化
286DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtColorMap* c);
287DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtColorMap* c);
288// QwtLinearColorMap的序列化
289DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtLinearColorMap* c);
290DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtLinearColorMap* c);
291// QwtAlphaColorMap的序列化
292DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtAlphaColorMap* c);
293DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtAlphaColorMap* c);
294// QwtHueColorMap的序列化
295DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtHueColorMap* c);
296DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtHueColorMap* c);
297// QwtSaturationValueColorMap的序列化
298DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtSaturationValueColorMap* c);
299DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtSaturationValueColorMap* c);
300// QwtPlot的序列化
301DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtPlot* chart);
302DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtPlot* chart);
303
304// QwtIntervalSample的序列化
305DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtIntervalSample& item);
306DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtIntervalSample& item);
307// QwtInterval的序列化
308DAFIGURE_API QDataStream& operator<<(QDataStream& out, const QwtInterval& item);
309DAFIGURE_API QDataStream& operator>>(QDataStream& in, QwtInterval& item);
310
311// 下面这两个要放到DA命名空间外,因为使用了QVector<T>的<<
312
313#endif // SAQWTSERIALIZE_H
Definition DAChartSerialize.h:59
Definition DAChartSerialize.h:78
std::uint32_t magic
魔数,–4
Definition DAChartSerialize.h:82
int rtti
rtti –12
Definition DAChartSerialize.h:84
int version
版本 – 8
Definition DAChartSerialize.h:83
针对QwtPlotItem的二进制序列化
Definition DAChartSerialize.h:75
std::function< QByteArray(const QwtPlotItem *) > FpSerializeOut
序列化为QByteArray函数
Definition DAChartSerialize.h:97
static QwtPlotItem * serializeIn_T(const QByteArray &byte)
模板化的序列化实现
Definition DAChartSerialize.h:177
序列化类都是带异常的,使用中需要处理异常
Definition AppMainWindow.cpp:44
const int gc_dachart_version
< 版本标示,每个序列化都应该带有版本信息,用于对下兼容
Definition DAChartSerialize.h:51