コード例 #1
0
ファイル: AirspaceParser.cpp プロジェクト: bugburner/xcsoar
static bool
ParseLine(AirspaceDatabase &airspace_database, int nLineType,
          unsigned &NumberOfAirspacePoints, unsigned &NumberOfAirspaceAreas,
          unsigned &NumberOfAirspaceCircles)
{
  int nIndex;

  switch (nLineType) {
  case k_nLtAC:
    if (bFillMode) {
      if (!bWaiting)
        AddArea(airspace_database, &TempArea, NumberOfAirspaceAreas);
      TempArea.NumPoints = 0;
      TempArea.Type = OTHER;
      for (nIndex = 0; nIndex < k_nAreaCount; nIndex++) {
        if (StartsWith(&TempString[3], k_strAreaStart[nIndex])) {
          TempArea.Type = k_nAreaType[nIndex];
          break;
        }
      }
      Rotation = +1;
    }
    else if (!bWaiting)   // Don't count circles JG 10-Nov-2005
      NumberOfAirspaceAreas++;

    Rotation = +1;
    bWaiting = false;
    break;

  case k_nLtAN:
    if (bFillMode) {
      TempString[NAME_SIZE] = '\0';
      _tcscpy(TempArea.Name, &TempString[3]);
    }
    break;

  case k_nLtAL:
    if (bFillMode)
      ReadAltitude(&TempString[3], &TempArea.Base);
    break;

  case k_nLtAH:
    if (bFillMode)
      ReadAltitude(&TempString[3],&TempArea.Top);
    break;

  case k_nLtV:
    // Need to set these while in count mode, or DB/DA will crash
    if (StartsWith(&TempString[2], _T("X=")) ||
        StartsWith(&TempString[2], _T("x="))) {
      if (ReadCoords(&TempString[4],&CenterX, &CenterY))
        break;
    } else if (StartsWith(&TempString[2], _T("D=-")) ||
               StartsWith(&TempString[2], _T("d=-"))) {
      Rotation = -1;
      break;
    } else if (StartsWith(&TempString[2], _T("D=+")) ||
             StartsWith(&TempString[2], _T("d=+"))) {
      Rotation = +1;
      break;
    } else if (StartsWith(&TempString[2], _T("Z")) ||
               StartsWith(&TempString[2], _T("z"))) {
      // ToDo Display Zool Level
      break;
    } else if (StartsWith(&TempString[2], _T("W")) ||
               StartsWith(&TempString[2], _T("w"))) {
      // ToDo width of an airway
      break;
    } else if (StartsWith(&TempString[2], _T("T")) ||
               StartsWith(&TempString[2], _T("t"))) {
      // ----- JMW THIS IS REQUIRED FOR LEGACY FILES
      break;
    }

    goto OnError;

  case k_nLtDP:
      /*
        if (bFillMode)
        {
			ReadCoords(&TempString[3],&TempPoint.Longitude ,
                                   &TempPoint.Latitude );
			AddPoint(&TempPoint);
		}
		else
			NumberOfAirspacePoints++;
    */
//		if (bFillMode)
    if (!ReadCoords(&TempString[3],&TempPoint.Longitude ,
                    &TempPoint.Latitude))
      goto OnError;
    AddPoint(airspace_database, &TempPoint, &TempArea.NumPoints,
             NumberOfAirspacePoints);
    // TempArea.NumPoints++;
    break;

  case k_nLtDB:
    CalculateArc(airspace_database, TempString, NumberOfAirspacePoints);
    break;

  case k_nLtDA:
    CalculateSector(airspace_database, TempString, NumberOfAirspacePoints);
    break;

  case k_nLtDC:
    if (bFillMode) {
      double Radius = _tcstod(&TempString[2], NULL);
      Radius = (Radius * NAUTICALMILESTOMETRES);
      AddAirspaceCircle(airspace_database, &TempArea, CenterX, CenterY, Radius,
                        NumberOfAirspaceCircles);
    } else
      NumberOfAirspaceCircles++;

    bWaiting = true;
    break;

  default:
    break;
  }

  return(true);

OnError:

  if (!bFillMode){
    TCHAR sTmp[MAX_PATH];
    _stprintf(sTmp, TEXT("%s: %d\r\n\"%s\"\r\n%s."),
              gettext(TEXT("Parse Error at Line")),
              LineCount, TempString,
              gettext(TEXT("Line skipped.")));
    if (MessageBoxX(sTmp, gettext(TEXT("Airspace")),
                    MB_OKCANCEL) == IDCANCEL){
      return(false);
    }
  }

  return(true);

}
コード例 #2
0
ファイル: AirspaceParser.cpp プロジェクト: Mrdini/XCSoar
static bool
ParseLine(Airspaces &airspace_database, const TCHAR *line,
          TempAirspaceType &temp_area)
{
  const TCHAR *value;

  // Only return expected lines
  switch (line[0]) {
  case _T('A'):
  case _T('a'):
    switch (line[1]) {
    case _T('C'):
    case _T('c'):
      value = value_after_space(line + 2);
      if (value == NULL)
        break;

      if (!temp_area.Waiting)
        temp_area.AddPolygon(airspace_database);

      temp_area.reset();

      temp_area.Type = ParseType(value);
      temp_area.Waiting = false;
      break;

    case _T('N'):
    case _T('n'):
      value = value_after_space(line + 2);
      if (value != NULL)
        temp_area.Name = value;
      break;

    case _T('R'):
    case _T('r'):
      value = value_after_space(line + 2);
      if (value != NULL)
        temp_area.Radio = value;
      break;

    case _T('L'):
    case _T('l'):
      value = value_after_space(line + 2);
      if (value != NULL)
        ReadAltitude(value, &temp_area.Base);
      break;

    case _T('H'):
    case _T('h'):
      value = value_after_space(line + 2);
      if (value != NULL)
        ReadAltitude(value, &temp_area.Top);
      break;

    default:
      return true;
    }

    break;

  case _T('D'):
  case _T('d'):
    switch (line[1]) {
    case _T('A'):
    case _T('a'):
      CalculateSector(line, temp_area);
      break;

    case _T('B'):
    case _T('b'):
      CalculateArc(line, temp_area);
      break;

    case _T('C'):
    case _T('c'):
      temp_area.Radius = Units::ToSysUnit(fixed(_tcstod(&line[2], NULL)),
                                          unNauticalMiles);
      temp_area.AddCircle(airspace_database);
      temp_area.reset();
      break;

    case _T('P'):
    case _T('p'):
      value = value_after_space(line + 2);
      if (value == NULL)
        break;

    {
      GeoPoint TempPoint;
      if (!ReadCoords(value, TempPoint))
        return false;

      temp_area.points.push_back(TempPoint);
      break;
    }
    default:
      return true;
    }
    break;

  case _T('V'):
  case _T('v'):
    // Need to set these while in count mode, or DB/DA will crash
    if (string_after_prefix_ci(&line[2], _T("X="))) {
      if (!ReadCoords(&line[4],temp_area.Center))
        return false;
    } else if (string_after_prefix_ci(&line[2], _T("D=-"))) {
      temp_area.Rotation = -1;
    } else if (string_after_prefix_ci(&line[2], _T("D=+"))) {
      temp_area.Rotation = +1;
    }
    break;
  }

  return true;
}