几何标绘完成之后,需要把标绘的内容保存到文件中,下次使用的时候,在加载起来就可以了。
文件保存的基类:
//几何图形的问价保存
class IGeoStorage {
public:
IGeoStorage();
~IGeoStorage();
void setFile(FILE* file);
virtual void saveTo();
virtual void loadFrom();
protected:
FILE* _file = nullptr;
};
IGeoStorage::IGeoStorage() {
}
IGeoStorage::~IGeoStorage() {
}
void IGeoStorage::setFile(FILE* file) {
_file = file;
}
void IGeoStorage::saveTo() {
}
void IGeoStorage::loadFrom() {
}
文件保存管理:
#define GeoStorageMgr() (GeoStorageManager::getInstance())
class GeoStorageManager {
private:
GeoStorageManager();
static GeoStorageManager* _instance;
public:
~GeoStorageManager();
static GeoStorageManager* getInstance();
void addGeoStorage(IGeoStorage* storage);
void saveToFile(QString path);
int loadFromFile(QString path);
private:
void saveName(QString geoName);
private:
QVector<IGeoStorage*> _storageList;
FILE* _file = nullptr;
ReadGeoFactory* _readFactory = nullptr;
};
#define GeoStorageMgr() (GeoStorageManager::getInstance())
class GeoStorageManager {
private:
GeoStorageManager();
static GeoStorageManager* _instance;
public:
~GeoStorageManager();
static GeoStorageManager* getInstance();
void addGeoStorage(IGeoStorage* storage);
void saveToFile(QString path);
int loadFromFile(QString path);
private:
void saveName(QString geoName);
private:
QVector<IGeoStorage*> _storageList;
FILE* _file = nullptr;
ReadGeoFactory* _readFactory = nullptr;
};
点数据保存:
//具有存储功能的几何点对象
class StoragePointGeo
: public PointGeo
, public IGeoStorage {
public:
StoragePointGeo();
~StoragePointGeo();
virtual void saveTo()override;
virtual void loadFrom()override;
};
StoragePointGeo::StoragePointGeo() {
}
StoragePointGeo::~StoragePointGeo() {
}
void StoragePointGeo::saveTo() {
//1.保存经纬高
fwrite(&_lon, sizeof(double), 1, _file);
fwrite(&_lat, sizeof(double), 1, _file);
fwrite(&_alt, sizeof(double), 1, _file);
//2.保存半径
int r = _pointProp->getRadius();
fwrite(&r, sizeof(int), 1, _file);
//3.外圈线粗
int w = _pointProp->getOuterWidth();
fwrite(&w, sizeof(int), 1, _file);
//4.外圈颜色
QColor oc = _pointProp->getOuterColor();
int oc_r = oc.red();
fwrite(&oc_r, sizeof(int), 1, _file);
int oc_g = oc.green();
fwrite(&oc_g, sizeof(int), 1, _file);
int oc_b = oc.blue();
fwrite(&oc_b, sizeof(int), 1, _file);
//5.填充颜色
QColor fc = _pointProp->getFillColor();
int fc_r = fc.red();
fwrite(&fc_r, sizeof(int), 1, _file);
int fc_g = fc.green();
fwrite(&fc_g, sizeof(int), 1, _file);
int fc_b = fc.blue();
fwrite(&fc_b, sizeof(int), 1, _file);
//6.透明度
int a = _pointProp->getAlpha();
fwrite(&a, sizeof(int), 1, _file);
//7.是否显示名称
bool b = _pointProp->getShowName();
fwrite(&b, sizeof(bool), 1, _file);
}
void StoragePointGeo::loadFrom() {
//1.保存经纬高
fread(&_lon, sizeof(double), 1, _file);
fread(&_lat, sizeof(double), 1, _file);
fread(&_alt, sizeof(double), 1, _file);
//2.保存半径
int r = 0;
fread(&r, sizeof(int), 1, _file);
_pointProp->setRadius(r);
//3.外圈线粗
int w = 0;
fread(&w, sizeof(int), 1, _file);
_pointProp->setOuterWidth(w);
//4.外圈颜色
QColor oc;
int oc_r = 0;
fread(&oc_r, sizeof(int), 1, _file);
oc.setRed(oc_r);
int oc_g = 0;
fread(&oc_g, sizeof(int), 1, _file);
oc.setGreen(oc_g);
int oc_b = 0;
fread(&oc_b, sizeof(int), 1, _file);
oc.setBlue(oc_b);
_pointProp->setOuterColor(oc);
//5.填充颜色
QColor fc;
int fc_r = 0;
fread(&fc_r, sizeof(int), 1, _file);
fc.setRed(fc_r);
int fc_g = 0;
fread(&fc_g, sizeof(int), 1, _file);
fc.setGreen(fc_g);
int fc_b = 0;
fread(&fc_b, sizeof(int), 1, _file);
fc.setBlue(fc_b);
_pointProp->setFillColor(fc);
//6.透明度
int a = 0;
fread(&a, sizeof(int), 1, _file);
_pointProp->setAlpha(a);
//7.是否显示名称
bool b = false;
fread(&b, sizeof(bool), 1, _file);
_pointProp->setShowName(b);
}
线数据保存:
class StorageLineGeo :
public LineGeo
, public IGeoStorage {
public:
StorageLineGeo();
~StorageLineGeo();
virtual void saveTo()override;
virtual void loadFrom()override;
};
StorageLineGeo::StorageLineGeo() {
}
StorageLineGeo::~StorageLineGeo() {
}
void StorageLineGeo::saveTo() {
QVector<UserGeoPoint>&points = getPoints();
int size = points.size();
//保存点数量;
fwrite(&size, sizeof(int), 1, _file);
for (size_t i = 0; i < points.size(); ++i) {
//1.保存经纬高;
fwrite(&points[i].lon, sizeof(double), 1, _file);
fwrite(&points[i].lat, sizeof(double), 1, _file);
fwrite(&points[i].alt, sizeof(double), 1, _file);
}
GeoLineProp* lineProp = getLineProp();
if (lineProp) {
int lineWidth = lineProp->getLineWidth();
fwrite(&lineWidth, sizeof(int), 1, _file);
int lineType = lineProp->getLineType();
fwrite(&lineType, sizeof(int), 1, _file);
QColor lineColor = lineProp->getLineColor();
int oc_r = lineColor.red();
fwrite(&oc_r, sizeof(int), 1, _file);
int oc_g = lineColor.green();
fwrite(&oc_g, sizeof(int), 1, _file);
int oc_b = lineColor.blue();
fwrite(&oc_b, sizeof(int), 1, _file);
int lineAlpha = lineProp->getLineAlpha();
fwrite(&lineAlpha, sizeof(int), 1, _file);
bool b = lineProp->getShowName();
fwrite(&b, sizeof(bool), 1, _file);
}
}
void StorageLineGeo::loadFrom() {
int size = 0;
getPoints().clear();
fread(&size, sizeof(int), 1, _file);
for (int i = 0; i < size; ++i) {
UserGeoPoint geoPoint;
double lon = 0.0, lat = 0.0, alt = 0.0;
fread(&lon, sizeof(double), 1, _file);
fread(&lat, sizeof(double), 1, _file);
fread(&alt, sizeof(double), 1, _file);
geoPoint.lon = lon;
geoPoint.lat = lat;
geoPoint.alt = alt;
addLinePoint(geoPoint);
}
GeoLineProp* lineProp = getLineProp();
if (lineProp) {
int lineWidth = 0;
fread(&lineWidth, sizeof(int), 1, _file);
lineProp->setLineWidth(lineWidth);
int lineType = 0;
fread(&lineType, sizeof(int), 1, _file);
lineProp->setLineType(lineType);
QColor lineColor;
int oc_r = 0;
fread(&oc_r, sizeof(int), 1, _file);
lineColor.setRed(oc_r);
int oc_g = 0;
fread(&oc_g, sizeof(int), 1, _file);
lineColor.setGreen(oc_g);
int oc_b = 0;
fread(&oc_b, sizeof(int), 1, _file);
lineColor.setBlue(oc_b);
lineProp->setLineColor(lineColor);
int lineAlpha = 0;
fread(&lineAlpha, sizeof(int), 1, _file);
lineProp->setLineAlpha(lineAlpha);
bool b = false;
fread(&b, sizeof(bool), 1, _file);
lineProp->setShowName(b);
}
}
aaa