Exemplo n.º 1
0
//-----------------------------------------------------------------------------
//! Calculates the distance between 2 points in nautical miles
//-----------------------------------------------------------------------------
double tGisCalc::SphericalDistance( const tRCoord& coord1, const tRCoord& coord2, tGisCalcTraverseMethod method )
{
    double distance;
    if( method == GREAT_CIRCLE )
    {
        distance = GreatCircleDistance( coord1, coord2 );
    }
    else
    {
        double distRads;
        ShortestRhumbLineDistance( coord1.RLat(), coord1.RLon(),
                                   coord2.RLat(), coord2.RLon(),
                                   distRads );

        distance = distRads * tGisConvert::RadiansToNauticalMiles;
    }

    return distance;
}
Exemplo n.º 2
0
int SetupMIFLINES(MIFPASSEDDATADef *pMIFPASSEDDATA, MIFLINESDef *pMIFLINES)
{
  MIFLINESDef MIFLINES[TMSRPT61_MAXMIFLINES];
  CString s;
  double  dValue1, dValue2, dValue3, dValue4;
  double  Lat, Long;
  double  distance;
  double  leastDistance;
  BOOL    bDATAFound;
  BOOL    bCoordSysNonEarthFound;
  BOOL    bBreak;
  BOOL    bFound;
  char   *ptr;
  long    firstNODESrecordID;
  long    firstStopNumber;
  long    firstStopNODESrecordID;
  long    toNODESrecordID;
  long    toStopNumber;
  long    toStopNODESrecordID;
  long    NODESrecordID;
  long    previousNODESrecordID;
  long    travelTime;
  int     nI, nJ, nK;
  int     numMultiples;
  int     numSegments;
  int     numMIFLINES;
  int     rcode2;
  int     leastDistanceIndex;
  int     MIFPointer;
//
//  Establish and open the .mif file
//
  CString MIFFileName;
  CStdioFile MIFFile;

  MIFFileName = pMIFPASSEDDATA->szMIFFileName;
//
//  Look for this pattern name attached to the szMIFFileName
//  to see if we have a spcialized trace file
//
  PATTERNNAMESKey0.recordID = pMIFPASSEDDATA->PATTERNNAMESrecordID;
  rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
  if(rcode2 != 0)
  {
    sprintf(tempString, "***ERR Pattern not found in PATTERNNAMES : RecordID = %ld\r\n", pMIFPASSEDDATA->PATTERNNAMESrecordID);
    _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString));
    return(NO_RECORD);
  }
  else
  {
    strncpy(tempString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
    trim(tempString, PATTERNNAMES_NAME_LENGTH);
    MIFFileName += tempString;
    MIFFileName += ".mif";
    sprintf(tempString, "***INF Opening Trace File : \"%s\"\r\n", MIFFileName);
    _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString));
//
//  The specialized trace file isn't there - look for the regular one
//
    if(MIFFile.Open(MIFFileName, CFile::modeRead | CFile::typeText | CFile::shareDenyNone) == 0)
    {
      sprintf(tempString, "***INF Could not open Trace File : \"%s\"\r\n", MIFFileName);
      _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString));
      MIFFileName = pMIFPASSEDDATA->szMIFFileName;
      MIFFileName  += ".mif";
      sprintf(tempString, "***INF Opening Trace File : \"%s\"\r\n", MIFFileName);
      _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString));
      if(MIFFile.Open(MIFFileName, CFile::modeRead | CFile::typeText | CFile::shareDenyNone) == 0)
      {
        s.LoadString(ERROR_349);
        sprintf(szarString, s, MIFFileName);
        MessageBeep(MB_ICONINFORMATION);
        MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONINFORMATION);
        sprintf(tempString, "***ERR Could not open Trace File : \"%s\"\r\n", MIFFileName);
        _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString));
        return(NO_RECORD);
      }
    }
  }
//
//  Cycle through the .MIF file
//
  bDATAFound = FALSE;
  bCoordSysNonEarthFound = FALSE;
  numMIFLINES = 0;
  MIFFile.SeekToBegin();
  while(MIFFile.ReadString(s))
  {
    s.MakeUpper();
//
//  Scan through until we hit "DATA" and/or "CoordSys"
//
    if(!bDATAFound)
    {
//
//  Is "CoordSys NonEarth" present?
//
      if(!bCoordSysNonEarthFound)
      {
        nI = s.Find("COORDSYS NONEARTH", 0);
        if(nI != -1)
        {
          bCoordSysNonEarthFound = TRUE;
          continue;
        }
      }
//
//  Check for "DATA"
//
      nI = s.Find("DATA", 0);
      if(nI != -1)
      {
        bDATAFound = TRUE;
      }
      continue;
    }
//
//  "DATA" Encountered.  Now look to see what lines are involved.
//
//  "PLINE"
//
    nI = s.Find("PLINE", 0);
    if(nI != -1)
    {
//
//  There are two possibilities in a PLINE statement:
//     1) It's followed (on the same line) by the number of points to follow
//     2) It's followed (on the same line) by the keyword "MULTIPLE" and then the number of sections,
//        with each section starting with the number of points to follow
// 
//  Look for "MULTIPLE"
//
      strcpy(tempString, s);
      nI = s.Find("MULTIPLE", 0);
      if(nI != -1)
      {
        if((ptr = strtok(tempString, wSpace)) == NULL)  // Get rid of "PLINE"
        {
          continue;
        }
        if((ptr = strtok(NULL, wSpace)) == NULL)  // Get rid of "MULTIPLE"
        {
          continue;
        }
        if((ptr = strtok(NULL, wSpace)) == NULL)  // Get the number of multiples
        {
          continue;
        }
        numMultiples = atol(ptr);
        if(!MIFFile.ReadString(s))
        {
          break;
        }
        numSegments = atol(s);
      }
//
//  No "MULTIPLE" - get the number of segments
//
      else
      {
        numMultiples = 1;
        if((ptr = strtok(tempString, wSpace)) == NULL)  // Get rid of "PLINE"
        {
          continue;
        }
        if((ptr = strtok(NULL, wSpace)) == NULL)  // Get the number of segments
        {
          continue;
        }
        numSegments = atol(ptr);
      }
//
//  Loop through the segments and multiples
//
      bBreak = FALSE;
      for(nI = 0; nI < numMultiples; nI++)
      {
        if(bBreak)
        {
          break;
        }
        for(nJ = 0; nJ < numSegments; nJ++)
        {
          if(!MIFFile.ReadString(s))
          {
            bBreak = TRUE;
            break;
          }
          strcpy(tempString, s);
          if((ptr = strtok(tempString, wSpace)) == NULL)  // Take the first numeric
          {
            continue;
          }
          dValue1 = (double)atof(ptr);
          if((ptr = strtok(NULL, wSpace)) == NULL)  // Get the second numeric
          {
            continue;
          }
          dValue2 = (double)atof(ptr);
//
//  Got two doubles - do we have to convert them to Lat/Long?
//
          if(bCoordSysNonEarthFound)
          {
            EN2LL(23, dValue1, dValue2, szUTMZone, &Lat, &Long);
          }
          else
          {
            Long = dValue1;
            Lat  = dValue2;
//            Long = dValue2;
//            Lat  = dValue1;
          }
//
//  Save Lat and Long to the data structure
//
          MIFLINES[numMIFLINES].flags = nJ == 0 ? MIFLINES_FLAG_START : 0;
          if(nJ != numSegments - 1)
          {
            MIFLINES[numMIFLINES].from.longitude = Long;
            MIFLINES[numMIFLINES].from.latitude = Lat;
          }
          if(nJ > 0)
          {
            MIFLINES[numMIFLINES - 1].to.longitude = Long;
            MIFLINES[numMIFLINES - 1].to.latitude = Lat;
          }
          if(nJ != numSegments - 1)
          {
            numMIFLINES++;
            if(numMIFLINES >= TMSRPT61_MAXMIFLINES)
            {
              sprintf(tempString, "***ERR TMSRPT61_MAXMIFLINES too small (1)\r\n");
              _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString));
              return(NO_RECORD);
            }
          }
        }
        if(numMultiples > 1)
        {
          if(!MIFFile.ReadString(s))
          {
            bBreak = TRUE;
          }
          else
          {
            numSegments = atol(s);
          }
        }
      }
    }
//
//  "LINE"
//
    else
    {
      nI = s.Find("LINE", 0);
      if(nI != -1)
      {
        strcpy(tempString, s);
        if((ptr = strtok(tempString, wSpace)) == NULL)  // Get rid of "LINE"
        {
          continue;
        }
        if((ptr = strtok(NULL, wSpace)) == NULL)  // Take the first numeric
        {
          continue;
        }
        dValue1 = (double)atof(ptr);
        if((ptr = strtok(NULL, wSpace)) == NULL)  // Get the second numeric
        {
          continue;
        }
        dValue2 = (double)atof(ptr);
        if((ptr = strtok(NULL, wSpace)) == NULL)  // Get the third numeric
        {
          continue;
        }
        dValue3 = (double)atof(ptr);
        if((ptr = strtok(NULL, wSpace)) == NULL)  // Get the fourth numeric
        {
          continue;
        }
        dValue4 = (double)atof(ptr);
//
//  Do we convert?
//
        if(bCoordSysNonEarthFound)
        {
          EN2LL(23, dValue1, dValue2, szUTMZone, &Lat, &Long);
        }
        else
        {
          Long = dValue1;
          Lat  = dValue2;
        }
        MIFLINES[numMIFLINES].flags = MIFLINES_FLAG_START;
        MIFLINES[numMIFLINES].from.longitude = Long;
        MIFLINES[numMIFLINES].from.latitude = Lat;
        if(bCoordSysNonEarthFound)
        {
          EN2LL(23, dValue3, dValue4, szUTMZone, &Lat, &Long);
        }
        else
        {
          Long = dValue3;
          Lat  = dValue4;
        }
        MIFLINES[numMIFLINES].to.longitude = Long;
        MIFLINES[numMIFLINES].to.latitude = Lat;
        numMIFLINES++;
        if(numMIFLINES >= TMSRPT61_MAXMIFLINES)
        {
          sprintf(tempString, "***ERR TMSRPT61_MAXMIFLINES too small (2)\r\n");
          _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString));
          return(NO_RECORD);
        }
      }
    }
  }
//
//  Establish the output lines
//
//  Get the first node on the pattern
//
  PATTERNSKey2.ROUTESrecordID = pMIFPASSEDDATA->ROUTESrecordID;
  PATTERNSKey2.SERVICESrecordID = pMIFPASSEDDATA->SERVICESrecordID;
  PATTERNSKey2.directionIndex = pMIFPASSEDDATA->directionIndex;
  PATTERNSKey2.PATTERNNAMESrecordID = pMIFPASSEDDATA->PATTERNNAMESrecordID;
  PATTERNSKey2.nodeSequence = NO_RECORD;
  rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
  if(rcode2 == 0 &&
        PATTERNS.ROUTESrecordID == pMIFPASSEDDATA->ROUTESrecordID &&
        PATTERNS.SERVICESrecordID == pMIFPASSEDDATA->SERVICESrecordID &&
        PATTERNS.directionIndex == pMIFPASSEDDATA->directionIndex &&
        PATTERNS.PATTERNNAMESrecordID == pMIFPASSEDDATA->PATTERNNAMESrecordID)
  {
    NODESrecordID = NodeEquivalenced(PATTERNS.NODESrecordID);
    NODESKey0.recordID = NODESrecordID == NO_RECORD ? PATTERNS.NODESrecordID : NODESrecordID;
    btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
    firstNODESrecordID = NODES.recordID;
    firstStopNumber = (pMIFPASSEDDATA->directionIndex == 0 ? NODES.OBStopNumber : NODES.IBStopNumber);
    if(firstStopNumber <= 0)
    {
      firstStopNumber = NODES.number;
    }
    if(firstStopNumber > 0)
    {
      bFound = FALSE;
      rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0);
      while(rcode2 == 0)
      {
        if((NODES.flags & NODES_FLAG_STOP))
        {
          if(NODES.number == firstStopNumber)
          {
            firstStopNODESrecordID = NODES.recordID;
            bFound = TRUE;
            break;
          }
        }
        rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0);
      }
      if(!bFound)
      {
        NODESKey0.recordID = PATTERNS.NODESrecordID;
        btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
      }
//
//  Change to stop number (as derived from long name) : Bob Antonisse, 2-Aug-07
//
      else
      {
        strncpy(tempString, NODES.longName, NODES_LONGNAME_LENGTH);
        trim(tempString, NODES_LONGNAME_LENGTH);
        firstStopNumber = atol(&tempString[4]);
      }
    }
    Long = NODES.longitude;
    Lat = NODES.latitude;
  }
  else
  {
    sprintf(tempString, "***ERR Pattern without nodes\r\n");
    _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString));
    return(NO_RECORD);
  }
//
//  Locate the closest MIFLINE to the starting node
//  and string the rest of the lines together in order
//
  for(nI = 0; nI < numMIFLINES; nI++)
  {
    leastDistance = 10000;
    leastDistanceIndex = NO_RECORD;
    for(nJ = 0; nJ < numMIFLINES; nJ++)
    {
      if(MIFLINES[nJ].flags & MIFLINES_FLAG_USED)
      {
        continue;
      }
      distance = GreatCircleDistance(Long, Lat, MIFLINES[nJ].from.longitude, MIFLINES[nJ].from.latitude);
      if(distance < leastDistance)
      {
        leastDistance = distance;
        leastDistanceIndex = nJ;
      }
    }
    if(leastDistanceIndex == NO_RECORD)
    {
      sprintf(tempString, "***ERR Least distance index remained at NO_RECORD in search for starting node\r\n");
      _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString));
      return(NO_RECORD);
    }
    pMIFLINES[nI] = MIFLINES[leastDistanceIndex];
    Long = MIFLINES[leastDistanceIndex].to.longitude;
    Lat = MIFLINES[leastDistanceIndex].to.latitude;
    MIFLINES[leastDistanceIndex].flags = MIFLINES_FLAG_USED;
  }
  if(pMIFPASSEDDATA->ROUTESrecordID == 16)
  {
    nI = 1;
  }
//
//  Set all the lines to be contiguous (no "pen up")
//  and set all the nodes to NO_RECORD
//

  for(nI = 1; nI < numMIFLINES; nI++)
  {
    pMIFLINES[nI].from.latitude  = pMIFLINES[nI - 1].to.latitude;
    pMIFLINES[nI].from.longitude = pMIFLINES[nI - 1].to.longitude;
  }

//
//  Nodes and associated stops refer to the "from" element of the
//  first line kept in MIFLINES, and to the "to" element of each
//  subsequent line.
//
//  We got the first node in the pattern earlier
//
  pMIFLINES[0].from.latitude = NODES.latitude;
  pMIFLINES[0].from.longitude = NODES.longitude;
  pMIFLINES[0].from.flags = 0;
  pMIFLINES[0].from.NODESrecordID = firstNODESrecordID;
  pMIFLINES[0].from.associatedStopNODESrecordID = firstStopNODESrecordID;
  pMIFLINES[0].from.associatedStopNumber = firstStopNumber;
  pMIFLINES[0].to.flags = 0;
  pMIFLINES[0].to.NODESrecordID = NO_RECORD;
  pMIFLINES[0].to.associatedStopNODESrecordID = NO_RECORD;
  pMIFLINES[0].to.associatedStopNumber = NO_RECORD;
//
//  Clear out the (yet) unused portions of the structure
//
  for(nI = 1; nI < numMIFLINES; nI++)
  {
    pMIFLINES[nI].from.flags = 0;
    pMIFLINES[nI].from.NODESrecordID = NO_RECORD;
    pMIFLINES[nI].from.associatedStopNODESrecordID = NO_RECORD;
    pMIFLINES[nI].from.associatedStopNumber = NO_RECORD;
    pMIFLINES[nI].to.flags = 0;
    pMIFLINES[nI].to.NODESrecordID = NO_RECORD;
    pMIFLINES[nI].to.associatedStopNODESrecordID = NO_RECORD;
    pMIFLINES[nI].to.associatedStopNumber = NO_RECORD;
  }
//
//  And record the nodes/stops as encountered
//
  pMIFPASSEDDATA->NODESrecordIDs[0] = PATTERNS.NODESrecordID;
  pMIFPASSEDDATA->numNodes = 1;
//
//  Put the rest of the pattern nodes/stops into the MIFLINES structure
//
  MIFPointer = 0;
  previousNODESrecordID = PATTERNS.NODESrecordID;
  rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
  while(rcode2 == 0 &&
        PATTERNS.ROUTESrecordID == pMIFPASSEDDATA->ROUTESrecordID &&
        PATTERNS.SERVICESrecordID == pMIFPASSEDDATA->SERVICESrecordID &&
        PATTERNS.directionIndex == pMIFPASSEDDATA->directionIndex &&
        PATTERNS.PATTERNNAMESrecordID == pMIFPASSEDDATA->PATTERNNAMESrecordID)
  {
    pMIFPASSEDDATA->NODESrecordIDs[pMIFPASSEDDATA->numNodes] = PATTERNS.NODESrecordID;
    pMIFPASSEDDATA->numNodes++;
//
//  If we encounter a mid-trip layover, it gets a special record.
//
//  From Orbital:
//    "To declare a mid-trip layover, the pattern in the VTP File must contain exactly one record where the
//    'from timepoint name' and 'to timepoint name' fields are set to exactly the same non-null value.
//    In the example case, they should both be set to 'LTCA'.  It wouldn't work to set one to 'LTCA' and
//    the other to 'LTCD' because our software would interpret this as two distinct timepoints.  The following
//    field pairs must also match:  'from timepoint id' = 'to timepoint id', 'from stop name' = 'to stop name',
//    'from stop id' = 'to stop id', 'from longitude' = 'to longitude', 'from latitude' = 'to latitude'.
//
    if(NodesEquivalent(previousNODESrecordID, PATTERNS.NODESrecordID, &travelTime))
    {
      pMIFLINES[MIFPointer - 1].flags |= MIFLINES_FLAG_NEXTISSAMELOCATION;  // MIFPointer can't be 0
    }
//
//  Not a mid-trip layover
//
    else
    {
//
//  Isolate the node
//
      if(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)
      {
        NODESKey0.recordID = PATTERNS.NODESrecordID;
        btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
        toNODESrecordID = NO_RECORD;
        toStopNODESrecordID = NODES.recordID;
        toStopNumber = (pMIFPASSEDDATA->directionIndex == 0 ? NODES.OBStopNumber : NODES.IBStopNumber);
        if(toStopNumber <= 0)
        {
//          toStopNumber = NODES.number;
          strncpy(tempString, NODES.longName, NODES_LONGNAME_LENGTH);
          trim(tempString, NODES_LONGNAME_LENGTH);
          toStopNumber = atol(&tempString[4]);
        }
      }
      else
      {
        NODESrecordID = NodeEquivalenced(PATTERNS.NODESrecordID);
        NODESKey0.recordID = NODESrecordID == NO_RECORD ? PATTERNS.NODESrecordID : NODESrecordID;
        btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
        toNODESrecordID = NODES.recordID;
        toStopNumber = (pMIFPASSEDDATA->directionIndex == 0 ? NODES.OBStopNumber : NODES.IBStopNumber);
        toStopNODESrecordID = NO_RECORD;
        if(toStopNumber <= 0)
        {
          toStopNumber = NODES.number;
        }
        if(toStopNumber > 0)
        {
          bFound = FALSE;
          rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0);
          while(rcode2 == 0)
          {
            if((NODES.flags & NODES_FLAG_STOP) && NODES.number == toStopNumber)
            {
              toStopNODESrecordID = NODES.recordID;
              bFound = TRUE;
              break;
            }
            rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0);
          }
          if(!bFound)
          {
            NODESrecordID = NodeEquivalenced(PATTERNS.NODESrecordID);
            NODESKey0.recordID = NODESrecordID == NO_RECORD ? PATTERNS.NODESrecordID : NODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
          }
          else
          {
            strncpy(tempString, NODES.longName, NODES_LONGNAME_LENGTH);
            trim(tempString, NODES_LONGNAME_LENGTH);
            toStopNumber = atol(&tempString[4]);
          }
        }
      }
//
//  Find the closest endpoint to the node/stop
//
      if(pMIFPASSEDDATA->ROUTESrecordID == 21)
      {
        int nx = 1;
      }
      leastDistance = 10000;
      leastDistanceIndex = NO_RECORD;
      for(nI = MIFPointer; nI < numMIFLINES; nI++)
      {
        distance = GreatCircleDistance(NODES.longitude, NODES.latitude, pMIFLINES[nI].to.longitude, pMIFLINES[nI].to.latitude);
        if(distance < leastDistance)
        {
          leastDistance = distance;
          leastDistanceIndex = nI;
        }
      }
      if(leastDistanceIndex == NO_RECORD)
      {
        sprintf(tempString, "***ERR Least distance index remained at NO_RECORD in search for subsequent nodes\r\n");
        _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString));
        strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
        trim(szarString, NODES_ABBRNAME_LENGTH);
        sprintf(tempString, "***INF This function failed at or before the search for %s on the pattern\r\n", szarString);
        _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString));
        return(NO_RECORD);
      }
//
//  Set the "to" portion of the line to the located node's coordinates
//
      pMIFLINES[leastDistanceIndex].to.flags = PATTERNS.flags;
      pMIFLINES[leastDistanceIndex].to.latitude = NODES.latitude;
      pMIFLINES[leastDistanceIndex].to.longitude = NODES.longitude;
      pMIFLINES[leastDistanceIndex].to.NODESrecordID = toNODESrecordID;
      pMIFLINES[leastDistanceIndex].to.associatedStopNumber = toStopNumber;
      pMIFLINES[leastDistanceIndex].to.associatedStopNODESrecordID = toStopNODESrecordID;
//
//  If we're not on the last one, set the "from" portion of
//  the next line to the located node's coordinates
//
      if(leastDistanceIndex < numMIFLINES - 1)
      {
        pMIFLINES[leastDistanceIndex + 1].from = pMIFLINES[leastDistanceIndex].to;
      }
//
//  Reset the MIFPointer to the next line and cycle back
//
      MIFPointer = leastDistanceIndex + 1;
    }
    previousNODESrecordID = PATTERNS.NODESrecordID;
    rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
  }
//
//  Go through MIFLINES and fill in the "blanks" where lines connect to just other lines
//
//  Do "from" first
//
  long setIndex = 0;

  nI = -1;
  while(nI < numMIFLINES - 1)
  {
    nI++;
    if(nI >= numMIFLINES)
    {
      break;
    }
    if(pMIFLINES[nI].from.NODESrecordID == NO_RECORD &&
          pMIFLINES[nI].from.associatedStopNODESrecordID == NO_RECORD)
    {
      for(bFound = FALSE, nJ = nI; nJ < numMIFLINES; nJ++)
      {
        if(pMIFLINES[nJ].from.NODESrecordID == NO_RECORD &&
              pMIFLINES[nJ].from.associatedStopNODESrecordID == NO_RECORD)
        {
          continue;
        }
        bFound = TRUE;
        break;
      }
      if(!bFound)
      {
        nJ = numMIFLINES;
      }
      for(nK = nI; nK < nJ; nK++)
      {
        pMIFLINES[nK].from.NODESrecordID = pMIFLINES[setIndex].from.NODESrecordID;
        pMIFLINES[nK].from.associatedStopNODESrecordID = pMIFLINES[setIndex].from.associatedStopNODESrecordID;
        pMIFLINES[nK].from.associatedStopNumber = pMIFLINES[setIndex].from.associatedStopNumber;
        pMIFLINES[nK].from.flags = pMIFLINES[setIndex].from.flags;
      }
      nI = nK - 1;
    }
    setIndex = nI;
  }
//
//  Now do "to"
//
  nI = -1;
  while(nI < numMIFLINES - 1)
  {
    nI++;
    if(nI >= numMIFLINES)
    {
      break;
    }
    if(pMIFLINES[nI].to.NODESrecordID == NO_RECORD &&
          pMIFLINES[nI].to.associatedStopNODESrecordID == NO_RECORD)
    {
      for(nJ = nI; nI < numMIFLINES - 1; nJ++)
      {
        if(pMIFLINES[nJ].to.NODESrecordID == NO_RECORD &&
              pMIFLINES[nJ].to.associatedStopNODESrecordID == NO_RECORD)
        {
          continue;
        }
        for(nK = nI; nK < nJ; nK++)
        {
          pMIFLINES[nK].to.NODESrecordID = pMIFLINES[nJ].to.NODESrecordID;
          pMIFLINES[nK].to.associatedStopNODESrecordID = pMIFLINES[nJ].to.associatedStopNODESrecordID;
          pMIFLINES[nK].to.associatedStopNumber = pMIFLINES[nJ].to.associatedStopNumber;
          pMIFLINES[nK].to.flags = pMIFLINES[nJ].to.flags;
        }
        nI = nK - 1;
        break;
      }
    }
  }
//
//
//  Close the file
//
  MIFFile.Close();
//
//  All done
//
//  Return MIFPointer instead of numMIFLINES in case we short turned
//
  return(MIFPointer);
}
Exemplo n.º 3
0
Arquivo: Tmsrpt67.c Projeto: ems/TMS
BOOL FAR TMSRPT67(TMSRPTPassedDataDef *pPassedData)
{
  NodesAndStopsDef NodesAndStops[TMSRPT67_MAXNODESANDSTOPS];
  GetConnectionTimeDef GCTData;
  GenerateTripDef  GTResults;
  BLOCKSDef       *pTRIPSChunk;
  double  prevLat, prevLon;
  HFILE   hfOutputFile;
  HFILE   hfErrorLog;
  float   distanceToHere;
  float   tripDistances[100];
  float   distance;
  struct  tm tmED, tmUD, today;
  time_t  EDmktime;
  time_t  UDmktime;
  time_t  now;
  BOOL  bFound;
  BOOL  bGotError;
  BOOL  bFinishedOK;
  BOOL  bBikeRack;
  BOOL  bFirst;
  long  SERVICESinEffect[TMSRPT66_MAXSERVICES];
  long  year, month, day;
  long  serviceRecordID;
  long  previousPattern;
  long  timeAtStop;
  long  absRecID;
  long  stopFlags;
  long  stopNumber;
  long  assignedToNODESrecordID;
  long  blockNumber;
  long  fromNODESrecordID;
  long  toNODESrecordID;
  long  toTime;
  long  fromTime;
  long  dhd;
  long  number;
  char  outputString[1024];
  char  outputStringSave[1024];
  char  out2[1024];
  char *ptr;
  char *pszReportName;
  char  outputFileName[64];
  char  szServiceCode[SERVICES_NAME_LENGTH + 1];
  char  szTripCode[16];
  int   nI;
  int   rcode2;
  int   dayOfWeek;
  int   numServices;
  int   tripIndex;
  int   numNodes;
  int   seq;

  bFinishedOK = FALSE;
//
//  Maintain the distance measure
//
  distanceMeasureSave = distanceMeasure;
  distanceMeasure = PREFERENCES_MILES;
//
//  Set up the trip planner
//
  if(bUseDynamicTravels)
  {
    if(bUseCISPlan)
    {
      CISfree();
      if(!CISbuild(FALSE, TRUE))
      {
        goto done;
      }
    }
    else
    {
      rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
      while(rcode2 == 0)
      {
        serviceRecordID = SERVICES.recordID;
        InitTravelMatrix(serviceRecordID, TRUE);
        SERVICESKey0.recordID = serviceRecordID;
        btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        btrieve(B_GETPOSITION, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        btrieve(B_GETDIRECT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
        rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
      }
    }
  }
//
//  Create the sub-folder for the output files and chdir into it
//
  nI = (_mkdir(OUTPUT_FOLDER_NAME) == 0) ? TEXT_333 : TEXT_334;
  LoadString(hInst, nI, szFormatString, SZFORMATSTRING_LENGTH);
  sprintf(tempString, szFormatString, OUTPUT_FOLDER_NAME);
  MessageBeep(MB_ICONINFORMATION);
  MessageBox(NULL, tempString, TMS, MB_OK);
  chdir(OUTPUT_FOLDER_NAME);
//
//  Open the error log and fire up the status bar
//
  hfErrorLog = _lcreat("error.log", 0);
  if(hfErrorLog == HFILE_ERROR)
  {
    TMSError((HWND)NULL, MB_ICONSTOP, ERROR_226, (HANDLE)NULL);
    goto done;
  }
  bGotError = FALSE;
  pPassedData->nReportNumber = 66;
  for(nI = 0; nI < m_LastReport; nI++)
  {
    if(TMSRPT[nI].originalReportNumber == pPassedData->nReportNumber)
    {
      pszReportName = TMSRPT[nI].szReportName;
      StatusBarStart(hWndMain, TMSRPT[nI].szReportName);
      break;
    }
  }
//
//  Get today's date
//
   time(&now);
   today = *localtime(&now);
//
//  ==============================
//  Service File - oci_service.csv
//  ==============================
//
  if(StatusBarAbort())
  {
    goto done;
  }
  strcpy(outputFileName, "oci_service.csv");
  hfOutputFile = _lcreat(outputFileName, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(szarString, szFormatString, outputFileName);
    MessageBeep(MB_ICONSTOP);
    MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
    goto done;
  }
  StatusBarText(outputFileName);
//
//  Write out the header
//
  strcpy(outputString, "\"ServiceCode\",\"Date\"\r\n");
  _lwrite(hfOutputFile, outputString, strlen(outputString));
  numServices = 0;
//
//  Dump out the service day based on calendar days
//
//  Effective date
//
  GetYMD(effectiveDate, &year, &month, &day);
  memset(&tmED, 0x00, sizeof(tmED));
  tmED.tm_mday = day;
  tmED.tm_mon = month - 1;
  tmED.tm_year = year - 1900;
//
//  Until date
//
  GetYMD(untilDate, &year, &month, &day);
  memset(&tmUD, 0x00, sizeof(tmUD));
  tmUD.tm_mday = day;
  tmUD.tm_mon = month - 1;
  tmUD.tm_year = year - 1900;
//
//  Start at the effective date and go to the until date
//
  EDmktime = mktime(&tmED);
  if(EDmktime == (time_t)(-1))
  {
    LoadString(hInst, ERROR_328, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(outputString, szFormatString, 1);
    _lwrite(hfErrorLog, outputString, strlen(outputString));
    bGotError = TRUE;
  }
  else
  {
    UDmktime = mktime(&tmUD);
    while(EDmktime <= UDmktime)
    {
      if(StatusBarAbort())
      {
        goto done;
      }
      dayOfWeek = (tmED.tm_wday == 0 ? 6 : tmED.tm_wday - 1);
      for(bFound = FALSE, nI = 0; nI < numServices; nI++)
      {
        if(ROSTERPARMS.serviceDays[dayOfWeek] == SERVICESinEffect[nI])
        {
          bFound = TRUE;
          break;
        }
      }
      if(!bFound)
      {
        SERVICESinEffect[numServices] = ROSTERPARMS.serviceDays[dayOfWeek];
        numServices++;
      }
//
//  ServiceCode (SERVICES.recordID)
//
      SERVICESKey0.recordID = ROSTERPARMS.serviceDays[dayOfWeek];
      btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
      strncpy(tempString, SERVICES.name, SERVICES_NAME_LENGTH);
      trim(tempString, SERVICES_NAME_LENGTH);
      sprintf(szarString, "\"%s\",", tempString);
      strcpy(outputString, szarString);
//
//  Date
//
      sprintf(szarString, "\"%4ld%02ld%02ld\"\r\n", tmED.tm_year + 1900, tmED.tm_mon + 1, tmED.tm_mday);
      strcat(outputString, szarString);
//
//  Write out the record
//
      _lwrite(hfOutputFile, outputString, strlen(outputString));
//
//  Figure out the next day
//
      tmED.tm_mday++;
      EDmktime = mktime(&tmED);
      if(EDmktime == (time_t)(-1))
      {
        LoadString(hInst, ERROR_328, szFormatString, SZFORMATSTRING_LENGTH);
        sprintf(outputString, szFormatString, 1);
        _lwrite(hfErrorLog, outputString, strlen(outputString));
        bGotError = TRUE;
      }
    }
  }
//
//  Close the file
//
  _lclose(hfOutputFile);
//
//  ============================
//  Routes File - oci_routes.csv
//  ============================
//
  if(StatusBarAbort())
  {
    goto done;
  }
  strcpy(outputFileName, "oci_routes.csv");
  hfOutputFile = _lcreat(outputFileName, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(szarString, szFormatString, outputFileName);
    MessageBeep(MB_ICONSTOP);
    MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
    goto done;
  }
  StatusBarText(outputFileName);
//
//  Write out the header
//
  strcpy(outputString, "\"RouteCode\",\"RouteName\",\"DirectionCode\",\"DirectionName\",\"PatternCode\",\"PatternName\"\r\n");
  _lwrite(hfOutputFile, outputString, strlen(outputString));
//
//  Traverse the Routes Table
//
    rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
    while(rcode2 == 0)
    {
      if(StatusBarAbort())
      {
        goto done;
      }
//
//  Go through the directions
//
      for(nI = 0; nI < 2; nI++)
      {
        if(ROUTES.DIRECTIONSrecordID[nI] == NO_RECORD)
        {
          continue;
        }
//
//  RouteCode (ROUTES.number)
//
        strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
        trim(tempString, ROUTES_NUMBER_LENGTH);
        ptr = tempString;
        while(ptr && *ptr == ' ')
        {
          ptr++;
        }
        sprintf(szarString, "\"%s\",", ptr);
        strcpy(outputString, szarString);
//
//  RouteName (ROUTES.name)
//
        strncpy(tempString, ROUTES.name, ROUTES_NAME_LENGTH);
        trim(tempString, ROUTES_NAME_LENGTH);
        sprintf(szarString, "\"%s\",", tempString);
        strcat(outputString, szarString);
//
//  DirectionCode (DIRECTIONS.abbrName)
//
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI];
        btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        strncpy(tempString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH);
        trim(tempString, DIRECTIONS_ABBRNAME_LENGTH);
        sprintf(szarString, "\"%s\",", tempString);
        strcat(outputString, szarString);
//
//  DirectionName (DIRECTIONS.longName)
//
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI];
        btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        strncpy(tempString, DIRECTIONS.longName, DIRECTIONS_LONGNAME_LENGTH);
        trim(tempString, DIRECTIONS_LONGNAME_LENGTH);
        sprintf(szarString, "\"%s\",", tempString);
        strcat(outputString, szarString);
//
// Cycle through the patterns for route/service/direction
//
        strcpy(outputStringSave, outputString);
        rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        while(rcode2 == 0)
        {
          PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
          PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
          PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID;
          PATTERNSKey2.directionIndex = nI;
          PATTERNSKey2.nodeSequence = NO_RECORD;
          previousPattern = NO_RECORD;
          rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          while(rcode2 == 0 &&
                PATTERNS.ROUTESrecordID == ROUTES.recordID &&
                PATTERNS.SERVICESrecordID == SERVICES.recordID &&
                PATTERNS.directionIndex == nI)
          {
            if(PATTERNS.PATTERNNAMESrecordID != previousPattern)
            {
//
//  PatternCode (SERVICES.recordID-PATTERNNAMES.recordID)
//
              sprintf(szarString, "\"%ld-%ld\",", SERVICES.recordID, PATTERNS.PATTERNNAMESrecordID);
              strcat(outputString, szarString);
//
//  PatternName (PATTERNNAMES.name)
//
              PATTERNNAMESKey0.recordID = PATTERNS.PATTERNNAMESrecordID;
              btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
              strncpy(tempString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
              trim(tempString, PATTERNNAMES_NAME_LENGTH);
              sprintf(szarString, "\"%s\"\r\n", tempString);
              strcat(outputString, szarString);
//
//  Write out the record and get the next pattern
//
              _lwrite(hfOutputFile, outputString, strlen(outputString));
              strcpy(outputString, outputStringSave);
              previousPattern = PATTERNS.PATTERNNAMESrecordID;
            }
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          }
          rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        }
      } // nI
//
//  Get the next route
//
      rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
    }
//
//  Close the file
//
  _lclose(hfOutputFile);
//
//  ==============================
//  Bus Stops File - oci_stops.csv
//  ==============================
//
  if(StatusBarAbort())
  {
    goto done;
  }
  strcpy(outputFileName, "oci_stops.csv");
  hfOutputFile = _lcreat(outputFileName, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(szarString, szFormatString, outputFileName);
    MessageBeep(MB_ICONSTOP);
    MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
    goto done;
  }
//
//  Write out the header
//
  strcpy(outputString, "\"StopCode\",\"StopName\",\"Latitude\",\"Longitude\",\"Shelter\",\"Bench\",\"Accessible\",\"TimingPoint\"\r\n");
  _lwrite(hfOutputFile, outputString, strlen(outputString));
  StatusBarText(outputFileName);
//
//  Get the list of nodes
//
//
//  Cycle through the Nodes Table to get associated stop numbers
//
  rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0);
  numNodes = 0;
  while(rcode2 == 0)
  {
    if(!(NODES.flags & NODES_FLAG_STOP))
    {
      NodesAndStops[numNodes].NODESrecordID = NODES.recordID;
      NodesAndStops[numNodes].StopNumber = NODES.number;
      NodesAndStops[numNodes].OutboundStopNumber = NODES.OBStopNumber;
      NodesAndStops[numNodes].InboundStopNumber = NODES.IBStopNumber;
      numNodes++;
      if(numNodes >= TMSRPT67_MAXNODESANDSTOPS)
      {
        MessageBeep(MB_ICONSTOP);
        MessageBox(NULL, "TMSRPT67_MAXNODESANDSTOPS Exceeded.\n\nPlease contact Schedule Masters, Inc. for help", TMS, MB_OK | MB_ICONSTOP);
        goto done;
      }
    }
    rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0);
  }
//
//  Cycle through the Nodes Table
//
  rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0);
  while(rcode2 == 0)
  {
//
//  StopCode (NODES.number or NODES.abbrName)
//
    if(NODES.flags & NODES_FLAG_STOP)
    {
      sprintf(szarString, "\"%04ld\",", NODES.number);
    }
    else
    {
//      strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
//      trim(tempString, NODES_ABBRNAME_LENGTH);
//      sprintf(szarString, "\"%s\",", tempString);
      if(nI == 0)
      {
        number = (NODES.OBStopNumber <= 0 ? NODES.number : NODES.OBStopNumber);
      }
      else
      {
        number = (NODES.IBStopNumber <= 0 ? NODES.number : NODES.IBStopNumber);
      }
      sprintf(szarString, "\"%04ld\",", number);
    }
    strcpy(outputString, szarString);
//
//  StopName (NODES.intersection)
//
    strncpy(tempString, NODES.intersection, NODES_INTERSECTION_LENGTH);
    trim(tempString, NODES_INTERSECTION_LENGTH);
    ptr = strstr(tempString, "&&");
    if(ptr)
    {
      *ptr = 'a';
      *(ptr + 1) = 't';
    }
    sprintf(szarString, "\"%s\",", tempString);
    strcat(outputString, szarString);
//
//  Latitude (NODES.latitude)
//
    sprintf(tempString, "%12.6f", NODES.latitude);
    ptr = tempString;
    while(ptr && *ptr == ' ')
    {
      ptr++;
    }
    sprintf(szarString, "\"%s\",", ptr);
    strcat(outputString, szarString);
//
//  Longitude (NODES.longitude)
//
    sprintf(tempString, "%12.6f", NODES.longitude);
    ptr = tempString;
    while(ptr && *ptr == ' ')
    {
      ptr++;
    }
    sprintf(szarString, "\"%s\",", ptr);
    strcat(outputString, szarString);
//
//  If this isn't a stop, look to see if we can find the stop in the Nodes Table
//
    if(NODES.flags & NODES_FLAG_STOP)
    {
      stopFlags = NODES.stopFlags;
    }
    else
    {
      stopFlags = 0;
      stopNumber = NO_RECORD;
      if(NODES.number > 0)
      {
        stopNumber = NODES.number;
      }
      if(stopNumber == NO_RECORD && NODES.OBStopNumber > 0)
      {
        stopNumber = NODES.OBStopNumber;
      }
      if(stopNumber == NO_RECORD && NODES.IBStopNumber > 0)
      {
        stopNumber = NODES.IBStopNumber;
      }
      if(stopNumber != NO_RECORD)
      {
        btrieve(B_GETPOSITION, TMS_NODES, &absRecID, &NODESKey0, 0);
        rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0);
        while(rcode2 == 0)
        {
          if(NODES.flags & NODES_FLAG_STOP)
          {
            if(NODES.number == stopNumber)
            {
              stopFlags = NODES.stopFlags;
              break;
            }
          }
          rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0);
        }
        NODES.recordID = absRecID;
        btrieve(B_GETDIRECT, TMS_NODES, &NODES, &NODESKey0, 0);
      }
    }
//
//  Shelter (item 12 from "Stop Flags.txt")
//
    sprintf(tempString, (stopFlags & (1 << 12) ? "True" : "False"));
    sprintf(szarString, "\"%s\",", tempString);
    strcat(outputString, szarString);
//
//  Bench (item 5 from "Stop Flags.txt")
//
    sprintf(tempString, (stopFlags & (1 << 5) ? "True" : "False"));
    sprintf(szarString, "\"%s\",", tempString);
    strcat(outputString, szarString);
//
//  Accessible (item 16 from "Stop Flags.txt")
//
    sprintf(tempString, (stopFlags & (1 << 6) ? "True" : "False"));
    sprintf(szarString, "\"%s\",", tempString);
    strcat(outputString, szarString);
//
//  Timing point?
//
    if(!(NODES.flags & NODES_FLAG_STOP))
    {
      bFound = TRUE;
    }
    else
    {
      bFound = FALSE;
      for(nI = 0; nI < numNodes; nI++)
      {
        if(NodesAndStops[nI].StopNumber == NODES.number ||
              NodesAndStops[nI].OutboundStopNumber == NODES.number ||
              NodesAndStops[nI].InboundStopNumber == NODES.number)
        {
          bFound = TRUE;
          break;
        }
      }
    }
    sprintf(tempString, (bFound ? "True" : "False"));
    sprintf(szarString, "\"%s\"\r\n", tempString);
    strcat(outputString, szarString);
//
//  Write it out and get the next node
//
    _lwrite(hfOutputFile, outputString, strlen(outputString));
    rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0);
  }
//
//  Close the file
//
  _lclose(hfOutputFile);
//
//  ====================================
//  Bus Patterns File - oci_patterns.csv
//  ====================================
//
  if(StatusBarAbort())
  {
    goto done;
  }
  strcpy(outputFileName, "oci_patterns.csv");
  hfOutputFile = _lcreat(outputFileName, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(szarString, szFormatString, outputFileName);
    MessageBeep(MB_ICONSTOP);
    MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
    goto done;
  }
//
//  Write out the header
//
  strcpy(outputString, "\"RouteCode\",\"DirectionCode\",\"PatternCode\",\"StopCode\",\"Sequence\"\r\n");
  _lwrite(hfOutputFile, outputString, strlen(outputString));
  StatusBarText(outputFileName);
//
//  Traverse the Routes Table
//
    rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
    while(rcode2 == 0)
    {
      if(StatusBarAbort())
      {
        goto done;
      }
      for(nI = 0; nI < 2; nI++)
      {
        if(ROUTES.DIRECTIONSrecordID[nI] == NO_RECORD)
        {
          continue;
        }
//
//  RouteCode (ROUTES.number)
//
        strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
        trim(tempString, ROUTES_NUMBER_LENGTH);
        ptr = tempString;
        while(ptr && *ptr == ' ')
        {
          ptr++;
        }
        sprintf(szarString, "\"%s\",", ptr);
        strcpy(outputString, szarString);
//
//  DirectionCode (DIRECTIONS.abbrName)
//
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI];
        btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        strncpy(tempString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH);
        trim(tempString, DIRECTIONS_ABBRNAME_LENGTH);
        sprintf(szarString, "\"%s\",", tempString);
        strcat(outputString, szarString);
//
//  Go through all the services
//
        strcpy(outputStringSave, outputString);
        rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        while(rcode2 == 0)
        {
//
//  Go through all the patterns
//
          PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
          PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
          PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID;
          PATTERNSKey2.directionIndex = nI;
          PATTERNSKey2.nodeSequence = -1;
          rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          previousPattern = NO_RECORD;
          while(rcode2 == 0 &&
                PATTERNS.ROUTESrecordID == ROUTES.recordID &&
                PATTERNS.SERVICESrecordID == SERVICES.recordID && 
                PATTERNS.directionIndex == nI)
          {
            if(previousPattern != PATTERNS.PATTERNNAMESrecordID)
            {
              previousPattern = PATTERNS.PATTERNNAMESrecordID;
              seq = 1;
            }
//
//  PatternCode (SERVICES.recordID-PATTERNS.PATTERNNAMESrecordID)
//
            sprintf(szarString, "\"%ld-%ld\",", SERVICES.recordID, PATTERNS.PATTERNNAMESrecordID);
            strcat(outputString, szarString);
//
//  StopCode (NODES.number or NODES.abbrName)
//
            NODESKey0.recordID = PATTERNS.NODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            if(!(NODES.flags & NODES_FLAG_STOP))
            {
              if(nI == 0)
              {
                number = (NODES.OBStopNumber <= 0 ? NODES.number : NODES.OBStopNumber);
              }
              else
              {
                number = (NODES.IBStopNumber <= 0 ? NODES.number : NODES.IBStopNumber);
              }
              sprintf(tempString, "%04ld", number);
//              strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
//              trim(tempString, NODES_ABBRNAME_LENGTH);
            }
            else
            {
              sprintf(tempString, "%04ld", NODES.number);
            }
            sprintf(szarString, "\"%s\",", tempString);
            strcat(outputString, szarString);
//
//  Sequence
//
            sprintf(tempString, "\"%d\"\r\n", seq++);
            strcat(outputString, tempString);
//
//  Write it out and get the next node on the pattern
//
            _lwrite(hfOutputFile, outputString, strlen(outputString));
            strcpy(outputString, outputStringSave);
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          } // while on patterns
          rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
        }
      } // nI
//
//  Get the next route
//
      rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
    }
//
//  Close the file
//
  _lclose(hfOutputFile);
//
//  ==========================================
//  Bus Trips File - oci_trips_{RouteCode}.dat
//  ==========================================
//
//
//  Traverse the Routes Table
//
  rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
  while(rcode2 == 0)
  {
    if(StatusBarAbort())
    {
      goto done;
    }
    strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
    trim(tempString, ROUTES_NUMBER_LENGTH);
    ptr = tempString;
    while(ptr && *ptr == ' ')
    {
      ptr++;
    }
    sprintf(outputFileName, "oci_trips_%s.csv", ptr);
    hfOutputFile = _lcreat(outputFileName, 0);
    if(hfOutputFile == HFILE_ERROR)
    {
      LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
      sprintf(szarString, szFormatString, outputFileName);
      MessageBeep(MB_ICONSTOP);
      MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
      goto done;
    }
//
//  Write out the header
//
    strcpy(outputString, "\"RouteCode\",\"DirectionCode\",\"PatternCode\",\"TripCode\",\"StopCode\",\"Sequence\",\"ArrivalTime\",\"DepartureTime\",\"TimingPoint\",\"Bicycles\",\"ServiceCode\"\r\n");
    _lwrite(hfOutputFile, outputString, strlen(outputString));
    StatusBarText(outputFileName);
//
//  Go through the services
//
    rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
    while(rcode2 == 0)
    {
      if(StatusBarAbort())
      {
        goto done;
      }
      strncpy(szServiceCode, SERVICES.name, SERVICES_NAME_LENGTH);
      trim(szServiceCode, SERVICES_NAME_LENGTH);
//
//  Loop through the directions
//
      for(nI = 0; nI < 2; nI++)
      {
        if(ROUTES.DIRECTIONSrecordID[nI] == NO_RECORD)
        {
          continue;
        }
//
//  RouteCode (ROUTES.number)
//
        strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
        trim(tempString, ROUTES_NUMBER_LENGTH);
        ptr = tempString;
        while(ptr && *ptr == ' ')
        {
          ptr++;
        }
        sprintf(szarString, "\"%s\",", ptr);
        strcpy(outputString, szarString);
//
//  DirectionCode (DIRECTIONS.abbrName)
//
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nI];
        btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        strncpy(tempString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH);
        trim(tempString, DIRECTIONS_ABBRNAME_LENGTH);
        sprintf(szarString, "\"%s\",", tempString);
        strcat(outputString, szarString);
        strcpy(out2, outputString);

//
//  Get the trips for this route/ser/dir
//
        TRIPSKey1.ROUTESrecordID = ROUTES.recordID;
        TRIPSKey1.SERVICESrecordID = SERVICES.recordID;
        TRIPSKey1.directionIndex = nI;
        TRIPSKey1.tripSequence = NO_RECORD;
        rcode2 = btrieve(B_GETGREATER, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
        while(rcode2 == 0 &&
              TRIPS.ROUTESrecordID == ROUTES.recordID &&
              TRIPS.SERVICESrecordID == SERVICES.recordID &&
              TRIPS.directionIndex == nI)
        {
          strcpy(outputString, out2);
//
//  PatternCode (SERVICES.recordID-PATTERNNAMES.recordID)
//
          sprintf(szarString, "\"%ld-%ld\",", TRIPS.SERVICESrecordID, TRIPS.PATTERNNAMESrecordID);
          strcat(outputString, szarString);
//
//  TripCode (TRIPS.tripNumber)
//
          sprintf(szarString, "\"%ld\",", TRIPS.tripNumber);
          strcat(outputString, szarString);
//
//  Does this vehicle have a bike rack?
//
          bBikeRack = FALSE;
          if(TRIPS.BUSTYPESrecordID != NO_RECORD)
          {
            BUSTYPESKey0.recordID = TRIPS.BUSTYPESrecordID;
            rcode2 = btrieve(B_GETEQUAL, TMS_BUSTYPES, &BUSTYPES, &BUSTYPESKey0, 0);
            if(rcode2 == 0)
            {
              if(BUSTYPES.flags & BUSTYPES_FLAG_CARRIER)
              {
                bBikeRack = TRUE;
              }
            }
          }
//
//  Generate the trip
//           
          GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
//
//  Go through the pattern twice
//
//  Pass 1 - Determine distances at each timepoint
//
          if(GTResults.tripDistance != 0.0)
          {
            PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
            PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
            PATTERNSKey2.directionIndex = nI;
            PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            PATTERNSKey2.nodeSequence = NO_RECORD;
            rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
            tripIndex = 0;
            distanceToHere = 0.0;
            while(rcode2 == 0 &&
                  PATTERNS.ROUTESrecordID == ROUTES.recordID &&
                  PATTERNS.SERVICESrecordID == SERVICES.recordID &&
                  PATTERNS.directionIndex == nI &&
                  PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
            {
              NODESKey0.recordID = PATTERNS.NODESrecordID;
              rcode2 = btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
              if(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)
              {
                distanceToHere += (float)GreatCircleDistance(prevLon, prevLat, NODES.longitude, NODES.latitude);
              }
              else
              {
                tripDistances[tripIndex] = distanceToHere;
                tripIndex++;
              }
              prevLat = NODES.latitude;
              prevLon = NODES.longitude;
              rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
            }
          }
//
//  Save outputString to this point
//
          strcpy(outputStringSave, outputString);
//
//  Pass 2 - Determine time interpolations and output the records
//
          PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
          PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
          PATTERNSKey2.directionIndex = nI;
          PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
          PATTERNSKey2.nodeSequence = NO_RECORD;
          rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          tripIndex = 0;
          seq = 1;
          distanceToHere = 0.0;
          while(rcode2 == 0 &&
                PATTERNS.ROUTESrecordID == ROUTES.recordID &&
                PATTERNS.SERVICESrecordID == SERVICES.recordID &&
                PATTERNS.directionIndex == nI &&
                PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
          {
            NODESKey0.recordID = PATTERNS.NODESrecordID;
            rcode2 = btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            if(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)
            {
              if(GTResults.tripDistance == 0)
              {
                timeAtStop = GTResults.tripTimes[tripIndex - 1];
              }
              else
              {
                distanceToHere += (float)GreatCircleDistance(prevLon, prevLat, NODES.longitude, NODES.latitude);
                timeAtStop = (long)((GTResults.tripTimes[tripIndex] - GTResults.tripTimes[tripIndex - 1]) *
                      (distanceToHere / (tripDistances[tripIndex] - tripDistances[tripIndex - 1])));
                timeAtStop += (GTResults.tripTimes[tripIndex - 1]);
              }
            }
            else
            {
              timeAtStop = GTResults.tripTimes[tripIndex];
              distanceToHere = 0.0;
              tripIndex++;
            }
//
//  StopCode (NODES.number or NODES.abbrName)
//
/*
            if(NODES.flags & NODES_FLAG_STOP)
            {
              sprintf(szarString, "\"%04ld\",", NODES.number);
            }
            else
            {
              strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
              trim(tempString, NODES_ABBRNAME_LENGTH);
              sprintf(szarString, "\"%s\",", tempString);
            }
*/
            if(!(NODES.flags & NODES_FLAG_STOP))
            {
              if(nI == 0)
              {
                number = (NODES.OBStopNumber <= 0 ? NODES.number : NODES.OBStopNumber);
              }
              else
              {
                number = (NODES.IBStopNumber <= 0 ? NODES.number : NODES.IBStopNumber);
              }
              sprintf(szarString, "\"%04ld\",", number);
            }
            else
            {
              sprintf(szarString, "\"%04ld\",", NODES.number);
            }

            strcat(outputString, szarString);
//
//  Sequence
//
            sprintf(szarString, "\"%d\",", seq++);
            strcat(outputString, szarString);
//
//  ArrivalTime (Time at the stop, in seconds)
//
//  Now time is in HHMM (11-Aug-08)
//
//            sprintf(szarString, "\"%ld\",", timeAtStop);
            sprintf(szarString, "\"%s\",", TcharNAP(timeAtStop, FALSE));
            strcat(outputString, szarString);
//
//  DepartureTime (Time at the stop, in seconds)
//
//  Now time is in HHMM (11-Aug-08)
//
//            sprintf(szarString, "\"%ld\",", timeAtStop);
            sprintf(szarString, "\"%s\",", TcharNAP(timeAtStop, FALSE));
            strcat(outputString, szarString);
//
//  Timepoint?
//
            sprintf(tempString, "%s", (NODES.flags & NODES_FLAG_STOP ? "False" : "True"));
            sprintf(szarString, "\"%s\",", tempString);
            strcat(outputString, szarString);
//
//  Bicycles?
//
            sprintf(tempString, "%s", (bBikeRack ? "True" : "False"));
            sprintf(szarString, "\"%s\",", tempString);
            strcat(outputString, szarString);
//
//  ServiceCode
//
            sprintf(szarString, "\"%s\"\r\n", szServiceCode);
            strcat(outputString, szarString);
//
//  Write it out and go back
//
            _lwrite(hfOutputFile, outputString, strlen(outputString));
            strcpy(outputString, outputStringSave);
            prevLat = NODES.latitude;
            prevLon = NODES.longitude;
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          } // while on pattern
//
//  Get the next trip
//
          rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
        } // while on trips
      } // nI (directions on the route)
//
//  Get the next service
//
      rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
    }
//
//  Close the file
//
    _lclose(hfOutputFile);
//
//  Get the next route
//
    rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
  }
//
//  Blocks
//
//
//  ============================
//  Blocks File - oci_blocks.dat
//  ============================
//
  pTRIPSChunk = &TRIPS.standard;
  sprintf(outputFileName, "oci_blocks.csv", ptr);
  hfOutputFile = _lcreat(outputFileName, 0);
  if(hfOutputFile == HFILE_ERROR)
  {
    LoadString(hInst, ERROR_320, szFormatString, SZFORMATSTRING_LENGTH);
    sprintf(szarString, szFormatString, outputFileName);
    MessageBeep(MB_ICONSTOP);
    MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONSTOP);
    goto done;
  }
//
//  Write out the header
//
  strcpy(outputString, "\"BlockCode\",\"ServiceCode\",\"TripCode\",\"Sequence\",\"StartStopCode\",\"EndStopCode\",\"InService\"\r\n");
  _lwrite(hfOutputFile, outputString, strlen(outputString));
  StatusBarText(outputFileName);
//
//  Traverse the Routes Table
//
  rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
  while(rcode2 == 0)
  {
    if(StatusBarAbort())
    {
      goto done;
    }
//
//  Go through the services
//
    rcode2 = btrieve(B_GETFIRST, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
    while(rcode2 == 0)
    {
      if(StatusBarAbort())
      {
        goto done;
      }
      strncpy(szServiceCode, SERVICES.name, SERVICES_NAME_LENGTH);
      trim(szServiceCode, SERVICES_NAME_LENGTH);
//
//  Get all the blocks on this route group
//
      NODESKey1.flags = NODES_FLAG_GARAGE;
      memset(NODESKey1.abbrName, 0x00, NODES_ABBRNAME_LENGTH);
      rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_NODES, &NODES, &NODESKey1, 1);
      bFirst = TRUE;
      while(rcode2 == 0 && NODES.flags & NODES_FLAG_GARAGE)
      {
//
//  Cycle through the blocks
//
        assignedToNODESrecordID = bFirst ? NO_RECORD : NODES.recordID;
        TRIPSKey2.assignedToNODESrecordID = assignedToNODESrecordID;
        TRIPSKey2.RGRPROUTESrecordID = ROUTES.recordID;
        TRIPSKey2.SGRPSERVICESrecordID = SERVICES.recordID;
        TRIPSKey2.blockNumber = 1;
        TRIPSKey2.blockSequence = NO_TIME;
        rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2);
        blockNumber = NO_RECORD;
//
//  Get the first trip on the block
//
        while(rcode2 == 0 &&
              pTRIPSChunk->assignedToNODESrecordID == assignedToNODESrecordID &&
              pTRIPSChunk->RGRPROUTESrecordID == ROUTES.recordID &&
              pTRIPSChunk->SGRPSERVICESrecordID == SERVICES.recordID)
        {
          if(StatusBarAbort())
          {
            goto done;
          }
          if(pTRIPSChunk->blockNumber != blockNumber)
          {
            seq = 1;
            blockNumber = pTRIPSChunk->blockNumber;
          }
//
//  Gen the whole trip
//
          GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
//
//  Pullout?
//
          if(pTRIPSChunk->POGNODESrecordID == NO_RECORD)
          {
            fromNODESrecordID = GTResults.firstNODESrecordID;
            fromTime = GTResults.firstNodeTime;
          }
          else
          {
            GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            GCTData.fromROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID;
            GCTData.fromSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID;
            GCTData.toROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID;
            GCTData.toSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID;
            GCTData.fromNODESrecordID = pTRIPSChunk->POGNODESrecordID;
            GCTData.toNODESrecordID = GTResults.firstNODESrecordID;
            GCTData.timeOfDay = GTResults.firstNodeTime;
            dhd = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
            distance = (float)fabs((double)distance);
            if(dhd == NO_TIME)
            {
              dhd = 0;
            }
            fromNODESrecordID = pTRIPSChunk->POGNODESrecordID;
            fromTime = GTResults.firstNodeTime - dhd;
//
//  Output the pull-out deadhead record
//
//  Start and End Stop codes
//
            NODESKey0.recordID = pTRIPSChunk->POGNODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
            trim(tempString, NODES_ABBRNAME_LENGTH);
            NODESKey0.recordID = GTResults.firstNODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
            trim(szarString, NODES_ABBRNAME_LENGTH);
//
//  Write it
//
            sprintf(outputString, "\"%ld\",\"%s\",\"\",\"%d\",\"%s\",\"%s\",\"False\"\r\n",
                  pTRIPSChunk->blockNumber, szServiceCode, seq, tempString, szarString);
           _lwrite(hfOutputFile, outputString, strlen(outputString));
           seq++;
          }
//
//  Start/end trip details
//
          sprintf(szTripCode, "%ld", TRIPS.tripNumber);
//
//  Start and End Stop codes
//
          NODESKey0.recordID = GTResults.firstNODESrecordID;
          btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
          strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
          trim(tempString, NODES_ABBRNAME_LENGTH);
          NODESKey0.recordID = GTResults.lastNODESrecordID;
          btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
          strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
          trim(szarString, NODES_ABBRNAME_LENGTH);
//
//  Write it
//
          sprintf(outputString, "\"%ld\",\"%s\",\"%s\",\"%d\",\"%s\",\"%s\",\"True\"\r\n",
                pTRIPSChunk->blockNumber, szServiceCode, szTripCode, seq, tempString, szarString);
          _lwrite(hfOutputFile, outputString, strlen(outputString));
          seq++;
//
//  Pullin
//
          if(pTRIPSChunk->PIGNODESrecordID == NO_RECORD)
          {
            toNODESrecordID = GTResults.lastNODESrecordID;
            toTime = GTResults.lastNodeTime;
          }
          else
          {
            GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            GCTData.fromROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID;
            GCTData.fromSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID;
            GCTData.toROUTESrecordID = pTRIPSChunk->RGRPROUTESrecordID;
            GCTData.toSERVICESrecordID = pTRIPSChunk->SGRPSERVICESrecordID;
            GCTData.fromNODESrecordID = GTResults.lastNODESrecordID;
            GCTData.toNODESrecordID = pTRIPSChunk->PIGNODESrecordID;
            GCTData.timeOfDay = GTResults.lastNodeTime;
            dhd = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
            distance = (float)fabs((double)distance);
            if(dhd == NO_TIME)
            {
              dhd = 0;
            }
            toNODESrecordID = pTRIPSChunk->PIGNODESrecordID;
            toTime = GTResults.lastNodeTime + dhd;
//
//  Output the pull-in deadhead record
//
//  Start and End Stop codes
//
            NODESKey0.recordID = GTResults.lastNODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            strncpy(tempString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
            trim(tempString, NODES_ABBRNAME_LENGTH);
            NODESKey0.recordID = pTRIPSChunk->PIGNODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
            trim(szarString, NODES_ABBRNAME_LENGTH);
//
//  Write it
//
            sprintf(outputString, "\"%ld\",\"%s\",\"\",\"%d\",\"%s\",\"%s\",\"False\"\r\n",
                  pTRIPSChunk->blockNumber, szServiceCode, seq, tempString, szarString);
           _lwrite(hfOutputFile, outputString, strlen(outputString));
           seq++;
          }
          rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2);
        }  // while blocks on this garage node

//
//  Get the next garage node
//
        if(bFirst)
        {
          bFirst = FALSE;
        }
        else
        {
          rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey1, 1);
        }
      }  // while cycling through garage nodes
//
//  Get the next service
//
      rcode2 = btrieve(B_GETNEXT, TMS_SERVICES, &SERVICES, &SERVICESKey1, 1);
    }
//
//  Get the next route
//
    rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
  }  
//
//  Close the file
//
  _lclose(hfOutputFile);
  
//
//  All done
//
  StatusBar(-1L, -1L);
  bFinishedOK = TRUE;
  
  done:
    chdir("..");  // Back to where we started from
    StatusBarEnd();
  
  if(!bFinishedOK)
  {
    TMSError((HWND)NULL, MB_ICONINFORMATION, ERROR_227, (HANDLE)NULL);
  }
  if(bGotError)
  {
    TMSError((HWND)NULL, MB_ICONINFORMATION, ERROR_350, (HANDLE)NULL);
  }
  _lclose(hfErrorLog);
  distanceMeasure = distanceMeasureSave;
  recordLength[TMS_COMMENTS] = COMMENTS_FIXED_LENGTH;
  return(bFinishedOK);
}
Exemplo n.º 4
0
//
//  OnSelchangeFromnode()
//
void CAddConnectionSD::OnSelchangeFromnode() 
{
  float longitude[2];
  float latitude[2];
//
//  Detemine what we're dealing with
//
//  First, get the from and to node record IDs
//
  long fromNode, toNode;
  int  nI;

  nI = pComboBoxFROMNODE->GetCurSel();
  if(nI == CB_ERR)
  {
    return;
  }
  fromNode = pComboBoxFROMNODE->GetItemData(nI);

  nI = pComboBoxTONODE->GetCurSel();
  if(nI == CB_ERR)
  {
    return;
  }
  toNode = pComboBoxTONODE->GetItemData(nI);
//
//  Enable the Calculate button
//
  pButtonIDCALCULATE->EnableWindow(TRUE);
//
//  Case 1 - An entry on the Connections Table with hardwired distance
//
//  Try two ways through the table: from:to and to:from
//
  float distance = NO_RECORD;
  BOOL  bFound = FALSE;
  int   rcode2;

  CONNECTIONSKey1.fromNODESrecordID = fromNode;
  CONNECTIONSKey1.toNODESrecordID = toNode;
  CONNECTIONSKey1.fromTimeOfDay = NO_TIME;
  rcode2 = btrieve(B_GETGREATER, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey1, 1);
  if(rcode2 == 0)
  {
    if(CONNECTIONS.fromNODESrecordID == fromNode && 
          CONNECTIONS.toNODESrecordID == toNode)
    {
      if(CONNECTIONS.distance > 0.0)
      {
        bFound = TRUE;
      }
    }
  }
  if(!bFound)
  {
    CONNECTIONSKey1.fromNODESrecordID = toNode;
    CONNECTIONSKey1.toNODESrecordID = fromNode;
    CONNECTIONSKey1.fromTimeOfDay = NO_TIME;
    rcode2 = btrieve(B_GETGREATER, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey1, 1);
    if(rcode2 == 0)
    {
      if(CONNECTIONS.fromNODESrecordID == toNode && 
            CONNECTIONS.toNODESrecordID == fromNode)
      {
        if(CONNECTIONS.distance > 0.0)
        {
          bFound = TRUE;
        }
      }
    }
  }
//
//  Nope. Get the from and to nodes' lat/long
//
  if(!bFound)
  {
    NODESKey0.recordID = fromNode;
    rcode2 = btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
    if(rcode2 == 0 && NODES.latitude != 0.0 && NODES.longitude != 0.0)
    {
      longitude[0] = NODES.longitude;
      latitude[0]  = NODES.latitude;
      NODESKey0.recordID = toNode;
      rcode2 = btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
      if(rcode2 == 0 && NODES.latitude != 0.0 && NODES.longitude != 0.0)
      {
        longitude[1] = NODES.longitude;
        latitude[1]  = NODES.latitude;
        distance = (float)GreatCircleDistance(longitude[0], latitude[0], longitude[1], latitude[1]);
        bFound = TRUE;
      }
    }
  }
//
//  If we found one, set the control to its value
//
  if(bFound && distance > 0)
  {
    sprintf(tempString, "%10.6f", distance);
    pEditDISTANCE->SetWindowText(tempString);
  }
}
Exemplo n.º 5
0
Arquivo: Tmsrpt40.c Projeto: ems/TMS
BOOL FAR TMSRPT40(TMSRPTPassedDataDef *pPassedData)
{
    REPORTPARMSDef  REPORTPARMS;
    TMSRPT40NODESDef NODESrecordIDs[TMSRPT40_MAXNODES];
    TMSRPT40TRIPSDef TRIPData[TMSRPT40_MAXNODES];
    HANDLE hOutputFile;
    HANDLE hOutputFileRaw;
    DWORD  dwBytesWritten;
    double distance;
    BOOL  bKeepGoing = FALSE;
    char  outputString[512];
    char  outputStringRaw[512];
    long  fromNODESrecordID;
    long  toNODESrecordID;
    long  arrivalTime;
    float longitude[2];
    float latitude[2];
    BOOL  bRC;
    BOOL  bFound;
    BOOL  bDoneTitle;
    char  fromNodeName[NODES_ABBRNAME_LENGTH * 2 + 1];
    char  toNodeName[NODES_ABBRNAME_LENGTH * 2 + 1];
    long  previousPATTERNNAMESrecordID;
    long  previousNODESrecordID;
    long  currentNodePositionInTrip;
    long  actualTime;
    int   nI;
    int   nJ;
    int   nK;
    int   nL;
    int   rcode2;
    int   seqNum;
    int   numConnections;
    int   numEntries;

//
//  Ok - let's go
//
    pPassedData->nReportNumber = 39;
    pPassedData->numDataFiles = 1;
//
//  See what he wants
//
    REPORTPARMS.nReportNumber = pPassedData->nReportNumber;
    REPORTPARMS.ROUTESrecordID = m_RouteRecordID;
    REPORTPARMS.SERVICESrecordID = m_ServiceRecordID;
    REPORTPARMS.COMMENTSrecordID = NO_RECORD;
    REPORTPARMS.pRouteList = NULL;
    REPORTPARMS.pServiceList = NULL;
    REPORTPARMS.flags = RPFLAG_ROUTES | RPFLAG_SERVICES | RPFLAG_COMMENTS;

    bRC = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_RPTPARMS),
                         hWndMain, (DLGPROC)RPTPARMSMsgProc, (LPARAM)&REPORTPARMS);
    if(!bRC)
    {
        return(FALSE);
    }
//
//  Check the list of routes and services
//
    if(REPORTPARMS.numRoutes == 0 || REPORTPARMS.numServices == 0)
    {
        goto deallocate;
    }
//
//  Open the regular output file
//
    strcpy(tempString, szReportsTempFolder);
    strcat(tempString, "\\TMSRPT40.txt");
    hOutputFile = CreateFile(tempString, GENERIC_WRITE, 0, NULL,
                             CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hOutputFile == INVALID_HANDLE_VALUE)
    {
        LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
        sprintf(szarString, szFormatString, tempString);
        MessageBeep(MB_ICONSTOP);
        MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
        goto deallocate;
    }
    strcpy(pPassedData->szReportDataFile[0], tempString);
//
//  Open the raw output file
//
    strcpy(tempString, szReportsTempFolder);
    strcat(tempString, "\\TMSRPT40RAW.txt");
    hOutputFileRaw = CreateFile(tempString, GENERIC_WRITE, 0, NULL,
                                CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hOutputFileRaw == INVALID_HANDLE_VALUE)
    {
        LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
        sprintf(szarString, szFormatString, tempString);
        MessageBeep(MB_ICONSTOP);
        MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
        goto deallocate;
    }
//
//  Fire up the status bar
//
    LoadString(hInst, TEXT_117, tempString, TEMPSTRING_LENGTH);
    StatusBarStart(hWndMain, tempString);
//
//  Build the list of node pairs (more or less nick'd from PICKCONN
//
    numConnections = 0;
    for(nI = 0; nI < REPORTPARMS.numRoutes; nI++)
    {
        if(StatusBarAbort())
        {
            bKeepGoing = FALSE;
            goto deallocate;
        }
        ROUTESKey0.recordID = REPORTPARMS.pRouteList[nI];
        btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
        for(nJ = 0; nJ < REPORTPARMS.numServices; nJ++)
        {
            if(StatusBarAbort())
            {
                bKeepGoing = FALSE;
                goto deallocate;
            }
            for(nK = 0; nK < 2; nK++)
            {
                if(ROUTES.DIRECTIONSrecordID[nK] == NO_RECORD)
                    continue;
                PATTERNSKey2.ROUTESrecordID = REPORTPARMS.pRouteList[nI];
                PATTERNSKey2.SERVICESrecordID = REPORTPARMS.pServiceList[nJ];
                PATTERNSKey2.directionIndex = nK;
                PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID;
                PATTERNSKey2.nodeSequence = 0;
                rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
//
//  Set up unique from/to node combinations.  This section of code
//  assumes that ADDPATTERN has done its job and not permitted a
//  bus stop to be the first or last node in a pattern.
//
                if(rcode2 == 0 &&
                        PATTERNS.ROUTESrecordID == REPORTPARMS.pRouteList[nI] &&
                        PATTERNS.SERVICESrecordID == REPORTPARMS.pServiceList[nJ] &&
                        PATTERNS.directionIndex == nK)
                {
                    fromNODESrecordID = PATTERNS.NODESrecordID;
                    rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                    while(rcode2 == 0 &&
                            PATTERNS.ROUTESrecordID == REPORTPARMS.pRouteList[nI] &&
                            PATTERNS.SERVICESrecordID == REPORTPARMS.pServiceList[nJ] &&
                            PATTERNS.directionIndex == nK)
                    {
                        if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
                        {
                            toNODESrecordID = PATTERNS.NODESrecordID;
                            for(bFound = FALSE, nL = 0; nL < numConnections; nL++)
                            {
                                if(fromNODESrecordID == NODESrecordIDs[nL].from &&
                                        toNODESrecordID == NODESrecordIDs[nL].to)
                                {
                                    bFound = TRUE;
                                    break;
                                }
                            }
                            if(!bFound)
                            {
                                NODESrecordIDs[numConnections].from = fromNODESrecordID;
                                NODESrecordIDs[numConnections++].to = toNODESrecordID;
                                if(numConnections >= TMSRPT40_MAXNODES)
                                    break;
                            }
                            fromNODESrecordID = toNODESrecordID;
                        }
                        previousPATTERNNAMESrecordID = PATTERNS.PATTERNNAMESrecordID;
                        rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                        if(PATTERNS.PATTERNNAMESrecordID != previousPATTERNNAMESrecordID)
                        {
                            fromNODESrecordID = PATTERNS.NODESrecordID;
                            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                        }
                    }
                }
            }
        }
    }
//
//  Sort the connection pairs
//
    qsort((void *)NODESrecordIDs, numConnections, sizeof(TMSRPT40NODESDef), TMSRPT40sort_nodes);

//
//  Cycle through all the connection pairs
//
    seqNum = 1;
    for(nI = 0; nI < numConnections; nI++)
    {
        if(StatusBarAbort())
        {
            bKeepGoing = FALSE;
            goto deallocate;
        }
//
//  From node
//
        NODESKey0.recordID = NODESrecordIDs[nI].from;
        btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
        strncpy(fromNodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH);
        trim(fromNodeName, NODES_ABBRNAME_LENGTH);
        longitude[0] = NODES.longitude;
        latitude[0] = NODES.latitude;
//
//  To node
//
        NODESKey0.recordID = NODESrecordIDs[nI].to;
        btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
        strncpy(toNodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH);
        trim(toNodeName, NODES_ABBRNAME_LENGTH);
        longitude[1] = NODES.longitude;
        latitude[1] = NODES.latitude;
//
//  Display it
//
        sprintf(tempString, "%4s - %4s", fromNodeName, toNodeName);
        StatusBarText(tempString);
        StatusBar((long)(nI + 1), (long)numConnections);
//
//  First, dump out the connections table entries for this pair under
//  the following rules: a) the entry must be a running time, and b)
//  B->A connections will only be listed if the 2-way flag is in effect.
//
//
//  Possibly From-To and To-From
//
        bDoneTitle = FALSE;
        for(nJ = 0; nJ < 2; nJ++)
        {
            if(nJ == 0)
            {
                fromNODESrecordID = NODESrecordIDs[nI].from;
                toNODESrecordID = NODESrecordIDs[nI].to;
            }
            else
            {
                fromNODESrecordID = NODESrecordIDs[nI].to;
                toNODESrecordID = NODESrecordIDs[nI].from;
            }
            CONNECTIONSKey1.fromNODESrecordID = NODESrecordIDs[nI].from;
            CONNECTIONSKey1.toNODESrecordID = NODESrecordIDs[nI].to;
            CONNECTIONSKey1.fromTimeOfDay = NO_TIME;
            rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey1, 1);
            while(rcode2 == 0 &&
                    CONNECTIONS.fromNODESrecordID == fromNODESrecordID &&
                    CONNECTIONS.toNODESrecordID == toNODESrecordID)
            {
                if((nJ == 0 || (CONNECTIONS.flags & CONNECTIONS_FLAG_TWOWAY)) &&
                        (CONNECTIONS.flags & CONNECTIONS_FLAG_RUNNINGTIME))
                {
//
//  Sequence + Title String
//
                    if(!bDoneTitle)
                    {
                        sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
                        strcat(outputString, "Data from the Connections Table:\"\r\n");
                        WriteFile(hOutputFile, (LPCVOID *)outputString,
                                  strlen(outputString), &dwBytesWritten, NULL);
                        sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
                        strcat(outputString, "  From   To    Route  Service  Pattern    Route  Service  Pattern Min             U/M     Dist  Spd/Hr");
                        strcat(outputString, "\"\r\n");
                        WriteFile(hOutputFile, (LPCVOID *)outputString,
                                  strlen(outputString), &dwBytesWritten, NULL);
                        bDoneTitle = TRUE;
                    }
//
//  Sequence
//
                    sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
//
//  From and to node names
//
                    if(nJ == 0)
                        sprintf(tempString, "  %4s %4s ", fromNodeName, toNodeName);
                    else
                        sprintf(tempString, "  %4s %4s ", toNodeName, fromNodeName);
                    strcat(outputString, tempString);
//
//  From Route
//
                    if(CONNECTIONS.fromROUTESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        ROUTESKey0.recordID = CONNECTIONS.fromROUTESrecordID;
                        btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
                        strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  From Service
//
                    if(CONNECTIONS.fromSERVICESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        SERVICESKey0.recordID = CONNECTIONS.fromSERVICESrecordID;
                        btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
                        strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  From Pattern
//
                    if(CONNECTIONS.fromPATTERNNAMESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        PATTERNNAMESKey0.recordID = CONNECTIONS.fromPATTERNNAMESrecordID;
                        btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
                        strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  To Route
//
                    if(CONNECTIONS.toROUTESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        ROUTESKey0.recordID = CONNECTIONS.toROUTESrecordID;
                        btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
                        strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  To Service
//
                    if(CONNECTIONS.toSERVICESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        SERVICESKey0.recordID = CONNECTIONS.toSERVICESrecordID;
                        btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
                        strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  To Pattern
//
                    if(CONNECTIONS.toPATTERNNAMESrecordID == NO_RECORD)
                        strcpy(szarString, "");
                    else
                    {
                        PATTERNNAMESKey0.recordID = CONNECTIONS.toPATTERNNAMESrecordID;
                        btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
                        strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
                        trim(szarString, 8);
                    }
                    sprintf(tempString, "%8s ", szarString);
                    strcat(outputString, tempString);
//
//  Time
//
                    sprintf(tempString, "%3d ", CONNECTIONS.connectionTime / 60);
                    strcat(outputString, tempString);
//
//  Btwn
//
                    if(CONNECTIONS.fromTimeOfDay == NO_TIME)
                    {
                        strcpy(tempString, "      ");
                    }
                    else
                    {
                        sprintf(tempString, "%s ", Tchar(CONNECTIONS.fromTimeOfDay));
                    }
                    strcat(outputString, tempString);
//
//  And
//
                    if(CONNECTIONS.toTimeOfDay == NO_TIME)
                    {
                        strcpy(tempString, "      ");
                    }
                    else
                    {
                        sprintf(tempString, "%s ", Tchar(CONNECTIONS.toTimeOfDay));
                    }
                    strcat(outputString, tempString);
//
//  Distance type and distance
//
                    if(CONNECTIONS.distance == NO_RECORD || CONNECTIONS.distance == 0.0)
                    {
                        strcpy(szarString, "Map ");
                        distance = GreatCircleDistance(longitude[0], latitude[0], longitude[1], latitude[1]);
                    }
                    else
                    {
                        strcpy(szarString, "User");
                        distance = CONNECTIONS.distance;
                    }
                    sprintf(tempString, "%s %7.2f ", szarString, distance);
                    strcat(outputString, tempString);
//
//  Speed per hour
//
                    if(CONNECTIONS.connectionTime == 0)
                        strcpy(tempString, "-------");
                    else
                        sprintf(tempString, "%7.2f", distance / ((double)CONNECTIONS.connectionTime / 3600));
                    strcat(outputString, tempString);
//
//  Write it out
//
                    strcat(outputString, "\"\r\n");
                    WriteFile(hOutputFile, (LPCVOID *)outputString,
                              strlen(outputString), &dwBytesWritten, NULL);
                }  // if connection type == requested type to display
                rcode2 = btrieve(B_GETNEXT, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey1, 1);
            }  // while
        }  //  nJ
//
//  If we didn't output a title, there wasn't anything
//
        if(!bDoneTitle)
            continue;
//
//  Now get the stuff from the timechecks table
//
//  Sequence + Title String
//
        sprintf(outputString, "%d\t%s\t%s\t\"\"\r\n", seqNum++, fromNodeName, toNodeName);
        WriteFile(hOutputFile, (LPCVOID *)outputString,
                  strlen(outputString), &dwBytesWritten, NULL);
        sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
        strcat(outputString, "Data from the Timechecks Table:\"\r\n");
        WriteFile(hOutputFile, (LPCVOID *)outputString,
                  strlen(outputString), &dwBytesWritten, NULL);
//
//  Look up the "to node" on the timechecks table
//
        numEntries = 0;
        TIMECHECKSKey4.NODESrecordID = NODESrecordIDs[nI].to;
        rcode2 = btrieve(B_GETEQUAL, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey4, 4);
        while(rcode2 == 0 &&
                TIMECHECKS.NODESrecordID == NODESrecordIDs[nI].to)
        {
            if(StatusBarAbort())
            {
                bKeepGoing = FALSE;
                goto deallocate;
            }
//
//  Get the trip
//
            TRIPSKey0.recordID = TIMECHECKS.TRIPSrecordID;
            rcode2 = btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
            if(rcode2 == 0)
            {
//
//  Get the pattern of the trip and find the "to node".
//
                previousNODESrecordID = NO_RECORD;
                PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID;
                PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID;
                PATTERNSKey2.directionIndex = TRIPS.directionIndex;
                PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                PATTERNSKey2.nodeSequence = NO_RECORD;
                currentNodePositionInTrip = 0;
                rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                while(rcode2 == 0 &&
                        PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
                        PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
                        PATTERNS.directionIndex == TRIPS.directionIndex &&
                        PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
                {
                    if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
                    {
                        if(PATTERNS.NODESrecordID == TIMECHECKS.NODESrecordID)
                        {
                            if(currentNodePositionInTrip == TIMECHECKS.nodePositionInTrip)
                                break;
                            currentNodePositionInTrip++;
                        }
                        previousNODESrecordID = PATTERNS.NODESrecordID;
                    }
                    rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                }
//
//  If we have a "from node" and "to node", save the trip and the actual time
//
                if(previousNODESrecordID == NODESrecordIDs[nI].from)
                {
                    TRIPData[numEntries].TRIPSrecordID = TRIPS.recordID;
                    TRIPData[numEntries].actualTimeOfDay = TIMECHECKS.actualTime;
                    TRIPData[numEntries].nodePositionInTrip = TIMECHECKS.nodePositionInTrip;
                    numEntries++;
                    if(numEntries >= TMSRPT40_MAXNODES)
                        break;
                }
            }
            rcode2 = btrieve(B_GETNEXT, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey4, 4);
        }
//
//  Sort TRIPData based on actualTime and print out the title
//
        if(numEntries > 0)
        {
            qsort((void *)TRIPData, numEntries, sizeof(TMSRPT40TRIPSDef), TMSRPT40sort_trips);
            sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
            strcat(outputString, "  Trip#    Route  Service  Pattern    At Act    Dist  Spd/Hr\"\r\n");
            WriteFile(hOutputFile, (LPCVOID *)outputString,
                      strlen(outputString), &dwBytesWritten, NULL);
        }
//
//  Cycle through the saved entries
//
        for(nJ = 0; nJ < numEntries; nJ++)
        {
            if(StatusBarAbort())
            {
                bKeepGoing = FALSE;
                goto deallocate;
            }
//
//  Get the trip and generate it
//
            TRIPSKey0.recordID = TRIPData[nJ].TRIPSrecordID;
            rcode2 = btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
            if(rcode2 != 0)
                continue;
            sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName);
            sprintf(outputStringRaw, "%s\t%s\t", fromNodeName, toNodeName);
//
//  Trip number
//
            sprintf(tempString, "  %5ld ", TRIPS.tripNumber);
            strcat(outputString, tempString);
//
//  Route
//
            ROUTESKey0.recordID = TRIPS.ROUTESrecordID;
            btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
            strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH);
            trim(szarString, 8);
            sprintf(tempString, "%8s ", szarString);
            strcat(outputString, tempString);
            strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH);
            trim(szarString, ROUTES_NUMBER_LENGTH);
            strcat(outputStringRaw, szarString);
            strcat(outputStringRaw, "\t");
            DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[TRIPS.directionIndex];
            btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
            strncpy(szarString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH);
            trim(szarString, DIRECTIONS_ABBRNAME_LENGTH);
            strcat(outputStringRaw, szarString);
            strcat(outputStringRaw, "\t");
//
//  Service
//
            SERVICESKey0.recordID = TRIPS.SERVICESrecordID;
            btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
            strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
            trim(szarString, 8);
            sprintf(tempString, "%8s ", szarString);
            strcat(outputString, tempString);
            strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
            trim(szarString, SERVICES_NAME_LENGTH);
            strcat(outputStringRaw, szarString);
            strcat(outputStringRaw, "\t");
//
//  Pattern
//
            PATTERNNAMESKey0.recordID = TRIPS.PATTERNNAMESrecordID;
            btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
            strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
            trim(szarString, 8);
            sprintf(tempString, "%8s ", szarString);
            strcat(outputString, tempString);
            strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
            trim(szarString, PATTERNNAMES_NAME_LENGTH);
            strcat(outputStringRaw, szarString);
            strcat(outputStringRaw, "\t");
//
//  At time
//
            sprintf(tempString, "%s ", Tchar(TRIPData[nJ].actualTimeOfDay));
            strcat(outputString, tempString);
            sprintf(tempString, "%ld\t", TRIPData[nJ].actualTimeOfDay);
            strcat(outputStringRaw, tempString);
//
//  Actual running time
//
//  Pass 1 - find the companion normally (nodeposition = 0) or if a pair repeats
//
            actualTime = NO_TIME;
            TIMECHECKSKey5.TRIPSrecordID = TRIPS.recordID;
            rcode2 = btrieve(B_GETEQUAL, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5);
            while(rcode2 == 0)
            {
                if(TIMECHECKS.NODESrecordID == NODESrecordIDs[nI].from  &&
                        TIMECHECKS.nodePositionInTrip == TRIPData[nJ].nodePositionInTrip)
                {
                    actualTime = TRIPData[nJ].actualTimeOfDay - TIMECHECKS.actualTime;
                    break;
                }
                rcode2 = btrieve(B_GETNEXT, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5);
                if(TIMECHECKS.TRIPSrecordID != TRIPS.recordID)
                    break;
            }
//
//  Pass 2 - find the companion when you have the same start and end node
//
            if(actualTime == NO_TIME)
            {
                TIMECHECKSKey5.TRIPSrecordID = TRIPS.recordID;
                rcode2 = btrieve(B_GETEQUAL, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5);
                while(rcode2 == 0)
                {
                    if(TIMECHECKS.NODESrecordID == NODESrecordIDs[nI].from)
                    {
                        actualTime = TRIPData[nJ].actualTimeOfDay - TIMECHECKS.actualTime;
                        break;
                    }
                    rcode2 = btrieve(B_GETNEXT, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5);
                    if(TIMECHECKS.TRIPSrecordID != TRIPS.recordID)
                        break;
                }
            }
            if(actualTime == NO_TIME)
            {
                strcpy(tempString, "    ");
                actualTime = 0;
            }
            else
            {
                sprintf(tempString, "%3d ", actualTime / 60);
            }
            strcat(outputString, tempString);
            arrivalTime = TRIPData[nJ].actualTimeOfDay + actualTime;
            sprintf(tempString, "%ld\r\n", arrivalTime);
            strcat(outputStringRaw, tempString);
//
//  Distance
//
            distance = GreatCircleDistance(longitude[0], latitude[0], longitude[1], latitude[1]);
            sprintf(tempString, "%7.2f ", distance);
            strcat(outputString, tempString);
//
//  Speed per hour
//
            if(actualTime == 0 || actualTime == NO_TIME)
                strcpy(tempString, "-------");
            else
                sprintf(tempString, "%7.2f", distance / ((double)actualTime / 3600));
            strcat(outputString, tempString);
//
//  Write it out
//
            strcat(outputString, "\"\r\n");
            WriteFile(hOutputFile, (LPCVOID *)outputString,
                      strlen(outputString), &dwBytesWritten, NULL);
            WriteFile(hOutputFileRaw, (LPCVOID *)outputStringRaw,
                      strlen(outputStringRaw), &dwBytesWritten, NULL);
        }
        sprintf(outputString, "%d\t%s\t%s\t\"  Total entries: %d\"\r\n",
                seqNum++, fromNodeName, toNodeName, numEntries);
        WriteFile(hOutputFile, (LPCVOID *)outputString,
                  strlen(outputString), &dwBytesWritten, NULL);
    }  // nI
    bKeepGoing = TRUE;
//
//  Free allocated memory
//
deallocate:
    TMSHeapFree(REPORTPARMS.pRouteList);
    TMSHeapFree(REPORTPARMS.pServiceList);
    CloseHandle(hOutputFile);
    CloseHandle(hOutputFileRaw);
    StatusBarEnd();
    if(!bKeepGoing)
    {
        return(FALSE);
    }
//
//  All done
//
    return(TRUE);
}
Exemplo n.º 6
0
Arquivo: TMSRpt31.c Projeto: ems/TMS
BOOL FAR TMSRPT31(TMSRPTPassedDataDef *pPassedData)
{
  REPORTPARMSDef REPORTPARMS;
  HANDLE hOutputFile;
  double distance;
  double longitude;
  double prevLongitude;
  double latitude;
  double prevLatitude;
  BOOL  bKeepGoing = FALSE;
  BOOL  bRC;
  char  routeNumber[ROUTES_NUMBER_LENGTH + 1];
  char  routeName[ROUTES_NAME_LENGTH + 1];
  char  serviceName[SERVICES_NAME_LENGTH + 1];
  char  directionName[DIRECTIONS_LONGNAME_LENGTH + 1];
  char  patternName[PATTERNNAMES_NAME_LENGTH + 1];
  char  nodeName[NODES_ABBRNAME_LENGTH + 1];
  char  intersection[NODES_INTERSECTION_LENGTH + 1];
  char  *ptr;
  BYTE  recordBody[512];
  long  statbarTotal;
  long  prevPattern;
  long  prevNode;
  int   nI;
  int   nJ;
  int   nK;
  int   rcode2;
  int   recordBodyLength;
  short int sequenceNumber;
  short int rowNumber;
  short int colNumber;
  short int previousRow;

  pPassedData->nReportNumber = 30;
  pPassedData->numDataFiles = 1;
//
//  See what he wants
//
  REPORTPARMS.nReportNumber = pPassedData->nReportNumber;
  REPORTPARMS.ROUTESrecordID = m_RouteRecordID;
  REPORTPARMS.SERVICESrecordID = m_ServiceRecordID;
  REPORTPARMS.COMMENTSrecordID = NO_RECORD;
  REPORTPARMS.pRouteList = NULL;
  REPORTPARMS.pServiceList = NULL;
  REPORTPARMS.flags = RPFLAG_ROUTES | RPFLAG_SERVICES | RPFLAG_COMMENTS;
  bRC = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_RPTPARMS),
        hWndMain, (DLGPROC)RPTPARMSMsgProc, (LPARAM)&REPORTPARMS);
  if(!bRC)
    return(FALSE);
//
//  Check the list of routes and services
//
  if(REPORTPARMS.numRoutes == 0 || REPORTPARMS.numServices == 0)
    goto deallocate;
//
//  Open the output file
//
  strcpy(tempString, szDatabaseFileName);
  if((ptr = strrchr(tempString, '\\')) != NULL)
    *ptr = '\0';
  strcat(tempString, "\\TMSRPT31.XLS");
  hOutputFile = CreateFile(tempString, GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  if(hOutputFile == INVALID_HANDLE_VALUE)
  {
    LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString));
    sprintf(szarString, szFormatString, tempString);
    MessageBeep(MB_ICONSTOP);
    MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP);
    goto deallocate;
  }
  strcpy(pPassedData->szReportDataFile[0], tempString);
//
//  Write out the header for the Excel file
//
  recordBody[0] = 0x02;
  recordBody[1] = 0x00;
  recordBody[2] = 0x10;
  recordBody[3] = 0x00;
  WriteExcel(EXCEL_BOF, hOutputFile, recordBody, 4);
//
//  Loop through the routes
//
  LoadString(hInst, TEXT_117, tempString, TEMPSTRING_LENGTH);
  StatusBarStart(hWndMain, tempString);
  statbarTotal = REPORTPARMS.numRoutes * REPORTPARMS.numServices;
  rowNumber = 0;
  for(nI = 0; nI < REPORTPARMS.numRoutes; nI++)
  {
    if(StatusBarAbort())
    {
      bKeepGoing = FALSE;
      goto deallocate;
    }
    ROUTESKey0.recordID = REPORTPARMS.pRouteList[nI];
    rcode2 = btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
    if(rcode2 != 0)
      continue;
    strncpy(routeNumber, ROUTES.number, ROUTES_NUMBER_LENGTH);
    trim(routeNumber, ROUTES_NUMBER_LENGTH);
    strncpy(routeName, ROUTES.name, ROUTES_NAME_LENGTH);
    trim(routeName, ROUTES_NAME_LENGTH);
//
//  Loop through the services
//
    for(nJ = 0; nJ < REPORTPARMS.numServices; nJ++)
    {
      if(StatusBarAbort())
      {
        bKeepGoing = FALSE;
        goto deallocate;
      }
      SERVICESKey0.recordID = REPORTPARMS.pServiceList[nJ];
      rcode2 = btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
      if(rcode2 != 0)
        continue;
      strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH);
      trim(serviceName, SERVICES_NAME_LENGTH);
      LoadString(hInst, TEXT_118, szFormatString, sizeof(szFormatString));
      strcpy(szarString, routeNumber);
      strcat(szarString, " - ");
      strcat(szarString, routeName);
      sprintf(tempString, szFormatString, szarString, serviceName);
      StatusBarText(tempString);
      StatusBar((long)(nI * REPORTPARMS.numServices + nJ), (long)statbarTotal);
      if(StatusBarAbort())
      {
        bKeepGoing = FALSE;
        goto deallocate;
      }
//
//  Loop through the directions
//
      for(nK = 0; nK < 2; nK++)
      {
        if(StatusBarAbort())
        {
          bKeepGoing = FALSE;
          goto deallocate;
        }
        if(ROUTES.DIRECTIONSrecordID[nK] == NO_RECORD)
          continue;
        DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nK];
        rcode2 = btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
        if(rcode2 != 0)
          continue;
        strncpy(directionName, DIRECTIONS.longName, DIRECTIONS_LONGNAME_LENGTH);
        trim(directionName, DIRECTIONS_LONGNAME_LENGTH);
//
//  Get the base pattern nodes
//
        PATTERNSKey2.ROUTESrecordID = ROUTES.recordID;
        PATTERNSKey2.SERVICESrecordID = SERVICES.recordID;
        PATTERNSKey2.directionIndex = nK;
        PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID;
        PATTERNSKey2.nodeSequence = NO_RECORD;
        rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
        prevPattern = NO_RECORD;
        while(rcode2 == 0 &&
              PATTERNS.ROUTESrecordID == ROUTES.recordID &&
              PATTERNS.SERVICESrecordID == SERVICES.recordID &&
              PATTERNS.directionIndex == nK)
        {
//
//  Determine a change in pattern
//
          if(PATTERNS.PATTERNNAMESrecordID != prevPattern)
          {
            prevNode = NO_RECORD;
            prevPattern = PATTERNS.PATTERNNAMESrecordID;
            sequenceNumber = 1;
          }
//
//  Start outputting the data
//
//  Route number
//
          colNumber = 0;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, routeNumber, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Route name
//
          colNumber = 1;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, routeName, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Service name
//
          colNumber = 2;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, serviceName, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);

//  Direction name
//
          colNumber = 3;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, directionName, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Pattern name
//
          PATTERNNAMESKey0.recordID = PATTERNS.PATTERNNAMESrecordID;
          btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
          strncpy(patternName, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
          trim(patternName, PATTERNNAMES_NAME_LENGTH);
          colNumber = 4;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, patternName, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Sequence number
//
          colNumber = 5;
          recordBodyLength =
                SetRecordBodyForShortInteger(&rowNumber, &colNumber, &sequenceNumber, recordBody);
          WriteExcel(EXCEL_INTEGER, hOutputFile, recordBody, recordBodyLength);
          sequenceNumber++;
//
//  Node abbreviation
//
          NODESKey0.recordID = PATTERNS.NODESrecordID;
          btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
          strncpy(nodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH);
          trim(nodeName, NODES_ABBRNAME_LENGTH);
          colNumber = 6;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, nodeName, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Node intersection
//
          strncpy(intersection, NODES.intersection, NODES_INTERSECTION_LENGTH);
          trim(intersection, NODES_INTERSECTION_LENGTH);
          colNumber = 7;
          recordBodyLength =
                SetRecordBodyForString(&rowNumber, &colNumber, intersection, recordBody);
          WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength);
//
//  Latitude
//
          latitude = NODES.latitude;
          colNumber = 8;
          recordBodyLength =
                SetRecordBodyForDouble(&rowNumber, &colNumber, &latitude, recordBody);
          WriteExcel(EXCEL_NUMBER, hOutputFile, recordBody, recordBodyLength);
//
//  Longitude
//
          longitude = NODES.longitude;
          colNumber = 9;
          recordBodyLength =
                SetRecordBodyForDouble(&rowNumber, &colNumber, &longitude, recordBody);
          WriteExcel(EXCEL_NUMBER, hOutputFile, recordBody, recordBodyLength);
//
//  Distance to next node
//

          if(prevNode != NO_RECORD)
          {
            distance = GreatCircleDistance(prevLongitude, prevLatitude, longitude, latitude);
            colNumber = 10;
            previousRow = rowNumber - 1;
            recordBodyLength =
                  SetRecordBodyForDouble(&previousRow, &colNumber, &distance, recordBody);
            WriteExcel(EXCEL_NUMBER, hOutputFile, recordBody, recordBodyLength);
          }
          prevNode = NODES.recordID;
          prevLatitude = latitude;
          prevLongitude = longitude;
//
//  Bump up the row and get the next node in the BASE pattern
//
          rowNumber++;
          rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
        }  // while
      }  // nK
    }  // nJ
  }  // nI
//
//  Write out the EOF marker for the Excel file
//
  WriteExcel(EXCEL_EOF, hOutputFile, NULL, NO_RECORD);
  bKeepGoing = TRUE;
//
//  Free allocated memory
//
  deallocate:
    TMSHeapFree(REPORTPARMS.pRouteList);
    TMSHeapFree(REPORTPARMS.pServiceList);
    CloseHandle(hOutputFile);
    StatusBarEnd();
    if(!bKeepGoing)
    {
      return(FALSE);
    }
//
//  All done
//
//  Let him know
//
  strcpy(tempString, "TMSRPT31.xls was written to:\n");
  strcpy(szarString, szDatabaseFileName);
  if((ptr = strrchr(szarString, '\\')) != NULL)
  {
    *ptr = '\0';
  }
  strcat(tempString, szarString);
  MessageBox(hWndMain, tempString, TMS, MB_OK);
  return(TRUE);
}