1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-04-20 12:19:11 +02:00

Compare commits

...

3 Commits

Author SHA1 Message Date
c96a0fd8f4 Added missing traffic separation line style 2022-11-09 23:12:40 +01:00
877d9331e4 ENC map style enhancement
+ code cleanup
2022-11-09 21:37:33 +01:00
9d8c23bc32 Fixed crash on ENC map unload 2022-11-09 21:37:05 +01:00
7 changed files with 37 additions and 33 deletions

View File

@ -12,5 +12,6 @@
#define OBJNAM 116 #define OBJNAM 116
#define RESTRN 131 #define RESTRN 131
#define VALDCO 174 #define VALDCO 174
#define WATLEV 187
#endif // ENC_ATTRIBUTES_H #endif // ENC_ATTRIBUTES_H

View File

@ -258,7 +258,7 @@ QVector<Coordinates> MapData::lineGeometry(const ISO8211::Record &r,
{ {
QVector<Coordinates> path; QVector<Coordinates> path;
Coordinates c[2]; Coordinates c[2];
uint ORNT, MASK; uint ORNT;
quint8 type; quint8 type;
quint32 id; quint32 id;
@ -270,8 +270,6 @@ QVector<Coordinates> MapData::lineGeometry(const ISO8211::Record &r,
if (!parseNAME(FSPT, &type, &id, i) || type != RCNM_VE) if (!parseNAME(FSPT, &type, &id, i) || type != RCNM_VE)
return QVector<Coordinates>(); return QVector<Coordinates>();
ORNT = FSPT->data().at(i).at(1).toUInt(); ORNT = FSPT->data().at(i).at(1).toUInt();
MASK = FSPT->data().at(i).at(3).toUInt();
Q_ASSERT(MASK != 1);
RecordMapIterator it = ve.find(id); RecordMapIterator it = ve.find(id);
if (it == ve.constEnd()) if (it == ve.constEnd())
@ -326,7 +324,7 @@ Polygon MapData::polyGeometry(const ISO8211::Record &r, const RecordMap &vc,
Polygon path; Polygon path;
QVector<Coordinates> v; QVector<Coordinates> v;
Coordinates c[2]; Coordinates c[2];
uint ORNT, USAG, MASK; uint ORNT, USAG;
quint8 type; quint8 type;
quint32 id; quint32 id;
@ -339,8 +337,6 @@ Polygon MapData::polyGeometry(const ISO8211::Record &r, const RecordMap &vc,
return Polygon(); return Polygon();
ORNT = FSPT->data().at(i).at(1).toUInt(); ORNT = FSPT->data().at(i).at(1).toUInt();
USAG = FSPT->data().at(i).at(2).toUInt(); USAG = FSPT->data().at(i).at(2).toUInt();
MASK = FSPT->data().at(i).at(3).toUInt();
Q_ASSERT(MASK != 1);
if (USAG == 2 && path.isEmpty()) { if (USAG == 2 && path.isEmpty()) {
path.append(v); path.append(v);
@ -420,7 +416,8 @@ MapData::Attr MapData::pointAttr(const ISO8211::Record &r, uint OBJL)
if ((OBJL == HRBFAC && key == CATHAF) if ((OBJL == HRBFAC && key == CATHAF)
|| (OBJL == LNDMRK && key == CATLMK) || (OBJL == LNDMRK && key == CATLMK)
|| (OBJL == WRECKS && key == CATWRK) || (OBJL == WRECKS && key == CATWRK)
|| (OBJL == MORFAC && key == CATMOR)) || (OBJL == MORFAC && key == CATMOR)
|| (OBJL == UWTROC && key == WATLEV))
subtype = av.at(1).toString().toUInt(); subtype = av.at(1).toString().toUInt();
} }
@ -608,7 +605,7 @@ bool MapData::bounds(const QVector<ISO8211::Record> &gv, Rect &b)
return true; return true;
} }
bool MapData::fetchBoundsAndName() MapData::MapData(const QString &path): _fileName(path)
{ {
QFile file(_fileName); QFile file(_fileName);
QVector<ISO8211::Record> gv; QVector<ISO8211::Record> gv;
@ -617,42 +614,34 @@ bool MapData::fetchBoundsAndName()
if (!file.open(QIODevice::ReadOnly)) { if (!file.open(QIODevice::ReadOnly)) {
_errorString = file.errorString(); _errorString = file.errorString();
return false; return;
} }
if (!ddf.readDDR(file)) { if (!ddf.readDDR(file)) {
_errorString = ddf.errorString(); _errorString = ddf.errorString();
return false; return;
} }
while (!file.atEnd()) { while (!file.atEnd()) {
ISO8211::Record record; ISO8211::Record record;
if (!ddf.readRecord(file, record)) { if (!ddf.readRecord(file, record)) {
_errorString = ddf.errorString(); _errorString = ddf.errorString();
return false; return;
} }
if (!processRecord(record, gv, COMF, _name)) if (!processRecord(record, gv, COMF, _name))
return false; return;
} }
Rect b; Rect b;
if (!bounds(gv, b)) { if (!bounds(gv, b)) {
_errorString = "Error fetching geometries bounds"; _errorString = "Error fetching geometries bounds";
return false; return;
} }
RectC br(Coordinates(b.minX() / (double)COMF, b.maxY() / (double)COMF), RectC br(Coordinates(b.minX() / (double)COMF, b.maxY() / (double)COMF),
Coordinates(b.maxX() / (double)COMF, b.minY() / (double)COMF)); Coordinates(b.maxX() / (double)COMF, b.minY() / (double)COMF));
if (!br.isValid()) { if (!br.isValid())
_errorString = "Invalid geometries bounds"; _errorString = "Invalid geometries bounds";
return false; else
} else
_bounds = br; _bounds = br;
return true;
}
MapData::MapData(const QString &path): _fileName(path)
{
fetchBoundsAndName();
} }
MapData::~MapData() MapData::~MapData()

View File

@ -147,8 +147,6 @@ private:
typedef RTree<Line*, double, 2> LineTree; typedef RTree<Line*, double, 2> LineTree;
typedef RTree<Point*, double, 2> PointTree; typedef RTree<Point*, double, 2> PointTree;
bool fetchBoundsAndName();
static QVector<Sounding> soundings(const ISO8211::Record &r, uint COMF, static QVector<Sounding> soundings(const ISO8211::Record &r, uint COMF,
uint SOMF); uint SOMF);
static QVector<Sounding> soundingGeometry(const ISO8211::Record &r, static QVector<Sounding> soundingGeometry(const ISO8211::Record &r,

View File

@ -50,6 +50,7 @@
#define SLCONS 122 #define SLCONS 122
#define SLOTOP 126 #define SLOTOP 126
#define SOUNDG 129 #define SOUNDG 129
#define TSELNE 145
#define TSSBND 146 #define TSSBND 146
#define TSEZNE 150 #define TSEZNE 150
#define UWTROC 153 #define UWTROC 153

View File

@ -93,6 +93,7 @@ void Style::defaultLineStyle()
_lines[TYPE(RAILWY)] = Line(railroad()); _lines[TYPE(RAILWY)] = Line(railroad());
_lines[TYPE(ROADWY)] = Line(QPen(QColor("#000000"), 2, Qt::SolidLine)); _lines[TYPE(ROADWY)] = Line(QPen(QColor("#000000"), 2, Qt::SolidLine));
_lines[TYPE(GATCON)] = Line(QPen(QColor("#000000"), 2, Qt::SolidLine)); _lines[TYPE(GATCON)] = Line(QPen(QColor("#000000"), 2, Qt::SolidLine));
_lines[TYPE(TSELNE)] = Line(QPen(QColor("#80fcb4fc"), 4, Qt::SolidLine));
} }
void Style::defaultPointStyle() void Style::defaultPointStyle()
@ -115,14 +116,22 @@ void Style::defaultPointStyle()
_points[SUBTYPE(LNDMRK, 17)] = Point(QImage(":/marine/tower.png")); _points[SUBTYPE(LNDMRK, 17)] = Point(QImage(":/marine/tower.png"));
_points[TYPE(LNDELV)] = Point(QImage(":/marine/triangulation-point.png")); _points[TYPE(LNDELV)] = Point(QImage(":/marine/triangulation-point.png"));
_points[TYPE(OBSTRN)] = Point(QImage(":/marine/obstruction.png"), Small); _points[TYPE(OBSTRN)] = Point(QImage(":/marine/obstruction.png"), Small);
_points[TYPE(WRECKS)] = Point(QImage(":/marine/wreck.png"), Small);
_points[SUBTYPE(WRECKS, 1)] = Point(QImage(":/marine/wreck.png"), Small); _points[SUBTYPE(WRECKS, 1)] = Point(QImage(":/marine/wreck.png"), Small);
_points[SUBTYPE(WRECKS, 2)] = Point(QImage(":/marine/wreck-dangerous.png"), _points[SUBTYPE(WRECKS, 2)] = Point(QImage(":/marine/wreck-dangerous.png"),
Small); Small);
_points[SUBTYPE(WRECKS, 3)] = Point(QImage(":/marine/wreck.png"), Small); _points[SUBTYPE(WRECKS, 3)] = Point(QImage(":/marine/wreck.png"), Small);
_points[SUBTYPE(WRECKS, 4)] = Point(QImage(":/marine/wreck.png"), Small); _points[SUBTYPE(WRECKS, 4)] = Point(QImage(":/marine/wreck.png"), Small);
_points[SUBTYPE(WRECKS, 5)] = Point(QImage(":/marine/wreck-exposed.png")); _points[SUBTYPE(WRECKS, 5)] = Point(QImage(":/marine/wreck-exposed.png"));
_points[TYPE(UWTROC)] = Point(QImage(":/marine/rock-dangerous.png"), Small); _points[SUBTYPE(UWTROC, 1)] = Point(QImage(":/marine/rock-exposed.png"),
Small);
_points[SUBTYPE(UWTROC, 2)] = Point(QImage(":/marine/rock-exposed.png"),
Small);
_points[SUBTYPE(UWTROC, 3)] = Point(QImage(":/marine/rock-dangerous.png"),
Small);
_points[SUBTYPE(UWTROC, 4)] = Point(QImage(":/marine/rock-dangerous.png"),
Small);
_points[SUBTYPE(UWTROC, 5)] = Point(QImage(":/marine/rock-dangerous.png"),
Small);
_points[SUBTYPE(HRBFAC, 5)] = Point(QImage(":/marine/yacht-harbor.png")); _points[SUBTYPE(HRBFAC, 5)] = Point(QImage(":/marine/yacht-harbor.png"));
_points[TYPE(ACHBRT)] = Point(QImage(":/marine/anchorage.png")); _points[TYPE(ACHBRT)] = Point(QImage(":/marine/anchorage.png"));
_points[TYPE(OFSPLF)] = Point(QImage(":/marine/platform.png")); _points[TYPE(OFSPLF)] = Point(QImage(":/marine/platform.png"));

View File

@ -30,6 +30,7 @@ void ENCMap::load()
void ENCMap::unload() void ENCMap::unload()
{ {
cancelJobs(true);
_data.clear(); _data.clear();
} }
@ -56,7 +57,7 @@ int ENCMap::zoomFit(const QSize &size, const RectC &rect)
int ENCMap::zoomIn() int ENCMap::zoomIn()
{ {
cancelJobs(); cancelJobs(false);
_zoom = qMin(_zoom + 1, ZOOMS.max()); _zoom = qMin(_zoom + 1, ZOOMS.max());
updateTransform(); updateTransform();
@ -65,7 +66,7 @@ int ENCMap::zoomIn()
int ENCMap::zoomOut() int ENCMap::zoomOut()
{ {
cancelJobs(); cancelJobs(false);
_zoom = qMax(_zoom - 1, ZOOMS.min()); _zoom = qMax(_zoom - 1, ZOOMS.min());
updateTransform(); updateTransform();
@ -141,10 +142,10 @@ void ENCMap::jobFinished(ENCMapJob *job)
emit tilesLoaded(); emit tilesLoaded();
} }
void ENCMap::cancelJobs() void ENCMap::cancelJobs(bool wait)
{ {
for (int i = 0; i < _jobs.size(); i++) for (int i = 0; i < _jobs.size(); i++)
_jobs.at(i)->cancel(); _jobs.at(i)->cancel(wait);
} }
QString ENCMap::key(int zoom, const QPoint &xy) const QString ENCMap::key(int zoom, const QPoint &xy) const

View File

@ -23,7 +23,12 @@ public:
_future = QtConcurrent::map(_tiles, &ENC::RasterTile::render); _future = QtConcurrent::map(_tiles, &ENC::RasterTile::render);
_watcher.setFuture(_future); _watcher.setFuture(_future);
} }
void cancel() {_future.cancel();} void cancel(bool wait)
{
_future.cancel();
if (wait)
_future.waitForFinished();
}
const QList<ENC::RasterTile> &tiles() const {return _tiles;} const QList<ENC::RasterTile> &tiles() const {return _tiles;}
signals: signals:
@ -82,7 +87,7 @@ private:
bool isRunning(int zoom, const QPoint &xy) const; bool isRunning(int zoom, const QPoint &xy) const;
void runJob(ENCMapJob *job); void runJob(ENCMapJob *job);
void removeJob(ENCMapJob *job); void removeJob(ENCMapJob *job);
void cancelJobs(); void cancelJobs(bool wait);
QString key(int zoom, const QPoint &xy) const; QString key(int zoom, const QPoint &xy) const;
ENC::MapData _data; ENC::MapData _data;