Changeset 31063 in osm for applications/editors/josm/plugins/seachart/src/render/Signals.java
- Timestamp:
- 2015-03-27T09:22:05+01:00 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
applications/editors/josm/plugins/seachart/src/render/Signals.java
r31044 r31063 54 54 static final EnumMap<LitCHR, String> lightCharacters = new EnumMap<LitCHR, String>(LitCHR.class); 55 55 static { 56 lightCharacters.put(LitCHR.CHR_F, " W");56 lightCharacters.put(LitCHR.CHR_F, "F"); 57 57 lightCharacters.put(LitCHR.CHR_FL, "Fl"); 58 58 lightCharacters.put(LitCHR.CHR_LFL, "LFl"); … … 285 285 Enum<ColCOL> col = null; 286 286 Enum<ColCOL> tcol = null; 287 ObjTab objs = feature.objs.get(Obj.LIGHTS);288 for (AttMap atts : objs.values()) {287 ObjTab lights = feature.objs.get(Obj.LIGHTS); 288 for (AttMap atts : lights.values()) { 289 289 if (atts.containsKey(Att.COLOUR)) { 290 290 ArrayList<Enum<ColCOL>> cols = (ArrayList<Enum<ColCOL>>) atts.get(Att.COLOUR).val; … … 304 304 } 305 305 Renderer.symbol(feature, Beacons.LightFlare, new Scheme(lightColours.get(col)), new Delta(Handle.BC, AffineTransform.getRotateInstance(Math.toRadians(120)))); 306 if ( objs.get(1) != null) {307 for (AttMap atts : objs.values()) {306 if (lights.get(1) != null) { 307 for (AttMap atts : lights.values()) { 308 308 Enum<ColCOL> col1 = null; 309 309 Enum<ColCOL> col2 = null; … … 360 360 double n1 = 360; 361 361 double n2 = 360; 362 for (AttMap sect : objs.values()) {362 for (AttMap sect : lights.values()) { 363 363 if (sect != atts) { 364 364 … … 369 369 } 370 370 } 371 } 372 373 /* 374 void renderSector(Item_t *item, int s, char *text, char *style, double offset, int dy) { 375 Obj_t *sector; 376 double start, end; 377 Att_t *att; 378 XY_t p0, p1; 379 double r0, r1; 380 double b0, b1, span; 381 char *col; 382 XY_t pos = findCentroid(item); 383 if ((sector = getObj(item, LIGHTS, s)) != NULL) { 384 strcpy(string1, (att = getAtt(sector, LITRAD)) != NULL ? att->val.val.a : "0.2"); 385 if (((att = getAtt(sector, CATLIT)) != NULL) && (testAtt(att, LIT_DIR)) && ((att = getAtt(sector, ORIENT)) != NULL)) { 386 b0 = fmod(540.0 - att->val.val.f, 360.0); 387 if ((att = getAtt(sector, COLOUR)) != NULL) { 388 col = light_colours[att->val.val.l->val]; 389 r0 = atof(string1); 390 p0 = radial(pos, r0, b0); 391 printf("<path d=\"M %g,%g L %g,%g\" style=\"fill:none;stroke:#808080;stroke-width:%g;stroke-dasharray:%g\"/>\n", 392 pos.x, pos.y, p0.x, p0.y, (4 * symbolScale[zoom]), (20 * symbolScale[zoom])); 393 start = fmod(b0 + 2.0, 360.0); 394 end = fmod(360.0 + b0 - 2.0, 360.0); 395 Obj_t *adj; 396 for (int i = s-1; i <= s+1; i++) { 397 if (i == s) continue; 398 if ((adj = getObj(item, LIGHTS, i)) == NULL) continue; 399 Att_t *att; 400 if (((att = getAtt(adj, CATLIT)) != NULL) && (testAtt(att, LIT_DIR)) && ((att = getAtt(adj, ORIENT)) != NULL)) { 401 b1 = fmod(540.0 - att->val.val.f, 360.0); 402 if (fabs(b0 - b1) > 180.0) { 403 if (b0 < b1) b0 += 360.0; 404 else b1 += 360.0; 405 } 406 if (fabs(b0 - b1) < 4.0) { 407 if (b1 > b0) start = fmod((720.0 + b0 + b1) / 2.0, 360.0); 408 else end = fmod((720.0 + b0 + b1) / 2.0, 360.0); 409 } 410 } 411 } 412 p0 = radial(pos, r0, start); 413 p1 = radial(pos, r0, end); 414 printf("<path id=\"%d\" d=\"M %g,%g A %g,%g,0,0,1,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g\"/>\n", 415 ++ref, p0.x, p0.y, r0*mile, r0*mile, p1.x, p1.y, col, (20 * symbolScale[zoom])); 416 if (att->val.val.l->next != NULL) { 417 char *col = light_colours[att->val.val.l->next->val]; 418 r1 = r0 - (20 * symbolScale[zoom]/mile); 419 p0 = radial(pos, r1, start); 420 p1 = radial(pos, r1, end); 421 printf("<path d=\"M %g,%g A %g,%g,0,0,1,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g\"/>\n", 422 p0.x, p0.y, r1*mile, r1*mile, p1.x, p1.y, col, (20 * symbolScale[zoom])); 423 } 424 } 425 } else if ((att = getAtt(sector, SECTR1)) != NULL) { 426 start = fmod(540.0 - att->val.val.f, 360.0); 427 if ((att = getAtt(sector, SECTR2)) != NULL) { 428 end = fmod(540.0 - att->val.val.f, 360.0); 429 start += start < end ? 360.0 : 0.0; 430 if ((att = getAtt(sector, COLOUR)) != NULL) { 431 char *ttok, *etok; 432 char *radstr = strdup(string1); 433 int arc = 0; 434 col = light_colours[att->val.val.l->val]; 435 r0 = 0.0; 436 b0 = b1 = start; 437 for (char *tpl = strtok_r(radstr, ";", &ttok); tpl != NULL; tpl = strtok_r(NULL, ";", &ttok)) { 438 p0 = radial(pos, r0, b0); 439 span = 0.0; 440 char *ele = strtok_r(tpl, ":", &etok); 441 if ((*tpl == ':') && (r0 == 0.0)) { 442 r1 = 0.2; 443 } else if (*tpl != ':') { 444 r1 = atof(tpl); 445 ele = strtok_r(NULL, ":", &etok); 446 } 447 while (ele != NULL) { 448 if (isalpha(*ele)) { 449 if (strcmp(ele, "suppress") == 0) arc = 2; 450 else if (strcmp(ele, "dashed") == 0) arc = 1; 451 else arc = 0; 452 } else { 453 span = atof(ele); 454 } 455 ele = strtok_r(NULL, ":", &etok); 456 } 457 if (span == 0.0) { 458 char *back = (ttok != NULL) ? strstr(ttok, "-") : NULL; 459 if (back != NULL) { 460 span = b0 - end + atof(back); 461 } else { 462 span = b0 - end; 463 } 464 } 465 if (r1 != r0) { 466 p1 = radial(pos, r1, b0); 467 if (!((start == 180.0) && (end == 180.0))) 468 printf("<path d=\"M %g,%g L %g,%g\" style=\"fill:none;stroke:#808080;stroke-width:%g;stroke-dasharray:%g\"/>\n", 469 p0.x, p0.y, p1.x, p1.y, (4 * symbolScale[zoom]), (20 * symbolScale[zoom])); 470 r0 = r1; 471 p0 = p1; 472 } 473 if (span < 0.0) { 474 b1 = end - span; 475 b1 = b1 > b0 ? b0 : b1; 476 b0 = b1; 477 b1 = end; 478 p0 = radial(pos, r0, b0); 479 } else { 480 b1 = b0 - span; 481 b1 = b1 < end ? end : b1; 482 } 483 p1 = radial(pos, r1, b1); 484 if ((b0 == 180.0) && (b1 == 180.0)) { 485 span = 360.0; 486 p1 = radial(pos, r1, b1+0.01); 487 } 488 if (arc == 0) { 489 if (p0.x < p1.x) 490 printf("<path id=\"%d\" d=\"M %g,%g A %g,%g,0,%d,1,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g\"/>\n", 491 ++ref, p0.x, p0.y, r1*mile, r1*mile, span>180.0, p1.x, p1.y, col, (20 * symbolScale[zoom])); 492 else 493 printf("<path id=\"%d\" d=\"M %g,%g A %g,%g,0,%d,0,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g\"/>\n", 494 ++ref, p1.x, p1.y, r1*mile, r1*mile, span>180.0, p0.x, p0.y, col, (20 * symbolScale[zoom])); 495 if (text != NULL) { 496 double chord = sqrt(pow((p0.x - p1.x), 2) + pow((p0.y - p1.y), 2)); 497 if ((chord > (strlen(text) * textScale[zoom] * 50)) || ((b0 == 180.0) && (b1 == 180.0))) 498 drawLineText(item, text, style, offset, dy, ref); 499 } 500 } else if (arc == 1) { 501 printf("<path d=\"M %g,%g A %g,%g,0,%d,1,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g;stroke-opacity:0.5;stroke-dasharray:%g\"/>\n", 502 p0.x, p0.y, r1*mile, r1*mile, span>180.0, p1.x, p1.y, col, (10 * symbolScale[zoom]), (30 * symbolScale[zoom])); 503 } 504 if ((arc == 0) && (att->val.val.l->next != NULL)) { 505 char *col = light_colours[att->val.val.l->next->val]; 506 double r2 = r1 - (20 * symbolScale[zoom]/mile); 507 XY_t p2 = radial(pos, r2, b0); 508 XY_t p3 = radial(pos, r2, b1); 509 printf("<path d=\"M %g,%g A %g,%g,0,%d,1,%g,%g\" style=\"fill:none;stroke:%s;stroke-width:%g\"/>\n", 510 p2.x, p2.y, r1*mile, r1*mile, span>180.0, p3.x, p3.y, col, (20 * symbolScale[zoom])); 511 } 512 b0 = b1; 513 if (b0 == end) break; 514 } 515 if (!((start == 180.0) && (end == 180.0))) 516 printf("<path d=\"M %g,%g L %g,%g\" style=\"fill:none;stroke:#808080;stroke-width:%g;stroke-dasharray:%g\"/>\n", 517 pos.x, pos.y, p1.x, p1.y, (4 * symbolScale[zoom]), (20 * symbolScale[zoom])); 518 free(radstr); 519 } 520 } 521 } 522 } 371 final Att matches[] = { Att.SIGPER, Att.SIGGRP, Att.MLTYLT, Att.LITCHR, Att.CATLIT, Att.HEIGHT }; 372 ArrayList<ArrayList<AttMap>> groups = new ArrayList<ArrayList<AttMap>>(); 373 for (AttMap sector : lights.values()) { 374 if (sector.containsKey(Att.COLOUR)) { 375 boolean equal = false; 376 for (ArrayList<AttMap> group : groups) { 377 AttMap member = group.get(0); 378 for (Att match : matches) { 379 if (!((sector.containsKey(match) && member.containsKey(match) && sector.get(match).val.equals(member.get(match).val)) || (!sector.containsKey(match) && !member.containsKey(match)))) { 380 equal = false; 381 break; 382 } else { 383 equal = true; 384 } 385 } 386 if (equal) { 387 group.add(sector); 388 break; 389 } 390 } 391 if (!equal) { 392 ArrayList<AttMap> group = new ArrayList<AttMap>(); 393 group.add(sector); 394 groups.add(group); 395 } 396 } 397 } 398 for (boolean sorted = false; !sorted;) { 399 sorted = true; 400 for (int i = 0; i < groups.size()-1; i ++) { 401 if (groups.get(i).size() < groups.get(i+1).size()) { 402 ArrayList<AttMap> tmp = groups.remove(i); 403 groups.add(i+1, tmp); 404 sorted = false; 405 } 406 } 407 } 408 for (ArrayList<AttMap> group : groups) { 409 for (boolean sorted = false; !sorted;) { 410 sorted = true; 411 for (int i = 0; i < group.size()-1; i ++) { 412 AttMap m0 = group.get(i); 413 AttMap m1 = group.get(i+1); 414 if (((m0.containsKey(Att.VALNMR) && m1.containsKey(Att.VALNMR) && ((int)m0.get(Att.VALNMR).val < (int)m1.get(Att.VALNMR).val))) 415 || (!m0.containsKey(Att.VALNMR) && m1.containsKey(Att.VALNMR))) { 416 AttMap tmp = group.remove(i); 417 group.add(i+1, tmp); 418 sorted = false; 419 } 420 } 421 } 422 } 423 } 424 523 425 } 524 char *charString(Item_t *item, char *type, int idx) {525 strcpy(string1, "");526 Att_t *att = NULL;527 Obj_t *obj = getObj(item, enumType(type), idx);528 switch (enumType(type)) {529 case LIGHTS:530 {531 int secmax = countObjects(item, "light");532 if ((idx == 0) && (secmax > 0)) {533 struct SECT {534 struct SECT *next;535 int dir;536 LitCHR_t chr;537 ColCOL_t col;538 ColCOL_t alt;539 char *grp;540 double per;541 double rng;542 } *lights = NULL;543 for (int i = secmax; i > 0; i--) {544 struct SECT *tmp = calloc(1, sizeof(struct SECT));545 tmp->next = lights;546 lights = tmp;547 obj = getObj(item, LIGHTS, i);548 if ((att = getAtt(obj, CATLIT)) != NULL) {549 lights->dir = testAtt(att, LIT_DIR);550 }551 if ((att = getAtt(obj, LITCHR)) != NULL) {552 lights->chr = att->val.val.e;553 switch (lights->chr) {554 case CHR_AL:555 lights->chr = CHR_F;556 break;557 case CHR_ALOC:558 lights->chr = CHR_OC;559 break;560 case CHR_ALLFL:561 lights->chr = CHR_LFL;562 break;563 case CHR_ALFL:564 lights->chr = CHR_FL;565 break;566 case CHR_ALFFL:567 lights->chr = CHR_FFL;568 break;569 default:570 break;571 }572 }573 if ((att = getAtt(obj, SIGGRP)) != NULL) {574 lights->grp = att->val.val.a;575 } else {576 lights->grp = "";577 }578 if ((att = getAtt(obj, SIGPER)) != NULL) {579 lights->per = att->val.val.f;580 }581 if ((att = getAtt(obj, VALNMR)) != NULL) {582 lights->rng = att->val.val.f;583 }584 if ((att = getAtt(obj, COLOUR)) != NULL) {585 lights->col = att->val.val.l->val;586 if (att->val.val.l->next != NULL)587 lights->alt = att->val.val.l->next->val;588 }589 }590 struct COLRNG {591 int col;592 double rng;593 } colrng[14];594 while (lights != NULL) {595 strcpy(string2, "");596 bzero(colrng, 14*sizeof(struct COLRNG));597 colrng[lights->col].col = 1;598 colrng[lights->col].rng = lights->rng;599 struct SECT *this = lights;600 struct SECT *next = lights->next;601 while (next != NULL) {602 if ((this->dir == next->dir) && (this->chr == next->chr) &&603 (strcmp(this->grp, next->grp) == 0) && (this->per == next->per)) {604 colrng[next->col].col = 1;605 if (next->rng > colrng[next->col].rng)606 colrng[next->col].rng = next->rng;607 struct SECT *tmp = lights;608 while (tmp->next != next) tmp = tmp->next;609 tmp->next = next->next;610 free(next);611 next = tmp->next;612 } else {613 next = next->next;614 }615 }616 if (this->chr != CHR_UNKN) {617 if (this->dir) strcpy(string2, "Dir.");618 strcat(string2, light_characters[this->chr]);619 if (strcmp(this->grp, "") != 0) {620 if (this->grp[0] == '(')621 sprintf(strchr(string2, 0), "%s", this->grp);622 else623 sprintf(strchr(string2, 0), "(%s)", this->grp);624 } else {625 if (strlen(string2) > 0) strcat(string2, ".");626 }627 int n = 0;628 for (int i = 0; i < 14; i++) if (colrng[i].col) n++;629 double max = 0.0;630 for (int i = 0; i < 14; i++) if (colrng[i].col && (colrng[i].rng > max)) max = colrng[i].rng;631 double min = max;632 for (int i = 0; i < 14; i++) if (colrng[i].col && (colrng[i].rng > 0.0) && (colrng[i].rng < min)) min = colrng[i].rng;633 if (min == max) {634 for (int i = 0; i < 14; i++) if (colrng[i].col) strcat(string2, light_letters[i]);635 } else {636 for (int i = 0; i < 14; i++) if (colrng[i].col && (colrng[i].rng == max)) strcat(string2, light_letters[i]);637 for (int i = 0; i < 14; i++) if (colrng[i].col && (colrng[i].rng < max) && (colrng[i].rng > min)) strcat(string2, light_letters[i]);638 for (int i = 0; i < 14; i++) if (colrng[i].col && colrng[i].rng == min) strcat(string2, light_letters[i]);639 }640 strcat(string2, ".");641 if (this->per > 0.0) sprintf(strchr(string2, 0), "%gs", this->per);642 if (max > 0.0) {643 sprintf(strchr(string2, 0), "%g", max);644 if (min != max) {645 if (n == 2) strcat(string2, "/");646 else if (n > 2) strcat(string2, "-");647 if (min < max) sprintf(strchr(string2, 0), "%g", min);648 }649 strcat(string2, "M");650 }651 if (strlen(string1) > 0) strcat(string1, "\n");652 strcat(string1, string2);653 }654 lights = this->next;655 free(this);656 this = lights;657 }658 } else {659 if ((att = getAtt(obj, CATLIT)) != NULL) {660 if (testAtt(att, LIT_DIR))661 strcat(string1, "Dir");662 }663 if ((att = getAtt(obj, MLTYLT)) != NULL)664 sprintf(strchr(string1, 0), "%s", stringValue(att->val));665 if ((att = getAtt(obj, LITCHR)) != NULL) {666 char *chrstr = strdup(stringValue(att->val));667 Att_t *grp = getAtt(obj, SIGGRP);668 if (grp != NULL) {669 char *strgrp = strdup(stringValue(grp->val));670 char *grpstr = strtok(strgrp, "()");671 switch (att->val.val.e) {672 case CHR_QLFL:673 sprintf(strchr(string1, 0), "Q(%s)+LFl", grpstr);674 break;675 case CHR_VQLFL:676 sprintf(strchr(string1, 0), "VQ(%s)+LFl", grpstr);677 break;678 case CHR_UQLFL:679 sprintf(strchr(string1, 0), "UQ(%s)+LFl", grpstr);680 break;681 default:682 sprintf(strchr(string1, 0), "%s(%s)", chrstr, grpstr);683 break;684 }685 free(strgrp);686 } else {687 sprintf(strchr(string1, 0), "%s", chrstr);688 }689 free(chrstr);690 }691 if ((att = getAtt(obj, COLOUR)) != NULL) {692 int n = countValues(att);693 if (!((n == 1) && (idx == 0) && (testAtt(att, COL_WHT)))) {694 if ((strlen(string1) > 0) && ((string1[strlen(string1)-1] != ')')))695 strcat(string1, ".");696 Lst_t *lst = att->val.val.l;697 while (lst != NULL) {698 strcat(string1, light_letters[lst->val]);699 lst = lst->next;700 }701 }702 }703 if ((idx == 0) && (att = getAtt(obj, CATLIT)) != NULL) {704 if (testAtt(att, LIT_VERT))705 strcat(string1, "(vert)");706 if (testAtt(att, LIT_HORI))707 strcat(string1, "(hor)");708 }709 if ((strlen(string1) > 0) &&710 ((getAtt(obj, SIGPER) != NULL) ||711 (getAtt(obj, HEIGHT) != NULL) ||712 (getAtt(obj, VALMXR) != NULL)) &&713 (string1[strlen(string1)-1] != ')'))714 strcat(string1, ".");715 if ((att = getAtt(obj, SIGPER)) != NULL)716 sprintf(strchr(string1, 0), "%ss", stringValue(att->val));717 if ((idx == 0) && (item->objs.obj != LITMIN)) {718 if ((att = getAtt(obj, HEIGHT)) != NULL)719 sprintf(strchr(string1, 0), "%sm", stringValue(att->val));720 if ((att = getAtt(obj, VALNMR)) != NULL)721 sprintf(strchr(string1, 0), "%sM", stringValue(att->val));722 }723 if ((idx == 0) && (att = getAtt(obj, CATLIT)) != NULL) {724 if (testAtt(att, LIT_FRNT))725 strcat(string1, "(Front)");726 if (testAtt(att, LIT_REAR))727 strcat(string1, "(Rear)");728 if (testAtt(att, LIT_UPPR))729 strcat(string1, "(Upper)");730 if (testAtt(att, LIT_LOWR))731 strcat(string1, "(Lower)");732 }733 }734 }735 break;736 default: break;737 }738 return string1;739 }740 */741 742 }
Note:
See TracChangeset
for help on using the changeset viewer.