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 "line16": 335 idr = DrawRules.LINE16; 336 break; 337 case "line17": 338 idr = DrawRules.LINE17; 339 break; 340 case "line18": 341 idr = DrawRules.LINE18; 342 break; 343 case "line19": 344 idr = DrawRules.LINE19; 345 break; 346 case "line20": 347 idr = DrawRules.LINE20; 348 break; 349 case "line21": 350 idr = DrawRules.LINE21; 351 break; 352 case "line22": 353 idr = DrawRules.LINE22; 354 break; 355 case "line23": 356 idr = DrawRules.LINE23; 357 break; 358 case "line24": 359 idr = DrawRules.LINE24; 360 break; 361 case "line25": 362 idr = DrawRules.LINE25; 363 break; 364 case "line26": 365 idr = DrawRules.LINE26; 366 break; 367 case "line27": 368 idr = DrawRules.LINE27; 369 break; 370 case "line28": 371 idr = DrawRules.LINE28; 372 break; 373 case "line29": 374 idr = DrawRules.LINE29; 375 break; 376 case "corridor1": 377 idr = DrawRules.CORRIDOR1; 378 break; 379 case "axis1": 380 idr = DrawRules.AXIS1; 381 break; 382 case "axis2": 383 idr = DrawRules.AXIS2; 384 break; 385 case "polyline1": 386 idr = DrawRules.POLYLINE1; 387 break; 388 case "ellipse1": 389 idr = DrawRules.ELLIPSE1; 390 break; 391 case "rectangular1": 392 idr = DrawRules.RECTANGULAR1; 393 break; 394 case "rectangular2": 395 idr = DrawRules.RECTANGULAR2; 396 break; 397 case "rectangular3": 398 idr = DrawRules.RECTANGULAR3; 399 break; 400 case "circular1": 401 idr = DrawRules.CIRCULAR1; 402 break; 403 case "circular2": 404 idr = DrawRules.CIRCULAR2; 405 break; 406 case "arc1": 407 idr = DrawRules.ARC1; 408 break; 409 default: 410 idr = DrawRules.DONOTDRAW; 411 } 412 return idr; 413 } 414 415 public static String parseSymbolSetName(String symbolID) 416 { 417 return parseSymbolSetName(symbolID.substring(4, 6), SymbolID.getVersion(symbolID)); 418 } 419 public static String parseSymbolSetName(String ss, int version) 420 { 421 String name = null; 422 switch(ss) 423 { 424 case "01": 425 name = "Air"; 426 break; 427 case "02": 428 name = "Air Missile"; 429 break; 430 case "05": 431 name = "Space"; 432 break; 433 case "06": 434 name = "Space Missile"; 435 break; 436 case "10": 437 name = "Land Unit"; 438 break; 439 case "11": 440 name = "Land Civilian Unit-Org"; 441 break; 442 case "15": 443 name = "Land Equipment"; 444 break; 445 case "20": 446 name = "Land Installations"; 447 break; 448 case "25": 449 name = "Control Measure"; 450 break; 451 case "27": 452 name = "Dismounted Individuals"; 453 break; 454 case "30": 455 name = "Sea Surface"; 456 break; 457 case "35": 458 name = "Sea Subsurface"; 459 break; 460 case "36": 461 name = "Mine Warfare"; 462 break; 463 case "40": 464 name = "Activities"; 465 break; 466 case "45": 467 name = "Atmospheric"; 468 break; 469 case "46": 470 name = "Oceanographic"; 471 break; 472 case "47": 473 name = "Meteorological Space"; 474 break; 475 case "50": 476 if(version < SymbolID.Version_2525E) 477 name = "Space SIGINT"; 478 else 479 name = "SIGINT"; 480 break; 481 case "51": 482 name = "Air SIGINT"; 483 break; 484 case "52": 485 name = "Land SIGINT"; 486 break; 487 case "53": 488 name = "Sea Surface SIGINT"; 489 break; 490 case "54": 491 name = "Sea Subsurface SIGINT"; 492 break; 493 case "60": 494 name = "Cyberspace"; 495 break; 496 default: 497 name = "UNKNOWN"; 498 } 499 return name; 500 } 501 502 /** 503 * 504 * @param drawRule - Like DrawRules.CIRCULAR2 505 * @return int[] where the first index is the minimum required points and 506 * the next index is the maximum allowed points 507 */ 508 private static int[] getMinMaxPointsFromDrawRule(int drawRule, int version) 509 { 510 int[] points = {1,1}; 511 512 switch(drawRule) 513 { 514 case DrawRules.AREA1: 515 case DrawRules.AREA2: 516 case DrawRules.AREA3: 517 case DrawRules.AREA4: 518 case DrawRules.AREA9: 519 case DrawRules.AREA20: 520 case DrawRules.AREA23: 521 points[0] = 3; 522 points[1] = Integer.MAX_VALUE; 523 break; 524 case DrawRules.AREA5: 525 case DrawRules.AREA7: 526 case DrawRules.AREA11: 527 case DrawRules.AREA12: 528 case DrawRules.AREA17: 529 case DrawRules.AREA21: 530 case DrawRules.AREA24: 531 case DrawRules.AREA25: 532 case DrawRules.POINT12: 533 case DrawRules.LINE3: 534 case DrawRules.LINE6://doesn't seem to be used 535 case DrawRules.LINE10: 536 case DrawRules.LINE12: 537 case DrawRules.LINE17: 538 case DrawRules.LINE22: 539 case DrawRules.LINE23: 540 case DrawRules.LINE24: 541 case DrawRules.LINE29://Ambush 542 case DrawRules.POLYLINE1: 543 points[0] = 3; 544 points[1] = 3; 545 break; 546 case DrawRules.AREA6: 547 case DrawRules.AREA13: 548 case DrawRules.AREA15: 549 case DrawRules.AREA16: 550 case DrawRules.AREA19: 551 case DrawRules.LINE4: 552 case DrawRules.LINE5: 553 case DrawRules.LINE9: 554 case DrawRules.LINE14: 555 case DrawRules.LINE18: 556 case DrawRules.LINE19: 557 case DrawRules.LINE20: 558 case DrawRules.LINE25: 559 case DrawRules.LINE28: 560 case DrawRules.RECTANGULAR1://requires AM 561 case DrawRules.RECTANGULAR3://requires AM 562 points[0] = 2; 563 points[1] = 2; 564 break; 565 case DrawRules.AREA8: 566 case DrawRules.AREA18: 567 case DrawRules.LINE11: 568 case DrawRules.LINE16: 569 points[0] = 4; 570 points[1] = 4; 571 break; 572 case DrawRules.AREA10: 573 points[0] = 3; 574 points[1] = 6; 575 break; 576 case DrawRules.AREA14: 577 points[0] = 3; 578 if (version == SymbolID.Version_2525D) 579 points[1] = 4; 580 else 581 points[1] = 3; 582 break; 583 case DrawRules.LINE1: 584 case DrawRules.LINE2: 585 case DrawRules.LINE7: 586 case DrawRules.LINE13: 587 case DrawRules.LINE21: 588 case DrawRules.CORRIDOR1://Airspace Control Corridors 589 points[0] = 2; 590 points[1] = Integer.MAX_VALUE; 591 break; 592 case DrawRules.AREA26: 593 //Min 6, no Max but number of points has to be even 594 points[0] = 6; 595 points[1] = Integer.MAX_VALUE; 596 break; 597 case DrawRules.LINE8: 598 points[0] = 2; 599 points[1] = 300; 600 break; 601 case DrawRules.LINE26: 602 case DrawRules.LINE27: 603 if (version >= SymbolID.Version_2525E) 604 points[0] = 4; 605 else 606 points[0] = 3; 607 points[1] = 4; 608 break; 609 case DrawRules.AXIS1: 610 case DrawRules.AXIS2: 611 points[0] = 3; 612 points[1] = 50; 613 break; 614 case 0://do not draw 615 points[0] = 0; 616 points[1] = 0; 617 break; 618 //Rest are single points 619 case DrawRules.AREA22://Basic Defense Zone (BDZ) requires AM for radius 620 case DrawRules.POINT17://requires AM & AM1 621 case DrawRules.POINT18://requires AM & AN values 622 case DrawRules.ELLIPSE1://required AM, AM1, AN 623 case DrawRules.RECTANGULAR2://requires AM, AM1, AN 624 default: 625 } 626 627 return points; 628 } 629 630 private static int[] getMinMaxPointsFromMODrawRule(int drawRule) 631 { 632 int[] points = {1,1}; 633 634 switch(drawRule) 635 { 636 case MODrawRules.AREA1: 637 case MODrawRules.AREA2: 638 case MODrawRules.LINE5: 639 points[0]=3; 640 points[1]=Integer.MAX_VALUE; 641 break; 642 case MODrawRules.POINT5: 643 case MODrawRules.LINE1: 644 case MODrawRules.LINE2: 645 case MODrawRules.LINE3: 646 case MODrawRules.LINE4: 647 case MODrawRules.LINE6: 648 case MODrawRules.LINE7: 649 case MODrawRules.LINE8: 650 points[0]=2; 651 points[1]=Integer.MAX_VALUE; 652 break; 653 case 0://do not draw 654 points[0] = 0; 655 points[1] = 0; 656 break; 657 //Rest are single points 658 default: 659 660 } 661 662 return points; 663 } 664 665 public int getVersion() 666 { 667 return _Version; 668 } 669 public String getName() 670 { 671 return _Name; 672 } 673 674 public String getPath() 675 { 676 return _Path; 677 } 678 679 public String getGeometry() 680 { 681 return _Geometry; 682 } 683 684 public int getDrawRule() 685 { 686 return _DrawRule; 687 } 688 689 public int getSymbolSet() 690 { 691 return _SymbolSetInt; 692 } 693 694 public int getEntityCode() 695 { 696 return Integer.valueOf(_EntityCode); 697 } 698 699 public String getBasicSymbolID() 700 { 701 if(_SymbolSetInt < 10) 702 return "0" + _SymbolSetInt + _EntityCode; 703 else 704 return _SymbolSetInt + _EntityCode; 705 } 706 public int getMinPointCount() 707 { 708 return _MinPointCount; 709 } 710 711 public int getMaxPointCount() 712 { 713 return _MaxPointCount; 714 } 715 716 public ArrayList<String> getModifiers() 717 { 718 return _Modifiers; 719 } 720 721 722}