/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package armyc2.c2sd.JavaTacticalRenderer; import armyc2.c2sd.JavaLineArray.POINT2; import armyc2.c2sd.JavaLineArray.TacticalLines; import armyc2.c2sd.JavaLineArray.lineutility; import armyc2.c2sd.JavaLineArray.Shape2; import java.util.ArrayList; import armyc2.c2sd.renderer.utilities.Color; import armyc2.c2sd.renderer.utilities.ShapeInfo; import armyc2.c2sd.renderer.utilities.ErrorLogger; import armyc2.c2sd.renderer.utilities.RendererException; import armyc2.c2sd.renderer.utilities.RendererSettings; import armyc2.c2sd.renderer.utilities.IPointConversion; import armyc2.c2sd.JavaLineArray.Channels; import java.util.HashMap; import armyc2.c2sd.graphics2d.*; /* * This class handles everything having to do with text for a * tactical graphic. Note: labels are handled the same as text modifiers. * @author Michael Deutch * */ public class Modifier2 { private POINT2[] textPath; private String textID; private String featureID; private String text; private int iteration; private int justify; private int type; private double lineFactor; private static final String _className = "Modifier2"; private boolean isIntegral = false; private boolean fitsMBR = true; Modifier2() { textPath = new POINT2[2]; } private static final int toEnd = 1; //use both points private static final int aboveMiddle = 2; //use both points private static final int area = 3; //use one point private static final int screen = 4; //use one point, screen, cover, guard points private static final int aboveEnd = 5; //rev D mod to replace toEnd private static double fillAlphaCanObscureText = 50d; private static boolean DoublesBack(POINT2 pt0, POINT2 pt1, POINT2 pt2) { boolean result = true; try { double theta1 = Math.atan2(pt2.y - pt1.y, pt2.x - pt1.x); double theta0 = Math.atan2(pt0.y - pt1.y, pt0.x - pt1.x); double beta = Math.abs(theta0 - theta1); if (beta > 0.1) { result = false; } } catch (Exception exc) { ErrorLogger.LogException(_className, "DoublesBack", new RendererException("Failed inside DoublesBack", exc)); } return result; } /** * Returns a generic label for the symbol per Mil-Std-2525 * * @param tg * @return */ private static String GetCenterLabel(TGLight tg) { //int linetype=tg.get_LineType(); String label = ""; try { switch (tg.get_LineType()) { case TacticalLines.SAAFR: label = "SAAFR"; break; case TacticalLines.AC: label = "AC"; break; case TacticalLines.SECURE: case TacticalLines.SEIZE: case TacticalLines.SEIZE_REVC: label = "S"; break; case TacticalLines.RETAIN: label = "R"; break; case TacticalLines.PENETRATE: label = "P"; break; case TacticalLines.OCCUPY: label = "O"; break; case TacticalLines.ISOLATE: label = "I"; break; case TacticalLines.FIX: label = "F"; break; case TacticalLines.DISRUPT: label = "D"; break; case TacticalLines.CANALIZE: case TacticalLines.CLEAR: label = "C"; break; case TacticalLines.BREACH: case TacticalLines.BYPASS: label = "B"; break; case TacticalLines.CORDONKNOCK: label = "C/K"; break; case TacticalLines.CORDONSEARCH: label = "C/S"; break; case TacticalLines.UXO: label = "UXO"; break; case TacticalLines.RETIRE: label = "R"; break; case TacticalLines.BRDGHD: case TacticalLines.BRDGHD_GE: //label="BRIDGEHEAD LINE"; label = "BL "; break; case TacticalLines.HOLD: case TacticalLines.HOLD_GE: //label="HOLDING LINE"; label = "HL "; break; case TacticalLines.PL: label = "PL "; break; case TacticalLines.LL: label = "LL"; break; case TacticalLines.SCREEN: case TacticalLines.SCREEN_REVC: label = "S"; break; case TacticalLines.COVER: case TacticalLines.COVER_REVC: label = "C"; break; case TacticalLines.GUARD: case TacticalLines.GUARD_REVC: label = "G"; break; case TacticalLines.RIP: label = "RIP"; break; case TacticalLines.WITHDRAW: label = "W"; break; case TacticalLines.WDRAWUP: label = "WP"; break; case TacticalLines.CATK: case TacticalLines.CATKBYFIRE: label = "CATK"; break; case TacticalLines.FLOT: label = "FLOT"; break; case TacticalLines.ASSY: label = "AA"; break; case TacticalLines.EA: label = "EA"; break; case TacticalLines.DZ: label = "DZ"; break; case TacticalLines.EZ: label = "EZ"; break; case TacticalLines.LZ: label = "LZ"; break; case TacticalLines.PZ: label = "PZ"; break; case TacticalLines.MRR: case TacticalLines.MRR_USAS: label = "MRR"; break; case TacticalLines.UAV: if (tg.getSymbologyStandard() == RendererSettings.Symbology_2525C) { label = "UA"; } else { label = "UAV"; } break; case TacticalLines.UAV_USAS: label = "UAV"; break; case TacticalLines.LLTR: label = "LLTR"; break; case TacticalLines.ROZ: label = "ROZ"; break; case TacticalLines.FAADZ: if (tg.getSymbologyStandard() == RendererSettings.Symbology_2525C) { label = "SHORADEZ"; } else { label = "FAADEZ"; } break; case TacticalLines.HIDACZ: label = "HIDACZ"; break; case TacticalLines.MEZ: label = "MEZ"; break; case TacticalLines.LOMEZ: label = "LOMEZ"; break; case TacticalLines.HIMEZ: label = "HIMEZ"; break; case TacticalLines.WFZ: label = "WFZ"; break; case TacticalLines.DMA: label = "M"; break; case TacticalLines.MINED: case TacticalLines.DMAF: label = "M"; break; case TacticalLines.FEBA: label = "FEBA"; break; case TacticalLines.PDF: label = "(PDF)"; break; case TacticalLines.PNO: label = "(P)"; break; case TacticalLines.EA1: label = "EA "; break; case TacticalLines.OBJ: label = "OBJ "; if (tg.get_Client().equalsIgnoreCase("ge")) { label = "OBJ "; } break; case TacticalLines.NAI: label = "NAI"; break; case TacticalLines.TAI: label = "TAI"; break; case TacticalLines.LINTGTS: label = "SMOKE"; break; case TacticalLines.FPF: label = "FPF"; break; case TacticalLines.ATKPOS: label = "ATK"; break; case TacticalLines.FCL: label = "FINAL CL"; break; case TacticalLines.LOA: label = "LOA"; break; case TacticalLines.LOD: label = "LD"; break; case TacticalLines.PLD: label = "PLD"; break; case TacticalLines.DELAY: label = "D"; break; case TacticalLines.RELEASE: label = "RL"; break; case TacticalLines.SMOKE: label = "SMOKE"; break; case TacticalLines.NFL: label = "NFL"; break; case TacticalLines.MFP: label = "MFP"; break; case TacticalLines.FSCL: label = " FSCL"; break; case TacticalLines.CFL: label = "CFL "; break; case TacticalLines.RFL: label = "RFL "; break; case TacticalLines.AO: label = "AO "; break; case TacticalLines.BOMB: label = "BOMB"; break; case TacticalLines.TGMF: label = "TGMF"; break; case TacticalLines.FSA: label = "FSA "; break; case TacticalLines.FSA_CIRCULAR: case TacticalLines.FSA_RECTANGULAR: label = "FSA"; break; case TacticalLines.ACA: case TacticalLines.ACA_CIRCULAR: case TacticalLines.ACA_RECTANGULAR: label = "ACA"; break; case TacticalLines.FFA: case TacticalLines.FFA_CIRCULAR: case TacticalLines.FFA_RECTANGULAR: label = "FFA"; break; case TacticalLines.NFA: case TacticalLines.NFA_CIRCULAR: case TacticalLines.NFA_RECTANGULAR: label = "NFA"; break; case TacticalLines.RFA: case TacticalLines.RFA_CIRCULAR: case TacticalLines.RFA_RECTANGULAR: label = "RFA"; break; case TacticalLines.ATI: case TacticalLines.ATI_CIRCULAR: case TacticalLines.ATI_RECTANGULAR: label = "ATI ZONE"; break; case TacticalLines.PAA: case TacticalLines.PAA_CIRCULAR: case TacticalLines.PAA_RECTANGULAR: case TacticalLines.PAA_RECTANGULAR_REVC: label = "PAA"; break; case TacticalLines.CFFZ: case TacticalLines.CFFZ_CIRCULAR: case TacticalLines.CFFZ_RECTANGULAR: label = "CFF ZONE"; break; case TacticalLines.CFZ: case TacticalLines.CFZ_CIRCULAR: case TacticalLines.CFZ_RECTANGULAR: label = "CF ZONE"; break; case TacticalLines.SENSOR: case TacticalLines.SENSOR_CIRCULAR: case TacticalLines.SENSOR_RECTANGULAR: label = "SENSOR ZONE"; break; case TacticalLines.CENSOR: case TacticalLines.CENSOR_CIRCULAR: case TacticalLines.CENSOR_RECTANGULAR: label = "CENSOR ZONE"; break; case TacticalLines.DA: case TacticalLines.DA_CIRCULAR: case TacticalLines.DA_RECTANGULAR: label = "DA"; break; case TacticalLines.ZOR: case TacticalLines.ZOR_CIRCULAR: case TacticalLines.ZOR_RECTANGULAR: label = "ZOR"; break; case TacticalLines.TBA: case TacticalLines.TBA_CIRCULAR: case TacticalLines.TBA_RECTANGULAR: label = "TBA"; break; case TacticalLines.TVAR: case TacticalLines.TVAR_CIRCULAR: case TacticalLines.TVAR_RECTANGULAR: label = "TVAR"; break; case TacticalLines.KILLBOXBLUE: case TacticalLines.KILLBOXBLUE_CIRCULAR: case TacticalLines.KILLBOXBLUE_RECTANGULAR: label = "BKB"; break; case TacticalLines.KILLBOXPURPLE: case TacticalLines.KILLBOXPURPLE_CIRCULAR: case TacticalLines.KILLBOXPURPLE_RECTANGULAR: label = "PKB"; break; case TacticalLines.MSR: label = "MSR "; break; case TacticalLines.ASR: label = "ASR "; break; case TacticalLines.ALT: case TacticalLines.ONEWAY: case TacticalLines.TWOWAY: label = "MSR "; break; case TacticalLines.LDLC: label = "LD/LC"; break; case TacticalLines.AIRHEAD: label = "AIRHEAD LINE"; break; case TacticalLines.BLOCK: case TacticalLines.BEARING: label = "B"; break; case TacticalLines.ELECTRO: label = "E"; break; case TacticalLines.ACOUSTIC: label = "A"; break; case TacticalLines.TORPEDO: label = "T"; break; case TacticalLines.OPTICAL: label = "O"; break; case TacticalLines.FARP: label = "FARP"; break; case TacticalLines.BSA: label = "BSA"; break; case TacticalLines.DSA: label = "DSA"; break; case TacticalLines.RSA: label = "RSA"; break; case TacticalLines.CONTAIN: label = "ENY"; break; case TacticalLines.OBSFAREA: label = "FREE"; break; default: break; } } catch (Exception exc) { //clsUtility.WriteFile("Error in Modifier2.GetCenterLabel"); ErrorLogger.LogException(_className, "GetCenterLabel", new RendererException("Failed inside GetCenterLabel", exc)); } return label; } //non CPOF clients using best fit need these accessors public POINT2[] get_TextPath() { return textPath; } protected void set_TextPath(POINT2[] value) { textPath = value; } protected void set_IsIntegral(boolean value) { isIntegral = value; } protected boolean get_IsIntegral() { return isIntegral; } private static void AddOffsetModifier(TGLight tg, String text, int type, double lineFactor, int startIndex, int endIndex, double spaces, String rightOrLeft) { try { if (text == null || text.equals("")) { return; } Modifier2 modifier = new Modifier2(); if (text.equals("")) { return; } if (tg.Pixels == null || tg.Pixels.size() < 2) { return; } modifier.text = text; modifier.set_IsIntegral(false); modifier.type = type; modifier.lineFactor = lineFactor; if (tg.Pixels.size() > endIndex) { modifier.textPath[0] = tg.Pixels.get(startIndex); modifier.textPath[1] = tg.Pixels.get(endIndex); if (rightOrLeft != null) { if (rightOrLeft.equals("left")) { modifier.textPath[0].x -= spaces; modifier.textPath[1].x -= spaces; } else { modifier.textPath[0].x += spaces; modifier.textPath[1].x += spaces; } } tg.modifiers.add(modifier); } } catch (Exception exc) { ErrorLogger.LogException(_className, "AddOffsetModifier", new RendererException("Failed inside AddOffsetModifier", exc)); } } /** * * @param tg * @param text * @param type * @param lineFactor * @param ptStart * @param ptEnd */ private static void AddModifier(TGLight tg, String text, int type, double lineFactor, POINT2 ptStart, POINT2 ptEnd) { try { if (text == null || text.equals("")) { return; } Modifier2 modifier = new Modifier2(); if (text == null || text.equals("")) { return; } if (tg.Pixels == null || tg.Pixels.size() < 2) { return; } modifier.text = text; modifier.set_IsIntegral(false); modifier.type = type; modifier.lineFactor = lineFactor; modifier.textPath[0] = ptStart; modifier.textPath[1] = ptEnd; tg.modifiers.add(modifier); } catch (Exception exc) { ErrorLogger.LogException(_className, "AddModifier", new RendererException("Failed inside AddModifier", exc)); } } private static void AddModifier2(TGLight tg, String text, int type, double lineFactor, POINT2 pt0, POINT2 pt1, boolean isIntegral) { try { if (text == null || text.equals("")) { return; } Modifier2 modifier = new Modifier2(); if (text == null || text.equals("")) { return; } modifier.text = text; modifier.set_IsIntegral(isIntegral); modifier.type = type; modifier.lineFactor = lineFactor; modifier.textPath[0] = pt0;//tg.Pixels.get(startIndex); modifier.textPath[1] = pt1;//tg.Pixels.get(endIndex); modifier.isIntegral = isIntegral; tg.modifiers.add(modifier); } catch (Exception exc) { ErrorLogger.LogException(_className, "AddModifier", new RendererException("Failed inside AddModifier", exc)); } } private static void AddModifier2(TGLight tg, String text, int type, double lineFactor, POINT2 pt0, POINT2 pt1, boolean isIntegral, String modifierType) { try { if (text == null || text.equals("")) { return; } Modifier2 modifier = new Modifier2(); if (text == null || text.equals("")) { return; } modifier.text = text; modifier.set_IsIntegral(isIntegral); modifier.type = type; modifier.lineFactor = lineFactor; modifier.textPath[0] = pt0;//tg.Pixels.get(startIndex); modifier.textPath[1] = pt1;//tg.Pixels.get(endIndex); modifier.isIntegral = isIntegral; modifier.textID = modifierType; tg.modifiers.add(modifier); } catch (Exception exc) { ErrorLogger.LogException(_className, "AddModifier", new RendererException("Failed inside AddModifier", exc)); } } private static void AddIntegralModifier(TGLight tg, String text, int type, double lineFactor, int startIndex, int endIndex) { try { if (text == null || text.equals("")) { return; } Modifier2 modifier = new Modifier2(); modifier.set_IsIntegral(true); if (text == null || text.equals("")) { return; } if (tg.Pixels == null || tg.Pixels.isEmpty()) { return; } modifier.text = text; modifier.type = type; modifier.lineFactor = lineFactor; if (tg.Pixels.size() > endIndex) { modifier.textPath[0] = tg.Pixels.get(startIndex); modifier.textPath[1] = tg.Pixels.get(endIndex); tg.modifiers.add(modifier); } } catch (Exception exc) { ErrorLogger.LogException(_className, "AddModifier", new RendererException("Failed inside AddIntegralModifier", exc)); } } private static void AddIntegralModifier(TGLight tg, String text, int type, double lineFactor, int startIndex, int endIndex, Boolean isIntegral) { try { if (text == null || text.equals("")) { return; } Modifier2 modifier = new Modifier2(); modifier.set_IsIntegral(isIntegral); //if (text == null || text.equals("")) if (text.equals("")) { return; } if (tg.Pixels == null || tg.Pixels.isEmpty()) { return; } modifier.text = text; modifier.type = type; modifier.lineFactor = lineFactor; if (tg.Pixels.size() > endIndex) { modifier.textPath[0] = tg.Pixels.get(startIndex); modifier.textPath[1] = tg.Pixels.get(endIndex); tg.modifiers.add(modifier); } } catch (Exception exc) { ErrorLogger.LogException(_className, "AddModifier", new RendererException("Failed inside AddIntegralModifier", exc)); } } private static void AddIntegralModifier(TGLight tg, String text, int type, double lineFactor, int startIndex, int endIndex, Boolean isIntegral, String modifierType) { try { if (text == null || text.equals("")) { return; } Modifier2 modifier = new Modifier2(); modifier.set_IsIntegral(isIntegral); if (text == null || text.equals("")) { return; } if (tg.Pixels == null || tg.Pixels.isEmpty()) { return; } modifier.text = text; modifier.type = type; modifier.lineFactor = lineFactor; modifier.textID = modifierType; if (tg.Pixels.size() > endIndex) { modifier.textPath[0] = tg.Pixels.get(startIndex); modifier.textPath[1] = tg.Pixels.get(endIndex); tg.modifiers.add(modifier); } } catch (Exception exc) { ErrorLogger.LogException(_className, "AddModifier", new RendererException("Failed inside AddIntegralModifier", exc)); } } /** * Creates and adds center modifiers for generic areas * * @param tg * @param text * @param type * @param lineFactor * @param pt0 * @param pt1 */ private static void AddAreaModifier(TGLight tg, String text, int type, double lineFactor, POINT2 pt0, POINT2 pt1) { try { if (text == null || text.equals("")) { return; } Modifier2 modifier = new Modifier2(); modifier.text = text; modifier.set_IsIntegral(true); if (pt0 == null || pt1 == null) { return; } modifier.type = type; modifier.lineFactor = lineFactor; modifier.textPath[0] = pt0; modifier.textPath[1] = pt1; tg.modifiers.add(modifier); } catch (Exception exc) { ErrorLogger.LogException(_className, "AddAreaModifier", new RendererException("Failed inside AddAreaModifier", exc)); } } /** * sets modifier.textId to the modifier type, e.g. label, T, T1, etc. * * @param tg * @param text * @param type * @param lineFactor * @param pt0 * @param pt1 * @param modifierType */ private static void AddAreaModifier(TGLight tg, String text, int type, double lineFactor, POINT2 pt0, POINT2 pt1, String modifierType) { try { if (text == null || text.equals("")) { return; } Modifier2 modifier = new Modifier2(); modifier.text = text; modifier.set_IsIntegral(true); if (pt0 == null || pt1 == null) { return; } modifier.type = type; modifier.textID = modifierType; modifier.lineFactor = lineFactor; modifier.textPath[0] = pt0; modifier.textPath[1] = pt1; tg.modifiers.add(modifier); } catch (Exception exc) { ErrorLogger.LogException(_className, "AddAreaModifier", new RendererException("Failed inside AddAreaModifier", exc)); } } private static void AddIntegralAreaModifier(TGLight tg, String text, int type, double lineFactor, POINT2 pt0, POINT2 pt1, Boolean isIntegral) { try { if (text == null || text.equals("")) { return; } Modifier2 modifier = new Modifier2(); modifier.set_IsIntegral(isIntegral); modifier.text = text; if (text == null || text.equals("")) { return; } if (pt0 == null || pt1 == null) { return; } modifier.type = type; modifier.lineFactor = lineFactor; modifier.textPath[0] = pt0; modifier.textPath[1] = pt1; tg.modifiers.add(modifier); } catch (Exception exc) { ErrorLogger.LogException(_className, "AddAreaModifier", new RendererException("Failed inside AddAreaModifier", exc)); } } private static void AddIntegralAreaModifier(TGLight tg, String text, int type, double lineFactor, POINT2 pt0, POINT2 pt1, Boolean isIntegral, String modifierType) { try { if (text == null || text.equals("")) { return; } Modifier2 modifier = new Modifier2(); modifier.set_IsIntegral(isIntegral); modifier.text = text; //if (text == null || text.equals("")) if (text.equals("")) { return; } if (pt0 == null || pt1 == null) { return; } modifier.type = type; modifier.lineFactor = lineFactor; modifier.textPath[0] = pt0; modifier.textPath[1] = pt1; modifier.textID = modifierType; tg.modifiers.add(modifier); } catch (Exception exc) { ErrorLogger.LogException(_className, "AddAreaModifier", new RendererException("Failed inside AddAreaModifier", exc)); } } /** * Returns symbol MBR. Assumes points have been initialized with value of * 0th point * * @param tg the tactical graphic object * @param ptUl OUT - MBR upper left * @param ptUr OUT - MBR upper right * @param ptLr OUT - MBR lower right * @param ptLl OUT - MBR lower left */ public static void GetMBR(TGLight tg, POINT2 ptUl, POINT2 ptUr, POINT2 ptLr, POINT2 ptLl) { try { int j = 0; double x = 0; double y = 0; ptUl.x = tg.Pixels.get(0).x; ptUl.y = tg.Pixels.get(0).y; ptUr.x = tg.Pixels.get(0).x; ptUr.y = tg.Pixels.get(0).y; ptLl.x = tg.Pixels.get(0).x; ptLl.y = tg.Pixels.get(0).y; ptLr.x = tg.Pixels.get(0).x; ptLr.y = tg.Pixels.get(0).y; int n = tg.Pixels.size(); //for (j = 1; j < tg.Pixels.size(); j++) for (j = 1; j < n; j++) { x = tg.Pixels.get(j).x; y = tg.Pixels.get(j).y; if (x < ptLl.x) { ptLl.x = x; ptUl.x = x; } if (x > ptLr.x) { ptLr.x = x; ptUr.x = x; } if (y > ptLl.y) { ptLl.y = y; ptLr.y = y; } if (y < ptUl.y) { ptUl.y = y; ptUr.y = y; } } } catch (Exception exc) { ErrorLogger.LogException(_className, "GetMBR", new RendererException("Failed inside GetMBR", exc)); } } private static void GetBoundaryMiddleSegment(TGLight tg, Graphics2D g2d, POINT2 pt0, POINT2 pt1) { int middleSegment = tg.Pixels.size() / 2 - 1; boolean tooShort = GetLineTooShort(tg, g2d); int stringWidthENY = 0; int stringWidthEchelonSymbol = 0; g2d.setFont(tg.get_Font()); FontMetrics metrics = g2d.getFontMetrics(); POINT2 midpt = lineutility.MidPointDouble(tg.Pixels.get(middleSegment), tg.Pixels.get(middleSegment + 1), 0); POINT2 ptTemp = null; double dist = 0; if (tooShort) { if (tg.get_Affiliation().equals("H")) { stringWidthENY = metrics.stringWidth(tg.get_N()); } if (tg.get_EchelonSymbol() != null) { stringWidthEchelonSymbol = metrics.stringWidth(tg.get_EchelonSymbol()); } dist = 1.5 * (2 * stringWidthENY + stringWidthEchelonSymbol); ptTemp = lineutility.ExtendAlongLineDouble(midpt, tg.Pixels.get(middleSegment), dist / 2); pt0.x = ptTemp.x; pt0.y = ptTemp.y; ptTemp = lineutility.ExtendAlongLineDouble(midpt, tg.Pixels.get(middleSegment + 1), dist / 2); pt1.x = ptTemp.x; pt1.y = ptTemp.y; } else { ptTemp = tg.Pixels.get(middleSegment); pt0.x = ptTemp.x; pt0.y = ptTemp.y; ptTemp = tg.Pixels.get(middleSegment + 1); pt1.x = ptTemp.x; pt1.y = ptTemp.y; } } private static boolean GetLineTooShort(TGLight tg, Graphics2D g2d) { boolean lineTooShort = false; try { int middleSegment = tg.Pixels.size() / 2 - 1; g2d.setFont(tg.get_Font()); FontMetrics metrics = g2d.getFontMetrics(); String echelonSymbol = null; int stringWidthEchelonSymbol = 0; int stringWidthENY = 0; POINT2 pt0 = tg.Pixels.get(middleSegment); POINT2 pt1 = tg.Pixels.get(middleSegment + 1); double dist = lineutility.CalcDistanceDouble(pt0, pt1); echelonSymbol = tg.get_EchelonSymbol(); if (tg.get_Affiliation().equals("H")) { stringWidthENY = metrics.stringWidth(tg.get_N()); } if (echelonSymbol != null) { stringWidthEchelonSymbol = metrics.stringWidth(echelonSymbol); } switch (tg.get_LineType()) { case TacticalLines.BOUNDARY: if (dist < 1.5 * (stringWidthENY * 2 + stringWidthEchelonSymbol)) { lineTooShort = true; } break; default: break; } } catch (Exception exc) { ErrorLogger.LogException(_className, "GetBoundaryLineTooShort", new RendererException("Failed inside GetBoundaryLineTooShort", exc)); } return lineTooShort; } /** * Tests segment of a Boundary * * @param tg * @param g2d * @param middleSegment * @return */ private static boolean GetBoundarySegmentTooShort(TGLight tg, Graphics2D g2d, int middleSegment) { boolean lineTooShort = false; try { //int middleSegment = tg.Pixels.size() / 2 - 1; g2d.setFont(tg.get_Font()); FontMetrics metrics = g2d.getFontMetrics(); String echelonSymbol = null; int stringWidthEchelonSymbol = 0; int stringWidthENY = 0; POINT2 pt0 = tg.Pixels.get(middleSegment); POINT2 pt1 = tg.Pixels.get(middleSegment + 1); double dist = lineutility.CalcDistanceDouble(pt0, pt1); echelonSymbol = tg.get_EchelonSymbol(); if (tg.get_Affiliation() != null && tg.get_Affiliation().equals("H")) { stringWidthENY = metrics.stringWidth(tg.get_N()); } if (echelonSymbol != null) { stringWidthEchelonSymbol = metrics.stringWidth(echelonSymbol); } int tWidth = 0, t1Width = 0; if (tg.get_Name() != null && !tg.get_Name().isEmpty()) { tWidth = metrics.stringWidth(tg.get_Name()); } if (tg.get_T1() != null && !tg.get_T1().isEmpty()) { t1Width = metrics.stringWidth(tg.get_T1()); } int totalWidth = stringWidthENY * 2 + stringWidthEchelonSymbol; if (totalWidth < tWidth) { totalWidth = tWidth; } if (totalWidth < t1Width) { totalWidth = t1Width; } switch (tg.get_LineType()) { case TacticalLines.BOUNDARY: if (dist < 1.25 * (totalWidth)) { lineTooShort = true; } break; default: break; } } catch (Exception exc) { ErrorLogger.LogException(_className, "GetBoundaryLineTooShort", new RendererException("Failed inside GetBoundaryLineTooShort", exc)); } return lineTooShort; } /** * Handles the line breaks for Boundary * * @param tg * @param g2d */ private static void AddBoundaryModifiers(TGLight tg, Graphics2D g2d, Rectangle2D clipBounds) { try { int j = 0; double csFactor = 1d; Boolean foundSegment = false; POINT2 pt0 = null, pt1 = null, ptLast = null; double TLineFactor = 0, T1LineFactor = 0; String affiliation = tg.get_Affiliation(); Boolean lineTooShort = false; if (tg.get_Client().equals("cpof3d")) { csFactor = 0.85d; } int middleSegment = getVisibleMiddleSegment(tg, clipBounds); int n = tg.Pixels.size(); //for (j = 0; j < tg.Pixels.size() - 1; j++) for (j = 0; j < n - 1; j++) { if (tg.get_Client().equalsIgnoreCase("ge")) { if (j != middleSegment) { continue; } } pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); //GetBoundaryMiddleSegment(tg, g2d, pt0, pt1); if (pt0.x < pt1.x) { TLineFactor = -1.3; T1LineFactor = 1; } else if (pt0.x == pt1.x) { if (pt1.y < pt0.y) { TLineFactor = -1; T1LineFactor = 1; } else { TLineFactor = 1; T1LineFactor = -1; } } else { TLineFactor = 1; T1LineFactor = -1.3; } //is the segment too short? lineTooShort = GetBoundarySegmentTooShort(tg, g2d, j); if (lineTooShort == false) { foundSegment = true; AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, TLineFactor * csFactor, j, j + 1, true); //the echelon symbol if (!tg.get_EchelonSymbol().equals("")) { AddIntegralModifier(tg, tg.get_EchelonSymbol(), aboveMiddle, -0.20 * csFactor, j, j + 1, true); } //the T1 modifier AddIntegralModifier(tg, tg.get_T1(), aboveMiddle, T1LineFactor * csFactor, j, j + 1, true); if (affiliation != null && affiliation.equals("H")) { //ENY label ptLast = lineutility.MidPointDouble(pt0, pt1, 0); ptLast = lineutility.MidPointDouble(pt0, ptLast, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt0, ptLast, true); //ENY label ptLast = lineutility.MidPointDouble(pt1, pt0, 0); ptLast = lineutility.MidPointDouble(pt1, ptLast, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt1, ptLast, true); } } }//end for loop if (foundSegment == false) { pt0 = new POINT2(); pt1 = new POINT2(); GetBoundaryMiddleSegment(tg, g2d, pt0, pt1); AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, TLineFactor * csFactor, middleSegment, middleSegment + 1, true); //the echelon symbol if (!tg.get_EchelonSymbol().equals("")) { AddIntegralModifier(tg, tg.get_EchelonSymbol(), aboveMiddle, -0.2020 * csFactor, middleSegment, middleSegment + 1, true); } //the T1 modifier AddIntegralModifier(tg, tg.get_T1(), aboveMiddle, T1LineFactor * csFactor, middleSegment, middleSegment + 1, true); if (affiliation != null && affiliation.equals("H")) { //ENY label ptLast = lineutility.MidPointDouble(pt0, pt1, 0); ptLast = lineutility.MidPointDouble(pt0, ptLast, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt0, ptLast, true); //ENY label ptLast = lineutility.MidPointDouble(pt1, pt0, 0); ptLast = lineutility.MidPointDouble(pt1, ptLast, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt1, ptLast, true); } }//end if foundSegment==false } catch (Exception exc) { ErrorLogger.LogException(_className, "AddBoundaryModifiers", new RendererException("Failed inside AddBoundaryModifiers", exc)); } } private static void AddBoundaryModifiers(TGLight tg, Graphics2D g2d, ArrayList<Point2D> clipBounds) { try { int j = 0; double csFactor = 1d; Boolean foundSegment = false; POINT2 pt0 = null, pt1 = null, ptLast = null; double TLineFactor = 0, T1LineFactor = 0; String affiliation = tg.get_Affiliation(); Boolean lineTooShort = false; if (tg.get_Client().equals("cpof3d")) { csFactor = 0.85d; } int middleSegment = getVisibleMiddleSegment(tg, clipBounds); int n = tg.Pixels.size(); //for (j = 0; j < tg.Pixels.size() - 1; j++) for (j = 0; j < n - 1; j++) { if (tg.get_Client().equalsIgnoreCase("ge")) { if (j != middleSegment) { continue; } } pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); if (pt0.x < pt1.x) { TLineFactor = -1.3; T1LineFactor = 1; } else if (pt0.x == pt1.x) { if (pt1.y < pt0.y) { TLineFactor = -1; T1LineFactor = 1; } else { TLineFactor = 1; T1LineFactor = -1; } } else { TLineFactor = 1; T1LineFactor = -1.3; } //is the segment too short? lineTooShort = GetBoundarySegmentTooShort(tg, g2d, j); if (lineTooShort == false) { foundSegment = true; AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, TLineFactor * csFactor, j, j + 1, true); //the echelon symbol if (!tg.get_EchelonSymbol().equals("")) { AddIntegralModifier(tg, tg.get_EchelonSymbol(), aboveMiddle, -0.20 * csFactor, j, j + 1, true); } //the T1 modifier AddIntegralModifier(tg, tg.get_T1(), aboveMiddle, T1LineFactor * csFactor, j, j + 1, true); if (affiliation != null && affiliation.equals("H")) { //ENY label ptLast = lineutility.MidPointDouble(pt0, pt1, 0); ptLast = lineutility.MidPointDouble(pt0, ptLast, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt0, ptLast, true); //ENY label ptLast = lineutility.MidPointDouble(pt1, pt0, 0); ptLast = lineutility.MidPointDouble(pt1, ptLast, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt1, ptLast, true); } } }//end for loop if (foundSegment == false) { pt0 = new POINT2(); pt1 = new POINT2(); GetBoundaryMiddleSegment(tg, g2d, pt0, pt1); AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, TLineFactor * csFactor, middleSegment, middleSegment + 1, true); //the echelon symbol if (!tg.get_EchelonSymbol().equals("")) { AddIntegralModifier(tg, tg.get_EchelonSymbol(), aboveMiddle, -0.2020 * csFactor, middleSegment, middleSegment + 1, true); } //the T1 modifier AddIntegralModifier(tg, tg.get_T1(), aboveMiddle, T1LineFactor * csFactor, middleSegment, middleSegment + 1, true); if (affiliation != null && affiliation.equals("H")) { //ENY label ptLast = lineutility.MidPointDouble(pt0, pt1, 0); ptLast = lineutility.MidPointDouble(pt0, ptLast, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt0, ptLast, true); //ENY label ptLast = lineutility.MidPointDouble(pt1, pt0, 0); ptLast = lineutility.MidPointDouble(pt1, ptLast, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt1, ptLast, true); } }//end if foundSegment==false } catch (Exception exc) { ErrorLogger.LogException(_className, "AddBoundaryModifiers", new RendererException("Failed inside AddBoundaryModifiers", exc)); } } /** * added for USAS * * @param tg * @param metrics */ private static void AddNameAboveDTG(TGLight tg, FontMetrics metrics) { try { double csFactor = 1; if (tg.get_Client().equals("cpof3d")) { csFactor = 0.667; } String label = GetCenterLabel(tg); POINT2 pt0 = new POINT2(tg.Pixels.get(0)); POINT2 pt1 = new POINT2(tg.Pixels.get(1)); int lastIndex = tg.Pixels.size() - 1; int nextToLastIndex = tg.Pixels.size() - 2; POINT2 ptLast = new POINT2(tg.Pixels.get(lastIndex)); POINT2 ptNextToLast = new POINT2(tg.Pixels.get(nextToLastIndex)); shiftModifierPath(tg, pt0, pt1, ptLast, ptNextToLast); double stringWidth = metrics.stringWidth(label + " " + tg.get_Name()); AddIntegralAreaModifier(tg, label + " " + tg.get_Name(), toEnd, 0, pt0, pt1, false); pt1 = lineutility.ExtendAlongLineDouble(tg.Pixels.get(0), tg.Pixels.get(1), -1.5 * stringWidth); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, label + " " + tg.get_Name(), toEnd, 0, ptLast, ptNextToLast, false); pt0 = tg.Pixels.get(lastIndex); pt1 = lineutility.ExtendAlongLineDouble(tg.Pixels.get(lastIndex), tg.Pixels.get(nextToLastIndex), -1.5 * stringWidth); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } catch (Exception exc) { ErrorLogger.LogException(_className, "AddBoundaryModifiers", new RendererException("Failed inside AddBoundaryModifiers", exc)); } } /** * returns blank string the desired width * * @param metrics * @param width * @return */ private static String blankString(FontMetrics metrics, int width) { String str = ""; try { while (metrics.stringWidth(str) < width) { str += " "; } } catch (Exception exc) { ErrorLogger.LogException(_className, "getLowestSegmentIndex", new RendererException("Failed inside getLowestSegmentIndex", exc)); } return str; } /** * shifts the path for modifiers that use toEnd to prevent vertical paths * * @param tg * @param pt0 * @param pt1 * @param ptLast * @param ptNextToLast */ private static void shiftModifierPath(TGLight tg, POINT2 pt0, POINT2 pt1, POINT2 ptLast, POINT2 ptNextToLast) { try { POINT2 p0 = null, p1 = null; double last = -1.0; switch (tg.get_LineType()) { case TacticalLines.BOUNDARY: for (int j = 0; j < tg.Pixels.size() - 1; j++) { p0 = tg.Pixels.get(j); p1 = tg.Pixels.get(j + 1); //if(p0.x==p1.x) if (Math.abs(p0.x - p1.x) < 1) { p1.x += last; last = -last; } } break; case TacticalLines.PDF: case TacticalLines.PL: case TacticalLines.LOA: case TacticalLines.LOD: case TacticalLines.RELEASE: case TacticalLines.LDLC: case TacticalLines.LL: case TacticalLines.FCL: case TacticalLines.PLD: case TacticalLines.NFL: case TacticalLines.FLOT: case TacticalLines.LC: case TacticalLines.HOLD: case TacticalLines.BRDGHD: case TacticalLines.HOLD_GE: case TacticalLines.BRDGHD_GE: //if (pt0 != null && pt1 != null && pt0.x == pt1.x) if (pt0 != null && pt1 != null && Math.abs(pt0.x - pt1.x) < 1) { pt1.x += 1; } //if (ptLast != null && ptNextToLast != null && ptNextToLast.x == ptLast.x) if (ptLast != null && ptNextToLast != null && Math.abs(ptNextToLast.x - ptLast.x) < 1) { ptNextToLast.x += 1; } break; default: return; } } catch (Exception exc) { ErrorLogger.LogException(_className, "shiftModifierPath", new RendererException("Failed inside shiftModifierPath", exc)); } } /** * Areas with two alternating labels. * * @param tg * @param label * @param eny * @param g2d * @return */ private static boolean areasWithTwoLabels(TGLight tg, String label, String eny, Graphics2D g2d) { boolean result = false; try { switch (tg.get_LineType()) { case TacticalLines.DUMMY: if (!tg.get_Affiliation().equalsIgnoreCase("H")) { eny = ""; } break; default: return false; } FontMetrics metrics = g2d.getFontMetrics(); double labelLength = metrics.stringWidth(label); double enyLength = metrics.stringWidth(eny); int j = 0; POINT2 pt0 = null, pt1 = null, pt2; String last = eny; double dist = 0; int sumLabel = 0, sumENY = 0; for (j = 0; j < tg.Pixels.size() - 1; j++) { if(eny.isEmpty() && last.equalsIgnoreCase(label)) last=eny; if(label.isEmpty() && last.equalsIgnoreCase(eny)) last=label; pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); dist = lineutility.CalcDistanceDouble(pt0, pt1); if (dist > 1.5 * labelLength && last.equalsIgnoreCase(eny)) { last = label; sumLabel++; } else if (dist > 1.5 * enyLength && last.equalsIgnoreCase(label)) { sumENY++; last = eny; } } if (eny.isEmpty()) { if (sumENY < 2) { sumENY = 2; } } //if we don't have at least 2 valid segments for both the label and the ENY then return false if (sumLabel + sumENY < 4) { return false; } //at this point we have valid pixels for alternating labels, i.e. at least one of each will appear for (j = 0; j < tg.Pixels.size() - 1; j++) { if(eny.isEmpty() && last.equalsIgnoreCase(label)) last=eny; if(label.isEmpty() && last.equalsIgnoreCase(eny)) last=label; pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); dist = lineutility.CalcDistanceDouble(pt0, pt1); if (dist > 1.5 * labelLength && last.equalsIgnoreCase(eny)) { //add the label if(!label.isEmpty()) AddIntegralAreaModifier(tg, label, aboveMiddle, 0, pt0, pt1, true); last = label; } else if (dist > 1.5 * enyLength && last.equalsIgnoreCase(label)) { //add the eny if(!eny.isEmpty()) AddIntegralAreaModifier(tg, eny, aboveMiddle, 0, pt0, pt1, true); last = eny; } } return true; } catch (Exception exc) { ErrorLogger.LogException(_className, "areasWithTwoLabels", new RendererException("Failed inside areasWithTwoLabels", exc)); } return result; } /** * don't add affiliation for too short segments * * @param tg * @param g2d */ private static void areasWithENY(TGLight tg, Graphics2D g2d) { try { FontMetrics metrics = g2d.getFontMetrics(); String label = null; int middleSegment = tg.Pixels.size() / 2 - 1; int middleSegment2 = tg.Pixels.size() - 2; int startIndex = 0, j = 0; int linetype = tg.get_LineType(); String affiliation = tg.get_Affiliation(); String echelonSymbol = tg.get_EchelonSymbol(); if (affiliation != null && affiliation.equals("H")) { label = tg.get_N(); } if (tg.Pixels.size() > 3) { middleSegment = tg.Pixels.size() / 4; } if (tg.Pixels.size() > 3) { middleSegment2 = 3 * tg.Pixels.size() / 4; } switch (linetype) { case TacticalLines.DMA: // function is being used for the M label only case TacticalLines.DMAF: case TacticalLines.MINED: label = "M"; break; case TacticalLines.UXO: label = "UXO"; break; case TacticalLines.BATTLE:// index 0 used for echelon case TacticalLines.PNO: if (echelonSymbol != null && !echelonSymbol.isEmpty()) { startIndex = 1; } break; default: break; } if (label == null || label.isEmpty()) { return; } int stringWidth = metrics.stringWidth(label); boolean foundLongSegment = false; double dist = 0; POINT2 pt0 = null, pt1 = null; int n = tg.Pixels.size(); //for (j = startIndex; j < tg.Pixels.size() - 1; j++) for (j = startIndex; j < n - 1; j++) { pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); dist = lineutility.CalcDistanceDouble(pt0, pt1); if (dist > 1.5 * stringWidth) { foundLongSegment = true; AddIntegralAreaModifier(tg, label, aboveMiddle, 0, pt0, pt1, true); } } if (foundLongSegment == false)//we did not find a long enough segment { if (middleSegment != startIndex) { AddIntegralModifier(tg, label, aboveMiddle, 0, middleSegment, middleSegment + 1, true); } AddIntegralModifier(tg, label, aboveMiddle, 0, middleSegment2, middleSegment2 + 1, true); } } catch (Exception exc) { ErrorLogger.LogException(_className, "areasWithENY", new RendererException("Failed inside areasWithENY", exc)); } } private static int getVisibleMiddleSegment(TGLight tg, Rectangle2D clipBounds) { int middleSegment = -1; try { POINT2 pt0 = null, pt1 = null; int j = 0; double dist = 0; POINT2 lastPt = null; boolean doublesBack = false; long lineType = tg.get_LineType(); //we want the middle segment to be visible //middleSegment=tg.Pixels.size() / 2 - 1; middleSegment = (tg.Pixels.size() + 1) / 2 - 1; Boolean foundVisibleSegment = false; if (clipBounds == null) { return middleSegment; } //walk through the segments to find the first visible segment from the middle int n = tg.Pixels.size(); //for (j = middleSegment; j < tg.Pixels.size() - 1; j++) for (j = middleSegment; j < n - 1; j++) { pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); dist = lineutility.CalcDistanceDouble(pt0, pt1); if (dist < 5) { continue; } //diagnostic if (j > 0 && lineType == TacticalLines.BOUNDARY) { if (lastPt == null) { lastPt = tg.Pixels.get(j - 1); } doublesBack = DoublesBack(lastPt, pt0, pt1); if (doublesBack == true) { continue; } lastPt = null; } //if either of the points is within the bound then most of the segment is visible if (clipBounds.contains(pt0.x, pt0.y) || clipBounds.contains(pt1.x, pt1.y)) { middleSegment = j; foundVisibleSegment = true; break; } } if (foundVisibleSegment == false) { for (j = middleSegment; j > 0; j--) { pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j - 1); dist = lineutility.CalcDistanceDouble(pt0, pt1); if (dist < 5) { continue; } //diagnostic if (j > 0 && lineType == TacticalLines.BOUNDARY) { if (lastPt == null) { lastPt = tg.Pixels.get(j - 1); } doublesBack = DoublesBack(lastPt, pt0, pt1); if (doublesBack == true) { continue; } lastPt = null; } //if either of the points is within the bound then most of the segment is visible if (clipBounds.contains(pt0.x, pt0.y) || clipBounds.contains(pt1.x, pt1.y)) { middleSegment = j - 1; foundVisibleSegment = true; break; } } } if (foundVisibleSegment == false) { middleSegment = tg.Pixels.size() / 2 - 1; //middleSegment=-1; } } catch (Exception exc) { ErrorLogger.LogException(_className, "getMiddleSegment", new RendererException("Failed inside getMiddleSegment", exc)); } return middleSegment; } /** * uses array instead of rectangle * * @param tg * @param clipBounds * @return */ private static int getVisibleMiddleSegment(TGLight tg, ArrayList clipBounds) { int middleSegment = -1; try { Polygon clipBoundsPoly = new Polygon(); POINT2 pt0 = null, pt1 = null; int j = 0; int x = 0, y = 0; double dist = 0; POINT2 lastPt = null; long lineType = tg.get_LineType(); boolean doublesBack = false; //we want the middle segment to be visible middleSegment = (tg.Pixels.size() + 1) / 2 - 1; Boolean foundVisibleSegment = false; if (clipBounds == null) { return middleSegment; } for (j = 0; j < clipBounds.size(); j++) { x = (int) ((Point2D) clipBounds.get(j)).getX(); y = (int) ((Point2D) clipBounds.get(j)).getY(); clipBoundsPoly.addPoint(x, y); } //walk through the segments to find the first visible segment from the middle int n = tg.Pixels.size(); //for (j = middleSegment; j < tg.Pixels.size() - 1; j++) for (j = middleSegment; j < n - 1; j++) { pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); dist = lineutility.CalcDistanceDouble(pt0, pt1); if (dist < 5) { continue; } //diagnostic if (j > 0 && lineType == TacticalLines.BOUNDARY) { if (lastPt == null) { lastPt = tg.Pixels.get(j - 1); } doublesBack = DoublesBack(lastPt, pt0, pt1); if (doublesBack == true) { continue; } lastPt = null; } //if either of the points is within the bound then most of the segment is visible if (clipBoundsPoly.contains(pt0.x, pt0.y) || clipBoundsPoly.contains(pt1.x, pt1.y)) { middleSegment = j; foundVisibleSegment = true; break; } } if (foundVisibleSegment == false) { for (j = middleSegment; j > 0; j--) { pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j - 1); dist = lineutility.CalcDistanceDouble(pt0, pt1); if (dist < 5) { continue; } //diagnostic if (j > 0 && lineType == TacticalLines.BOUNDARY) { if (lastPt == null) { lastPt = tg.Pixels.get(j - 1); } doublesBack = DoublesBack(lastPt, pt0, pt1); if (doublesBack == true) { continue; } lastPt = null; } //if either of the points is within the bound then most of the segment is visible if (clipBoundsPoly.contains(pt0.x, pt0.y) || clipBoundsPoly.contains(pt1.x, pt1.y)) { middleSegment = j - 1; foundVisibleSegment = true; break; } } } if (foundVisibleSegment == false) { middleSegment = tg.Pixels.size() / 2 - 1; //middleSegment=-1; } } catch (Exception exc) { ErrorLogger.LogException(_className, "getMiddleSegment", new RendererException("Failed inside getMiddleSegment", exc)); } return middleSegment; } /** * called repeatedly by RemoveModifiers to remove modifiers which fall * outside the symbol MBR * * @param tg * @param modifierType */ private static void removeModifier(TGLight tg, String modifierType) { try { int j = 0; Modifier2 modifier = null; int n = tg.Pixels.size(); //for (j = 0; j < tg.modifiers.size(); j++) for (j = 0; j < n; j++) { modifier = tg.modifiers.get(j); if (modifier.textID == null) { continue; } if (modifier.textID.equalsIgnoreCase(modifierType)) { tg.modifiers.remove(modifier); break; } } } catch (Exception exc) { ErrorLogger.LogException(_className, "removeModifier", new RendererException("Failed inside removeModifier", exc)); } } /** * removes text modifiers for CPOF tactical areas which do not fit inside * the symbol MBR * * @param tg * @param g2d * @param isTextFlipped true if text is flipped from the last segment * orientation * @param iteration the instance count for this modifier */ public static void RemoveModifiers(TGLight tg, Graphics2D g2d, boolean isTextFlipped, int iteration) { try { //CPOF clients only if (!tg.get_Client().equalsIgnoreCase("cpof2d") && !tg.get_Client().equalsIgnoreCase("cpof3d")) { return; } int j = 0; Polygon mbrPoly = null; //if it's a change 1 rectangular area then use the pixels instead of the mbr //because those use aboveMiddle to build angular text switch (tg.get_LineType()) { case TacticalLines.RECTANGULAR: case TacticalLines.ACA_RECTANGULAR: //aboveMiddle modifiers: slanted text case TacticalLines.FFA_RECTANGULAR: case TacticalLines.NFA_RECTANGULAR: case TacticalLines.RFA_RECTANGULAR: case TacticalLines.KILLBOXBLUE_RECTANGULAR: case TacticalLines.KILLBOXPURPLE_RECTANGULAR: case TacticalLines.FSA_RECTANGULAR: case TacticalLines.ATI_RECTANGULAR: case TacticalLines.CFFZ_RECTANGULAR: case TacticalLines.SENSOR_RECTANGULAR: case TacticalLines.CENSOR_RECTANGULAR: case TacticalLines.DA_RECTANGULAR: case TacticalLines.CFZ_RECTANGULAR: case TacticalLines.ZOR_RECTANGULAR: case TacticalLines.TBA_RECTANGULAR: case TacticalLines.TVAR_RECTANGULAR: case TacticalLines.ACA_CIRCULAR: case TacticalLines.CIRCULAR: case TacticalLines.FSA_CIRCULAR: case TacticalLines.ATI_CIRCULAR: case TacticalLines.CFFZ_CIRCULAR: case TacticalLines.SENSOR_CIRCULAR: case TacticalLines.CENSOR_CIRCULAR: case TacticalLines.DA_CIRCULAR: case TacticalLines.CFZ_CIRCULAR: case TacticalLines.ZOR_CIRCULAR: case TacticalLines.TBA_CIRCULAR: case TacticalLines.TVAR_CIRCULAR: case TacticalLines.FFA_CIRCULAR: case TacticalLines.NFA_CIRCULAR: case TacticalLines.RFA_CIRCULAR: case TacticalLines.KILLBOXBLUE_CIRCULAR: case TacticalLines.KILLBOXPURPLE_CIRCULAR: if (tg.modifiers == null || tg.modifiers.isEmpty() || iteration != 1) { return; } mbrPoly = new Polygon(); int n = tg.Pixels.size(); //for (j = 0; j < tg.Pixels.size(); j++) for (j = 0; j < n; j++) { mbrPoly.addPoint((int) tg.Pixels.get(j).x, (int) tg.Pixels.get(j).y); } break; default: //area modifiers: horizontal text if (clsUtility.isClosedPolygon(tg.get_LineType()) == false || iteration != 0) { return; } if (tg.modifiers == null || tg.modifiers.isEmpty()) { return; } mbrPoly = new Polygon(); int t = tg.Pixels.size(); //for (j = 0; j < tg.Pixels.size(); j++) for (j = 0; j < t; j++) { mbrPoly.addPoint((int) tg.Pixels.get(j).x, (int) tg.Pixels.get(j).y); } } Font font = null; font = tg.get_Font(); //might have to change this if (font == null) { font = g2d.getFont(); } g2d.setFont(font); FontMetrics metrics = g2d.getFontMetrics(); double stringWidth = 0, stringHeight = 0; boolean wfits = true, w1fits = true, ww1fits = true, hfits = true, h1fits = true, h2fits = true; Modifier2 modifier = null; String modifierType = ""; String s = ""; POINT2 pt0 = null, pt1 = null, pt2 = null, pt3 = null, pt4 = null; double lineFactor = 0; double x = 0, y = 0; double x1 = 0, y1 = 0, x2 = 0, y2 = 0; //logic as follows: //we have to loop through to determine if each modifiers fits and set its fitsMBR member //then run a 2nd loop to remove groups of modifiers based on whether any of the others do not fit //e.g. if W does not fit then remove W and W1 modifiers int n = tg.modifiers.size(); //for (j = 0; j < tg.modifiers.size(); j++) for (j = 0; j < n; j++) { modifier = tg.modifiers.get(j); if (modifier.textID == null || modifier.textID.isEmpty()) { continue; } modifierType = modifier.textID; lineFactor = modifier.lineFactor; if (isTextFlipped) { lineFactor = -lineFactor; } s = modifier.text; if (s == null || s.equals("")) { continue; } stringWidth = (double) metrics.stringWidth(s) + 1; stringHeight = (double) font.getSize(); if (modifier.type == area) { pt0 = modifier.textPath[0]; x1 = pt0.x; y1 = pt0.y; x = (int) x1 - (int) stringWidth / 2; y = (int) y1 + (int) (stringHeight / 2) + (int) (1.25 * lineFactor * stringHeight); //pt1 = modifier.textPath[1]; x2 = (int) x1 + (int) stringWidth / 2; y2 = (int) y1 + (int) (stringHeight / 2) + (int) (1.25 * lineFactor * stringHeight); if (mbrPoly.contains(x, y) && mbrPoly.contains(x2, y2)) { modifier.fitsMBR = true; } else { modifier.fitsMBR = false; } } else if (modifier.type == aboveMiddle) { pt0 = modifier.textPath[0]; pt1 = modifier.textPath[1]; //double dist=lineutility.CalcDistanceDouble(pt0, pt1); POINT2 ptCenter = lineutility.MidPointDouble(pt0, pt1, 0); pt0 = lineutility.ExtendAlongLineDouble(ptCenter, pt0, stringWidth / 2); pt1 = lineutility.ExtendAlongLineDouble(ptCenter, pt1, stringWidth / 2); if (lineFactor >= 0) { pt2 = lineutility.ExtendDirectedLine(ptCenter, pt0, pt0, 3, Math.abs((lineFactor) * stringHeight)); } else { pt2 = lineutility.ExtendDirectedLine(ptCenter, pt0, pt0, 2, Math.abs((lineFactor) * stringHeight)); } if (lineFactor >= 0) { pt3 = lineutility.ExtendDirectedLine(ptCenter, pt1, pt1, 3, Math.abs((lineFactor) * stringHeight)); } else { pt3 = lineutility.ExtendDirectedLine(ptCenter, pt1, pt1, 2, Math.abs((lineFactor) * stringHeight)); } x1 = pt2.x; y1 = pt2.y; x2 = pt3.x; y2 = pt3.y; if (mbrPoly.contains(x1, y1) && mbrPoly.contains(x2, y2)) { modifier.fitsMBR = true; } else { modifier.fitsMBR = false; } } else { modifier.fitsMBR = true; } } n = tg.modifiers.size(); //for (j = 0; j < tg.modifiers.size(); j++) for (j = 0; j < n; j++) { modifier = tg.modifiers.get(j); if (modifier.textID == null || modifier.textID.isEmpty()) { continue; } if (modifier.fitsMBR == false) { if (modifier.textID.equalsIgnoreCase("W")) { wfits = false; } else if (modifier.textID.equalsIgnoreCase("W1")) { w1fits = false; } else if (modifier.textID.equalsIgnoreCase("W+W1")) { ww1fits = false; } else if (modifier.textID.equalsIgnoreCase("H")) { hfits = false; } else if (modifier.textID.equalsIgnoreCase("H1")) { h1fits = false; } else if (modifier.textID.equalsIgnoreCase("H2")) { h2fits = false; } } } if (wfits == false || w1fits == false) { removeModifier(tg, "W"); removeModifier(tg, "W1"); } if (ww1fits == false) { removeModifier(tg, "W+W1"); } if (hfits == false || h1fits == false || h2fits == false) { removeModifier(tg, "H"); removeModifier(tg, "H1"); removeModifier(tg, "H2"); } } catch (Exception exc) { ErrorLogger.LogException(_className, "RemoveModifeirs", new RendererException("Failed inside RemoveModifiers", exc)); } } /** * Calculates a segment in the pixels middle by length to hold a string. * * @param tg * @param stringWidth * @param segPt0 * @param segPt1 */ private static void getPixelsMiddleSegment(TGLight tg, double stringWidth, POINT2 segPt0, POINT2 segPt1) { try { switch (tg.get_LineType()) { case TacticalLines.CFL: break; default: return; } int totalLength = 0; int j = 0; double dist = 0; double mid = 0; double remainder = 0; POINT2 pt0 = null, pt1 = null, pt2 = null, pt3 = null; POINT2 midPt = null; //first get the total length of all the segments int n = tg.Pixels.size(); //for (j = 0; j < tg.Pixels.size() - 1; j++) for (j = 0; j < n - 1; j++) { dist = lineutility.CalcDistanceDouble(tg.Pixels.get(j), tg.Pixels.get(j + 1)); totalLength += dist; } mid = totalLength / 2; totalLength = 0; //walk thru the segments to find the middle //for (j = 0; j < tg.Pixels.size() - 1; j++) for (j = 0; j < n - 1; j++) { dist = lineutility.CalcDistanceDouble(tg.Pixels.get(j), tg.Pixels.get(j + 1)); totalLength += dist; if (totalLength >= mid)//current segment contains the middle { remainder = totalLength - mid; pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); //calculate the pixels mid point midPt = lineutility.ExtendAlongLineDouble2(pt1, pt0, remainder); pt2 = lineutility.ExtendAlongLineDouble2(midPt, pt0, stringWidth / 2); pt3 = lineutility.ExtendAlongLineDouble2(midPt, pt1, stringWidth / 2); segPt0.x = pt2.x; segPt0.y = pt2.y; segPt1.x = pt3.x; segPt1.y = pt3.y; break; } } } catch (Exception exc) { ErrorLogger.LogException(_className, "getPixelsMidpoint", new RendererException("Failed inside getPixelsMidpoint", exc)); } } private static double getChange1Height(TGLight tg) { double height = 0; try { switch (tg.get_LineType()) { //case TacticalLines.PAA_RECTANGULAR_REVC: //case TacticalLines.PAA_RECTANGULAR: case TacticalLines.FSA_RECTANGULAR: case TacticalLines.FFA_RECTANGULAR: case TacticalLines.ACA_RECTANGULAR: case TacticalLines.NFA_RECTANGULAR: case TacticalLines.RFA_RECTANGULAR: case TacticalLines.ATI_RECTANGULAR: case TacticalLines.CFFZ_RECTANGULAR: case TacticalLines.SENSOR_RECTANGULAR: case TacticalLines.CENSOR_RECTANGULAR: case TacticalLines.DA_RECTANGULAR: case TacticalLines.CFZ_RECTANGULAR: case TacticalLines.ZOR_RECTANGULAR: case TacticalLines.TBA_RECTANGULAR: case TacticalLines.TVAR_RECTANGULAR: case TacticalLines.KILLBOXBLUE_RECTANGULAR: case TacticalLines.KILLBOXPURPLE_RECTANGULAR: break; default: return 0; } double x1 = tg.Pixels.get(0).x; double y1 = tg.Pixels.get(0).y; double x2 = tg.Pixels.get(1).x; double y2 = tg.Pixels.get(1).y; double deltax = x2 - x1; double deltay = y2 - y1; height = Math.sqrt(deltax * deltax + deltay * deltay); } catch (Exception exc) { ErrorLogger.LogException(_className, "getChange1Height", new RendererException("Failed inside getChange1Height", exc)); } return height; } /** * scale the line factor for closed areas * * @param tg */ private static void scaleModifiers(TGLight tg) { try { if (RendererSettings.getInstance().getAutoCollapseModifiers() == false) { return; } if (!tg.get_Client().equalsIgnoreCase("ge")) { return; } //exit if there are no modifiers or it's not a closed area if (tg.modifiers == null || tg.modifiers.isEmpty()) { return; } int linetype = tg.get_LineType(); boolean isClosedPolygon = clsUtility.isClosedPolygon(linetype); boolean isChange1Area = clsUtility.IsChange1Area(linetype, null); if (!isClosedPolygon && !isChange1Area) { return; } switch(linetype) { case TacticalLines.PAA_CIRCULAR: case TacticalLines.PAA_RECTANGULAR: case TacticalLines.PAA_RECTANGULAR_REVC: case TacticalLines.RANGE_FAN: case TacticalLines.RANGE_FAN_SECTOR: return; default: break; } POINT2 ptUl = new POINT2(), ptUr = new POINT2(), ptLr = new POINT2(), ptLl = new POINT2(); GetMBR(tg, ptUl, ptUr, ptLr, ptLl); int sz = tg.get_Font().getSize(); //heightMBR is half the MBR height //double heightMBR=Math.abs(ptLr.y-ptUr.y)/2; double heightMBR = 0; double change1Height = getChange1Height(tg); if (change1Height <= 0) { heightMBR = Math.abs(ptLr.y - ptUr.y) / 2; } else { heightMBR = change1Height; } double heightModifiers = 0; ArrayList<Modifier2> modifiers = tg.modifiers; Modifier2 modifier = null; double minLF = Integer.MAX_VALUE; int j = 0; boolean isValid = false; for (j = 0; j < modifiers.size(); j++) { modifier = modifiers.get(j); //if(modifier.type == area) //type3Area=true; if (modifier.type == toEnd) { continue; } if (modifier.type == aboveMiddle && isChange1Area == false) { continue; } if (modifier.lineFactor < minLF) { minLF = modifier.lineFactor; } isValid = true; } //if there are no 'area' modifiers then exit early if (!isValid) { return; } heightModifiers = Math.abs(minLF) * sz; boolean expandModifiers = false, shrinkModifiers = false; if (heightModifiers > heightMBR) { shrinkModifiers = true; } else if (heightModifiers < 0.5 * heightMBR) { expandModifiers = true; } boolean addEllipsis = false; //modifierE is ellipses modifier Modifier2 modifierE = new Modifier2(); if (expandModifiers) { double factor = heightMBR / heightModifiers; factor = 1 + (factor - 1) / 4; if (factor > 2) { factor = 2; } for (j = 0; j < modifiers.size(); j++) { modifier = modifiers.get(j); if(modifier.type==aboveMiddle) { if(isChange1Area==false) continue; } else if(modifier.type!=area) continue; modifier.lineFactor *= factor; } } else if (shrinkModifiers) { double deltaLF = (heightModifiers - heightMBR) / sz; double newLF = 0; //use maxLF for the ellipsis modifier double maxLF = 0; for (j = 0; j < modifiers.size(); j++) { modifier = modifiers.get(j); if(modifier.type==aboveMiddle) { if(isChange1Area==false) continue; } else if(modifier.type!=area) continue; newLF = modifier.lineFactor + deltaLF; if (Math.abs(newLF * sz) >= heightMBR) { //flag the modifier to remove if (modifier.lineFactor > minLF) { modifierE.type = modifier.type; modifier.type = 7; if (!modifier.text.isEmpty()) { addEllipsis = true; } } modifier.lineFactor = newLF; //modifierE.type=area; //modifierE.type=modifier.type; modifierE.textPath = modifier.textPath; continue; } modifier.lineFactor = newLF; } ArrayList<Modifier2> modifiers2 = new ArrayList(); for (j = 0; j < modifiers.size(); j++) { modifier = modifiers.get(j); if (modifier.type != 7) { if (modifier.lineFactor > maxLF) { maxLF = modifier.lineFactor; } modifiers2.add(modifier); } } if (addEllipsis) { Character letter = (char) 9679; String s = Character.toString(letter); String echelonSymbol = s + s + s; modifierE.text = echelonSymbol; modifierE.lineFactor = maxLF + 1; modifiers2.add(modifierE); } tg.modifiers = modifiers2; } //end shrink modifiers } catch (Exception exc) { ErrorLogger.LogException(_className, "scaleModifiers", new RendererException("Failed inside scaleModifiers", exc)); } } /** * Calculate modifiers identical to addModifiers except use geodesic * calculations for the center point. * * @param tg * @param g2d * @param clipBounds * @param converter */ public static void AddModifiersGeo(TGLight tg, Graphics2D g2d, Object clipBounds, IPointConversion converter) { try { //exit early for those not affected if (tg.Pixels == null || tg.Pixels.isEmpty()) { return; } ArrayList<POINT2> origPoints = null; Font font = tg.get_Font(); boolean shiftLines = Channels.getShiftLines(); boolean usas = false, foundSegment = false; double csFactor = 1d, dist = 0, dist2 = 0;//this will be used for text spacing the 3d map (CommandCight) POINT2 midPt = null; boolean isChange1Area = clsUtility.IsChange1Area(tg.get_LineType(), null); if (isChange1Area) { return; } Rectangle2D clipRect = null; ArrayList<Point2D> clipArray = null; if (clipBounds != null && ArrayList.class.isAssignableFrom(clipBounds.getClass())) { clipArray = (ArrayList<Point2D>) clipBounds; } if (clipBounds != null && Rectangle2D.Double.class.isAssignableFrom(clipBounds.getClass())) { clipRect = (Rectangle2D.Double) clipBounds; } FontMetrics metrics = g2d.getFontMetrics(); int stringWidth = 0, stringWidth2 = 0; String dash = ""; if (tg.get_DTG() != null && tg.get_DTG1() != null && tg.get_DTG().isEmpty() == false && tg.get_DTG1().isEmpty() == false) { dash = " - "; } if (tg.get_Client().equals("cpof3d")) { csFactor = 0.9d; } switch (tg.get_LineType()) { case TacticalLines.DUMMY: case TacticalLines.SERIES: case TacticalLines.ALT: case TacticalLines.ONEWAY: case TacticalLines.TWOWAY: case TacticalLines.DHA: case TacticalLines.EPW: case TacticalLines.UXO: case TacticalLines.FARP: case TacticalLines.BSA: case TacticalLines.DSA: case TacticalLines.RSA: case TacticalLines.THUNDERSTORMS: case TacticalLines.ICING: case TacticalLines.FREEFORM: case TacticalLines.RHA: case TacticalLines.MSR: case TacticalLines.ASR: case TacticalLines.LINTGT: case TacticalLines.LINTGTS: case TacticalLines.FPF: case TacticalLines.GAP: case TacticalLines.DEPICT: case TacticalLines.AIRHEAD: case TacticalLines.CONVOY: case TacticalLines.HCONVOY: case TacticalLines.FSA: case TacticalLines.DIRATKAIR: case TacticalLines.OBJ: case TacticalLines.EA1: case TacticalLines.AO: case TacticalLines.ACA: case TacticalLines.FFA: case TacticalLines.NFA: case TacticalLines.RFA: case TacticalLines.ATI: case TacticalLines.CFFZ: case TacticalLines.CFZ: case TacticalLines.TBA: case TacticalLines.TVAR: case TacticalLines.KILLBOXBLUE: case TacticalLines.KILLBOXPURPLE: case TacticalLines.ZOR: case TacticalLines.DA: case TacticalLines.SENSOR: case TacticalLines.CENSOR: case TacticalLines.SMOKE: case TacticalLines.BATTLE: case TacticalLines.PNO: case TacticalLines.PDF: case TacticalLines.FEBA: case TacticalLines.NAI: case TacticalLines.TAI: case TacticalLines.ATKPOS: case TacticalLines.ASSAULT: case TacticalLines.WFZ: case TacticalLines.OBSFAREA: case TacticalLines.OBSAREA: case TacticalLines.ROZ: case TacticalLines.FAADZ: case TacticalLines.HIDACZ: case TacticalLines.MEZ: case TacticalLines.LOMEZ: case TacticalLines.HIMEZ: case TacticalLines.SAAFR: case TacticalLines.AC: case TacticalLines.MRR: case TacticalLines.UAV: case TacticalLines.MRR_USAS: case TacticalLines.UAV_USAS: case TacticalLines.LLTR: case TacticalLines.AIRFIELD: case TacticalLines.GENERAL: case TacticalLines.FORT: case TacticalLines.ENCIRCLE: case TacticalLines.ASSY: case TacticalLines.EA: case TacticalLines.DZ: case TacticalLines.EZ: case TacticalLines.LZ: case TacticalLines.PZ: case TacticalLines.BOUNDARY: case TacticalLines.DMA: case TacticalLines.DMAF: case TacticalLines.MINED: case TacticalLines.PL: case TacticalLines.FCL: case TacticalLines.LOA: case TacticalLines.LOD: case TacticalLines.LL: case TacticalLines.RELEASE: case TacticalLines.LDLC: case TacticalLines.PLD: case TacticalLines.NFL: case TacticalLines.MFP: case TacticalLines.FSCL: case TacticalLines.CFL: case TacticalLines.RFL: case TacticalLines.FLOT: case TacticalLines.LC: case TacticalLines.CATK: case TacticalLines.CATKBYFIRE: case TacticalLines.AAFNT: case TacticalLines.DIRATKFNT: case TacticalLines.IL: case TacticalLines.DRCL: case TacticalLines.RETIRE: case TacticalLines.WITHDRAW: case TacticalLines.WDRAWUP: case TacticalLines.BEARING: case TacticalLines.ELECTRO: case TacticalLines.ACOUSTIC: case TacticalLines.TORPEDO: case TacticalLines.OPTICAL: case TacticalLines.RIP: case TacticalLines.BOMB: case TacticalLines.BELT: case TacticalLines.BELT1: case TacticalLines.ZONE: case TacticalLines.AT: case TacticalLines.STRONG: case TacticalLines.MSDZ: case TacticalLines.SCREEN: case TacticalLines.COVER: case TacticalLines.GUARD: case TacticalLines.SCREEN_REVC: case TacticalLines.COVER_REVC: case TacticalLines.GUARD_REVC: case TacticalLines.DELAY: case TacticalLines.TGMF: case TacticalLines.GENERIC: case TacticalLines.BS_LINE: case TacticalLines.BS_AREA: case TacticalLines.BBS_LINE: case TacticalLines.BBS_AREA: origPoints = lineutility.getDeepCopy(tg.Pixels); break; default: //exit early for those not applicable return; } double factor = 1;//10d/tg.get_Font().getSize(); int linetype = tg.get_LineType(); int j = 0, k = 0; double x = 0, y = 0; if (tg.get_Font() != null && tg.get_Font().getSize() > 0) { factor = 10d / tg.get_Font().getSize(); } else { return; } int lastIndex = tg.Pixels.size() - 1; int nextToLastIndex = tg.Pixels.size() - 2; POINT2 pt0 = new POINT2(tg.Pixels.get(0)); POINT2 pt1 = null; POINT2 pt2 = null, pt3 = null; POINT2 ptLast = new POINT2(tg.Pixels.get(lastIndex)); POINT2 ptNextToLast = null; if (lastIndex > 0) { ptNextToLast = new POINT2(tg.Pixels.get(lastIndex - 1)); } if (tg.Pixels.size() > 1) { pt1 = new POINT2(tg.Pixels.get(1)); } //prevent vertical paths for modifiers that use toEnd shiftModifierPath(tg, pt0, pt1, ptLast, ptNextToLast); String label = GetCenterLabel(tg); Object[] pts = tg.Pixels.toArray(); //need this for areas and some lines POINT2 ptCenter = mdlGeodesic.geodesic_center(tg.LatLongs); if (ptCenter == null) { ptCenter = lineutility.CalcCenterPointDouble2(pts, pts.length); } else { Point2D pt = converter.GeoToPixels(new armyc2.c2sd.graphics2d.Point2D.Double(ptCenter.x, ptCenter.y)); ptCenter.x = pt.getX(); ptCenter.y = pt.getY(); } int middleSegment = (tg.Pixels.size() + 1) / 2 - 1; if (clipRect != null) { middleSegment = getVisibleMiddleSegment(tg, clipRect); } else if (clipArray != null) { middleSegment = getVisibleMiddleSegment(tg, clipArray); } String affiliation = tg.get_Affiliation(); if (tg.Pixels.size() > 2) { pt2 = tg.Pixels.get(2); } if (tg.Pixels.size() > 3) { pt3 = tg.Pixels.get(3); } double TLineFactor = 0, T1LineFactor = 0; POINT2 lr = new POINT2(tg.Pixels.get(0)); POINT2 ll = new POINT2(tg.Pixels.get(0)); POINT2 ul = new POINT2(tg.Pixels.get(0)); POINT2 ur = new POINT2(tg.Pixels.get(0)); int index = 0; int nextIndex = 0; int size = tg.Pixels.size(); Line2D line = null; switch (linetype) { case TacticalLines.GENERIC: AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, 0, middleSegment, middleSegment + 1, true); break; case TacticalLines.DUMMY: if(areasWithTwoLabels(tg,tg.get_H(),tg.get_N(),g2d)==true) break; if (affiliation != null && affiliation.equals("H")) { AddIntegralModifier(tg, tg.get_N(), aboveMiddle, 0, 0, 1, true); AddIntegralModifier(tg, tg.get_N(), aboveMiddle, 0, lastIndex / 2, lastIndex / 2 + 1, true); } if (lastIndex > 3) { line = clsUtility.getExtendedLine(tg, lastIndex / 2 - 1, font.getSize()); pt0 = new POINT2(line.getX1(), line.getY1()); pt1 = new POINT2(line.getX2(), line.getY2()); AddModifier2(tg, tg.get_H(), aboveMiddle, 0, pt0, pt1, true); } line = clsUtility.getExtendedLine(tg, lastIndex / 2 + 1, font.getSize()); pt0 = new POINT2(line.getX1(), line.getY1()); pt1 = new POINT2(line.getX2(), line.getY2()); AddModifier2(tg, tg.get_H(), aboveMiddle, 0, pt0, pt1, true); break; case TacticalLines.SERIES: //begin by assuming the 0th point is the highest point y = pt0.y; index = 0; for (j = 1; j < size - 1; j++) { if (tg.Pixels.get(j).y < y) { y = tg.Pixels.get(j).y; index = j; } if (index > 0) { if (tg.Pixels.get(index - 1).y < tg.Pixels.get(index + 1).y) { nextIndex = index - 1; } else { nextIndex = index + 1; } } if (index == 0) { if (pt1.y < ptNextToLast.y) { nextIndex = 1; } else { nextIndex = nextToLastIndex; } } } AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, 0, index, nextIndex, true); break; case TacticalLines.SCREEN: case TacticalLines.COVER: case TacticalLines.GUARD: stringWidth = (int) (1.5 * (double) metrics.stringWidth(label)); pt0 = new POINT2(tg.Pixels.get(0)); pt0.x += 2 * stringWidth; pt1 = new POINT2(tg.Pixels.get(0)); pt1.x -= 2 * stringWidth; AddIntegralAreaModifier(tg, label, area, 0, pt0, pt0, true); AddIntegralAreaModifier(tg, label, area, 0, pt1, pt1, true); break; case TacticalLines.SCREEN_REVC: case TacticalLines.COVER_REVC: case TacticalLines.GUARD_REVC: stringWidth = (int) (1.5 * (double) metrics.stringWidth(label)); pt1 = new POINT2(tg.Pixels.get(1)); //pt1.x+=2*stringWidth; pt2 = new POINT2(tg.Pixels.get(2)); //pt2.x-=2*stringWidth; AddIntegralAreaModifier(tg, label, area, 0, pt1, pt1, true); AddIntegralAreaModifier(tg, label, area, 0, pt2, pt2, true); break; case TacticalLines.MFP: pt0 = tg.Pixels.get(middleSegment); pt1 = tg.Pixels.get(middleSegment + 1); AddIntegralModifier(tg, label, aboveMiddle, 0, middleSegment, middleSegment + 1, true); AddIntegralModifier(tg, tg.get_DTG(), aboveMiddle, 1 * factor * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, tg.get_DTG1(), aboveMiddle, 2 * factor * csFactor, middleSegment, middleSegment + 1, false); break; case TacticalLines.ALT: stringWidth = (int) (1.5 * (double) metrics.stringWidth("ALT")); stringWidth2 = (int) (1.5 * (double) metrics.stringWidth(label + tg.get_Name())); if (stringWidth2 > stringWidth) { stringWidth = stringWidth2; } foundSegment = false; for (j = 0; j < tg.Pixels.size() - 1; j++) { pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); dist = lineutility.CalcDistanceDouble(pt0, pt1); if (dist < stringWidth) { continue; } else { if (pt0.x < pt1.x || (pt0.x == pt1.x && pt0.y > pt1.y)) { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -3.5 * factor * csFactor, j, j + 1, false); AddIntegralModifier(tg, "ALT", aboveMiddle, -1.5 * factor * csFactor, j, j + 1, true); } else { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -2 * factor * csFactor, j, j + 1, false); AddIntegralModifier(tg, "ALT", aboveMiddle, 0.7 * csFactor, j, j + 1, true); } foundSegment = true; } } if (foundSegment == false) { pt0 = tg.Pixels.get(middleSegment); pt1 = tg.Pixels.get(middleSegment + 1); if (pt0.x < pt1.x || (pt0.x == pt1.x && pt0.y > pt1.y)) { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -3.5 * factor * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "ALT", aboveMiddle, -1.5 * factor * csFactor, middleSegment, middleSegment + 1, true); } else { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -2 * factor * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "ALT", aboveMiddle, 0.7 * csFactor, middleSegment, middleSegment + 1, true); } } break; case TacticalLines.ONEWAY: stringWidth = (int) (1.5 * (double) metrics.stringWidth(label + tg.get_Name())); foundSegment = false; for (j = 0; j < tg.Pixels.size() - 1; j++) { pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); dist = lineutility.CalcDistanceDouble(pt0, pt1); if (dist < stringWidth) { continue; } else { if (pt0.x < pt1.x || (pt0.x == pt1.x && pt0.y > pt1.y)) { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -3 * factor * csFactor, j, j + 1, false); } else { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -2 * factor * csFactor, j, j + 1, false); } foundSegment = true; } } if (foundSegment == false) { pt0 = tg.Pixels.get(middleSegment); pt1 = tg.Pixels.get(middleSegment + 1); if (pt0.x < pt1.x || (pt0.x == pt1.x && pt0.y > pt1.y)) { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -3 * factor * csFactor, middleSegment, middleSegment + 1, false); } else { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -2 * factor * csFactor, middleSegment, middleSegment + 1, false); } } break; case TacticalLines.TWOWAY: stringWidth = (int) (1.5 * (double) metrics.stringWidth(label + tg.get_Name())); foundSegment = false; for (j = 0; j < tg.Pixels.size() - 1; j++) { pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); dist = lineutility.CalcDistanceDouble(pt0, pt1); if (dist < stringWidth) { continue; } else { if (pt0.x < pt1.x || (pt0.x == pt1.x && pt0.y > pt1.y)) { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -4.5 * factor * csFactor, j, j + 1, false); } else { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -2 * factor * csFactor, j, j + 1, false); } foundSegment = true; } } if (foundSegment == false) { pt0 = tg.Pixels.get(middleSegment); pt1 = tg.Pixels.get(middleSegment + 1); if (pt0.x < pt1.x || (pt0.x == pt1.x && pt0.y > pt1.y)) { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -4.5 * factor * csFactor, middleSegment, middleSegment + 1, false); } else { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -2 * factor * csFactor, middleSegment, middleSegment + 1, false); } } break; case TacticalLines.DHA: AddIntegralAreaModifier(tg, "DETAINEE", area, -1.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, "HOLDING", area, -0.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, "AREA", area, 0.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 1.5 * csFactor, ptCenter, ptCenter, false); break; case TacticalLines.EPW: AddIntegralAreaModifier(tg, "EPW", area, -1.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, "HOLDING", area, -0.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, "AREA", area, 0.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 1.5 * csFactor, ptCenter, ptCenter, false); break; case TacticalLines.UXO: areasWithENY(tg, g2d); break; case TacticalLines.FARP: case TacticalLines.BSA: case TacticalLines.DSA: case TacticalLines.RSA: AddIntegralAreaModifier(tg, label, area, -0.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0.5 * csFactor, ptCenter, ptCenter, false); break; case TacticalLines.THUNDERSTORMS: case TacticalLines.ICING: case TacticalLines.FREEFORM: AddAreaModifier(tg, tg.get_H(), area, -0.5, ptCenter, ptCenter, "H"); AddAreaModifier(tg, tg.get_H1(), area, 0.5, ptCenter, ptCenter, "H1"); break; case TacticalLines.RHA: AddIntegralAreaModifier(tg, "REFUGEE", area, -1.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, "HOLDING", area, -0.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, "AREA", area, 0.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 1.5 * csFactor, ptCenter, ptCenter, false); break; case TacticalLines.MSR: case TacticalLines.ASR: //AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -1*csFactor, middleSegment, middleSegment + 1,false); foundSegment = false; for (j = 0; j < tg.Pixels.size() - 1; j++) { pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); stringWidth = (int) (1.5 * (double) metrics.stringWidth(label + tg.get_Name())); dist = lineutility.CalcDistanceDouble(pt0, pt1); if (dist < stringWidth) { continue; } else { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -1 * csFactor, j, j + 1, false); foundSegment = true; } } if (foundSegment == false) { AddIntegralModifier(tg, label + tg.get_Name(), aboveMiddle, -1 * csFactor, middleSegment, middleSegment + 1, false); } break; case TacticalLines.LINTGT: AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, -0.8 * csFactor, middleSegment, middleSegment + 1, false); break; case TacticalLines.LINTGTS: AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, -0.8 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, label, aboveMiddle, 0.8 * csFactor, middleSegment, middleSegment + 1, false); break; case TacticalLines.FPF: AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, -1 * csFactor, 0, 1, false); AddIntegralModifier(tg, label, aboveMiddle, 1 * csFactor, 0, 1, false); AddIntegralModifier(tg, tg.get_T1(), aboveMiddle, 2 * csFactor, 0, 1, false); break; case TacticalLines.GAP: if (tg.Pixels.get(1).y > tg.Pixels.get(0).y) { pt0 = tg.Pixels.get(1); pt1 = tg.Pixels.get(3); pt2 = tg.Pixels.get(0); pt3 = tg.Pixels.get(2); } else { pt0 = tg.Pixels.get(0); pt1 = tg.Pixels.get(2); pt2 = tg.Pixels.get(1); pt3 = tg.Pixels.get(3); } pt2 = lineutility.ExtendAlongLineDouble2(pt0, pt2, -20); pt3 = lineutility.ExtendAlongLineDouble2(pt1, pt3, -20); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, 0, pt2, pt3, false); break; case TacticalLines.DEPICT: //use the highest point for H modifier GetMBR(tg, ul, ur, lr, ll); AddIntegralAreaModifier(tg, tg.get_H(), aboveMiddle, -1.5 * factor * csFactor, ul, ur, false); AddIntegralAreaModifier(tg, tg.get_DTG(), aboveMiddle, 1.5 * factor * csFactor, ll, lr, false); areasWithENY(tg, g2d); break; case TacticalLines.AIRHEAD: GetMBR(tg, ul, ur, lr, ll); AddIntegralAreaModifier(tg, label, aboveMiddle, 1.35 * factor * csFactor, ll, lr, false); //AddIntegralAreaModifier(tg, tg.get_Name(), aboveMiddle, 1.1 * (factor * csFactor + csFactor), ll, lr, false); break; case TacticalLines.CONVOY: case TacticalLines.HCONVOY: String convoyBlankString = blankString(metrics, 35); AddIntegralModifier(tg, tg.get_H() + convoyBlankString + tg.get_H1(), aboveMiddle, 0, 0, 1, false); AddIntegralModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, 1.2 * csFactor, 0, 1, false); break; case TacticalLines.DIRATKAIR: if (affiliation != null && affiliation.equals("H")) { k = tg.Pixels.size(); j = lineutility.GetDirAtkAirMiddleSegment((POINT2[]) tg.Pixels.toArray(new POINT2[tg.Pixels.size()]), tg.Pixels.size()); pt1 = tg.Pixels.get(k - j - 1); pt0 = tg.Pixels.get(k - j); dist = lineutility.CalcDistanceDouble(pt0, pt1); pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, 2 * dist / 3); AddModifier2(tg, tg.get_N(), aboveMiddle, 0, pt0, pt1, true); } break; case TacticalLines.OBJ: case TacticalLines.EA1: case TacticalLines.AO: AddIntegralAreaModifier(tg, label + tg.get_Name(), area, 0, ptCenter, ptCenter, false); break; case TacticalLines.ACA: AddIntegralAreaModifier(tg, label, area, -3 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, -2 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, "MIN ALT: " + tg.get_H(), area, -1 * csFactor, ptCenter, ptCenter, false, "H"); AddIntegralAreaModifier(tg, "MAX ALT: " + tg.get_H1(), area, 0, ptCenter, ptCenter, false, "H1"); AddIntegralAreaModifier(tg, "Grids: " + tg.get_H2(), area, 1 * csFactor, ptCenter, ptCenter, false, "H2"); AddIntegralAreaModifier(tg, "EFF: " + tg.get_DTG(), area, 2 * csFactor, ptCenter, ptCenter, false, "W"); AddIntegralAreaModifier(tg, tg.get_DTG1(), area, 3 * csFactor, ptCenter, ptCenter, false, "W1"); break; case TacticalLines.FFA: case TacticalLines.RFA: case TacticalLines.KILLBOXBLUE: AddIntegralAreaModifier(tg, label, area, -1 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), area, 1 * csFactor, ptCenter, ptCenter, false, "W+W1"); break; case TacticalLines.KILLBOXPURPLE: AddIntegralAreaModifier(tg, label, area, -1 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), area, 1 * csFactor, ptCenter, ptCenter, false, "W+W1"); AddIntegralAreaModifier(tg, tg.get_H1(), area, 2 * csFactor, ptCenter, ptCenter, false); break; case TacticalLines.NFA: AddIntegralAreaModifier(tg, label, area, -1 * csFactor, ptCenter, ptCenter, true); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, true); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), area, 1 * csFactor, ptCenter, ptCenter, true, "W+W1"); break; case TacticalLines.FSA: AddIntegralAreaModifier(tg, label + " " + tg.get_Name(), area, 0, ptCenter, ptCenter, false); //AddIntegralAreaModifier(tg, tg.get_Name(), area, 1 * csFactor, ptCenter, ptCenter, false); GetMBR(tg, ul, ur, lr, ll); POINT2 ptLeftFSA = ul; POINT2 ptRightFSA = ur; if (tg.get_Client().equalsIgnoreCase("ge")) { ptLeftFSA.x -= font.getSize() / 2; ptRightFSA.x -= font.getSize() / 2; } AddIntegralAreaModifier(tg, tg.get_DTG(), toEnd, 0.5 * csFactor, ptLeftFSA, ptRightFSA, false, "W"); AddIntegralAreaModifier(tg, tg.get_DTG1(), toEnd, 1.5 * csFactor, ptLeftFSA, ptRightFSA, false, "W1"); break; case TacticalLines.ATI: case TacticalLines.CFFZ: case TacticalLines.CFZ: case TacticalLines.TBA: case TacticalLines.TVAR: case TacticalLines.ZOR: case TacticalLines.DA: case TacticalLines.SENSOR: case TacticalLines.CENSOR: AddIntegralAreaModifier(tg, label, area, 0, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 1 * csFactor, ptCenter, ptCenter, false); GetMBR(tg, ul, ur, lr, ll); POINT2 ptLeft = ul; POINT2 ptRight = ur; if (tg.get_Client().equalsIgnoreCase("ge")) { ptLeft.x -= font.getSize() / 2; ptRight.x -= font.getSize() / 2; } AddIntegralAreaModifier(tg, tg.get_DTG(), toEnd, 0.5 * csFactor, ptLeft, ptRight, false, "W"); AddIntegralAreaModifier(tg, tg.get_DTG1(), toEnd, 1.5 * csFactor, ptLeft, ptRight, false, "W1"); break; case TacticalLines.SMOKE: AddIntegralAreaModifier(tg, label, area, 0, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), area, 1 * csFactor, ptCenter, ptCenter, false, "W+W1"); break; case TacticalLines.BATTLE: AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); AddIntegralModifier(tg, tg.get_EchelonSymbol(), aboveMiddle, -0.20 * csFactor, 0, 1, true); areasWithENY(tg, g2d); break; case TacticalLines.PNO: AddIntegralAreaModifier(tg, label + tg.get_Name(), area, 0, ptCenter, ptCenter, false); AddIntegralModifier(tg, tg.get_EchelonSymbol(), aboveMiddle, -0.20 * csFactor, 0, 1, true); areasWithENY(tg, g2d); break; case TacticalLines.PDF: pt1 = lineutility.ExtendAlongLineDouble(pt1, pt0, -22, 0); AddIntegralAreaModifier(tg, label, area, 0, pt1, pt1, false); break; case TacticalLines.FEBA: stringWidth = metrics.stringWidth(label); pt1 = new POINT2(pt0); pt1.x -= stringWidth + 8; AddIntegralAreaModifier(tg, label, area, 0, pt1, pt1, false); pt1 = new POINT2(ptLast); pt1.x += 40; AddIntegralAreaModifier(tg, label, area, 0, pt1, pt1, false); break; case TacticalLines.NAI: case TacticalLines.TAI: case TacticalLines.ATKPOS: AddIntegralAreaModifier(tg, label, area, -0.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0.5 * csFactor, ptCenter, ptCenter, false); break; case TacticalLines.ASSAULT: AddIntegralAreaModifier(tg, "ASLT", area, -1 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, "PSN", area, 0, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 1 * csFactor, ptCenter, ptCenter, false); break; case TacticalLines.WFZ: AddIntegralAreaModifier(tg, label, area, -1.5 * csFactor, ptCenter, ptCenter, true); AddIntegralAreaModifier(tg, tg.get_Name(), area, -0.5 * csFactor, ptCenter, ptCenter, true); AddIntegralAreaModifier(tg, "TIME FROM: " + tg.get_DTG(), area, 0.5 * csFactor, ptCenter, ptCenter, true, "W"); AddIntegralAreaModifier(tg, "TIME TO: " + tg.get_DTG1(), area, 1.5 * csFactor, ptCenter, ptCenter, true, "W1"); break; case TacticalLines.OBSFAREA: AddIntegralAreaModifier(tg, label, area, -1.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, -0.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_DTG(), area, 0.5 * csFactor, ptCenter, ptCenter, false, "W"); AddIntegralAreaModifier(tg, tg.get_DTG1(), area, 1.5 * csFactor, ptCenter, ptCenter, false, "W1"); break; case TacticalLines.OBSAREA: AddIntegralAreaModifier(tg, tg.get_Name(), area, -1 * csFactor, ptCenter, ptCenter, true); AddIntegralAreaModifier(tg, tg.get_DTG(), area, 0, ptCenter, ptCenter, true, "W"); AddIntegralAreaModifier(tg, tg.get_DTG1(), area, 1 * csFactor, ptCenter, ptCenter, true, "W1"); break; case TacticalLines.ROZ: case TacticalLines.FAADZ://SHOADZ for rev C case TacticalLines.HIDACZ: case TacticalLines.MEZ: case TacticalLines.LOMEZ: case TacticalLines.HIMEZ: AddIntegralAreaModifier(tg, label, area, -2.5, ptCenter, ptCenter, false, ""); AddIntegralAreaModifier(tg, tg.get_Name(), area, -1.5, ptCenter, ptCenter, false, "T"); AddIntegralAreaModifier(tg, "MIN ALT: " + tg.get_H(), area, -0.5, ptCenter, ptCenter, false, "H"); AddIntegralAreaModifier(tg, "MAX ALT: " + tg.get_H1(), area, 0.5, ptCenter, ptCenter, false, "H1"); AddIntegralAreaModifier(tg, "TIME FROM: " + tg.get_DTG(), area, 1.5, ptCenter, ptCenter, false, "W"); AddIntegralAreaModifier(tg, "TIME TO: " + tg.get_DTG1(), area, 2.5, ptCenter, ptCenter, false, "W1"); break; case TacticalLines.SAAFR: pt0 = new POINT2(tg.Pixels.get(middleSegment)); dist=pt0.style/tg.get_Font().getSize(); dist /= 2; if (tg.getSymbologyStandard() == RendererSettings.Symbology_2525C) { AddIntegralModifier(tg, "SAAFR " + tg.get_Name(), aboveMiddle, 0, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Max Alt: " + tg.get_H1(), aboveMiddle, -4 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Min Alt: " + tg.get_H(), aboveMiddle, -5 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Width: " + tg.get_H2(), aboveMiddle, -6 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Name: " + tg.get_Name(), aboveMiddle, -7 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "DTG Start: " + tg.get_DTG(), aboveMiddle, -3 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "DTG End: " + tg.get_DTG1(), aboveMiddle, -2 * csFactor-dist, middleSegment, middleSegment + 1, false); } else { AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, 0, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Max Alt: " + tg.get_H1(), aboveMiddle, -2 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Min Alt: " + tg.get_H(), aboveMiddle, -3 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Width: " + tg.get_H2(), aboveMiddle, -4 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Name: " + tg.get_Name(), aboveMiddle, -5 * csFactor-dist, middleSegment, middleSegment + 1, false); } break; case TacticalLines.AC: pt0 = new POINT2(tg.Pixels.get(middleSegment)); dist=pt0.style/tg.get_Font().getSize(); dist /= 2; if (tg.getSymbologyStandard() == RendererSettings.Symbology_2525C) { AddIntegralModifier(tg, label + " " + tg.get_Name(), aboveMiddle, 0, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Max Alt: " + tg.get_H1(), aboveMiddle, -4 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Min Alt: " + tg.get_H(), aboveMiddle, -5 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Width: " + tg.get_H2(), aboveMiddle, -6 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Name: " + tg.get_Name(), aboveMiddle, -7 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "DTG Start: " + tg.get_DTG(), aboveMiddle, -3 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "DTG End: " + tg.get_DTG1(), aboveMiddle, -2 * csFactor-dist, middleSegment, middleSegment + 1, false); } else { //AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, -0.5 * csFactor-dist, middleSegment, middleSegment + 1, false); //AddIntegralModifier(tg, tg.get_T1(), aboveMiddle, 0.5 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, -1.0 * csFactor-dist, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, tg.get_T1(), aboveMiddle, 1.0 * csFactor-dist, middleSegment, middleSegment + 1, false); } break; case TacticalLines.MRR_USAS: case TacticalLines.UAV_USAS: case TacticalLines.MRR: case TacticalLines.UAV: case TacticalLines.LLTR: if (tg.getSymbologyStandard() == RendererSettings.Symbology_2525C) { AddIntegralModifier(tg, label + " " + tg.get_Name(), aboveMiddle, 0, middleSegment, middleSegment + 1, false); pt0 = new POINT2(tg.Pixels.get(middleSegment)); pt1 = new POINT2(tg.Pixels.get(middleSegment + 1)); if (pt0.y < pt1.y) { pt1.y = pt0.y; } else { pt0.y = pt1.y; } pt0.y -= pt0.style / 2; pt1.y -= pt0.style / 2; AddIntegralAreaModifier(tg, "Max Alt: " + tg.get_H1(), aboveMiddle, -4 * csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, "Min Alt: " + tg.get_H(), aboveMiddle, -5 * csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, "Width: " + tg.get_H2(), aboveMiddle, -6 * csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, "Name: " + tg.get_Name(), aboveMiddle, -7 * csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, "DTG Start: " + tg.get_DTG(), aboveMiddle, -3 * csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, "DTG End: " + tg.get_DTG1(), aboveMiddle, -2 * csFactor, pt0, pt1, false); } else { AddIntegralModifier(tg, label, aboveMiddle, -0.5, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, 0.5, middleSegment, middleSegment + 1, false); } break; case TacticalLines.AIRFIELD: areasWithENY(tg, g2d); break; case TacticalLines.GENERAL: areasWithENY(tg, g2d); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); break; case TacticalLines.FORT: case TacticalLines.ENCIRCLE: if (affiliation != null && affiliation.equals("H")) { AddIntegralModifier(tg, tg.get_N(), aboveMiddle, 0, 0, 1, true); AddIntegralModifier(tg, tg.get_N(), aboveMiddle, 0, middleSegment, middleSegment + 1, true); } break; case TacticalLines.ASSY: case TacticalLines.EA: case TacticalLines.DZ: case TacticalLines.EZ: case TacticalLines.LZ: case TacticalLines.PZ: areasWithENY(tg, g2d); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, label, area, -1 * csFactor, ptCenter, ptCenter, false); break; case TacticalLines.BOUNDARY: if (clipRect != null) { AddBoundaryModifiers(tg, g2d, clipRect); } else if (clipArray != null) { AddBoundaryModifiers(tg, g2d, clipArray); } else { AddBoundaryModifiers(tg, g2d, (Rectangle2D) null); } break; case TacticalLines.DMA: case TacticalLines.DMAF: areasWithENY(tg, g2d); if (affiliation != null && affiliation.equals("H")) { pt1 = lineutility.MidPointDouble(pt0, pt1, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt0, pt1, true); if (middleSegment != 0) { pt0 = tg.Pixels.get(middleSegment); pt1 = tg.Pixels.get(middleSegment + 1); pt1 = lineutility.MidPointDouble(pt0, pt1, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt0, pt1, true); } } break; case TacticalLines.MINED: areasWithENY(tg, g2d); if (affiliation != null && affiliation.equals("H")) { pt1 = lineutility.MidPointDouble(pt0, pt1, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt0, pt1, true); if (middleSegment != 0) { pt0 = tg.Pixels.get(middleSegment); pt1 = tg.Pixels.get(middleSegment + 1); pt1 = lineutility.MidPointDouble(pt0, pt1, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt0, pt1, true); } } break; case TacticalLines.PL: AddIntegralAreaModifier(tg, label + tg.get_Name(), toEnd, T1LineFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, label + tg.get_Name(), toEnd, T1LineFactor, ptLast, ptNextToLast, false); break; case TacticalLines.BS_LINE: case TacticalLines.BBS_LINE: if (tg.get_T1() == null || tg.get_T1().isEmpty()) { AddIntegralAreaModifier(tg, tg.get_Name(), toEnd, T1LineFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, tg.get_Name(), toEnd, T1LineFactor, ptLast, ptNextToLast, false); } else { if (tg.get_T1().equalsIgnoreCase("1")) { for (j = 0; j < tg.Pixels.size() - 1; j++) { AddIntegralAreaModifier(tg, tg.get_Name(), aboveMiddle, 0, tg.Pixels.get(j), tg.Pixels.get(j + 1), false); } } else if (tg.get_T1().equalsIgnoreCase("2")) { AddIntegralAreaModifier(tg, tg.get_Name(), toEnd, T1LineFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, tg.get_Name(), toEnd, T1LineFactor, ptLast, ptNextToLast, false); } else if (tg.get_T1().equalsIgnoreCase("3")) { //either end of the polyline dist = lineutility.CalcDistanceDouble(pt0, pt1); stringWidth = metrics.stringWidth(tg.get_Name()); stringWidth /= 2; pt2 = lineutility.ExtendAlongLineDouble2(pt1, pt0, dist + stringWidth); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, pt2, pt2, false); dist = lineutility.CalcDistanceDouble(ptNextToLast, ptLast); pt2 = lineutility.ExtendAlongLineDouble2(ptNextToLast, ptLast, dist + stringWidth); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, pt2, pt2, false); //the intermediate points for (j = 1; j < tg.Pixels.size() - 1; j++) { AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, tg.Pixels.get(j), tg.Pixels.get(j), false); } } else //t1 is set inadvertantly or for other graphics { AddIntegralAreaModifier(tg, tg.get_Name(), toEnd, T1LineFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, tg.get_Name(), toEnd, T1LineFactor, ptLast, ptNextToLast, false); } } break; case TacticalLines.BS_AREA: case TacticalLines.BBS_AREA: AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); break; case TacticalLines.LOA: case TacticalLines.LOD: case TacticalLines.LDLC: if (!tg.get_Name().isEmpty()) { AddIntegralAreaModifier(tg, "(PL " + tg.get_Name() + ")", toEnd, 1 * csFactor, pt0, pt1, false); } AddIntegralAreaModifier(tg, label, toEnd, 0, pt0, pt1, false); if (!tg.get_Name().isEmpty()) { AddIntegralAreaModifier(tg, "(PL " + tg.get_Name() + ")", toEnd, 1 * csFactor, ptLast, ptNextToLast, false); } AddIntegralAreaModifier(tg, label, toEnd, 0, ptLast, ptNextToLast, false); break; case TacticalLines.RELEASE: AddIntegralAreaModifier(tg, label, toEnd, -csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, label, toEnd, -csFactor, ptLast, ptNextToLast, false); break; case TacticalLines.LL: case TacticalLines.FCL: case TacticalLines.PLD: //uncomment one line for USAS usas = true; if (usas == false) { AddIntegralAreaModifier(tg, "(PL " + tg.get_Name() + ")", toEnd, 1 * csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, label, toEnd, 0, pt0, pt1, false); AddIntegralAreaModifier(tg, "(PL " + tg.get_Name() + ")", toEnd, 1 * csFactor, ptLast, ptNextToLast, false); AddIntegralAreaModifier(tg, label, toEnd, 0, ptLast, ptNextToLast, false); } else { //AddNameAboveDTG(tg,metrics); AddIntegralAreaModifier(tg, label, toEnd, -csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, label, toEnd, -csFactor, ptLast, ptNextToLast, false); } break; case TacticalLines.NFL: //uncomment one line for usas usas = true; if (usas == false) { AddIntegralAreaModifier(tg, "(PL " + tg.get_Name() + ")", toEnd, 1 * csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, label, toEnd, 0, pt0, pt1, false); AddIntegralAreaModifier(tg, "(PL " + tg.get_Name() + ")", toEnd, 1 * csFactor, ptLast, ptNextToLast, false); AddIntegralAreaModifier(tg, label, toEnd, 0, ptLast, ptNextToLast, false); } else { //AddNameAboveDTG(tg,metrics); AddIntegralAreaModifier(tg, label, toEnd, -csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, label, toEnd, -csFactor, ptLast, ptNextToLast, false); } break; case TacticalLines.FSCL: pt0 = tg.Pixels.get(0); pt1 = tg.Pixels.get(1); pt2 = tg.Pixels.get(tg.Pixels.size() - 1); pt3 = tg.Pixels.get(tg.Pixels.size() - 2); dist = lineutility.CalcDistanceDouble(pt0, pt1); dist2 = lineutility.CalcDistanceDouble(pt2, pt3); stringWidth = (int) ((double) metrics.stringWidth(tg.get_Name() + " " + label)); stringWidth2 = (int) ((double) metrics.stringWidth(tg.get_DTG())); if (stringWidth2 > stringWidth) { stringWidth = stringWidth2; } if (tg.Pixels.size() == 2) //one segment { pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, 1.0 * stringWidth);//was 1.7 AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); if (dist > 3.5 * stringWidth)//was 28stringwidth+5 { pt0 = tg.Pixels.get(tg.Pixels.size() - 1); pt1 = tg.Pixels.get(tg.Pixels.size() - 2); pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, 1.0 * stringWidth);//was 1.7 AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } } else //more than one semgent { double dist3 = lineutility.CalcDistanceDouble(pt0, pt2); if (dist > stringWidth + 5 || dist >= dist2 || dist3 > stringWidth + 5) { pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, 1.0 * stringWidth);//was 1.7 AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } if (dist2 > stringWidth + 5 || dist2 > dist || dist3 > stringWidth + 5) { pt0 = tg.Pixels.get(tg.Pixels.size() - 1); pt1 = tg.Pixels.get(tg.Pixels.size() - 2); pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, 1.0 * stringWidth);//was 1.7 AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } } break; case TacticalLines.CFL: stringWidth = (int) ((double) metrics.stringWidth(label + tg.get_Name())); stringWidth2 = (int) ((double) metrics.stringWidth(tg.get_DTG() + dash + tg.get_DTG1())); if (stringWidth2 > stringWidth) { stringWidth = stringWidth2; } pt0 = new POINT2(tg.Pixels.get(middleSegment)); pt1 = new POINT2(tg.Pixels.get(middleSegment + 1)); getPixelsMiddleSegment(tg, stringWidth, pt0, pt1); AddModifier2(tg, label + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); break; case TacticalLines.RFL: pt0 = tg.Pixels.get(0); pt1 = tg.Pixels.get(1); pt2 = tg.Pixels.get(tg.Pixels.size() - 1); pt3 = tg.Pixels.get(tg.Pixels.size() - 2); dist = lineutility.CalcDistanceDouble(pt0, pt1); dist2 = lineutility.CalcDistanceDouble(pt2, pt3); stringWidth = (int) ((double) metrics.stringWidth(label + " " + tg.get_Name())); stringWidth2 = (int) ((double) metrics.stringWidth(tg.get_DTG())); if (stringWidth2 > stringWidth) { stringWidth = stringWidth2; } if (tg.Pixels.size() == 2) //one segment { pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, 1.0 * stringWidth);//was 1.7 AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); if (dist > 3.5 * stringWidth)//was 2*stringwidth+5 { pt0 = tg.Pixels.get(tg.Pixels.size() - 1); pt1 = tg.Pixels.get(tg.Pixels.size() - 2); pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, 1.0 * stringWidth);//was 1.7 AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } } else //more than one semgent { double dist3 = lineutility.CalcDistanceDouble(pt0, pt2); if (dist > stringWidth + 5 || dist >= dist2 || dist3 > stringWidth + 5) { pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, 1.0 * stringWidth);//was 1.7 AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } if (dist2 > stringWidth + 5 || dist2 > dist || dist3 > stringWidth + 5) { pt0 = tg.Pixels.get(tg.Pixels.size() - 1); pt1 = tg.Pixels.get(tg.Pixels.size() - 2); pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, 1.0 * stringWidth);//was 1.7 AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } } break; case TacticalLines.FLOT://if usas then ENY has to be above or below by quadrant AddIntegralAreaModifier(tg, label, toEnd, 0, pt0, pt1, false); if (affiliation != null && affiliation.equals("H")) { AddIntegralAreaModifier(tg, tg.get_N(), toEnd, -1 * csFactor, pt0, pt1, false); } AddIntegralAreaModifier(tg, label, toEnd, 0, ptLast, ptNextToLast, false); if (affiliation != null && affiliation.equals("H")) { AddIntegralAreaModifier(tg, tg.get_N(), toEnd, -1 * csFactor, ptLast, ptNextToLast, false); } break; case TacticalLines.LC: double shiftFactor = 1d; if (shiftLines) { shiftFactor = 0.5d; } if (affiliation != null && affiliation.equals("H")) { if (pt0.x < pt1.x) { TLineFactor = -shiftFactor;//was -1 } else { TLineFactor = shiftFactor;//was 1 } AddIntegralAreaModifier(tg, tg.get_N(), toEnd, TLineFactor, pt0, pt1, false); if (ptNextToLast.x < ptLast.x) { TLineFactor = -shiftFactor;//was -1 } else { TLineFactor = shiftFactor;//was 1 } AddIntegralAreaModifier(tg, tg.get_N(), toEnd, TLineFactor, ptLast, ptNextToLast, false); } break; case TacticalLines.CATK: AddIntegralModifier(tg, label, aboveMiddle, 0, 1, 0, false); break; case TacticalLines.CATKBYFIRE: stringWidth = (int) (1.5 * (double) metrics.stringWidth(label)); pt2 = lineutility.ExtendAlongLineDouble(pt0, pt1, stringWidth); AddModifier2(tg, label, aboveMiddle, 0, pt1, pt2, false); break; case TacticalLines.DIRATKFNT: AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, -0.7 * csFactor, 1, 0, false); break; case TacticalLines.AAFNT: midPt = lineutility.MidPointDouble(tg.Pixels.get(lastIndex - 1), tg.Pixels.get(nextToLastIndex - 1), 0); AddIntegralAreaModifier(tg, tg.get_Name(), aboveMiddle, 0, tg.Pixels.get(lastIndex - 1), midPt, false); break; case TacticalLines.IL: AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, 0, 1, 0, false); break; case TacticalLines.DRCL: AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, 0, 1, 0, true); break; case TacticalLines.RETIRE: case TacticalLines.WITHDRAW: case TacticalLines.WDRAWUP: AddIntegralModifier(tg, label, aboveMiddle, 0, 0, 1, true); break; case TacticalLines.BEARING: case TacticalLines.ELECTRO: case TacticalLines.ACOUSTIC: case TacticalLines.TORPEDO: case TacticalLines.OPTICAL: AddIntegralAreaModifier(tg, label, aboveMiddle, 0, tg.Pixels.get(0), tg.Pixels.get(1), true); break; case TacticalLines.RIP: case TacticalLines.BOMB: case TacticalLines.TGMF: AddIntegralAreaModifier(tg, label, area, 0, ptCenter, ptCenter, true); break; case TacticalLines.BELT: AddIntegralAreaModifier(tg, tg.get_Name(), area, -0.5 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_T1(), area, 0.5 * csFactor, ptCenter, ptCenter, false); break; case TacticalLines.BELT1: AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, 0, middleSegment, middleSegment + 1, false); break; case TacticalLines.ZONE: case TacticalLines.AT: AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); break; case TacticalLines.STRONG: AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); AddIntegralModifier(tg, tg.get_EchelonSymbol(), aboveMiddle, 0, 0, 1, true); break; case TacticalLines.MSDZ: AddIntegralAreaModifier(tg, "1", area, 0, pt1, pt1, true); AddIntegralAreaModifier(tg, "2", area, 0, pt2, pt2, true); AddIntegralAreaModifier(tg, "3", area, 0, pt3, pt3, true); break; case TacticalLines.RECTANGULAR: case TacticalLines.CIRCULAR: AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, pt0, pt0, false); break; case TacticalLines.DELAY: AddIntegralModifier(tg, tg.get_DTG(), aboveMiddle, -1 * csFactor, 0, 1, false); AddIntegralModifier(tg, label, aboveMiddle, 0, 0, 1, true); break; default: break; } scaleModifiers(tg); tg.Pixels = origPoints; } catch (Exception exc) { ErrorLogger.LogException(_className, "AddModifiersGeo", new RendererException("Failed inside AddModifiersGeo", exc)); } } /** * RFA, NFA, FFA need these for line spacing * * @param tg * @return */ private static int getRFALines(TGLight tg) { int lines = 1; try { if (tg.get_Name() != null && !tg.get_Name().isEmpty()) { lines++; } if (tg.get_DTG() != null && !tg.get_DTG().isEmpty()) { lines++; } else if (tg.get_DTG1() != null && !tg.get_DTG1().isEmpty()) { lines++; } switch (tg.get_LineType()) { case TacticalLines.KILLBOXBLUE_RECTANGULAR: case TacticalLines.KILLBOXPURPLE_RECTANGULAR: if (tg.get_H1() != null && !tg.get_H1().isEmpty()) { lines++; } break; default: break; } } catch (Exception exc) { ErrorLogger.LogException(_className, "AddModifiers", new RendererException("Failed inside AddModifiers", exc)); } return lines; } /** * Added sector range fan modifiers based using the calculated orientation * indicator points * * @param tg * @param converter * @return */ public static boolean addSectorModifiers(TGLight tg, IPointConversion converter) { try { int linetype = tg.get_LineType(); if (linetype != TacticalLines.RANGE_FAN_SECTOR) { return false; } ArrayList<Double> AM = new ArrayList(); ArrayList<Double> AN = new ArrayList(); //get the number of sectors String H2 = tg.get_H2(); String H1 = tg.get_H1(); String T1 = tg.get_T1(); String T = tg.get_Name(); //String[] altitudes = H1.split(","); String[] altitudes = null; String[] am = T1.split(","); String[] az = T.split(","); double min = 0, max = 0; //diagnostic double left=0,right=0; //end section int numSectors = az.length / 2; //there must be at least one sector if (numSectors < 1) { return false; } if (!H1.isEmpty()) { altitudes = H1.split(","); } try { for (int k = 0; k < am.length; k++) { min = Double.parseDouble(am[k]); AM.add(min); } } catch (NumberFormatException e) { return false; } //diagnostic try { for (int k = 0; k < az.length/2; k++) { left = Double.parseDouble(az[2*k]); right = Double.parseDouble(az[2*k+1]); AN.add(left); AN.add(right); } } catch (NumberFormatException e) { return false; } //end section if (numSectors + 1 > AM.size()) { if (Double.parseDouble(am[0]) != 0d) { AM.add(0, 0d); } } int n = tg.Pixels.size(); //pt0 and pt1 are points for the location indicator POINT2 pt0 = tg.Pixels.get(n - 5); POINT2 pt1 = tg.Pixels.get(n - 4); Point2D pt02d = new Point2D.Double(pt0.x, pt0.y); Point2D pt12d = new Point2D.Double(pt1.x, pt1.y); pt02d = converter.PixelsToGeo(pt02d); pt12d = converter.PixelsToGeo(pt12d); pt0.x = pt02d.getX(); pt0.y = pt02d.getY(); pt1.x = pt12d.getX(); pt1.y = pt12d.getY(); //azimuth of the orientation indicator double az12 = mdlGeodesic.GetAzimuth(pt0, pt1); POINT2 pt2 = null; ArrayList<POINT2> locModifier = new ArrayList(); //diagnostic POINT2 ptLeft=null,ptRight=null; ArrayList<POINT2> locAZModifier = new ArrayList(); //end section Point2D pt22d = null; double radius = 0; for (int k = 0; k < numSectors; k++) { if (AM.size() < k + 2) { break; } radius = (AM.get(k) + AM.get(k + 1)) / 2; pt2 = mdlGeodesic.geodesic_coordinate(pt0, radius, az12); //need locModifier in geo pixels pt22d = new Point2D.Double(pt2.x, pt2.y); pt22d = converter.GeoToPixels(pt22d); pt2.x = pt22d.getX(); pt2.y = pt22d.getY(); locModifier.add(pt2); //diagnostic if(tg.get_HideOptionalLabels()) continue; ptLeft = mdlGeodesic.geodesic_coordinate(pt0, radius, AN.get(2*k)); //need ptLeft in geo pixels pt22d = new Point2D.Double(ptLeft.x, ptLeft.y); pt22d = converter.GeoToPixels(pt22d); ptLeft.x = pt22d.getX(); ptLeft.y = pt22d.getY(); ptRight = mdlGeodesic.geodesic_coordinate(pt0, radius, AN.get(2*k+1)); //need ptRight in geo pixels pt22d = new Point2D.Double(ptRight.x, ptRight.y); pt22d = converter.GeoToPixels(pt22d); ptRight.x = pt22d.getX(); ptRight.y = pt22d.getY(); locAZModifier.add(ptLeft); locAZModifier.add(ptRight); //end section } if (altitudes != null) { for (int k = 0; k < altitudes.length; k++) { if (k >= locModifier.size()) { break; } pt0 = locModifier.get(k); AddAreaModifier(tg, "ALT " + altitudes[k], area, 0, pt0, pt0); } } //diagnostic add range and azimuth modifiers //add early eixt if tg.setRangeFanAZLabels is false if(tg.get_HideOptionalLabels()) return true; for(int k=0;k<numSectors;k++) { pt0 = locModifier.get(k); AddAreaModifier(tg, "RG " + AM.get(k+1), area, -1, pt0, pt0); ptLeft=locAZModifier.get(2*k); ptRight=locAZModifier.get(2*k+1); AddAreaModifier(tg, az[2*k], area, 0, ptLeft, ptLeft); AddAreaModifier(tg, az[2*k+1], area, 0, ptRight, ptRight); } //end section } catch (Exception exc) { ErrorLogger.LogException(_className, "addSectorModifiers", new RendererException("Failed inside addSectorModifiers", exc)); } return true; } /** * Called by the renderer after tg.Pixels has been filled with the * calculated points. The modifier path depends on points calculated by * CELineArray. * * @param tg */ public static void AddModifiers2(TGLight tg) { try { if (tg.Pixels == null || tg.Pixels.isEmpty()) { return; } switch (tg.get_LineType()) { case TacticalLines.BS_RECTANGLE: case TacticalLines.BBS_RECTANGLE: case TacticalLines.BREACH: case TacticalLines.BYPASS: case TacticalLines.CANALIZE: case TacticalLines.PENETRATE: case TacticalLines.CLEAR: case TacticalLines.DISRUPT: case TacticalLines.FIX: case TacticalLines.ISOLATE: case TacticalLines.OCCUPY: case TacticalLines.RETAIN: case TacticalLines.SECURE: case TacticalLines.CONTAIN: case TacticalLines.SEIZE: case TacticalLines.SEIZE_REVC: case TacticalLines.CORDONKNOCK: case TacticalLines.CORDONSEARCH: case TacticalLines.FOLLA: case TacticalLines.FOLSP: case TacticalLines.ACA_RECTANGULAR: case TacticalLines.ACA_CIRCULAR: case TacticalLines.RECTANGULAR: case TacticalLines.CIRCULAR: case TacticalLines.BBS_POINT: case TacticalLines.FSA_CIRCULAR: case TacticalLines.ATI_CIRCULAR: case TacticalLines.CFFZ_CIRCULAR: case TacticalLines.SENSOR_CIRCULAR: case TacticalLines.CENSOR_CIRCULAR: case TacticalLines.DA_CIRCULAR: case TacticalLines.CFZ_CIRCULAR: case TacticalLines.ZOR_CIRCULAR: case TacticalLines.TBA_CIRCULAR: case TacticalLines.TVAR_CIRCULAR: case TacticalLines.FFA_CIRCULAR: case TacticalLines.NFA_CIRCULAR: case TacticalLines.RFA_CIRCULAR: case TacticalLines.KILLBOXBLUE_CIRCULAR: case TacticalLines.KILLBOXPURPLE_CIRCULAR: case TacticalLines.BLOCK: case TacticalLines.HOLD: case TacticalLines.BRDGHD: case TacticalLines.HOLD_GE: case TacticalLines.BRDGHD_GE: case TacticalLines.FFA_RECTANGULAR: case TacticalLines.NFA_RECTANGULAR: case TacticalLines.RFA_RECTANGULAR: case TacticalLines.KILLBOXBLUE_RECTANGULAR: case TacticalLines.KILLBOXPURPLE_RECTANGULAR: case TacticalLines.FSA_RECTANGULAR: case TacticalLines.ATI_RECTANGULAR: case TacticalLines.CFFZ_RECTANGULAR: case TacticalLines.SENSOR_RECTANGULAR: case TacticalLines.CENSOR_RECTANGULAR: case TacticalLines.DA_RECTANGULAR: case TacticalLines.CFZ_RECTANGULAR: case TacticalLines.ZOR_RECTANGULAR: case TacticalLines.TBA_RECTANGULAR: case TacticalLines.TVAR_RECTANGULAR: case TacticalLines.PAA_RECTANGULAR: case TacticalLines.PAA_RECTANGULAR_REVC: case TacticalLines.PAA_CIRCULAR: case TacticalLines.RANGE_FAN: case TacticalLines.RANGE_FAN_SECTOR: break; default: return; } //end section ArrayList<POINT2> origPoints = lineutility.getDeepCopy(tg.Pixels); int n = tg.Pixels.size(); if (tg.modifiers == null) { tg.modifiers = new ArrayList(); } Font font = tg.get_Font(); POINT2 ptCenter = null; double csFactor = 1d;//this will be used for text spacing the 3d map (CommandCight) //String affiliation=tg.get_Affiliation(); int linetype = tg.get_LineType(); POINT2 pt0 = null, pt1 = null, pt2 = null, pt3 = null; int j = 0, k = 0; double dist = 0; String label = GetCenterLabel(tg); String[] H1 = null; int lastIndex = tg.Pixels.size() - 1; int nextToLastIndex = 0; if (tg.Pixels.size() > 1) { nextToLastIndex = tg.Pixels.size() - 2; } POINT2 ptLast = new POINT2(tg.Pixels.get(lastIndex)); POINT2 ptNextToLast = null; if (tg.Pixels.size() > 1) { ptNextToLast = new POINT2(tg.Pixels.get(nextToLastIndex)); } String dash = ""; if (tg.get_DTG() != null && tg.get_DTG1() != null && tg.get_DTG().isEmpty() == false && tg.get_DTG1().isEmpty() == false) { dash = " - "; } POINT2 ptLeft = null, ptRight = null; BufferedImage bi = new BufferedImage(8, 8, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bi.createGraphics(); FontMetrics metrics = g2d.getFontMetrics(); int stringWidth = 0, rfaLines = 0; pt0 = new POINT2(tg.Pixels.get(0)); if (tg.Pixels.size() > 1) { pt1 = new POINT2(tg.Pixels.get(1)); } POINT2[] pts = null; // if the client is the 3d map (CS) then we want to shrink the spacing bnetween // the lines of text if (tg.get_Client().equals("cpof3d")) { csFactor = 0.9d; } shiftModifierPath(tg, pt0, pt1, ptLast, ptNextToLast); if (tg.getSymbologyStandard() == RendererSettings.Symbology_2525C) { switch (linetype) { case TacticalLines.BS_RECTANGLE: case TacticalLines.BBS_RECTANGLE: pts = new POINT2[4]; for (j = 0; j < 4; j++) { pts[j] = tg.Pixels.get(j); } ptCenter = lineutility.CalcCenterPointDouble2(pts, 4); AddIntegralAreaModifier(tg, tg.get_Name(), area, -0.125 * csFactor, ptCenter, ptCenter, false); break; case TacticalLines.BREACH: case TacticalLines.BYPASS: case TacticalLines.CANALIZE: pt0 = tg.Pixels.get(1); pt1 = tg.Pixels.get(2); //pt1=lineutility.ExtendAlongLineDouble(pt1, pt0, -10); AddIntegralAreaModifier(tg, label, aboveMiddle, -0.125 * csFactor, pt0, pt1, true); break; case TacticalLines.PENETRATE: case TacticalLines.CLEAR: pt0 = tg.Pixels.get(2); pt1 = tg.Pixels.get(3); //pt1=lineutility.ExtendAlongLineDouble(pt1, pt0, -10); AddIntegralAreaModifier(tg, label, aboveMiddle, -0.125 * csFactor, pt0, pt1, true); break; case TacticalLines.DISRUPT: pt0 = tg.Pixels.get(4); pt1 = tg.Pixels.get(5); //pt1=lineutility.ExtendAlongLineDouble(pt1, pt0, -10); AddIntegralAreaModifier(tg, label, aboveMiddle, -0.125 * csFactor, pt0, pt1, true); break; case TacticalLines.FIX: pt0 = tg.Pixels.get(0); pt1 = tg.Pixels.get(1); //pt1=lineutility.ExtendAlongLineDouble(pt1, pt0, -10); AddIntegralAreaModifier(tg, label, aboveMiddle, -0.125 * csFactor, pt0, pt1, true); break; case TacticalLines.ISOLATE: case TacticalLines.OCCUPY: case TacticalLines.RETAIN: case TacticalLines.SECURE: pt0 = tg.Pixels.get(13); pt1 = tg.Pixels.get(14); //pt1=lineutility.ExtendAlongLineDouble(pt1, pt0, -10); AddIntegralAreaModifier(tg, label, aboveMiddle, -0.125 * csFactor, pt0, pt1, true); break; case TacticalLines.CONTAIN: pt0 = tg.Pixels.get(13); pt1 = tg.Pixels.get(14); //pt1=lineutility.ExtendAlongLineDouble(pt1, pt0, -10); AddIntegralAreaModifier(tg, "C", aboveMiddle, -0.125 * csFactor, pt0, pt1, true); break; case TacticalLines.SEIZE: case TacticalLines.SEIZE_REVC: pt0 = tg.Pixels.get(26); pt1 = tg.Pixels.get(27); //pt1=lineutility.ExtendAlongLineDouble(pt1, pt0, -10); AddIntegralAreaModifier(tg, label, aboveMiddle, -0.125 * csFactor, pt0, pt1, true); break; default: break; } } switch (linetype) { case TacticalLines.CORDONKNOCK: case TacticalLines.CORDONSEARCH: pt0 = tg.Pixels.get(13); pt1 = tg.Pixels.get(0); stringWidth = metrics.stringWidth(label); if (pt0.x < pt1.x) { stringWidth = -stringWidth; } pt1 = lineutility.ExtendAlongLineDouble2(pt0, pt1, 0.75 * stringWidth); AddIntegralAreaModifier(tg, label, aboveMiddle, 0, pt0, pt1, true); break; case TacticalLines.FOLLA: pt0 = tg.Pixels.get(0); pt1 = lineutility.MidPointDouble(tg.Pixels.get(5), tg.Pixels.get(6), 0); pt1 = lineutility.ExtendAlongLineDouble(pt1, pt0, -10); AddIntegralAreaModifier(tg, tg.get_Name(), aboveMiddle, 0, pt0, pt1, true); break; case TacticalLines.FOLSP: pt0 = tg.Pixels.get(3); pt1 = tg.Pixels.get(6); pt1 = lineutility.ExtendAlongLineDouble(pt1, pt0, -10); AddIntegralAreaModifier(tg, tg.get_Name(), aboveMiddle, 0, pt0, pt1, true); break; case TacticalLines.ACA_RECTANGULAR: ptLeft = lineutility.MidPointDouble(tg.Pixels.get(0), tg.Pixels.get(1), 0); ptRight = lineutility.MidPointDouble(tg.Pixels.get(2), tg.Pixels.get(3), 0); AddModifier2(tg, label, aboveMiddle, -3 * csFactor, ptLeft, ptRight, false); AddModifier2(tg, tg.get_Name(), aboveMiddle, -2 * csFactor, ptLeft, ptRight, false); AddModifier2(tg, "MIN ALT: " + tg.get_H(), aboveMiddle, -1 * csFactor, ptLeft, ptRight, false, "H"); AddModifier2(tg, "MAX ALT: " + tg.get_H1(), aboveMiddle, 0, ptLeft, ptRight, false, "H1"); AddModifier2(tg, "Grids: " + tg.get_H2(), aboveMiddle, 1 * csFactor, ptLeft, ptRight, false, "H2"); AddModifier2(tg, "EFF: " + tg.get_DTG(), aboveMiddle, 2 * csFactor, ptLeft, ptRight, false, "W"); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 3 * csFactor, ptLeft, ptRight, false, "W1"); break; case TacticalLines.ACA_CIRCULAR: ptCenter = lineutility.CalcCenterPointDouble2(tg.Pixels.toArray(), tg.Pixels.size()); AddIntegralAreaModifier(tg, label, area, -3 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, -2 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, "MIN ALT: " + tg.get_H(), area, -1 * csFactor, ptCenter, ptCenter, false, "H"); AddIntegralAreaModifier(tg, "MAX ALT: " + tg.get_H1(), area, 0, ptCenter, ptCenter, false, "H1"); AddIntegralAreaModifier(tg, "Grids: " + tg.get_H2(), area, 1 * csFactor, ptCenter, ptCenter, false, "H2"); AddIntegralAreaModifier(tg, "EFF: " + tg.get_DTG(), area, 2 * csFactor, ptCenter, ptCenter, false, "W"); AddIntegralAreaModifier(tg, tg.get_DTG1(), area, 3 * csFactor, ptCenter, ptCenter, false, "W1"); break; case TacticalLines.RECTANGULAR: case TacticalLines.CIRCULAR: case TacticalLines.BBS_POINT: ptCenter = lineutility.CalcCenterPointDouble2(tg.Pixels.toArray(), tg.Pixels.size()); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); break; case TacticalLines.FSA_CIRCULAR: case TacticalLines.ATI_CIRCULAR: case TacticalLines.CFFZ_CIRCULAR: case TacticalLines.SENSOR_CIRCULAR: case TacticalLines.CENSOR_CIRCULAR: case TacticalLines.DA_CIRCULAR: case TacticalLines.CFZ_CIRCULAR: case TacticalLines.ZOR_CIRCULAR: case TacticalLines.TBA_CIRCULAR: case TacticalLines.TVAR_CIRCULAR: ptCenter = lineutility.MidPointDouble(tg.Pixels.get(0), tg.Pixels.get(tg.Pixels.size() / 2), 0); AddIntegralAreaModifier(tg, label, area, -1 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); AddOffsetModifier(tg, tg.get_DTG(), toEnd, -1 * csFactor, tg.Pixels.size() / 2, 0, 4, "left"); AddOffsetModifier(tg, tg.get_DTG1(), toEnd, 0, tg.Pixels.size() / 2, 0, 4, "left"); break; case TacticalLines.FFA_CIRCULAR: case TacticalLines.NFA_CIRCULAR: case TacticalLines.RFA_CIRCULAR: rfaLines = getRFALines(tg); ptCenter = lineutility.MidPointDouble(tg.Pixels.get(0), tg.Pixels.get(51), 0); switch (rfaLines) { case 3: //2 valid modifiers and a label AddIntegralAreaModifier(tg, label, area, -1 * csFactor, ptCenter, ptCenter, true); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, true); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), area, 1 * csFactor, ptCenter, ptCenter, true, "W+W1"); break; case 2: //one valid modifier and a label AddIntegralAreaModifier(tg, label, area, -0.5 * csFactor, ptCenter, ptCenter, true); if (tg.get_Name() != null && !tg.get_Name().isEmpty()) { AddIntegralAreaModifier(tg, tg.get_Name(), area, 0.5 * csFactor, ptCenter, ptCenter, true); } else { AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), area, 0.5 * csFactor, ptCenter, ptCenter, true, "W+W1"); } break; default: //one label only AddIntegralAreaModifier(tg, label, area, 0, ptCenter, ptCenter, true); break; } break; case TacticalLines.KILLBOXBLUE_CIRCULAR: case TacticalLines.KILLBOXPURPLE_CIRCULAR: rfaLines = getRFALines(tg); ptCenter = lineutility.CalcCenterPointDouble2(tg.Pixels.toArray(), tg.Pixels.size()); switch (rfaLines) { case 4: //2 valid modifiers and a label AddIntegralAreaModifier(tg, label, area, -1 * csFactor, ptCenter, ptCenter, true); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, true); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), area, 1 * csFactor, ptCenter, ptCenter, true, "W+W1"); AddIntegralAreaModifier(tg, tg.get_H1(), area, 2 * csFactor, ptCenter, ptCenter, true, "H1"); break; case 3: //2 valid modifiers and a label AddIntegralAreaModifier(tg, label, area, -1 * csFactor, ptCenter, ptCenter, true); AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, true); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), area, 1 * csFactor, ptCenter, ptCenter, true, "W+W1"); break; case 2: //one valid modifier and a label AddIntegralAreaModifier(tg, label, area, -0.5 * csFactor, ptCenter, ptCenter, true); if (tg.get_Name() != null && !tg.get_Name().isEmpty()) { AddIntegralAreaModifier(tg, tg.get_Name(), area, 0.5 * csFactor, ptCenter, ptCenter, true); } else { AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), area, 0.5 * csFactor, ptCenter, ptCenter, true, "W+W1"); } break; default: //one label only AddIntegralAreaModifier(tg, label, area, 0, ptCenter, ptCenter, true); break; } break; case TacticalLines.BLOCK: //for (j = 0; j < tg.Pixels.size(); j++) for (j = 0; j < n; j++) { if (tg.Pixels.get(j).style == 14) { AddIntegralModifier(tg, label, aboveMiddle, 0, j, j + 1); break; } } break; case TacticalLines.CONTAIN: //for (j = 0; j < tg.Pixels.size(); j++) for (j = 0; j < n; j++) { if (tg.Pixels.get(j).style == 14) { pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); AddIntegralAreaModifier(tg, label, aboveMiddle, 0, pt0, pt1, true); break; } } break; case TacticalLines.HOLD: case TacticalLines.BRDGHD: case TacticalLines.HOLD_GE: case TacticalLines.BRDGHD_GE: if (ptLast.x < pt0.x) { pt1 = new POINT2(ptLast); ptLast = new POINT2(pt0); pt0 = new POINT2(pt1); } stringWidth = metrics.stringWidth(label); pt1 = new POINT2(pt0); pt1.x -= stringWidth / 1.5; pt1.y -= font.getSize() / 2; AddIntegralAreaModifier(tg, label, area, 0, pt1, pt1, false); pt1 = new POINT2(ptLast); pt1.x += stringWidth / 1.5; pt1.y -= font.getSize() / 2; AddIntegralAreaModifier(tg, label, area, 0, pt1, pt1, false); break; case TacticalLines.FFA_RECTANGULAR: case TacticalLines.NFA_RECTANGULAR: case TacticalLines.RFA_RECTANGULAR: rfaLines = getRFALines(tg); pt0 = lineutility.MidPointDouble(tg.Pixels.get(0), tg.Pixels.get(1), 0); pt1 = lineutility.MidPointDouble(tg.Pixels.get(2), tg.Pixels.get(3), 0); switch (rfaLines) { case 3: //two valid modifiers and one label AddModifier2(tg, label, aboveMiddle, -1 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_Name(), aboveMiddle, 0, pt0, pt1, false); AddModifier2(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, 1 * csFactor, pt0, pt1, false, "W+W1"); break; case 2: //one valid modifier and one label AddModifier2(tg, label, aboveMiddle, -0.5 * csFactor, pt0, pt1, false); if (tg.get_Name() != null && !tg.get_Name().isEmpty()) { AddModifier2(tg, tg.get_Name(), aboveMiddle, 0.5 * csFactor, pt0, pt1, false); } else { AddModifier2(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, 0.5 * csFactor, pt0, pt1, false, "W+W1"); } break; default: //one label only AddModifier2(tg, label, aboveMiddle, 0, pt0, pt1, false); break; } break; case TacticalLines.KILLBOXBLUE_RECTANGULAR: case TacticalLines.KILLBOXPURPLE_RECTANGULAR: rfaLines = getRFALines(tg); pt0 = lineutility.MidPointDouble(tg.Pixels.get(0), tg.Pixels.get(1), 0); pt1 = lineutility.MidPointDouble(tg.Pixels.get(2), tg.Pixels.get(3), 0); switch (rfaLines) { case 4: //2 valid modifiers and a label AddModifier2(tg, label, aboveMiddle, -1 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_Name(), aboveMiddle, 0, pt0, pt1, false); AddModifier2(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, 1 * csFactor, pt0, pt1, false, "W+W1"); AddModifier2(tg, tg.get_H1(), aboveMiddle, 2 * csFactor, pt0, pt1, false, "H1"); break; case 3: //two valid modifiers and one label AddModifier2(tg, label, aboveMiddle, -1 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_Name(), aboveMiddle, 0, pt0, pt1, false); AddModifier2(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, 1 * csFactor, pt0, pt1, false, "W+W1"); break; case 2: //one valid modifier and one label AddModifier2(tg, label, aboveMiddle, -0.5 * csFactor, pt0, pt1, false); if (tg.get_Name() != null && !tg.get_Name().isEmpty()) { AddModifier2(tg, tg.get_Name(), aboveMiddle, 0.5 * csFactor, pt0, pt1, false); } else { AddModifier2(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, 0.5 * csFactor, pt0, pt1, false, "W+W1"); } break; default: //one label only AddModifier2(tg, label, aboveMiddle, 0, pt0, pt1, false); break; } break; case TacticalLines.FSA_RECTANGULAR: case TacticalLines.ATI_RECTANGULAR: case TacticalLines.CFFZ_RECTANGULAR: case TacticalLines.SENSOR_RECTANGULAR: case TacticalLines.CENSOR_RECTANGULAR: case TacticalLines.DA_RECTANGULAR: case TacticalLines.CFZ_RECTANGULAR: case TacticalLines.ZOR_RECTANGULAR: case TacticalLines.TBA_RECTANGULAR: case TacticalLines.TVAR_RECTANGULAR: ptLeft = lineutility.MidPointDouble(tg.Pixels.get(0), tg.Pixels.get(1), 0); ptRight = lineutility.MidPointDouble(tg.Pixels.get(2), tg.Pixels.get(3), 0); AddModifier2(tg, label, aboveMiddle, 0, ptLeft, ptRight, false); AddModifier2(tg, tg.get_Name(), aboveMiddle, 1 * csFactor, ptLeft, ptRight, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 1 * csFactor, ptCenter, ptCenter, false); pt0 = tg.Pixels.get(0); pt1 = tg.Pixels.get(1); pt2 = tg.Pixels.get(2); pt3 = tg.Pixels.get(3); if (tg.get_Client().equalsIgnoreCase("ge")) { pt0.x -= font.getSize() / 2; pt2.x -= font.getSize() / 2; } if (!tg.get_Client().equalsIgnoreCase("ge"))//added 2-27-12 { clsUtility.shiftModifiersLeft(pt0, pt3, 12.5); clsUtility.shiftModifiersLeft(pt1, pt2, 12.5); } if (ptLeft.x == ptRight.x) { ptRight.x += 1; } if (ptLeft.x < ptRight.x) { AddModifier(tg, tg.get_DTG(), toEnd, 0, pt0, pt3);//was 1,2 switched for CPOF AddModifier(tg, tg.get_DTG1(), toEnd, 1 * csFactor, pt0, pt3);//was 1,2 } else { AddModifier(tg, tg.get_DTG(), toEnd, 0, pt2, pt1);//was 3,0 //switched for CPOF AddModifier(tg, tg.get_DTG1(), toEnd, 1, pt2, pt1);//was 3,0 } break; case TacticalLines.PAA_RECTANGULAR: case TacticalLines.PAA_RECTANGULAR_REVC: AddIntegralModifier(tg, label, aboveMiddle, 0, 0, 1, true); AddIntegralModifier(tg, label, aboveMiddle, 0, 1, 2, true); AddIntegralModifier(tg, label, aboveMiddle, 0, 2, 3, true); AddIntegralModifier(tg, label, aboveMiddle, 0, 3, 0, true); break; case TacticalLines.PAA_CIRCULAR: pt0 = tg.Pixels.get(0); AddIntegralAreaModifier(tg, label, area, 0, pt0, pt0, true); pt0 = tg.Pixels.get(25); AddIntegralAreaModifier(tg, label, area, 0, pt0, pt0, true); pt0 = tg.Pixels.get(50); AddIntegralAreaModifier(tg, label, area, 0, pt0, pt0, true); pt0 = tg.Pixels.get(75); AddIntegralAreaModifier(tg, label, area, 0, pt0, pt0, true); break; case TacticalLines.RANGE_FAN: if (tg.get_H1() != null && tg.get_H1().equals("") == false) { H1 = tg.get_H1().split(","); for (j = 0; j < H1.length; j++) { if (tg.Pixels.size() > j * 102 + 25) { pt0 = tg.Pixels.get(j * 102 + 25); AddAreaModifier(tg, "ALT " + H1[j], area, 0, pt0, pt0); } } } if(!tg.get_HideOptionalLabels()) { String H2 = tg.get_H2(); String[] am = H2.split(","); for(j=0;j<am.length;j++) { if (tg.Pixels.size() > j * 102 + 25) { pt0 = tg.Pixels.get(j * 102 + 25); //AddAreaModifier(tg, "RG " + am[j], area, -1, pt0, pt0); if(j==0) AddAreaModifier(tg, "MIN RG " + am[j], 3, -1, pt0, pt0); else AddAreaModifier(tg, "MAX RG " + "(" + Integer.toString(j) + ") " + am[j], 3, -1, pt0, pt0); } } }// end if set range fan text break; case TacticalLines.RANGE_FAN_SECTOR: break; default: break; }//end switch scaleModifiers(tg); tg.Pixels = origPoints; g2d.dispose(); g2d = null; } catch (Exception exc) { ErrorLogger.LogException(_className, "AddModifiers2", new RendererException("Failed inside AddModifiers2", exc)); } } /** * Displays the tg modifiers using a client Graphics2D, this is an option * provided to clients for displaying modifiers without using shapes * * @param tg the tactical graphic * @param g2d the graphics object for drawing */ public static void DisplayModifiers(TGLight tg, Graphics2D g2d) { try { Font font = g2d.getFont(); int j = 0; Modifier2 modifier = null; g2d.setBackground(Color.white); POINT2 pt = null; double theta = 0; int stringWidth = 0, stringHeight = 0; FontMetrics metrics = g2d.getFontMetrics(); String s = ""; int x = 0, y = 0; POINT2 pt1 = null, pt2 = null; int quadrant = -1; int n = tg.Pixels.size(); //for (j = 0; j < tg.modifiers.size(); j++) for (j = 0; j < n; j++) { modifier = (Modifier2) tg.modifiers.get(j); double lineFactor = modifier.lineFactor; s = modifier.text; double x1 = 0, y1 = 0, x2 = 0, y2 = 0; pt = modifier.textPath[0]; x1 = pt.x; y1 = pt.y; pt = modifier.textPath[1]; x2 = pt.x; y2 = pt.y; theta = Math.atan2(y2 - y1, x2 - x1); POINT2 midPt; if (x1 > x2) { theta -= Math.PI; } switch (modifier.type) { case toEnd: //corresponds to LabelAndTextBeforeLineTG g2d.rotate(theta, x1, y1); stringWidth = metrics.stringWidth(s); stringHeight = font.getSize(); if (x1 < x2 || (x1 == x2 && y1 > y2)) { x = (int) x1 - stringWidth; y = (int) y1 - (int) stringHeight / 2 + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_FontBackColor()); g2d.clearRect(x, y, stringWidth, stringHeight); y = (int) y1 + (int) stringHeight / 2 + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_TextColor()); g2d.drawString(s, x, y); } else { x = (int) x1; y = (int) y1 - (int) stringHeight / 2 + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_FontBackColor()); g2d.clearRect(x, y, stringWidth, stringHeight); y = (int) y1 + (int) stringHeight / 2 + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_TextColor()); g2d.drawString(s, x, y); } break; case aboveMiddle: midPt = new POINT2((x1 + x2) / 2, (y1 + y2) / 2); g2d.rotate(theta, midPt.x, midPt.y); stringWidth = metrics.stringWidth(s); stringHeight = font.getSize(); x = (int) midPt.x - stringWidth / 2; y = (int) midPt.y - (int) stringHeight / 2 + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_FontBackColor()); g2d.clearRect(x, y, stringWidth, stringHeight); y = (int) midPt.y + (int) (stringHeight / 2) + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_TextColor()); g2d.drawString(s, x, y); break; case area: g2d.rotate(0, x1, y1); stringWidth = metrics.stringWidth(s); stringHeight = font.getSize(); x = (int) x1 - stringWidth / 2; y = (int) y1 - (int) stringHeight / 2 + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_FontBackColor()); g2d.clearRect(x, y, stringWidth, stringHeight); y = (int) y1 + (int) (stringHeight / 2) + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_TextColor()); g2d.drawString(s, x, y); break; case screen: //for SCREEN, GUARD, COVER if (tg.Pixels.size() >= 14) { pt1 = tg.Pixels.get(3); pt2 = tg.Pixels.get(10); quadrant = lineutility.GetQuadrantDouble(pt1, pt2); theta = Math.atan2(pt2.y - pt1.y, pt2.x - pt1.x); switch (quadrant) { case 1: theta += Math.PI / 2; break; case 2: theta -= Math.PI / 2; break; case 3: theta -= Math.PI / 2; break; case 4: theta += Math.PI / 2; break; default: break; } g2d.rotate(theta, x1, y1); stringWidth = metrics.stringWidth(s); stringHeight = font.getSize(); x = (int) x1 - stringWidth / 2; y = (int) y1 - (int) stringHeight / 2 + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_FontBackColor()); g2d.clearRect(x, y, stringWidth, stringHeight); y = (int) y1 + (int) (stringHeight / 2) + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_TextColor()); g2d.drawString(s, x, y); } else { stringWidth = metrics.stringWidth(s); stringHeight = font.getSize(); x = (int) tg.Pixels.get(0).x;//(int) x1 - stringWidth / 2; y = (int) tg.Pixels.get(0).y;//(int) y1 - (int) stringHeight / 2 + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_FontBackColor()); g2d.clearRect(x, y, stringWidth, stringHeight); y = (int) y + (int) (stringHeight / 2) + (int) (lineFactor * stringHeight); g2d.setColor(tg.get_TextColor()); g2d.drawString(s, x, y); } break; default: break; } //end switch } //end for } catch (Exception exc) { ErrorLogger.LogException(_className, "DisplayModifiers", new RendererException("Failed inside DisplayModifiers", exc)); } }//end function /** * Returns a Shape object for the text background for labels and modifiers * * @param tg the tactical graphic object * @param pt0 1st point of segment * @param pt1 last point of segment * @param stringWidth string width * @param stringHeight string height * @param lineFactor number of text lines above or below the segment * @param isTextFlipped true if text is flipped * @return the modifier shape */ public static Shape2 BuildModifierShape( TGLight tg, POINT2 pt0, POINT2 pt1, int stringWidth, int stringHeight, double lineFactor, boolean isTextFlipped) { Shape2 modifierFill = null; try { POINT2 ptTemp0 = new POINT2(pt0), ptTemp1 = new POINT2(pt1); if (isTextFlipped) { lineFactor += 1; } if (lineFactor < 0) //extend pt0,pt1 above the line { ptTemp0 = lineutility.ExtendDirectedLine(pt0, pt1, pt0, 2, -lineFactor * stringHeight); ptTemp1 = lineutility.ExtendDirectedLine(pt0, pt1, pt1, 2, -lineFactor * stringHeight); } if (lineFactor > 0) //extend pt0,pt1 below the line { ptTemp0 = lineutility.ExtendDirectedLine(pt0, pt1, pt0, 3, lineFactor * stringHeight); ptTemp1 = lineutility.ExtendDirectedLine(pt0, pt1, pt1, 3, lineFactor * stringHeight); } if (ptTemp0.y == ptTemp1.y) { ptTemp0.y += 1; } POINT2 pt3 = null, pt4 = null, pt5 = null, pt6 = null, pt7 = null; pt3 = lineutility.ExtendAlongLineDouble(ptTemp0, ptTemp1, -stringWidth); pt4 = lineutility.ExtendDirectedLine(ptTemp1, ptTemp0, pt3, 0, stringHeight / 2); pt5 = lineutility.ExtendDirectedLine(ptTemp1, ptTemp0, pt3, 1, stringHeight / 2); pt6 = lineutility.ExtendDirectedLine(ptTemp1, ptTemp0, ptTemp0, 1, stringHeight / 2); pt7 = lineutility.ExtendDirectedLine(ptTemp1, ptTemp0, ptTemp0, 0, stringHeight / 2); modifierFill = new Shape2(Shape2.SHAPE_TYPE_MODIFIER_FILL); modifierFill.moveTo(pt4); modifierFill.lineTo(pt5); modifierFill.lineTo(pt6); modifierFill.lineTo(pt7); modifierFill.lineTo(pt4); } catch (Exception exc) { ErrorLogger.LogException(_className, "BuildModifierShape", new RendererException("Failed inside BuildModifierShape", exc)); } return modifierFill; } /** * For BOUNDARY and other line types which require breaks for the integral * text. Currently only boundary uses this * * @param tg * @param g2d the graphics object for drawing * @param shapes the shape array */ public static void GetIntegralTextShapes(TGLight tg, Graphics2D g2d, ArrayList<Shape2> shapes) { try { if (tg.Pixels == null || shapes == null) { return; } HashMap<Integer, Color> hmap = clsUtility.getMSRSegmentColors(tg); Color color = null; Shape2 shape = null; Shape2 segShape = null;//diangostic 1-22-13 g2d.setFont(tg.get_Font()); int j = 0; String affiliation = null; FontMetrics metrics = g2d.getFontMetrics(); String echelonSymbol = null; int stringWidthEchelonSymbol = 0; int stringWidthENY = 0; //boolean lineTooShort = false; POINT2 ptEchelonStart = null, ptEchelonEnd = null, midpt, ptENY0Start = null, ptENY0End = null, ptENY1Start, ptENY1End, pt0 = null, pt1 = null; double dist = 0; BasicStroke stroke = null; switch (tg.get_LineType()) { case TacticalLines.BOUNDARY: echelonSymbol = tg.get_EchelonSymbol(); //shapes = new ArrayList(); shape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); shape.setLineColor(tg.get_LineColor()); shape.set_Style(tg.get_LineStyle()); affiliation = tg.get_Affiliation(); stroke = clsUtility.getLineStroke(tg.get_LineThickness(), shape.get_Style(), BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND); shape.setStroke(stroke); if (tg.get_Affiliation() != null && tg.get_Affiliation().equals("H")) { stringWidthENY = metrics.stringWidth(tg.get_N()); } if (echelonSymbol != null && !echelonSymbol.isEmpty()) { stringWidthEchelonSymbol = metrics.stringWidth(echelonSymbol); } //diagnostic if (hmap == null || hmap.isEmpty()) { shape.moveTo(tg.Pixels.get(0)); for (j = 1; j < tg.Pixels.size(); j++) { shape.lineTo(tg.Pixels.get(j)); } shapes.add(shape); break; } //end section int n = tg.Pixels.size(); //for (j = 0; j < tg.Pixels.size() - 1; j++) for (j = 0; j < n - 1; j++) { segShape = null; if (hmap != null) { if (hmap.containsKey(j)) { color = (Color) hmap.get(j); segShape = new Shape2(Shape2.SHAPE_TYPE_POLYLINE); segShape.setLineColor(color); segShape.set_Style(tg.get_LineStyle()); segShape.setStroke(stroke); } } pt0 = tg.Pixels.get(j); pt1 = tg.Pixels.get(j + 1); //lineTooShort = GetBoundarySegmentTooShort(tg, g2d, j); if (segShape != null) { segShape.moveTo(pt0); } else { shape.moveTo(pt0); } //uncoment comment to remove line breaks for GE //if (lineTooShort || tg.get_Client().equals("ge")) if (tg.get_Client().equals("ge") || GetBoundarySegmentTooShort(tg, g2d, j) == true) { if (segShape != null) { segShape.lineTo(pt1); shapes.add(segShape); continue; } else { shape.lineTo(pt1); continue; } } midpt = lineutility.MidPointDouble(pt0, pt1, 0); if (stringWidthENY > 0) { //line break for the first N modifier midpt = lineutility.MidPointDouble(pt0, midpt, 0); midpt = lineutility.MidPointDouble(pt0, midpt, 0); dist = lineutility.CalcDistanceDouble(pt0, midpt) - stringWidthENY / 1.5; ptENY0Start = lineutility.ExtendAlongLineDouble(pt0, pt1, dist); dist = lineutility.CalcDistanceDouble(pt0, midpt) + stringWidthENY / 1.5; ptENY0End = lineutility.ExtendAlongLineDouble(pt0, pt1, dist); if (segShape != null) { segShape.moveTo(pt0); segShape.lineTo(ptENY0Start); segShape.moveTo(ptENY0End); } else { shape.moveTo(pt0); shape.lineTo(ptENY0Start); shape.moveTo(ptENY0End); } } else { if (segShape != null) { segShape.moveTo(pt0); } else { shape.moveTo(pt0); } } if (stringWidthEchelonSymbol > 0) { midpt = lineutility.MidPointDouble(pt0, pt1, 0); dist = lineutility.CalcDistanceDouble(pt0, midpt) - stringWidthEchelonSymbol / 1.5; ptEchelonStart = lineutility.ExtendAlongLineDouble(pt0, pt1, dist); dist = lineutility.CalcDistanceDouble(pt0, midpt) + stringWidthEchelonSymbol / 1.5; ptEchelonEnd = lineutility.ExtendAlongLineDouble(pt0, pt1, dist); if (segShape != null) { segShape.lineTo(ptEchelonStart); segShape.moveTo(ptEchelonEnd); } else { shape.lineTo(ptEchelonStart); shape.moveTo(ptEchelonEnd); } } if (stringWidthENY > 0) { //line break for the last N modifier midpt = lineutility.MidPointDouble(pt0, pt1, 0); midpt = lineutility.MidPointDouble(pt1, midpt, 0); midpt = lineutility.MidPointDouble(pt1, midpt, 0); dist = lineutility.CalcDistanceDouble(pt1, midpt) - stringWidthENY / 1.5; ptENY1Start = lineutility.ExtendAlongLineDouble(pt1, pt0, dist); dist = lineutility.CalcDistanceDouble(pt1, midpt) + stringWidthENY / 1.5; ptENY1End = lineutility.ExtendAlongLineDouble(pt1, pt0, dist); if (segShape != null) { segShape.lineTo(ptENY1End); segShape.moveTo(ptENY1Start); segShape.lineTo(pt1); } else { shape.lineTo(ptENY1End); shape.moveTo(ptENY1Start); shape.lineTo(pt1); } } else { if (segShape != null) { segShape.lineTo(pt1); } else { shape.lineTo(pt1); } } if (segShape != null) { shapes.add(segShape); } }//end for shapes.add(shape); break; default: break; } } catch (Exception exc) { ErrorLogger.LogException(_className, "GetIntegralTextShapes", new RendererException("Failed inside GetIntegralTextShapes", exc)); } } private static int switchDirection(int direction) { int result = -1; switch (direction) { case 0: return 1; case 1: return 0; case 2: return 3; case 3: return 2; } return result; } /** * Displays the modifiers to a Graphics2D from a BufferedImage * * @param tg the tactical graphic * @param g2d the Graphic for drawing * @param shapes the shape array * @param isTextflipped true if text is flipped * @param converter to convert between geographic and pixel coordinates */ public static void DisplayModifiers2(TGLight tg, Graphics2D g2d, ArrayList<Shape2> shapes, boolean isTextFlipped, IPointConversion converter) { try { if (shapes == null) { return; } if (tg.modifiers == null || tg.modifiers.isEmpty()) { return; } Font font = null; int j = 0; Modifier2 modifier = null; Color fontBackColor = tg.get_FontBackColor(); Color textColor = tg.get_TextColor(); double theta = 0; double stringWidth = 0, stringHeight = 0; String s = ""; int x = 0, y = 0; POINT2 pt0 = null, pt1 = null, pt2 = null, pt3 = null; int quadrant = -1; Shape2 shape2 = null; long lineType = tg.get_LineType(); font = tg.get_Font(); //might have to change this if (font == null) { font = g2d.getFont(); } if (font.getSize() == 0) { return; } g2d.setFont(font); FontMetrics metrics = g2d.getFontMetrics(); //we need a background color if (fontBackColor != null) { g2d.setBackground(fontBackColor); } else { g2d.setBackground(Color.white); } if (textColor == null) { textColor = tg.get_LineColor(); } int direction = -1; Point glyphPosition = null; for (j = 0; j < tg.modifiers.size(); j++) { modifier = (Modifier2) tg.modifiers.get(j); double lineFactor = modifier.lineFactor; if (isTextFlipped) { lineFactor = -lineFactor; } s = modifier.text; if (s == null || s.equals("")) { continue; } stringWidth = (double) metrics.stringWidth(s) + 1; stringHeight = (double) font.getSize(); double x1 = 0, y1 = 0, x2 = 0, y2 = 0, dist = 0; pt0 = modifier.textPath[0]; x1 = Math.round(pt0.x); y1 = Math.round(pt0.y); pt1 = modifier.textPath[1]; x2 = Math.round(pt1.x); y2 = Math.round(pt1.y); theta = Math.atan2(y2 - y1, x2 - x1); POINT2 midPt; if (x1 > x2) { theta -= Math.PI; } pt0 = new POINT2(x1, y1); pt1 = new POINT2(x2, y2); midPt = new POINT2((x1 + x2) / 2, (y1 + y2) / 2); Point2D modifierPosition = null; //use this if using justify int justify = ShapeInfo.justify_left; switch (modifier.type) { case aboveEnd: if (x1 == x2) { x2 += 1; } if (x1 < x2) { //x = (int) x1 - (int) stringWidth; x = (int) x1; y = (int) y1 + (int) stringHeight / 2 + (int) (lineFactor * stringHeight); } else { //x = (int) x1; x = (int) x1 - (int) stringWidth; y = (int) y1 + (int) stringHeight / 2 + (int) (lineFactor * stringHeight); } if (lineFactor >= 0) { direction = 2; } else { direction = 3; } if (lineType == TacticalLines.LC || tg.get_Client().equalsIgnoreCase("ge")) { direction = switchDirection(direction); } if (x1 < x2) { justify = ShapeInfo.justify_right; } else { justify = ShapeInfo.justify_left; } //pt2 = lineutility.ExtendDirectedLine(pt1, pt0, pt1, direction, lineFactor * stringHeight); pt3 = lineutility.ExtendDirectedLine(pt1, pt0, pt0, direction, lineFactor * stringHeight); glyphPosition = new Point((int) pt3.x, (int) pt3.y); modifierPosition = new Point2D.Double(pt3.x, pt3.y); break; case toEnd: //corresponds to LabelAndTextBeforeLineTG if (x1 == x2) { x2 += 1; } if (lineFactor >= 0) { direction = 2; } else { direction = 3; } if (lineType == TacticalLines.LC || tg.get_Client().equalsIgnoreCase("ge")) { direction = switchDirection(direction); } dist = lineutility.CalcDistanceDouble(pt0, pt1) + stringWidth / 2; pt0 = lineutility.ExtendAlongLineDouble(pt1, pt0, dist); pt2 = lineutility.ExtendDirectedLine(pt1, pt0, pt1, direction, lineFactor * stringHeight); pt3 = lineutility.ExtendDirectedLine(pt1, pt0, pt0, direction, lineFactor * stringHeight); glyphPosition = new Point((int) pt3.x, (int) pt3.y); if (x1 < x2) { justify = ShapeInfo.justify_right; } else { justify = ShapeInfo.justify_left; } modifierPosition = new Point2D.Double(pt3.x, pt3.y); break; case aboveMiddle: pt2 = midPt; if (tg.get_Client().equals("2D")) { lineFactor += 0.5; } if (lineFactor >= 0) { pt3 = lineutility.ExtendDirectedLine(pt0, pt2, pt2, 3, Math.abs((lineFactor) * stringHeight)); midPt = lineutility.ExtendDirectedLine(pt0, midPt, midPt, 3, Math.abs((lineFactor) * stringHeight)); } else { pt3 = lineutility.ExtendDirectedLine(pt0, pt2, pt2, 2, Math.abs((lineFactor) * stringHeight)); midPt = lineutility.ExtendDirectedLine(pt0, midPt, midPt, 2, Math.abs((lineFactor) * stringHeight)); } //pt3=lineutility.ExtendDirectedLine(pt0, pt2, pt2, 2, lineFactor*stringHeight); if (x1 == x2 && y1 > y2) { pt3 = lineutility.ExtendDirectedLine(pt0, pt2, pt2, 1, Math.abs((lineFactor) * stringHeight)); midPt = lineutility.ExtendDirectedLine(pt0, midPt, midPt, 1, Math.abs((lineFactor) * stringHeight)); } if (x1 == x2 && y1 < y2) { pt3 = lineutility.ExtendDirectedLine(pt0, pt2, pt2, 0, Math.abs((lineFactor) * stringHeight)); midPt = lineutility.ExtendDirectedLine(pt0, midPt, midPt, 0, Math.abs((lineFactor) * stringHeight)); } glyphPosition = new Point((int) pt3.x, (int) pt3.y); justify = ShapeInfo.justify_center; modifierPosition = new Point2D.Double(midPt.x, midPt.y); break; case area: theta = 0; //y = (int) y1 + (int) (stringHeight / 2) + (int) (1.25 * lineFactor * stringHeight); y = (int) y1 + (int) (stringHeight / 2) + (int) (lineFactor * stringHeight); x = (int) x1; glyphPosition = new Point(x, y); justify = ShapeInfo.justify_center; modifierPosition = new Point2D.Double(x1, y); break; case screen: //for SCREEN, GUARD, COVER, not currently used if (tg.Pixels.size() >= 14) { pt1 = tg.Pixels.get(3); pt2 = tg.Pixels.get(10); quadrant = lineutility.GetQuadrantDouble(pt1, pt2); theta = Math.atan2(pt2.y - pt1.y, pt2.x - pt1.x); if (Math.abs(theta) < Math.PI / 8) { if (theta < 0) { theta -= Math.PI / 2; } else { theta += Math.PI / 2; } } switch (quadrant) { case 1: theta += Math.PI / 2; break; case 2: theta -= Math.PI / 2; break; case 3: theta -= Math.PI / 2; break; case 4: theta += Math.PI / 2; break; default: break; } x = (int) x1 - (int) stringWidth / 2; y = (int) y1 - (int) stringHeight / 2 + (int) (lineFactor * stringHeight); y = (int) y1 + (int) (stringHeight / 2) + (int) (lineFactor * stringHeight); } else { theta = 0; x = (int) tg.Pixels.get(0).x; y = (int) tg.Pixels.get(0).y; x = (int) x - (int) stringWidth / 2; y = (int) y - (int) stringHeight / 2 + (int) (lineFactor * stringHeight); y = (int) y + (int) (stringHeight / 2) + (int) (lineFactor * stringHeight); } glyphPosition = new Point(x, y); //glyphPosition=new Point2D.Double(x,y); break; default: break; } //end switch shape2 = new Shape2(Shape2.SHAPE_TYPE_MODIFIER_FILL); shape2.setStroke(new BasicStroke(0, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 3)); if (tg.get_TextColor() != null) { shape2.setFillColor(tg.get_TextColor()); } else if (tg.get_LineColor() != null) { shape2.setFillColor(tg.get_LineColor()); } if (tg.get_LineColor() != null) { shape2.setLineColor(tg.get_LineColor()); } TextLayout tl = new TextLayout(s, font, g2d.getFontMetrics().getFontRenderContext()); shape2.setTextLayout(tl); //only GE uses the converter, generic uses the affine transform and draws at 0,0 if (converter != null) { shape2.setGlyphPosition(glyphPosition); } else { shape2.setGlyphPosition(new Point2D.Double(0, 0)); } //shape2.setGlyphPosition(new Point(0,0)); //added two settings for use by GE shape2.setModifierString(s); //shape2.setModifierStringPosition(glyphPosition);//M. Deutch 7-6-11 shape2.setModifierStringAngle(theta * 180 / Math.PI); shape2.setModifierStringPosition(modifierPosition); shape2.setTextJustify(justify); if (shape2 != null) { shapes.add(shape2); } } //end for } //end try catch (Exception exc) { ErrorLogger.LogException(_className, "DisplayModifiers2", new RendererException("Failed inside DisplayModifiers2", exc)); } }//end function /** * Builds a shape object to wrap text * * @param g2d the Graphic object for drawing * @param str text to wrap * @param font the draw font * @param tx the drawing transform, text rotation and translation * @return */ public static Shape getTextShape(Graphics2D g2d, String str, Font font, AffineTransform tx) { TextLayout tl = null; FontRenderContext frc = null; try { frc = g2d.getFontRenderContext(); tl = new TextLayout(str, font, frc); } catch (Exception exc) { ErrorLogger.LogException(_className, "getTextShape", new RendererException("Failed inside getTextShape", exc)); } return tl.getOutline(tx); } /** * Creates text outline as a shape * * @param originalText the original text * @return text shape */ public static Shape2 createTextOutline(Shape2 originalText) { Shape2 siOutline = null; try { Shape outline = originalText.getShape(); siOutline = new Shape2(Shape2.SHAPE_TYPE_MODIFIER_FILL); siOutline.setShape(outline); if (originalText.getFillColor().getRed() == 255 && originalText.getFillColor().getGreen() == 255 && originalText.getFillColor().getBlue() == 255) { siOutline.setLineColor(Color.BLACK); } else { siOutline.setLineColor(Color.WHITE); } int width = RendererSettings.getInstance().getTextOutlineWidth(); siOutline.setStroke(new BasicStroke(width, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 3)); } catch (Exception exc) { ErrorLogger.LogException(_className, "createTextOutline", new RendererException("Failed inside createTextOutline", exc)); } return siOutline; } /** * Channels don't return points in tg.Pixels. For Channels modifiers we only * need to collect the points, don't need internal arrays, and can calculate * on which segments the modifiers lie. * * @param shape * @return */ private static ArrayList<POINT2> getShapePoints(Shape shape) { try { ArrayList<Point2D> ptsPoly = new ArrayList(); Point2D ptPoly = null; float[] coords = new float[6]; int zeros = 0; for (PathIterator i = shape.getPathIterator(null); !i.isDone(); i.next()) { int type = i.currentSegment(coords); if (type == 0 && zeros == 2) { break; } switch (type) { case PathIterator.SEG_MOVETO: ptPoly = new Point2D.Double(coords[0], coords[1]); ptsPoly.add(ptPoly); zeros++; break; case PathIterator.SEG_LINETO: ptPoly = new Point2D.Double(coords[0], coords[1]); ptsPoly.add(ptPoly); break; case PathIterator.SEG_QUADTO: //quadTo was never used break; case PathIterator.SEG_CUBICTO: //curveTo was used for HOLD, BRDGHD and some METOC's break; case PathIterator.SEG_CLOSE: //closePath was never used break; } } if (ptsPoly.size() > 0) { ArrayList<POINT2> pts = null; pts = new ArrayList(); for (int j = 0; j < ptsPoly.size(); j++) { Point2D pt2d = ptsPoly.get(j); POINT2 pt = new POINT2(pt2d.getX(), pt2d.getY()); pts.add(pt); } return pts; } } catch (Exception exc) { ErrorLogger.LogException(_className, "getshapePoints", new RendererException("Failed inside getShapePoints", exc)); } return null; } /** * labels for Rev D symbols * * @param code Rev D entity code * @return */ private static String getRevDLabel(int code) { switch (code) { case 200401: case 200402: return "AOI"; case 200300: return "N"; case 200101: return "LA"; case 200201: case 200202: return "DA"; case 170800: return "BDZ"; case 150501: return "JTAA"; case 150502: return "SAA"; case 150503: return "SGSA"; case 140700: return "FCL"; case 151500: return "ASLT"; case 170400: return "SL"; case 170600: return "TC"; case 171100: return "AARROZ"; case 171200: return "UAROZ"; case 171300: return "WEZ"; case 171400: return "FEZ"; case 171500: return "JEZ"; case 171900: return "SHORADEZ"; case 190100: return "IFF OFF"; case 190200: return "IFF ON"; case 220102: return "EW"; case 220107: return "J"; case 220108: return "RDF"; case 260300: //nfl handle like fscl return "NFL"; case 260400: return "BCL"; case 300100: return "ICL"; case 140400: case 140401: return "FEBA"; case 140900: return "LOA"; default: return ""; } } /** * Handles rev D codes * * @param tg */ public static void AddModifiers2RevD(TGLight tg, ArrayList<Shape2> shapes) { if (tg.get_SymbolId().length() < 20) { Modifier2.AddModifiers2(tg); return; } try { String symbolId = tg.get_SymbolId(); //String setA = getSetA(tg.get_SymbolId()); String setA = symbolId.substring(0, 10); //String setB = getSetB(tg.get_SymbolId()); String setB = symbolId.substring(10); //String code = getCode(setB); String code = setB.substring(0, 6); int nCode = Integer.parseInt(code); //String symbolSet = getSymbolSet(setA); String symbolSet = setA.substring(4, 6); int nSymbol = Integer.parseInt(symbolSet); //default values for modifiers AP and V String country = "US"; //country AS modifier String v = "MORTAR"; //type String ap = "QC 1968"; //target designator AP modifier POINT2 pt0 = null, pt1 = null; double csFactor = 1d; int n = tg.Pixels.size(); POINT2 ptLeft = null, ptRight = null, ptCenter = null; String label = getRevDLabel(nCode); String dash = " - "; // POINT2 ptUl=null,ptUr=null,ptLl=null,ptLr=null; switch (nCode) { case 200202: ptLeft = lineutility.MidPointDouble(tg.Pixels.get(0), tg.Pixels.get(1), 0); ptRight = lineutility.MidPointDouble(tg.Pixels.get(2), tg.Pixels.get(3), 0); AddIntegralAreaModifier(tg, label + " - " + tg.get_Name(), aboveMiddle, -csFactor / 2, ptLeft, ptRight, false); break; case 290600: //pt0=tg.Pixels.get(7); //pt1=tg.Pixels.get(5); pt0 = tg.Pixels.get(4); pt1 = tg.Pixels.get(2); if (tg.Pixels.get(0).y < tg.Pixels.get(1).y) { AddIntegralAreaModifier(tg, tg.get_DTG() + " - " + tg.get_DTG1(), aboveMiddle, csFactor / 2, pt0, pt1, false); } else { AddIntegralAreaModifier(tg, tg.get_DTG() + " - " + tg.get_DTG1(), aboveMiddle, -csFactor / 2, pt0, pt1, false); } break; case 200402: if (tg.Pixels.get(0).x > tg.Pixels.get(3).x) { AddIntegralAreaModifier(tg, label, aboveMiddle, csFactor, tg.Pixels.get(0), tg.Pixels.get(3), false); } else { AddIntegralAreaModifier(tg, label, aboveMiddle, csFactor, tg.Pixels.get(1), tg.Pixels.get(2), false); } break; case 141500: case 141400: case 200300: case 240804: break; case 151407: //eny spt confirmed case 151408: //eny spt anticipated Shape2 shape = shapes.get(shapes.size() - 1); ArrayList<POINT2> pts = getShapePoints(shape.getShape()); n = pts.size(); //was tg.Pixels.size() if (n == 4) //was 3 { pt0 = pts.get(0); pt1 = pts.get(1); pt1 = lineutility.MidPointDouble(pt0, pt1, 0); } else if (n == 6) { pt0 = pts.get(3); pt1 = pts.get(4); } else { pt0 = pts.get(1); //was n-4 pt1 = pts.get(2); //was n-3 } AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt0, pt1, false); if (n == 4) { pt0 = pts.get(2); //was pts.size()-9 pt1 = pts.get(3); //was pts.size()-8 pt1 = lineutility.MidPointDouble(pt0, pt1, 0); } else if (n == 6) { pt0 = pts.get(0); pt1 = pts.get(1); } else { pt0 = pts.get(n / 2 + 1); //was pts.size()-10 pt1 = pts.get(n / 2 + 2); //was pts.get(pts.size()-9 } AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt0, pt1, false); break; default: int saveStd = tg.getSymbologyStandard(); tg.setSymbologyStandard(RendererSettings.Symbology_2525C); AddModifiers2(tg); tg.setSymbologyStandard(saveStd); break; } } catch (Exception exc) { //clsUtility.WriteFile("Error in Modifier2.AddModifiers"); ErrorLogger.LogException(_className, "AddModifiers2RevD", new RendererException("Failed inside AddModifiers2RevD", exc)); } } /** * The new public interface to handle Mil-Std-2525 Rev D, replaces or calls * AddModifiersGeo * * @param tg * @param g2d * @param clipBounds * @param converter */ public static void AddModifiersGeo2(TGLight tg, Graphics2D g2d, Object clipBounds, IPointConversion converter) { if (tg.get_SymbolId().length() < 20) { Modifier2.AddModifiersGeo(tg, g2d, clipBounds, converter); return; } try { String symbolId = tg.get_SymbolId(); //String setA = getSetA(tg.get_SymbolId()); String setA = symbolId.substring(0, 10); //String setB = getSetB(tg.get_SymbolId()); String setB = symbolId.substring(10); //String code = getCode(setB); String code = setB.substring(0, 6); int nCode = Integer.parseInt(code); //String symbolSet = getSymbolSet(setA); String symbolSet = setA.substring(4, 6); int nSymbol = Integer.parseInt(symbolSet); //default values for modifiers AP and V String country = "US"; //country AS modifier String v = "MORTAR"; //type String ap = "QC 1968"; //target designator AP modifier //assume we are using tg.get_Location() for the Y modifier //uncomment 3 lines after the methods become available //country=tg.get_AS(); //v=tg.get_V(); //ap=tg.get_AP(); String t = tg.get_Name(); String label = GetCenterLabel(tg); double csFactor = 1d; if (nSymbol == 45 || nSymbol == 46) { Modifier2.AddModifiersGeo(tg, g2d, clipBounds, converter); return; } if (nSymbol != 25) { Modifier2.AddModifiersGeo(tg, g2d, clipBounds, converter); return; } //at this point the symbol is a control measure double factor = 1;//10d/tg.get_Font().getSize(); //int linetype = tg.get_LineType(); //boolean visibleModifiers=tg.get_VisibleLabels(); int j = 0, k = 0; double x = 0, y = 0; if (tg.get_Font() != null && tg.get_Font().getSize() > 0) { factor = 10d / tg.get_Font().getSize(); } else { return; } FontMetrics metrics = g2d.getFontMetrics(); int stringWidth = 0, stringWidth2 = 0; String dash = ""; if (tg.get_DTG() != null && tg.get_DTG1() != null && tg.get_DTG().isEmpty() == false && tg.get_DTG1().isEmpty() == false) { dash = " - "; } int lastIndex = tg.Pixels.size() - 1; int nextToLastIndex = tg.Pixels.size() - 2; POINT2 pt0 = new POINT2(tg.Pixels.get(0)); POINT2 pt1 = null; POINT2 pt2 = null, pt3 = null; POINT2 ptLast = new POINT2(tg.Pixels.get(lastIndex)); POINT2 ptNextToLast = null, midPt = null; if (lastIndex > 0) { ptNextToLast = new POINT2(tg.Pixels.get(lastIndex - 1)); } if (tg.Pixels.size() > 1) { pt1 = new POINT2(tg.Pixels.get(1)); } if (tg.Pixels.size() > 2) { pt2 = new POINT2(tg.Pixels.get(2)); } if (tg.Pixels.size() > 3) { pt3 = new POINT2(tg.Pixels.get(3)); } //String label = GetCenterLabel(tg); Object[] pts = tg.Pixels.toArray(); POINT2 ptCenter = null; if (converter != null) //cpof uses latlonconverter so cpof passes null for this { ptCenter = mdlGeodesic.geodesic_center(tg.LatLongs); if (ptCenter != null) { Point2D pt22 = converter.GeoToPixels(new Point2D.Double(ptCenter.x, ptCenter.y)); ptCenter.x = pt22.getX(); ptCenter.y = pt22.getY(); } else { ptCenter = lineutility.CalcCenterPointDouble2(pts, pts.length); } } else { ptCenter = lineutility.CalcCenterPointDouble2(pts, pts.length); } POINT2 lr = new POINT2(tg.Pixels.get(0)); POINT2 ll = new POINT2(tg.Pixels.get(0)); POINT2 ul = new POINT2(tg.Pixels.get(0)); POINT2 ur = new POINT2(tg.Pixels.get(0)); Rectangle2D clipRect = null; ArrayList<Point2D> clipArray = null; if (clipBounds != null && ArrayList.class.isAssignableFrom(clipBounds.getClass())) { clipArray = (ArrayList<Point2D>) clipBounds; } if (clipBounds != null && Rectangle2D.Double.class.isAssignableFrom(clipBounds.getClass())) { clipRect = (Rectangle2D.Double) clipBounds; } int middleSegment = (tg.Pixels.size() + 1) / 2 - 1; if (clipRect != null) { middleSegment = getVisibleMiddleSegment(tg, clipRect); } else if (clipArray != null) { middleSegment = getVisibleMiddleSegment(tg, clipArray); } double dist = 0, dist2 = 0; Font font = null; font = tg.get_Font(); //might have to change this if (font == null) { font = g2d.getFont(); } g2d.setFont(font); POINT2 ptUl = null, ptUr = null, ptLl = null, ptLr = null; //switch adds the new modifiers or calls the old function if the modifiers did not change switch (nCode) { case 200401: ptUr = new POINT2(); ptUl = new POINT2(); ptLl = new POINT2(); ptLr = new POINT2(); Modifier2.GetMBR(tg, ptUl, ptUr, ptLr, ptLl); label = getRevDLabel(nCode); AddIntegralAreaModifier(tg, label, aboveMiddle, csFactor, ptLl, ptLr, false); break; case 110101: //lateral boundary case 110102: //fwd bdry case 110103: //rear bdry t += " " + "(" + country + ")"; tg.set_Name(t); tg.set_T1(t); Modifier2.AddModifiersGeo(tg, g2d, clipBounds, converter); break; case 110200: //LL case 141000: //LD case 141100: //LDLC case 141200: //PLD case 141400: //BL case 141500: //HOLD case 141600: //release AddIntegralAreaModifier(tg, label, aboveEnd, -csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, label, aboveEnd, -csFactor, ptLast, ptNextToLast, false); break; case 120400: ptUr = new POINT2(); ptUl = new POINT2(); ptLl = new POINT2(); ptLr = new POINT2(); Modifier2.GetMBR(tg, ptUl, ptUr, ptLr, ptLl); stringWidth = metrics.stringWidth(tg.get_H()); pt0.x = ptUr.x + stringWidth / 2 + 1; //pt0.x=ptUr.x+1; //pt0.y=(ptUr.y+ptLr.y)/2-metrics.getFont().getSize() pt0.y = (ptUr.y + ptLr.y) / 2 - font.getSize(); AddIntegralAreaModifier(tg, tg.get_H(), area, csFactor, pt0, pt0, false); break; case 200101: case 200201: label = getRevDLabel(nCode); AddIntegralAreaModifier(tg, label + " - " + tg.get_Name(), area, 0, ptCenter, ptCenter, false); break; case 140700: case 140900: case 190100: case 190200: label = getRevDLabel(nCode); AddIntegralAreaModifier(tg, label, aboveEnd, -csFactor, pt0, pt1, false); AddIntegralAreaModifier(tg, label, aboveEnd, -csFactor, ptLast, ptNextToLast, false); break; case 140103: case 140104: //AddIntegralAreaModifier(tg, label, toEnd, 0, pt0, pt1, false); AddIntegralAreaModifier(tg, tg.get_N(), toEnd, -1 * csFactor, pt0, pt1, false); //AddIntegralAreaModifier(tg, label, toEnd, 0, ptLast, ptNextToLast, false); AddIntegralAreaModifier(tg, tg.get_N(), toEnd, -1 * csFactor, ptLast, ptNextToLast, false); break; case 200402: // label = getRevDLabel(nCode); // AddIntegralAreaModifier(tg, label, aboveMiddle, 0, pt0, pt1, false); // break; case 140101: //flot has no labels case 140102: case 150101: case 150102: //case 151801: case 151900: case 152000: case 152100: case 152200: case 141700: break; case 140400: //feba has labels at end case 140401: label = getRevDLabel(nCode); AddIntegralAreaModifier(tg, label, toEnd, 0, pt0, pt1, false); AddIntegralAreaModifier(tg, label, toEnd, 0, ptLast, ptNextToLast, false); break; case 150103: case 150104: //case 151802: areasWithENY(tg, g2d); break; case 150501: case 150502: case 150503: areasWithENY(tg, g2d); //AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); label = getRevDLabel(nCode); AddIntegralAreaModifier(tg, label + " " + tg.get_Name(), area, 0, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, csFactor, ptCenter, ptCenter, false); break; case 151000: //fort now has T modifier AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); break; case 151401: //airaoa case 151402: //rotary if (tg.Pixels.size() == 3) //one segment { midPt = lineutility.MidPointDouble(pt0, pt1, 0); AddIntegralAreaModifier(tg, tg.get_DTG(), aboveMiddle, 0, midPt, midPt, false); AddIntegralAreaModifier(tg, tg.get_DTG1(), aboveMiddle, csFactor, midPt, midPt, false); AddIntegralAreaModifier(tg, tg.get_Name(), aboveMiddle, 2 * csFactor, midPt, midPt, false); } else if (tg.Pixels.size() == 4) //2 segments { midPt = lineutility.MidPointDouble(pt1, pt2, 0); AddIntegralAreaModifier(tg, tg.get_DTG(), aboveMiddle, 0, midPt, midPt, false); AddIntegralAreaModifier(tg, tg.get_DTG1(), aboveMiddle, csFactor, midPt, midPt, false); AddIntegralAreaModifier(tg, tg.get_Name(), aboveMiddle, 2 * csFactor, midPt, midPt, false); } else // 3 or more segments { midPt = lineutility.MidPointDouble(pt1, pt2, 0); AddIntegralAreaModifier(tg, tg.get_DTG(), aboveMiddle, -csFactor / 2, midPt, midPt, false); AddIntegralAreaModifier(tg, tg.get_DTG1(), aboveMiddle, csFactor / 2, midPt, midPt, false); midPt = lineutility.MidPointDouble(pt2, pt3, 0); AddIntegralAreaModifier(tg, tg.get_Name(), aboveMiddle, -csFactor / 2, midPt, midPt, false); } break; case 151403: //main case 151404: //spt case 151405: case 151406: case 151407: case 151408: if (tg.Pixels.size() == 3) //one segment { midPt = lineutility.MidPointDouble(pt0, pt1, 0); AddIntegralAreaModifier(tg, tg.get_DTG(), aboveMiddle, 0, midPt, midPt, false); AddIntegralAreaModifier(tg, tg.get_DTG1(), aboveMiddle, csFactor, midPt, midPt, false); AddIntegralAreaModifier(tg, tg.get_Name(), aboveMiddle, 2 * csFactor, midPt, midPt, false); } else //2 or more segments { midPt = lineutility.MidPointDouble(pt0, pt1, 0); AddIntegralAreaModifier(tg, tg.get_DTG(), aboveMiddle, -csFactor / 2, midPt, midPt, false); AddIntegralAreaModifier(tg, tg.get_DTG1(), aboveMiddle, csFactor / 2, midPt, midPt, false); midPt = lineutility.MidPointDouble(pt1, pt2, 0); AddIntegralAreaModifier(tg, tg.get_Name(), aboveMiddle, -csFactor / 2, midPt, midPt, false); } break; case 140601: //diratkair case 140602: case 140603: case 140604: case 140605: midPt = lineutility.MidPointDouble(pt0, pt1, 0); //midPt=lineutility.MidPointDouble(pt0, midPt, 0); AddIntegralAreaModifier(tg, tg.get_Name(), aboveMiddle, 0, pt0, midPt, false); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, csFactor, pt0, pt1, false); break; case 140606: case 140607: midPt = lineutility.MidPointDouble(pt0, pt1, 0); AddIntegralAreaModifier(tg, tg.get_N(), aboveMiddle, 0, pt1, midPt, false); break; case 170800: //bdz label = getRevDLabel(nCode); AddIntegralAreaModifier(tg, label, aboveMiddle, 0, ptCenter, ptCenter, false); break; case 151500: //assault pos label = getRevDLabel(nCode); AddIntegralAreaModifier(tg, label + " " + tg.get_Name(), aboveMiddle, 0, ptCenter, ptCenter, false); break; case 151600: //atk pos case 151700: //obj AddIntegralAreaModifier(tg, label + " " + tg.get_Name(), aboveMiddle, 0, ptCenter, ptCenter, false); break; case 141300: GetMBR(tg, ul, ur, lr, ll); AddIntegralAreaModifier(tg, label, aboveMiddle, 1.35 * factor * csFactor, ll, lr, false); break; case 170100: case 170101: case 170200: case 170300: case 170500: case 170700: AddIntegralModifier(tg, label + " " + tg.get_Name(), aboveMiddle, 0, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Max Alt: " + tg.get_H1(), aboveMiddle, -4 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Min Alt: " + tg.get_H(), aboveMiddle, -5 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Width: " + tg.get_H2(), aboveMiddle, -6 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Name: " + tg.get_Name(), aboveMiddle, -7 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "DTG Start: " + tg.get_DTG(), aboveMiddle, -3 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "DTG End: " + tg.get_DTG1(), aboveMiddle, -2 * csFactor, middleSegment, middleSegment + 1, false); break; case 170400: case 170600: label = getRevDLabel(nCode); AddIntegralModifier(tg, label + " " + tg.get_Name(), aboveMiddle, 0, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Max Alt: " + tg.get_H1(), aboveMiddle, -4 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Min Alt: " + tg.get_H(), aboveMiddle, -5 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Width: " + tg.get_H2(), aboveMiddle, -6 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "Name: " + tg.get_Name(), aboveMiddle, -7 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "DTG Start: " + tg.get_DTG(), aboveMiddle, -3 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, "DTG End: " + tg.get_DTG1(), aboveMiddle, -2 * csFactor, middleSegment, middleSegment + 1, false); break; case 171100: case 171200: case 171300: case 171400: case 171500: case 171900: label = getRevDLabel(nCode); AddIntegralAreaModifier(tg, label, area, -2.5, ptCenter, ptCenter, false, ""); AddIntegralAreaModifier(tg, tg.get_Name(), area, -1.5, ptCenter, ptCenter, false, "T"); AddIntegralAreaModifier(tg, "MIN ALT: " + tg.get_H(), area, -0.5, ptCenter, ptCenter, false, "H"); AddIntegralAreaModifier(tg, "MAX ALT: " + tg.get_H1(), area, 0.5, ptCenter, ptCenter, false, "H1"); AddIntegralAreaModifier(tg, "TIME FROM: " + tg.get_DTG(), area, 1.5, ptCenter, ptCenter, false, "W"); AddIntegralAreaModifier(tg, "TIME TO: " + tg.get_DTG1(), area, 2.5, ptCenter, ptCenter, false, "W1"); break; case 200300: label = getRevDLabel(nCode); AddIntegralAreaModifier(tg, label, aboveMiddle, -1, pt0, pt0, false); //ENY or N? AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, csFactor, pt0, pt0, false); break; case 220107: case 220108: label = getRevDLabel(nCode); AddIntegralAreaModifier(tg, label, aboveMiddle, 0, pt0, pt1, false); //ENY or N? break; case 240101: AddIntegralAreaModifier(tg, label, area, -3 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, -2 * csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, "MIN ALT: " + tg.get_H(), area, -1 * csFactor, ptCenter, ptCenter, false, "H"); AddIntegralAreaModifier(tg, "MAX ALT: " + tg.get_H1(), area, 0, ptCenter, ptCenter, false, "H1"); AddIntegralAreaModifier(tg, tg.get_Location(), area, 1 * csFactor, ptCenter, ptCenter, false, "H2"); AddIntegralAreaModifier(tg, tg.get_DTG(), area, 2 * csFactor, ptCenter, ptCenter, false, "W"); AddIntegralAreaModifier(tg, tg.get_DTG1(), area, 3 * csFactor, ptCenter, ptCenter, false, "W1"); break; case 300100: //icl label = getRevDLabel(nCode); pt0 = tg.Pixels.get(0); pt1 = tg.Pixels.get(1); pt2 = tg.Pixels.get(tg.Pixels.size() - 1); pt3 = tg.Pixels.get(tg.Pixels.size() - 2); dist = lineutility.CalcDistanceDouble(pt0, pt1); dist2 = lineutility.CalcDistanceDouble(pt2, pt3); stringWidth = (int) ((double) metrics.stringWidth(tg.get_Name() + " " + label)); stringWidth2 = (int) ((double) metrics.stringWidth(tg.get_DTG())); if (stringWidth2 > stringWidth) { stringWidth = stringWidth2; } if (tg.Pixels.size() == 2) //one segment { pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, stringWidth); //AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); if (dist > 3.5 * stringWidth)//was 28stringwidth+5 { pt0 = tg.Pixels.get(tg.Pixels.size() - 1); pt1 = tg.Pixels.get(tg.Pixels.size() - 2); pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, stringWidth); //AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } } else //more than one semgent { double dist3 = lineutility.CalcDistanceDouble(pt0, pt2); if (dist > stringWidth + 5 || dist >= dist2 || dist3 > stringWidth + 5) { pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, stringWidth); //AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } if (dist2 > stringWidth + 5 || dist2 > dist || dist3 > stringWidth + 5) { pt0 = tg.Pixels.get(tg.Pixels.size() - 1); pt1 = tg.Pixels.get(tg.Pixels.size() - 2); pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, stringWidth); //AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } } break; case 260300: //nfl handle like fscl case 260400: label = getRevDLabel(nCode); pt0 = tg.Pixels.get(0); pt1 = tg.Pixels.get(1); pt2 = tg.Pixels.get(tg.Pixels.size() - 1); pt3 = tg.Pixels.get(tg.Pixels.size() - 2); dist = lineutility.CalcDistanceDouble(pt0, pt1); dist2 = lineutility.CalcDistanceDouble(pt2, pt3); stringWidth = (int) ((double) metrics.stringWidth(tg.get_Name() + " " + label)); stringWidth2 = (int) ((double) metrics.stringWidth(tg.get_DTG())); if (stringWidth2 > stringWidth) { stringWidth = stringWidth2; } if (tg.Pixels.size() == 2) //one segment { pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, stringWidth); //AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); if (dist > 3.5 * stringWidth)//was 28stringwidth+5 { pt0 = tg.Pixels.get(tg.Pixels.size() - 1); pt1 = tg.Pixels.get(tg.Pixels.size() - 2); pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, stringWidth); //AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } } else //more than one semgent { double dist3 = lineutility.CalcDistanceDouble(pt0, pt2); if (dist > stringWidth + 5 || dist >= dist2 || dist3 > stringWidth + 5) { pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, stringWidth); //AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } if (dist2 > stringWidth + 5 || dist2 > dist || dist3 > stringWidth + 5) { pt0 = tg.Pixels.get(tg.Pixels.size() - 1); pt1 = tg.Pixels.get(tg.Pixels.size() - 2); pt1 = lineutility.ExtendAlongLineDouble(pt0, pt1, stringWidth); //AddModifier2(tg, tg.get_Name() + " " + label, aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, label + " " + tg.get_Name(), aboveMiddle, -0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG(), aboveMiddle, 0.7 * csFactor, pt0, pt1, false); AddModifier2(tg, tg.get_DTG1(), aboveMiddle, 1.7 * csFactor, pt0, pt1, false); } } break; case 260600: //mfp pt0 = tg.Pixels.get(middleSegment); pt1 = tg.Pixels.get(middleSegment + 1); AddIntegralModifier(tg, label, aboveMiddle, 0, middleSegment, middleSegment + 1, true); AddIntegralModifier(tg, tg.get_DTG(), aboveEnd, 1 * csFactor, 0, 1, false); AddIntegralModifier(tg, tg.get_DTG1(), aboveEnd, 2 * csFactor, 0, 1, false); break; case 240701: //lintgt AddIntegralModifier(tg, ap, aboveMiddle, -0.8 * csFactor, middleSegment, middleSegment + 1, false); break; case 240702: //smoke AddIntegralModifier(tg, ap, aboveMiddle, -0.8 * csFactor, middleSegment, middleSegment + 1, false); AddIntegralModifier(tg, label, aboveMiddle, 0.8 * csFactor, middleSegment, middleSegment + 1, false); break; case 240703: AddIntegralModifier(tg, ap, aboveMiddle, -1 * csFactor, 0, 1, false); AddIntegralModifier(tg, label, aboveMiddle, 1 * csFactor, 0, 1, false); AddIntegralModifier(tg, tg.get_T1(), aboveMiddle, 2 * csFactor, 0, 1, false); AddIntegralModifier(tg, v, aboveMiddle, 3 * csFactor, 0, 1, false); break; case 240801: AddIntegralAreaModifier(tg, ap, area, 0, ptCenter, ptCenter, false); break; case 240802: case 240803: AddIntegralAreaModifier(tg, ap, area, 0, pt0, pt0, false); break; case 240804: AddIntegralAreaModifier(tg, tg.get_Name(), area, 0, ptCenter, ptCenter, false); break; case 240806: //smoke case 240807: AddIntegralAreaModifier(tg, ap, area, -csFactor, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, label, area, 0, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), area, 1 * csFactor, ptCenter, ptCenter, false, "W+W1"); break; case 242301: //kill boxes irregular case 242304: AddIntegralAreaModifier(tg, label, area, 0, ptCenter, ptCenter, false); AddIntegralAreaModifier(tg, tg.get_Name(), area, 1 * csFactor, ptCenter, ptCenter, false); GetMBR(tg, ul, ur, lr, ll); POINT2 ptLeft = ul; POINT2 ptRight = ur; if (tg.get_Client().equalsIgnoreCase("ge")) { ptLeft.x -= font.getSize() / 2; ptRight.x -= font.getSize() / 2; } AddIntegralAreaModifier(tg, tg.get_DTG(), toEnd, 0.5 * csFactor, ptLeft, ptRight, false, "W"); AddIntegralAreaModifier(tg, tg.get_DTG1(), toEnd, 1.5 * csFactor, ptLeft, ptRight, false, "W1"); break; case 242302: //kill box rect, circ have W,W1 outside use AddModifiers2RevD case 242303: case 242305: case 242306: case 140500: //pdf has no label break; case 290100: //zone AddIntegralModifier(tg, tg.get_Name(), aboveMiddle, csFactor, middleSegment, middleSegment + 1, false); break; case 290600: //lane new W-W1 use addModifiers2RevD break; case 270800: //mined GetMBR(tg, ul, ur, lr, ll); AddIntegralAreaModifier(tg, tg.get_H(), aboveMiddle, -1.5 * factor * csFactor, ul, ur, false); AddIntegralAreaModifier(tg, tg.get_DTG(), aboveMiddle, 1.5 * factor * csFactor, ll, lr, false); areasWithENY(tg, g2d); break; case 271300: //ASLTXING uses W-W1 like gap if (tg.Pixels.get(1).y > tg.Pixels.get(0).y) { pt0 = tg.Pixels.get(1); pt1 = tg.Pixels.get(3); pt2 = tg.Pixels.get(0); pt3 = tg.Pixels.get(2); } else { pt0 = tg.Pixels.get(0); pt1 = tg.Pixels.get(2); pt2 = tg.Pixels.get(1); pt3 = tg.Pixels.get(3); } pt2 = lineutility.ExtendAlongLineDouble2(pt0, pt2, -20); pt3 = lineutility.ExtendAlongLineDouble2(pt1, pt3, -20); AddIntegralAreaModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, 0, pt2, pt3, false); break; case 330100: //convoys case 330200: String convoyBlankString = blankString(metrics, 35); AddIntegralModifier(tg, v + convoyBlankString + tg.get_H(), aboveMiddle, 0, 0, 1, false); AddIntegralModifier(tg, tg.get_DTG() + dash + tg.get_DTG1(), aboveMiddle, 1.2 * csFactor, 0, 1, false); break; default: Modifier2.AddModifiersGeo(tg, g2d, clipBounds, converter); break; } } catch (Exception exc) { ErrorLogger.LogException(_className, "AddModifiersGeo2", new RendererException("Failed inside AddModifiersGeo2", exc)); } } }