Skip to content

Commit

Permalink
Added bridge clearance rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
tumic0 committed Jun 18, 2024
1 parent c7f76f3 commit ef7b863
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 17 deletions.
1 change: 1 addition & 0 deletions src/map/ENC/attributes.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#define RESTRN 131
#define TRAFIC 172
#define VALDCO 174
#define VERCLR 181
#define WATLEV 187

#define I_CATACH 17000
Expand Down
28 changes: 21 additions & 7 deletions src/map/ENC/mapdata.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include "GUI/units.h"
#include "objects.h"
#include "attributes.h"
#include "mapdata.h"
Expand Down Expand Up @@ -288,12 +289,20 @@ MapData::Point::Point(uint type, const Coordinates &c, const QString &label,
}

MapData::Poly::Poly(uint type, const Polygon &path,
const QVector<QByteArray> &params) : _type(type), _path(path)
const QVector<QByteArray> &params, uint HUNI) : _type(type), _path(path)
{
if (type == TYPE(DEPARE) && params.size())
_type = SUBTYPE(DEPARE, depthLevel(params.at(0)));
else if (type == TYPE(TSSLPT) && params.size())
_param = QVariant(params.at(0).toDouble());
else if ((type == TYPE(BRIDGE) || type == TYPE(I_BRIDGE))
&& params.size()) {
double clr = params.at(0).toDouble();
if (clr > 0) {
_label = QString::fromUtf8("\xE2\x86\x95") + UNIT_SPACE
+ QString::number(clr) + UNIT_SPACE + hUnits(HUNI);
}
}
}

MapData::Line::Line(uint type, const QVector<Coordinates> &path,
Expand Down Expand Up @@ -657,6 +666,9 @@ MapData::Attr MapData::polyAttr(const ISO8211::Record &r, uint OBJL)
if ((OBJL == TSSLPT && key == ORIENT)
|| (OBJL == DEPARE && key == DRVAL1))
params[0] = av.at(1).toByteArray();
if ((OBJL == BRIDGE && key == VERCLR)
|| (OBJL == I_BRIDGE && key == VERCLR))
params[0] = av.at(1).toByteArray();
}

return Attr(subtype, label, params);
Expand Down Expand Up @@ -689,18 +701,18 @@ MapData::Line *MapData::lineObject(const ISO8211::Record &r,
}

MapData::Poly *MapData::polyObject(const ISO8211::Record &r,
const RecordMap &vc, const RecordMap &ve, uint COMF, uint OBJL)
const RecordMap &vc, const RecordMap &ve, uint COMF, uint OBJL, uint HUNI)
{
Polygon path(polyGeometry(r, vc, ve, COMF));
Attr attr(polyAttr(r, OBJL));

return (path.isEmpty() ? 0 : new Poly(SUBTYPE(OBJL, attr.subtype()), path,
attr.params()));
attr.params(), HUNI));
}

bool MapData::processRecord(const ISO8211::Record &record,
QVector<ISO8211::Record> &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve,
RecordMap &vf, uint &COMF, uint &SOMF)
RecordMap &vf, uint &COMF, uint &SOMF, uint &HUNI)
{
if (record.size() < 2)
return false;
Expand Down Expand Up @@ -735,6 +747,8 @@ bool MapData::processRecord(const ISO8211::Record &record,
} else if (ba == "DSPM") {
if (!(f.subfield("COMF", &COMF) && f.subfield("SOMF", &SOMF)))
return false;
if (!f.subfield("HUNI", &HUNI))
return false;
}

return true;
Expand All @@ -746,7 +760,7 @@ MapData::MapData(const QString &path)
QVector<ISO8211::Record> fe;
ISO8211 ddf(path);
ISO8211::Record record;
uint PRIM, OBJL, COMF = 1, SOMF = 1;
uint PRIM, OBJL, COMF = 1, SOMF = 1, HUNI = 1;
Poly *poly;
Line *line;
Point *point;
Expand All @@ -756,7 +770,7 @@ MapData::MapData(const QString &path)
if (!ddf.readDDR())
return;
while (ddf.readRecord(record))
if (!processRecord(record, fe, vi, vc, ve, vf, COMF, SOMF))
if (!processRecord(record, fe, vi, vc, ve, vf, COMF, SOMF, HUNI))
qWarning("Invalid S-57 record");

for (int i = 0; i < fe.size(); i++) {
Expand Down Expand Up @@ -793,7 +807,7 @@ MapData::MapData(const QString &path)
warning(f, PRIM);
break;
case PRIM_A:
if ((poly = polyObject(r, vc, ve, COMF, OBJL))) {
if ((poly = polyObject(r, vc, ve, COMF, OBJL, HUNI))) {
rectcBounds(poly->bounds(), min, max);
_areas.Insert(min, max, poly);
} else
Expand Down
9 changes: 6 additions & 3 deletions src/map/ENC/mapdata.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,19 @@ class MapData
public:
class Poly {
public:
Poly(uint type, const Polygon &path, const QVector<QByteArray> &params);
Poly(uint type, const Polygon &path, const QVector<QByteArray> &params,
uint HUNI);

RectC bounds() const {return _path.boundingRect();}
const Polygon &path() const {return _path;}
uint type() const {return _type;}
const QString &label() const {return _label;}
const QVariant &param() const {return _param;}

private:
uint _type;
Polygon _path;
QString _label;
QVariant _param;
};

Expand Down Expand Up @@ -121,11 +124,11 @@ class MapData
static Line *lineObject(const ISO8211::Record &r, const RecordMap &vc,
const RecordMap &ve, uint COMF, uint OBJL);
static Poly *polyObject(const ISO8211::Record &r, const RecordMap &vc,
const RecordMap &ve, uint COMF,uint OBJL);
const RecordMap &ve, uint COMF, uint OBJL, uint HUNI);

static bool processRecord(const ISO8211::Record &record,
QVector<ISO8211::Record> &fe, RecordMap &vi, RecordMap &vc, RecordMap &ve,
RecordMap &vf, uint &COMF, uint &SOMF);
RecordMap &vf, uint &COMF, uint &SOMF, uint &HUNI);

PolygonTree _areas;
LineTree _lines;
Expand Down
26 changes: 19 additions & 7 deletions src/map/ENC/rastertile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,18 +241,30 @@ void RasterTile::processPolygons(const QList<MapData::Poly> &polygons,
for (int i = 0; i < polygons.size(); i++) {
const MapData::Poly &poly = polygons.at(i);
uint type = poly.type()>>16;
const QImage *img = 0;
const QString *label = 0;
const QFont *fnt = 0;
const QColor *color = 0, *hColor = 0;

if (!poly.label().isEmpty()) {
const Style::Point &style = _style->point(poly.type());
fnt = _style->font(style.textFontSize());
color = &style.textColor();
hColor = style.haloColor().isValid() ? &style.haloColor() : 0;
label = &poly.label();
}
if (type == HRBFAC || type == I_TRNBSN
|| poly.type() == SUBTYPE(I_BERTHS, 6)) {
const Style::Point &style = _style->point(poly.type());
img = style.img().isNull() ? 0 : &style.img();
}

if (!(type == HRBFAC || type == I_TRNBSN
|| poly.type() == SUBTYPE(I_BERTHS, 6)))
continue;
const Style::Point &style = _style->point(poly.type());
const QImage *img = style.img().isNull() ? 0 : &style.img();
if (!img)
if ((!label || !fnt) && !img)
continue;

TextPointItem *item = new TextPointItem(
ll2xy(centroid(poly.path().first())).toPoint(),
0, 0, img, 0, 0, 0, 0);
label, fnt, img, color, hColor, 0, 0);
if (item->isValid() && !item->collides(textItems))
textItems.append(item);
else
Expand Down

0 comments on commit ef7b863

Please sign in to comment.