diff --git a/src/map/ENC/attributes.h b/src/map/ENC/attributes.h index 9c7bb18b..c2f7bf3b 100644 --- a/src/map/ENC/attributes.h +++ b/src/map/ENC/attributes.h @@ -26,6 +26,7 @@ #define RESTRN 131 #define TRAFIC 172 #define VALDCO 174 +#define VERCLR 181 #define WATLEV 187 #define I_CATACH 17000 diff --git a/src/map/ENC/mapdata.cpp b/src/map/ENC/mapdata.cpp index a0300abb..d321408e 100644 --- a/src/map/ENC/mapdata.cpp +++ b/src/map/ENC/mapdata.cpp @@ -1,3 +1,4 @@ +#include "GUI/units.h" #include "objects.h" #include "attributes.h" #include "mapdata.h" @@ -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 ¶ms) : _type(type), _path(path) + const QVector ¶ms, 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 &path, @@ -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); @@ -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 &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; @@ -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; @@ -746,7 +760,7 @@ MapData::MapData(const QString &path) QVector 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; @@ -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++) { @@ -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 diff --git a/src/map/ENC/mapdata.h b/src/map/ENC/mapdata.h index 785e0011..5a8f4222 100644 --- a/src/map/ENC/mapdata.h +++ b/src/map/ENC/mapdata.h @@ -13,16 +13,19 @@ class MapData public: class Poly { public: - Poly(uint type, const Polygon &path, const QVector ¶ms); + Poly(uint type, const Polygon &path, const QVector ¶ms, + 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 ¶m() const {return _param;} private: uint _type; Polygon _path; + QString _label; QVariant _param; }; @@ -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 &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; diff --git a/src/map/ENC/rastertile.cpp b/src/map/ENC/rastertile.cpp index c98ccc08..6a06634a 100644 --- a/src/map/ENC/rastertile.cpp +++ b/src/map/ENC/rastertile.cpp @@ -241,18 +241,30 @@ void RasterTile::processPolygons(const QList &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