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") && 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 "point1": 239 idr = DrawRules.POINT1; 240 break; 241 case "point2": 242 idr = DrawRules.POINT2; 243 break; 244 case "point3": 245 idr = DrawRules.POINT3; 246 break; 247 case "point4": 248 idr = DrawRules.POINT4; 249 break; 250 case "point5": 251 idr = DrawRules.POINT5; 252 break; 253 case "point6": 254 idr = DrawRules.POINT6; 255 break; 256 case "point7": 257 idr = DrawRules.POINT7; 258 break; 259 case "point8": 260 idr = DrawRules.POINT8; 261 break; 262 case "point9": 263 idr = DrawRules.POINT9; 264 break; 265 case "point10": 266 idr = DrawRules.POINT10; 267 break; 268 case "point11": 269 idr = DrawRules.POINT11; 270 break; 271 case "point12": 272 idr = DrawRules.POINT12; 273 break; 274 case "point13": 275 idr = DrawRules.POINT13; 276 break; 277 case "point14": 278 idr = DrawRules.POINT14; 279 break; 280 case "point15": 281 idr = DrawRules.POINT15; 282 break; 283 case "point16": 284 idr = DrawRules.POINT16; 285 break; 286 case "point17": 287 idr = DrawRules.POINT17; 288 break; 289 case "point18": 290 idr = DrawRules.POINT18; 291 break; 292 case "line1": 293 idr = DrawRules.LINE1; 294 break; 295 case "line2": 296 idr = DrawRules.LINE2; 297 break; 298 case "line3": 299 idr = DrawRules.LINE3; 300 break; 301 case "line4": 302 idr = DrawRules.LINE4; 303 break; 304 case "line5": 305 idr = DrawRules.LINE5; 306 break; 307 case "line6": 308 idr = DrawRules.LINE6; 309 break; 310 case "line7": 311 idr = DrawRules.LINE7; 312 break; 313 case "line8": 314 idr = DrawRules.LINE8; 315 break; 316 case "line9": 317 idr = DrawRules.LINE9; 318 break; 319 case "line10": 320 idr = DrawRules.LINE10; 321 break; 322 case "line11": 323 idr = DrawRules.LINE11; 324 break; 325 case "line12": 326 idr = DrawRules.LINE12; 327 break; 328 case "line13": 329 idr = DrawRules.LINE13; 330 break; 331 case "line14": 332 idr = DrawRules.LINE14; 333 break; 334 case "line15": 335 idr = DrawRules.LINE15; 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 "corridor1": 380 idr = DrawRules.CORRIDOR1; 381 break; 382 case "axis1": 383 idr = DrawRules.AXIS1; 384 break; 385 case "axis2": 386 idr = DrawRules.AXIS2; 387 break; 388 case "polyline1": 389 idr = DrawRules.POLYLINE1; 390 break; 391 case "ellipse1": 392 idr = DrawRules.ELLIPSE1; 393 break; 394 case "rectangular1": 395 idr = DrawRules.RECTANGULAR1; 396 break; 397 case "rectangular2": 398 idr = DrawRules.RECTANGULAR2; 399 break; 400 case "rectangular3": 401 idr = DrawRules.RECTANGULAR3; 402 break; 403 case "circular1": 404 idr = DrawRules.CIRCULAR1; 405 break; 406 case "circular2": 407 idr = DrawRules.CIRCULAR2; 408 break; 409 case "arc1": 410 idr = DrawRules.ARC1; 411 break; 412 default: 413 idr = DrawRules.DONOTDRAW; 414 } 415 return idr; 416 } 417 418 public static String parseSymbolSetName(String symbolID) 419 { 420 return parseSymbolSetName(symbolID.substring(4, 6), SymbolID.getVersion(symbolID)); 421 } 422 public static String parseSymbolSetName(String ss, int version) 423 { 424 String name = null; 425 switch(ss) 426 { 427 case "01": 428 name = "Air"; 429 break; 430 case "02": 431 name = "Air Missile"; 432 break; 433 case "05": 434 name = "Space"; 435 break; 436 case "06": 437 name = "Space Missile"; 438 break; 439 case "10": 440 name = "Land Unit"; 441 break; 442 case "11": 443 name = "Land Civilian Unit-Org"; 444 break; 445 case "15": 446 name = "Land Equipment"; 447 break; 448 case "20": 449 name = "Land Installations"; 450 break; 451 case "25": 452 name = "Control Measure"; 453 break; 454 case "27": 455 name = "Dismounted Individuals"; 456 break; 457 case "30": 458 name = "Sea Surface"; 459 break; 460 case "35": 461 name = "Sea Subsurface"; 462 break; 463 case "36": 464 name = "Mine Warfare"; 465 break; 466 case "40": 467 name = "Activities"; 468 break; 469 case "45": 470 name = "Atmospheric"; 471 break; 472 case "46": 473 name = "Oceanographic"; 474 break; 475 case "47": 476 name = "Meteorological Space"; 477 break; 478 case "50": 479 if(version < SymbolID.Version_2525E) 480 name = "Space SIGINT"; 481 else 482 name = "SIGINT"; 483 break; 484 case "51": 485 name = "Air SIGINT"; 486 break; 487 case "52": 488 name = "Land SIGINT"; 489 break; 490 case "53": 491 name = "Sea Surface SIGINT"; 492 break; 493 case "54": 494 name = "Sea Subsurface SIGINT"; 495 break; 496 case "60": 497 name = "Cyberspace"; 498 break; 499 default: 500 name = "UNKNOWN"; 501 } 502 return name; 503 } 504 505 /** 506 * 507 * @param drawRule - Like DrawRules.CIRCULAR2 508 * @return int[] where the first index is the minimum required points and 509 * the next index is the maximum allowed points 510 */ 511 private static int[] getMinMaxPointsFromDrawRule(int drawRule, int version) 512 { 513 int[] points = {1,1}; 514 515 switch(drawRule) 516 { 517 case DrawRules.AREA1: 518 case DrawRules.AREA2: 519 case DrawRules.AREA3: 520 case DrawRules.AREA4: 521 case DrawRules.AREA9: 522 case DrawRules.AREA20: 523 case DrawRules.AREA23: 524 points[0] = 3; 525 points[1] = Integer.MAX_VALUE; 526 break; 527 case DrawRules.AREA5: 528 case DrawRules.AREA7: 529 case DrawRules.AREA11: 530 case DrawRules.AREA12: 531 case DrawRules.AREA17: 532 case DrawRules.AREA21: 533 case DrawRules.AREA24: 534 case DrawRules.AREA25: 535 case DrawRules.POINT12: 536 case DrawRules.LINE3: 537 case DrawRules.LINE6://doesn't seem to be used 538 case DrawRules.LINE10: 539 case DrawRules.LINE12: 540 case DrawRules.LINE15: 541 case DrawRules.LINE17: 542 case DrawRules.LINE22: 543 case DrawRules.LINE23: 544 case DrawRules.LINE24: 545 case DrawRules.LINE29://Ambush 546 case DrawRules.POLYLINE1: 547 points[0] = 3; 548 points[1] = 3; 549 break; 550 case DrawRules.AREA6: 551 case DrawRules.AREA13: 552 case DrawRules.AREA15: 553 case DrawRules.AREA16: 554 case DrawRules.AREA19: 555 case DrawRules.LINE4: 556 case DrawRules.LINE5: 557 case DrawRules.LINE9: 558 case DrawRules.LINE14: 559 case DrawRules.LINE18: 560 case DrawRules.LINE19: 561 case DrawRules.LINE20: 562 case DrawRules.LINE25: 563 case DrawRules.LINE28: 564 case DrawRules.RECTANGULAR1://requires AM 565 case DrawRules.RECTANGULAR3://requires AM 566 points[0] = 2; 567 points[1] = 2; 568 break; 569 case DrawRules.AREA8: 570 case DrawRules.AREA18: 571 case DrawRules.LINE11: 572 case DrawRules.LINE16: 573 points[0] = 4; 574 points[1] = 4; 575 break; 576 case DrawRules.AREA10: 577 points[0] = 3; 578 points[1] = 6; 579 break; 580 case DrawRules.AREA14: 581 points[0] = 3; 582 if (version == SymbolID.Version_2525D) 583 points[1] = 4; 584 else 585 points[1] = 3; 586 break; 587 case DrawRules.LINE1: 588 case DrawRules.LINE2: 589 case DrawRules.LINE7: 590 case DrawRules.LINE13: 591 case DrawRules.LINE21: 592 case DrawRules.CORRIDOR1://Airspace Control Corridors 593 points[0] = 2; 594 points[1] = Integer.MAX_VALUE; 595 break; 596 case DrawRules.AREA26: 597 //Min 6, no Max but number of points has to be even 598 points[0] = 6; 599 points[1] = Integer.MAX_VALUE; 600 break; 601 case DrawRules.LINE8: 602 points[0] = 2; 603 points[1] = 300; 604 break; 605 case DrawRules.LINE26: 606 case DrawRules.LINE27: 607 if (version >= SymbolID.Version_2525E) 608 points[0] = 4; 609 else 610 points[0] = 3; 611 points[1] = 4; 612 break; 613 case DrawRules.AXIS1: 614 case DrawRules.AXIS2: 615 points[0] = 3; 616 points[1] = 50; 617 break; 618 case 0://do not draw 619 points[0] = 0; 620 points[1] = 0; 621 break; 622 //Rest are single points 623 case DrawRules.AREA22://Basic Defense Zone (BDZ) requires AM for radius 624 case DrawRules.POINT17://requires AM & AM1 625 case DrawRules.POINT18://requires AM & AN values 626 case DrawRules.ELLIPSE1://required AM, AM1, AN 627 case DrawRules.RECTANGULAR2://requires AM, AM1, AN 628 default: 629 } 630 631 return points; 632 } 633 634 private static int[] getMinMaxPointsFromMODrawRule(int drawRule) 635 { 636 int[] points = {1,1}; 637 638 switch(drawRule) 639 { 640 case MODrawRules.AREA1: 641 case MODrawRules.AREA2: 642 case MODrawRules.LINE5: 643 points[0]=3; 644 points[1]=Integer.MAX_VALUE; 645 break; 646 case MODrawRules.POINT5: 647 case MODrawRules.LINE1: 648 case MODrawRules.LINE2: 649 case MODrawRules.LINE3: 650 case MODrawRules.LINE4: 651 case MODrawRules.LINE6: 652 case MODrawRules.LINE7: 653 case MODrawRules.LINE8: 654 points[0]=2; 655 points[1]=Integer.MAX_VALUE; 656 break; 657 case 0://do not draw 658 points[0] = 0; 659 points[1] = 0; 660 break; 661 //Rest are single points 662 default: 663 664 } 665 666 return points; 667 } 668 669 public int getVersion() 670 { 671 return _Version; 672 } 673 public String getName() 674 { 675 return _Name; 676 } 677 678 public String getPath() 679 { 680 return _Path; 681 } 682 683 public String getGeometry() 684 { 685 return _Geometry; 686 } 687 688 public int getDrawRule() 689 { 690 return _DrawRule; 691 } 692 693 public int getSymbolSet() 694 { 695 return _SymbolSetInt; 696 } 697 698 public int getEntityCode() 699 { 700 return Integer.valueOf(_EntityCode); 701 } 702 703 public String getBasicSymbolID() 704 { 705 if(_SymbolSetInt < 10) 706 return "0" + _SymbolSetInt + _EntityCode; 707 else 708 return _SymbolSetInt + _EntityCode; 709 } 710 public int getMinPointCount() 711 { 712 return _MinPointCount; 713 } 714 715 public int getMaxPointCount() 716 { 717 return _MaxPointCount; 718 } 719 720 public ArrayList<String> getModifiers() 721 { 722 return _Modifiers; 723 } 724 725 726}