mirror of
https://github.com/tumic0/GPXSee.git
synced 2025-04-22 05:09:10 +02:00
S-57 ISO8211 subfields can not be ommited
This commit is contained in:
parent
d6a4e237d6
commit
7d7d62c786
@ -22,51 +22,6 @@ struct DR {
|
|||||||
char FieldTagSize;
|
char FieldTagSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
const QVariant *ISO8211::data(const Field &field, quint32 name) const
|
|
||||||
{
|
|
||||||
const QVector<QVariant> &v = field.data().first();
|
|
||||||
|
|
||||||
for (int i = 0; i < field.subFields()->size(); i++)
|
|
||||||
if (field.subFields()->at(i) == name)
|
|
||||||
return &v.at(i);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ISO8211::subfield(const Field &field, quint32 name, int *val) const
|
|
||||||
{
|
|
||||||
bool ok;
|
|
||||||
|
|
||||||
const QVariant *v = data(field, name);
|
|
||||||
if (!v)
|
|
||||||
return false;
|
|
||||||
*val = v->toInt(&ok);
|
|
||||||
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ISO8211::subfield(const Field &field, quint32 name, uint *val) const
|
|
||||||
{
|
|
||||||
bool ok;
|
|
||||||
|
|
||||||
const QVariant *v = data(field, name);
|
|
||||||
if (!v)
|
|
||||||
return false;
|
|
||||||
*val = v->toUInt(&ok);
|
|
||||||
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ISO8211::subfield(const Field &field, quint32 name, QByteArray *val) const
|
|
||||||
{
|
|
||||||
const QVariant *v = data(field, name);
|
|
||||||
if (!v)
|
|
||||||
return false;
|
|
||||||
*val = v->toByteArray();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ISO8211::SubFieldDefinition ISO8211::fieldType(const QString &str, int cnt)
|
ISO8211::SubFieldDefinition ISO8211::fieldType(const QString &str, int cnt)
|
||||||
{
|
{
|
||||||
if (str == "A" || str == "I" || str == "R")
|
if (str == "A" || str == "I" || str == "R")
|
||||||
@ -337,7 +292,7 @@ bool ISO8211::readRecord(Record &record)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
record[i] = Field(def.tag, it->tags(), data);
|
record[i] = Field(def.tag, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -15,17 +15,14 @@ public:
|
|||||||
class Field
|
class Field
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Field() : _tag(0), _subFields(0) {}
|
Field() : _tag(0) {}
|
||||||
Field(quint32 tag, const QVector<quint32> &subFields, const Data &data)
|
Field(quint32 tag, const Data &data) : _tag(tag), _data(data) {}
|
||||||
: _tag(tag), _subFields(&subFields), _data(data) {}
|
|
||||||
|
|
||||||
quint32 tag() const {return _tag;}
|
quint32 tag() const {return _tag;}
|
||||||
const Data &data() const {return _data;}
|
const Data &data() const {return _data;}
|
||||||
const QVector<quint32> *subFields() const {return _subFields;}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
quint32 _tag;
|
quint32 _tag;
|
||||||
const QVector<quint32> *_subFields;
|
|
||||||
Data _data;
|
Data _data;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -34,11 +31,6 @@ public:
|
|||||||
ISO8211(const QString &path) : _file(path) {}
|
ISO8211(const QString &path) : _file(path) {}
|
||||||
bool readDDR();
|
bool readDDR();
|
||||||
bool readRecord(Record &record);
|
bool readRecord(Record &record);
|
||||||
|
|
||||||
bool subfield(const Field &field, quint32 name, int *val) const;
|
|
||||||
bool subfield(const Field &field, quint32 name, uint *val) const;
|
|
||||||
bool subfield(const Field &field, quint32 name, QByteArray *val) const;
|
|
||||||
|
|
||||||
const QString &errorString() const {return _errorString;}
|
const QString &errorString() const {return _errorString;}
|
||||||
|
|
||||||
static const Field *field(const Record &record, quint32 name);
|
static const Field *field(const Record &record, quint32 name);
|
||||||
@ -102,7 +94,6 @@ private:
|
|||||||
bool readDDA(const FieldDefinition &def, SubFields &fields);
|
bool readDDA(const FieldDefinition &def, SubFields &fields);
|
||||||
bool readUDA(quint64 pos, const FieldDefinition &def,
|
bool readUDA(quint64 pos, const FieldDefinition &def,
|
||||||
const QVector<SubFieldDefinition> &fields, bool repeat, Data &data);
|
const QVector<SubFieldDefinition> &fields, bool repeat, Data &data);
|
||||||
const QVariant *data(const Field &field, quint32 name) const;
|
|
||||||
|
|
||||||
QFile _file;
|
QFile _file;
|
||||||
FieldsMap _map;
|
FieldsMap _map;
|
||||||
|
@ -15,7 +15,6 @@ using namespace ENC;
|
|||||||
#define PRIM_L 2
|
#define PRIM_L 2
|
||||||
#define PRIM_A 3
|
#define PRIM_A 3
|
||||||
|
|
||||||
constexpr quint32 RCID = ISO8211::NAME("RCID");
|
|
||||||
constexpr quint32 SG2D = ISO8211::NAME("SG2D");
|
constexpr quint32 SG2D = ISO8211::NAME("SG2D");
|
||||||
constexpr quint32 SG3D = ISO8211::NAME("SG3D");
|
constexpr quint32 SG3D = ISO8211::NAME("SG3D");
|
||||||
constexpr quint32 FSPT = ISO8211::NAME("FSPT");
|
constexpr quint32 FSPT = ISO8211::NAME("FSPT");
|
||||||
@ -24,9 +23,6 @@ constexpr quint32 ATTF = ISO8211::NAME("ATTF");
|
|||||||
constexpr quint32 VRID = ISO8211::NAME("VRID");
|
constexpr quint32 VRID = ISO8211::NAME("VRID");
|
||||||
constexpr quint32 FRID = ISO8211::NAME("FRID");
|
constexpr quint32 FRID = ISO8211::NAME("FRID");
|
||||||
constexpr quint32 DSPM = ISO8211::NAME("DSPM");
|
constexpr quint32 DSPM = ISO8211::NAME("DSPM");
|
||||||
constexpr quint32 COMF = ISO8211::NAME("COMF");
|
|
||||||
constexpr quint32 SOMF = ISO8211::NAME("SOMF");
|
|
||||||
constexpr quint32 HUNI = ISO8211::NAME("HUNI");
|
|
||||||
|
|
||||||
static QMap<uint,uint> orderMapInit()
|
static QMap<uint,uint> orderMapInit()
|
||||||
{
|
{
|
||||||
@ -104,11 +100,10 @@ static uint order(uint type)
|
|||||||
return (it == orderMap.constEnd()) ? (type>>16) + 512 : it.value();
|
return (it == orderMap.constEnd()) ? (type>>16) + 512 : it.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void warning(const ISO8211 &ddf, const ISO8211::Field &frid, uint prim)
|
static void warning(const ISO8211::Field &frid, uint prim)
|
||||||
{
|
{
|
||||||
uint rcid;
|
uint rcid = frid.data().at(0).at(1).toUInt();
|
||||||
|
|
||||||
if (ddf.subfield(frid, RCID, &rcid)) {
|
|
||||||
switch (prim) {
|
switch (prim) {
|
||||||
case PRIM_P:
|
case PRIM_P:
|
||||||
qWarning("%u: invalid point feature", rcid);
|
qWarning("%u: invalid point feature", rcid);
|
||||||
@ -121,7 +116,6 @@ static void warning(const ISO8211 &ddf, const ISO8211::Field &frid, uint prim)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static void pointBounds(const Coordinates &c, double min[2], double max[2])
|
static void pointBounds(const Coordinates &c, double min[2], double max[2])
|
||||||
{
|
{
|
||||||
@ -761,7 +755,7 @@ MapData::Poly *MapData::polyObject(const ISO8211::Record &r,
|
|||||||
return (path.isEmpty() ? 0 : new Poly(objl, path, attributes(r), huni));
|
return (path.isEmpty() ? 0 : new Poly(objl, path, attributes(r), huni));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MapData::processRecord(const ISO8211 &ddf, const ISO8211::Record &record,
|
bool MapData::processRecord(const ISO8211::Record &record,
|
||||||
QVector<ISO8211::Record> &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve,
|
QVector<ISO8211::Record> &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve,
|
||||||
RecordMap &vf, uint &comf, uint &somf, uint &huni)
|
RecordMap &vf, uint &comf, uint &somf, uint &huni)
|
||||||
{
|
{
|
||||||
@ -772,10 +766,14 @@ bool MapData::processRecord(const ISO8211 &ddf, const ISO8211::Record &record,
|
|||||||
quint32 tag = f.tag();
|
quint32 tag = f.tag();
|
||||||
|
|
||||||
if (tag == VRID) {
|
if (tag == VRID) {
|
||||||
|
bool nmok, idok;
|
||||||
|
|
||||||
if (f.data().at(0).size() < 2)
|
if (f.data().at(0).size() < 2)
|
||||||
return false;
|
return false;
|
||||||
int rcnm = f.data().at(0).at(0).toInt();
|
int rcnm = f.data().at(0).at(0).toInt(&nmok);
|
||||||
uint rcid = f.data().at(0).at(1).toUInt();
|
uint rcid = f.data().at(0).at(1).toUInt(&idok);
|
||||||
|
if (!(nmok && idok))
|
||||||
|
return false;
|
||||||
|
|
||||||
switch (rcnm) {
|
switch (rcnm) {
|
||||||
case RCNM_VI:
|
case RCNM_VI:
|
||||||
@ -796,10 +794,15 @@ bool MapData::processRecord(const ISO8211 &ddf, const ISO8211::Record &record,
|
|||||||
} else if (tag == FRID) {
|
} else if (tag == FRID) {
|
||||||
fe.append(record);
|
fe.append(record);
|
||||||
} else if (tag == DSPM) {
|
} else if (tag == DSPM) {
|
||||||
if (!(ddf.subfield(f, COMF, &comf) && ddf.subfield(f, SOMF, &somf)))
|
bool cok, sok, hok;
|
||||||
return false;
|
|
||||||
if (!ddf.subfield(f, HUNI, &huni))
|
if (f.data().at(0).size() < 12)
|
||||||
return false;
|
return false;
|
||||||
|
comf = f.data().at(0).at(10).toUInt(&cok);
|
||||||
|
somf = f.data().at(0).at(11).toUInt(&sok);
|
||||||
|
huni = f.data().at(0).at(7).toUInt(&hok);
|
||||||
|
|
||||||
|
return (cok && sok && hok);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -821,7 +824,7 @@ MapData::MapData(const QString &path)
|
|||||||
if (!ddf.readDDR())
|
if (!ddf.readDDR())
|
||||||
return;
|
return;
|
||||||
while (ddf.readRecord(record))
|
while (ddf.readRecord(record))
|
||||||
if (!processRecord(ddf, record, fe, vi, vc, ve, vf, comf, somf, huni))
|
if (!processRecord(record, fe, vi, vc, ve, vf, comf, somf, huni))
|
||||||
qWarning("Invalid S-57 record");
|
qWarning("Invalid S-57 record");
|
||||||
|
|
||||||
for (int i = 0; i < fe.size(); i++) {
|
for (int i = 0; i < fe.size(); i++) {
|
||||||
@ -847,7 +850,7 @@ MapData::MapData(const QString &path)
|
|||||||
pointBounds(point->pos(), min, max);
|
pointBounds(point->pos(), min, max);
|
||||||
_points.Insert(min, max, point);
|
_points.Insert(min, max, point);
|
||||||
} else
|
} else
|
||||||
warning(ddf, f, prim);
|
warning(f, prim);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PRIM_L:
|
case PRIM_L:
|
||||||
@ -855,14 +858,14 @@ MapData::MapData(const QString &path)
|
|||||||
rectcBounds(line->bounds(), min, max);
|
rectcBounds(line->bounds(), min, max);
|
||||||
_lines.Insert(min, max, line);
|
_lines.Insert(min, max, line);
|
||||||
} else
|
} else
|
||||||
warning(ddf, f, prim);
|
warning(f, prim);
|
||||||
break;
|
break;
|
||||||
case PRIM_A:
|
case PRIM_A:
|
||||||
if ((poly = polyObject(r, vc, ve, comf, objl, huni))) {
|
if ((poly = polyObject(r, vc, ve, comf, objl, huni))) {
|
||||||
rectcBounds(poly->bounds(), min, max);
|
rectcBounds(poly->bounds(), min, max);
|
||||||
_areas.Insert(min, max, poly);
|
_areas.Insert(min, max, poly);
|
||||||
} else
|
} else
|
||||||
warning(ddf, f, prim);
|
warning(f, prim);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ private:
|
|||||||
static Poly *polyObject(const ISO8211::Record &r, const RecordMap &vc,
|
static Poly *polyObject(const ISO8211::Record &r, const RecordMap &vc,
|
||||||
const RecordMap &ve, uint comf, uint objl, uint huni);
|
const RecordMap &ve, uint comf, uint objl, uint huni);
|
||||||
|
|
||||||
static bool processRecord(const ISO8211 &ddf, const ISO8211::Record &record,
|
static bool processRecord(const ISO8211::Record &record,
|
||||||
QVector<ISO8211::Record> &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve,
|
QVector<ISO8211::Record> &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve,
|
||||||
RecordMap &vf, uint &comf, uint &somf, uint &huni);
|
RecordMap &vf, uint &comf, uint &somf, uint &huni);
|
||||||
|
|
||||||
|
@ -13,12 +13,6 @@ using namespace ENC;
|
|||||||
#define TILE_SIZE 512
|
#define TILE_SIZE 512
|
||||||
|
|
||||||
constexpr quint32 CATD = ISO8211::NAME("CATD");
|
constexpr quint32 CATD = ISO8211::NAME("CATD");
|
||||||
constexpr quint32 IMPL = ISO8211::NAME("IMPL");
|
|
||||||
constexpr quint32 F1LE = ISO8211::NAME("FILE");
|
|
||||||
constexpr quint32 SLAT = ISO8211::NAME("SLAT");
|
|
||||||
constexpr quint32 WLON = ISO8211::NAME("WLON");
|
|
||||||
constexpr quint32 NLAT = ISO8211::NAME("NLAT");
|
|
||||||
constexpr quint32 ELON = ISO8211::NAME("ELON");
|
|
||||||
|
|
||||||
Range ENCAtlas::zooms(IntendedUsage usage)
|
Range ENCAtlas::zooms(IntendedUsage usage)
|
||||||
{
|
{
|
||||||
@ -61,8 +55,8 @@ ENCAtlas::IntendedUsage ENCAtlas::usage(const QString &path)
|
|||||||
return (IntendedUsage)iu;
|
return (IntendedUsage)iu;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ENCAtlas::processRecord(const ISO8211 &ddf, const ISO8211::Record &record,
|
bool ENCAtlas::processRecord(const ISO8211::Record &record, QByteArray &file,
|
||||||
QByteArray &file, RectC &bounds)
|
RectC &bounds)
|
||||||
{
|
{
|
||||||
if (record.size() < 2)
|
if (record.size() < 2)
|
||||||
return false;
|
return false;
|
||||||
@ -70,24 +64,16 @@ bool ENCAtlas::processRecord(const ISO8211 &ddf, const ISO8211::Record &record,
|
|||||||
const ENC::ISO8211::Field &field = record.at(1);
|
const ENC::ISO8211::Field &field = record.at(1);
|
||||||
|
|
||||||
if (field.tag() == CATD) {
|
if (field.tag() == CATD) {
|
||||||
QByteArray impl;
|
if (field.data().at(0).size() < 10)
|
||||||
|
|
||||||
if (!ddf.subfield(field, IMPL, &impl))
|
|
||||||
return false;
|
|
||||||
if (!ddf.subfield(field, F1LE, &file))
|
|
||||||
return false;
|
return false;
|
||||||
|
QByteArray impl = field.data().at(0).at(5).toByteArray();
|
||||||
|
file = field.data().at(0).at(2).toByteArray();
|
||||||
|
|
||||||
if (impl == "BIN" && file.endsWith("000")) {
|
if (impl == "BIN" && file.endsWith("000")) {
|
||||||
QByteArray slat, wlon, nlat, elon;
|
QByteArray slat = field.data().at(0).at(6).toByteArray();
|
||||||
|
QByteArray wlon = field.data().at(0).at(7).toByteArray();
|
||||||
if (!ddf.subfield(field, SLAT, &slat))
|
QByteArray nlat = field.data().at(0).at(8).toByteArray();
|
||||||
return false;
|
QByteArray elon = field.data().at(0).at(9).toByteArray();
|
||||||
if (!ddf.subfield(field, WLON, &wlon))
|
|
||||||
return false;
|
|
||||||
if (!ddf.subfield(field, NLAT, &nlat))
|
|
||||||
return false;
|
|
||||||
if (!ddf.subfield(field, ELON, &elon))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
bool ok1, ok2, ok3, ok4;
|
bool ok1, ok2, ok3, ok4;
|
||||||
bounds = RectC(Coordinates(wlon.toDouble(&ok1), nlat.toDouble(&ok2)),
|
bounds = RectC(Coordinates(wlon.toDouble(&ok1), nlat.toDouble(&ok2)),
|
||||||
@ -142,7 +128,7 @@ ENCAtlas::ENCAtlas(const QString &fileName, QObject *parent)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while (ddf.readRecord(record)) {
|
while (ddf.readRecord(record)) {
|
||||||
if (processRecord(ddf, record, file, bounds))
|
if (processRecord(record, file, bounds))
|
||||||
addMap(dir, file, bounds);
|
addMap(dir, file, bounds);
|
||||||
}
|
}
|
||||||
if (!ddf.errorString().isNull()) {
|
if (!ddf.errorString().isNull()) {
|
||||||
|
@ -76,8 +76,8 @@ private:
|
|||||||
void addMap(const QDir &dir, const QByteArray &file, const RectC &bounds);
|
void addMap(const QDir &dir, const QByteArray &file, const RectC &bounds);
|
||||||
QList<ENC::Data*> levels() const;
|
QList<ENC::Data*> levels() const;
|
||||||
|
|
||||||
static bool processRecord(const ENC::ISO8211 &ddf,
|
static bool processRecord(const ENC::ISO8211::Record &record,
|
||||||
const ENC::ISO8211::Record &record, QByteArray &file, RectC &bounds);
|
QByteArray &file, RectC &bounds);
|
||||||
static Range zooms(IntendedUsage usage);
|
static Range zooms(IntendedUsage usage);
|
||||||
static IntendedUsage usage(const QString &path);
|
static IntendedUsage usage(const QString &path);
|
||||||
|
|
||||||
|
@ -19,9 +19,7 @@ constexpr quint32 SG2D = ISO8211::NAME("SG2D");
|
|||||||
constexpr quint32 SG3D = ISO8211::NAME("SG3D");
|
constexpr quint32 SG3D = ISO8211::NAME("SG3D");
|
||||||
constexpr quint32 VRID = ISO8211::NAME("VRID");
|
constexpr quint32 VRID = ISO8211::NAME("VRID");
|
||||||
constexpr quint32 DSID = ISO8211::NAME("DSID");
|
constexpr quint32 DSID = ISO8211::NAME("DSID");
|
||||||
constexpr quint32 DSNM = ISO8211::NAME("DSNM");
|
|
||||||
constexpr quint32 DSPM = ISO8211::NAME("DSPM");
|
constexpr quint32 DSPM = ISO8211::NAME("DSPM");
|
||||||
constexpr quint32 COMF = ISO8211::NAME("COMF");
|
|
||||||
|
|
||||||
static Range zooms(const RectC &bounds)
|
static Range zooms(const RectC &bounds)
|
||||||
{
|
{
|
||||||
@ -104,7 +102,7 @@ bool ENCMap::bounds(const QVector<ISO8211::Record> &gv, Rect &b)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ENCMap::processRecord(const ISO8211 &ddf, const ISO8211::Record &record,
|
bool ENCMap::processRecord(const ISO8211::Record &record,
|
||||||
QVector<ISO8211::Record> &rv, uint &comf, QByteArray &dsnm)
|
QVector<ISO8211::Record> &rv, uint &comf, QByteArray &dsnm)
|
||||||
{
|
{
|
||||||
if (record.size() < 2)
|
if (record.size() < 2)
|
||||||
@ -116,10 +114,15 @@ bool ENCMap::processRecord(const ISO8211 &ddf, const ISO8211::Record &record,
|
|||||||
if (tag == VRID) {
|
if (tag == VRID) {
|
||||||
rv.append(record);
|
rv.append(record);
|
||||||
} else if (tag == DSID) {
|
} else if (tag == DSID) {
|
||||||
if (!ddf.subfield(f, DSNM, &dsnm))
|
if (f.data().at(0).size() < 5)
|
||||||
return false;
|
return false;
|
||||||
|
dsnm = f.data().at(0).at(4).toByteArray();
|
||||||
} else if (tag == DSPM) {
|
} else if (tag == DSPM) {
|
||||||
if (!ddf.subfield(f, COMF, &comf))
|
bool ok;
|
||||||
|
if (f.data().at(0).size() < 11)
|
||||||
|
return false;
|
||||||
|
comf = f.data().at(0).at(10).toUInt(&ok);
|
||||||
|
if (!ok)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,7 +144,7 @@ ENCMap::ENCMap(const QString &fileName, QObject *parent)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while (ddf.readRecord(record)) {
|
while (ddf.readRecord(record)) {
|
||||||
if (!processRecord(ddf, record, gv, comf, dsnm)) {
|
if (!processRecord(record, gv, comf, dsnm)) {
|
||||||
_errorString = "Invalid S-57 record";
|
_errorString = "Invalid S-57 record";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -96,9 +96,8 @@ private:
|
|||||||
|
|
||||||
static bool bounds(const ENC::ISO8211::Record &record, Rect &rect);
|
static bool bounds(const ENC::ISO8211::Record &record, Rect &rect);
|
||||||
static bool bounds(const QVector<ENC::ISO8211::Record> &gv, Rect &b);
|
static bool bounds(const QVector<ENC::ISO8211::Record> &gv, Rect &b);
|
||||||
static bool processRecord(const ENC::ISO8211 &ddf,
|
static bool processRecord(const ENC::ISO8211::Record &record,
|
||||||
const ENC::ISO8211::Record &record, QVector<ENC::ISO8211::Record> &rv,
|
QVector<ENC::ISO8211::Record> &rv, uint &comf, QByteArray &dsnm);
|
||||||
uint &comf, QByteArray &dsnm);
|
|
||||||
|
|
||||||
QString _name;
|
QString _name;
|
||||||
ENC::MapData *_data;
|
ENC::MapData *_data;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user