Changeset 34896 in osm for applications/editors/josm/plugins/seachart/src/render
- Timestamp:
- 2019-02-15T18:17:18+01:00 (6 years ago)
- Location:
- applications/editors/josm/plugins/seachart/src/render
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/seachart/src/render/Renderer.java
r34652 r34896 602 602 603 603 public static void lightSector(Color col1, Color col2, double radius, double s1, double s2, Double dir, String str) { 604 if ((zoom >= 16) && (radius > 0.2)) {605 radius /= Math.pow(2, zoom-15);606 }607 604 double mid = (((s1 + s2) / 2) + (s1 > s2 ? 180 : 0)) % 360; 608 605 g2.setStroke(new BasicStroke((float) (3.0 * sScale), BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1, -
applications/editors/josm/plugins/seachart/src/render/Rules.java
r34886 r34896 121 121 } 122 122 } 123 return (name != null) ? ( String) name.val: null;123 return (name != null) ? ((String) name.val).replace(""", "\"") : null; 124 124 } 125 125 … … 430 430 if (testAttribute(feature.type, Att.CATPRA, CatPRA.PRA_WFRM)) { 431 431 Renderer.symbol(Areas.WindFarm); 432 Renderer.lineVector(new LineStyle(Color.black, 20, new float[] { 40, 40 }));433 addName(15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 1 0)));432 Renderer.lineVector(new LineStyle(Color.black, 12, new float[] { 40, 40 })); 433 addName(15, new Font("Arial", Font.BOLD, 80), new Delta(Handle.TC, AffineTransform.getTranslateInstance(0, 120))); 434 434 } 435 435 break; … … 954 954 @SuppressWarnings("unchecked") 955 955 private static void landmarks() { 956 if (!hasAttribute(Obj.LNDMRK, Att.CATLMK) && (!hasAttribute(Obj.LNDMRK, Att.FUNCTN) || testAttribute(Obj.LNDMRK, Att.FUNCTN, FncFNC.FNC_LGHT)) && hasObject(Obj.LIGHTS)) 956 if (!hasAttribute(Obj.LNDMRK, Att.CATLMK) && (!hasAttribute(Obj.LNDMRK, Att.FUNCTN) || testAttribute(Obj.LNDMRK, Att.FUNCTN, FncFNC.FNC_LGHT)) && hasObject(Obj.LIGHTS)) { 957 957 lights(); 958 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50))); 959 } 958 960 else if (Renderer.zoom >= 12) { 959 961 switch (feature.type) { … … 981 983 break; 982 984 } 983 if (Renderer.zoom >= 15)984 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50)));985 985 Signals.addSignals(); 986 addName(15, new Font("Arial", Font.BOLD, 40), new Delta(Handle.BL, AffineTransform.getTranslateInstance(60, -50))); 986 987 } 987 988 } -
applications/editors/josm/plugins/seachart/src/render/Signals.java
r34652 r34896 377 377 } 378 378 379 @SuppressWarnings("unchecked") 380 public static void lights() { 381 Enum<ColCOL> col = null; 382 Enum<ColCOL> tcol = null; 383 ObjTab lights = feature.objs.get(Obj.LIGHTS); 384 for (AttMap atts : lights.values()) { 385 if (atts.containsKey(Att.COLOUR)) { 386 ArrayList<Enum<ColCOL>> cols = (ArrayList<Enum<ColCOL>>) atts.get(Att.COLOUR).val; 387 if (cols.size() == 1) { 388 if (atts.containsKey(Att.CATLIT) && ((ArrayList<?>) atts.get(Att.CATLIT).val).contains(CatLIT.LIT_FLDL)) { 389 Renderer.symbol(Beacons.Floodlight, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(90)))); 390 } else { 391 tcol = cols.get(0); 392 if (col == null) { 393 col = tcol; 394 } else if (tcol != col) { 395 col = ColCOL.COL_MAG; 396 break; 397 } 398 } 399 } else { 400 col = ColCOL.COL_MAG; 401 break; 402 } 403 } 404 } 405 if (col != null) { 406 Renderer.symbol(Beacons.LightFlare, new Scheme(LightColours.get(col)), 407 new Delta(Handle.BC, AffineTransform.getRotateInstance(Math.toRadians(120)))); 408 } 409 if (Renderer.zoom >= 12) { 410 String str = ""; 411 if (lights.get(1) != null) { 412 for (AttMap atts : lights.values()) { 413 Enum<ColCOL> col1 = null; 414 Enum<ColCOL> col2 = null; 415 double radius = 0.2; 416 double s1 = 361; 417 double s2 = 361; 418 Double dir = null; 419 if (atts.containsKey(Att.COLOUR)) { 420 ArrayList<Enum<ColCOL>> cols = (ArrayList<Enum<ColCOL>>) atts.get(Att.COLOUR).val; 421 col1 = cols.get(0); 422 if (cols.size() > 1) 423 col2 = cols.get(1); 424 } else { 425 continue; 426 } 427 if (atts.containsKey(Att.CATLIT)) { 428 ArrayList<CatLIT> cats = (ArrayList<CatLIT>) atts.get(Att.CATLIT).val; 429 if (cats.contains(CatLIT.LIT_DIR)) { 430 if (atts.containsKey(Att.ORIENT)) { 431 dir = (Double) atts.get(Att.ORIENT).val; 432 s1 = ((dir - 4) + 360) % 360; 433 s2 = (dir + 4) % 360; 434 for (AttMap satts : lights.values()) { 435 double srad = 0.2; 436 double ss1 = 361; 437 double ss2 = 361; 438 Double sdir = null; 439 if (satts == atts) 440 continue; 441 if (srad == radius) { 442 ArrayList<CatLIT> scats = (ArrayList<CatLIT>) (satts.containsKey(Att.CATLIT) ? (ArrayList<CatLIT>) satts.get(Att.CATLIT).val : new ArrayList<>()); 443 if (scats.contains(CatLIT.LIT_DIR)) { 444 if (satts.containsKey(Att.ORIENT)) { 445 sdir = (Double) satts.get(Att.ORIENT).val; 446 ss1 = sdir; 447 ss2 = sdir; 448 } 449 } else { 450 if (satts.containsKey(Att.SECTR1)) { 451 ss1 = (Double) satts.get(Att.SECTR1).val; 452 } 453 if (satts.containsKey(Att.SECTR2)) { 454 ss2 = (Double) satts.get(Att.SECTR2).val; 455 } 456 } 457 if ((ss1 > 360) || (ss2 > 360)) 458 continue; 459 if (sdir != null) { 460 if (((dir - sdir + 360) % 360) < 8) { 461 s1 = ((((sdir > dir) ? 360 : 0) + sdir + dir) / 2) % 360; 462 } 463 if (((sdir - dir + 360) % 360) < 8) { 464 s2 = ((((dir > sdir) ? 360 : 0) + sdir + dir) / 2) % 360; 465 } 466 } else { 467 if (((dir - ss2 + 360) % 360) < 4) { 468 s1 = ss2; 469 } 470 if (((ss1 - dir + 360) % 360) < 4) { 471 s2 = ss1; 472 } 473 } 474 } 475 } 476 } 477 } 478 } 479 if ((s1 > 360) && atts.containsKey(Att.SECTR1)) { 480 s1 = (Double) atts.get(Att.SECTR1).val; 481 } else if (dir == null) { 482 continue; 483 } 484 if ((s2 > 360) && atts.containsKey(Att.SECTR2)) { 485 s2 = (Double) atts.get(Att.SECTR2).val; 486 } else if (dir == null) { 487 continue; 488 } 489 str = ""; 490 if (atts.containsKey(Att.LITCHR)) { 491 str += LightCharacters.get(((ArrayList<LitCHR>) atts.get(Att.LITCHR).val).get(0)); 492 } 493 if (atts.containsKey(Att.SIGGRP)) { 494 str += "(" + atts.get(Att.SIGGRP).val + ")"; 495 } else if (!str.isEmpty()) { 496 str += "."; 497 } 498 if (atts.containsKey(Att.COLOUR)) { 499 ArrayList<Enum<ColCOL>> cols = (ArrayList<Enum<ColCOL>>) atts.get(Att.COLOUR).val; 500 str += LightLetters.get(cols.get(0)); 501 if (cols.size() > 1) 502 str += LightLetters.get(cols.get(1)); 503 } 504 if (atts.containsKey(Att.SIGPER)) { 505 str += "." + df.format(atts.get(Att.SIGPER).val) + "s"; 506 } 507 if ((s1 <= 360) && (s2 <= 360) && (s1 != s2)) 508 Renderer.lightSector(LightColours.get(col1), LightColours.get(col2), radius, s1, s2, dir, (Renderer.zoom >= 15) ? str : ""); 509 } 510 if (Renderer.zoom >= 15) { 511 class LitSect { 512 boolean dir; 513 LitCHR chr; 514 ColCOL col; 515 String grp; 516 double per; 517 double rng; 518 double hgt; 519 } 520 521 ArrayList<LitSect> litatts = new ArrayList<>(); 522 for (AttMap atts : lights.values()) { 523 LitSect sect = new LitSect(); 524 sect.dir = (atts.containsKey(Att.CATLIT) && ((ArrayList<CatLIT>) atts.get(Att.CATLIT).val).contains(CatLIT.LIT_DIR)); 525 sect.chr = atts.containsKey(Att.LITCHR) ? ((ArrayList<LitCHR>) atts.get(Att.LITCHR).val).get(0) : LitCHR.CHR_UNKN; 526 switch (sect.chr) { 527 case CHR_AL: 528 sect.chr = LitCHR.CHR_F; 529 break; 530 case CHR_ALOC: 531 sect.chr = LitCHR.CHR_OC; 532 break; 533 case CHR_ALLFL: 534 sect.chr = LitCHR.CHR_LFL; 535 break; 536 case CHR_ALFL: 537 sect.chr = LitCHR.CHR_FL; 538 break; 539 case CHR_ALFFL: 540 sect.chr = LitCHR.CHR_FFL; 541 break; 542 default: 543 break; 544 } 545 sect.grp = atts.containsKey(Att.SIGGRP) ? (String) atts.get(Att.SIGGRP).val : ""; 546 sect.per = atts.containsKey(Att.SIGPER) ? (Double) atts.get(Att.SIGPER).val : 0.0; 547 sect.rng = atts.containsKey(Att.VALNMR) ? (Double) atts.get(Att.VALNMR).val : 0.0; 548 sect.hgt = atts.containsKey(Att.HEIGHT) ? (Double) atts.get(Att.HEIGHT).val : 0.0; 549 ArrayList<ColCOL> cols = (ArrayList<ColCOL>) (atts.containsKey(Att.COLOUR) ? atts.get(Att.COLOUR).val : new ArrayList<>()); 550 sect.col = cols.size() > 0 ? cols.get(0) : ColCOL.COL_UNK; 551 if ((sect.chr != LitCHR.CHR_UNKN) && (sect.col != null)) 552 litatts.add(sect); 553 } 554 ArrayList<ArrayList<LitSect>> groupings = new ArrayList<>(); 555 for (LitSect lit : litatts) { 556 boolean found = false; 557 for (ArrayList<LitSect> group : groupings) { 558 LitSect mem = group.get(0); 559 if (lit.dir == mem.dir && lit.chr == mem.chr && lit.grp.equals(mem.grp) && lit.per == mem.per && lit.hgt == mem.hgt) { 560 group.add(lit); 561 found = true; 562 } 563 } 564 if (!found) { 565 ArrayList<LitSect> tmp = new ArrayList<>(); 566 tmp.add(lit); 567 groupings.add(tmp); 568 } 569 } 570 for (boolean moved = true; moved;) { 571 moved = false; 572 for (int i = 0; i < groupings.size() - 1; i++) { 573 if (groupings.get(i).size() < groupings.get(i + 1).size()) { 574 ArrayList<LitSect> tmp = groupings.remove(i); 575 groupings.add(i + 1, tmp); 576 moved = true; 577 } 578 } 579 } 580 class ColRng { 581 ColCOL col; 582 double rng; 583 584 ColRng(ColCOL c, double r) { 585 col = c; 586 rng = r; 587 } 588 } 589 590 int y = -30; 591 for (ArrayList<LitSect> group : groupings) { 592 ArrayList<ColRng> colrng = new ArrayList<>(); 593 for (LitSect lit : group) { 594 boolean found = false; 595 for (ColRng cr : colrng) { 596 if (cr.col == lit.col) { 597 if (lit.rng > cr.rng) { 598 cr.rng = lit.rng; 599 } 600 found = true; 601 } 602 } 603 if (!found) { 604 colrng.add(new ColRng(lit.col, lit.rng)); 605 } 606 } 607 for (boolean moved = true; moved;) { 608 moved = false; 609 for (int i = 0; i < colrng.size() - 1; i++) { 610 if (colrng.get(i).rng < colrng.get(i + 1).rng) { 611 ColRng tmp = colrng.remove(i); 612 colrng.add(i + 1, tmp); 613 moved = true; 614 } 615 } 616 } 617 LitSect tmp = group.get(0); 618 str = tmp.dir ? "Dir" : ""; 619 str += LightCharacters.get(tmp.chr); 620 if (!tmp.grp.isEmpty()) 621 str += "(" + tmp.grp + ")"; 622 else 623 str += "."; 624 for (ColRng cr : colrng) { 625 str += LightLetters.get(cr.col); 626 } 627 if ((tmp.per > 0) || (tmp.hgt > 0) || (colrng.get(0).rng > 0)) 628 str += "."; 629 if (tmp.per > 0) 630 str += df.format(tmp.per) + "s"; 631 if (tmp.hgt > 0) 632 str += df.format(tmp.hgt) + "m"; 633 if (colrng.get(0).rng > 0) 634 str += df.format(colrng.get(0).rng) + ((colrng.size() > 1) ? ((colrng.size() > 2) ? ("-" + df.format(colrng.get(colrng.size() - 1).rng)) : ("/" + df.format(colrng.get(1).rng))) : "") + "M"; 635 Renderer.labelText(str, new Font("Arial", Font.PLAIN, 40), Color.black, new Delta(Handle.TL, AffineTransform.getTranslateInstance(60, y))); 636 y += 40; 637 str = ""; 638 } 639 } 640 } else { 641 if (Renderer.zoom >= 15) { 642 AttMap atts = lights.get(0); 643 ArrayList<CatLIT> cats = new ArrayList<>(); 644 if (atts.containsKey(Att.CATLIT)) { 645 cats = (ArrayList<CatLIT>) atts.get(Att.CATLIT).val; 646 } 647 str = cats.contains(CatLIT.LIT_DIR) ? "Dir" : ""; 648 str += atts.containsKey(Att.MLTYLT) ? atts.get(Att.MLTYLT).val : ""; 649 if (atts.containsKey(Att.LITCHR)) { 650 LitCHR chr = ((ArrayList<LitCHR>) atts.get(Att.LITCHR).val).get(0); 651 if (atts.containsKey(Att.SIGGRP)) { 652 String grp = (String) atts.get(Att.SIGGRP).val; 653 switch (chr) { 654 case CHR_QLFL: 655 str += String.format("Q(%s)+LFl", grp); 656 break; 657 case CHR_VQLFL: 658 str += String.format("VQ(%s)+LFl", grp); 659 break; 660 case CHR_UQLFL: 661 str += String.format("UQ(%s)+LFl", grp); 662 break; 663 default: 664 str += String.format("%s(%s)", LightCharacters.get(chr), grp); 665 break; 666 } 667 } else { 668 str += LightCharacters.get(chr); 669 } 670 } 671 if (atts.containsKey(Att.COLOUR)) { 672 ArrayList<ColCOL> cols = (ArrayList<ColCOL>) atts.get(Att.COLOUR).val; 673 if (!((cols.size() == 1) && (cols.get(0) == ColCOL.COL_WHT))) { 674 if (!str.isEmpty() && !str.endsWith(")")) { 675 str += "."; 676 } 677 for (ColCOL acol : cols) { 678 str += LightLetters.get(acol); 679 } 680 } 681 } 682 str += cats.contains(CatLIT.LIT_VERT) ? "(vert)" : ""; 683 str += cats.contains(CatLIT.LIT_HORI) ? "(hor)" : ""; 684 str += (!str.isEmpty() && (atts.containsKey(Att.SIGPER) || atts.containsKey(Att.HEIGHT) || atts.containsKey(Att.VALMXR)) && !str.endsWith(")")) ? "." : ""; 685 str += atts.containsKey(Att.SIGPER) ? df.format(atts.get(Att.SIGPER).val) + "s" : ""; 686 str += atts.containsKey(Att.HEIGHT) ? df.format(atts.get(Att.HEIGHT).val) + "m" : ""; 687 str += atts.containsKey(Att.VALNMR) ? df.format(atts.get(Att.VALNMR).val) + "M" : ""; 688 str += cats.contains(CatLIT.LIT_FRNT) ? "(Front)" : ""; 689 str += cats.contains(CatLIT.LIT_REAR) ? "(Rear)" : ""; 690 str += cats.contains(CatLIT.LIT_UPPR) ? "(Upper)" : ""; 691 str += cats.contains(CatLIT.LIT_LOWR) ? "(Lower)" : ""; 692 Renderer.labelText(str, new Font("Arial", Font.PLAIN, 40), Color.black, new Delta(Handle.TL, AffineTransform.getTranslateInstance(60, -30))); 693 } 694 } 695 } 696 } 379 @SuppressWarnings("unchecked") 380 public static void lights() { 381 Enum<ColCOL> col = null; 382 Enum<ColCOL> tcol = null; 383 ObjTab lights = feature.objs.get(Obj.LIGHTS); 384 for (AttMap atts : lights.values()) { 385 if (atts.containsKey(Att.COLOUR)) { 386 ArrayList<Enum<ColCOL>> cols = (ArrayList<Enum<ColCOL>>) atts.get(Att.COLOUR).val; 387 if (cols.size() == 1) { 388 if (atts.containsKey(Att.CATLIT) && ((ArrayList<?>) atts.get(Att.CATLIT).val).contains(CatLIT.LIT_FLDL)) { 389 Renderer.symbol(Beacons.Floodlight, new Delta(Handle.CC, AffineTransform.getRotateInstance(Math.toRadians(90)))); 390 } else { 391 tcol = cols.get(0); 392 if (col == null) { 393 col = tcol; 394 } else if (tcol != col) { 395 col = ColCOL.COL_MAG; 396 break; 397 } 398 } 399 } else { 400 col = ColCOL.COL_MAG; 401 break; 402 } 403 } 404 } 405 if (col != null) { 406 Renderer.symbol(Beacons.LightFlare, new Scheme(LightColours.get(col)), new Delta(Handle.BC, AffineTransform.getRotateInstance(Math.toRadians(120)))); 407 } 408 String str = ""; 409 if (lights.get(1) != null) { 410 for (AttMap atts : lights.values()) { 411 Enum<ColCOL> col1 = null; 412 Enum<ColCOL> col2 = null; 413 double radius = 0.5; 414 if (atts.containsKey(Att.VALNMR)) { 415 radius += Math.log10((Double) atts.get(Att.VALNMR).val) * 2.0; 416 } 417 radius /= Math.pow(Renderer.zoom, 4) / 5000; 418 double s1 = 361; 419 double s2 = 361; 420 Double dir = null; 421 if (atts.containsKey(Att.COLOUR)) { 422 ArrayList<Enum<ColCOL>> cols = (ArrayList<Enum<ColCOL>>) atts.get(Att.COLOUR).val; 423 col1 = cols.get(0); 424 if (cols.size() > 1) 425 col2 = cols.get(1); 426 } else { 427 continue; 428 } 429 if (atts.containsKey(Att.CATLIT)) { 430 ArrayList<CatLIT> cats = (ArrayList<CatLIT>) atts.get(Att.CATLIT).val; 431 if (cats.contains(CatLIT.LIT_DIR)) { 432 if (atts.containsKey(Att.ORIENT)) { 433 dir = (Double) atts.get(Att.ORIENT).val; 434 s1 = ((dir - 4) + 360) % 360; 435 s2 = (dir + 4) % 360; 436 for (AttMap satts : lights.values()) { 437 double ss1 = 361; 438 double ss2 = 361; 439 Double sdir = null; 440 if (satts == atts) 441 continue; 442 ArrayList<CatLIT> scats = (ArrayList<CatLIT>) (satts.containsKey(Att.CATLIT) ? (ArrayList<CatLIT>) satts.get(Att.CATLIT).val : new ArrayList<>()); 443 if (scats.contains(CatLIT.LIT_DIR)) { 444 if (satts.containsKey(Att.ORIENT)) { 445 sdir = (Double) satts.get(Att.ORIENT).val; 446 ss1 = sdir; 447 ss2 = sdir; 448 } 449 } else { 450 if (satts.containsKey(Att.SECTR1)) { 451 ss1 = (Double) satts.get(Att.SECTR1).val; 452 } 453 if (satts.containsKey(Att.SECTR2)) { 454 ss2 = (Double) satts.get(Att.SECTR2).val; 455 } 456 } 457 if ((ss1 > 360) || (ss2 > 360)) 458 continue; 459 if (sdir != null) { 460 if (((dir - sdir + 360) % 360) < 8) { 461 s1 = ((((sdir > dir) ? 360 : 0) + sdir + dir) / 2) % 360; 462 } 463 if (((sdir - dir + 360) % 360) < 8) { 464 s2 = ((((dir > sdir) ? 360 : 0) + sdir + dir) / 2) % 360; 465 } 466 } else { 467 if (((dir - ss2 + 360) % 360) < 4) { 468 s1 = ss2; 469 } 470 if (((ss1 - dir + 360) % 360) < 4) { 471 s2 = ss1; 472 } 473 } 474 } 475 } 476 } 477 } 478 if ((s1 > 360) && atts.containsKey(Att.SECTR1)) { 479 s1 = (Double) atts.get(Att.SECTR1).val; 480 } else if (dir == null) { 481 continue; 482 } 483 if ((s2 > 360) && atts.containsKey(Att.SECTR2)) { 484 s2 = (Double) atts.get(Att.SECTR2).val; 485 } else if (dir == null) { 486 continue; 487 } 488 str = ""; 489 if (atts.containsKey(Att.LITCHR)) { 490 str += LightCharacters.get(((ArrayList<LitCHR>) atts.get(Att.LITCHR).val).get(0)); 491 } 492 if (atts.containsKey(Att.SIGGRP)) { 493 str += "(" + atts.get(Att.SIGGRP).val + ")"; 494 } else if (!str.isEmpty()) { 495 str += "."; 496 } 497 if (atts.containsKey(Att.COLOUR)) { 498 ArrayList<Enum<ColCOL>> cols = (ArrayList<Enum<ColCOL>>) atts.get(Att.COLOUR).val; 499 str += LightLetters.get(cols.get(0)); 500 if (cols.size() > 1) 501 str += LightLetters.get(cols.get(1)); 502 } 503 if (atts.containsKey(Att.SIGPER)) { 504 str += "." + df.format(atts.get(Att.SIGPER).val) + "s"; 505 } 506 if ((s1 <= 360) && (s2 <= 360) && (s1 != s2)) 507 Renderer.lightSector(LightColours.get(col1), LightColours.get(col2), radius, s1, s2, dir, (Renderer.zoom >= 15) ? str : ""); 508 } 509 if (Renderer.zoom >= 15) { 510 class LitSect { 511 boolean dir; 512 LitCHR chr; 513 ColCOL col; 514 String grp; 515 double per; 516 double rng; 517 double hgt; 518 } 519 520 ArrayList<LitSect> litatts = new ArrayList<>(); 521 for (AttMap atts : lights.values()) { 522 LitSect sect = new LitSect(); 523 sect.dir = (atts.containsKey(Att.CATLIT) && ((ArrayList<CatLIT>) atts.get(Att.CATLIT).val).contains(CatLIT.LIT_DIR)); 524 sect.chr = atts.containsKey(Att.LITCHR) ? ((ArrayList<LitCHR>) atts.get(Att.LITCHR).val).get(0) : LitCHR.CHR_UNKN; 525 switch (sect.chr) { 526 case CHR_AL: 527 sect.chr = LitCHR.CHR_F; 528 break; 529 case CHR_ALOC: 530 sect.chr = LitCHR.CHR_OC; 531 break; 532 case CHR_ALLFL: 533 sect.chr = LitCHR.CHR_LFL; 534 break; 535 case CHR_ALFL: 536 sect.chr = LitCHR.CHR_FL; 537 break; 538 case CHR_ALFFL: 539 sect.chr = LitCHR.CHR_FFL; 540 break; 541 default: 542 break; 543 } 544 sect.grp = atts.containsKey(Att.SIGGRP) ? (String) atts.get(Att.SIGGRP).val : ""; 545 sect.per = atts.containsKey(Att.SIGPER) ? (Double) atts.get(Att.SIGPER).val : 0.0; 546 sect.rng = atts.containsKey(Att.VALNMR) ? (Double) atts.get(Att.VALNMR).val : 0.0; 547 sect.hgt = atts.containsKey(Att.HEIGHT) ? (Double) atts.get(Att.HEIGHT).val : 0.0; 548 ArrayList<ColCOL> cols = (ArrayList<ColCOL>) (atts.containsKey(Att.COLOUR) ? atts.get(Att.COLOUR).val : new ArrayList<>()); 549 sect.col = cols.size() > 0 ? cols.get(0) : ColCOL.COL_UNK; 550 if ((sect.chr != LitCHR.CHR_UNKN) && (sect.col != null)) 551 litatts.add(sect); 552 } 553 ArrayList<ArrayList<LitSect>> groupings = new ArrayList<>(); 554 for (LitSect lit : litatts) { 555 boolean found = false; 556 for (ArrayList<LitSect> group : groupings) { 557 LitSect mem = group.get(0); 558 if (lit.dir == mem.dir && lit.chr == mem.chr && lit.grp.equals(mem.grp) && lit.per == mem.per && lit.hgt == mem.hgt) { 559 group.add(lit); 560 found = true; 561 } 562 } 563 if (!found) { 564 ArrayList<LitSect> tmp = new ArrayList<>(); 565 tmp.add(lit); 566 groupings.add(tmp); 567 } 568 } 569 for (boolean moved = true; moved;) { 570 moved = false; 571 for (int i = 0; i < groupings.size() - 1; i++) { 572 if (groupings.get(i).size() < groupings.get(i + 1).size()) { 573 ArrayList<LitSect> tmp = groupings.remove(i); 574 groupings.add(i + 1, tmp); 575 moved = true; 576 } 577 } 578 } 579 class ColRng { 580 ColCOL col; 581 double rng; 582 583 ColRng(ColCOL c, double r) { 584 col = c; 585 rng = r; 586 } 587 } 588 589 int y = -30; 590 for (ArrayList<LitSect> group : groupings) { 591 ArrayList<ColRng> colrng = new ArrayList<>(); 592 for (LitSect lit : group) { 593 boolean found = false; 594 for (ColRng cr : colrng) { 595 if (cr.col == lit.col) { 596 if (lit.rng > cr.rng) { 597 cr.rng = lit.rng; 598 } 599 found = true; 600 } 601 } 602 if (!found) { 603 colrng.add(new ColRng(lit.col, lit.rng)); 604 } 605 } 606 for (boolean moved = true; moved;) { 607 moved = false; 608 for (int i = 0; i < colrng.size() - 1; i++) { 609 if (colrng.get(i).rng < colrng.get(i + 1).rng) { 610 ColRng tmp = colrng.remove(i); 611 colrng.add(i + 1, tmp); 612 moved = true; 613 } 614 } 615 } 616 LitSect tmp = group.get(0); 617 str = tmp.dir ? "Dir" : ""; 618 str += LightCharacters.get(tmp.chr); 619 if (!tmp.grp.isEmpty()) 620 str += "(" + tmp.grp + ")"; 621 else 622 str += "."; 623 for (ColRng cr : colrng) { 624 str += LightLetters.get(cr.col); 625 } 626 if ((tmp.per > 0) || (tmp.hgt > 0) || (colrng.get(0).rng > 0)) 627 str += "."; 628 if (tmp.per > 0) 629 str += df.format(tmp.per) + "s"; 630 if (tmp.hgt > 0) 631 str += df.format(tmp.hgt) + "m"; 632 if (colrng.get(0).rng > 0) 633 str += df.format(colrng.get(0).rng) + ((colrng.size() > 1) ? ((colrng.size() > 2) ? ("-" + df.format(colrng.get(colrng.size() - 1).rng)) : ("/" + df.format(colrng.get(1).rng))) : "") + "M"; 634 Renderer.labelText(str, new Font("Arial", Font.PLAIN, 40), Color.black, new Delta(Handle.TL, AffineTransform.getTranslateInstance(60, y))); 635 y += 40; 636 str = ""; 637 } 638 } 639 } else { 640 if (Renderer.zoom >= 15) { 641 AttMap atts = lights.get(0); 642 ArrayList<CatLIT> cats = new ArrayList<>(); 643 if (atts.containsKey(Att.CATLIT)) { 644 cats = (ArrayList<CatLIT>) atts.get(Att.CATLIT).val; 645 } 646 str = cats.contains(CatLIT.LIT_DIR) ? "Dir" : ""; 647 str += atts.containsKey(Att.MLTYLT) ? atts.get(Att.MLTYLT).val : ""; 648 if (atts.containsKey(Att.LITCHR)) { 649 LitCHR chr = ((ArrayList<LitCHR>) atts.get(Att.LITCHR).val).get(0); 650 if (atts.containsKey(Att.SIGGRP)) { 651 String grp = (String) atts.get(Att.SIGGRP).val; 652 switch (chr) { 653 case CHR_QLFL: 654 str += String.format("Q(%s)+LFl", grp); 655 break; 656 case CHR_VQLFL: 657 str += String.format("VQ(%s)+LFl", grp); 658 break; 659 case CHR_UQLFL: 660 str += String.format("UQ(%s)+LFl", grp); 661 break; 662 default: 663 str += String.format("%s(%s)", LightCharacters.get(chr), grp); 664 break; 665 } 666 } else { 667 str += LightCharacters.get(chr); 668 } 669 } 670 if (atts.containsKey(Att.COLOUR)) { 671 ArrayList<ColCOL> cols = (ArrayList<ColCOL>) atts.get(Att.COLOUR).val; 672 if (!((cols.size() == 1) && (cols.get(0) == ColCOL.COL_WHT))) { 673 if (!str.isEmpty() && !str.endsWith(")")) { 674 str += "."; 675 } 676 for (ColCOL acol : cols) { 677 str += LightLetters.get(acol); 678 } 679 } 680 } 681 str += cats.contains(CatLIT.LIT_VERT) ? "(vert)" : ""; 682 str += cats.contains(CatLIT.LIT_HORI) ? "(hor)" : ""; 683 str += (!str.isEmpty() && (atts.containsKey(Att.SIGPER) || atts.containsKey(Att.HEIGHT) || atts.containsKey(Att.VALMXR)) && !str.endsWith(")")) ? "." : ""; 684 str += atts.containsKey(Att.SIGPER) ? df.format(atts.get(Att.SIGPER).val) + "s" : ""; 685 str += atts.containsKey(Att.HEIGHT) ? df.format(atts.get(Att.HEIGHT).val) + "m" : ""; 686 str += atts.containsKey(Att.VALNMR) ? df.format(atts.get(Att.VALNMR).val) + "M" : ""; 687 str += cats.contains(CatLIT.LIT_FRNT) ? "(Front)" : ""; 688 str += cats.contains(CatLIT.LIT_REAR) ? "(Rear)" : ""; 689 str += cats.contains(CatLIT.LIT_UPPR) ? "(Upper)" : ""; 690 str += cats.contains(CatLIT.LIT_LOWR) ? "(Lower)" : ""; 691 Renderer.labelText(str, new Font("Arial", Font.PLAIN, 40), Color.black, new Delta(Handle.TL, AffineTransform.getTranslateInstance(60, -30))); 692 } 693 } 694 } 697 695 } 698
Note:
See TracChangeset
for help on using the changeset viewer.