001package armyc2.c5isr.renderer.utilities; 002 003import java.util.ArrayList; 004 005/** 006 * This class holds information about the MilStd Symbol. 007 * Name, geometry, point count, Draw Rule, etc... 008 * Can be retrived from {@link MSLookup}. 009 */ 010public class MSInfo { 011 012 private String _ID = null; 013 private String _Name = null; 014 private String _Path = null; 015 private String _SymbolSet = null; 016 017 private int _Version = 0; 018 private int _SymbolSetInt = 0; 019 private String _Entity = null; 020 private String _EntityType = null; 021 private String _EntitySubType = null; 022 private String _EntityCode = null; 023 private String _Geometry = "point"; 024 private ArrayList<String> _Modifiers = null; 025 private int _MinPointCount = 0; 026 private int _MaxPointCount = 0; 027 private int _DrawRule = 0; 028 029 030 /** 031 * @param version SymbolID.Version_2525Dhc1 (11), SymbolID.Version_2525E (13) 032 * @param symbolSet the 5th & 6th character in the symbol Code, represents Battle Dimension 033 * @param entity descriptor 034 * @param entityType descriptor 035 * @param entitySubType descriptor 036 * @param entityCode characters 11 - 16 in the symbol code 037 * @param modifiers String[] of modifier codes 038 */ 039 public MSInfo(int version, String symbolSet, String entity, String entityType, String entitySubType, String entityCode, ArrayList<String> modifiers) 040 { 041 _Version = version; 042 _ID = symbolSet + entityCode; 043 _SymbolSetInt = Integer.parseInt(symbolSet); 044 _SymbolSet = parseSymbolSetName(symbolSet,_Version); 045 if(entitySubType != null && !entitySubType.equals("")) 046 { 047 _Name = entitySubType; 048 _EntitySubType = entitySubType; 049 _Path = _SymbolSet + " / " + entity + " / " + entityType + " / "; 050 } 051 if(entityType != null && !entityType.equals("")) 052 { 053 _EntityType = entityType; 054 if(_Name == null) 055 _Name = entityType; 056 if(_Path == null) 057 _Path = _SymbolSet + " / " + entity + " / "; 058 } 059 if(entity != null && !entity.equals("")) 060 { 061 _Entity = entity; 062 if(_Name == null) 063 _Name = entity; 064 if(_Path == null) 065 _Path = _SymbolSet + " / "; 066 } 067 if(entityCode != null & entityCode.length()==6) 068 _EntityCode = entityCode; 069 070 _Geometry = "point"; 071 072 //Only Control Measures and METOC categories have draw rules so everything else shows up in here if we 073 //here if we don't check for them. 074 if(/*!entityCode.equals("000000") && */ //commented out to allow top-level unspecified 075 !(_SymbolSetInt == SymbolID.SymbolSet_ControlMeasure || 076 _SymbolSetInt == SymbolID.SymbolSet_Atmospheric || 077 _SymbolSetInt == SymbolID.SymbolSet_Oceanographic || 078 _SymbolSetInt == SymbolID.SymbolSet_MeteorologicalSpace)) 079 { 080 _DrawRule = DrawRules.POINT2; 081 _MinPointCount = 1; 082 _MaxPointCount = 1; 083 } 084 085 086 _Modifiers = modifiers; 087 /*if(getSymbolSetInt() != SymbolID.SymbolSet_ControlMeasure) 088 {//values come from files during MSLookup load for Control Measures 089 _Modifiers = populateModifierListD(); 090 }*/ 091 } 092 093 /** 094 * 095 * @param symbolSet the 5th & 6th character in the symbol Code, represents Battle Dimension 096 * @param entity descriptor 097 * @param entityType descriptor 098 * @param entitySubType descriptor 099 * @param entityCode characters 11 - 16 in the symbol code 100 * @param geometry "point", "line", "area" 101 * @param drawRule as defined in 2525D for Control Measures and METOC (i.e. "Point1") 102 */ 103 public MSInfo(int version, String symbolSet, String entity, String entityType, String entitySubType, String entityCode, String geometry, String drawRule, ArrayList<String> modifiers) 104 { 105 _Version = version; 106 _ID = symbolSet + entityCode; 107 _SymbolSetInt = Integer.parseInt(symbolSet); 108 _SymbolSet = parseSymbolSetName(symbolSet,_Version); 109 if(entitySubType != null && !entitySubType.equals("")) 110 { 111 _Name = entitySubType; 112 _EntitySubType = entitySubType; 113 _Path = _SymbolSet + " / " + entity + " / " + entityType + " / "; 114 } 115 if(entityType != null && !entityType.equals("")) 116 { 117 _EntityType = entityType; 118 if(_Name == null) 119 _Name = entityType; 120 if(_Path == null) 121 _Path = _SymbolSet + " / " + entity + " / "; 122 } 123 if(entity != null && !entity.equals("")) 124 { 125 _Entity = entity; 126 if(_Name == null) 127 _Name = entity; 128 if(_Path == null) 129 _Path = _SymbolSet + " / "; 130 } 131 if(entityCode != null & entityCode.length()==6) 132 _EntityCode = entityCode; 133 134 _Geometry = geometry; 135 136 _DrawRule = parseDrawRule(drawRule); 137 138 int[] pointCounts = null; 139 if(symbolSet.equals("25")) 140 { 141 pointCounts = getMinMaxPointsFromDrawRule(_DrawRule, version); 142 } 143 else if(symbolSet.equals("45") || symbolSet.equals("46")) 144 {//Atmospheric, Oceanographic, Meteorological Space (last one has no symbols so not included) 145 pointCounts = getMinMaxPointsFromMODrawRule(_DrawRule); 146 } 147 _MinPointCount = pointCounts[0]; 148 _MaxPointCount = pointCounts[1]; 149 150 _Modifiers = modifiers; 151 152 } 153 154 private int parseDrawRule(String drawRule) 155 { 156 String dr = drawRule.toLowerCase(); 157 int idr = 0; 158 switch(dr) 159 { 160 case "area1": 161 idr = DrawRules.AREA1; 162 break; 163 case "area2": 164 idr = DrawRules.AREA2; 165 break; 166 case "area3": 167 idr = DrawRules.AREA3; 168 break; 169 case "area4": 170 idr = DrawRules.AREA4; 171 break; 172 case "area5": 173 idr = DrawRules.AREA5; 174 break; 175 case "area6": 176 idr = DrawRules.AREA6; 177 break; 178 case "area7": 179 idr = DrawRules.AREA7; 180 break; 181 case "area8": 182 idr = DrawRules.AREA8; 183 break; 184 case "area9": 185 idr = DrawRules.AREA9; 186 break; 187 case "area10": 188 idr = DrawRules.AREA10; 189 break; 190 case "area11": 191 idr = DrawRules.AREA11; 192 break; 193 case "area12": 194 idr = DrawRules.AREA12; 195 break; 196 case "area13": 197 idr = DrawRules.AREA13; 198 break; 199 case "area14": 200 idr = DrawRules.AREA14; 201 break; 202 case "area15": 203 idr = DrawRules.AREA15; 204 break; 205 case "area16": 206 idr = DrawRules.AREA16; 207 break; 208 case "area17": 209 idr = DrawRules.AREA17; 210 break; 211 case "area18": 212 idr = DrawRules.AREA18; 213 break; 214 case "area19": 215 idr = DrawRules.AREA19; 216 break; 217 case "area20": 218 idr = DrawRules.AREA20; 219 break; 220 case "area21": 221 idr = DrawRules.AREA21; 222 break; 223 case "area22": 224 idr = DrawRules.AREA22; 225 break; 226 case "area23": 227 idr = DrawRules.AREA23; 228 break; 229 case "area24": 230 idr = DrawRules.AREA24; 231 break; 232 case "area25": 233 idr = DrawRules.AREA25; 234 break; 235 case "area26": 236 idr = DrawRules.AREA26; 237 break; 238 case "area27": 239 idr = DrawRules.AREA27; 240 break; 241 case "point1": 242 idr = DrawRules.POINT1; 243 break; 244 case "point2": 245 idr = DrawRules.POINT2; 246 break; 247 case "point3": 248 idr = DrawRules.POINT3; 249 break; 250 case "point4": 251 idr = DrawRules.POINT4; 252 break; 253 case "point5": 254 idr = DrawRules.POINT5; 255 break; 256 case "point6": 257 idr = DrawRules.POINT6; 258 break; 259 case "point7": 260 idr = DrawRules.POINT7; 261 break; 262 case "point8": 263 idr = DrawRules.POINT8; 264 break; 265 case "point9": 266 idr = DrawRules.POINT9; 267 break; 268 case "point10": 269 idr = DrawRules.POINT10; 270 break; 271 case "point11": 272 idr = DrawRules.POINT11; 273 break; 274 case "point12": 275 idr = DrawRules.POINT12; 276 break; 277 case "point13": 278 idr = DrawRules.POINT13; 279 break; 280 case "point14": 281 idr = DrawRules.POINT14; 282 break; 283 case "point15": 284 idr = DrawRules.POINT15; 285 break; 286 case "point16": 287 idr = DrawRules.POINT16; 288 break; 289 case "point17": 290 idr = DrawRules.POINT17; 291 break; 292 case "point18": 293 idr = DrawRules.POINT18; 294 break; 295 case "line1": 296 idr = DrawRules.LINE1; 297 break; 298 case "line2": 299 idr = DrawRules.LINE2; 300 break; 301 case "line3": 302 idr = DrawRules.LINE3; 303 break; 304 case "line4": 305 idr = DrawRules.LINE4; 306 break; 307 case "line5": 308 idr = DrawRules.LINE5; 309 break; 310 case "line6": 311 idr = DrawRules.LINE6; 312 break; 313 case "line7": 314 idr = DrawRules.LINE7; 315 break; 316 case "line8": 317 idr = DrawRules.LINE8; 318 break; 319 case "line9": 320 idr = DrawRules.LINE9; 321 break; 322 case "line10": 323 idr = DrawRules.LINE10; 324 break; 325 case "line11": 326 idr = DrawRules.LINE11; 327 break; 328 case "line12": 329 idr = DrawRules.LINE12; 330 break; 331 case "line13": 332 idr = DrawRules.LINE13; 333 break; 334 case "line14": 335 idr = DrawRules.LINE14; 336 break; 337 case "line16": 338 idr = DrawRules.LINE16; 339 break; 340 case "line17": 341 idr = DrawRules.LINE17; 342 break; 343 case "line18": 344 idr = DrawRules.LINE18; 345 break; 346 case "line19": 347 idr = DrawRules.LINE19; 348 break; 349 case "line20": 350 idr = DrawRules.LINE20; 351 break; 352 case "line21": 353 idr = DrawRules.LINE21; 354 break; 355 case "line22": 356 idr = DrawRules.LINE22; 357 break; 358 case "line23": 359 idr = DrawRules.LINE23; 360 break; 361 case "line24": 362 idr = DrawRules.LINE24; 363 break; 364 case "line25": 365 idr = DrawRules.LINE25; 366 break; 367 case "line26": 368 idr = DrawRules.LINE26; 369 break; 370 case "line27": 371 idr = DrawRules.LINE27; 372 break; 373 case "line28": 374 idr = DrawRules.LINE28; 375 break; 376 case "line29": 377 idr = DrawRules.LINE29; 378 break; 379 case "line30": 380 idr = DrawRules.LINE30; 381 break; 382 case "line31": 383 idr = DrawRules.LINE31; 384 break; 385 case "line32": 386 idr = DrawRules.LINE32; 387 break; 388 case "line33": 389 idr = DrawRules.LINE33; 390 break; 391 case "corridor1": 392 idr = DrawRules.CORRIDOR1; 393 break; 394 case "axis1": 395 idr = DrawRules.AXIS1; 396 break; 397 case "axis2": 398 idr = DrawRules.AXIS2; 399 break; 400 case "polyline1": 401 idr = DrawRules.POLYLINE1; 402 break; 403 case "ellipse1": 404 idr = DrawRules.ELLIPSE1; 405 break; 406 case "rectangular1": 407 idr = DrawRules.RECTANGULAR1; 408 break; 409 case "rectangular2": 410 idr = DrawRules.RECTANGULAR2; 411 break; 412 case "rectangular3": 413 idr = DrawRules.RECTANGULAR3; 414 break; 415 case "circular1": 416 idr = DrawRules.CIRCULAR1; 417 break; 418 case "circular2": 419 idr = DrawRules.CIRCULAR2; 420 break; 421 case "arc1": 422 idr = DrawRules.ARC1; 423 break; 424 default: 425 idr = DrawRules.DONOTDRAW; 426 } 427 return idr; 428 } 429 430 public static String parseSymbolSetName(String symbolID) 431 { 432 return parseSymbolSetName(symbolID.substring(4, 6), SymbolID.getVersion(symbolID)); 433 } 434 public static String parseSymbolSetName(String ss, int version) 435 { 436 String name = null; 437 switch(ss) 438 { 439 case "01": 440 name = "Air"; 441 break; 442 case "02": 443 name = "Air Missile"; 444 break; 445 case "05": 446 name = "Space"; 447 break; 448 case "06": 449 name = "Space Missile"; 450 break; 451 case "10": 452 name = "Land Unit"; 453 break; 454 case "11": 455 name = "Land Civilian Unit-Org"; 456 break; 457 case "15": 458 name = "Land Equipment"; 459 break; 460 case "20": 461 name = "Land Installations"; 462 break; 463 case "25": 464 name = "Control Measure"; 465 break; 466 case "27": 467 name = "Dismounted Individuals"; 468 break; 469 case "30": 470 name = "Sea Surface"; 471 break; 472 case "35": 473 name = "Sea Subsurface"; 474 break; 475 case "36": 476 name = "Mine Warfare"; 477 break; 478 case "40": 479 name = "Activities"; 480 break; 481 case "45": 482 name = "Atmospheric"; 483 break; 484 case "46": 485 name = "Oceanographic"; 486 break; 487 case "47": 488 name = "Meteorological Space"; 489 break; 490 case "50": 491 if(version < SymbolID.Version_2525E) 492 name = "Space SIGINT"; 493 else 494 name = "SIGINT"; 495 break; 496 case "51": 497 name = "Air SIGINT"; 498 break; 499 case "52": 500 name = "Land SIGINT"; 501 break; 502 case "53": 503 name = "Sea Surface SIGINT"; 504 break; 505 case "54": 506 name = "Sea Subsurface SIGINT"; 507 break; 508 case "60": 509 name = "Cyberspace"; 510 break; 511 default: 512 name = "UNKNOWN"; 513 } 514 return name; 515 } 516 517 /** 518 * 519 * @param drawRule - Like DrawRules.CIRCULAR2 520 * @return int[] where the first index is the minimum required points and 521 * the next index is the maximum allowed points 522 */ 523 private static int[] getMinMaxPointsFromDrawRule(int drawRule, int version) 524 { 525 int[] points = {1,1}; 526 527 switch(drawRule) 528 { 529 case DrawRules.AREA1: 530 case DrawRules.AREA2: 531 case DrawRules.AREA3: 532 case DrawRules.AREA4: 533 case DrawRules.AREA9: 534 case DrawRules.AREA20: 535 case DrawRules.AREA23: 536 points[0] = 3; 537 points[1] = Integer.MAX_VALUE; 538 break; 539 case DrawRules.AREA5: 540 case DrawRules.AREA7: 541 case DrawRules.AREA11: 542 case DrawRules.AREA12: 543 case DrawRules.AREA17: 544 case DrawRules.AREA21: 545 case DrawRules.AREA24: 546 case DrawRules.AREA25: 547 case DrawRules.AREA27: 548 case DrawRules.POINT12: 549 case DrawRules.LINE3: 550 case DrawRules.LINE6://doesn't seem to be used 551 case DrawRules.LINE10: 552 case DrawRules.LINE12: 553 case DrawRules.LINE17: 554 case DrawRules.LINE22: 555 case DrawRules.LINE23: 556 case DrawRules.LINE24: 557 case DrawRules.LINE29://Ambush 558 case DrawRules.LINE30: 559 case DrawRules.LINE32: 560 case DrawRules.LINE33: 561 case DrawRules.POLYLINE1: 562 points[0] = 3; 563 points[1] = 3; 564 break; 565 case DrawRules.AREA6: 566 case DrawRules.AREA13: 567 case DrawRules.AREA15: 568 case DrawRules.AREA16: 569 case DrawRules.AREA19: 570 case DrawRules.LINE4: 571 case DrawRules.LINE5: 572 case DrawRules.LINE9: 573 case DrawRules.LINE14: 574 case DrawRules.LINE18: 575 case DrawRules.LINE19: 576 case DrawRules.LINE20: 577 case DrawRules.LINE25: 578 case DrawRules.LINE28: 579 case DrawRules.RECTANGULAR1://requires AM 580 case DrawRules.RECTANGULAR3://requires AM 581 points[0] = 2; 582 points[1] = 2; 583 break; 584 case DrawRules.AREA8: 585 case DrawRules.AREA18: 586 case DrawRules.LINE11: 587 case DrawRules.LINE16: 588 case DrawRules.LINE31: 589 points[0] = 4; 590 points[1] = 4; 591 break; 592 case DrawRules.AREA10: 593 points[0] = 3; 594 points[1] = 6; 595 break; 596 case DrawRules.AREA14: 597 points[0] = 3; 598 if (version == SymbolID.Version_2525D) 599 points[1] = 4; 600 else 601 points[1] = 3; 602 break; 603 case DrawRules.LINE1: 604 case DrawRules.LINE2: 605 case DrawRules.LINE7: 606 case DrawRules.LINE13: 607 case DrawRules.LINE21: 608 case DrawRules.CORRIDOR1://Airspace Control Corridors 609 points[0] = 2; 610 points[1] = Integer.MAX_VALUE; 611 break; 612 case DrawRules.AREA26: 613 //Min 6, no Max but number of points has to be even 614 points[0] = 6; 615 points[1] = Integer.MAX_VALUE; 616 break; 617 case DrawRules.LINE8: 618 points[0] = 2; 619 points[1] = 300; 620 break; 621 case DrawRules.LINE26: 622 case DrawRules.LINE27: 623 if (version >= SymbolID.Version_2525E) 624 points[0] = 4; 625 else 626 points[0] = 3; 627 points[1] = 4; 628 break; 629 case DrawRules.AXIS1: 630 case DrawRules.AXIS2: 631 points[0] = 3; 632 points[1] = 50; 633 break; 634 case 0://do not draw 635 points[0] = 0; 636 points[1] = 0; 637 break; 638 //Rest are single points 639 case DrawRules.AREA22://Basic Defense Zone (BDZ) requires AM for radius 640 case DrawRules.POINT17://requires AM & AM1 641 case DrawRules.POINT18://requires AM & AN values 642 case DrawRules.ELLIPSE1://required AM, AM1, AN 643 case DrawRules.RECTANGULAR2://requires AM, AM1, AN 644 default: 645 } 646 647 return points; 648 } 649 650 private static int[] getMinMaxPointsFromMODrawRule(int drawRule) 651 { 652 int[] points = {1,1}; 653 654 switch(drawRule) 655 { 656 case MODrawRules.AREA1: 657 case MODrawRules.AREA2: 658 case MODrawRules.LINE5: 659 points[0]=3; 660 points[1]=Integer.MAX_VALUE; 661 break; 662 case MODrawRules.POINT5: 663 case MODrawRules.LINE1: 664 case MODrawRules.LINE2: 665 case MODrawRules.LINE3: 666 case MODrawRules.LINE4: 667 case MODrawRules.LINE6: 668 case MODrawRules.LINE7: 669 case MODrawRules.LINE8: 670 points[0]=2; 671 points[1]=Integer.MAX_VALUE; 672 break; 673 case 0://do not draw 674 points[0] = 0; 675 points[1] = 0; 676 break; 677 //Rest are single points 678 default: 679 680 } 681 682 return points; 683 } 684 685 public int getVersion() 686 { 687 return _Version; 688 } 689 public String getName() 690 { 691 return _Name; 692 } 693 694 public String getPath() 695 { 696 return _Path; 697 } 698 699 public String getGeometry() 700 { 701 return _Geometry; 702 } 703 704 public int getDrawRule() 705 { 706 return _DrawRule; 707 } 708 709 public int getSymbolSet() 710 { 711 return _SymbolSetInt; 712 } 713 714 public int getEntityCode() 715 { 716 return Integer.valueOf(_EntityCode); 717 } 718 719 public String getBasicSymbolID() 720 { 721 if(_SymbolSetInt < 10) 722 return "0" + _SymbolSetInt + _EntityCode; 723 else 724 return _SymbolSetInt + _EntityCode; 725 } 726 public int getMinPointCount() 727 { 728 return _MinPointCount; 729 } 730 731 public int getMaxPointCount() 732 { 733 return _MaxPointCount; 734 } 735 736 public ArrayList<String> getModifiers() 737 { 738 return _Modifiers; 739 } 740 741 742}