source: osm/applications/editors/josm/plugins/smed2/src/render/Rules.java@ 30412

Last change on this file since 30412 was 30388, checked in by malcolmh, 11 years ago

save

File size: 48.1 KB
Line 
1/* Copyright 2014 Malcolm Herring
2 *
3 * This is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, version 3 of the License.
6 *
7 * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
8 */
9
10package render;
11
12import java.awt.Color;
13import java.awt.Font;
14import java.awt.geom.AffineTransform;
15import java.util.ArrayList;
16import java.util.EnumMap;
17import java.util.HashMap;
18
19import s57.S57val;
20import s57.S57val.*;
21import s57.S57att.*;
22import s57.S57obj.*;
23import s57.S57map.*;
24import render.Renderer.*;
25import symbols.*;
26import symbols.Symbols.*;
27
28public class Rules {
29
30 public static final Color Yland = new Color(0x50b0ff);
31 public static final Color Mline = new Color(0xc480ff);
32 public static final Color Msymb = new Color(0xa30075);
33
34 static final EnumMap<ColCOL, Color> bodyColours = new EnumMap<ColCOL, Color>(ColCOL.class);
35 static {
36 bodyColours.put(ColCOL.COL_UNK, new Color(0, true));
37 bodyColours.put(ColCOL.COL_WHT, new Color(0xffffff));
38 bodyColours.put(ColCOL.COL_BLK, new Color(0x000000));
39 bodyColours.put(ColCOL.COL_RED, new Color(0xd40000));
40 bodyColours.put(ColCOL.COL_GRN, new Color(0x00d400));
41 bodyColours.put(ColCOL.COL_BLU, Color.blue);
42 bodyColours.put(ColCOL.COL_YEL, new Color(0xffd400));
43 bodyColours.put(ColCOL.COL_GRY, Color.gray);
44 bodyColours.put(ColCOL.COL_BRN, new Color(0x8b4513));
45 bodyColours.put(ColCOL.COL_AMB, new Color(0xfbf00f));
46 bodyColours.put(ColCOL.COL_VIO, new Color(0xee82ee));
47 bodyColours.put(ColCOL.COL_ORG, Color.orange);
48 bodyColours.put(ColCOL.COL_MAG, new Color(0xf000f0));
49 bodyColours.put(ColCOL.COL_PNK, Color.pink);
50 }
51
52 static final EnumMap<ColPAT, Patt> pattMap = new EnumMap<ColPAT, Patt>(ColPAT.class);
53 static {
54 pattMap.put(ColPAT.PAT_UNKN, Patt.Z);
55 pattMap.put(ColPAT.PAT_HORI, Patt.H);
56 pattMap.put(ColPAT.PAT_VERT, Patt.V);
57 pattMap.put(ColPAT.PAT_DIAG, Patt.D);
58 pattMap.put(ColPAT.PAT_BRDR, Patt.B);
59 pattMap.put(ColPAT.PAT_SQUR, Patt.S);
60 pattMap.put(ColPAT.PAT_CROS, Patt.C);
61 pattMap.put(ColPAT.PAT_SALT, Patt.X);
62 pattMap.put(ColPAT.PAT_STRP, Patt.H);
63 }
64
65 static String getName(Feature feature) {
66 AttVal<?> name = feature.atts.get(Att.OBJNAM);
67 if (name == null) {
68 AttMap atts = feature.objs.get(feature.type).get(0);
69 if (atts != null) {
70 name = atts.get(Att.OBJNAM);
71 }
72 }
73 return (name != null) ? (String)name.val: null;
74 }
75
76 public static void addName(Feature feature, int z, Font font) {
77 addName(feature, z, font, Color.black, new Delta(Handle.CC, new AffineTransform()));
78 }
79 public static void addName(Feature feature, int z, Font font, Color colour) {
80 addName(feature, z, font, colour, new Delta(Handle.CC, new AffineTransform()));
81 }
82 public static void addName(Feature feature, int z, Font font, Delta delta) {
83 addName(feature, z, font, Color.black, delta);
84 }
85 public static void addName(Feature feature, int z, Font font, Color colour, Delta delta) {
86 if (Renderer.zoom >= z) {
87 String name = getName(feature);
88 if (name != null) {
89 Renderer.labelText(feature, name, font, colour, delta);
90 }
91 }
92 }
93
94 static AttMap getAtts(Feature feature, Obj obj, int idx) {
95 HashMap<Integer, AttMap> objs = feature.objs.get(obj);
96 if (objs == null)
97 return null;
98 else
99 return objs.get(idx);
100 }
101
102 public static Object getAttVal(Feature feature, Obj obj, int idx, Att att) {
103 AttMap atts = null;
104 HashMap<Integer, AttMap> objs = feature.objs.get(obj);
105 if (objs != null)
106 atts = objs.get(idx);
107 if (atts == null)
108 return S57val.nullVal(att);
109 else {
110 AttVal<?> item = atts.get(att);
111 if (item == null)
112 return S57val.nullVal(att);
113 return item.val;
114 }
115 }
116
117 static Scheme getScheme(Feature feature, Obj obj) {
118 ArrayList<Color> colours = new ArrayList<Color>();
119 for (ColCOL col : (ArrayList<ColCOL>)getAttVal(feature, obj, 0, Att.COLOUR)) {
120 colours.add(bodyColours.get(col));
121 }
122 ArrayList<Patt> patterns = new ArrayList<Patt>();
123 for(ColPAT pat: (ArrayList<ColPAT>) getAttVal(feature, obj, 0, Att.COLPAT)) {
124 patterns.add(pattMap.get(pat));
125 }
126 return new Scheme(patterns, colours);
127 }
128
129 static boolean testAttribute(Feature feature, Obj obj, int idx, Att att, Object val) {
130 AttMap atts = getAtts(feature, obj, idx);
131 if (atts != null) {
132 AttVal item = atts.get(att);
133 if (item != null) {
134 switch (item.conv) {
135 case S:
136 case A:
137 return ((String)item.val).equals(val);
138 case L:
139 return ((ArrayList<?>)item.val).contains(val);
140 case E:
141 case F:
142 case I:
143 return item.val.equals(val);
144 }
145 }
146 }
147 return false;
148 }
149
150 public static void rules () {
151 ArrayList<Feature> objects;
152 if ((objects = Renderer.map.features.get(Obj.SLCONS)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) shoreline(feature);
153 if ((objects = Renderer.map.features.get(Obj.PIPSOL)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) pipelines(feature);
154 if ((objects = Renderer.map.features.get(Obj.CBLSUB)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) cables(feature);
155 if ((objects = Renderer.map.features.get(Obj.PIPOHD)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) pipelines(feature);
156 if ((objects = Renderer.map.features.get(Obj.CBLOHD)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) cables(feature);
157 if ((objects = Renderer.map.features.get(Obj.TSEZNE)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) separation(feature);
158 if ((objects = Renderer.map.features.get(Obj.TSSCRS)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) separation(feature);
159 if ((objects = Renderer.map.features.get(Obj.TSSRON)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) separation(feature);
160 if ((objects = Renderer.map.features.get(Obj.TSELNE)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) separation(feature);
161 if ((objects = Renderer.map.features.get(Obj.TSSLPT)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) separation(feature);
162 if ((objects = Renderer.map.features.get(Obj.TSSBND)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) separation(feature);
163 if ((objects = Renderer.map.features.get(Obj.ISTZNE)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) separation(feature);
164 if ((objects = Renderer.map.features.get(Obj.SNDWAV)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) areas(feature);
165 if ((objects = Renderer.map.features.get(Obj.OSPARE)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) areas(feature);
166 if ((objects = Renderer.map.features.get(Obj.FAIRWY)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) areas(feature);
167 if ((objects = Renderer.map.features.get(Obj.DRGARE)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) areas(feature);
168 if ((objects = Renderer.map.features.get(Obj.RESARE)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) areas(feature);
169 if ((objects = Renderer.map.features.get(Obj.SPLARE)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) areas(feature);
170 if ((objects = Renderer.map.features.get(Obj.SEAARE)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) areas(feature);
171 if ((objects = Renderer.map.features.get(Obj.OBSTRN)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) obstructions(feature);
172 if ((objects = Renderer.map.features.get(Obj.UWTROC)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) obstructions(feature);
173 if ((objects = Renderer.map.features.get(Obj.MARCUL)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) areas(feature);
174 if ((objects = Renderer.map.features.get(Obj.WTWAXS)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) waterways(feature);
175 if ((objects = Renderer.map.features.get(Obj.RECTRC)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) transits(feature);
176 if ((objects = Renderer.map.features.get(Obj.NAVLNE)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) transits(feature);
177 if ((objects = Renderer.map.features.get(Obj.HRBFAC)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) harbours(feature);
178 if ((objects = Renderer.map.features.get(Obj.ACHARE)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) harbours(feature);
179 if ((objects = Renderer.map.features.get(Obj.ACHBRT)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) harbours(feature);
180 if ((objects = Renderer.map.features.get(Obj.BERTHS)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) harbours(feature);
181 if ((objects = Renderer.map.features.get(Obj.LOKBSN)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) locks(feature);
182 if ((objects = Renderer.map.features.get(Obj.LKBSPT)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) locks(feature);
183 if ((objects = Renderer.map.features.get(Obj.GATCON)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) locks(feature);
184 if ((objects = Renderer.map.features.get(Obj.DISMAR)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) distances(feature);
185 if ((objects = Renderer.map.features.get(Obj.HULKES)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) ports(feature);
186 if ((objects = Renderer.map.features.get(Obj.CRANES)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) ports(feature);
187 if ((objects = Renderer.map.features.get(Obj.LNDMRK)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) landmarks(feature);
188 if ((objects = Renderer.map.features.get(Obj.BUISGL)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) harbours(feature);
189 if ((objects = Renderer.map.features.get(Obj.MORFAC)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) moorings(feature);
190 if ((objects = Renderer.map.features.get(Obj.NOTMRK)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) notices(feature);
191 if ((objects = Renderer.map.features.get(Obj.SMCFAC)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) marinas(feature);
192 if ((objects = Renderer.map.features.get(Obj.BRIDGE)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) bridges(feature);
193 if ((objects = Renderer.map.features.get(Obj.PILPNT)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) lights(feature);
194 if ((objects = Renderer.map.features.get(Obj.LITMIN)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) lights(feature);
195 if ((objects = Renderer.map.features.get(Obj.LITMAJ)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) lights(feature);
196 if ((objects = Renderer.map.features.get(Obj.LIGHTS)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) lights(feature);
197 if ((objects = Renderer.map.features.get(Obj.SISTAT)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) stations(feature);
198 if ((objects = Renderer.map.features.get(Obj.SISTAW)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) stations(feature);
199 if ((objects = Renderer.map.features.get(Obj.CGUSTA)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) stations(feature);
200 if ((objects = Renderer.map.features.get(Obj.RDOSTA)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) stations(feature);
201 if ((objects = Renderer.map.features.get(Obj.RADSTA)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) stations(feature);
202 if ((objects = Renderer.map.features.get(Obj.RSCSTA)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) stations(feature);
203 if ((objects = Renderer.map.features.get(Obj.PILBOP)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) stations(feature);
204 if ((objects = Renderer.map.features.get(Obj.WTWGAG)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) gauges(feature);
205 if ((objects = Renderer.map.features.get(Obj.OFSPLF)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) platforms(feature);
206 if ((objects = Renderer.map.features.get(Obj.WRECKS)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) wrecks(feature);
207 if ((objects = Renderer.map.features.get(Obj.LITVES)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) floats(feature);
208 if ((objects = Renderer.map.features.get(Obj.LITFLT)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) floats(feature);
209 if ((objects = Renderer.map.features.get(Obj.BOYINB)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) floats(feature);
210 if ((objects = Renderer.map.features.get(Obj.BOYLAT)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) buoys(feature);
211 if ((objects = Renderer.map.features.get(Obj.BOYCAR)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) buoys(feature);
212 if ((objects = Renderer.map.features.get(Obj.BOYISD)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) buoys(feature);
213 if ((objects = Renderer.map.features.get(Obj.BOYSAW)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) buoys(feature);
214 if ((objects = Renderer.map.features.get(Obj.BOYSPP)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) buoys(feature);
215 if ((objects = Renderer.map.features.get(Obj.BOYWTW)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) buoys(feature);
216 if ((objects = Renderer.map.features.get(Obj.BCNLAT)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) beacons(feature);
217 if ((objects = Renderer.map.features.get(Obj.BCNCAR)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) beacons(feature);
218 if ((objects = Renderer.map.features.get(Obj.BCNISD)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) beacons(feature);
219 if ((objects = Renderer.map.features.get(Obj.BCNSAW)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) beacons(feature);
220 if ((objects = Renderer.map.features.get(Obj.BCNSPP)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) beacons(feature);
221 if ((objects = Renderer.map.features.get(Obj.BCNWTW)) != null) for (Feature feature : objects) if (feature.reln == Rflag.MASTER) beacons(feature);
222 }
223
224 private static void areas(Feature feature) {
225 String name = getName(feature);
226 switch (feature.type) {
227 case DRGARE:
228 if (Renderer.zoom < 16)
229 Renderer.lineVector(feature, new LineStyle(Color.black, 8, new float[] { 25, 25 }, new Color(0x40ffffff, true)));
230 else
231 Renderer.lineVector(feature, new LineStyle(Color.black, 8, new float[] { 25, 25 }));
232 addName(feature, 12, new Font("Arial", Font.PLAIN, 100), new Delta(Handle.CC, new AffineTransform()));
233 break;
234 case FAIRWY:
235 if (feature.geom.area > 2.0) {
236 if (Renderer.zoom < 16)
237 Renderer.lineVector(feature, new LineStyle(Mline, 8, new float[] { 50, 50 }, new Color(0x40ffffff, true)));
238 else
239 Renderer.lineVector(feature, new LineStyle(Mline, 8, new float[] { 50, 50 }));
240 } else {
241 if (Renderer.zoom >= 14)
242 Renderer.lineVector(feature, new LineStyle(null, 0, new Color(0x40ffffff, true)));
243 }
244 break;
245 case MARCUL:
246 if (Renderer.zoom >= 12) {
247 if (Renderer.zoom >= 14) {
248 Renderer.symbol(feature, Areas.MarineFarm);
249 }
250 if ((feature.geom.area > 0.2) || ((feature.geom.area > 0.05) && (Renderer.zoom >= 14)) || ((feature.geom.area > 0.005) && (Renderer.zoom >= 16))) {
251 Renderer.lineVector(feature, new LineStyle(Color.black, 4, new float[] { 10, 10 }));
252 }
253 }
254 break;
255 case OSPARE:
256 if (testAttribute(feature, feature.type, 0, Att.CATPRA, CatPRA.PRA_WFRM)) {
257 Renderer.symbol(feature, Areas.WindFarm);
258 Renderer.lineVector(feature, new LineStyle(Color.black, 20, new float[] { 40, 40 }));
259 addName(feature, 15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 10)));
260 }
261 break;
262 case RESARE:
263 case MIPARE:
264 if (Renderer.zoom >= 12) {
265 Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, Mline);
266 if (testAttribute(feature, feature.type, 0, Att.CATREA, CatREA.REA_NWAK)) {
267 Renderer.symbol(feature, Areas.NoWake);
268 }
269 }
270 break;
271 case SEAARE:
272 switch ((CatSEA) getAttVal(feature, feature.type, 0, Att.CATSEA)) {
273 case SEA_RECH:
274 if ((Renderer.zoom >= 10) && (name != null))
275 if (feature.geom.prim == Pflag.LINE) {
276 Renderer.lineText(feature, name, new Font("Arial", Font.PLAIN, 150), Color.black, 0.5, -40);
277 } else {
278 Renderer.labelText(feature, name, new Font("Arial", Font.PLAIN, 150), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
279 }
280 break;
281 case SEA_BAY:
282 if ((Renderer.zoom >= 12) && (name != null))
283 if (feature.geom.prim == Pflag.LINE) {
284 Renderer.lineText(feature, name, new Font("Arial", Font.PLAIN, 150), Color.black, 0.5, -40);
285 } else {
286 Renderer.labelText(feature, name, new Font("Arial", Font.PLAIN, 150), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
287 }
288 break;
289 case SEA_SHOL:
290 if (Renderer.zoom >= 14) {
291 if (feature.geom.prim == Pflag.AREA) {
292 Renderer.lineVector(feature, new LineStyle(new Color(0xc480ff), 4, new float[] { 25, 25 }));
293 if (name != null) {
294 Renderer.labelText(feature, name, new Font("Arial", Font.ITALIC, 75), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
295 Renderer.labelText(feature, "(Shoal)", new Font("Arial", Font.PLAIN, 60), Color.black, new Delta(Handle.BC));
296 }
297 } else if (feature.geom.prim == Pflag.LINE) {
298 if (name != null) {
299 Renderer.lineText(feature, name, new Font("Arial", Font.ITALIC, 75), Color.black, 0.5, -40);
300 Renderer.lineText(feature, "(Shoal)", new Font("Arial", Font.PLAIN, 60), Color.black, 0.5, 0);
301 }
302 } else {
303 if (name != null) {
304 Renderer.labelText(feature, name, new Font("Arial", Font.ITALIC, 75), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -40)));
305 Renderer.labelText(feature, "(Shoal)", new Font("Arial", Font.PLAIN, 60), Color.black, new Delta(Handle.BC));
306 }
307 }
308 }
309 break;
310 case SEA_GAT:
311 case SEA_NRRW:
312 addName(feature, 12, new Font("Arial", Font.PLAIN, 100));
313 break;
314 default:
315 break;
316 }
317 break;
318 case SNDWAV:
319 if (Renderer.zoom >= 12) Renderer.fillPattern(feature, Areas.Sandwaves);
320 break;
321 case SPLARE:
322 if (Renderer.zoom >= 12) {
323 Renderer.symbol(feature, Areas.Plane, new Scheme(Msymb));
324 Renderer.lineSymbols(feature, Areas.Restricted, 0.5, Areas.LinePlane, null, 10, Mline);
325 }
326 addName(feature, 15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
327 break;
328 default:
329 break;
330 }
331 }
332
333 private static void beacons(Feature feature) {
334 if ((Renderer.zoom >= 14) || ((Renderer.zoom >= 12) && ((feature.type == Obj.BCNLAT) || (feature.type == Obj.BCNCAR)))) {
335 BcnSHP shape = (BcnSHP) getAttVal(feature, feature.type, 0,
336 Att.BCNSHP);
337 if ((shape == BcnSHP.BCN_WTHY) && (feature.type == Obj.BCNLAT)) {
338 CatLAM cat = (CatLAM) getAttVal(feature, feature.type, 0, Att.CATLAM);
339 switch (cat) {
340 case LAM_PORT:
341 Renderer.symbol(feature, Beacons.WithyPort);
342 break;
343 case LAM_STBD:
344 Renderer.symbol(feature, Beacons.WithyStarboard);
345 break;
346 default:
347 Renderer.symbol(feature, Beacons.Stake, getScheme(feature, feature.type));
348 }
349 } else if ((shape == BcnSHP.BCN_PRCH) && (feature.type == Obj.BCNLAT) && !(feature.objs.containsKey(Obj.TOPMAR))) {
350 CatLAM cat = (CatLAM) getAttVal(feature, feature.type, 0, Att.CATLAM);
351 switch (cat) {
352 case LAM_PORT:
353 Renderer.symbol(feature, Beacons.PerchPort);
354 break;
355 case LAM_STBD:
356 Renderer.symbol(feature, Beacons.PerchStarboard);
357 break;
358 default:
359 Renderer.symbol(feature, Beacons.Stake, getScheme(feature, feature.type));
360 }
361 } else {
362 Renderer.symbol(feature, Beacons.Shapes.get(shape), getScheme(feature, feature.type));
363 if (feature.objs.containsKey(Obj.TOPMAR)) {
364 Symbol topmark = Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val);
365 if (topmark != null)
366 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), getScheme(feature, Obj.TOPMAR), Topmarks.BeaconDelta);
367 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
368 Symbol topmark = Topmarks.Shapes.get(feature.objs.get(Obj.DAYMAR).get(0).get(Att.TOPSHP).val);
369 if (topmark != null)
370 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.DAYMAR).get(0).get(Att.TOPSHP).val), getScheme(feature, Obj.DAYMAR), Topmarks.BeaconDelta);
371 }
372 }
373 Signals.addSignals(feature);
374 }
375 }
376
377 private static void buoys(Feature feature) {
378 if ((Renderer.zoom >= 14) || ((Renderer.zoom >= 12) && ((feature.type == Obj.BOYLAT) || (feature.type == Obj.BOYCAR)))) {
379 BoySHP shape = (BoySHP) getAttVal(feature, feature.type, 0, Att.BOYSHP);
380 Renderer.symbol(feature, Buoys.Shapes.get(shape), getScheme(feature, feature.type));
381 if (feature.objs.containsKey(Obj.TOPMAR)) {
382 Symbol topmark = Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val);
383 if (topmark != null)
384 Renderer.symbol(feature, topmark, getScheme(feature, Obj.TOPMAR), Topmarks.BuoyDeltas.get(shape));
385 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
386 Symbol topmark = Topmarks.Shapes.get(feature.objs.get(Obj.DAYMAR).get(0).get(Att.TOPSHP).val);
387 if (topmark != null)
388 Renderer.symbol(feature, topmark, getScheme(feature, Obj.DAYMAR), Topmarks.BuoyDeltas.get(shape));
389 }
390 Signals.addSignals(feature);
391 }
392 }
393
394 private static void bridges(Feature feature) {
395 if (Renderer.zoom >= 16) {
396 double verclr, verccl, vercop, horclr;
397 AttMap atts = feature.objs.get(Obj.BRIDGE).get(0);
398 String vstr = "";
399 String hstr = "";
400 if (atts != null) {
401 if (atts.containsKey(Att.HORCLR)) {
402 horclr = (Double) atts.get(Att.HORCLR).val;
403 hstr = String.valueOf(horclr);
404 }
405 if (atts.containsKey(Att.VERCLR)) {
406 verclr = (Double) atts.get(Att.VERCLR).val;
407 } else {
408 verclr = atts.containsKey(Att.VERCSA) ? (Double) atts.get(Att.VERCSA).val : 0;
409 }
410 verccl = atts.containsKey(Att.VERCCL) ? (Double) atts.get(Att.VERCCL).val : 0;
411 vercop = atts.containsKey(Att.VERCOP) ? (Double) atts.get(Att.VERCOP).val : 0;
412 if (verclr > 0) {
413 vstr += String.valueOf(verclr);
414 } else if (verccl > 0) {
415 if (vercop == 0) {
416 vstr += String.valueOf(verccl) + "/-";
417 } else {
418 vstr += String.valueOf(verccl) + "/" + String.valueOf(vercop);
419 }
420 }
421 if (hstr.isEmpty() && !vstr.isEmpty()) {
422 Renderer.labelText(feature, vstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.VCLR, Color.black, Color.white, new Delta(Handle.CC));
423 } else if (!hstr.isEmpty() && !vstr.isEmpty()) {
424 Renderer.labelText(feature, vstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.VCLR, Color.black, Color.white, new Delta(Handle.BC));
425 Renderer.labelText(feature, hstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.HCLR, Color.black, Color.white, new Delta(Handle.TC));
426 } else if (!hstr.isEmpty() && vstr.isEmpty()) {
427 Renderer.labelText(feature, hstr, new Font("Arial", Font.PLAIN, 30), Color.black, LabelStyle.HCLR, Color.black, Color.white, new Delta(Handle.CC));
428 }
429 }
430 }
431 }
432
433 private static void cables(Feature feature) {
434 if ((Renderer.zoom >= 16) && (feature.geom.length < 2)) {
435 if (feature.type == Obj.CBLSUB) {
436 Renderer.lineSymbols(feature, Areas.Cable, 0.0, null, null, 0, Mline);
437 } else if (feature.type == Obj.CBLOHD) {
438 AttMap atts = feature.objs.get(Obj.CBLOHD).get(0);
439 if ((atts != null) && (atts.containsKey(Att.CATCBL)) && (atts.get(Att.CATCBL).val == CatCBL.CBL_POWR)) {
440 Renderer.lineSymbols(feature, Areas.CableDash, 0, Areas.CableDot, Areas.CableFlash, 2, Color.black);
441 } else {
442 Renderer.lineSymbols(feature, Areas.CableDash, 0, Areas.CableDot, null, 2, Color.black);
443 }
444 if (atts != null) {
445 if (atts.containsKey(Att.VERCLR)) {
446 Renderer.labelText(feature, String.valueOf((Double) atts.get(Att.VERCLR).val), new Font("Arial", Font.PLAIN, 50), Color.black, LabelStyle.VCLR, Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0,25)));
447 } else if (atts.containsKey(Att.VERCSA)) {
448 Renderer.labelText(feature, String.valueOf((Double) atts.get(Att.VERCSA).val), new Font("Arial", Font.PLAIN, 50), Color.black, LabelStyle.PCLR, Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0,25)));
449 }
450 }
451 }
452 }
453 }
454
455 private static void distances(Feature feature) {
456 if (Renderer.zoom >= 14) {
457 if (!testAttribute(feature, Obj.DISMAR, 0, Att.CATDIS, CatDIS.DIS_NONI)) {
458 Renderer.symbol(feature, Harbours.DistanceI);
459 } else {
460 Renderer.symbol(feature, Harbours.DistanceU);
461 }
462 if (Renderer.zoom >= 15) {
463 AttMap atts = getAtts(feature, Obj.DISMAR, 0);
464 if ((atts != null) && (atts.containsKey(Att.WTWDIS))) {
465 Double dist = (Double) atts.get(Att.WTWDIS).val;
466 String str = "";
467 if (atts.containsKey(Att.HUNITS)) {
468 switch ((UniHLU) atts.get(Att.HUNITS).val) {
469 case HLU_METR:
470 str += "m ";
471 break;
472 case HLU_FEET:
473 str += "ft ";
474 break;
475 case HLU_HMTR:
476 str += "hm ";
477 break;
478 case HLU_KMTR:
479 str += "km ";
480 break;
481 case HLU_SMIL:
482 str += "M ";
483 break;
484 case HLU_NMIL:
485 str += "NM ";
486 break;
487 default:
488 break;
489 }
490 }
491 str += String.format("%1.0f", dist);
492 Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), Color.black, new Delta(Handle.CC, AffineTransform.getTranslateInstance(0, 45)));
493 }
494 }
495 }
496 }
497
498 private static void floats(Feature feature) {
499 switch (feature.type) {
500 case LITVES:
501 Renderer.symbol(feature, Buoys.Super, getScheme(feature, feature.type));
502 break;
503 case LITFLT:
504 Renderer.symbol(feature, Buoys.Float, getScheme(feature, feature.type));
505 break;
506 case BOYINB:
507 Renderer.symbol(feature, Buoys.Super, getScheme(feature, feature.type));
508 break;
509 default:
510 break;
511 }
512 if (feature.objs.get(Obj.TOPMAR) != null)
513 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), getScheme(feature, Obj.TOPMAR), Topmarks.FloatDelta);
514 Signals.addSignals(feature);
515 }
516
517 private static void gauges(Feature feature) {
518 if (Renderer.zoom >= 14) {
519 Renderer.symbol(feature, Harbours.TideGauge);
520 Signals.addSignals(feature);
521 }
522 }
523
524 private static void harbours(Feature feature) {
525 String name = getName(feature);
526 switch (feature.type) {
527 case ACHBRT:
528 if (Renderer.zoom >= 14) {
529 Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Mline));
530 if (Renderer.zoom >= 15) {
531 Renderer.labelText(feature, name == null ? "" : name, new Font("Arial", Font.PLAIN, 30), Msymb, LabelStyle.RRCT, Mline, Color.white, new Delta(Handle.BC));
532 }
533 }
534 double radius = (Double)getAttVal(feature, Obj.ACHBRT, 0, Att.RADIUS);
535 if (radius != 0) {
536 UniHLU units = (UniHLU)getAttVal(feature, Obj.ACHBRT, 0, Att.HUNITS);
537 Renderer.lineCircle (feature, new LineStyle(Mline, 4, new float[] { 10, 10 }, null), radius, units);
538 }
539 break;
540 case ACHARE:
541 if (Renderer.zoom >= 12) {
542 if (feature.geom.prim != Pflag.AREA) {
543 Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Color.black));
544 } else {
545 Renderer.symbol(feature, Harbours.Anchorage, new Scheme(Mline));
546 Renderer.lineSymbols(feature, Areas.Restricted, 1.0, Areas.LineAnchor, null, 10, Mline);
547 }
548 addName(feature, 15, new Font("Arial", Font.BOLD, 60), Mline, new Delta(Handle.LC, AffineTransform.getTranslateInstance(70, 0)));
549 ArrayList<StsSTS> sts = (ArrayList<StsSTS>)getAttVal(feature, Obj.ACHARE, 0, Att.STATUS);
550 if ((Renderer.zoom >= 15) && (sts != null) && (sts.contains(StsSTS.STS_RESV))) {
551 Renderer.labelText(feature, "Reserved", new Font("Arial", Font.PLAIN, 50), Mline, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 60)));
552 }
553 }
554 ArrayList<CatACH> cats = (ArrayList<CatACH>)getAttVal(feature, Obj.ACHARE, 0, Att.CATACH);
555 int dy = (cats.size() - 1) * -30;
556 for (CatACH cat : cats) {
557 switch (cat) {
558 case ACH_DEEP:
559 Renderer.labelText(feature, "DW", new Font("Arial", Font.BOLD, 50), Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
560 dy += 60;
561 break;
562 case ACH_TANK:
563 Renderer.labelText(feature, "Tanker", new Font("Arial", Font.BOLD, 50), Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
564 dy += 60;
565 break;
566 case ACH_H24P:
567 Renderer.labelText(feature, "24h", new Font("Arial", Font.BOLD, 50), Msymb, new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
568 dy += 60;
569 break;
570 case ACH_EXPL:
571 Renderer.symbol(feature, Harbours.Explosives, new Scheme(Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
572 dy += 60;
573 break;
574 case ACH_QUAR:
575 Renderer.symbol(feature, Harbours.Hospital, new Scheme(Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
576 dy += 60;
577 break;
578 case ACH_SEAP:
579 Renderer.symbol(feature, Areas.Seaplane, new Scheme(Msymb), new Delta(Handle.RC, AffineTransform.getTranslateInstance(-60, dy)));
580 dy += 60;
581 break;
582 default:
583 }
584 }
585 break;
586 case BERTHS:
587 if (Renderer.zoom >= 14) {
588 Renderer.lineVector(feature, new LineStyle(Mline, 6, new float[] { 20, 20 }));
589 Renderer.labelText(feature, name == null ? " " : name, new Font("Arial", Font.PLAIN, 40), Msymb, LabelStyle.RRCT, Mline, Color.white);
590 }
591 break;
592 case BUISGL:
593 if (Renderer.zoom >= 16) {
594 ArrayList<Symbol> symbols = new ArrayList<Symbol>();
595 ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) getAttVal(feature, Obj.BUISGL, 0, Att.FUNCTN);
596 for (FncFNC fnc : fncs) {
597 symbols.add(Landmarks.Funcs.get(fnc));
598 }
599 if (feature.objs.containsKey(Obj.SMCFAC)) {
600 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttVal(feature, Obj.SMCFAC, 0, Att.CATSCF);
601 for (CatSCF scf : scfs) {
602 symbols.add(Facilities.Cats.get(scf));
603 }
604 }
605 Renderer.cluster(feature, symbols);
606 }
607 break;
608 case HRBFAC:
609 if (Renderer.zoom >= 12) {
610 ArrayList<CatHAF> cathaf = (ArrayList<CatHAF>) getAttVal(feature, Obj.HRBFAC, 0, Att.CATHAF);
611 if (cathaf.size() == 1) {
612 switch (cathaf.get(0)) {
613 case HAF_MRNA:
614 Renderer.symbol(feature, Harbours.Marina);
615 break;
616 case HAF_MANF:
617 Renderer.symbol(feature, Harbours.MarinaNF);
618 break;
619 case HAF_FISH:
620 Renderer.symbol(feature, Harbours.Fishing);
621 break;
622 default:
623 Renderer.symbol(feature, Harbours.Harbour);
624 break;
625 }
626 } else {
627 Renderer.symbol(feature, Harbours.Harbour);
628 }
629 }
630 break;
631 default:
632 break;
633 }
634 }
635
636 private static void landmarks(Feature feature) {
637 ArrayList<CatLMK> cats = (ArrayList<CatLMK>) getAttVal(feature, feature.type, 0, Att.CATLMK);
638 Symbol catSym = Landmarks.Shapes.get(cats.get(0));
639 ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) getAttVal(feature, feature.type, 0, Att.FUNCTN);
640 Symbol fncSym = Landmarks.Funcs.get(fncs.get(0));
641 if ((fncs.get(0) == FncFNC.FNC_CHCH) && (cats.get(0) == CatLMK.LMK_TOWR))
642 catSym = Landmarks.ChurchTower;
643 if ((cats.get(0) == CatLMK.LMK_UNKN) && (fncs.get(0) == FncFNC.FNC_UNKN) && (feature.objs.get(Obj.LIGHTS) != null))
644 catSym = Beacons.LightMajor;
645 if (cats.get(0) == CatLMK.LMK_RADR)
646 fncSym = Landmarks.RadioTV;
647 Renderer.symbol(feature, catSym);
648 Renderer.symbol(feature, fncSym);
649 addName(feature, 15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50)));
650 Signals.addSignals(feature);
651 }
652
653 private static void lights(Feature feature) {
654 switch (feature.type) {
655 case LITMAJ:
656 Renderer.symbol(feature, Beacons.LightMajor);
657 break;
658 case LITMIN:
659 case LIGHTS:
660 Renderer.symbol(feature, Beacons.LightMinor);
661 break;
662 case PILPNT:
663 if (feature.objs.containsKey(Obj.LIGHTS))
664 Renderer.symbol(feature, Beacons.LightMinor);
665 else
666 Renderer.symbol(feature, Harbours.Post);
667 break;
668 default:
669 break;
670 }
671 if (feature.objs.containsKey(Obj.TOPMAR)) {
672 Symbol topmark = Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val);
673 if (topmark != null)
674 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), getScheme(feature, Obj.TOPMAR), Topmarks.LightDelta);
675 } else if (feature.objs.containsKey(Obj.DAYMAR)) {
676 Symbol topmark = Topmarks.Shapes.get(feature.objs.get(Obj.DAYMAR).get(0).get(Att.TOPSHP).val);
677 if (topmark != null)
678 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.DAYMAR).get(0).get(Att.TOPSHP).val), getScheme(feature, Obj.DAYMAR), Topmarks.LightDelta);
679 }
680 Signals.addSignals(feature);
681 }
682
683 private static void locks(Feature feature) {
684 }
685
686 private static void marinas(Feature feature) {
687 if (Renderer.zoom >= 16) {
688 ArrayList<Symbol> symbols = new ArrayList<Symbol>();
689 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttVal(feature, Obj.SMCFAC, 0, Att.CATSCF);
690 for (CatSCF scf : scfs) {
691 symbols.add(Facilities.Cats.get(scf));
692 }
693 Renderer.cluster(feature, symbols);
694 }
695 }
696
697 private static void moorings(Feature feature) {
698 switch ((CatMOR) getAttVal(feature, feature.type, 0, Att.CATMOR)) {
699 case MOR_DLPN:
700 Renderer.symbol(feature, Harbours.Dolphin);
701 break;
702 case MOR_DDPN:
703 Renderer.symbol(feature, Harbours.DeviationDolphin);
704 break;
705 case MOR_BLRD:
706 case MOR_POST:
707 Renderer.symbol(feature, Harbours.Bollard);
708 break;
709 case MOR_BUOY:
710 BoySHP shape = (BoySHP) getAttVal(feature, feature.type, 0, Att.BOYSHP);
711 if (shape == BoySHP.BOY_UNKN)
712 shape = BoySHP.BOY_SPHR;
713 Renderer.symbol(feature, Buoys.Shapes.get(shape), getScheme(feature, feature.type));
714 Renderer.symbol(feature, Topmarks.TopMooring, Topmarks.BuoyDeltas.get(shape));
715 break;
716 }
717 Signals.addSignals(feature);
718 }
719
720 private static void notices(Feature feature) {
721 if (Renderer.zoom >= 14) {
722 double dx = 0.0, dy = 0.0;
723 switch (feature.type) {
724 case BCNCAR:
725 case BCNISD:
726 case BCNLAT:
727 case BCNSAW:
728 case BCNSPP:
729 case BCNWTW:
730 dy = 45.0;
731 break;
732 case NOTMRK:
733 dy = 0.0;
734 break;
735 default:
736 return;
737 }
738 Symbol s1 = null, s2 = null;
739 MarSYS sys = MarSYS.SYS_CEVN;
740 BnkWTW bnk = BnkWTW.BWW_UNKN;
741 AttVal att = feature.atts.get(Att.MARSYS);
742 if (att != null) sys = (MarSYS)att.val;
743 ObjTab objs = feature.objs.get(Obj.NOTMRK);
744 int n = objs.size();
745 if (n > 2) {
746 s1 = Notices.Notice;
747 n = 1;
748 } else {
749 for (AttMap atts : objs.values()) {
750 if (atts.get(Att.MARSYS) != null) sys = (MarSYS)atts.get(Att.MARSYS).val;
751 CatNMK cat = CatNMK.NMK_UNKN;
752 if (atts.get(Att.CATNMK) != null) cat = (CatNMK)atts.get(Att.CATNMK).val;
753 s2 = Notices.getNotice(cat, sys);
754 }
755 }
756/* Obj_t *obj = getObj(item, NOTMRK, i);
757 if (obj == NULL) continue;
758 Atta_t add;
759 int idx = 0;
760 while ((add = getAttEnum(obj, ADDMRK, idx++)) != MRK_UNKN) {
761 if ((add == MRK_LTRI) && (i == 2)) swap = true;
762 if ((add == MRK_RTRI) && (i != 2)) swap = true;
763 }
764 }
765 } else {
766
767 }
768 for (int i = 0; i <=2; i++) {
769 Obj_t *obj = getObj(item, NOTMRK, i);
770 if (obj == NULL) continue;
771 Atta_t category = getAttEnum(obj, CATNMK, i);
772 Atta_t add;
773 int idx = 0;
774 int top=0, bottom=0, left=0, right=0;
775 while ((add = getAttEnum(obj, ADDMRK, idx++)) != MRK_UNKN) {
776 switch (add) {
777 case MRK_TOPB:
778 top = add;
779 break;
780 case MRK_BOTB:
781 case MRK_BTRI:
782 bottom = add;
783 break;
784 case MRK_LTRI:
785 left = add;
786 break;
787 case MRK_RTRI:
788 right = add;
789 break;
790 default:
791 break;
792 }
793 }
794 double orient = getAtt(obj, ORIENT) != NULL ? getAtt(obj, ORIENT)->val.val.f : 0.0;
795 int system = getAtt(obj, MARSYS) != NULL ? getAtt(obj, MARSYS)->val.val.e : 0;
796 double flip = 0.0;
797 char *symb = "";
798 char *base = "";
799 char *colour = "black";
800 if ((system == SYS_BWR2) || (system == SYS_BNWR)) {
801 symb = bniwr_map[category];
802 switch (category) {
803 case NMK_NANK:
804 case NMK_LMHR:
805 case NMK_KTPM...NMK_RSPD:
806 {
807 int bank = getAtt(obj, BNKWTW) != NULL ? getAtt(obj, BNKWTW)->val.val.e : 0;
808 switch (bank) {
809 case BWW_LEFT:
810 base = "notice_blb";
811 colour = "red";
812 break;
813 case BWW_RGHT:
814 base = "notice_brb";
815 colour = "green";
816 break;
817 default:
818 base = "notice_bsi";
819 colour = "black";
820 break;
821 }
822 }
823 default:
824 break;
825 }
826 } else if (system == SYS_PPWB) {
827 int bank = getAtt(obj, BNKWTW) != NULL ? getAtt(obj, BNKWTW)->val.val.e : 0;
828 if (bank != 0) {
829 switch (category) {
830 case NMK_WLAR:
831 if (bank == BNK_LEFT)
832 base = "notice_pwlarl";
833 else
834 base = "notice_pwlarr";
835 break;
836 case NMK_WRAL:
837 if (bank == BNK_LEFT)
838 base = "notice_pwrall";
839 else
840 base = "notice_pwralr";
841 break;
842 case NMK_KTPM:
843 if (bank == BNK_LEFT)
844 base = "notice_ppml";
845 else
846 base = "notice_ppmr";
847 break;
848 case NMK_KTSM:
849 if (bank == BNK_LEFT)
850 base = "notice_psml";
851 else
852 base = "notice_psmr";
853 break;
854 case NMK_KTMR:
855 if (bank == BNK_LEFT)
856 base = "notice_pmrl";
857 else
858 base = "notice_pmrr";
859 break;
860 case NMK_CRTP:
861 if (bank == BNK_LEFT)
862 base = "notice_pcpl";
863 else
864 base = "notice_pcpr";
865 break;
866 case NMK_CRTS:
867 if (bank == BNK_LEFT)
868 base = "notice_pcsl";
869 else
870 base = "notice_pcsr";
871 break;
872 default:
873 break;
874 }
875 }
876 } else {
877 symb = notice_map[category];
878 switch (category) {
879 case NMK_NOVK...NMK_NWSH:
880 case NMK_NMTC...NMK_NLBG:
881 base = "notice_a";
882 break;
883 case NMK_MVTL...NMK_CHDR:
884 base = "notice_b";
885 break;
886 case NMK_PRTL...NMK_PRTR:
887 case NMK_OVHC...NMK_LBGP:
888 base = "notice_e";
889 colour = "white";
890 break;
891 default:
892 break;
893 }
894 switch (category) {
895 case NMK_MVTL:
896 case NMK_ANKP:
897 case NMK_PRTL:
898 case NMK_MWAL:
899 case NMK_MWAR:
900 flip = 180.0;
901 break;
902 case NMK_SWWR:
903 case NMK_WRSL:
904 case NMK_WARL:
905 flip = -90.0;
906 break;
907 case NMK_SWWC:
908 case NMK_SWWL:
909 case NMK_WLSR:
910 case NMK_WALR:
911 flip = 90.0;
912 break;
913 default:
914 break;
915 }
916 }
917 if (n == 2) {
918 dx = (((i != 2) && swap) || ((i == 2) && !swap)) ? -30.0 : 30.0;
919 }
920 if (top == MRK_TOPB)
921 renderSymbol(item, NOTMRK, "notice_board", "", "", BC, dx, dy, orient);
922 if (bottom == MRK_BOTB)
923 renderSymbol(item, NOTMRK, "notice_board", "", "", BC, dx, dy, orient+180);
924 if (bottom == MRK_BTRI)
925 renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient+180);
926 if (left == MRK_LTRI)
927 renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient-90);
928 if (right == MRK_RTRI)
929 renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient+90);
930 renderSymbol(item, NOTMRK, base, "", "", CC, dx, dy, orient);
931 renderSymbol(item, NOTMRK, symb, "", colour, CC, dx, dy, orient+flip);
932 }
933*/
934 }
935 }
936
937 private static void obstructions(Feature feature) {
938 if ((Renderer.zoom >= 12) && (feature.type == Obj.OBSTRN)) {
939 switch ((CatOBS) getAttVal(feature, feature.type, 0, Att.CATOBS)) {
940 case OBS_BOOM:
941 Renderer.lineVector(feature, new LineStyle(Color.black, 5, new float[] { 20, 20 }, null));
942 if (Renderer.zoom >= 15) Renderer.lineText(feature, "Boom", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
943 }
944 }
945 if ((Renderer.zoom >= 14) && (feature.type == Obj.UWTROC)) {
946 WatLEV lvl = (WatLEV) getAttVal(feature, feature.type, 0, Att.WATLEV);
947 switch (lvl) {
948 case LEV_CVRS:
949 Renderer.symbol(feature, Areas.RockC);
950 break;
951 case LEV_AWSH:
952 Renderer.symbol(feature, Areas.RockA);
953 break;
954 default:
955 Renderer.symbol(feature, Areas.Rock);
956 }
957 } else {
958 Renderer.symbol(feature, Areas.Rock);
959 }
960 }
961
962 private static void pipelines(Feature feature) {
963 if ((Renderer.zoom >= 16) && (feature.geom.length < 2)) {
964 if (feature.type == Obj.PIPSOL) {
965 Renderer.lineSymbols(feature, Areas.Pipeline, 1.0, null, null, 0, Mline);
966 } else if (feature.type == Obj.PIPOHD) {
967 Renderer.lineVector(feature, new LineStyle(Color.black, 8));
968 AttMap atts = feature.atts;
969 double verclr = 0;
970 if (atts != null) {
971 if (atts.containsKey(Att.VERCLR)) {
972 verclr = (Double) atts.get(Att.VERCLR).val;
973 } else {
974 verclr = atts.containsKey(Att.VERCSA) ? (Double) atts.get(Att.VERCSA).val : 0;
975 }
976 if (verclr > 0) {
977 Renderer.labelText(feature, String.valueOf(verclr), new Font("Arial", Font.PLAIN, 50), Color.black, LabelStyle.VCLR, Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0,25)));
978 }
979 }
980 }
981 }
982 }
983
984 private static void platforms(Feature feature) {
985 ArrayList<CatOFP> cats = (ArrayList<CatOFP>)getAttVal(feature, Obj.OFSPLF, 0, Att.CATOFP);
986 if ((CatOFP) cats.get(0) == CatOFP.OFP_FPSO)
987 Renderer.symbol(feature, Buoys.Storage);
988 else
989 Renderer.symbol(feature, Landmarks.Platform);
990 addName(feature, 15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(20, -50)));
991 Signals.addSignals(feature);
992 }
993
994 private static void ports(Feature feature) {
995 if (Renderer.zoom >= 14) {
996 if (feature.type == Obj.CRANES) {
997 if ((CatCRN) getAttVal(feature, feature.type, 0, Att.CATCRN) == CatCRN.CRN_CONT)
998 Renderer.symbol(feature, Harbours.ContainerCrane);
999 else
1000 Renderer.symbol(feature, Harbours.PortCrane);
1001 } else if (feature.type == Obj.HULKES) {
1002 Renderer.lineVector(feature, new LineStyle(Color.black, 4, null, new Color(0xffe000)));
1003 addName(feature, 15, new Font("Arial", Font.BOLD, 80));
1004 }
1005 }
1006 }
1007
1008 private static void separation(Feature feature) {
1009 switch (feature.type) {
1010 case TSEZNE:
1011 case TSSCRS:
1012 case TSSRON:
1013 if (Renderer.zoom <= 15)
1014 Renderer.lineVector(feature, new LineStyle(null, 0, null, new Color(0x80c48080, true)));
1015 else
1016 Renderer.lineVector(feature, new LineStyle(new Color(0x80c48080, true), 20, null, null));
1017 addName(feature, 10, new Font("Arial", Font.BOLD, 150), new Color(0x80c48080, true));
1018 break;
1019 case TSELNE:
1020 Renderer.lineVector(feature, new LineStyle(new Color(0x80c48080, true), 20, null, null));
1021 break;
1022 case TSSLPT:
1023 Renderer.lineSymbols(feature, Areas.LaneArrow, 0.5, null, null, 0, new Color(0x80c48080, true));
1024 break;
1025 case TSSBND:
1026 Renderer.lineVector(feature, new LineStyle(new Color(0x80c48080, true), 20, new float[] { 40, 40 }, null));
1027 break;
1028 case ISTZNE:
1029 Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, null, 0, new Color(0x80c48080, true));
1030 break;
1031 }
1032 }
1033
1034 private static void shoreline(Feature feature) {
1035 if (Renderer.zoom >= 12) {
1036 switch ((CatSLC) getAttVal(feature, feature.type, 0, Att.CATSLC)) {
1037 case SLC_TWAL:
1038 WatLEV lev = (WatLEV) getAttVal(feature, feature.type, 0, Att.WATLEV);
1039 if (lev == WatLEV.LEV_CVRS) {
1040 Renderer.lineVector(feature, new LineStyle(Color.black, 10, new float[] { 40, 40 }, null));
1041 if (Renderer.zoom >= 15)
1042 Renderer.lineText(feature, "(covers)", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, 80);
1043 } else {
1044 Renderer.lineVector(feature, new LineStyle(Color.black, 10, null, null));
1045 }
1046 if (Renderer.zoom >= 15)
1047 Renderer.lineText(feature, "Training Wall", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -30);
1048 break;
1049 case SLC_SWAY:
1050 Renderer.lineVector(feature, new LineStyle(Color.black, 2, null, new Color(0xffe000)));
1051 if ((Renderer.zoom >= 16) && feature.objs.containsKey(Obj.SMCFAC)) {
1052 ArrayList<Symbol> symbols = new ArrayList<Symbol>();
1053 ArrayList<CatSCF> scfs = (ArrayList<CatSCF>) getAttVal(feature, Obj.SMCFAC, 0, Att.CATSCF);
1054 for (CatSCF scf : scfs) {
1055 symbols.add(Facilities.Cats.get(scf));
1056 }
1057 Renderer.cluster(feature, symbols);
1058 }
1059 break;
1060 }
1061 }
1062 }
1063
1064 private static void stations(Feature feature) {
1065 if (Renderer.zoom >= 14) {
1066 String str = "";
1067 switch (feature.type) {
1068 case SISTAT:
1069 case SISTAW:
1070 Renderer.symbol(feature, Harbours.SignalStation);
1071 str = "SS";
1072 // Append (cat) to str
1073 break;
1074 case RDOSTA:
1075 Renderer.symbol(feature, Harbours.SignalStation);
1076 Renderer.symbol(feature, Beacons.RadarStation);
1077 break;
1078 case RADSTA:
1079 Renderer.symbol(feature, Harbours.SignalStation);
1080 Renderer.symbol(feature, Beacons.RadarStation);
1081 break;
1082 case PILBOP:
1083 Renderer.symbol(feature, Harbours.Pilot);
1084 break;
1085 case CGUSTA:
1086 Renderer.symbol(feature, Harbours.SignalStation);
1087 str = "CG";
1088 break;
1089 case RSCSTA:
1090 Renderer.symbol(feature, Harbours.Rescue);
1091 break;
1092 }
1093 if ((Renderer.zoom >= 15) && !str.isEmpty()) {
1094 Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 40), Color.black, new Delta(Handle.LC, AffineTransform.getTranslateInstance(30, 0)));
1095 }
1096 Signals.addSignals(feature);
1097 }
1098/* case CGUSTA:
1099 strcpy(string1, "CG");
1100 if ((obj != NULL) && (att = getAtt(obj, COMCHA)) != NULL)
1101 sprintf(strchr(string1, 0), " Ch.%s", stringValue(att->val));
1102 break;
1103 case SISTAT:
1104 strcpy(string1, "SS");
1105 if (obj != NULL) {
1106 if ((att = getAtt(obj, CATSIT)) != NULL)
1107 strcat(string1, sit_map[att->val.val.l->val]);
1108 if ((att = getAtt(obj, COMCHA)) != NULL)
1109 sprintf(strchr(string1, 0), "\nCh.%s", stringValue(att->val));
1110 }
1111 break;
1112 case SISTAW:
1113 strcpy(string1, "SS");
1114 if (obj != NULL) {
1115 if ((att = getAtt(obj, CATSIW)) != NULL)
1116 strcat(string1, siw_map[att->val.val.l->val]);
1117 if ((att = getAtt(obj, COMCHA)) != NULL)
1118 sprintf(strchr(string1, 0), "\nCh.%s", stringValue(att->val));
1119 }
1120 break;*/
1121 }
1122
1123 private static void transits(Feature feature) {
1124 if (Renderer.zoom >= 12) {
1125 if (feature.type == Obj.RECTRC) Renderer.lineVector (feature, new LineStyle(Color.black, 10, null, null));
1126 else if (feature.type == Obj.NAVLNE) Renderer.lineVector (feature, new LineStyle(Color.black, 10, new float[] { 25, 25 }, null));
1127 }
1128 if (Renderer.zoom >= 15) {
1129 String str = "";
1130 String name = getName(feature);
1131 if (name != null) str += name + " ";
1132 Double ort = (Double) getAttVal(feature, feature.type, 0, Att.ORIENT);
1133 if (ort != null) str += ort.toString() + "\u0152";
1134 if (!str.isEmpty()) Renderer.lineText(feature, str, new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
1135 }
1136 }
1137
1138 private static void waterways(Feature feature) {
1139
1140 }
1141
1142 private static void wrecks(Feature feature) {
1143 if (Renderer.zoom >= 14) {
1144 CatWRK cat = (CatWRK) getAttVal(feature, feature.type, 0, Att.CATWRK);
1145 switch (cat) {
1146 case WRK_DNGR:
1147 case WRK_MSTS:
1148 Renderer.symbol(feature, Areas.WreckD);
1149 break;
1150 case WRK_HULS:
1151 Renderer.symbol(feature, Areas.WreckS);
1152 break;
1153 default:
1154 Renderer.symbol(feature, Areas.WreckND);
1155 }
1156 }
1157 }
1158}
Note: See TracBrowser for help on using the repository browser.