/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package armyc2.c2sd.JavaTacticalRenderer; import armyc2.c2sd.JavaLineArray.TacticalLines; import armyc2.c2sd.JavaLineArray.arraysupport; import armyc2.c2sd.JavaLineArray.lineutility; import armyc2.c2sd.JavaLineArray.CELineArray; import armyc2.c2sd.JavaLineArray.POINT2; import java.util.ArrayList; import armyc2.c2sd.JavaLineArray.Shape2; import armyc2.c2sd.renderer.utilities.Color; import armyc2.c2sd.graphics2d.*; import java.io.InputStream; import armyc2.c2sd.renderer.utilities.ErrorLogger; import armyc2.c2sd.renderer.utilities.RendererException; import armyc2.c2sd.renderer.utilities.ShapeInfo; /** * Class to calculate the points for the Weather symbols * @author Michael Deutch */ public final class clsMETOC { private static final String _className = "clsMETOC"; //the following functions are for the rev D symbols /** * Rev D METOC symbols * @param SymbolSet * @param entityCode * @return */ public static int getWeatherLinetype(String SymbolSet, String entityCode) { int symbolSet=Integer.parseInt(SymbolSet); if(symbolSet != 45 && symbolSet != 46) return -1; int nCode=Integer.parseInt(entityCode); switch(nCode) { case 110301: return TacticalLines.CF; case 110302: return TacticalLines.UCF; case 110303: return TacticalLines.CFG; case 110304: return TacticalLines.CFY; case 110305: return TacticalLines.WF; case 110306: return TacticalLines.UWF; case 110307: return TacticalLines.WFG; case 110308: return TacticalLines.WFY; case 110309: return TacticalLines.OCCLUDED; case 110310: return TacticalLines.UOF; case 110311: return TacticalLines.OFY; case 110312: return TacticalLines.SF; case 110313: return TacticalLines.USF; case 110314: return TacticalLines.SFG; case 110315: return TacticalLines.SFY; case 110401: //trough with dashed lines new symbol case 110402: //now called upper trough return TacticalLines.TROUGH; case 110403: return TacticalLines.RIDGE; case 110404: return TacticalLines.SQUALL; case 110405: return TacticalLines.INSTABILITY; case 110406: return TacticalLines.SHEAR; case 110407: return TacticalLines.ITC; case 110408: return TacticalLines.CONVERGANCE; case 110409: return TacticalLines.ITD; case 140300: return TacticalLines.JET; case 140400: return TacticalLines.STREAM; case 162004: //tropical storm wind break; case 170100: return TacticalLines.IFR; case 170200: return TacticalLines.MVFR; case 170300: return TacticalLines.TURBULENCE; case 170400: return TacticalLines.ICING; case 170500: return TacticalLines.NON_CONVECTIVE; case 170501: return TacticalLines.CONVECTIVE; case 170600: return TacticalLines.FROZEN; case 170700: return TacticalLines.THUNDERSTORMS; case 170800: return TacticalLines.FOG; case 170900: return TacticalLines.SAND; case 171000: return TacticalLines.FREEFORM; case 180100: return TacticalLines.ISOBAR; case 180200: return TacticalLines.UPPER_AIR; case 180300: return TacticalLines.ISOTHERM; case 180400: return TacticalLines.ISOTACH; case 180500: return TacticalLines.ISODROSOTHERM; case 180600: return TacticalLines.ISOPLETHS; case 180700: return TacticalLines.OPERATOR_FREEFORM; case 110501: return TacticalLines.LVO; case 110502: return TacticalLines.UNDERCAST; case 110503: return TacticalLines.LRO; case 110504: return TacticalLines.ICE_EDGE; case 110505: return TacticalLines.ESTIMATED_ICE_EDGE; case 110506: return TacticalLines.ICE_EDGE_RADAR; case 110601: return TacticalLines.CRACKS; case 110602: return TacticalLines.CRACKS_SPECIFIC_LOCATION; case 110603: return TacticalLines.ICE_OPENINGS_LEAD; case 110604: return TacticalLines.ICE_OPENINGS_FROZEN; case 120102: return TacticalLines.DEPTH_CURVE; case 120103: return TacticalLines.DEPTH_CONTOUR; case 120104: return TacticalLines.DEPTH_AREA; case 120201: return TacticalLines.COASTLINE; case 120202: return TacticalLines.ISLAND; case 120203: return TacticalLines.BEACH; case 120204: return TacticalLines.WATER; case 120205: return TacticalLines.FORESHORE_LINE; case 120206: return TacticalLines.FORESHORE_AREA; case 120305: return TacticalLines.ANCHORAGE_LINE; case 120306: return TacticalLines.ANCHORAGE_AREA; case 120308: return TacticalLines.PIER; case 120312: return TacticalLines.WEIRS; case 120313: return TacticalLines.DRYDOCK; case 120317: return TacticalLines.LOADING_FACILITY_LINE; case 120318: return TacticalLines.LOADING_FACILITY_AREA; case 120319: return TacticalLines.RAMP_ABOVE_WATER; case 120320: return TacticalLines.RAMP_BELOW_WATER; case 120326: return TacticalLines.JETTY_ABOVE_WATER; case 120327: return TacticalLines.JETTY_BELOW_WATER; case 120328: return TacticalLines.SEAWALL; case 120405: return TacticalLines.PERCHES; case 120407: return TacticalLines.LEADING_LINE; case 120503: return TacticalLines.UNDERWATER_HAZARD; case 120505: return TacticalLines.FOUL_GROUND; case 120507: return TacticalLines.KELP; case 120511: return TacticalLines.BREAKERS; case 120512: return TacticalLines.REEF; case 120514: return TacticalLines.DISCOLORED_WATER; case 120702: return TacticalLines.EBB_TIDE; case 120703: return TacticalLines.FLOOD_TIDE; case 130101: return TacticalLines.VDR_LEVEL_12; case 130102: return TacticalLines.VDR_LEVEL_23; case 130103: return TacticalLines.VDR_LEVEL_34; case 130104: return TacticalLines.VDR_LEVEL_45; case 130105: return TacticalLines.VDR_LEVEL_56; case 130106: return TacticalLines.VDR_LEVEL_67; case 130107: return TacticalLines.VDR_LEVEL_78; case 130108: return TacticalLines.VDR_LEVEL_89; case 130109: return TacticalLines.VDR_LEVEL_910; case 130201: return TacticalLines.BEACH_SLOPE_FLAT; case 130202: return TacticalLines.BEACH_SLOPE_GENTLE; case 130203: return TacticalLines.BEACH_SLOPE_MODERATE; case 130204: return TacticalLines.BEACH_SLOPE_STEEP; case 140101: return TacticalLines.SOLID_ROCK; case 140102: return TacticalLines.CLAY; case 140103: return TacticalLines.VERY_COARSE_SAND; case 140104: return TacticalLines.COARSE_SAND; case 140105: return TacticalLines.MEDIUM_SAND; case 140106: return TacticalLines.FINE_SAND; case 140107: return TacticalLines.VERY_FINE_SAND; case 140108: return TacticalLines.VERY_FINE_SILT; case 140109: return TacticalLines.FINE_SILT; case 140110: return TacticalLines.MEDIUM_SILT; case 140111: return TacticalLines.COARSE_SILT; case 140112: return TacticalLines.BOULDERS; case 140113: return TacticalLines.OYSTER_SHELLS; case 140114: return TacticalLines.PEBBLES; case 140115: return TacticalLines.SAND_AND_SHELLS; case 140116: return TacticalLines.BOTTOM_SEDIMENTS_LAND; case 140117: return TacticalLines.BOTTOM_SEDIMENTS_NO_DATA; case 140118: return TacticalLines.BOTTOM_ROUGHNESS_SMOOTH; case 140119: return TacticalLines.BOTTOM_ROUGHNESS_MODERATE; case 140120: return TacticalLines.BOTTOM_ROUGHNESS_ROUGH; case 140121: return TacticalLines.CLUTTER_LOW; case 140122: return TacticalLines.CLUTTER_MEDIUM; case 140123: return TacticalLines.CLUTTER_HIGH; case 140124: return TacticalLines.IMPACT_BURIAL_0; case 140125: return TacticalLines.IMPACT_BURIAL_10; case 140126: return TacticalLines.IMPACT_BURIAL_20; case 140127: return TacticalLines.IMPACT_BURIAL_75; case 140128: return TacticalLines.IMPACT_BURIAL_100; case 140129: return TacticalLines.BOTTOM_CATEGORY_A; case 140130: return TacticalLines.BOTTOM_CATEGORY_B; case 140131: return TacticalLines.BOTTOM_CATEGORY_C; case 140132: return TacticalLines.BOTTOM_TYPE_A1; case 140133: return TacticalLines.BOTTOM_TYPE_A2; case 140134: return TacticalLines.BOTTOM_TYPE_A3; case 140135: return TacticalLines.BOTTOM_TYPE_B1; case 140136: return TacticalLines.BOTTOM_TYPE_B2; case 140137: return TacticalLines.BOTTOM_TYPE_B3; case 140138: return TacticalLines.BOTTOM_TYPE_C1; case 140139: return TacticalLines.BOTTOM_TYPE_C2; case 140140: return TacticalLines.BOTTOM_TYPE_C3; case 150100: return TacticalLines.MARITIME_LIMIT; case 150200: return TacticalLines.MARITIME_AREA; case 150300: return TacticalLines.RESTRICTED_AREA; case 150400: return TacticalLines.SWEPT_AREA; case 150500: return TacticalLines.TRAINING_AREA; case 150600: return TacticalLines.OPERATOR_DEFINED; case 160100: return TacticalLines.CABLE; case 160200: return TacticalLines.SUBMERGED_CRIB; case 160300: return TacticalLines.CANAL; case 160700: return TacticalLines.OIL_RIG_FIELD; case 160800: return TacticalLines.PIPE; default: return -1; } return -1; } /** * @param symbolID Mil-Standard 2525 15 character code * @return the line type as an integer if it is a weather symbol, else return -1 */ public static int IsWeather(String symbolID) { //the MeTOCs try { //added section for revD if(symbolID.length()>15) { //test for hold,brdghd //String setA=Modifier2.getSetA(symbolID); String setA=symbolID.substring(0,10); //String setB=Modifier2.getSetB(symbolID); String setB=symbolID.substring(10); //String entityCode=Modifier2.getCode(setB); String entityCode=setB.substring(0,6); int nEntityCode=Integer.parseInt(entityCode); //String symbolSet=Modifier2.getSymbolSet(setA); String symbolSet=setA.substring(4,6); int nSymbolSet=Integer.parseInt(symbolSet); switch(nSymbolSet) { case 25: //look for holding line, bridgehead if(nEntityCode==141400) return TacticalLines.BRDGHD; else if(nEntityCode==141500) return TacticalLines.HOLD; break; case 45: case 46: return getWeatherLinetype(symbolSet,entityCode); } } //end section if(symbolID==null) return -1; if(symbolID.equalsIgnoreCase("HOLD")) return TacticalLines.HOLD; if(symbolID.equalsIgnoreCase("BRDGHD")) return TacticalLines.BRDGHD; if (symbolID.equalsIgnoreCase("CF")) { return TacticalLines.CF; } else if (symbolID.equalsIgnoreCase("BOTTOM_TYPE_C3")) { return TacticalLines.BOTTOM_TYPE_C3; } else if (symbolID.equalsIgnoreCase("BOTTOM_TYPE_C2")) { return TacticalLines.BOTTOM_TYPE_C2; } else if (symbolID.equalsIgnoreCase("BOTTOM_TYPE_C1")) { return TacticalLines.BOTTOM_TYPE_C1; } else if (symbolID.equalsIgnoreCase("BOTTOM_TYPE_B3")) { return TacticalLines.BOTTOM_TYPE_B3; } else if (symbolID.equalsIgnoreCase("BOTTOM_TYPE_B2")) { return TacticalLines.BOTTOM_TYPE_B2; } else if (symbolID.equalsIgnoreCase("BOTTOM_TYPE_B1")) { return TacticalLines.BOTTOM_TYPE_B1; } else if (symbolID.equalsIgnoreCase("BOTTOM_TYPE_A3")) { return TacticalLines.BOTTOM_TYPE_A3; } else if (symbolID.equalsIgnoreCase("BOTTOM_TYPE_A2")) { return TacticalLines.BOTTOM_TYPE_A2; } else if (symbolID.equalsIgnoreCase("BOTTOM_TYPE_A1")) { return TacticalLines.BOTTOM_TYPE_A1; } else if (symbolID.equalsIgnoreCase("BOTTOM_CATEGORY_C")) { return TacticalLines.BOTTOM_CATEGORY_C; } else if (symbolID.equalsIgnoreCase("BOTTOM_CATEGORY_B")) { return TacticalLines.BOTTOM_CATEGORY_B; } else if (symbolID.equalsIgnoreCase("BOTTOM_CATEGORY_A")) { return TacticalLines.BOTTOM_CATEGORY_A; } else if (symbolID.equalsIgnoreCase("IMPACT_BURIAL_100")) { return TacticalLines.IMPACT_BURIAL_100; } else if (symbolID.equalsIgnoreCase("IMPACT_BURIAL_75")) { return TacticalLines.IMPACT_BURIAL_75; } else if (symbolID.equalsIgnoreCase("IMPACT_BURIAL_20")) { return TacticalLines.IMPACT_BURIAL_20; } else if (symbolID.equalsIgnoreCase("IMPACT_BURIAL_10")) { return TacticalLines.IMPACT_BURIAL_10; } else if (symbolID.equalsIgnoreCase("IMPACT_BURIAL_0")) { return TacticalLines.IMPACT_BURIAL_0; } else if (symbolID.equalsIgnoreCase("CLUTTER_HIGH")) { return TacticalLines.CLUTTER_HIGH; } else if (symbolID.equalsIgnoreCase("CLUTTER_MEDIUM")) { return TacticalLines.CLUTTER_MEDIUM; } else if (symbolID.equalsIgnoreCase("CLUTTER_LOW")) { return TacticalLines.CLUTTER_LOW; } else if (symbolID.equalsIgnoreCase("BOTTOM_ROUGHNESS_ROUGH")) { return TacticalLines.BOTTOM_ROUGHNESS_ROUGH; } else if (symbolID.equalsIgnoreCase("BOTTOM_ROUGHNESS_MODERATE")) { return TacticalLines.BOTTOM_ROUGHNESS_MODERATE; } else if (symbolID.equalsIgnoreCase("BOTTOM_ROUGHNESS_SMOOTH")) { return TacticalLines.BOTTOM_ROUGHNESS_SMOOTH; } else if (symbolID.equalsIgnoreCase("BOTTOM_SEDIMENTS_LAND")) { return TacticalLines.BOTTOM_SEDIMENTS_LAND; } else if (symbolID.equalsIgnoreCase("BOTTOM_SEDIMENTS_NO_DATA")) { return TacticalLines.BOTTOM_SEDIMENTS_NO_DATA; } else if (symbolID.equalsIgnoreCase("SAND_AND_SHELLS")) { return TacticalLines.SAND_AND_SHELLS; } else if (symbolID.equalsIgnoreCase("PEBBLES")) { return TacticalLines.PEBBLES; } else if (symbolID.equalsIgnoreCase("OYSTER_SHELLS")) { return TacticalLines.OYSTER_SHELLS; } else if (symbolID.equalsIgnoreCase("BOULDERS")) { return TacticalLines.BOULDERS; } else if (symbolID.equalsIgnoreCase("COARSE_SILT")) { return TacticalLines.COARSE_SILT; } else if (symbolID.equalsIgnoreCase("MEDIUM_SILT")) { return TacticalLines.MEDIUM_SILT; } else if (symbolID.equalsIgnoreCase("FINE_SILT")) { return TacticalLines.FINE_SILT; } else if (symbolID.equalsIgnoreCase("VERY_FINE_SILT")) { return TacticalLines.VERY_FINE_SILT; } else if (symbolID.equalsIgnoreCase("VERY_FINE_SAND")) { return TacticalLines.VERY_FINE_SAND; } else if (symbolID.equalsIgnoreCase("FINE_SAND")) { return TacticalLines.FINE_SAND; } else if (symbolID.equalsIgnoreCase("MEDIUM_SAND")) { return TacticalLines.MEDIUM_SAND; } else if (symbolID.equalsIgnoreCase("COARSE_SAND")) { return TacticalLines.COARSE_SAND; } else if (symbolID.equalsIgnoreCase("VERY_COARSE_SAND")) { return TacticalLines.VERY_COARSE_SAND; } else if (symbolID.equalsIgnoreCase("CLAY")) { return TacticalLines.CLAY; } else if (symbolID.equalsIgnoreCase("SOLID_ROCK")) { return TacticalLines.SOLID_ROCK; } else if (symbolID.equalsIgnoreCase("VDR_LEVEL_12")) { return TacticalLines.VDR_LEVEL_12; } else if (symbolID.equalsIgnoreCase("VDR_LEVEL_23")) { return TacticalLines.VDR_LEVEL_23; } else if (symbolID.equalsIgnoreCase("VDR_LEVEL_34")) { return TacticalLines.VDR_LEVEL_34; } else if (symbolID.equalsIgnoreCase("VDR_LEVEL_45")) { return TacticalLines.VDR_LEVEL_45; } else if (symbolID.equalsIgnoreCase("VDR_LEVEL_56")) { return TacticalLines.VDR_LEVEL_56; } else if (symbolID.equalsIgnoreCase("VDR_LEVEL_67")) { return TacticalLines.VDR_LEVEL_67; } else if (symbolID.equalsIgnoreCase("VDR_LEVEL_78")) { return TacticalLines.VDR_LEVEL_78; } else if (symbolID.equalsIgnoreCase("VDR_LEVEL_89")) { return TacticalLines.VDR_LEVEL_89; } else if (symbolID.equalsIgnoreCase("VDR_LEVEL_910")) { return TacticalLines.VDR_LEVEL_910; } else if (symbolID.equalsIgnoreCase("CANAL")) { return TacticalLines.CANAL; } else if (symbolID.equalsIgnoreCase("SUBMERGED_CRIB")) { return TacticalLines.SUBMERGED_CRIB; } else if (symbolID.equalsIgnoreCase("OPERATOR_DEFINED")) { return TacticalLines.OPERATOR_DEFINED; } else if (symbolID.equalsIgnoreCase("MARITIME_AREA")) { return TacticalLines.MARITIME_AREA; } else if (symbolID.equalsIgnoreCase("MARITIME_LIMIT")) { return TacticalLines.MARITIME_LIMIT; } else if (symbolID.equalsIgnoreCase("BEACH_SLOPE_GENTLE")) { return TacticalLines.BEACH_SLOPE_GENTLE; } else if (symbolID.equalsIgnoreCase("BEACH_SLOPE_FLAT")) { return TacticalLines.BEACH_SLOPE_FLAT; } else if (symbolID.equalsIgnoreCase("DISCOLORED_WATER")) { return TacticalLines.DISCOLORED_WATER; } else if (symbolID.equalsIgnoreCase("BREAKERS")) { return TacticalLines.BREAKERS; } else if (symbolID.equalsIgnoreCase("UNDERWATER_HAZARD")) { return TacticalLines.UNDERWATER_HAZARD; } else if (symbolID.equalsIgnoreCase("PERCHES")) { return TacticalLines.PERCHES; } else if (symbolID.equalsIgnoreCase("LOADING_FACILITY_LINE")) { return TacticalLines.LOADING_FACILITY_LINE; } else if (symbolID.equalsIgnoreCase("LOADING_FACILITY_AREA")) { return TacticalLines.LOADING_FACILITY_AREA; } else if (symbolID.equalsIgnoreCase("DRYDOCK")) { return TacticalLines.DRYDOCK; } else if (symbolID.equalsIgnoreCase("FORESHORE_LINE")) { return TacticalLines.FORESHORE_LINE; } else if (symbolID.equalsIgnoreCase("FORESHORE_AREA")) { return TacticalLines.FORESHORE_AREA; } else if (symbolID.equalsIgnoreCase("ICE_DRIFT")) { return TacticalLines.ICE_DRIFT; } else if (symbolID.equalsIgnoreCase("REEF")) { return TacticalLines.REEF; } else if (symbolID.equalsIgnoreCase("RESTRICTED_AREA")) { return TacticalLines.RESTRICTED_AREA; } else if (symbolID.equalsIgnoreCase("TRAINING_AREA")) { return TacticalLines.TRAINING_AREA; } else if (symbolID.equalsIgnoreCase("PIPE")) { return TacticalLines.PIPE; } else if (symbolID.equalsIgnoreCase("ANCHORAGE_LINE")) { return TacticalLines.ANCHORAGE_LINE; } else if (symbolID.equalsIgnoreCase("ANCHORAGE_AREA")) { return TacticalLines.ANCHORAGE_AREA; } else if (symbolID.equalsIgnoreCase("BEACH_SLOPE_STEEP")) { return TacticalLines.BEACH_SLOPE_STEEP; } else if (symbolID.equalsIgnoreCase("BEACH_SLOPE_MODERATE")) { return TacticalLines.BEACH_SLOPE_MODERATE; } else if (symbolID.equalsIgnoreCase("KELP")) { return TacticalLines.KELP; } else if (symbolID.equalsIgnoreCase("FOUL_GROUND")) { return TacticalLines.FOUL_GROUND; } else if (symbolID.equalsIgnoreCase("OIL_RIG_FIELD")) { return TacticalLines.OIL_RIG_FIELD; } else if (symbolID.equalsIgnoreCase("SWEPT_AREA")) { return TacticalLines.SWEPT_AREA; } else if (symbolID.equalsIgnoreCase("WEIRS")) { return TacticalLines.WEIRS; } else if (symbolID.equalsIgnoreCase("BEACH")) { return TacticalLines.BEACH; } else if (symbolID.equalsIgnoreCase("WATER")) { return TacticalLines.WATER; } else if (symbolID.equalsIgnoreCase("ISLAND")) { return TacticalLines.ISLAND; } else if (symbolID.equalsIgnoreCase("DEPTH_AREA")) { return TacticalLines.DEPTH_AREA; } else if (symbolID.equalsIgnoreCase("LRO")) { return TacticalLines.LRO; } else if (symbolID.equalsIgnoreCase("LVO")) { return TacticalLines.LVO; } else if (symbolID.equalsIgnoreCase("UNDERCAST")) { return TacticalLines.UNDERCAST; } else if (symbolID.equalsIgnoreCase("SAND")) { return TacticalLines.SAND; } else if (symbolID.equalsIgnoreCase("OPERATOR_FREEFORM")) { return TacticalLines.OPERATOR_FREEFORM; } else if (symbolID.equalsIgnoreCase("FREEFORM")) { return TacticalLines.FREEFORM; } else if (symbolID.equalsIgnoreCase("FOG")) { return TacticalLines.FOG; } else if (symbolID.equalsIgnoreCase("THUNDERSTORMS")) { return TacticalLines.THUNDERSTORMS; } else if (symbolID.equalsIgnoreCase("FROZEN")) { return TacticalLines.FROZEN; } else if (symbolID.equalsIgnoreCase("ICING")) { return TacticalLines.ICING; } else if (symbolID.equalsIgnoreCase("NON_CONVECTIVE")) { return TacticalLines.NON_CONVECTIVE; } else if (symbolID.equalsIgnoreCase("CONVECTIVE")) { return TacticalLines.CONVECTIVE; } else if (symbolID.equalsIgnoreCase("MVFR")) { return TacticalLines.MVFR; } else if (symbolID.equalsIgnoreCase("TURBULENCE")) { return TacticalLines.TURBULENCE; } else if (symbolID.equalsIgnoreCase("IFR")) { return TacticalLines.IFR; } else if (symbolID.equalsIgnoreCase("ITD")) { return TacticalLines.ITD; } else if (symbolID.equalsIgnoreCase("CONVERGANCE")) { return TacticalLines.CONVERGANCE; } else if (symbolID.equalsIgnoreCase("ITC")) { return TacticalLines.ITC; } else if (symbolID.equalsIgnoreCase("SEVERE")) { return TacticalLines.SQUALL; } else if (symbolID.equalsIgnoreCase("SQUALL")) { return TacticalLines.SQUALL; } else if (symbolID.equalsIgnoreCase("RIDGE")) { return TacticalLines.RIDGE; } else if (symbolID.equalsIgnoreCase("TROUGH")) { return TacticalLines.TROUGH; } else if (symbolID.equalsIgnoreCase("INSTABILITY")) { return TacticalLines.INSTABILITY; } else if (symbolID.equalsIgnoreCase("SHEAR")) { return TacticalLines.SHEAR; } else if (symbolID.equalsIgnoreCase("UCF")) { return TacticalLines.UCF; } else if (symbolID.equalsIgnoreCase("CFG")) { return TacticalLines.CFG; } else if (symbolID.equalsIgnoreCase("CFY")) { return TacticalLines.CFY; } else if (symbolID.equalsIgnoreCase("UWF")) { return TacticalLines.UWF; } else if (symbolID.equalsIgnoreCase("WF")) { return TacticalLines.WF; } else if (symbolID.equalsIgnoreCase("WFG")) { return TacticalLines.WFG; } else if (symbolID.equalsIgnoreCase("WFY")) { return TacticalLines.WFY; } else if (symbolID.equalsIgnoreCase("OCCLUDED")) { return TacticalLines.OCCLUDED; } else if (symbolID.equalsIgnoreCase("UOF")) { return TacticalLines.UOF; } else if (symbolID.equalsIgnoreCase("OFY")) { return TacticalLines.OFY; } else if (symbolID.equalsIgnoreCase("SF")) { return TacticalLines.SF; } else if (symbolID.equalsIgnoreCase("USF")) { return TacticalLines.USF; } else if (symbolID.equalsIgnoreCase("SFG")) { return TacticalLines.SFG; } else if (symbolID.equalsIgnoreCase("SFY")) { return TacticalLines.SFY; } else if (symbolID.equalsIgnoreCase("ISOBAR")) { return TacticalLines.ISOBAR; } else if (symbolID.equalsIgnoreCase("UPPER_AIR")) { return TacticalLines.UPPER_AIR; } else if (symbolID.equalsIgnoreCase("LEADING_LINE")) { return TacticalLines.LEADING_LINE; } else if (symbolID.equalsIgnoreCase("ISODROSOTHERM")) { return TacticalLines.ISODROSOTHERM; } else if (symbolID.equalsIgnoreCase("CRACKS")) { return TacticalLines.CRACKS; } else if (symbolID.equalsIgnoreCase("ICE_EDGE")) { return TacticalLines.ICE_EDGE; } else if (symbolID.equalsIgnoreCase("DEPTH_CURVE")) { return TacticalLines.DEPTH_CURVE; } else if (symbolID.equalsIgnoreCase("DEPTH_CONTOUR")) { return TacticalLines.DEPTH_CONTOUR; } else if (symbolID.equalsIgnoreCase("COASTLINE")) { return TacticalLines.COASTLINE; } else if (symbolID.equalsIgnoreCase("PIER")) { return TacticalLines.PIER; } else if (symbolID.equalsIgnoreCase("RAMP_ABOVE_WATER")) { return TacticalLines.RAMP_ABOVE_WATER; } else if (symbolID.equalsIgnoreCase("JETTY_ABOVE_WATER")) { return TacticalLines.JETTY_ABOVE_WATER; } else if (symbolID.equalsIgnoreCase("SEAWALL")) { return TacticalLines.SEAWALL; } else if (symbolID.equalsIgnoreCase("CABLE")) { return TacticalLines.CABLE; } else if (symbolID.equalsIgnoreCase("ICE_OPENINGS_LEAD")) { return TacticalLines.ICE_OPENINGS_LEAD; } else if (symbolID.equalsIgnoreCase("ISOTACH")) { return TacticalLines.ISOTACH; } else if (symbolID.equalsIgnoreCase("ISOTHERM")) { return TacticalLines.ISOTHERM; } else if (symbolID.equalsIgnoreCase("ISOPLETHS")) { return TacticalLines.ISOPLETHS; } else if (symbolID.equalsIgnoreCase("ESTIMATED_ICE_EDGE")) { return TacticalLines.ESTIMATED_ICE_EDGE; } else if (symbolID.equalsIgnoreCase("RAMP_BELOW_WATER")) { return TacticalLines.RAMP_BELOW_WATER; } else if (symbolID.equalsIgnoreCase("JETTY_BELOW_WATER")) { return TacticalLines.JETTY_BELOW_WATER; } else if (symbolID.equalsIgnoreCase("ICE_OPENINGS_FROZEN")) { return TacticalLines.ICE_OPENINGS_FROZEN; } else if (symbolID.equalsIgnoreCase("ICE_EDGE_RADAR")) { return TacticalLines.ICE_EDGE_RADAR; } else if (symbolID.equalsIgnoreCase("CRACKS_SPECIFIC_LOCATION")) { return TacticalLines.CRACKS_SPECIFIC_LOCATION; } else if (symbolID.equalsIgnoreCase("EBB_TIDE")) { return TacticalLines.EBB_TIDE; } else if (symbolID.equalsIgnoreCase("FLOOD_TIDE")) { return TacticalLines.FLOOD_TIDE; } else if (symbolID.equalsIgnoreCase("JET")) { return TacticalLines.JET; } else if (symbolID.equalsIgnoreCase("STREAM")) { return TacticalLines.STREAM; } if (symbolID.length() != 15) { return -1; } String strLine = symbolID; String str1, str2, str3, str4, str5, str6, str7, str10; String c0 = strLine.substring(0, 1); String c1 = strLine.substring(1, 2); String c2 = strLine.substring(2, 3); //int bolUseEllipticArc=0; str1 = strLine.substring(4, 5);//was(4,1) str2 = strLine.substring(4, 6);//was(4,2) str3 = strLine.substring(4, 7);//was(4,3) str4 = strLine.substring(4, 8);//was(4,4) str5 = strLine.substring(4, 9);//was(4,5) str6 = strLine.substring(3, 9);//was(3,6) str7 = strLine.substring(3, 10);//was(3,7) str10 = strLine.substring(3, 13);//was(3,10) //METOC //HOLD if (str3.equals("SLH") && c0.equals("G") && c2.equals("G")) return TacticalLines.HOLD; //BRDGHD if (str3.equals("SLB") && c0.equals("G") && c2.equals("G")) return TacticalLines.BRDGHD; if(c0.equalsIgnoreCase("W")==false) return -1; if (c0.equals("W") && c1.equals("A")) { if (str7.equals("DPXSQ--")) { return TacticalLines.SQUALL; } if (str7.equals("DPFC---")) { return TacticalLines.CF; } if (str7.equals("DPFC-FG")) { return TacticalLines.CFG; } if (str7.equals("DPFC-FY")) { return TacticalLines.CFY; } if (str7.equals("DPFW-FG")) { return TacticalLines.WFG; } if (str7.equals("DPFW-FY")) { return TacticalLines.WFY; } if (str7.equals("DPFOU--")) { return TacticalLines.UOF; } if (str7.equals("DPFO-FY")) { return TacticalLines.OFY; } if (str7.equals("DPFSU--")) { return TacticalLines.USF; } if (str7.equals("DPFS-FG")) { return TacticalLines.SFG; } if (str7.equals("DPFS-FY")) { return TacticalLines.SFY; } if (str7.equals("DPXIL--")) { return TacticalLines.INSTABILITY; } if (str7.equals("DPXSH--")) { return TacticalLines.SHEAR; } if (str7.equals("DPXITCZ")) { return TacticalLines.ITC; } if (str7.equals("DPXCV--")) { return TacticalLines.CONVERGANCE; } if (str7.equals("DPXITD-")) { return TacticalLines.ITD; } if (str7.equals("DWJ----")) { return TacticalLines.JET; } if (str7.equals("DWS----")) { return TacticalLines.STREAM; } if (str7.equals("DBAIF--")) { return TacticalLines.IFR; } if (str7.equals("DBAMV--")) { return TacticalLines.MVFR; } if (str7.equals("DBATB--")) { return TacticalLines.TURBULENCE; } if (str7.equals("DBAI---")) { return TacticalLines.ICING; } if (str7.equals("DBALPNC")) { return TacticalLines.NON_CONVECTIVE; } if (str7.equals("DBALPC-")) { return TacticalLines.CONVECTIVE; } if (str7.equals("DBAFP--")) { return TacticalLines.FROZEN; } if (str7.equals("DBAT---")) { return TacticalLines.THUNDERSTORMS; } if (str7.equals("DBAFG--")) { return TacticalLines.FOG; } if (str7.equals("DBAD---")) { return TacticalLines.SAND; } if (str7.equals("DBAFF--")) { return TacticalLines.FREEFORM; } if (str7.equals("DIPIB--")) { return TacticalLines.ISOBAR; } if (str7.equals("DIPCO--")) { return TacticalLines.UPPER_AIR; } if (str7.equals("DIPIS--")) { return TacticalLines.ISOTHERM; } if (str7.equals("DIPIT--")) { return TacticalLines.ISOTACH; } if (str7.equals("DIPID--")) { return TacticalLines.ISODROSOTHERM; } if (str7.equals("DIPTH--")) { return TacticalLines.ISOPLETHS; } if (str7.equals("DIPFF--")) { return TacticalLines.OPERATOR_FREEFORM; } //if (strncmp(str,"PXR",3).equals(0) if (str3.equals("PXR")) { return TacticalLines.RIDGE; } //if (strncmp(str,"PXS",3).equals(0) //if(str3.equals("PXS") // return TacticalLines.SQUALL; //if (strncmp(str,"PXT",3).equals(0) if (str3.equals("PXT")) { return TacticalLines.TROUGH; } //if (strncmp(str,"PFCU",4).equals(0) if (str4.equals("PFCU")) { return TacticalLines.UCF; } //if (strncmp(str,"PFO",3).equals(0) if (str3.equals("PFO")) { return TacticalLines.OCCLUDED; } //if (strncmp(str,"PFS",3).equals(0) if (str3.equals("PFS")) { return TacticalLines.SF; } //if (strncmp(str,"PFWU",4).equals(0) if (str4.equals("PFWU")) { return TacticalLines.UWF; } //if (strncmp(str,"PFW",3).equals(0) if (str3.equals("PFW")) { return TacticalLines.WF; } //if (strncmp(str,"PFC",3).equals(0) if (str3.equals("PFC")) { return TacticalLines.CF; } } if (c0.equals("W") && c1.equals("O")) { if (str10.equals("DHCF----L-")) { return TacticalLines.FORESHORE_LINE; } if (str10.equals("DHCF-----A")) { return TacticalLines.FORESHORE_AREA; } if (str10.equals("DHPBA---L-")) { return TacticalLines.ANCHORAGE_LINE; } if (str10.equals("DHPBA----A")) { return TacticalLines.ANCHORAGE_AREA; } if (str10.equals("DHPMO---L-")) { return TacticalLines.LOADING_FACILITY_LINE; } if (str10.equals("DHPMO----A")) { return TacticalLines.LOADING_FACILITY_AREA; } } if (c0.equals("W") && c1.equals("O")) { if (str7.equals("DIDID--")) { return TacticalLines.ICE_DRIFT; } if (str7.equals("DILOV--")) { return TacticalLines.LVO; } if (str7.equals("DILUC--")) { return TacticalLines.UNDERCAST; } if (str7.equals("DILOR--")) { return TacticalLines.LRO; } if (str7.equals("DILIEO-")) { return TacticalLines.ICE_EDGE; } if (str7.equals("DILIEE-")) { return TacticalLines.ESTIMATED_ICE_EDGE; } if (str7.equals("DILIER-")) { return TacticalLines.ICE_EDGE_RADAR; } if (str7.equals("DIOC---")) { return TacticalLines.CRACKS; } if (str7.equals("DIOCS--")) { return TacticalLines.CRACKS_SPECIFIC_LOCATION; } if (str7.equals("DIOL---")) { return TacticalLines.ICE_OPENINGS_LEAD; } if (str7.equals("DIOLF--")) { return TacticalLines.ICE_OPENINGS_FROZEN; } if (str7.equals("DHDDL--")) { return TacticalLines.DEPTH_CURVE; } if (str7.equals("DHDDC--")) { return TacticalLines.DEPTH_CONTOUR; } if (str7.equals("DHDDA--")) { return TacticalLines.DEPTH_AREA; } if (str7.equals("DHCC---")) { return TacticalLines.COASTLINE; } if (str7.equals("DHCI---")) { return TacticalLines.ISLAND; } if (str7.equals("DHCB---")) { return TacticalLines.BEACH; } if (str7.equals("DHCW---")) { return TacticalLines.WATER; } if (str7.equals("DHPBP--")) { return TacticalLines.PIER; } if (str7.equals("-HPFF--")) { return TacticalLines.WEIRS; } if (str7.equals("-HHDR--")) { return TacticalLines.REEF; } if (str7.equals("DHPMD--")) { return TacticalLines.DRYDOCK; } if (str7.equals("DHPMRA-")) { return TacticalLines.RAMP_ABOVE_WATER; } if (str7.equals("DHPMRB-")) { return TacticalLines.RAMP_BELOW_WATER; } if (str7.equals("DHPSPA-")) { return TacticalLines.JETTY_ABOVE_WATER; } if (str7.equals("DHPSPB-")) { return TacticalLines.JETTY_BELOW_WATER; } if (str7.equals("DHPSPS-")) { return TacticalLines.SEAWALL; } if (str7.equals("DHABP--")) { return TacticalLines.PERCHES; } if (str7.equals("DHALLA-")) { return TacticalLines.LEADING_LINE; } if (str7.equals("DHHD---")) { return TacticalLines.UNDERWATER_HAZARD; } if (str7.equals("DHHDF--")) { return TacticalLines.FOUL_GROUND; } if (str7.equals("DHHDK--")) { return TacticalLines.KELP; } if (str7.equals("DHHDB--")) { return TacticalLines.BREAKERS; } if (str7.equals("DHHDD--")) { return TacticalLines.DISCOLORED_WATER; } if (str7.equals("DTCCCFE")) { return TacticalLines.EBB_TIDE; } if (str7.equals("DTCCCFF")) { return TacticalLines.FLOOD_TIDE; } if (str7.equals("DL-RA--")) { return TacticalLines.RESTRICTED_AREA; } if (str7.equals("DMPA---")) { return TacticalLines.PIPE; } if (str7.equals("DL-TA--")) { return TacticalLines.TRAINING_AREA; } if (str7.equals("DOBVA--")) { return TacticalLines.VDR_LEVEL_12; } if (str7.equals("DOBVB--")) { return TacticalLines.VDR_LEVEL_23; } if (str7.equals("DOBVC--")) { return TacticalLines.VDR_LEVEL_34; } if (str7.equals("DOBVD--")) { return TacticalLines.VDR_LEVEL_45; } if (str7.equals("DOBVE--")) { return TacticalLines.VDR_LEVEL_56; } if (str7.equals("DOBVF--")) { return TacticalLines.VDR_LEVEL_67; } if (str7.equals("DOBVG--")) { return TacticalLines.VDR_LEVEL_78; } if (str7.equals("DOBVH--")) { return TacticalLines.VDR_LEVEL_89; } if (str7.equals("DOBVI--")) { return TacticalLines.VDR_LEVEL_910; } if (str7.equals("DBSF---")) { return TacticalLines.BEACH_SLOPE_FLAT; } if (str7.equals("DBSG---")) { return TacticalLines.BEACH_SLOPE_GENTLE; } if (str7.equals("DBSM---")) { return TacticalLines.BEACH_SLOPE_MODERATE; } if (str7.equals("DBST---")) { return TacticalLines.BEACH_SLOPE_STEEP; } if (str7.equals("DGMSR--")) { return TacticalLines.SOLID_ROCK; } if (str7.equals("DGMSC--")) { return TacticalLines.CLAY; } if (str7.equals("DGMSSVS")) { return TacticalLines.VERY_COARSE_SAND; } if (str7.equals("DGMSSC-")) { return TacticalLines.COARSE_SAND; } if (str7.equals("DGMSSM-")) { return TacticalLines.MEDIUM_SAND; } if (str7.equals("DGMSSF-")) { return TacticalLines.FINE_SAND; } if (str7.equals("DGMSSVF")) { return TacticalLines.VERY_FINE_SAND; } if (str7.equals("DGMSIVF")) { return TacticalLines.VERY_FINE_SILT; } if (str7.equals("DGMSIF-")) { return TacticalLines.FINE_SILT; } if (str7.equals("DGMSIM-")) { return TacticalLines.MEDIUM_SILT; } if (str7.equals("DGMSIC-")) { return TacticalLines.COARSE_SILT; } if (str7.equals("DGMSB--")) { return TacticalLines.BOULDERS; } if (str7.equals("DGMS-CO")) { return TacticalLines.OYSTER_SHELLS; } if (str7.equals("DGMS-PH")) { return TacticalLines.PEBBLES; } if (str7.equals("DGMS-SH")) { return TacticalLines.SAND_AND_SHELLS; } if (str7.equals("DGML---")) { return TacticalLines.BOTTOM_SEDIMENTS_LAND; } if (str7.equals("DGMN---")) { return TacticalLines.BOTTOM_SEDIMENTS_NO_DATA; } if (str7.equals("DGMRS--")) { return TacticalLines.BOTTOM_ROUGHNESS_SMOOTH; } if (str7.equals("DGMRM--")) { return TacticalLines.BOTTOM_ROUGHNESS_MODERATE; } if (str7.equals("DGMRR--")) { return TacticalLines.BOTTOM_ROUGHNESS_ROUGH; } if (str7.equals("DGMCL--")) { return TacticalLines.CLUTTER_LOW; } if (str7.equals("DGMCM--")) { return TacticalLines.CLUTTER_MEDIUM; } if (str7.equals("DGMCH--")) { return TacticalLines.CLUTTER_HIGH; } if (str7.equals("DGMIBA-")) { return TacticalLines.IMPACT_BURIAL_0; } if (str7.equals("DGMIBB-")) { return TacticalLines.IMPACT_BURIAL_10; } if (str7.equals("DGMIBC-")) { return TacticalLines.IMPACT_BURIAL_20; } if (str7.equals("DGMIBD-")) { return TacticalLines.IMPACT_BURIAL_75; } if (str7.equals("DGMIBE-")) { return TacticalLines.IMPACT_BURIAL_100; } if (str7.equals("DGMBCA-")) { return TacticalLines.BOTTOM_CATEGORY_A; } if (str7.equals("DGMBCB-")) { return TacticalLines.BOTTOM_CATEGORY_B; } if (str7.equals("DGMBCC-")) { return TacticalLines.BOTTOM_CATEGORY_C; } if (str7.equals("DGMBTA-")) { return TacticalLines.BOTTOM_TYPE_A1; } if (str7.equals("DGMBTB-")) { return TacticalLines.BOTTOM_TYPE_A2; } if (str7.equals("DGMBTC-")) { return TacticalLines.BOTTOM_TYPE_A3; } if (str7.equals("DGMBTD-")) { return TacticalLines.BOTTOM_TYPE_B1; } if (str7.equals("DGMBTE-")) { return TacticalLines.BOTTOM_TYPE_B2; } if (str7.equals("DGMBTF-")) { return TacticalLines.BOTTOM_TYPE_B3; } if (str7.equals("DGMBTG-")) { return TacticalLines.BOTTOM_TYPE_C1; } if (str7.equals("DGMBTH-")) { return TacticalLines.BOTTOM_TYPE_C2; } if (str7.equals("DGMBTI-")) { return TacticalLines.BOTTOM_TYPE_C3; } if (str7.equals("DL-SA--")) { return TacticalLines.SWEPT_AREA; } if (str7.equals("DMOA---")) { return TacticalLines.OIL_RIG_FIELD; } if (str7.equals("DMCC---")) { return TacticalLines.SUBMERGED_CRIB; } if (str7.equals("DMCA---")) { return TacticalLines.CABLE; } if (str7.equals("DL-ML--")) { return TacticalLines.MARITIME_LIMIT; } if (str7.equals("DL-MA--")) { return TacticalLines.MARITIME_AREA; } if (str7.equals("DMCD---")) { return TacticalLines.CANAL; } if (str7.equals("DL-O---")) { return TacticalLines.OPERATOR_DEFINED; } } } catch (Exception exc) { //clsUtility.WriteFile("Error in clsMETOC.IsWeather"); ErrorLogger.LogException(_className ,"isWeather", new RendererException("Failed inside isWeather", exc)); } //end METOC section return -1; } /** * Sets tactical graphic properties based on Mil-Std-2525 Appendix C. * @param tg */ private static void SetMeTOCProperties(TGLight tg) { try { //METOC's have no user defined fills //any fills per Mil-Std-2525 will be set below //tg.set_FillColor(null); String symbolId=tg.get_SymbolId(); switch (tg.get_LineType()) { //255:150:150 case TacticalLines.TROUGH: if(symbolId.length()>=20) { String setB=symbolId.substring(10); String entityCode=setB.substring(0,6); if(entityCode.equalsIgnoreCase("110401")) { tg.set_LineStyle(2); } } tg.set_LineColor(Color.BLACK); break; case TacticalLines.BOTTOM_TYPE_A2: tg.set_LineColor(new Color(127, 255, 0)); //light green tg.set_FillColor(new Color(127, 255, 0)); break; case TacticalLines.BOTTOM_TYPE_C2: tg.set_LineColor(new Color(255, 80, 0)); //dark orange tg.set_FillColor(new Color(255, 80, 0)); break; case TacticalLines.BOTTOM_TYPE_C3: tg.set_LineColor(new Color(255, 48, 0)); //orange red tg.set_FillColor(new Color(255, 48, 0)); break; case TacticalLines.IMPACT_BURIAL_0: tg.set_LineColor(new Color(0, 0, 255)); //blue tg.set_FillColor(new Color(0, 0, 255)); break; case TacticalLines.BOTTOM_TYPE_C1: case TacticalLines.IMPACT_BURIAL_75: tg.set_LineColor(new Color(255, 127, 0)); //orange tg.set_FillColor(new Color(255, 127, 0)); break; case TacticalLines.BOTTOM_CATEGORY_C: case TacticalLines.IMPACT_BURIAL_100: case TacticalLines.CLUTTER_HIGH: case TacticalLines.BOTTOM_ROUGHNESS_ROUGH: tg.set_LineColor(new Color(255, 0, 0)); //red tg.set_FillColor(new Color(255, 0, 0)); break; case TacticalLines.BOTTOM_TYPE_B2: case TacticalLines.BOTTOM_CATEGORY_B: case TacticalLines.IMPACT_BURIAL_20: case TacticalLines.CLUTTER_MEDIUM: case TacticalLines.BOTTOM_ROUGHNESS_MODERATE: tg.set_LineColor(new Color(255, 255, 0)); //yellow tg.set_FillColor(new Color(255, 255, 0)); break; case TacticalLines.BOTTOM_TYPE_A1: case TacticalLines.BOTTOM_CATEGORY_A: case TacticalLines.IMPACT_BURIAL_10: case TacticalLines.CLUTTER_LOW: case TacticalLines.BOTTOM_ROUGHNESS_SMOOTH: tg.set_LineColor(new Color(0, 255, 0)); //green tg.set_FillColor(new Color(0, 255, 0)); break; case TacticalLines.BOTTOM_SEDIMENTS_NO_DATA: tg.set_LineColor(new Color(230, 230, 230)); //light gray tg.set_FillColor(new Color(230, 230, 230)); break; case TacticalLines.BOTTOM_SEDIMENTS_LAND: tg.set_LineColor(new Color(220, 220, 220)); //gray tg.set_FillColor(new Color(220, 220, 220)); break; case TacticalLines.SAND_AND_SHELLS: tg.set_LineColor(new Color(255, 220, 220)); //light peach tg.set_FillColor(new Color(255, 220, 220)); break; case TacticalLines.PEBBLES: tg.set_LineColor(new Color(255, 190, 190)); //peach tg.set_FillColor(new Color(255, 190, 190)); break; case TacticalLines.OYSTER_SHELLS: tg.set_LineColor(new Color(255, 150, 150)); //dark peach tg.set_FillColor(new Color(255, 150, 150)); break; case TacticalLines.BOULDERS: tg.set_LineColor(new Color(255, 0, 0)); tg.set_FillColor(new Color(255, 0, 0)); break; case TacticalLines.COARSE_SILT: tg.set_LineColor(new Color(200, 255, 105)); tg.set_FillColor(new Color(200, 255, 105)); break; case TacticalLines.MEDIUM_SILT: tg.set_LineColor(new Color(0, 255, 0)); //green tg.set_FillColor(new Color(0, 255, 0)); break; case TacticalLines.FINE_SILT: tg.set_LineColor(new Color(25, 255, 230)); //turquoise tg.set_FillColor(new Color(25, 255, 230)); break; case TacticalLines.VERY_FINE_SILT: tg.set_LineColor(new Color(0, 215, 255)); //turquoise tg.set_FillColor(new Color(0, 215, 255)); break; case TacticalLines.VERY_FINE_SAND: tg.set_LineColor(new Color(255, 255, 220)); //pale yellow tg.set_FillColor(new Color(255, 255, 220)); break; case TacticalLines.FINE_SAND: tg.set_LineColor(new Color(255, 255, 140)); //light yellow tg.set_FillColor(new Color(255, 255, 140)); break; case TacticalLines.MEDIUM_SAND: tg.set_LineColor(new Color(255, 235, 0)); //yellow tg.set_FillColor(new Color(255, 235, 0)); break; case TacticalLines.COARSE_SAND: tg.set_LineColor(new Color(255, 215, 0)); //light gold tg.set_FillColor(new Color(255, 215, 0)); break; case TacticalLines.BOTTOM_TYPE_B3: tg.set_LineColor(new Color(255, 207, 0)); //gold tg.set_FillColor(new Color(255, 207, 0)); break; case TacticalLines.VERY_COARSE_SAND: tg.set_LineColor(new Color(255, 180, 0)); //gold tg.set_FillColor(new Color(255, 180, 0)); break; case TacticalLines.CLAY: tg.set_LineColor(new Color(100, 130, 255)); //periwinkle tg.set_FillColor(new Color(100, 130, 255)); break; case TacticalLines.SOLID_ROCK: //tg.set_LineColor(new Color(160, 32, 240)); //purple //tg.set_FillColor(new Color(160, 32, 240)); tg.set_LineColor(new Color(255, 0, 255)); //magenta tg.set_FillColor(new Color(255, 0, 255)); break; case TacticalLines.VDR_LEVEL_12: tg.set_LineColor(new Color(26, 153, 55)); //dark green tg.set_FillColor(new Color(26, 153, 55)); break; case TacticalLines.VDR_LEVEL_23: tg.set_LineColor(new Color(26, 204, 77)); //light green tg.set_FillColor(new Color(26, 204, 77)); break; case TacticalLines.BOTTOM_TYPE_A3: case TacticalLines.VDR_LEVEL_34: tg.set_LineColor(new Color(128, 255, 51)); //lime green tg.set_FillColor(new Color(128, 255, 51)); break; case TacticalLines.BOTTOM_TYPE_B1: case TacticalLines.VDR_LEVEL_45: tg.set_LineColor(new Color(204, 255, 26)); //yellow green tg.set_FillColor(new Color(204, 255, 26)); break; case TacticalLines.VDR_LEVEL_56: tg.set_LineColor(new Color(255, 255, 0)); //yellow tg.set_FillColor(new Color(255, 255, 0)); break; case TacticalLines.VDR_LEVEL_67: tg.set_LineColor(new Color(255, 204, 0)); //gold tg.set_FillColor(new Color(255, 204, 0)); break; case TacticalLines.VDR_LEVEL_78: tg.set_LineColor(new Color(255, 128, 0)); //light orange tg.set_FillColor(new Color(255, 128, 0)); break; case TacticalLines.VDR_LEVEL_89: tg.set_LineColor(new Color(255, 77, 0)); //dark orange tg.set_FillColor(new Color(255, 77, 0)); break; case TacticalLines.VDR_LEVEL_910: tg.set_LineColor(Color.RED); tg.set_FillColor(Color.RED); break; case TacticalLines.CANAL: tg.set_LineColor(Color.BLACK); tg.set_LineThickness(4); break; case TacticalLines.OPERATOR_DEFINED: tg.set_LineColor(Color.ORANGE); break; case TacticalLines.MARITIME_LIMIT: tg.set_LineColor(Color.MAGENTA); tg.set_LineStyle(1); tg.set_LineThickness(1); break; case TacticalLines.MARITIME_AREA: tg.set_LineColor(Color.MAGENTA); tg.set_LineStyle(1); break; case TacticalLines.PERCHES: case TacticalLines.SUBMERGED_CRIB: tg.set_LineColor(Color.BLACK); tg.set_LineStyle(2); tg.set_FillColor(Color.BLUE); break; case TacticalLines.DISCOLORED_WATER: case TacticalLines.UNDERWATER_HAZARD: tg.set_LineColor(Color.BLACK); tg.set_LineStyle(2); tg.set_FillColor(new Color(0, 191, 255)); //deep sky blue break; case TacticalLines.LOADING_FACILITY_AREA: tg.set_LineColor(new Color(210, 180, 140)); tg.set_FillColor(new Color(210, 180, 140)); break; case TacticalLines.LOADING_FACILITY_LINE: tg.set_LineColor(Color.GRAY); tg.set_LineThickness(4); break; case TacticalLines.DRYDOCK: tg.set_LineColor(Color.BLACK); //tg.set_FillColor(new Color(165, 42, 42)); //brown tg.set_FillColor(new Color(205, 133, 63)); //brown tg.set_LineStyle(1); break; case TacticalLines.FORESHORE_AREA: //tg.set_LineColor(new Color(154, 205, 50)); //tg.set_FillColor(new Color(154, 205, 50)); tg.set_LineColor(new Color(173, 255, 47)); tg.set_FillColor(new Color(173, 255, 47)); break; case TacticalLines.FORESHORE_LINE: //tg.set_LineColor(new Color(154, 205, 50)); tg.set_LineColor(new Color(173, 255, 47)); break; case TacticalLines.RESTRICTED_AREA: case TacticalLines.TRAINING_AREA: case TacticalLines.ANCHORAGE_LINE: case TacticalLines.ANCHORAGE_AREA: tg.set_LineColor(Color.MAGENTA); //tg.set_LineStyle(1); //dashed break; case TacticalLines.PIPE: tg.set_LineColor(Color.GRAY); //beige tg.set_FillColor(Color.GRAY); break; case TacticalLines.WATER: tg.set_LineColor(Color.GRAY); //beige tg.set_FillColor(Color.WHITE); tg.set_LineStyle(1); break; case TacticalLines.WEIRS: tg.set_LineColor(new Color(245, 245, 220)); //beige tg.set_LineStyle(1); tg.set_LineThickness(3); break; case TacticalLines.SWEPT_AREA: case TacticalLines.OIL_RIG_FIELD: case TacticalLines.FOUL_GROUND: case TacticalLines.KELP: case TacticalLines.BEACH_SLOPE_MODERATE: case TacticalLines.BEACH_SLOPE_STEEP: case TacticalLines.BEACH: tg.set_LineColor(new Color(245, 245, 220)); //beige break; case TacticalLines.DEPTH_AREA: tg.set_LineColor(Color.BLUE); tg.set_FillColor(Color.WHITE); break; case TacticalLines.CONVERGANCE: case TacticalLines.ITC: tg.set_LineColor(Color.ORANGE); break; case TacticalLines.OFY: case TacticalLines.OCCLUDED: tg.set_LineColor(new Color(160, 32, 240)); tg.set_FillColor(new Color(160, 32, 240)); break; case TacticalLines.UOF: tg.set_LineColor(new Color(160, 32, 240)); break; case TacticalLines.WFY: case TacticalLines.WFG: case TacticalLines.WF: tg.set_FillColor(Color.RED); tg.set_LineColor(Color.RED); break; case TacticalLines.UWF: case TacticalLines.IFR: tg.set_LineColor(Color.RED); break; case TacticalLines.CFG: case TacticalLines.CFY: case TacticalLines.CF: tg.set_LineColor(Color.BLUE); tg.set_FillColor(Color.BLUE); break; case TacticalLines.UCF: case TacticalLines.MVFR: tg.set_LineColor(Color.BLUE); break; case TacticalLines.TURBULENCE: tg.set_LineColor(Color.BLUE); tg.set_LineStyle(2); break; case TacticalLines.CABLE: case TacticalLines.CABLE_GE: tg.set_LineColor(Color.MAGENTA); break; case TacticalLines.ISLAND: //tg.set_LineColor(new Color(165, 42, 42)); //brown //tg.set_FillColor(new Color(165, 42, 42)); //brown tg.set_LineColor(new Color(210, 180, 140)); //tan tg.set_FillColor(new Color(210, 180, 140)); //tam break; case TacticalLines.SEAWALL: case TacticalLines.SEAWALL_GE: case TacticalLines.FLOOD_TIDE: case TacticalLines.FLOOD_TIDE_GE: case TacticalLines.EBB_TIDE: case TacticalLines.EBB_TIDE_GE: case TacticalLines.JETTY_ABOVE_WATER: case TacticalLines.JETTY_ABOVE_WATER_GE: tg.set_LineColor(Color.GRAY); break; case TacticalLines.BEACH_SLOPE_FLAT: tg.set_LineColor(new Color(211, 211, 211)); tg.set_FillColor(null); break; case TacticalLines.BEACH_SLOPE_GENTLE: tg.set_LineColor(new Color(111, 111, 111)); tg.set_FillColor(null); break; case TacticalLines.BREAKERS: tg.set_LineStyle(1); tg.set_LineColor(Color.GRAY); tg.set_LineThickness(1); break; case TacticalLines.JETTY_BELOW_WATER: case TacticalLines.JETTY_BELOW_WATER_GE: tg.set_LineStyle(1); tg.set_LineColor(Color.GRAY); break; case TacticalLines.DEPTH_CURVE: case TacticalLines.DEPTH_CURVE_GE: case TacticalLines.DEPTH_CONTOUR: case TacticalLines.DEPTH_CONTOUR_GE: case TacticalLines.COASTLINE: case TacticalLines.COASTLINE_GE: case TacticalLines.PIER: case TacticalLines.PIER_GE: //tg.set_LineStyle(1); tg.set_LineThickness(1); tg.set_LineColor(Color.GRAY); break; case TacticalLines.FROZEN: case TacticalLines.JET: case TacticalLines.JET_GE: tg.set_LineColor(Color.RED); break; case TacticalLines.THUNDERSTORMS: tg.set_LineColor(Color.RED); tg.set_LineStyle(3); break; case TacticalLines.RAMP_BELOW_WATER: case TacticalLines.RAMP_BELOW_WATER_GE: case TacticalLines.ESTIMATED_ICE_EDGE: case TacticalLines.ESTIMATED_ICE_EDGE_GE: tg.set_LineStyle(1); tg.set_LineColor(Color.BLACK); break; case TacticalLines.ISODROSOTHERM: case TacticalLines.ISODROSOTHERM_GE: tg.set_LineColor(Color.GREEN); break; case TacticalLines.LRO: case TacticalLines.UNDERCAST: case TacticalLines.LVO: case TacticalLines.SQUALL: case TacticalLines.RIDGE: //case TacticalLines.TROUGH: case TacticalLines.ICE_OPENINGS_LEAD: case TacticalLines.ICE_OPENINGS_LEAD_GE: case TacticalLines.ICE_OPENINGS_FROZEN: case TacticalLines.ICE_OPENINGS_FROZEN_GE: case TacticalLines.LEADING_LINE: case TacticalLines.STREAM: case TacticalLines.STREAM_GE: case TacticalLines.CRACKS: case TacticalLines.CRACKS_GE: case TacticalLines.CRACKS_SPECIFIC_LOCATION: case TacticalLines.CRACKS_SPECIFIC_LOCATION_GE: case TacticalLines.ISOBAR: case TacticalLines.ISOBAR_GE: case TacticalLines.UPPER_AIR: case TacticalLines.UPPER_AIR_GE: case TacticalLines.ICE_EDGE: case TacticalLines.ICE_EDGE_GE: case TacticalLines.ICE_EDGE_RADAR: case TacticalLines.ICE_EDGE_RADAR_GE: case TacticalLines.REEF: case TacticalLines.ICE_DRIFT: tg.set_LineColor(Color.BLACK); break; case TacticalLines.INSTABILITY: tg.set_LineStyle(4); tg.set_LineColor(Color.BLACK); break; case TacticalLines.SHEAR: tg.set_LineStyle(3); tg.set_LineColor(Color.BLACK); break; case TacticalLines.ISOPLETHS: case TacticalLines.ISOPLETHS_GE: case TacticalLines.ISOTHERM: case TacticalLines.ISOTHERM_GE: tg.set_LineStyle(1); tg.set_LineColor(Color.RED); break; case TacticalLines.ISOTACH: case TacticalLines.ISOTACH_GE: tg.set_LineStyle(1); tg.set_LineColor(new Color(160, 32, 240)); break; case TacticalLines.SAND: case TacticalLines.ICING: tg.set_LineColor(new Color(165, 42, 42)); //brown break; case TacticalLines.NON_CONVECTIVE: tg.set_LineColor(Color.GREEN); break; case TacticalLines.CONVECTIVE: tg.set_LineColor(Color.GREEN); tg.set_LineStyle(3); break; case TacticalLines.FOG: tg.set_LineColor(Color.YELLOW); break; case TacticalLines.RAMP_ABOVE_WATER: case TacticalLines.RAMP_ABOVE_WATER_GE: tg.set_LineColor(Color.BLACK); break; default: break; } } catch (Exception exc) { //clsUtility.WriteFile("Error in clsMETOC.SetMeTOCProperties"); ErrorLogger.LogException(_className ,"SetMeTOCProperties", new RendererException("Failed inside SetMeTOCProperties", exc)); } } /** * * Finds next closest point with same x position on the splinePoints curve as pt * walks up the curve and if it does not find a range that straddles x it return null. * We ultimately will draw a line from pt to the extrapolated point on the splinePoints spline. * used for ICE_OPENINGS_FROZEN_LEAD * * @param splinePoints - the points on the opposite spline * @param pt - the point in the original curve from which the line will start * * @return The extrapolated point on the opposite spline to which the line will be drawn */ private static POINT2 ExtrapolatePointFromCurve(ArrayList<POINT2> splinePoints, POINT2 pt) { POINT2 pt2 = null; try { double dx = 0; //delta x between two points on the curve double dy = 0; //delta y between two points on the curve double m = 1; //the slope dy/dx double y = 0; //the y component of the calculated interpolation point double x = pt.x; int j = 0; //walk up the index to find points which straddle x. //if we find a pair which straddle x then extrapolate the y avlue from the curve and //return the point int n=splinePoints.size(); //for (j = 0; j < splinePoints.size() - 1; j++) for (j = 0; j < n - 1; j++) { //increment the index to find a greater value if (splinePoints.get(j).x <= x && splinePoints.get(j + 1).x >= x) { //extrapolate the point y value from the curve and return the point as Point(x,y) dx = splinePoints.get(j + 1).x - splinePoints.get(j).x; dy = splinePoints.get(j + 1).y - splinePoints.get(j).y; m = dy / dx; y = splinePoints.get(j).y + (x - splinePoints.get(j).x) * m; pt2 = new POINT2(x, y); return pt2; } if (splinePoints.get(j).x >= x && splinePoints.get(j + 1).x <= x) { //extrapolate the point y value from the curve and return the point as Point(x,y) dx = splinePoints.get(j + 1).x - splinePoints.get(j).x; dy = splinePoints.get(j + 1).y - splinePoints.get(j).y; m = dy / dx; y = splinePoints.get(j).y + (x - splinePoints.get(j).x) * m; pt2 = new POINT2(x, y); return pt2; } } } catch (Exception exc) { ErrorLogger.LogException(_className ,"ExtrapolatePointFromCurve", new RendererException("Failed inside ExtrapolatePointfromCurve", exc)); } return pt2; } /** * The public interface, main function to return METOC shapes * @param tg the tactical graphic * @param shapes the ShapeInfo array * @param rev the Mil-Standard-2525 revision */ public static void GetMeTOCShape(TGLight tg, ArrayList<Shape2> shapes, int rev) { try { if(shapes==null) return; GeneralPath lineObject = null; GeneralPath lineObject2 = null; ArrayList<POINT2> splinePoints = new ArrayList(); ArrayList<POINT2> splinePoints2 = new ArrayList(); double d = 0; int j = 0, k=0, l=0; Shape2 shape=null; POINT2 ptLast = tg.Pixels.get(tg.Pixels.size() - 1); ArrayList<POINT2> twoSplines = null; ArrayList<POINT2> upperSpline = null; ArrayList<POINT2> lowerSpline = null; ArrayList<POINT2> originalPixels = null; int t=0,u=0,v=0,w=0,tt=0,uu=0,vv=0,ww=0; ArrayList<POINT2>pixels=null; originalPixels=null; ArrayList<P1>partitions=null; SetMeTOCProperties(tg); switch (tg.get_LineType()) { case TacticalLines.SF: case TacticalLines.USF: case TacticalLines.SFG: case TacticalLines.SFY: case TacticalLines.WFY: case TacticalLines.WFG: case TacticalLines.WF: case TacticalLines.UWF: case TacticalLines.UCF: case TacticalLines.CF: case TacticalLines.CFG: case TacticalLines.CFY: case TacticalLines.OCCLUDED: case TacticalLines.UOF: case TacticalLines.OFY: case TacticalLines.TROUGH: case TacticalLines.INSTABILITY: case TacticalLines.SHEAR: case TacticalLines.RIDGE: case TacticalLines.SQUALL: case TacticalLines.ITC: case TacticalLines.CONVERGANCE: case TacticalLines.ITD: case TacticalLines.IFR: case TacticalLines.MVFR: case TacticalLines.TURBULENCE: case TacticalLines.ICING: case TacticalLines.NON_CONVECTIVE: case TacticalLines.CONVECTIVE: case TacticalLines.FROZEN: case TacticalLines.THUNDERSTORMS: case TacticalLines.FOG: case TacticalLines.SAND: case TacticalLines.FREEFORM: case TacticalLines.OPERATOR_FREEFORM: case TacticalLines.LVO: case TacticalLines.UNDERCAST: case TacticalLines.LRO: case TacticalLines.DEPTH_AREA: case TacticalLines.ISLAND: case TacticalLines.BEACH: case TacticalLines.WATER: case TacticalLines.WEIRS: case TacticalLines.SWEPT_AREA: case TacticalLines.OIL_RIG_FIELD: case TacticalLines.FOUL_GROUND: case TacticalLines.KELP: case TacticalLines.BEACH_SLOPE_MODERATE: case TacticalLines.BEACH_SLOPE_STEEP: case TacticalLines.ANCHORAGE_AREA: case TacticalLines.ANCHORAGE_LINE: case TacticalLines.PIPE: case TacticalLines.TRAINING_AREA: case TacticalLines.RESTRICTED_AREA: case TacticalLines.REEF: case TacticalLines.ICE_DRIFT: case TacticalLines.FORESHORE_AREA: case TacticalLines.FORESHORE_LINE: case TacticalLines.DRYDOCK: case TacticalLines.LOADING_FACILITY_LINE: case TacticalLines.LOADING_FACILITY_AREA: case TacticalLines.PERCHES: case TacticalLines.UNDERWATER_HAZARD: case TacticalLines.BREAKERS: case TacticalLines.DISCOLORED_WATER: case TacticalLines.BEACH_SLOPE_FLAT: case TacticalLines.BEACH_SLOPE_GENTLE: case TacticalLines.MARITIME_LIMIT: case TacticalLines.MARITIME_AREA: case TacticalLines.OPERATOR_DEFINED: case TacticalLines.SUBMERGED_CRIB: case TacticalLines.CANAL: case TacticalLines.VDR_LEVEL_12: case TacticalLines.VDR_LEVEL_23: case TacticalLines.VDR_LEVEL_34: case TacticalLines.VDR_LEVEL_45: case TacticalLines.VDR_LEVEL_56: case TacticalLines.VDR_LEVEL_67: case TacticalLines.VDR_LEVEL_78: case TacticalLines.VDR_LEVEL_89: case TacticalLines.VDR_LEVEL_910: case TacticalLines.SOLID_ROCK: case TacticalLines.CLAY: case TacticalLines.VERY_COARSE_SAND: case TacticalLines.COARSE_SAND: case TacticalLines.MEDIUM_SAND: case TacticalLines.FINE_SAND: case TacticalLines.VERY_FINE_SAND: case TacticalLines.VERY_FINE_SILT: case TacticalLines.FINE_SILT: case TacticalLines.MEDIUM_SILT: case TacticalLines.COARSE_SILT: case TacticalLines.BOULDERS: case TacticalLines.OYSTER_SHELLS: case TacticalLines.PEBBLES: case TacticalLines.SAND_AND_SHELLS: case TacticalLines.BOTTOM_SEDIMENTS_LAND: case TacticalLines.BOTTOM_SEDIMENTS_NO_DATA: case TacticalLines.BOTTOM_ROUGHNESS_SMOOTH: case TacticalLines.BOTTOM_ROUGHNESS_MODERATE: case TacticalLines.BOTTOM_ROUGHNESS_ROUGH: case TacticalLines.CLUTTER_LOW: case TacticalLines.CLUTTER_MEDIUM: case TacticalLines.CLUTTER_HIGH: case TacticalLines.IMPACT_BURIAL_0: case TacticalLines.IMPACT_BURIAL_10: case TacticalLines.IMPACT_BURIAL_20: case TacticalLines.IMPACT_BURIAL_75: case TacticalLines.IMPACT_BURIAL_100: case TacticalLines.BOTTOM_CATEGORY_A: case TacticalLines.BOTTOM_CATEGORY_B: case TacticalLines.BOTTOM_CATEGORY_C: case TacticalLines.BOTTOM_TYPE_A1: case TacticalLines.BOTTOM_TYPE_A2: case TacticalLines.BOTTOM_TYPE_A3: case TacticalLines.BOTTOM_TYPE_B1: case TacticalLines.BOTTOM_TYPE_B2: case TacticalLines.BOTTOM_TYPE_B3: case TacticalLines.BOTTOM_TYPE_C1: case TacticalLines.BOTTOM_TYPE_C2: case TacticalLines.BOTTOM_TYPE_C3: arraysupport.GetLineArray2(tg.get_LineType(), tg.Pixels, shapes,null,rev,null); break; case TacticalLines.ISOBAR: case TacticalLines.ISOBAR_GE: case TacticalLines.UPPER_AIR: case TacticalLines.UPPER_AIR_GE: case TacticalLines.ISOTHERM: case TacticalLines.ISOTHERM_GE: case TacticalLines.ISOTACH: case TacticalLines.ISOTACH_GE: case TacticalLines.ISODROSOTHERM: case TacticalLines.ISODROSOTHERM_GE: case TacticalLines.ISOPLETHS: case TacticalLines.ISOPLETHS_GE: case TacticalLines.ICE_EDGE: case TacticalLines.ICE_EDGE_GE: case TacticalLines.ESTIMATED_ICE_EDGE: case TacticalLines.ESTIMATED_ICE_EDGE_GE: case TacticalLines.CRACKS: case TacticalLines.CRACKS_GE: case TacticalLines.DEPTH_CURVE: case TacticalLines.DEPTH_CURVE_GE: case TacticalLines.DEPTH_CONTOUR: case TacticalLines.DEPTH_CONTOUR_GE: case TacticalLines.COASTLINE: case TacticalLines.COASTLINE_GE: case TacticalLines.PIER: case TacticalLines.PIER_GE: case TacticalLines.RAMP_ABOVE_WATER: case TacticalLines.RAMP_ABOVE_WATER_GE: case TacticalLines.RAMP_BELOW_WATER: case TacticalLines.RAMP_BELOW_WATER_GE: case TacticalLines.JETTY_ABOVE_WATER: case TacticalLines.JETTY_ABOVE_WATER_GE: case TacticalLines.JETTY_BELOW_WATER: case TacticalLines.JETTY_BELOW_WATER_GE: case TacticalLines.SEAWALL: case TacticalLines.SEAWALL_GE: case TacticalLines.EBB_TIDE: case TacticalLines.FLOOD_TIDE: case TacticalLines.EBB_TIDE_GE: case TacticalLines.FLOOD_TIDE_GE: case TacticalLines.CABLE: case TacticalLines.CABLE_GE: case TacticalLines.JET: case TacticalLines.STREAM: case TacticalLines.JET_GE: case TacticalLines.STREAM_GE: lineObject2 = DrawSplines(tg, splinePoints); lineObject2.lineTo(ptLast.x, ptLast.y); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); break; case TacticalLines.HOLD_GE: case TacticalLines.BRDGHD_GE: if(tg.get_FillColor()!=null && tg.get_FillColor().getAlpha()>1) { lineObject2 = DrawSplines(tg, splinePoints); lineObject2.lineTo(ptLast.x, ptLast.y); shape = new Shape2(Shape2.SHAPE_TYPE_FILL); shape.setShape(lineObject2); shapes.add(shape); splinePoints.clear(); } lineObject2 = DrawSplines(tg, splinePoints); lineObject2.lineTo(ptLast.x, ptLast.y); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); SetShapeProperties(tg,shapes,null); return; case TacticalLines.HOLD: case TacticalLines.BRDGHD: lineObject2 = DrawSplines(tg, splinePoints); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); //diagnostic add section 1-3-11 //this section is to add a fill shape using the spline points //Use tg.Pixels if splinepoints is empty //fill did not conform very well to the outline shape=new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setFillColor(tg.get_FillColor()); if(tg.get_FillColor() != null && tg.get_FillColor().getAlpha()>1) { if(splinePoints != null && splinePoints.size()>0) { shape.moveTo(splinePoints.get(0)); t=splinePoints.size(); //for(j=1;j<splinePoints.size();j++) for(j=1;j<t;j++) shape.lineTo(splinePoints.get(j)); shape.lineTo(tg.Pixels.get(tg.Pixels.size()-1)); shapes.add(0,shape); } else { shape.moveTo(tg.Pixels.get(0)); u=tg.Pixels.size(); //for(j=1;j<tg.Pixels.size();j++) for(j=1;j<u;j++) shape.lineTo(tg.Pixels.get(j)); shape.lineTo(tg.Pixels.get(tg.Pixels.size()-1)); shapes.add(0,shape); } } //end section break; case TacticalLines.CRACKS_SPECIFIC_LOCATION: case TacticalLines.CRACKS_SPECIFIC_LOCATION_GE: case TacticalLines.ICE_EDGE_RADAR: case TacticalLines.ICE_EDGE_RADAR_GE: lineObject2 = DrawSplines(tg, splinePoints); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); break; case TacticalLines.ICE_OPENINGS_LEAD: originalPixels=tg.Pixels; partitions=clsChannelUtility.GetPartitions2(tg); v=partitions.size(); //for(l=0;l<partitions.size();l++) for(l=0;l<v;l++) { tg.Pixels=originalPixels; pixels=new ArrayList(); for(k=partitions.get(l).start;k<=partitions.get(l).end_Renamed+1;k++) pixels.add(tg.Pixels.get(k)); if(pixels==null || pixels.isEmpty()) continue; twoSplines = new ArrayList(); twoSplines = ParallelLines2(pixels,rev); upperSpline = new ArrayList(); lowerSpline = new ArrayList(); w=twoSplines.size(); //for (j = 0; j < twoSplines.size() / 2; j++) for (j = 0; j < w / 2; j++) { upperSpline.add(twoSplines.get(j)); } //for (j = twoSplines.size() / 2; j < twoSplines.size(); j++) for (j = w / 2; j < w; j++) { lowerSpline.add(twoSplines.get(j)); } tg.Pixels = lowerSpline; lineObject2 = DrawSplines(tg, splinePoints); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); tg.Pixels = upperSpline; lineObject2 = DrawSplines(tg, splinePoints); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); } break; case TacticalLines.ICE_OPENINGS_LEAD_GE: originalPixels=tg.Pixels; partitions=clsChannelUtility.GetPartitions2(tg); t=partitions.size(); //for(l=0;l<partitions.size();l++) for(l=0;l<t;l++) { tg.Pixels=originalPixels; pixels=new ArrayList(); for(k=partitions.get(l).start;k<=partitions.get(l).end_Renamed+1;k++) pixels.add(tg.Pixels.get(k)); if(pixels==null || pixels.isEmpty()) continue; twoSplines = new ArrayList(); twoSplines = ParallelLines2(pixels,rev); upperSpline = new ArrayList(); lowerSpline = new ArrayList(); u=twoSplines.size(); //for (j = 0; j < twoSplines.size() / 2; j++) for (j = 0; j < u / 2; j++) { upperSpline.add(twoSplines.get(j)); } //for (j = twoSplines.size() / 2; j < twoSplines.size(); j++) for (j = u / 2; j < u; j++) { lowerSpline.add(twoSplines.get(j)); } tg.Pixels = lowerSpline; lineObject2 = DrawSplines(tg, splinePoints); ptLast=tg.Pixels.get(tg.Pixels.size()-1); lineObject2.lineTo(ptLast.x, ptLast.y); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); tg.Pixels = upperSpline; splinePoints=new ArrayList(); lineObject2 = DrawSplines(tg, splinePoints); ptLast=tg.Pixels.get(tg.Pixels.size()-1); lineObject2.lineTo(ptLast.x, ptLast.y); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); } break; case TacticalLines.ICE_OPENINGS_FROZEN: originalPixels=tg.Pixels; partitions=clsChannelUtility.GetPartitions2(tg); t=partitions.size(); //for(l=0;l<partitions.size();l++) for(l=0;l<t;l++) { tg.Pixels=originalPixels; pixels=new ArrayList(); for(k=partitions.get(l).start;k<=partitions.get(l).end_Renamed+1;k++) pixels.add(tg.Pixels.get(k)); if(pixels==null || pixels.isEmpty()) continue; twoSplines = new ArrayList(); //twoSplines = ParallelLines(tg); twoSplines = ParallelLines2(pixels,rev); upperSpline = new ArrayList(); lowerSpline = new ArrayList(); u=twoSplines.size(); //for (j = 0; j < twoSplines.size() / 2; j++) for (j = 0; j < u / 2; j++) { upperSpline.add(twoSplines.get(j)); } //for (j = twoSplines.size() / 2; j < twoSplines.size(); j++) for (j = u / 2; j < u; j++) { lowerSpline.add(twoSplines.get(j)); } tg.Pixels = lowerSpline; lineObject2 = DrawSplines(tg, splinePoints); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); tg.Pixels = upperSpline; lineObject2 = DrawSplines(tg, splinePoints2); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); //parse upper and lower arrys to find the corresponding splines ArrayList splinePointsArrays = new ArrayList(); ArrayList splinePoints2Arrays = new ArrayList(); ArrayList<POINT2> ptsArray = new ArrayList(); v=splinePoints.size(); //for (j = 0; j < splinePoints.size(); j++) for (j = 0; j < v; j++) { if (splinePoints.get(j).style != 47) { ptsArray.add(splinePoints.get(j)); } else { splinePointsArrays.add(ptsArray); ptsArray = new ArrayList(); } } w=splinePoints2.size(); //for (j = 0; j < splinePoints2.size(); j++) for (j = 0; j < w; j++) { if (splinePoints2.get(j).style != 47) { ptsArray.add(splinePoints2.get(j)); } else { splinePoints2Arrays.add(ptsArray); ptsArray = new ArrayList(); } } ArrayList<POINT2> array = null; ArrayList<POINT2> array2 = null; POINT2 pt, pt2; lineObject = new GeneralPath(); //the lines to connect the extrapolated points w=splinePointsArrays.size(); //for (j = 0; j < splinePointsArrays.size(); j++) for (j = 0; j < w; j++) { array = (ArrayList<POINT2>) splinePointsArrays.get(j); if(splinePoints2Arrays.size()>j) array2 = (ArrayList<POINT2>) splinePoints2Arrays.get(j); else break; //extrapolate against points in the shortest array if (splinePointsArrays.size() >= splinePoints2Arrays.size()) //array is shorter { tt=array.size(); //for (k = 0; k < array.size(); k++) for (k = 0; k < tt; k++) { if(array.size()>k) pt = array.get(k); else break; pt2 = ExtrapolatePointFromCurve(array2, pt); //if we got a valid extrapolation point then draw the line if (pt2 != null) { lineObject.moveTo(pt.x, pt.y); lineObject.lineTo(pt2.x, pt2.y); } } } else //array2 is shorter { uu=array2.size(); //for (k = 0; k < array2.size(); k++) for (k = 0; k < uu; k++) { pt = array2.get(k); pt2 = ExtrapolatePointFromCurve(array, pt); //if we got a valid extrapolation point then draw the line if (pt2 != null) { lineObject.moveTo(pt.x, pt.y); lineObject.lineTo(pt2.x, pt2.y); } } } } shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject); shapes.add(shape); } //the lines connecting the extrapolated points break; case TacticalLines.ICE_OPENINGS_FROZEN_GE: originalPixels=tg.Pixels; partitions=clsChannelUtility.GetPartitions2(tg); t=partitions.size(); //for(l=0;l<partitions.size();l++) for(l=0;l<t;l++) { tg.Pixels=originalPixels; pixels=new ArrayList(); for(k=partitions.get(l).start;k<=partitions.get(l).end_Renamed+1;k++) pixels.add(tg.Pixels.get(k)); if(pixels==null || pixels.isEmpty()) continue; twoSplines = new ArrayList(); twoSplines = ParallelLines2(pixels,rev); upperSpline = new ArrayList(); lowerSpline = new ArrayList(); u=twoSplines.size(); //for (j = 0; j < twoSplines.size() / 2; j++) for (j = 0; j < u / 2; j++) { upperSpline.add(twoSplines.get(j)); } //for (j = twoSplines.size() / 2; j < twoSplines.size(); j++) for (j = u / 2; j < u; j++) { lowerSpline.add(twoSplines.get(j)); } tg.Pixels = lowerSpline; ArrayList<POINT2>splinePoints3=new ArrayList(); lineObject2 = DrawSplines(tg, splinePoints3); splinePoints.addAll(splinePoints3); ptLast=tg.Pixels.get(tg.Pixels.size()-1); lineObject2.lineTo(ptLast.x, ptLast.y); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); tg.Pixels = upperSpline; ArrayList<POINT2>splinePoints4=new ArrayList(); lineObject2 = DrawSplines(tg, splinePoints4); splinePoints2.addAll(splinePoints4); ptLast=tg.Pixels.get(tg.Pixels.size()-1); lineObject2.lineTo(ptLast.x, ptLast.y); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); //parse upper and lower arrys to find the corresponding splines ArrayList splinePointsArrays = new ArrayList(); ArrayList splinePoints2Arrays = new ArrayList(); ArrayList<POINT2> ptsArray = new ArrayList(); v=splinePoints.size(); //for (j = 0; j < splinePoints.size(); j++) for (j = 0; j < v; j++) { if (splinePoints.get(j).style != 47) { ptsArray.add(splinePoints.get(j)); } else { splinePointsArrays.add(ptsArray); ptsArray = new ArrayList(); } } w=splinePoints2.size(); //for (j = 0; j < splinePoints2.size(); j++) for (j = 0; j < w; j++) { if (splinePoints2.get(j).style != 47) { ptsArray.add(splinePoints2.get(j)); } else { splinePoints2Arrays.add(ptsArray); ptsArray = new ArrayList(); } } //int k = 0; ArrayList<POINT2> array = null; ArrayList<POINT2> array2 = null; POINT2 pt, pt2; lineObject = new GeneralPath(); //the lines to connect the extrapolated points tt=splinePointsArrays.size(); //for (j = 0; j < splinePointsArrays.size(); j++) for (j = 0; j < tt; j++) { array = (ArrayList<POINT2>) splinePointsArrays.get(j); if(splinePoints2Arrays.size()>j) array2 = (ArrayList<POINT2>) splinePoints2Arrays.get(j); else break; //extrapolate against points in the shortest array if (splinePointsArrays.size() >= splinePoints2Arrays.size()) //array is shorter { uu=array.size(); //for (k = 0; k < array.size(); k++) for (k = 0; k < uu; k++) { if(array.size()>k) pt = array.get(k); else break; pt2 = ExtrapolatePointFromCurve(array2, pt); //if we got a valid extrapolation point then draw the line if (pt2 != null) { lineObject.moveTo(pt.x, pt.y); lineObject.lineTo(pt2.x, pt2.y); } } } else //array2 is shorter { vv=array2.size(); //for (k = 0; k < array2.size(); k++) for (k = 0; k < vv; k++) { pt = array2.get(k); pt2 = ExtrapolatePointFromCurve(array, pt); //if we got a valid extrapolation point then draw the line if (pt2 != null) { //sprite2.graphics.moveTo(pt.x,pt.y); //sprite2.graphics.lineTo(pt2.x,pt2.y); lineObject.moveTo(pt.x, pt.y); lineObject.lineTo(pt2.x, pt2.y); } } } } shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject); shapes.add(shape); } //the lines connecting the extrapolated points break; case TacticalLines.LEADING_LINE: //the solid line lineObject = DrawSplines(tg, splinePoints); lineObject2 = new GeneralPath(); if(splinePoints.size()>0) lineObject2.moveTo(splinePoints.get(0).x, splinePoints.get(0).y); else { lineObject2.moveTo(tg.Pixels.get(0).x,tg.Pixels.get(0).y); t=tg.Pixels.size(); //for(j=0;j<tg.Pixels.size();j++) for(j=0;j<t;j++) lineObject2.lineTo(tg.Pixels.get(j).x,tg.Pixels.get(j).y); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shape.set_Style(1); shapes.add(shape); return; } int n = splinePoints.size() / 2; for (j = 1; j <= n; j++) { if(splinePoints.size()>=j-1) lineObject2.lineTo(splinePoints.get(j).x, splinePoints.get(j).y); } shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shapes.add(shape); //the dashed line lineObject2 = new GeneralPath(); lineObject2.moveTo(splinePoints.get(n).x, splinePoints.get(n).y); u=splinePoints.size(); //for (j = n + 1; j < splinePoints.size(); j++) for (j = n + 1; j < u; j++) { if(splinePoints.size()>=j-1) lineObject2.lineTo(splinePoints.get(j).x, splinePoints.get(j).y); } shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shape.set_Style(1); shapes.add(shape); break; default: break; } //add the last point if (tg.get_LineType() != TacticalLines.ICE_OPENINGS_LEAD && tg.get_LineType() != TacticalLines.ICE_OPENINGS_LEAD_GE && tg.get_LineType() != TacticalLines.ICE_OPENINGS_FROZEN && tg.get_LineType() != TacticalLines.ICE_OPENINGS_FROZEN_GE && tg.get_LineType() != TacticalLines.ICE_EDGE_RADAR) { if (splinePoints != null && splinePoints.size() > 0) { lineObject2 = new GeneralPath(); lineObject2.moveTo(splinePoints.get(splinePoints.size() - 1).x, splinePoints.get(splinePoints.size() - 1).y); lineObject2.lineTo(ptLast.x, ptLast.y); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setShape(lineObject2); shape.set_Style(0); shapes.add(shape); } } SetShapeProperties(tg, shapes, null); } catch (Exception exc) { ErrorLogger.LogException(_className ,"GetMeTOCShape", new RendererException("Failed inside GetMeTOCShape", exc)); } } /** * Returns the image file name based on the linetype for the METOC symbols with pattern ill * @param tg * @return */ private static String GetImageFile(TGLight tg) { String fileName = ""; try { switch (tg.get_LineType()) { case TacticalLines.WEIRS: fileName = "visualAssets/Weirs.png"; break; case TacticalLines.SWEPT_AREA: fileName = "visualAssets/SweptArea.png"; break; case TacticalLines.OIL_RIG_FIELD: fileName = "visualAssets/OilRigField.png"; break; case TacticalLines.FOUL_GROUND: fileName = "visualAssets/FoulGround.png"; break; case TacticalLines.KELP: fileName = "visualAssets/Kelp.png"; break; case TacticalLines.BEACH_SLOPE_STEEP: fileName = "visualAssets/BeachSlopeSteep.png"; break; case TacticalLines.BEACH: fileName = "visualAssets/BeigeStipple.png"; break; case TacticalLines.BEACH_SLOPE_MODERATE: fileName = "visualAssets/BeachSlopeModerate.png"; break; default: break; } } catch(Exception exc) { ErrorLogger.LogException(_className ,"GetImageFile", new RendererException("Failed inside GetImageFile", exc)); } return fileName; } /** * Sets the shape properties based on the tacttical graphic properties and also based on shape * styles which may have been set by JavaLineArray * @param tg * @param shapes shapes array to set properties * @param bi BufferedImage used for hatch fills */ protected static void SetShapeProperties(TGLight tg, ArrayList<Shape2> shapes, BufferedImage bi) { try { if (shapes == null) { return; } switch(tg.get_LineType()) { case TacticalLines.DEPTH_AREA: return; default: break; } int j = 0, n=0; Shape2 shape = null; BasicStroke stroke = null; InputStream inFile = null; BufferedImage bi2 = null; float[] dash = null; int lineThickness = tg.get_LineThickness(); Rectangle2D.Double rect = null; Graphics2D grid = null; TexturePaint tp = tg.get_TexturePaint(); String fileName = GetImageFile(tg); switch (tg.get_LineType()) { case TacticalLines.WEIRS: case TacticalLines.SWEPT_AREA: case TacticalLines.OIL_RIG_FIELD: case TacticalLines.FOUL_GROUND: case TacticalLines.KELP: case TacticalLines.BEACH_SLOPE_MODERATE: case TacticalLines.BEACH_SLOPE_STEEP: case TacticalLines.BEACH: //Android does not actually use this, i.e. infile will be null //the code was retained as part of the port from Java. //the fills will be created at the end of render_ge //if(tg.get_UsePatternFill()) // break; shape = shapes.get(0); shape.setLineColor(tg.get_LineColor()); inFile = clsMETOC.class.getClassLoader().getResourceAsStream(fileName); if(inFile!=null) { bi2 = ImageIO.read(inFile); rect = new Rectangle2D.Double(0, 0, bi2.getWidth(), bi2.getHeight()); tp = new TexturePaint(bi2, rect); shape.setTexturePaint(tp); inFile.close(); } break; case TacticalLines.SF: case TacticalLines.USF: case TacticalLines.SFG: case TacticalLines.SFY: n=shapes.size(); //for (j = 0; j < shapes.size(); j++) for (j = 0; j < n; j++) { shape = shapes.get(j); if (shape == null || shape.getShape() == null) { continue; } shape.set_Style(tg.get_LineStyle()); stroke = new BasicStroke(lineThickness, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 1, dash, 0); shape.setStroke(stroke); } return; default: break; } int shapeType = -1; int lineType = tg.get_LineType(); boolean isChange1Area = clsUtility.IsChange1Area(lineType, null); boolean isClosedPolygon = clsUtility.isClosedPolygon(lineType); n=shapes.size(); //for (j = 0; j < shapes.size(); j++) for (j = 0; j < n; j++) { shape = shapes.get(j); if (shape == null || shape.getShape() == null) { continue; } if (shape.getShapeType() == Shape2.SHAPE_TYPE_FILL) { shape.setFillColor(tg.get_FillColor()); } //clsUtility.ResolveModifierShape(tg,shape); shapeType = shape.getShapeType(); switch (tg.get_LineType()) { case TacticalLines.SF: case TacticalLines.USF: case TacticalLines.SFG: case TacticalLines.SFY: case TacticalLines.ITD: break; case TacticalLines.LEADING_LINE: case TacticalLines.TRAINING_AREA: shape.setLineColor(tg.get_LineColor()); break; case TacticalLines.BRDGHD_GE: case TacticalLines.HOLD_GE: if(shape.getShapeType()==ShapeInfo.SHAPE_TYPE_FILL) shape.setLineColor(null); else { shape.setLineColor(tg.get_LineColor()); shape.set_Style(tg.get_LineStyle()); } break; default: shape.setLineColor(tg.get_LineColor()); shape.set_Style(tg.get_LineStyle()); break; } if (isClosedPolygon || shapeType == Shape2.SHAPE_TYPE_FILL) { switch(tg.get_LineType())//these have fill instead of TexturePaint { case TacticalLines.FORESHORE_AREA: case TacticalLines.WATER: case TacticalLines.ISLAND: case TacticalLines.DRYDOCK: case TacticalLines.LOADING_FACILITY_AREA: case TacticalLines.PERCHES: case TacticalLines.UNDERWATER_HAZARD: case TacticalLines.DISCOLORED_WATER: case TacticalLines.VDR_LEVEL_12: case TacticalLines.VDR_LEVEL_23: case TacticalLines.VDR_LEVEL_34: case TacticalLines.VDR_LEVEL_45: case TacticalLines.VDR_LEVEL_56: case TacticalLines.VDR_LEVEL_67: case TacticalLines.VDR_LEVEL_78: case TacticalLines.VDR_LEVEL_89: case TacticalLines.VDR_LEVEL_910: case TacticalLines.SOLID_ROCK: case TacticalLines.CLAY: case TacticalLines.FINE_SAND: case TacticalLines.MEDIUM_SAND: case TacticalLines.COARSE_SAND: case TacticalLines.VERY_COARSE_SAND: case TacticalLines.VERY_FINE_SAND: case TacticalLines.VERY_FINE_SILT: case TacticalLines.FINE_SILT: case TacticalLines.MEDIUM_SILT: case TacticalLines.COARSE_SILT: case TacticalLines.BOULDERS: case TacticalLines.OYSTER_SHELLS: case TacticalLines.PEBBLES: case TacticalLines.SAND_AND_SHELLS: case TacticalLines.BOTTOM_SEDIMENTS_LAND: case TacticalLines.BOTTOM_SEDIMENTS_NO_DATA: case TacticalLines.BOTTOM_ROUGHNESS_MODERATE: case TacticalLines.BOTTOM_ROUGHNESS_ROUGH: case TacticalLines.BOTTOM_ROUGHNESS_SMOOTH: case TacticalLines.CLUTTER_HIGH: case TacticalLines.CLUTTER_MEDIUM: case TacticalLines.CLUTTER_LOW: case TacticalLines.IMPACT_BURIAL_0: case TacticalLines.IMPACT_BURIAL_10: case TacticalLines.IMPACT_BURIAL_100: case TacticalLines.IMPACT_BURIAL_20: case TacticalLines.IMPACT_BURIAL_75: case TacticalLines.BOTTOM_CATEGORY_A: case TacticalLines.BOTTOM_CATEGORY_B: case TacticalLines.BOTTOM_CATEGORY_C: case TacticalLines.BOTTOM_TYPE_A1: case TacticalLines.BOTTOM_TYPE_A2: case TacticalLines.BOTTOM_TYPE_A3: case TacticalLines.BOTTOM_TYPE_B1: case TacticalLines.BOTTOM_TYPE_B2: case TacticalLines.BOTTOM_TYPE_B3: case TacticalLines.BOTTOM_TYPE_C1: case TacticalLines.BOTTOM_TYPE_C2: case TacticalLines.BOTTOM_TYPE_C3: case TacticalLines.SUBMERGED_CRIB: case TacticalLines.FREEFORM: shape.setFillColor(tg.get_FillColor()); break; default: break; } switch (shape.get_FillStyle()) { case 3://GraphicProperties.FILL_TYPE_RIGHT_SLANTS: rect = new Rectangle2D.Double(0, 0, 8, 8); grid = bi.createGraphics(); grid.setColor(shape.getFillColor()); grid.drawLine(0, 8, 8, 0); tp = new TexturePaint(bi, rect); shape.setTexturePaint(tp); shape.setFillColor(null); grid.dispose(); break; case 2://GraphicProperties.FILL_TYPE_LEFT_SLANTS: rect = new Rectangle2D.Double(0, 0, 8, 8); grid = bi.createGraphics(); grid.setColor(tg.get_FillColor()); grid.drawLine(0, 0, 8, 8); tp = new TexturePaint(bi, rect); shape.setTexturePaint(tp); shape.setFillColor(null); grid.dispose(); //clsUtility.WriteFile("set TexturePaint"); break; case 6://GraphicProperties.FILL_TYPE_DOTS: rect = new Rectangle2D.Double(3, 3, 8, 8); grid = bi.createGraphics(); grid.setColor(tg.get_FillColor()); grid.drawLine(3, 3, 5, 3); grid.drawLine(5, 3, 5, 5); grid.drawLine(5, 5, 3, 5); grid.drawLine(3, 5, 5, 3); tp = new TexturePaint(bi, rect); shape.setTexturePaint(tp); shape.setFillColor(null); grid.dispose(); break; case 4://GraphicProperties.FILL_TYPE_VERTICAL_LINES: rect = new Rectangle2D.Double(0, 0, 8, 8); grid = bi.createGraphics(); grid.setColor(tg.get_FillColor()); grid.drawLine(4, 0, 4, 8); tp = new TexturePaint(bi, rect); shape.setTexturePaint(tp); shape.setFillColor(null); grid.dispose(); break; case 5://GraphicProperties.FILL_TYPE_HORIZONTAL_LINES: rect = new Rectangle2D.Double(0, 0, 8, 8); grid = bi.createGraphics(); grid.setColor(tg.get_FillColor()); grid.drawLine(0, 4, 8, 4); tp = new TexturePaint(bi, rect); shape.setTexturePaint(tp); shape.setFillColor(null); grid.dispose(); break; case 1://GraphicProperties.FILL_TYPE_SOLID: //shape.set_FillColor(tg.get_FillColor()); break; default: break; } } switch (shape.get_Style()) { case 0://GraphicProperties.LINE_TYPE_SOLID: //dash=new float[1]; //dash[0]=1; dash = null; break; case 1://GraphicProperties.LINE_TYPE_DASHED: dash = new float[2]; dash[0] = 5f; dash[1] = 5f; //clsUtility.WriteFile("dashed"); break; case 2://GraphicProperties.LINE_TYPE_DOTTED: dash = new float[2]; dash[0] = 3f; dash[1] = 3f; break; case 3://GraphicProperties.LINE_TYPE_DASHDOT: dash = new float[4]; dash[0] = 8;//dash dash[1] = 4;//space dash[2] = 4;//dot dash[3] = 4;//space break; case 4://GraphicProperties.LINE_TYPE_DASHDOTDOT: dash = new float[6]; dash[0] = 8;//dash dash[1] = 4;//space dash[2] = 4;//dot dash[3] = 4;//space dash[4] = 4;//dot dash[5] = 4;//space break; default: break; } //set the shape with the default properties //the switch statement below will override specific properties as needed stroke = new BasicStroke(lineThickness, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 1, dash, 0); shape.setStroke(stroke); } } catch (Exception exc) { //clsUtility.WriteFile("error in clsMETOC.SetShapeProperties"); ErrorLogger.LogException(_className ,"SetShapeProperties", new RendererException("Failed inside SetShapeProperties", exc)); } } /** * Draws an arrow to the GeneralPath object from pt1 to pt2. * * @param pt1 arrow tip * @param pt2 - arrow base * @param size - arrow size in pixels * @param lineObject - general path to draw the arrow * * @return arrow sprite */ private static void DrawArrow(POINT2 pt1, POINT2 pt2, int size, GeneralPath lineObject) { try { POINT2 ptBase = new POINT2(); POINT2 ptTemp = new POINT2(); ArrayList<POINT2> pts = new ArrayList(); ptBase = lineutility.ExtendAlongLineDouble(pt2, pt1, size); ptTemp = lineutility.ExtendDirectedLine(pt1, ptBase, ptBase, 2, size); pts.add(ptTemp); pts.add(pt2); ptTemp = lineutility.ExtendDirectedLine(pt1, ptBase, ptBase, 3, size); pts.add(ptTemp); lineObject.moveTo(pts.get(0).x, pts.get(0).y); lineObject.lineTo(pts.get(1).x, pts.get(1).y); lineObject.lineTo(pts.get(2).x, pts.get(2).y); pts.clear(); pts = null; } catch (Exception exc) { ErrorLogger.LogException(_className ,"DrawArrow", new RendererException("Failed inside DrawArrow", exc)); } } /** * Returns a GeneralPath for symbols which require splines. Also returns the calculated * spline points for those symbols with additional features based on them. * @param tg * @param splinePoints2 spline points in pixels * @return */ private static GeneralPath DrawSplines(TGLight tg, ArrayList<POINT2> splinePoints2) { GeneralPath lineObject = new GeneralPath(); try { int i = 0, j = 0; int n=0,t=0; ArrayList<POINT2> splinePoints; ArrayList<POINT2> array = tg.get_Pixels(); POINT2 pt0 = new POINT2(), pt1 = new POINT2(), pt2 = new POINT2(), pt3 = new POINT2(), pt4 = new POINT2(), pt5 = new POINT2(), pt6 = new POINT2(); POINT2 pt, pt_before, pt_after, Di, p2, p3, pt_after2; double tension = 0.33; double control_scale = (tension / 0.5 * 0.175); ArrayList<POINT2> tmpArray = null; n=array.size(); //for (i = 0; i < array.size() - 1; i++) //was length-1 for (i = 0; i < n - 1; i++) //was length-1 { pt = array.get(i); if (i == 0) { lineObject.moveTo(pt.x, pt.y); pt_before = pt; } else { pt_before = array.get(i - 1); } if (i == array.size() - 1) { pt2 = array.get(i); } else { pt2 = array.get(i + 1); } if (i < array.size() - 2) { pt_after = array.get(i + 1); } else { pt_after = array.get(array.size() - 1); } if (i < array.size() - 2) { pt_after2 = array.get(i + 2); } else { pt_after2 = array.get(array.size() - 1); } Di = new POINT2(); p2 = new POINT2(); Di.x = pt_after.x - pt_before.x; Di.y = pt_after.y - pt_before.y; p2.x = pt.x + control_scale * Di.x; p2.y = pt.y + control_scale * Di.y; p3 = new POINT2(); POINT2 DiPlus1 = new POINT2(); DiPlus1.x = pt_after2.x - pt.x; DiPlus1.y = pt_after2.y - pt.y; p3.x = pt_after.x - control_scale * DiPlus1.x; p3.y = pt_after.y - control_scale * DiPlus1.y; tmpArray = drawCubicBezier2(tg, lineObject, pt, p2, p3, pt2); //ICE_OPENINGS_FROZEN needs to know which segment corresponds to each spline point if (tg.get_LineType() == TacticalLines.ICE_OPENINGS_FROZEN || tg.get_LineType() == TacticalLines.ICE_OPENINGS_FROZEN_GE) { if(tmpArray.size()>0) tmpArray.get(tmpArray.size() - 1).style = 47; //use this to differentiate the arrays } splinePoints2.addAll(tmpArray); splinePoints = tmpArray; switch (tg.get_LineType()) { case TacticalLines.EBB_TIDE: if (i == array.size() - 2) { if(splinePoints.size()>=2) DrawArrow(splinePoints.get(splinePoints.size() - 2), tg.Pixels.get(tg.Pixels.size() - 1), 10, lineObject); } break; case TacticalLines.FLOOD_TIDE: if (i == 0 && splinePoints.size() > 1) { //finally get the feather points //must allocate for the feather points, requires 4 additional points pt0 = splinePoints.get(0); pt1 = splinePoints.get(1); pt2 = lineutility.ExtendLineDouble(pt0, pt1, 10); pt3 = lineutility.ExtendLineDouble(pt0, pt1, 20); pt4 = lineutility.ExtendLineDouble(pt0, pt1, 30); pt5 = lineutility.ExtendDirectedLine(pt3, pt2, pt2, 3, 10); pt6 = lineutility.ExtendDirectedLine(pt4, pt3, pt3, 3, 10); //first feather line lineObject.moveTo(pt3.x, pt3.y); lineObject.lineTo(pt5.x, pt5.y); //second feather line lineObject.moveTo(pt4.x, pt4.y); lineObject.lineTo(pt6.x, pt6.y); } if (i == array.size() - 2) { if(splinePoints.size()>=2) DrawArrow(splinePoints.get(splinePoints.size() - 2), tg.Pixels.get(tg.Pixels.size() - 1), 10, lineObject); } break; case TacticalLines.STREAM: case TacticalLines.JET: //if (i == 0) if (i == 0 && splinePoints.size()>1) { DrawArrow(splinePoints.get(1), splinePoints.get(0), 10, lineObject); } break; case TacticalLines.FLOOD_TIDE_GE: if (i == 0 && splinePoints.size() > 1) { //finally get the feather points //must allocate for the feather points, requires 4 additional points pt0 = splinePoints.get(0); pt1 = splinePoints.get(1); pt2 = lineutility.ExtendLineDouble(pt0, pt1, 10); pt3 = lineutility.ExtendLineDouble(pt0, pt1, 20); pt4 = lineutility.ExtendLineDouble(pt0, pt1, 30); pt5 = lineutility.ExtendDirectedLine(pt3, pt2, pt2, 3, 10); pt6 = lineutility.ExtendDirectedLine(pt4, pt3, pt3, 3, 10); //first feather line lineObject.moveTo(pt3.x, pt3.y); lineObject.lineTo(pt5.x, pt5.y); //second feather line lineObject.moveTo(pt4.x, pt4.y); lineObject.lineTo(pt6.x, pt6.y); } if(i==array.size()-2)//the last point in the array { lineObject.moveTo((int)splinePoints2.get(0).x,(int)splinePoints2.get(0).y); t=splinePoints2.size(); //for(j=1;j<splinePoints2.size();j++) for(j=1;j<t;j++) lineObject.lineTo((int)splinePoints2.get(j).x,(int)splinePoints2.get(j).y); if(splinePoints.size()>=2) DrawArrow(splinePoints.get(splinePoints.size() - 2), tg.Pixels.get(tg.Pixels.size() - 1), 10, lineObject); } break; case TacticalLines.EBB_TIDE_GE: if(i==array.size()-2)//the last point in the array { lineObject=new GeneralPath(); lineObject.moveTo((int)splinePoints2.get(0).x,(int)splinePoints2.get(0).y); t=splinePoints2.size(); //for(j=1;j<splinePoints2.size();j++) for(j=1;j<t;j++) lineObject.lineTo((int)splinePoints2.get(j).x,(int)splinePoints2.get(j).y); if(splinePoints.size()>=2) DrawArrow(splinePoints.get(splinePoints.size() - 2), tg.Pixels.get(tg.Pixels.size() - 1), 10, lineObject); } break; case TacticalLines.JET_GE: case TacticalLines.STREAM_GE: if (i == 0 && splinePoints.size()>1) { DrawArrow(splinePoints.get(1), splinePoints.get(0), 10, lineObject); } if(i==array.size()-2)//the last point in the array { lineObject.moveTo((int)splinePoints2.get(0).x,(int)splinePoints2.get(0).y); t=splinePoints2.size(); //for(j=1;j<splinePoints2.size();j++) for(j=1;j<t;j++) lineObject.lineTo((int)splinePoints2.get(j).x,(int)splinePoints2.get(j).y); } break; case TacticalLines.ICE_OPENINGS_FROZEN_GE: case TacticalLines.ICE_OPENINGS_LEAD_GE: case TacticalLines.CABLE_GE: case TacticalLines.SEAWALL_GE: case TacticalLines.JETTY_BELOW_WATER_GE: case TacticalLines.JETTY_ABOVE_WATER_GE: case TacticalLines.RAMP_ABOVE_WATER_GE: case TacticalLines.RAMP_BELOW_WATER_GE: case TacticalLines.PIER_GE: case TacticalLines.COASTLINE_GE: case TacticalLines.DEPTH_CONTOUR_GE: case TacticalLines.DEPTH_CURVE_GE: case TacticalLines.CRACKS_GE: case TacticalLines.ESTIMATED_ICE_EDGE_GE: case TacticalLines.ICE_EDGE_GE: case TacticalLines.ISOPLETHS_GE: case TacticalLines.ISODROSOTHERM_GE: case TacticalLines.ISOTACH_GE: case TacticalLines.ISOTHERM_GE: case TacticalLines.UPPER_AIR_GE: case TacticalLines.ISOBAR_GE: case TacticalLines.HOLD_GE: case TacticalLines.BRDGHD_GE: if(splinePoints2!=null && !splinePoints2.isEmpty()) { lineObject=new GeneralPath(); if(i==array.size()-2)//the last point in the array { lineObject.moveTo((int)splinePoints2.get(0).x,(int)splinePoints2.get(0).y); t=splinePoints2.size(); //for(j=1;j<splinePoints2.size();j++) for(j=1;j<t;j++) lineObject.lineTo((int)splinePoints2.get(j).x,(int)splinePoints2.get(j).y); } } break; case TacticalLines.ICE_EDGE_RADAR: t=splinePoints.size(); //for (j = 0; j < splinePoints.size() - 1; j++) for (j = 0; j < t - 1; j++) { pt0 = new POINT2(splinePoints.get(j).x, splinePoints.get(j).y); pt2 = lineutility.ExtendAngledLine(splinePoints.get(j), splinePoints.get(j + 1), pt0, 45, 5); pt1 = new POINT2(splinePoints.get(j).x, splinePoints.get(j).y); pt3 = lineutility.ExtendAngledLine(splinePoints.get(j), splinePoints.get(j + 1), pt1, -45, 5); lineObject.moveTo(splinePoints.get(j).x, splinePoints.get(j).y); lineObject.lineTo(pt2.x, pt2.y); lineObject.moveTo(splinePoints.get(j).x, splinePoints.get(j).y); lineObject.lineTo(pt3.x, pt3.y); pt0 = new POINT2(splinePoints.get(j).x, splinePoints.get(j).y); pt2 = lineutility.ExtendAngledLine(splinePoints.get(j), splinePoints.get(j + 1), pt0, 135, 5); pt1 = new POINT2(splinePoints.get(j).x, splinePoints.get(j).y); pt3 = lineutility.ExtendAngledLine(splinePoints.get(j), splinePoints.get(j + 1), pt1, -135, 5); lineObject.moveTo(splinePoints.get(j).x, splinePoints.get(j).y); lineObject.lineTo(pt2.x, pt2.y); lineObject.moveTo(splinePoints.get(j).x, splinePoints.get(j).y); lineObject.lineTo(pt3.x, pt3.y); } break; case TacticalLines.ICE_EDGE_RADAR_GE: t=splinePoints.size(); //for (j = 0; j < splinePoints.size() - 1; j++) for (j = 0; j < t - 1; j++) { pt0 = new POINT2(splinePoints.get(j).x, splinePoints.get(j).y); pt2 = lineutility.ExtendAngledLine(splinePoints.get(j), splinePoints.get(j + 1), pt0, 45, 5); pt1 = new POINT2(splinePoints.get(j).x, splinePoints.get(j).y); pt3 = lineutility.ExtendAngledLine(splinePoints.get(j), splinePoints.get(j + 1), pt1, -45, 5); lineObject.moveTo(splinePoints.get(j).x, splinePoints.get(j).y); lineObject.lineTo(pt2.x, pt2.y); lineObject.moveTo(splinePoints.get(j).x, splinePoints.get(j).y); lineObject.lineTo(pt3.x, pt3.y); pt0 = new POINT2(splinePoints.get(j).x, splinePoints.get(j).y); pt2 = lineutility.ExtendAngledLine(splinePoints.get(j), splinePoints.get(j + 1), pt0, 135, 5); pt1 = new POINT2(splinePoints.get(j).x, splinePoints.get(j).y); pt3 = lineutility.ExtendAngledLine(splinePoints.get(j), splinePoints.get(j + 1), pt1, -135, 5); lineObject.moveTo(splinePoints.get(j).x, splinePoints.get(j).y); lineObject.lineTo(pt2.x, pt2.y); lineObject.moveTo(splinePoints.get(j).x, splinePoints.get(j).y); lineObject.lineTo(pt3.x, pt3.y); } if(i==array.size()-2)//the last point in the array { lineObject.moveTo((int)splinePoints2.get(0).x,(int)splinePoints2.get(0).y); t=splinePoints2.size(); //for(j=1;j<splinePoints2.size();j++) for(j=1;j<t;j++) lineObject.lineTo((int)splinePoints2.get(j).x,(int)splinePoints2.get(j).y); } break; case TacticalLines.CRACKS_SPECIFIC_LOCATION: t=splinePoints.size(); //for (j = 0; j < splinePoints.size() - 1; j++) for (j = 0; j < t - 1; j++) { //get perpendicular points (point pair) pt0 = splinePoints.get(j + 1); pt1 = lineutility.ExtendDirectedLine(splinePoints.get(j), splinePoints.get(j + 1), pt0, 2, 5); lineObject.moveTo(pt1.x, pt1.y); pt1 = lineutility.ExtendDirectedLine(splinePoints.get(j), splinePoints.get(j + 1), pt0, 3, 5); lineObject.lineTo(pt1.x, pt1.y); } break; case TacticalLines.CRACKS_SPECIFIC_LOCATION_GE: t=splinePoints.size(); //for (j = 0; j < splinePoints.size() - 1; j++) for (j = 0; j < t - 1; j++) { //get perpendicular points (point pair) pt0 = splinePoints.get(j + 1); pt1 = lineutility.ExtendDirectedLine(splinePoints.get(j), splinePoints.get(j + 1), pt0, 2, 5); lineObject.moveTo(pt1.x, pt1.y); pt1 = lineutility.ExtendDirectedLine(splinePoints.get(j), splinePoints.get(j + 1), pt0, 3, 5); lineObject.lineTo(pt1.x, pt1.y); } if(i==array.size()-2)//the last point in the array { lineObject.moveTo((int)splinePoints2.get(0).x,(int)splinePoints2.get(0).y); t=splinePoints2.size(); //for(j=1;j<splinePoints2.size();j++) for(j=1;j<t;j++) lineObject.lineTo((int)splinePoints2.get(j).x,(int)splinePoints2.get(j).y); } break; default: break; } } } catch (Exception exc) { ErrorLogger.LogException(_className ,"DrawSplines", new RendererException("Failed inside DrawSplines", exc)); } return lineObject; } /** * Calculates a point on a segment using a ratio of the segment length. * This function is used for calculating control points on Bezier curves. * * @param P0 the 1st point on the segment. * @param P1 the last point on the segment * @param ratio the fraction of the segment length * * @return calculated point on the P0-P1 segment. */ private static POINT2 getPointOnSegment(POINT2 P0, POINT2 P1, double ratio) { //return {x: (P0.x + ((P1.x - P0.x) * ratio)), y: (P0.y + ((P1.y - P0.y) * ratio))}; //var pt:Point=new Point(); POINT2 pt = new POINT2(); try { pt.x = P0.x + (P1.x - P0.x) * ratio; pt.y = P0.y + (P1.y - P0.y) * ratio; } catch (Exception exc) { ErrorLogger.LogException(_className ,"getPointOnSegment", new RendererException("Failed inside getPointOnSegment", exc)); } return pt; } /** * This function will trace a cubic approximation of the cubic Bezier * It will calculate a series of (control point/Destination point] which * will be used to draw quadratic Bezier starting from P0 * * @param lineObject - the sprite to use for drawing * @param P0 - 1st client point * @param P1 - 1st control point for a cubic Bezier * @param P2 - 2nd control point * @param P3 - 2nd client point * * @return an array of points along the spline at linetype specific intervals */ private static ArrayList drawCubicBezier2( TGLight tg, GeneralPath lineObject, POINT2 P0, POINT2 P1, POINT2 P2, POINT2 P3) { ArrayList<POINT2> array = new ArrayList(); try { // this stuff may be unnecessary // calculates the useful base points POINT2 PA = getPointOnSegment(P0, P1, 0.75); POINT2 PB = getPointOnSegment(P3, P2, 0.75); // get 1/16 of the [P3, P0] segment double dx = (P3.x - P0.x) / 16d; double dy = (P3.y - P0.y) / 16d; // calculates control point 1 POINT2 Pc_1 = getPointOnSegment(P0, P1, 0.375); // calculates control point 2 POINT2 Pc_2 = getPointOnSegment(PA, PB, 0.375); Pc_2.x -= dx; Pc_2.y -= dy; // calculates control point 3 POINT2 Pc_3 = getPointOnSegment(PB, PA, 0.375); Pc_3.x += dx; Pc_3.y += dy; // calculates control point 4 POINT2 Pc_4 = getPointOnSegment(P3, P2, 0.375); // calculates the 3 anchor points POINT2 Pa_1 = lineutility.MidPointDouble(Pc_1, Pc_2, 0); POINT2 Pa_2 = lineutility.MidPointDouble(PA, PB, 0); POINT2 Pa_3 = lineutility.MidPointDouble(Pc_3, Pc_4, 0); switch (tg.get_LineType()) { //draw the solid curve for these case TacticalLines.ISOBAR: case TacticalLines.UPPER_AIR: case TacticalLines.ISODROSOTHERM: case TacticalLines.ICE_EDGE: case TacticalLines.CRACKS: case TacticalLines.DEPTH_CURVE: case TacticalLines.DEPTH_CONTOUR: case TacticalLines.COASTLINE: case TacticalLines.PIER: case TacticalLines.RAMP_ABOVE_WATER: case TacticalLines.JETTY_ABOVE_WATER: case TacticalLines.SEAWALL: case TacticalLines.CABLE: case TacticalLines.ICE_OPENINGS_LEAD: case TacticalLines.ISOTACH: case TacticalLines.ISOTHERM: case TacticalLines.ISOPLETHS: case TacticalLines.ESTIMATED_ICE_EDGE: case TacticalLines.RAMP_BELOW_WATER: case TacticalLines.JETTY_BELOW_WATER: lineObject.moveTo(P0.x, P0.y); lineObject.curveTo(P1.x, P1.y, P2.x, P2.y, P3.x, P3.y); return array; case TacticalLines.HOLD://added 1-3-11 case TacticalLines.BRDGHD://added 1-3-11 lineObject.moveTo(P0.x, P0.y); lineObject.curveTo(P1.x, P1.y, P2.x, P2.y, P3.x, P3.y); //return if no fill, these points are for fill if(tg.get_FillColor()==null || tg.get_FillColor().getAlpha()<2) return array; break; case TacticalLines.ICE_OPENINGS_LEAD_GE: case TacticalLines.CABLE_GE: case TacticalLines.SEAWALL_GE: case TacticalLines.JETTY_BELOW_WATER_GE: case TacticalLines.JETTY_ABOVE_WATER_GE: case TacticalLines.RAMP_ABOVE_WATER_GE: case TacticalLines.RAMP_BELOW_WATER_GE: case TacticalLines.PIER_GE: case TacticalLines.COASTLINE_GE: case TacticalLines.DEPTH_CONTOUR_GE: case TacticalLines.DEPTH_CURVE_GE: case TacticalLines.CRACKS_GE: case TacticalLines.ESTIMATED_ICE_EDGE_GE: case TacticalLines.ICE_EDGE_GE: case TacticalLines.ISOPLETHS_GE: case TacticalLines.ISOTACH_GE: case TacticalLines.ISOTHERM_GE: case TacticalLines.ISOBAR_GE: case TacticalLines.UPPER_AIR_GE: case TacticalLines.ISODROSOTHERM_GE: case TacticalLines.ICE_OPENINGS_FROZEN: case TacticalLines.ICE_OPENINGS_FROZEN_GE: case TacticalLines.ICE_EDGE_RADAR: case TacticalLines.ICE_EDGE_RADAR_GE: case TacticalLines.CRACKS_SPECIFIC_LOCATION: case TacticalLines.CRACKS_SPECIFIC_LOCATION_GE: case TacticalLines.EBB_TIDE: case TacticalLines.FLOOD_TIDE: case TacticalLines.EBB_TIDE_GE: case TacticalLines.FLOOD_TIDE_GE: case TacticalLines.JET: case TacticalLines.STREAM: case TacticalLines.JET_GE: case TacticalLines.STREAM_GE: case TacticalLines.HOLD_GE: case TacticalLines.BRDGHD_GE: lineObject.moveTo(P0.x, P0.y); lineObject.curveTo(P1.x, P1.y, P2.x, P2.y, P3.x, P3.y); //do not return, we still need the spline points //to claculate other features break; default: //the rest of them must use the calculated curve points break; } //var sprite:Sprite; int j = 0; double distance; int n = 0; double x = 0, y = 0, increment = 0; POINT2 pt0, pt1, pt2; double t; POINT2 pt; array.clear(); //distance=clsUtility.Distance2(P0,Pa_1); //add the curve points to tg.Pixels switch (tg.get_LineType()) { case TacticalLines.HOLD://added these 1-3-11. need small increment because these case TacticalLines.BRDGHD://points are used for fill which needs to confrom to the outline case TacticalLines.HOLD_GE://added these 1-3-11. need small increment because these case TacticalLines.BRDGHD_GE://points are used for fill which needs to confrom to the outline increment = 3.0; break; case TacticalLines.ICE_EDGE_RADAR: increment = 10.0; break; case TacticalLines.ICE_OPENINGS_FROZEN: case TacticalLines.ICE_OPENINGS_FROZEN_GE: case TacticalLines.CRACKS_SPECIFIC_LOCATION: case TacticalLines.CRACKS_SPECIFIC_LOCATION_GE: //increment = 12.0; increment = 7.0; break; default: increment = 10.0; break; } distance = lineutility.CalcDistanceDouble(P0, Pa_1); if(distance<increment) distance=increment; n = (int) (distance / increment); pt0 = P0; pt1 = Pc_1; pt2 = Pa_1; for (j = 0; j < n; j++) { t = (double) j * (increment / distance); x = (1d - t) * (1d - t) * pt0.x + 2 * (1d - t) * t * pt1.x + t * t * pt2.x; y = (1d - t) * (1d - t) * pt0.y + 2 * (1d - t) * t * pt1.y + t * t * pt2.y; pt = new POINT2(x, y); //array.push(pt); array.add(pt); } //distance=clsUtility.Distance2(Pa_1,Pa_2); distance = lineutility.CalcDistanceDouble(Pa_1, Pa_2); //add the curve points to tg.Pixels n = (int) (distance / increment); pt0 = Pa_1; pt1 = Pc_2; pt2 = Pa_2; for (j = 0; j < n; j++) { t = (double) j * (increment / distance); x = (1d - t) * (1d - t) * pt0.x + 2 * (1d - t) * t * pt1.x + t * t * pt2.x; y = (1d - t) * (1d - t) * pt0.y + 2 * (1d - t) * t * pt1.y + t * t * pt2.y; pt = new POINT2(x, y); array.add(pt); } //distance=clsUtility.Distance2(Pa_2,Pa_3); distance = lineutility.CalcDistanceDouble(Pa_2, Pa_3); //add the curve points to tg.Pixels n = (int) (distance / increment); pt0 = Pa_2; pt1 = Pc_3; pt2 = Pa_3; for (j = 0; j < n; j++) { t = (double) j * (increment / distance); x = (1d - t) * (1d - t) * pt0.x + 2 * (1d - t) * t * pt1.x + t * t * pt2.x; y = (1d - t) * (1d - t) * pt0.y + 2 * (1d - t) * t * pt1.y + t * t * pt2.y; pt = new POINT2(x, y); array.add(pt); } //distance=clsUtility.Distance2(Pa_3,P3); distance = lineutility.CalcDistanceDouble(Pa_3, P3); //add the curve points to tg.Pixels n = (int) (distance / increment); pt0 = Pa_3; pt1 = Pc_4; pt2 = P3; for (j = 0; j < n; j++) { t = (double) j * (increment / distance); x = (1d - t) * (1d - t) * pt0.x + 2 * (1d - t) * t * pt1.x + t * t * pt2.x; y = (1d - t) * (1d - t) * pt0.y + 2 * (1d - t) * t * pt1.y + t * t * pt2.y; pt = new POINT2(x, y); array.add(pt); } } catch (Exception exc) { ErrorLogger.LogException(_className ,"drawCubicBezier2", new RendererException("Failed inside drawCubicBezier2", exc)); } return array; } /** * * Called by Splines2TG to get straight channel lines for splines. * * @param tg - TGlight * * @return An ArrayList to use for building the parallel splines */ // private static ArrayList ParallelLines(TGLight tg,int rev) { // ArrayList<POINT2> channelPoints2 = new ArrayList(); // try { // double[] pLinePoints = new double[tg.Pixels.size() * 2]; // double[] channelPoints = new double[6 * tg.Pixels.size()]; // int j = 0; // int n=tg.Pixels.size(); // //for (j = 0; j < tg.Pixels.size(); j++) // for (j = 0; j < n; j++) // { // pLinePoints[2 * j] = tg.Pixels.get(j).x; // pLinePoints[2 * j + 1] = tg.Pixels.get(j).y; // } // int numPoints = tg.Pixels.size(); // int channelWidth = 20; // int usePtr = 0; // ArrayList<Shape2> shapes = null; // // try { // CELineArray.CGetChannel2Double(pLinePoints, pLinePoints, channelPoints, numPoints, numPoints, (int) TacticalLines.CHANNEL, channelWidth, usePtr, shapes,rev); // } catch (Exception e) { // ErrorLogger.LogException(_className, "ParallelLines", // new RendererException("Failed inside ParallelLines", e)); // } // // POINT2 pt2 = null; // int style = 0; // n=channelPoints.length; // //for (j = 0; j < channelPoints.length / 3; j++) // for (j = 0; j < n / 3; j++) // { // pt2 = new POINT2(channelPoints[3 * j], channelPoints[3 * j + 1], style); // channelPoints2.add(pt2); // } // } catch (Exception exc) { // ErrorLogger.LogException(_className, "ParallelLines", // new RendererException("Failed inside ParallelLines", exc)); // } // return channelPoints2; // } /** * Call this function with segment * @param Pixels a segment of tg.Pixels * @return */ private static ArrayList ParallelLines2(ArrayList<POINT2> Pixels,int rev) { ArrayList<POINT2> channelPoints2 = new ArrayList(); try { double[] pLinePoints = new double[Pixels.size() * 2]; double[] channelPoints = new double[6 * Pixels.size()]; int j = 0; int n=Pixels.size(); //for (j = 0; j < Pixels.size(); j++) for (j = 0; j < n; j++) { pLinePoints[2 * j] = Pixels.get(j).x; pLinePoints[2 * j + 1] = Pixels.get(j).y; } int numPoints = Pixels.size(); int channelWidth = 20; int usePtr = 0; ArrayList<Shape2> shapes = null; try { CELineArray.CGetChannel2Double(pLinePoints, pLinePoints, channelPoints, numPoints, numPoints, (int) TacticalLines.CHANNEL, channelWidth, usePtr, shapes,rev); } catch (Exception e) { ErrorLogger.LogException(_className, "ParallelLines2", new RendererException("Failed inside ParallelLines2", e)); } POINT2 pt2 = null; int style = 0; n=channelPoints.length; //for (j = 0; j < channelPoints.length / 3; j++) for (j = 0; j < n / 3; j++) { pt2 = new POINT2(channelPoints[3 * j], channelPoints[3 * j + 1], style); channelPoints2.add(pt2); } } catch (Exception exc) { ErrorLogger.LogException(_className, "ParallelLines2", new RendererException("Failed inside ParallelLines2", exc)); } return channelPoints2; } }