source: osm/applications/editors/josm/plugins/smed2/src/seamap/Rules.java@ 30020

Last change on this file since 30020 was 30020, checked in by malcolmh, 13 years ago

save

File size: 39.8 KB
Line 
1/* Copyright 2013 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 seamap;
11
12import java.awt.Color;
13import java.awt.Font;
14import java.awt.geom.AffineTransform;
15import java.util.ArrayList;
16
17import s57.S57val.*;
18import s57.S57att.*;
19import s57.S57obj.*;
20
21import seamap.SeaMap.*;
22import symbols.*;
23import symbols.Symbols.*;
24
25public class Rules {
26
27 static SeaMap map;
28 static int zoom;
29
30 public static void rules (SeaMap m, int z) {
31 map = m;
32 zoom = z;
33 ArrayList<Feature> objects;
34 if ((objects = map.features.get(Obj.SLCONS)) != null) for (Feature feature : objects) shoreline(feature);
35 if ((objects = map.features.get(Obj.SLCONS)) != null) for (Feature feature : objects) shoreline(feature);;
36 if ((objects = map.features.get(Obj.PIPSOL)) != null) for (Feature feature : objects) pipelines(feature);
37 if ((objects = map.features.get(Obj.CBLSUB)) != null) for (Feature feature : objects) cables(feature);
38 if ((objects = map.features.get(Obj.PIPOHD)) != null) for (Feature feature : objects) pipelines(feature);
39 if ((objects = map.features.get(Obj.CBLOHD)) != null) for (Feature feature : objects) cables(feature);
40 if ((objects = map.features.get(Obj.TSEZNE)) != null) for (Feature feature : objects) separation(feature);
41 if ((objects = map.features.get(Obj.TSSCRS)) != null) for (Feature feature : objects) separation(feature);
42 if ((objects = map.features.get(Obj.TSSRON)) != null) for (Feature feature : objects) separation(feature);
43 if ((objects = map.features.get(Obj.TSELNE)) != null) for (Feature feature : objects) separation(feature);
44 if ((objects = map.features.get(Obj.TSSLPT)) != null) for (Feature feature : objects) separation(feature);
45 if ((objects = map.features.get(Obj.TSSBND)) != null) for (Feature feature : objects) separation(feature);
46 if ((objects = map.features.get(Obj.ISTZNE)) != null) for (Feature feature : objects) separation(feature);
47 if ((objects = map.features.get(Obj.SNDWAV)) != null) for (Feature feature : objects) areas(feature);
48 if ((objects = map.features.get(Obj.OSPARE)) != null) for (Feature feature : objects) areas(feature);
49 if ((objects = map.features.get(Obj.FAIRWY)) != null) for (Feature feature : objects) areas(feature);
50 if ((objects = map.features.get(Obj.DRGARE)) != null) for (Feature feature : objects) areas(feature);
51 if ((objects = map.features.get(Obj.RESARE)) != null) for (Feature feature : objects) areas(feature);
52 if ((objects = map.features.get(Obj.SPLARE)) != null) for (Feature feature : objects) areas(feature);
53 if ((objects = map.features.get(Obj.SEAARE)) != null) for (Feature feature : objects) areas(feature);
54 if ((objects = map.features.get(Obj.OBSTRN)) != null) for (Feature feature : objects) obstructions(feature);
55 if ((objects = map.features.get(Obj.UWTROC)) != null) for (Feature feature : objects) obstructions(feature);
56 if ((objects = map.features.get(Obj.MARCUL)) != null) for (Feature feature : objects) areas(feature);
57 if ((objects = map.features.get(Obj.WTWAXS)) != null) for (Feature feature : objects) waterways(feature);
58 if ((objects = map.features.get(Obj.RECTRC)) != null) for (Feature feature : objects) transits(feature);
59 if ((objects = map.features.get(Obj.NAVLNE)) != null) for (Feature feature : objects) transits(feature);
60 if ((objects = map.features.get(Obj.HRBFAC)) != null) for (Feature feature : objects) harbours(feature);
61 if ((objects = map.features.get(Obj.ACHARE)) != null) for (Feature feature : objects) harbours(feature);
62 if ((objects = map.features.get(Obj.ACHBRT)) != null) for (Feature feature : objects) harbours(feature);
63 if ((objects = map.features.get(Obj.LOKBSN)) != null) for (Feature feature : objects) locks(feature);
64 if ((objects = map.features.get(Obj.LKBSPT)) != null) for (Feature feature : objects) locks(feature);
65 if ((objects = map.features.get(Obj.GATCON)) != null) for (Feature feature : objects) locks(feature);
66 if ((objects = map.features.get(Obj.DISMAR)) != null) for (Feature feature : objects) distances(feature);
67 if ((objects = map.features.get(Obj.HULKES)) != null) for (Feature feature : objects) ports(feature);
68 if ((objects = map.features.get(Obj.CRANES)) != null) for (Feature feature : objects) ports(feature);
69 if ((objects = map.features.get(Obj.LNDMRK)) != null) for (Feature feature : objects) landmarks(feature);
70 if ((objects = map.features.get(Obj.MORFAC)) != null) for (Feature feature : objects) moorings(feature);
71 if ((objects = map.features.get(Obj.NOTMRK)) != null) for (Feature feature : objects) notices(feature);
72 if ((objects = map.features.get(Obj.SMCFAC)) != null) for (Feature feature : objects) marinas(feature);
73 if ((objects = map.features.get(Obj.BRIDGE)) != null) for (Feature feature : objects) bridges(feature);
74 if ((objects = map.features.get(Obj.LITMAJ)) != null) for (Feature feature : objects) lights(feature);
75 if ((objects = map.features.get(Obj.LITMIN)) != null) for (Feature feature : objects) lights(feature);
76 if ((objects = map.features.get(Obj.LIGHTS)) != null) for (Feature feature : objects) lights(feature);
77 if ((objects = map.features.get(Obj.SISTAT)) != null) for (Feature feature : objects) signals(feature);
78 if ((objects = map.features.get(Obj.SISTAW)) != null) for (Feature feature : objects) signals(feature);
79 if ((objects = map.features.get(Obj.CGUSTA)) != null) for (Feature feature : objects) signals(feature);
80 if ((objects = map.features.get(Obj.RDOSTA)) != null) for (Feature feature : objects) signals(feature);
81 if ((objects = map.features.get(Obj.RADSTA)) != null) for (Feature feature : objects) signals(feature);
82 if ((objects = map.features.get(Obj.RSCSTA)) != null) for (Feature feature : objects) signals(feature);
83 if ((objects = map.features.get(Obj.PILBOP)) != null) for (Feature feature : objects) signals(feature);
84 if ((objects = map.features.get(Obj.WTWGAG)) != null) for (Feature feature : objects) gauges(feature);
85 if ((objects = map.features.get(Obj.OFSPLF)) != null) for (Feature feature : objects) platforms(feature);
86 if ((objects = map.features.get(Obj.WRECKS)) != null) for (Feature feature : objects) wrecks(feature);
87 if ((objects = map.features.get(Obj.LITVES)) != null) for (Feature feature : objects) floats(feature);
88 if ((objects = map.features.get(Obj.LITFLT)) != null) for (Feature feature : objects) floats(feature);
89 if ((objects = map.features.get(Obj.BOYINB)) != null) for (Feature feature : objects) floats(feature);
90 if ((objects = map.features.get(Obj.BOYLAT)) != null) for (Feature feature : objects) buoys(feature);
91 if ((objects = map.features.get(Obj.BOYCAR)) != null) for (Feature feature : objects) buoys(feature);
92 if ((objects = map.features.get(Obj.BOYISD)) != null) for (Feature feature : objects) buoys(feature);
93 if ((objects = map.features.get(Obj.BOYSAW)) != null) for (Feature feature : objects) buoys(feature);
94 if ((objects = map.features.get(Obj.BOYSPP)) != null) for (Feature feature : objects) buoys(feature);
95 if ((objects = map.features.get(Obj.BOYWTW)) != null) for (Feature feature : objects) buoys(feature);
96 if ((objects = map.features.get(Obj.BCNLAT)) != null) for (Feature feature : objects) beacons(feature);
97 if ((objects = map.features.get(Obj.BCNCAR)) != null) for (Feature feature : objects) beacons(feature);
98 if ((objects = map.features.get(Obj.BCNISD)) != null) for (Feature feature : objects) beacons(feature);
99 if ((objects = map.features.get(Obj.BCNSAW)) != null) for (Feature feature : objects) beacons(feature);
100 if ((objects = map.features.get(Obj.BCNSPP)) != null) for (Feature feature : objects) beacons(feature);
101 if ((objects = map.features.get(Obj.BCNWTW)) != null) for (Feature feature : objects) beacons(feature);
102 }
103
104 private static void areas(Feature feature) {
105 AttItem name = feature.atts.get(Att.OBJNAM);
106 switch (feature.type) {
107 case DRGARE:
108 if (zoom < 16)
109 Renderer.lineVector(feature, new LineStyle(Color.black, 8, new float[] { 25, 25 }, new Color(0x40ffffff, true)));
110 else
111 Renderer.lineVector(feature, new LineStyle(Color.black, 8, new float[] { 25, 25 }, null));
112 if ((zoom >= 12) && (name != null))
113 Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.PLAIN, 100), Color.black, null);
114 break;
115 case FAIRWY:
116 if (feature.area > 2.0) {
117 if (zoom < 16)
118 Renderer.lineVector(feature, new LineStyle(new Color(0xc480ff), 8, new float[] { 50, 50 }, new Color(0x40ffffff, true)));
119 else
120 Renderer.lineVector(feature, new LineStyle(new Color(0xc480ff), 8, new float[] { 50, 50 }, null));
121 } else {
122 if (zoom >= 14)
123 Renderer.lineVector(feature, new LineStyle(new Color(0x40ffffff, true), 0, null, null));
124 }
125 break;
126 case MARCUL:
127 if (zoom >= 14)
128 Renderer.symbol(feature, Areas.MarineFarm, Obj.MARCUL, null, null);
129 if (zoom >= 16)
130 Renderer.lineVector(feature, new LineStyle( Color.black, 4, new float[] { 10, 10 }, null));
131 break;
132 case OSPARE:
133 if ((CatPRA)Renderer.getAttVal(feature, feature.type, 0, Att.CATPRA) == CatPRA.PRA_WFRM) {
134 Renderer.symbol(feature, Areas.WindFarm, Obj.OSPARE, null, null);
135 Renderer.lineVector(feature, new LineStyle(Color.black, 20, new float[] { 40, 40 }, null));
136 if ((zoom >= 15) && (name != null))
137 Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), Color.black, new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 10)));
138 }
139 break;
140 case RESARE:
141 if (zoom >= 12) {
142 Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, 0);
143// if ((CatREA)Renderer.getAttVal(feature, feature.type, 0, Att.CATREA) == CatREA.REA_NWAK)
144// Renderer.symbol(feature, Areas.NoWake, Obj.RESARE, null);
145 }
146 break;
147 case SEAARE:
148 switch ((CatSEA) Renderer.getAttVal(feature, feature.type, 0, Att.CATSEA)) {
149 case SEA_RECH:
150 break;
151 case SEA_BAY:
152 break;
153 case SEA_SHOL:
154 break;
155 case SEA_GAT:
156 case SEA_NRRW:
157 break;
158 }
159 break;
160/*
161 if (is_type("sea_area")) {
162 if (has_attribute("category")) {
163 make_string("");
164 attribute_switch("category")
165 attribute_case("reach") { if (zoom >= 10) add_string("font-family:Arial;font-weight:normal;font-style:italic;font-size:150;text-anchor:middle") }
166 attribute_case("bay") { if (zoom >= 12) add_string("font-family:Arial;font-weight:normal;font-style:italic;font-size:150;text-anchor:middle") }
167 attribute_case("shoal") { if (zoom >= 14) {
168 if (is_area) {
169 area("stroke:#c480ff;stroke-width:4;stroke-dasharray:25,25;fill:none");
170 if (has_item_attribute("name")) text(item_attribute("name"), "font-family:Arial;font-weight:normal;font-style:italic;font-size:75;text-anchor:middle", 0, -40);
171 text("(Shoal)", "font-family:Arial;font-weight:normal;font-size:60;text-anchor:middle", 0, 0);
172 } else if (is_line) {
173 if (has_item_attribute("name")) way_text(item_attribute("name"), "font-family:Arial;font-weight:normal;font-style:italic;font-size:75;text-anchor:middle", 0.5, -40, line("stroke:none;fill:none"));
174 way_text("(Shoal)", "font-family:Arial;font-weight:normal;font-size:60;text-anchor:middle", 0.5, 0, line("stroke:none;fill:none"));
175 } else {
176 if (has_item_attribute("name")) text(item_attribute("name"), "font-family:Arial;font-weight:normal;font-style:italic;font-size:75;text-anchor:middle", 0, -40);
177 text("(Shoal)", "font-family:Arial;font-weight:normal;font-size:60;text-anchor:middle", 0, 0);
178 }
179 }
180 }
181 attribute_case("gat|narrows") { if (zoom >= 12) add_string("font-family:Arial;font-weight:normal;font-style:italic;font-size:100;text-anchor:middle") }
182 end_switch
183 if ((strlen(string) > 0) && !attribute_test("category", "shoal")) {
184 int ref = line("stroke:none;fill:none");
185 if (ref != 0) {
186 if (has_item_attribute("name")) way_text(item_attribute("name"), string, 0.5, 0, ref);
187 } else {
188 if (has_item_attribute("name")) text(item_attribute("name"), string, 0, 0);
189 }
190 }
191 free_string
192 }
193 }
194 */
195 case SNDWAV:
196 if (zoom >= 12) Renderer.fillPattern(feature, Areas.Sandwaves);
197 break;
198 case SPLARE:
199 if (zoom >= 12) {
200 Renderer.symbol(feature, Areas.Plane, Obj.SPLARE, null, null);
201 Renderer.lineSymbols(feature, Areas.Restricted, 0.5, Areas.LinePlane, 10);
202 }
203 if ((zoom >= 15) && (name != null))
204 Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -90)));
205 break;
206 }
207 }
208
209 private static void beacons(Feature feature) {
210 BcnSHP shape = (BcnSHP) Renderer.getAttVal(feature, feature.type, 0, Att.BCNSHP);
211 if (((shape == BcnSHP.BCN_PRCH) || (shape == BcnSHP.BCN_WTHY)) && (feature.type == Obj.BCNLAT)) {
212 CatLAM cat = (CatLAM) Renderer.getAttVal(feature, feature.type, 0, Att.CATLAM);
213 switch (cat) {
214 case LAM_PORT:
215 if (shape == BcnSHP.BCN_PRCH)
216 Renderer.symbol(feature, Beacons.PerchPort, null, null, null);
217 else
218 Renderer.symbol(feature, Beacons.WithyPort, null, null, null);
219 break;
220 case LAM_STBD:
221 if (shape == BcnSHP.BCN_PRCH)
222 Renderer.symbol(feature, Beacons.PerchStarboard, null, null, null);
223 else
224 Renderer.symbol(feature, Beacons.WithyStarboard, null, null, null);
225 break;
226 default:
227 Renderer.symbol(feature, Beacons.Stake, feature.type, null, null);
228 }
229 } else {
230 Renderer.symbol(feature, Beacons.Shapes.get(shape), feature.type, null, null);
231 if (feature.objs.get(Obj.TOPMAR) != null)
232 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, Topmarks.Beacons, null);
233 }
234 }
235 private static void buoys(Feature feature) {
236 BoySHP shape = (BoySHP) Renderer.getAttVal(feature, feature.type, 0, Att.BOYSHP);
237 Renderer.symbol(feature, Buoys.Shapes.get(shape), feature.type, null, null);
238 if (feature.objs.get(Obj.TOPMAR) != null) {
239 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, Topmarks.Buoys.get(shape), null);
240 }
241 }
242 private static void bridges(Feature feature) {
243 if (zoom >= 16) {
244
245 }
246/* Att_t *attv = getAtt(getObj(item, BRIDGE, 0), VERCLR);
247 if (attv == NULL) attv = getAtt(getObj(item, BRIDGE, 0), VERCSA);
248 Att_t *attc = getAtt(getObj(item, BRIDGE, 0), VERCCL);
249 Att_t *atto = getAtt(getObj(item, BRIDGE, 0), VERCOP);
250 if (attv != NULL) {
251 renderSymbol(item, obja, "clear_v", "", "", CC, 0, 0, 0);
252 drawText(item, stringValue(attv->val), "font-family:Arial; font-weight:normal; font-size:70; text-anchor:middle", 0, 12);
253 }
254 else if ((attc != NULL) && (atto == NULL)) {
255 renderSymbol(item, obja, "clear_v", "", "", CC, 0, 0, 0);
256 drawText(item, stringValue(attc->val), "font-family:Arial; font-weight:normal; font-size:70; text-anchor:middle", 0, 12);
257 }
258 else if ((attc != NULL) && (atto != NULL)) {
259 renderSymbol(item, obja, "clear_v", "", "", RC, 5, 0, 0);
260 drawText(item, stringValue(attc->val), "font-family:Arial; font-weight:normal; font-size:70; text-anchor:middle", -35, 12);
261 renderSymbol(item, obja, "clear_v", "", "", LC, -5, 0, 0);
262 drawText(item, stringValue(atto->val), "font-family:Arial; font-weight:normal; font-size:70; text-anchor:middle", 35, 12);
263 }
264 }
265*/
266 }
267 private static void cables(Feature feature) {
268 if (zoom >= 14) {
269 if (feature.type == Obj.CBLSUB) {
270 Renderer.lineSymbols(feature, Areas.Cable, 0.0, null, 0);
271 } else if (feature.type == Obj.CBLOHD) {
272
273 }
274 }
275 }
276 private static void distances(Feature feature) {
277/*object_rules(distances) {
278 if ((zoom>=16) && (has_attribute("category"))) {
279 attribute_switch("category")
280 attribute_case("installed") symbol("distance_i");
281 attribute_default symbol("distance_u");
282 end_switch
283 }
284}
285*/
286 }
287 private static void floats(Feature feature) {
288 switch (feature.type) {
289 case LITVES:
290 Renderer.symbol(feature, Buoys.Super, feature.type, null, null);
291 break;
292 case LITFLT:
293 Renderer.symbol(feature, Buoys.Float, feature.type, null, null);
294 break;
295 case BOYINB:
296 Renderer.symbol(feature, Buoys.Super, feature.type, null, null);
297 break;
298 }
299 if (feature.objs.get(Obj.TOPMAR) != null)
300 Renderer.symbol(feature, Topmarks.Shapes.get(feature.objs.get(Obj.TOPMAR).get(0).get(Att.TOPSHP).val), Obj.TOPMAR, Topmarks.Floats, null);
301 }
302 private static void gauges(Feature feature) {
303/*object_rules(gauge) {
304 if (zoom >= 14) symbol("tide_gauge");
305}
306*/
307 }
308 private static void harbours(Feature feature) {
309 AttItem name = feature.atts.get(Att.OBJNAM);
310 switch (feature.type) {
311 case ACHARE:
312 if (zoom >= 12) {
313 if (feature.flag != Fflag.LINE)
314 Renderer.symbol(feature, Harbours.Anchorage, null, null, null);
315 Renderer.lineSymbols(feature, Areas.Restricted, 1.0, Areas.LineAnchor, 10);
316 if ((zoom >= 15) && ((name) != null)) {
317 Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), new Color(0x80c480ff), null);
318 }
319 }
320 break;
321 }
322 }
323/*
324 * if ((zoom >= 12) && is_type("anchorage")) {
325 symbol("anchorage");
326 if ((zoom >= 15) && (has_item_attribute("name")))
327 text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:middle", 0, -90);
328 if ((zoom >= 12) && (is_area)) line_symbols("restricted_line", 0.5, "line_anchor", 10);
329 }
330 if ((zoom >= 16) && is_type("anchor_berth")) symbol("anchor_berth");
331 if ((zoom >= 12) && is_type("harbour")) {
332 if (has_attribute("category")) {
333 attribute_switch("category")
334 attribute_case("marina|yacht") symbol("marina");
335 attribute_case("marina_no_facilities") symbol("marina_nf");
336 attribute_default symbol("harbour");
337 end_switch
338 } else symbol("harbour");
339 if ((zoom >= 15) && (has_item_attribute("name")))
340 text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:middle", 0, -90);
341 }
342*/
343 private static void landmarks(Feature feature) {
344 ArrayList<CatLMK> cats = (ArrayList<CatLMK>) Renderer.getAttVal(feature, feature.type, 0, Att.CATLMK);
345 Symbol catSym = Landmarks.Shapes.get(cats.get(0));
346 ArrayList<FncFNC> fncs = (ArrayList<FncFNC>) Renderer.getAttVal(feature, feature.type, 0, Att.FUNCTN);
347 Symbol fncSym = Landmarks.Funcs.get(fncs.get(0));
348 if ((fncs.get(0) == FncFNC.FNC_CHCH) && (cats.get(0) == CatLMK.LMK_TOWR))
349 catSym = Landmarks.ChurchTower;
350 if ((cats.get(0) == CatLMK.LMK_UNKN) && (fncs.get(0) == FncFNC.FNC_UNKN) && (feature.objs.get(Obj.LIGHTS) != null))
351 catSym = Beacons.LightMajor;
352 if (cats.get(0) == CatLMK.LMK_RADR)
353 fncSym = Landmarks.RadioTV;
354 Renderer.symbol(feature, catSym, null, null, null);
355 Renderer.symbol(feature, fncSym, null, null, null);
356/* if (!has_attribute("function") && !has_attribute("category") && has_object("light")) {
357 symbol("lighthouse");
358 if ((zoom >= 15) && has_item_attribute("name"))
359 text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:middle", 0, -70);
360 } else {
361 if ((zoom >= 15) && has_item_attribute("name"))
362 text(item_attribute("name"), "font-family:Arial; font-weight:bold; font-size:80; text-anchor:start", 60, -50);
363 }
364 if (has_object("fog_signal")) object(fogs);
365 if (has_object("radar_transponder")) object(rtbs);
366 if (has_object("radar_station") && (zoom >= 12)) symbol("radar_station");
367 if (has_object("light")) object(lights);
368}
369*/
370 }
371 private static void lights(Feature feature) {
372 switch (feature.type) {
373 case LITMAJ:
374 Renderer.symbol(feature, Beacons.LightMajor, null, null, null);
375 break;
376 case LITMIN:
377 case LIGHTS:
378 Renderer.symbol(feature, Beacons.LightMinor, null, null, null);
379 break;
380 }
381 }
382 private static void locks(Feature feature) {
383/*object_rules(locks) {
384 if ((zoom>=13) && is_type("lock_basin|lock_basin_part")) symbol("lock");
385 if ((zoom>=15) && is_type("gate")) symbol("lock_gate");
386}
387*/
388 }
389 private static void marinas(Feature feature) {
390 if (zoom >= 16) {
391
392 }
393/* int n = countObjects(item, type);
394 Atta_t atta = enumAttribute("category", obja);
395 char **map = cluster_map(obja);
396 if (map == NULL) return;
397 switch (n) {
398 case 0: {
399 Obj_t *obj = getObj(item, obja, 0);
400 int n = countValues(getAtt(obj, atta));
401 switch (n) {
402 case 1:
403 renderSymbol(item, obja, map[getAttEnum(obj, atta, 0)], "", "", CC, 0, 0, 0);
404 break;
405 case 2:
406 renderSymbol(item, obja, map[getAttEnum(obj, atta, 0)], "", "", RC, 0, 0, 0);
407 renderSymbol(item, obja, map[getAttEnum(obj, atta, 1)], "", "", LC, 0, 0, 0);
408 break;
409 case 3:
410 renderSymbol(item, obja, map[getAttEnum(obj, atta, 0)], "", "", BC, 0, 0, 0);
411 renderSymbol(item, obja, map[getAttEnum(obj, atta, 1)], "", "", TR, 0, 0, 0);
412 renderSymbol(item, obja, map[getAttEnum(obj, atta, 2)], "", "", TL, 0, 0, 0);
413 break;
414 case 4:
415 renderSymbol(item, obja, map[getAttEnum(obj, atta, 0)], "", "", BR, 0, 0, 0);
416 renderSymbol(item, obja, map[getAttEnum(obj, atta, 1)], "", "", BL, 0, 0, 0);
417 renderSymbol(item, obja, map[getAttEnum(obj, atta, 2)], "", "", TR, 0, 0, 0);
418 renderSymbol(item, obja, map[getAttEnum(obj, atta, 3)], "", "", TL, 0, 0, 0);
419 break;
420 }
421 }
422 break;
423 case 1:
424 renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 1), atta, 0)], "", "", CC, 0, 0, 0);
425 break;
426 case 2:
427 renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 1), atta, 0)], "", "", RC, 0, 0, 0);
428 renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 2), atta, 0)], "", "", LC, 0, 0, 0);
429 break;
430 case 3:
431 renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 1), atta, 0)], "", "", BC, 0, 0, 0);
432 renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 2), atta, 0)], "", "", TR, 0, 0, 0);
433 renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 3), atta, 0)], "", "", TL, 0, 0, 0);
434 break;
435 case 4:
436 renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 1), atta, 0)], "", "", BR, 0, 0, 0);
437 renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 2), atta, 0)], "", "", BL, 0, 0, 0);
438 renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 3), atta, 0)], "", "", TR, 0, 0, 0);
439 renderSymbol(item, obja, map[getAttEnum(getObj(item, obja, 4), atta, 0)], "", "", TL, 0, 0, 0);
440 break;
441 }
442*/
443 }
444 private static void moorings(Feature feature) {
445 CatMOR cat = (CatMOR) Renderer.getAttVal(feature, feature.type, 0, Att.CATMOR);
446 switch (cat) {
447 case MOR_DLPN:
448 Renderer.symbol(feature, Harbours.Dolphin, null, null, null);
449 break;
450 case MOR_DDPN:
451 Renderer.symbol(feature, Harbours.DeviationDolphin, null, null, null);
452 break;
453 case MOR_BLRD:
454 case MOR_POST:
455 Renderer.symbol(feature, Harbours.Bollard, null, null, null);
456 break;
457 case MOR_BUOY:
458 BoySHP shape = (BoySHP) Renderer.getAttVal(feature, feature.type, 0, Att.BOYSHP);
459 if (shape == BoySHP.BOY_UNKN)
460 shape = BoySHP.BOY_SPHR;
461 Renderer.symbol(feature, Buoys.Shapes.get(shape), feature.type, null, null);
462 break;
463 }
464/* if (has_object("fog_signal")) object(fogs);
465 if (has_object("radar_transponder")) object(rtbs);
466 if (has_object("light")) object(lights);
467}
468*/
469 }
470
471 private static void notices(Feature feature) {
472 if (zoom >= 14) {
473 double dx = 0.0, dy = 0.0;
474 switch (feature.type) {
475 case BCNCAR:
476 case BCNISD:
477 case BCNLAT:
478 case BCNSAW:
479 case BCNSPP:
480 case BCNWTW:
481 dy = 45.0;
482 break;
483 case NOTMRK:
484 dy = 0.0;
485 break;
486 default:
487 return;
488 }
489 Symbol s1 = null, s2 = null;
490 MarSYS sys = MarSYS.SYS_CEVN;
491 BnkWTW bnk = BnkWTW.BWW_UNKN;
492 AttItem att = feature.atts.get(Att.MARSYS);
493 if (att != null) sys = (MarSYS)att.val;
494 ObjTab objs = feature.objs.get(Obj.NOTMRK);
495 int n = objs.size();
496 if (n > 2) {
497 s1 = Notices.Notice;
498 n = 1;
499 } else {
500 for (AttMap atts : objs.values()) {
501 if (atts.get(Att.MARSYS) != null) sys = (MarSYS)atts.get(Att.MARSYS).val;
502 CatNMK cat = CatNMK.NMK_UNKN;
503 if (atts.get(Att.CATNMK) != null) cat = (CatNMK)atts.get(Att.CATNMK).val;
504 s2 = Notices.getNotice(cat, sys);
505 }
506 }
507/* Obj_t *obj = getObj(item, NOTMRK, i);
508 if (obj == NULL) continue;
509 Atta_t add;
510 int idx = 0;
511 while ((add = getAttEnum(obj, ADDMRK, idx++)) != MRK_UNKN) {
512 if ((add == MRK_LTRI) && (i == 2)) swap = true;
513 if ((add == MRK_RTRI) && (i != 2)) swap = true;
514 }
515 }
516 } else {
517
518 }
519 for (int i = 0; i <=2; i++) {
520 Obj_t *obj = getObj(item, NOTMRK, i);
521 if (obj == NULL) continue;
522 Atta_t category = getAttEnum(obj, CATNMK, i);
523 Atta_t add;
524 int idx = 0;
525 int top=0, bottom=0, left=0, right=0;
526 while ((add = getAttEnum(obj, ADDMRK, idx++)) != MRK_UNKN) {
527 switch (add) {
528 case MRK_TOPB:
529 top = add;
530 break;
531 case MRK_BOTB:
532 case MRK_BTRI:
533 bottom = add;
534 break;
535 case MRK_LTRI:
536 left = add;
537 break;
538 case MRK_RTRI:
539 right = add;
540 break;
541 default:
542 break;
543 }
544 }
545 double orient = getAtt(obj, ORIENT) != NULL ? getAtt(obj, ORIENT)->val.val.f : 0.0;
546 int system = getAtt(obj, MARSYS) != NULL ? getAtt(obj, MARSYS)->val.val.e : 0;
547 double flip = 0.0;
548 char *symb = "";
549 char *base = "";
550 char *colour = "black";
551 if ((system == SYS_BWR2) || (system == SYS_BNWR)) {
552 symb = bniwr_map[category];
553 switch (category) {
554 case NMK_NANK:
555 case NMK_LMHR:
556 case NMK_KTPM...NMK_RSPD:
557 {
558 int bank = getAtt(obj, BNKWTW) != NULL ? getAtt(obj, BNKWTW)->val.val.e : 0;
559 switch (bank) {
560 case BWW_LEFT:
561 base = "notice_blb";
562 colour = "red";
563 break;
564 case BWW_RGHT:
565 base = "notice_brb";
566 colour = "green";
567 break;
568 default:
569 base = "notice_bsi";
570 colour = "black";
571 break;
572 }
573 }
574 default:
575 break;
576 }
577 } else if (system == SYS_PPWB) {
578 int bank = getAtt(obj, BNKWTW) != NULL ? getAtt(obj, BNKWTW)->val.val.e : 0;
579 if (bank != 0) {
580 switch (category) {
581 case NMK_WLAR:
582 if (bank == BNK_LEFT)
583 base = "notice_pwlarl";
584 else
585 base = "notice_pwlarr";
586 break;
587 case NMK_WRAL:
588 if (bank == BNK_LEFT)
589 base = "notice_pwrall";
590 else
591 base = "notice_pwralr";
592 break;
593 case NMK_KTPM:
594 if (bank == BNK_LEFT)
595 base = "notice_ppml";
596 else
597 base = "notice_ppmr";
598 break;
599 case NMK_KTSM:
600 if (bank == BNK_LEFT)
601 base = "notice_psml";
602 else
603 base = "notice_psmr";
604 break;
605 case NMK_KTMR:
606 if (bank == BNK_LEFT)
607 base = "notice_pmrl";
608 else
609 base = "notice_pmrr";
610 break;
611 case NMK_CRTP:
612 if (bank == BNK_LEFT)
613 base = "notice_pcpl";
614 else
615 base = "notice_pcpr";
616 break;
617 case NMK_CRTS:
618 if (bank == BNK_LEFT)
619 base = "notice_pcsl";
620 else
621 base = "notice_pcsr";
622 break;
623 default:
624 break;
625 }
626 }
627 } else {
628 symb = notice_map[category];
629 switch (category) {
630 case NMK_NOVK...NMK_NWSH:
631 case NMK_NMTC...NMK_NLBG:
632 base = "notice_a";
633 break;
634 case NMK_MVTL...NMK_CHDR:
635 base = "notice_b";
636 break;
637 case NMK_PRTL...NMK_PRTR:
638 case NMK_OVHC...NMK_LBGP:
639 base = "notice_e";
640 colour = "white";
641 break;
642 default:
643 break;
644 }
645 switch (category) {
646 case NMK_MVTL:
647 case NMK_ANKP:
648 case NMK_PRTL:
649 case NMK_MWAL:
650 case NMK_MWAR:
651 flip = 180.0;
652 break;
653 case NMK_SWWR:
654 case NMK_WRSL:
655 case NMK_WARL:
656 flip = -90.0;
657 break;
658 case NMK_SWWC:
659 case NMK_SWWL:
660 case NMK_WLSR:
661 case NMK_WALR:
662 flip = 90.0;
663 break;
664 default:
665 break;
666 }
667 }
668 if (n == 2) {
669 dx = (((i != 2) && swap) || ((i == 2) && !swap)) ? -30.0 : 30.0;
670 }
671 if (top == MRK_TOPB)
672 renderSymbol(item, NOTMRK, "notice_board", "", "", BC, dx, dy, orient);
673 if (bottom == MRK_BOTB)
674 renderSymbol(item, NOTMRK, "notice_board", "", "", BC, dx, dy, orient+180);
675 if (bottom == MRK_BTRI)
676 renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient+180);
677 if (left == MRK_LTRI)
678 renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient-90);
679 if (right == MRK_RTRI)
680 renderSymbol(item, NOTMRK, "notice_triangle", "", "", BC, dx, dy, orient+90);
681 renderSymbol(item, NOTMRK, base, "", "", CC, dx, dy, orient);
682 renderSymbol(item, NOTMRK, symb, "", colour, CC, dx, dy, orient+flip);
683 }
684*/
685 }
686 }
687 private static void obstructions(Feature feature) {
688 if ((zoom >= 14) && (feature.type == Obj.UWTROC)) {
689 WatLEV lvl = (WatLEV) Renderer.getAttVal(feature, feature.type, 0, Att.WATLEV);
690 switch (lvl) {
691 case LEV_CVRS:
692 Renderer.symbol(feature, Areas.RockC, null, null, null);
693 break;
694 case LEV_AWSH:
695 Renderer.symbol(feature, Areas.RockA, null, null, null);
696 break;
697 default:
698 Renderer.symbol(feature, Areas.Rock, null, null, null);
699 }
700 } else {
701 Renderer.symbol(feature, Areas.Rock, null, null, null);
702 }
703 }
704 private static void pipelines(Feature feature) {
705 if (zoom >= 14) {
706 if (feature.type == Obj.PIPSOL) {
707 Renderer.lineSymbols(feature, Areas.Pipeline, 1.0, null, 0);
708 } else if (feature.type == Obj.PIPOHD) {
709
710 }
711 }
712 }
713 private static void platforms(Feature feature) {
714 ArrayList<CatOFP> cats = (ArrayList<CatOFP>)Renderer.getAttVal(feature, Obj.OFSPLF, 0, Att.CATOFP);
715 if ((CatOFP) cats.get(0) == CatOFP.OFP_FPSO)
716 Renderer.symbol(feature, Buoys.Storage, null, null, null);
717 else
718 Renderer.symbol(feature, Landmarks.Platform, null, null, null);
719 AttItem name = feature.atts.get(Att.OBJNAM);
720 if ((zoom >= 15) && (name != null))
721 Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(60, -50)));
722/*object_rules(platforms) {
723 if (has_object("fog_signal")) object(fogs);
724 if (has_object("radar_transponder")) object(rtbs);
725 if (has_object("light")) object(lights);
726}
727*/
728 }
729 private static void ports(Feature feature) {
730 if (zoom >= 14) {
731 if (feature.type == Obj.CRANES) {
732 if ((CatCRN) Renderer.getAttVal(feature, feature.type, 0, Att.CATCRN) == CatCRN.CRN_CONT)
733 Renderer.symbol(feature, Harbours.ContainerCrane, null, null, null);
734 else
735 Renderer.symbol(feature, Harbours.PortCrane, null, null, null);
736 } else if (feature.type == Obj.HULKES) {
737 Renderer.lineVector(feature, new LineStyle(Color.black, 4, null, new Color(0xffe000)));
738 AttItem name = feature.atts.get(Att.OBJNAM);
739 if ((zoom >= 15) && (name != null))
740 Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 80), Color.black, null);
741 }
742 }
743 }
744 private static void separation(Feature feature) {
745 switch (feature.type) {
746 case TSEZNE:
747 case TSSCRS:
748 case TSSRON:
749 if (zoom <= 15)
750 Renderer.lineVector(feature, new LineStyle(null, 0, null, new Color(0x80c480ff, true)));
751 else
752 Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, null, null));
753 AttItem name = feature.atts.get(Att.OBJNAM);
754 if ((zoom >= 10) && (name != null))
755 Renderer.labelText(feature, (String) name.val, new Font("Arial", Font.BOLD, 150), new Color(0x80c480ff), null);
756 break;
757 case TSELNE:
758 Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, null, null));
759 break;
760 case TSSLPT:
761 Renderer.lineSymbols(feature, Areas.LaneArrow, 0.5, null, 0);
762 break;
763 case TSSBND:
764 Renderer.lineVector(feature, new LineStyle(new Color(0x80c480ff, true), 20, new float[] { 40, 40 }, null));
765 break;
766 case ISTZNE:
767 Renderer.lineSymbols(feature, Areas.Restricted, 1.0, null, 0);
768 break;
769 }
770 }
771 private static void shoreline(Feature feature) {
772 if (zoom >= 12) {
773 switch ((CatSLC) Renderer.getAttVal(feature, feature.type, 0, Att.CATSLC)) {
774 case SLC_TWAL:
775 WatLEV lev = (WatLEV) Renderer.getAttVal(feature, feature.type, 0, Att.WATLEV);
776 if (lev == WatLEV.LEV_CVRS) {
777 Renderer.lineVector(feature, new LineStyle(Color.black, 10, new float[] { 40, 40 }, null));
778 if (zoom >= 15)
779 Renderer.lineText(feature, "(covers)", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, 20);
780 } else {
781 Renderer.lineVector(feature, new LineStyle(Color.black, 10, null, null));
782 }
783 if (zoom >= 15)
784 Renderer.lineText(feature, "Training Wall", new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
785 }
786 }
787 }
788 private static void signals(Feature feature) {
789 if (zoom >= 14) {
790 switch (feature.type) {
791 case SISTAT:
792 case SISTAW:
793 Renderer.symbol(feature, Harbours.SignalStation, null, null, null);
794 break;
795 case RDOSTA:
796 Renderer.symbol(feature, Harbours.SignalStation, null, null, null);
797 Renderer.symbol(feature, Beacons.RadarStation, null, null, null);
798 ArrayList<CatROS> cats = (ArrayList<CatROS>)Renderer.getAttVal(feature, Obj.RDOSTA, 0, Att.CATROS);
799 String str = "";
800 for (CatROS ros : cats) {
801 switch (ros) {
802 case ROS_OMNI:
803 str += " RC";
804 break;
805 case ROS_DIRL:
806 str += " RD";
807 break;
808 case ROS_ROTP:
809 str += " RW";
810 break;
811 case ROS_CNSL:
812 str += " Consol";
813 break;
814 case ROS_RDF:
815 str += " RG";
816 break;
817 case ROS_QTA:
818 str += " R";
819 break;
820 case ROS_AERO:
821 str += " AeroRC";
822 break;
823 case ROS_DECA:
824 str += " Decca";
825 break;
826 case ROS_LORN:
827 str += " Loran";
828 break;
829 case ROS_DGPS:
830 str += " DGPS";
831 break;
832 case ROS_TORN:
833 str += " Toran";
834 break;
835 case ROS_OMGA:
836 str += " Omega";
837 break;
838 case ROS_SYLD:
839 str += " Syledis";
840 break;
841 case ROS_CHKA:
842 str += " Chiaka";
843 break;
844 case ROS_PCOM:
845 case ROS_COMB:
846 case ROS_FACS:
847 case ROS_TIME:
848 break;
849 case ROS_PAIS:
850 case ROS_SAIS:
851 str += " AIS";
852 break;
853 case ROS_VAIS:
854 Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 180)));
855 break;
856 case ROS_VANC:
857 Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 180)));
858 Renderer.symbol(feature, Topmarks.TopNorth, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
859 break;
860 case ROS_VASC:
861 Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 180)));
862 Renderer.symbol(feature, Topmarks.TopSouth, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
863 break;
864 case ROS_VAEC:
865 Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 180)));
866 Renderer.symbol(feature, Topmarks.TopEast, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
867 break;
868 case ROS_VAWC:
869 Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 180)));
870 Renderer.symbol(feature, Topmarks.TopWest, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
871 break;
872 case ROS_VAPL:
873 Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 180)));
874 Renderer.symbol(feature, Topmarks.TopCan, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
875 break;
876 case ROS_VASL:
877 Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 180)));
878 Renderer.symbol(feature, Topmarks.TopCone, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
879 break;
880 case ROS_VAID:
881 Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 180)));
882 Renderer.symbol(feature, Topmarks.TopIsol, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
883 break;
884 case ROS_VASW:
885 Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 180)));
886 Renderer.symbol(feature, Topmarks.TopSphere, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
887 break;
888 case ROS_VASP:
889 Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 180)));
890 Renderer.symbol(feature, Topmarks.TopX, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
891 break;
892 case ROS_VAWK:
893 Renderer.labelText(feature, " V-AIS", new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, 180)));
894 Renderer.symbol(feature, Topmarks.TopCross, null, new Delta(Handle.BC, AffineTransform.getTranslateInstance(0, -25)), null);
895 break;
896 }
897 }
898 if (!str.isEmpty()) Renderer.labelText(feature, str, new Font("Arial", Font.PLAIN, 70), Color.black, new Delta(Handle.BR, AffineTransform.getTranslateInstance(-30, -180)));
899 break;
900 case RADSTA:
901 Renderer.symbol(feature, Harbours.SignalStation, null, null, null);
902 Renderer.symbol(feature, Beacons.RadarStation, null, null, null);
903 break;
904 case PILBOP:
905 Renderer.symbol(feature, Harbours.Pilot, null, null, null);
906 break;
907 case CGUSTA:
908 Renderer.symbol(feature, Harbours.SignalStation, null, null, null);
909 break;
910 case RSCSTA:
911 Renderer.symbol(feature, Harbours.Rescue, null, null, null);
912 break;
913 }
914 }
915 /* if (has_object("fog_signal")) object(fogs);
916 if (has_object("radar_transponder")) object(rtbs);
917 if (has_object("light")) object(lights);
918}
919*/
920 }
921 private static void transits(Feature feature) {
922 if (zoom >= 12) {
923 if (feature.type == Obj.RECTRC) Renderer.lineVector (feature, new LineStyle(Color.black, 10, null, null));
924 else if (feature.type == Obj.NAVLNE) Renderer.lineVector (feature, new LineStyle(Color.black, 10, new float[] { 25, 25 }, null));
925 }
926 if (zoom >= 15) {
927 String str = "";
928 AttItem name = feature.atts.get(Att.OBJNAM);
929 if (name != null) str += (String)name.val + " ";
930 Double ort = (Double) Renderer.getAttVal(feature, feature.type, 0, Att.ORIENT);
931 if (ort != null) str += ort.toString() + "\u0152";
932 if (!str.isEmpty()) Renderer.lineText(feature, str, new Font("Arial", Font.PLAIN, 80), Color.black, 0.5, -20);
933 }
934 }
935 private static void waterways(Feature feature) {
936 }
937 private static void wrecks(Feature feature) {
938 if (zoom >= 14) {
939 CatWRK cat = (CatWRK) Renderer.getAttVal(feature, feature.type, 0, Att.CATWRK);
940 switch (cat) {
941 case WRK_DNGR:
942 case WRK_MSTS:
943 Renderer.symbol(feature, Areas.WreckD, null, null, null);
944 break;
945 case WRK_HULS:
946 Renderer.symbol(feature, Areas.WreckS, null, null, null);
947 break;
948 default:
949 Renderer.symbol(feature, Areas.WreckND, null, null, null);
950 }
951 }
952 }
953}
Note: See TracBrowser for help on using the repository browser.