コード例 #1
0
ファイル: Crewcut.c プロジェクト: ems/TMS
//
//  ReliefIsPossible() - See if we can travel from Point "B"
//                       to Point "C" in the allotted time.
//
BOOL ReliefIsPossible(long fromTRIPSrecordID, long fromNODESrecordID, long fromSGRPSERVICESrecordID,
      tod_t fromReliefTime, long toTRIPSrecordID, long toNODESrecordID, tod_t toReliefTime)
{
  GetConnectionTimeDef GCTData;
  float distance;
  long travelTime, dwellTime;
  long startTime, endTime;
  long waitTime;
  long equivalentTravelTime;
//
//  First things first - are the nodes equivalenced?
//
  if(NodesEquivalent(fromNODESrecordID, toNODESrecordID, &equivalentTravelTime))
    return(TRUE);
//
//  Dynamic travels?
//
  if(bUseDynamicTravels)
  {
    if(bUseCISPlan)
    {
      CISplanReliefConnect(&startTime, &endTime, &dwellTime, 0, fromNODESrecordID,
            toNODESrecordID, fromReliefTime, FALSE, fromSGRPSERVICESrecordID);
      travelTime = (endTime - startTime) + dwellTime;
    }
    else
      travelTime = GetDynamicTravelTime(TRUE, fromNODESrecordID, toNODESrecordID,
            fromSGRPSERVICESrecordID, toReliefTime, &waitTime);
  }
//
//  Set up the GCTData structure for input into GetConnectionTime()
//
  else
  {
    TRIPSKey0.recordID = fromTRIPSrecordID;
    btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
    GCTData.fromNODESrecordID = fromNODESrecordID;
    GCTData.fromROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID;
    GCTData.fromSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID;
    GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
    TRIPSKey0.recordID = toTRIPSrecordID;
    btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
    GCTData.toNODESrecordID = toNODESrecordID;
    GCTData.toROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID;
    GCTData.toSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID;
    GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
    GCTData.timeOfDay = fromReliefTime;
    travelTime = GetConnectionTime(GCT_FLAG_TRAVELTIME, &GCTData, &distance);
  }
//
//  Check 1: Is it a valid travel?
//
  if(travelTime == NO_TIME)
    return(FALSE);
//
//  Check 2: Return TRUE if he can make it, FALSE if he can't
//
  return(fromReliefTime + travelTime <= toReliefTime);
}
コード例 #2
0
void wimaxcu_get_conn_time(WIMAX_API_DEVICE_ID_P p_device_id)
{
	WIMAX_API_RET wmxStatus = WIMAX_API_RET_SUCCESS;
	WIMAX_API_CONNECTION_TIME connectionTime;

	wmxStatus = GetConnectionTime(p_device_id, &connectionTime);
	if (WIMAX_API_RET_SUCCESS != wmxStatus) {
		PrintWmxStatus(wmxStatus);
		return;
	}
	PrintConnectionTime(connectionTime);
}
コード例 #3
0
ファイル: BlockProperties.cpp プロジェクト: ems/TMS
void CBlockProperties::OnClickList(NMHDR* pNMHDR, LRESULT* pResult) 
{
  float distance;
  char nodeName[NODES_ABBRNAME_LENGTH + 1];
  long deadheadTime;
  int  rcode2;
  int  pos;

  POSITION position = pListCtrlLIST->GetFirstSelectedItemPosition();
//
//  Determine the selection(s)
//
  if(position == NULL)
  {
    return;
  }
//
//  Display the trip
//
  LVCOLUMN LVC;
  int nItem = pListCtrlLIST->GetNextSelectedItem(position);
  int nI = pListCtrlLIST->GetItemData(nItem);
//
//  Get the trip
//
  TRIPSKey0.recordID = m_pRELIEFPOINTS[nI].TRIPSrecordID;
  btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
//
//  Show the route, service, direction, and pattern
//
  char routeNumberAndName[ROUTES_NUMBER_LENGTH + 3 + ROUTES_NAME_LENGTH + 1];
  char serviceName[SERVICES_NAME_LENGTH + 1];
  char directionName[DIRECTIONS_LONGNAME_LENGTH + 1];
  char patternName[PATTERNNAMES_NAME_LENGTH + 1];

  ROUTESKey0.recordID = TRIPS.ROUTESrecordID;
  btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
  strncpy(routeNumberAndName, ROUTES.number, ROUTES_NUMBER_LENGTH);
  trim(routeNumberAndName, ROUTES_NUMBER_LENGTH);
  strcat(routeNumberAndName, " - ");
  strncpy(tempString, ROUTES.name, ROUTES_NAME_LENGTH);
  trim(tempString, ROUTES_NAME_LENGTH);
  strcat(routeNumberAndName, tempString);

  SERVICESKey0.recordID = TRIPS.SERVICESrecordID;
  btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
  strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH);
  trim(serviceName, SERVICES_NAME_LENGTH);

  DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[TRIPS.directionIndex];
  btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0);
  strncpy(directionName, DIRECTIONS.longName, DIRECTIONS_LONGNAME_LENGTH);
  trim(directionName, DIRECTIONS_LONGNAME_LENGTH);

  PATTERNNAMESKey0.recordID = TRIPS.PATTERNNAMESrecordID;
  btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0);
  strncpy(patternName, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH);
  trim(patternName, PATTERNNAMES_NAME_LENGTH);

  sprintf(tempString, "Trip info: %s %s %s on pattern %s",
        serviceName, directionName, routeNumberAndName, patternName);
  pStaticTRIPINFO->SetWindowText(tempString);

//
//  Clear out the previous ListCtrl
//
  pListCtrlTRIPDATA->DeleteAllItems();

  CHeaderCtrl* pCtrl = pListCtrlTRIPDATA->GetHeaderCtrl();

  if(pCtrl != NULL)
  {
    int nCount = pCtrl->GetItemCount();
    for(nI = 0; nI < nCount; nI++)
    {
      pCtrl->DeleteItem(0);
    }
  }
//
//  Set up the list control
//
  GenerateTripDef GTResults;
  GetConnectionTimeDef GCTData;

  int numNodes = GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
        TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
        TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);

  pos = 0;
//
//  Is this a pullout?
//
  long POTime = NO_TIME;
  
  if(TRIPS.standard.POGNODESrecordID != NO_RECORD)
  {
    GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
    GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
    GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID;
    GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID;
    GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID;
    GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID;
    GCTData.fromNODESrecordID = TRIPS.standard.POGNODESrecordID;
    GCTData.toNODESrecordID = GTResults.firstNODESrecordID;
    GCTData.timeOfDay = GTResults.firstNodeTime;
    deadheadTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
    distance = (float)fabs((double)distance);
    if(deadheadTime != NO_TIME)
    {
      POTime = GTResults.firstNodeTime - deadheadTime;
      NODESKey0.recordID = TRIPS.standard.POGNODESrecordID;
      btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
      strncpy(nodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH);
      trim(nodeName, NODES_ABBRNAME_LENGTH);
      LVC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
      LVC.fmt = LVCFMT_LEFT;
      LVC.cx = 50;
      LVC.pszText = nodeName;
      pListCtrlTRIPDATA->InsertColumn(pos, &LVC);
      pos++;
    }
  }
//
//  Set the header to the pattern of the trip
//
  PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID;
  PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID;
  PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
  PATTERNSKey2.directionIndex = TRIPS.directionIndex;
  PATTERNSKey2.nodeSequence = NO_RECORD;
  rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
  while(rcode2 == 0 &&
        PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
        PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
        PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID &&
        PATTERNS.directionIndex == TRIPS.directionIndex)
  {
    if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
    {
      NODESKey0.recordID = PATTERNS.NODESrecordID;
      btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
      strncpy(nodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH);
      trim(nodeName, NODES_ABBRNAME_LENGTH);
      LVC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
      LVC.fmt = LVCFMT_LEFT;
      LVC.cx = 50;
      LVC.pszText = nodeName;
      pListCtrlTRIPDATA->InsertColumn(pos, &LVC);
      pos++;
    }
    rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
  }
//  
//  Is this a pull-in?
//
  long PITime = NO_TIME;
  if(TRIPS.standard.PIGNODESrecordID != NO_RECORD)
  {
    GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
    GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
    GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID;
    GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID;
    GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID;
    GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID;
    GCTData.fromNODESrecordID = GTResults.lastNODESrecordID;
    GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID;
    GCTData.timeOfDay = GTResults.lastNodeTime;
    deadheadTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
    distance = (float)fabs((double)distance);
    if(deadheadTime != NO_TIME)
    {
      PITime = GTResults.lastNodeTime + deadheadTime;
      NODESKey0.recordID = TRIPS.standard.PIGNODESrecordID;
      btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
      strncpy(nodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH);
      trim(nodeName, NODES_ABBRNAME_LENGTH);
      LVC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
      LVC.fmt = LVCFMT_LEFT;
      LVC.cx = 50;
      LVC.pszText = nodeName;
      pListCtrlTRIPDATA->InsertColumn(pos, &LVC);
    }
  }
//
//  Display the times
//
  LVITEM LVI;

  LVI.iItem = 0;
  LVI.mask = LVIF_TEXT;
  pos = 0;
//
//  POT?
//
  if(POTime != NO_TIME)
  {
    LVI.iSubItem = pos;
    strcpy(tempString, Tchar(POTime));
    LVI.pszText = tempString;
    pListCtrlTRIPDATA->InsertItem(&LVI);
    pos++;
  }
//
//  Do the trip times
//
  strcpy(tempString, Tchar(GTResults.tripTimes[0]));
  LVI.pszText = tempString;
  LVI.iSubItem = pos;
  if(pos == 0)
    pListCtrlTRIPDATA->InsertItem(&LVI);
  else
  {
    pListCtrlTRIPDATA->SetItem(&LVI);
  }
  pos++;
  for(nI = 1; nI < numNodes; nI++)
  {  
    LVI.iSubItem = pos;
    strcpy(tempString, Tchar(GTResults.tripTimes[nI]));
    LVI.pszText = tempString;
    pListCtrlTRIPDATA->SetItem(&LVI);
    pos++;
  }
//
//  PIT?
//
  if(PITime != NO_TIME)
  {
    LVI.iSubItem = pos;
    strcpy(tempString, Tchar(PITime));
    LVI.pszText = tempString;
    pListCtrlTRIPDATA->SetItem(&LVI);
  }

	*pResult = 0;
}
コード例 #4
0
ファイル: Tmsrpt67.c プロジェクト: 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);
}
コード例 #5
0
ファイル: DailyOpsRS.cpp プロジェクト: ems/TMS
BOOL CDailyOpsRS::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
//
//  Set up poiners to the controls
//
  pListCtrlPOTENTIALSPLITS = (CListCtrl *)GetDlgItem(DAILYOPSRS_POTENTIALSPLITS);
  pListCtrlCURRENTSPLITS = (CListCtrl *)GetDlgItem(DAILYOPSRS_CURRENTSPLITS);
  pComboBoxSTARTSPLIT = (CComboBox *)GetDlgItem(DAILYOPSRS_STARTSPLIT);
  pComboBoxENDSPLIT = (CComboBox *)GetDlgItem(DAILYOPSRS_ENDSPLIT);
  pButtonIDREMOVE = (CButton *)GetDlgItem(IDREMOVE);
  pButtonIDCANCEL = (CButton *)GetDlgItem(IDCANCEL);
//
//  Initialize m_RP
//
  int nI;

  for(nI = 0; nI < RPMAX; nI++)
  {
    m_RP[nI].TRIPSrecordID = NO_RECORD;
    m_RP[nI].NODESrecordID = NO_RECORD;
    m_RP[nI].time = NO_TIME;
    m_RP[nI].flags = 0;
    m_RP[nI].startDRIVERSrecordID = NO_RECORD;
    m_RP[nI].endDRIVERSrecordID = NO_RECORD;
    m_RP[nI].DAILYOPSrecordID = NO_RECORD;
  }
//
//  What type of run is this?
//
  m_bCrewOnly = (m_pPassedData->flags & RUNSPLIT_FLAGS_CREWONLY);
//
//  Get the run details
//
  long runNumber;
  int  rcode2;

  if(m_bCrewOnly)
  {
    CREWONLY.recordID = m_pPassedData->RUNSrecordID;
    rcode2 = btrieve(B_GETEQUAL, TMS_CREWONLY, &CREWONLY, &CREWONLYKey0, 0);
    runNumber = CREWONLY.runNumber;
  }
  else
  {
    RUNSKey0.recordID = m_pPassedData->RUNSrecordID;
    rcode2 = btrieve(B_GETEQUAL, TMS_RUNS, &RUNS, &RUNSKey0, 0);
    runNumber = RUNS.runNumber;
  }
  if(rcode2 != 0)
  {
    sprintf(tempString, "Invalid RUNSrecordID passed to DailyOpsRS\n\nValue was %ld", m_pPassedData->RUNSrecordID);
    MessageBox(tempString, TMS, MB_OK);
    OnCancel(); 
    return TRUE;
  }
//
//  Put the run number in the title.  On an automatic,
//  add the driver's name and a notification to the bar.
//
  GetWindowText(szFormatString, SZFORMATSTRING_LENGTH);
  sprintf(tempString, szFormatString, runNumber);
  if(m_pPassedData->flags & RUNSPLIT_FLAGS_AUTOMATIC)
  {
    strcat(tempString, " - Due to absence of ");
    strcat(tempString, BuildOperatorString(m_pPassedData->DRIVERSrecordID));
    pButtonIDCANCEL->EnableWindow(FALSE);
  }
  SetWindowText(tempString);
//
//  Set the styles for the list controls
//
  DWORD dwExStyles;

  dwExStyles = pListCtrlPOTENTIALSPLITS->GetExtendedStyle();
  pListCtrlPOTENTIALSPLITS->SetExtendedStyle(dwExStyles | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP);

  dwExStyles = pListCtrlCURRENTSPLITS->GetExtendedStyle();
  pListCtrlCURRENTSPLITS->SetExtendedStyle(dwExStyles | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_INFOTIP);
//
//  Set up the headers on the potential splits list control
//
  LVCOLUMN LVC;

  LVC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
  LVC.fmt = LVCFMT_CENTER;
  LVC.cx = 42;
  LVC.pszText = "Status";
  pListCtrlPOTENTIALSPLITS->InsertColumn(0, &LVC);

  LVC.cx = 50;
  LVC.pszText = "Relief";
  pListCtrlPOTENTIALSPLITS->InsertColumn(1, &LVC);

  LVC.cx = 50;
  LVC.pszText = "At";
  pListCtrlPOTENTIALSPLITS->InsertColumn(2, &LVC);
//
//  Set up the headers on the current splits list control
//
  LVC.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
  LVC.fmt = LVCFMT_CENTER;
  LVC.cx = 25;
  LVC.pszText = "";
  pListCtrlCURRENTSPLITS->InsertColumn(0, &LVC);
 
  LVC.cx = 50;
  LVC.pszText = "Relief";
  pListCtrlCURRENTSPLITS->InsertColumn(1, &LVC);

  LVC.cx = 50;
  LVC.pszText = "At";
  pListCtrlCURRENTSPLITS->InsertColumn(2, &LVC);

  LVC.cx = 50;
  LVC.pszText = "Relief";
  pListCtrlCURRENTSPLITS->InsertColumn(3, &LVC);
  
  LVC.cx = 50;
  LVC.pszText = "At";
  pListCtrlCURRENTSPLITS->InsertColumn(4, &LVC);

  GenerateTripDef      GTResults;
  GetConnectionTimeDef GCTData;
  float distance;
  BOOL  bFound;
  BOOL  bStartOfPiece;
  BOOL  bEndOfPiece;
  BOOL  bCrewOnly;
  long  pieceNumber;
  long  serviceRecordID;
  long  runtype;
  long  dhdTime;
  long  serviceNumber;
  long  assignedToNODESrecordID;
  long  RGRPROUTESrecordID;
  long  SGRPSERVICESrecordID;
  long  blockNumber;
  int   counter;
  int   serviceIndex;

  m_numRP = 0;
//
//  Crew only runs - get the start/end timepoints and times
//
  if(m_bCrewOnly)
  {
    m_RP[m_numRP].NODESrecordID = CREWONLY.startNODESrecordID;
    m_RP[m_numRP].time = CREWONLY.startTime;
    m_RP[m_numRP].flags = RP_FLAGS_STARTOFPIECE;
    m_RP[m_numRP].TRIPSrecordID = NO_RECORD;
    m_numRP++;
    m_RP[m_numRP].NODESrecordID = CREWONLY.endNODESrecordID;
    m_RP[m_numRP].time = CREWONLY.endTime;
    m_RP[m_numRP].flags = RP_FLAGS_ENDOFPIECE;
    m_RP[m_numRP].TRIPSrecordID = NO_RECORD;
    m_numRP++;
  }
//
//  Regular runs are a little more complicated
//
  else
  {
//
//  Determine the service index/number
//
    SERVICESKey0.recordID = m_pPassedData->SERVICESrecordIDInEffect;
    btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
    serviceNumber = SERVICES.number;
//
//  Set up the index into the node labels string
//
    serviceIndex = m_ServiceNumber - 1;
    if(serviceIndex < 0 || serviceIndex > NODES_RELIEFLABELS_LENGTH - 1)
    {
      serviceIndex = 0;
    }
//
//  Get some pertinent run information
//
    PROPOSEDRUNDef PROPOSEDRUN;
    COSTDef        COST;

    GetRunElements(NULL, &RUNS, &PROPOSEDRUN, &COST, TRUE);
    if(m_bCrewOnly)
    {
      CREWONLY.recordID = m_pPassedData->RUNSrecordID;
      rcode2 = btrieve(B_GETEQUAL, TMS_CREWONLY, &CREWONLY, &CREWONLYKey0, 0);
      runNumber = CREWONLY.runNumber;
    }
    else
    {
      RUNSKey0.recordID = m_pPassedData->RUNSrecordID;
      rcode2 = btrieve(B_GETEQUAL, TMS_RUNS, &RUNS, &RUNSKey0, 0);
      runNumber = RUNS.runNumber;
    }
//
//  Cycle through the run
//
    runNumber = RUNS.runNumber;
    serviceRecordID = RUNS.SERVICESrecordID;
    runtype = RUNS.cutAsRuntype;
    btrieve(B_GETPOSITION, TMS_RUNS, &RUNS, &RUNSKey0, 0);
    rcode2 = btrieve(B_GETDIRECT, TMS_RUNS, &RUNS, &RUNSKey1, 1);
    while(rcode2 == 0 &&
          runNumber == RUNS.runNumber &&
          serviceRecordID == RUNS.SERVICESrecordID)
    {
      pieceNumber = RUNS.pieceNumber - 1;
//
//  Get the report at location and time
//
      if(COST.TRAVEL[pieceNumber].startNODESrecordID == NO_RECORD)
      {
        m_RP[m_numRP].NODESrecordID = PROPOSEDRUN.piece[pieceNumber].fromNODESrecordID;
      }
      else
      {
        m_RP[m_numRP].NODESrecordID = COST.TRAVEL[pieceNumber].startNODESrecordID;
      }
      m_RP[m_numRP].time = PROPOSEDRUN.piece[pieceNumber].fromTime -
              COST.PIECECOST[pieceNumber].reportTime - COST.TRAVEL[pieceNumber].startTravelTime;
      if(PROPOSEDRUN.piece[pieceNumber].prior.startTime != NO_TIME)
      {
        m_RP[m_numRP].time -= PROPOSEDRUN.piece[pieceNumber].prior.startTime;
      }
      m_RP[m_numRP].flags = RP_FLAGS_STARTOFPIECE;
      m_RP[m_numRP].TRIPSrecordID = NO_RECORD;
      m_numRP++;
//
//  Generate the start trip
//
      TRIPSKey0.recordID = RUNS.start.TRIPSrecordID;
      btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
      GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
            TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
            TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS | GENERATETRIP_FLAG_GETLABELS, &GTResults);
//
//  Is the node a pullout?
//
      bFound = FALSE;
//      bStartOfPiece = TRUE;
      if(TRIPS.standard.POGNODESrecordID == RUNS.start.NODESrecordID)
      {
        GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
        GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
        GCTData.fromROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID;
        GCTData.fromSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID;
        GCTData.toROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID;
        GCTData.toSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID;
        GCTData.fromNODESrecordID = TRIPS.standard.POGNODESrecordID;
        GCTData.toNODESrecordID = GTResults.firstNODESrecordID;
        GCTData.timeOfDay = GTResults.firstNodeTime;
        dhdTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
        m_RP[m_numRP].NODESrecordID = RUNS.start.NODESrecordID;
        m_RP[m_numRP].time = GTResults.firstNodeTime - (dhdTime == NO_TIME ? 0 : dhdTime);
//        m_RP[m_numRP].flags = RP_FLAGS_STARTOFPIECE;
        m_RP[m_numRP].flags = 0;
        m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID;
        m_numRP++;
        bFound = TRUE;
//        bStartOfPiece = FALSE;
      }
//
//  Find any relief points on the trip
//
      PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID;
      PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID;
      PATTERNSKey2.directionIndex = TRIPS.directionIndex;
      PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
      PATTERNSKey2.nodeSequence = NO_RECORD;
      rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
      counter = 0;
//
//  Ensure that if there wasn't a P/O that we're starting at the right node
//
      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(bFound || PATTERNS.NODESrecordID == RUNS.start.NODESrecordID)
          {
            bFound = TRUE;  // In case we've hit PATTERNS.NODESrecordID == startNODESrecordID
            NODESKey0.recordID = PATTERNS.NODESrecordID;
            btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
            if(CheckNodeLabel(GTResults.labelledNODESrecordIDs[counter], &NODES, (int)serviceIndex))
            {
              m_RP[m_numRP].NODESrecordID = PATTERNS.NODESrecordID;
              m_RP[m_numRP].time = GTResults.tripTimes[counter];
//              if(bStartOfPiece)
//              {
//                m_RP[m_numRP].flags = RP_FLAGS_STARTOFPIECE;
//                bStartOfPiece = FALSE;
//              }
//              else
//              {
                m_RP[m_numRP].flags = 0;
//              }
              m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID;
              m_numRP++;
            }
          }
          counter++;
        }
        rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
      }
//
//  Does the first trip pull in?
//
      bFound = FALSE;
      if(TRIPS.standard.PIGNODESrecordID == RUNS.end.NODESrecordID)
      {
        GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
        GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
        GCTData.fromROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID;
        GCTData.fromSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID;
        GCTData.toROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID;
        GCTData.toSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID;
        GCTData.fromNODESrecordID = GTResults.lastNODESrecordID;
        GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID;
        GCTData.timeOfDay = GTResults.lastNodeTime;
        dhdTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
        m_RP[m_numRP].NODESrecordID = RUNS.end.NODESrecordID;
        m_RP[m_numRP].time = GTResults.lastNodeTime + (dhdTime == NO_TIME ? 0 : dhdTime);
//        m_RP[m_numRP].flags = RP_FLAGS_ENDOFPIECE;
        m_RP[m_numRP].flags = 0;
        m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID;
        m_numRP++;
        bFound = TRUE;
      }
//
//  Continue through the rest of the block unless we've already pulled-in
//
      if(!bFound)
      {
        TRIPSKey0.recordID = RUNS.start.TRIPSrecordID;
        btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
        btrieve(B_GETPOSITION, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
        rcode2 = btrieve(B_GETDIRECT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2);
        assignedToNODESrecordID = TRIPS.standard.assignedToNODESrecordID;
        RGRPROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID;
        SGRPSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID;
        blockNumber = TRIPS.standard.blockNumber;
        rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2);
        bEndOfPiece = FALSE;
        while(rcode2 == 0 &&
              TRIPS.standard.assignedToNODESrecordID == assignedToNODESrecordID &&
              TRIPS.standard.RGRPROUTESrecordID == RGRPROUTESrecordID &&
              TRIPS.standard.SGRPSERVICESrecordID == SGRPSERVICESrecordID &&
              TRIPS.standard.blockNumber == blockNumber)
        {
//
//  Generate the trip
//
          GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS | GENERATETRIP_FLAG_GETLABELS, &GTResults);
//
//  Find any relief points on the trip
//
          PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID;
          PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID;
          PATTERNSKey2.directionIndex = TRIPS.directionIndex;
          PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
          PATTERNSKey2.nodeSequence = NO_RECORD;
          rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          counter = 0;
          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(TRIPS.recordID == RUNS.end.TRIPSrecordID &&
                    PATTERNS.NODESrecordID == RUNS.end.NODESrecordID)
              {
                m_RP[m_numRP].NODESrecordID = PATTERNS.NODESrecordID;
                m_RP[m_numRP].time = GTResults.tripTimes[counter];
//                m_RP[m_numRP].flags = RP_FLAGS_ENDOFPIECE;
                m_RP[m_numRP].flags = 0;
                bEndOfPiece = TRUE;
                m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID;
                m_numRP++;
                break;
              }
              else
              {
                NODESKey0.recordID = PATTERNS.NODESrecordID;
                btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
                if(CheckNodeLabel(GTResults.labelledNODESrecordIDs[counter], &NODES, (int)serviceIndex))
                {
                  m_RP[m_numRP].NODESrecordID = PATTERNS.NODESrecordID;
                  m_RP[m_numRP].time = GTResults.tripTimes[counter];
                  m_RP[m_numRP].flags = 0;
                  m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID;
                  m_numRP++;
                }
              }
              counter++;
            }
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          }
//
//  Check for a pull-in
//
          if(TRIPS.standard.PIGNODESrecordID == RUNS.end.NODESrecordID)
          {
            GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
            GCTData.fromROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID;
            GCTData.fromSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID;
            GCTData.toROUTESrecordID = TRIPS.standard.RGRPROUTESrecordID;
            GCTData.toSERVICESrecordID = TRIPS.standard.SGRPSERVICESrecordID;
            GCTData.fromNODESrecordID = GTResults.lastNODESrecordID;
            GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID;
            GCTData.timeOfDay = GTResults.lastNodeTime;
            dhdTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
            m_RP[m_numRP].NODESrecordID = RUNS.end.NODESrecordID;
            m_RP[m_numRP].time = GTResults.lastNodeTime + (dhdTime == NO_TIME ? 0 : dhdTime);
//            m_RP[m_numRP].flags = RP_FLAGS_ENDOFPIECE;
            m_RP[m_numRP].flags = 0;
            bEndOfPiece = TRUE;
            m_RP[m_numRP].TRIPSrecordID = TRIPS.recordID;
            m_numRP++;
          }
//
//  If we've hit the end of the piece, we're done
//
          if(bEndOfPiece)
          {
//
//  Get the turnin location and time if they differ from where we are
//
            if(COST.TRAVEL[pieceNumber].endNODESrecordID == NO_RECORD)
            {
              m_RP[m_numRP - 1].flags = RP_FLAGS_ENDOFPIECE;
            }
            else
            {
              if(COST.TRAVEL[pieceNumber].endNODESrecordID == NO_RECORD)
              {
                m_RP[m_numRP].NODESrecordID = PROPOSEDRUN.piece[pieceNumber].toNODESrecordID;
              }
              else
              {
                m_RP[m_numRP].NODESrecordID = COST.TRAVEL[pieceNumber].endNODESrecordID;
              }
              m_RP[m_numRP].time = PROPOSEDRUN.piece[pieceNumber].toTime +
                    COST.PIECECOST[pieceNumber].turninTime + COST.TRAVEL[pieceNumber].endTravelTime;
              if(PROPOSEDRUN.piece[pieceNumber].after.endTime != NO_TIME)
              {
                m_RP[m_numRP].time += PROPOSEDRUN.piece[pieceNumber].after.endTime;
              }
              m_RP[m_numRP].flags = RP_FLAGS_ENDOFPIECE;
              m_RP[m_numRP].TRIPSrecordID = NO_RECORD;
              m_numRP++;
            }
            break;
          }
//
//  Get the next trip in the block
//
          rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2);
        }
      }
//
//  Get the next piece of the run
//
      rcode2 = btrieve(B_GETNEXT, TMS_RUNS, &RUNS, &RUNSKey1, 1);
    }
  }
//
//  Put any inseted points into the list
//
  int currentRP = m_numRP;

  DAILYOPSKey1.recordTypeFlag = DAILYOPS_FLAG_OPENWORK;
  DAILYOPSKey1.recordFlags = DAILYOPS_FLAG_RUNSPLITINSERT;
  DAILYOPSKey1.pertainsToDate = m_pPassedData->pertainsToDate;
  DAILYOPSKey1.pertainsToTime = NO_TIME;
  rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1);
  while(rcode2 == 0 &&
        DAILYOPS.recordTypeFlag == DAILYOPS_FLAG_OPENWORK &&
        DAILYOPS.pertainsToDate == m_pPassedData->pertainsToDate)
  {
    if(DAILYOPS.recordFlags & DAILYOPS_FLAG_RUNSPLITINSERT)
    {
      if(DAILYOPS.DAILYOPSrecordID == NO_RECORD)  // not deleted
      {
        bCrewOnly = DAILYOPS.DOPS.OpenWork.splitStartTRIPSrecordID;  // used on a run split insert
        if(m_bCrewOnly == bCrewOnly)
        {
          if(DAILYOPS.DOPS.OpenWork.RUNSrecordID == m_pPassedData->RUNSrecordID)
          {
            m_RP[m_numRP].NODESrecordID = DAILYOPS.DOPS.OpenWork.splitStartNODESrecordID;
            m_RP[m_numRP].time = DAILYOPS.DOPS.OpenWork.splitStartTime;
            m_RP[m_numRP].TRIPSrecordID = NO_RECORD;
            m_RP[m_numRP].DAILYOPSrecordID = DAILYOPS.recordID;
            m_RP[m_numRP].flags |= RP_FLAGS_INSERTED;
            m_numRP++;
          }
        }
      }
    }
    rcode2 = btrieve(B_GETNEXT, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1);
  }
//
//  If there were any additions, sort the list
//
  if(m_numRP != currentRP)
  {
    qsort((void *)m_RP, m_numRP, sizeof(RPDef), sort_RP);
  }
//
//  Get the current splits
//
  LVITEM  LVI;
  BOOL    bRecordFlag = (m_bCrewOnly ? DAILYOPS_FLAG_RUNSPLITCREWONLY : DAILYOPS_FLAG_RUNSPLIT);
  int     numCurrent = 0;
  int     startIndex, endIndex;

  DAILYOPSKey1.recordTypeFlag = DAILYOPS_FLAG_OPENWORK;
  DAILYOPSKey1.recordFlags = 0; //bRecordFlag;
  DAILYOPSKey1.pertainsToDate = m_pPassedData->pertainsToDate;
  DAILYOPSKey1.pertainsToTime = NO_TIME;
  rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1);
  while(rcode2 == 0 &&
        DAILYOPS.recordTypeFlag == DAILYOPS_FLAG_OPENWORK &&
        DAILYOPS.pertainsToDate == m_pPassedData->pertainsToDate)
  {
    if(DAILYOPS.recordFlags & bRecordFlag)
    {
      if(!ANegatedRecord(DAILYOPS.recordID, 1))
//      if(DAILYOPS.DAILYOPSrecordID == NO_RECORD &&
//            !(DAILYOPS.recordFlags & DAILYOPS_FLAG_OPENWORKASSIGN))  // not unsplit prior to this
      {
        if(DAILYOPS.DOPS.OpenWork.RUNSrecordID == m_pPassedData->RUNSrecordID)
        {
//
//  Get the start of the split
//
          for(startIndex = NO_RECORD, nI = 0; nI < m_numRP; nI++)
          {
            if(DAILYOPS.DOPS.OpenWork.splitStartNODESrecordID == m_RP[nI].NODESrecordID &&
                  DAILYOPS.DOPS.OpenWork.splitStartTime == m_RP[nI].time)
            {
              startIndex = nI;
              break;
            }
          }
//
//  Get the end of the split
//
          if(startIndex != NO_RECORD)
          {
            for(endIndex = NO_RECORD, nI = startIndex + 1; nI < m_numRP; nI++)
            {
              if(DAILYOPS.DOPS.OpenWork.splitEndNODESrecordID == m_RP[nI].NODESrecordID &&
                    DAILYOPS.DOPS.OpenWork.splitEndTime == m_RP[nI].time)
              {
                endIndex = nI;
                break;
              }
            }
//
//  Got both start and end
//
            if(endIndex != NO_RECORD)
            {
//
//  Set the flags
//
              for(nI = startIndex; nI <= endIndex; nI++)
              {
                if(nI == startIndex)
                {
                  m_RP[nI].flags |= RP_FLAGS_SPLITATSTART;
                  m_RP[nI].startDRIVERSrecordID = DAILYOPS.DRIVERSrecordID;
                }
                else if(nI == endIndex)
                {
                  m_RP[nI].flags |= RP_FLAGS_SPLITATEND;
                  m_RP[nI].endDRIVERSrecordID = DAILYOPS.DRIVERSrecordID;
                }
                else
                {
                  m_RP[nI].flags |= RP_FLAGS_SPLITMIDDLE;
                  m_RP[nI].startDRIVERSrecordID = DAILYOPS.DRIVERSrecordID;
                  m_RP[nI].endDRIVERSrecordID = DAILYOPS.DRIVERSrecordID;
                }
              }
//
//  Display it in the current splits
//
              LVI.mask = LVIF_TEXT | LVIF_PARAM;
              LVI.iItem = numCurrent;
              LVI.iSubItem = 0;
              itoa(numCurrent + 1, tempString, 10);
              LVI.pszText = tempString;
              LVI.lParam = MAKELONG(startIndex, endIndex);
              LVI.iItem = pListCtrlCURRENTSPLITS->InsertItem(&LVI);
//
//  Node
//
              NODESKey0.recordID = DAILYOPS.DOPS.OpenWork.splitStartNODESrecordID;
              btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
              strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
              trim(szarString, NODES_ABBRNAME_LENGTH);
              LVI.mask = LVIF_TEXT;
              LVI.iItem = numCurrent;
              LVI.iSubItem = 1;
              LVI.pszText = szarString;
              LVI.iItem = pListCtrlCURRENTSPLITS->SetItem(&LVI);
//
//  At
//
              strcpy(tempString, Tchar(DAILYOPS.DOPS.OpenWork.splitStartTime));
              LVI.mask = LVIF_TEXT;
              LVI.iItem = numCurrent;
              LVI.iSubItem = 2;
              LVI.pszText = tempString;
              LVI.iItem = pListCtrlCURRENTSPLITS->SetItem(&LVI);
//
//  Node
//
              NODESKey0.recordID = DAILYOPS.DOPS.OpenWork.splitEndNODESrecordID;
              btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0);
              strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH);
              trim(szarString, NODES_ABBRNAME_LENGTH);
              LVI.mask = LVIF_TEXT;
              LVI.iItem = numCurrent;
              LVI.iSubItem = 3;
              LVI.pszText = szarString;
              LVI.iItem = pListCtrlCURRENTSPLITS->SetItem(&LVI);
//
//  At
//
              strcpy(tempString, Tchar(DAILYOPS.DOPS.OpenWork.splitEndTime));
              LVI.mask = LVIF_TEXT;
              LVI.iItem = numCurrent;
              LVI.iSubItem = 4;
              LVI.pszText = tempString;
              LVI.iItem = pListCtrlCURRENTSPLITS->SetItem(&LVI);
              numCurrent++;
            }
          }
        }
      }
    }
    rcode2 = btrieve(B_GETNEXT, TMS_DAILYOPS, &DAILYOPS, &DAILYOPSKey1, 1);
  }
//
//  List all the potential split points and times
//
  DisplayPotentials();
//
//  Dropdowns
//
  DisplayDropdowns();
//
//  When we come in with the AUTOMATIC flag, it means that an
//  absence has been registered and we're generating this run
//  split, well, automatically,  Position the selections to be
//  as close to the start and end of the incoming times as 
//  possible, and fire up an OnPreview() to see where it sits
//
  if(m_pPassedData->flags & RUNSPLIT_FLAGS_AUTOMATIC)
  {
/*
    startIndex = NO_RECORD;
    endIndex = NO_RECORD;
    for(nI = 0; nI < m_numRP; nI++)
    {  
      if(m_pPassedData->fromTime <= m_RP[nI].time && startIndex == NO_RECORD)
      {
        startIndex = nI;
      }
      endIndex = nI;
      if(m_pPassedData->toTime <= m_RP[nI].time)
      {
        break;
      }
    }
    for(nI = startIndex; nI <= endIndex; nI++)
    {
      if(nI == startIndex)
      {
        m_RP[nI].flags |= RP_FLAGS_SPLITATSTART;
      }
      else if(nI == endIndex)
      {
        m_RP[nI].flags |= RP_FLAGS_SPLITATEND;
      }
      else
      {
        m_RP[nI].flags |= RP_FLAGS_SPLITMIDDLE;
      }
    }
*/   
    OnPreview();
  }

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}
コード例 #6
0
ファイル: ADDBLOCK.c プロジェクト: ems/TMS
BOOL CALLBACK ADDBLOCKMsgProc(HWND hWndDlg, UINT Message, WPARAM wParam, LPARAM lParam)
{
  typedef struct STATSStruct
  {
    float dhdDist;
    long  dhdTime;
    long  layTime;
    float revDist;
    long  revTime;
  } STATSDef;
  typedef struct PARMSStruct
  {
    BOOL bStandard;
    BOOL bDropback;
    BOOL bInterlining;
    BOOL bServiceWrap;
    BOOL bDeadheading;
    BOOL bDeadheadAll;
    long maxDeadheadTime;
  } PARMSDef;
  static PDISPLAYINFO   pDI;
  static HANDLE hCtlALLROUTES;
  static HANDLE hCtlCC;
  static HANDLE hCtlCOMMENTCODE;
  static HANDLE hCtlORROUTE;
  static HANDLE hCtlFROMROUTE;
  static HANDLE hCtlFROMSERVICE;
  static HANDLE hCtlLISTBOXTITLE;
  static HANDLE hCtlTRIPS;
  static HANDLE hCtlMIN;
  static HANDLE hCtlMINVEHICLES;
  static HANDLE hCtlMAX;
  static HANDLE hCtlMAXVEHICLES;
  static HANDLE hCtlILYES;
  static HANDLE hCtlILNO;
  static HANDLE hCtlSWYES;
  static HANDLE hCtlSWNO;
  static HANDLE hCtlDHYES;
  static HANDLE hCtlDHNO;
  static HANDLE hCtlDEADHEADALL;
  static HANDLE hCtlDEADHEADTHOSE;
  static HANDLE hCtlDEADHEADMINS;
  static HANDLE hCtlTEXT_MINUTES;
  static HANDLE hCtlIDREMOVE;
  static HANDLE hCtlIDPREVIEW;
  static HANDLE hCtlIDOPTIMAL;
  static HANDLE hCtlIDMANUAL;
  static HANDLE hCtlSTANDARD;
  static HANDLE hCtlDROPBACK;
  static HANDLE hCtlDEADHEADSTOUSE;
  static int    tabPos[TABSET] = {32};
  GenerateTripDef      GTResults;
  GetConnectionTimeDef GCTData;
  PARMSDef PARMS;
  BLOCKSDef  *pTRIPSChunk;
  LAYOVERDef *pLayover;
  float  distance;
  short  int wmId;
  short  int wmEvent;
  BOOL   bFound;
  BOOL   bEnable;
  BOOL   bAbort;
  char   routeName[ROUTES_NAME_LENGTH + 1];
  char   routeNumber[ROUTES_NUMBER_LENGTH + 1];
  char   serviceName[SERVICES_NAME_LENGTH + 1];
  long   fromRouteRecordID;
  long   fromServiceRecordID;
  long   lastBlock;
  long   minutes;
  long   percent;
  long   tempLong;
  long   minVehicles;
  long   maxVehicles;
  long   commentRecordID;
  long   position;
  long   flags;
  long   dhd;
  WORD   DlgWidthUnits;
  int adjustedTabPos[TABSET];
  int nI;
  int nJ;
  int nK;
  int nRc;
  int rcode2;
  int numRoutes;
  int numTrips;
  int maxTrips;
  int numComments;
  int numSelected;
  int fromRoutePosition;
  int fromServicePosition;
  int blockingType;
  int layoverType;

  long *pTRIPSrecordIDs = NULL;
  int  *pSelected = NULL;

  switch(Message)
  {
//
//  WM_INITDIALOG - Initialize the dialog
//
    case WM_INITDIALOG:
      pDI = (PDISPLAYINFO)lParam;
      if(pDI == NULL)
      {
        SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)0);
        break;
      }
      m_numConnectionAlerts = 0;
//
//  Set up some control handles for later use
//
      hCtlALLROUTES = GetDlgItem(hWndDlg, ADDBLOCK_ALLROUTES);
      hCtlCC = GetDlgItem(hWndDlg, ADDBLOCK_CC);
      hCtlCOMMENTCODE = GetDlgItem(hWndDlg, ADDBLOCK_COMMENTCODE);
      hCtlORROUTE = GetDlgItem(hWndDlg, ADDBLOCK_ORROUTE);
      hCtlFROMROUTE = GetDlgItem(hWndDlg, ADDBLOCK_FROMROUTE);
      hCtlFROMSERVICE = GetDlgItem(hWndDlg, ADDBLOCK_FROMSERVICE);
      hCtlLISTBOXTITLE = GetDlgItem(hWndDlg, ADDBLOCK_LISTBOXTITLE);
      hCtlTRIPS = GetDlgItem(hWndDlg, ADDBLOCK_TRIPS);
      hCtlMIN = GetDlgItem(hWndDlg, ADDBLOCK_MIN);
      hCtlMINVEHICLES = GetDlgItem(hWndDlg, ADDBLOCK_MINVEHICLES);
      hCtlMAX = GetDlgItem(hWndDlg, ADDBLOCK_MAX);
      hCtlMAXVEHICLES = GetDlgItem(hWndDlg, ADDBLOCK_MAXVEHICLES);
      hCtlILYES = GetDlgItem(hWndDlg, ADDBLOCK_ILYES);
      hCtlILNO = GetDlgItem(hWndDlg, ADDBLOCK_ILNO);
      hCtlSWYES = GetDlgItem(hWndDlg, ADDBLOCK_SWYES);
      hCtlSWNO = GetDlgItem(hWndDlg, ADDBLOCK_SWNO);
      hCtlDHYES = GetDlgItem(hWndDlg, ADDBLOCK_DHYES);
      hCtlDHNO = GetDlgItem(hWndDlg, ADDBLOCK_DHNO);
      hCtlDEADHEADALL = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADALL);
      hCtlDEADHEADTHOSE = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADTHOSE);
      hCtlDEADHEADMINS = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADMINS);
      hCtlTEXT_MINUTES = GetDlgItem(hWndDlg, ADDBLOCK_TEXT_MINUTES);
      hCtlIDREMOVE = GetDlgItem(hWndDlg, IDREMOVE);
      hCtlIDPREVIEW = GetDlgItem(hWndDlg, IDPREVIEW);
      hCtlIDOPTIMAL = GetDlgItem(hWndDlg, IDOPTIMAL);
      hCtlIDMANUAL = GetDlgItem(hWndDlg, IDMANUAL);
      hCtlSTANDARD = GetDlgItem(hWndDlg, ADDBLOCK_STANDARD);
      hCtlDROPBACK = GetDlgItem(hWndDlg, ADDBLOCK_DROPBACK);
      hCtlDEADHEADSTOUSE = GetDlgItem(hWndDlg, ADDBLOCK_DEADHEADSTOUSE);
//
//  Set up the tab stops for ADDBLOCK_LISTBOXTITLE and ADDBLOCK_TRIPS
//
      DlgWidthUnits = LOWORD(GetDialogBaseUnits()) / 4;
      for(nJ = 0; nJ < TABSET; nJ++)
      {
        adjustedTabPos[nJ] = (DlgWidthUnits * tabPos[nJ] * 2);
      }
      SendMessage(hCtlLISTBOXTITLE, LB_SETTABSTOPS, (WPARAM)TABSET, (LPARAM)adjustedTabPos);
      LoadString(hInst, TEXT_019, tempString, TEMPSTRING_LENGTH);
      SendMessage(hCtlLISTBOXTITLE, LB_ADDSTRING, 0, (LONG)(LPSTR)tempString);
      SendMessage(hCtlTRIPS, LB_SETTABSTOPS, (WPARAM)TABSET, (LPARAM)adjustedTabPos);
//
//  Default to all routes and this service
//
      SendMessage(hCtlALLROUTES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
      if(SetUpServiceList(hWndDlg, ADDBLOCK_FROMSERVICE, pDI->fileInfo.serviceRecordID) == 0)
      {
        SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)0);
        break;
      }
//
//  Set up the route listbox
//
      numRoutes = 0;
      SendMessage(hCtlFROMROUTE, LB_RESETCONTENT, (WPARAM)(WPARAM)0, (LPARAM)0);
      rcode2 = btrieve(B_GETFIRST, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
      while(rcode2 == 0)
      {
        strncpy(tempString, ROUTES.number, ROUTES_NUMBER_LENGTH);
        trim(tempString, ROUTES_NUMBER_LENGTH);
        strncpy(szarString, ROUTES.name, ROUTES_NAME_LENGTH);
        trim(szarString, ROUTES_NAME_LENGTH);
        strcat(tempString, " - ");
        strcat(tempString, szarString);
        nI = (int)SendMessage(hCtlFROMROUTE, LB_ADDSTRING, (WPARAM)0, (LONG)(LPSTR)tempString);
        SendMessage(hCtlFROMROUTE, LB_SETITEMDATA, (WPARAM)nI, ROUTES.recordID);
        numRoutes++;
        rcode2 = btrieve(B_GETNEXT, TMS_ROUTES, &ROUTES, &ROUTESKey1, 1);
      }
      if(numRoutes == 0)
      {
        TMSError(hWndDlg, MB_ICONSTOP, ERROR_008, (HANDLE)NULL);
        SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL,0), (LPARAM)0);
        break;
      }
//
//  Comment codes combo box
//
     numComments = SetUpCommentList(hWndDlg, ADDBLOCK_COMMENTCODE);
      if(numComments == 0)
      {
        EnableWindow(hCtlCC, FALSE);
        EnableWindow(hCtlCOMMENTCODE, FALSE);
      }
//
//  Default to "Min" vechicle requirements, but with a blank field
//
      SendMessage(hCtlMIN, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
      SendMessage(hCtlMINVEHICLES, WM_SETTEXT, (WPARAM)0, (LONG)(LPSTR)"");
//
//  Default to allowing deadheading, service wraps, and interlining
//
      SendMessage(hCtlILYES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
      SendMessage(hCtlSWYES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
      SendMessage(hCtlDHYES, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
      SendMessage(hCtlDEADHEADALL, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
//
//  Clear out edit controls associated with a spin control
//
      SendMessage(hCtlDEADHEADMINS, WM_SETTEXT, (WPARAM)0, (LONG)(LPSTR)"");
//
//  Default to this table's blocking technique
//
      if(pDI->fileInfo.fileNumber == TMS_STANDARDBLOCKS)
      {
        SendMessage(hCtlSTANDARD, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
        EnableWindow(hCtlDROPBACK, FALSE);
      }
      else
      {
        SendMessage(hCtlDROPBACK, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
        EnableWindow(hCtlSTANDARD, FALSE);
      }
//
//  Set up the m_pPICKEDTRIPS structure
//
      if(m_pPICKEDTRIPS == NULL)
      {
        m_pPICKEDTRIPS = (PICKEDTRIPSDef *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PICKEDTRIPSDef) * m_maxPICKEDTRIPS); 
        if(m_pPICKEDTRIPS == NULL)
        {
          AllocationError(__FILE__, __LINE__, FALSE);
          goto OptimalBlockCleanup;
        }
      }
//
//  Set up the "destination"
//
      flags = PLACEMENT_ROUTE | PLACEMENT_SERVICE;
      DisplayPlacement(hWndDlg, ADDBLOCK_DESTINATION, pDI, flags);
      break;
//
//  WM_CLOSE
//
    case WM_CLOSE:
      SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)0);
      break;
//
//  WM_COMMAND
//
//  Note: The outbound and inbound direction buttons get
//         disabled when the route is set to "All routes"
//
    case WM_COMMAND:
      wmId = LOWORD(wParam);
      wmEvent = HIWORD(wParam);
      switch(wmId)
      {
//
//  ADDBLOCK_ALLROUTES radio button
//
        case ADDBLOCK_ALLROUTES:
          SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)(FALSE), (LPARAM)(-1));
          SendMessage(hCtlCOMMENTCODE, CB_SETCURSEL, (WPARAM)(-1), (LPARAM)0);
          break;
//
//  ADDBLOCK_CC radio button
//
        case ADDBLOCK_CC:
          SendMessage(hCtlCOMMENTCODE, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
          break;
//
//  ADDBLOCK_ORROUTE radio button
//
        case ADDBLOCK_ORROUTE:
          SendMessage(hCtlCOMMENTCODE, CB_SETCURSEL, (WPARAM)(-1), (LPARAM)0);
          nI = (int)SendMessage(hCtlFROMROUTE, LB_GETCURSEL, (WPARAM)0, (LPARAM)0);
          if(nI == CB_ERR)
          {
            nJ = (int)SendMessage(hCtlFROMROUTE, LB_GETCOUNT, (WPARAM)0, (LPARAM)0);
            if(nJ == 0)
              break;
            for(nI = 0; nI < nJ; nI++)
            {
              tempLong = SendMessage(hCtlFROMROUTE, LB_GETITEMDATA, (WPARAM)nI, (LPARAM)0);
              if(tempLong == pDI->fileInfo.routeRecordID)
              {
                SendMessage(hCtlFROMROUTE, LB_SETCURSEL, (WPARAM)nI, (LPARAM)0);
                break;
              }
            }
          }
//
//  ADDBLOCK_FROMROUTE listbox
//
        case ADDBLOCK_FROMROUTE:
          switch(wmEvent)
          {
            case LBN_SELCHANGE:
              if(SendMessage(hCtlALLROUTES, BM_GETCHECK, (WPARAM)0, (LPARAM)0))
              {
                SendMessage(hCtlALLROUTES, BM_SETCHECK, (WPARAM)FALSE, (LPARAM)0);
                SendMessage(hCtlORROUTE, BM_SETCHECK, (WPARAM)TRUE, (LPARAM)0);
              }
              break;
          }
          break;
//
//  ADDBLOCK_LISTBOXTITLE
//
        case ADDBLOCK_LISTBOXTITLE:  // Title string
          SendMessage(hCtlLISTBOXTITLE, LB_SETSEL, (WPARAM)FALSE, (LPARAM)(-1));
          break;
//
//  ADDBLOCK_TRIPS
//
        case ADDBLOCK_TRIPS: // List box
          switch(wmEvent)
          {
            case LBN_SELCHANGE:
            case LBN_SELCANCEL:
              bEnable = SendMessage(hCtlTRIPS, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0) > 0;
              EnableWindow(hCtlIDREMOVE, bEnable);
              EnableWindow(hCtlIDPREVIEW, bEnable);
              break;
 
            case LBN_DBLCLK:
              SendMessage(hWndDlg, WM_COMMAND, MAKEWPARAM(IDPREVIEW, 0), (LPARAM)0);
              EnableWindow(hCtlIDPREVIEW, TRUE);
              break;
          }
          break;
//
//  ADDBLOCK_MIN
//
        case ADDBLOCK_MIN:
          EnableWindow(hCtlMINVEHICLES, TRUE);
          EnableWindow(hCtlMAXVEHICLES, FALSE);
          break;
//
//  ADDBLOCK_MAX
//
        case ADDBLOCK_MAX:
          EnableWindow(hCtlMINVEHICLES, FALSE);
          EnableWindow(hCtlMAXVEHICLES, TRUE);
          break;
//
//  ADDBLOCK_DHYES / ADDBLOCK_DHNO
//
        case ADDBLOCK_DHYES:
        case ADDBLOCK_DHNO:
          bEnable = SendMessage(hCtlDHYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
          EnableWindow(hCtlDEADHEADALL, bEnable);
          EnableWindow(hCtlDEADHEADSTOUSE, bEnable);
          EnableWindow(hCtlDEADHEADTHOSE, bEnable);
          EnableWindow(hCtlDEADHEADMINS, bEnable);
          EnableWindow(hCtlTEXT_MINUTES, bEnable);
          break;
//
//  IDPREVIEW
//
        case IDPREVIEW: // Button text: "Preview"
          nI = SendMessage(hCtlTRIPS, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0);
          if(nI == 0 || nI == LB_ERR)
          {
            break;
          }
          pSelected = (int *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * nI); 
          if(pSelected == NULL)
          {
            AllocationError(__FILE__, __LINE__, FALSE);
            break;
          }
          numSelected = (int)SendMessage(hCtlTRIPS, LB_GETSELITEMS, (WPARAM)nI, (LPARAM)pSelected);
          if(numSelected >= m_maxPICKEDTRIPS)
          {
            m_maxPICKEDTRIPS += (numSelected + 1);
            m_pPICKEDTRIPS = (PICKEDTRIPSDef *)HeapReAlloc(GetProcessHeap(),
                  HEAP_ZERO_MEMORY, m_pPICKEDTRIPS, sizeof(PICKEDTRIPSDef) * m_maxPICKEDTRIPS); 
            if(m_pPICKEDTRIPS == NULL)
            {
              AllocationError(__FILE__, __LINE__, TRUE);
              break;
            }
          }
          for(nI = 0; nI < numSelected; nI++)
          {
            position = SendMessage(hCtlTRIPS, LB_GETITEMDATA, (WPARAM)pSelected[nI], (LPARAM)0);
            fromRoutePosition = LOWORD(position);
            fromServicePosition = HIWORD(position);
            m_pPICKEDTRIPS[nI].ROUTESrecordID = SendMessage(hCtlFROMROUTE,
                  LB_GETITEMDATA, (WPARAM)fromRoutePosition, (LPARAM)0);
            m_pPICKEDTRIPS[nI].SERVICESrecordID = SendMessage(hCtlFROMSERVICE,
                  CB_GETITEMDATA, (WPARAM)fromServicePosition, (LPARAM)0);
          }
          DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_PREVIEWT),
                hWndDlg, (DLGPROC)PREVIEWTMsgProc, (LPARAM)numSelected);
          TMSHeapFree(pSelected);
          break;
//
//  IDADD
//
        case IDADD: // Button text: "&Add Trip(s)"
//
//  Get the service
//
          fromServicePosition =
                (int)SendMessage(hCtlFROMSERVICE, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);
          if(fromServicePosition == CB_ERR)
          {
            break;
          }
          fromServiceRecordID =
                SendMessage(hCtlFROMSERVICE, CB_GETITEMDATA, (WPARAM)fromServicePosition, (LPARAM)0);
          SERVICESKey0.recordID = fromServiceRecordID;
          btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
          strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH);
          trim(serviceName, SERVICES_NAME_LENGTH);
//
//  Get the route(s)
//
//  All
//
          if(SendMessage(hCtlALLROUTES, BM_GETCHECK, (WPARAM)0, (LPARAM)0))
          {
            SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)(TRUE), (LPARAM)(-1));
          }
//
//  Those labelled...
//
          else if(SendMessage(hCtlCC, BM_GETCHECK, (WPARAM)0, (LPARAM)0))
          {
             nK = (int)SendMessage(hCtlCOMMENTCODE, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);
             commentRecordID = (nK == CB_ERR ? NO_RECORD : 
                   SendMessage(hCtlCOMMENTCODE, CB_GETITEMDATA, (WPARAM)nK, (LPARAM)0));
            if(commentRecordID == NO_RECORD)
            {
              break;
            }
            nJ = (int)SendMessage(hCtlFROMROUTE, LB_GETCOUNT, (WPARAM)0, (LPARAM)0);
            for(nI = 0; nI < nJ; nI++)
            {
              ROUTESKey0.recordID = SendMessage(hCtlFROMROUTE, LB_GETITEMDATA, (WPARAM)nI, (LPARAM)0);
              rcode2 = btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
              if(ROUTES.COMMENTSrecordID == commentRecordID)
              {
                SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)TRUE, (LPARAM)nI);
              }
            }
          }  
//
//  Got the selections - continue
//
          nI = (int)SendMessage(hCtlFROMROUTE, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0);
          if(nI == 0 || nI == LB_ERR)
          {
            break;
          }
          pSelected = (int *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * nI); 
          if(pSelected == NULL)
          {
            AllocationError(__FILE__, __LINE__, FALSE);
            break;
          }
          numSelected = (int)SendMessage(hCtlFROMROUTE, LB_GETSELITEMS, (WPARAM)nI, (LPARAM)pSelected);
//
//  Add the results to the "to be blocked" list box
//  
          for(nI = 0; nI < numSelected; nI++)
          {
            fromRoutePosition = pSelected[nI];
            fromRouteRecordID = SendMessage(hCtlFROMROUTE, LB_GETITEMDATA, (WPARAM)fromRoutePosition, (LPARAM)0);
//
//  Before we go any further, let's see if we've got this one already
//
            position = MAKELONG(fromRoutePosition, fromServicePosition);
            nJ = SendMessage(hCtlTRIPS, LB_GETCOUNT, (WPARAM)0, (LPARAM)0);
            for(bFound = FALSE, nK = 0; nK < nJ; nK++)
            {
              tempLong = SendMessage(hCtlTRIPS, LB_GETITEMDATA, (WPARAM)nK, (LPARAM)0);
              if(tempLong == position)
              {
                bFound = TRUE;
                break;
              }
            }
            if(bFound)
            {
              continue;
            }
//
//  Not found
//
            EnableWindow(hCtlIDOPTIMAL, TRUE);
            EnableWindow(hCtlIDMANUAL, TRUE);
//
//  Display it
//
            ROUTESKey0.recordID = fromRouteRecordID;
            btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
            strncpy(routeNumber, ROUTES.number, ROUTES_NUMBER_LENGTH);
            trim(routeNumber, ROUTES_NUMBER_LENGTH);
            strncpy(routeName, ROUTES.name, ROUTES_NAME_LENGTH);
            trim(routeName, ROUTES_NAME_LENGTH);
            strcpy(tempString, routeNumber);
            strcat(tempString, " - ");
            strcat(tempString, routeName);
            tempString[tabPos[0]] = '\0';
            strcat(tempString, "\t");
            strcat(tempString, serviceName);
            nK = (int)SendMessage(hCtlTRIPS, LB_ADDSTRING, (WPARAM)0, (LONG)(LPSTR)tempString);
            SendMessage(hCtlTRIPS, LB_SETITEMDATA, (WPARAM)nK, (LPARAM)position);
          }
          SendMessage(hCtlFROMROUTE, LB_SETSEL, (WPARAM)FALSE, (LPARAM)(-1));
          TMSHeapFree(pSelected);
          break;
//
//  IDREMOVE
//
        case IDREMOVE: // Button text: "Remove"
          nI = (int)SendMessage(hCtlTRIPS, LB_GETSELCOUNT, (WPARAM)0, (LPARAM)0);
          if(nI == 0 || nI == LB_ERR)
          {
            break;
          }
          pSelected = (int *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int) * nI); 
          if(pSelected == NULL)
          {
            AllocationError(__FILE__, __LINE__, FALSE);
            break;
          }
          numSelected = (int)SendMessage(hCtlTRIPS, LB_GETSELITEMS, (WPARAM)nI, (LPARAM)pSelected);
//
//  Process the list from the back to the front
//
          for(nI = numSelected - 1; nI >= 0; nI--)
          {
            SendMessage(hCtlTRIPS, LB_DELETESTRING, (WPARAM)pSelected[nI], (LPARAM)0);
          }
          if(SendMessage(hCtlTRIPS, LB_GETCOUNT, (WPARAM)0, (LPARAM)0) == 0)
          {
            EnableWindow(hCtlIDOPTIMAL, FALSE);
            EnableWindow(hCtlIDMANUAL, FALSE);
          }
          EnableWindow(hCtlIDREMOVE, FALSE);
          EnableWindow(hCtlIDPREVIEW, FALSE);
          TMSHeapFree(pSelected);
          break;
//
//  IDCANCEL
//
        case IDCANCEL:
          EndDialog(hWndDlg, FALSE);
          break;
//
//  IDHELP
//
        case IDHELP:
          WinHelp(hWndDlg, szarHelpFile, HELP_CONTEXT, The_Standard_Blocks_Table);
          break;
//
//  IDMANUAL and IDOPTIMAL
//
        case IDMANUAL:
        case IDOPTIMAL:
          m_bNetworkMode = FALSE;
//
//  Get the parameters
//
          PARMS.bStandard = SendMessage(hCtlSTANDARD, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
          PARMS.bDropback = SendMessage(hCtlDROPBACK, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
//
//  Standard and Dropback are mutually exclusive on a manual block
//
          if(wmId == IDMANUAL)
          {
            if(PARMS.bStandard && PARMS.bDropback)
            {
              TMSError(hWndDlg, MB_ICONSTOP, ERROR_134, hCtlSTANDARD);
              break;
            }
          }
//
//  At least one of Standard or Dropback must be chosen prior to pressing Optimal
//
          else
          {
            if(!PARMS.bStandard && !PARMS.bDropback)
            {
              TMSError(hWndDlg, MB_ICONSTOP, ERROR_135, hCtlSTANDARD);
              break;
            }
          }
//
//  Get the rest of the parameters
//
          PARMS.bInterlining = SendMessage(hCtlILYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
          PARMS.bServiceWrap = SendMessage(hCtlSWYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
          PARMS.bDeadheading = SendMessage(hCtlDHYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
          if(!PARMS.bDeadheading)
          {
            PARMS.bDeadheadAll = FALSE;
            PARMS.maxDeadheadTime = NO_TIME;
          }
          else
          {
            SendMessage(hCtlDEADHEADMINS, WM_GETTEXT,
                  (WPARAM)TEMPSTRING_LENGTH, (LONG)(LPSTR)tempString);
            if(strcmp(tempString, "") == 0)
            {
              PARMS.bDeadheadAll = TRUE;
              PARMS.maxDeadheadTime = NO_TIME;
            }
            else
            {
              PARMS.bDeadheadAll = FALSE;
              PARMS.maxDeadheadTime = atol(tempString) * 60;
            }
          }
//
//  Build the list of selected trips
//
          m_numPICKEDTRIPS = SendMessage(hCtlTRIPS, LB_GETCOUNT, (WPARAM)0, (LPARAM)0);
          if(m_numPICKEDTRIPS >= m_maxPICKEDTRIPS)
          {
            m_maxPICKEDTRIPS += (m_numPICKEDTRIPS + 1);
            m_pPICKEDTRIPS = (PICKEDTRIPSDef *)HeapReAlloc(GetProcessHeap(),
                  HEAP_ZERO_MEMORY, m_pPICKEDTRIPS, sizeof(PICKEDTRIPSDef) * m_maxPICKEDTRIPS); 
            if(m_pPICKEDTRIPS == NULL)
            {
              AllocationError(__FILE__, __LINE__, TRUE);
              break;
            }
          }
          for(nI = 0; nI < m_numPICKEDTRIPS; nI++)
          {
            position = SendMessage(hCtlTRIPS, LB_GETITEMDATA, (WPARAM)nI, (LPARAM)0);
            fromRoutePosition = LOWORD(position);
            fromServicePosition = HIWORD(position);
            m_pPICKEDTRIPS[nI].ROUTESrecordID = SendMessage(hCtlFROMROUTE,
                  LB_GETITEMDATA, (WPARAM)fromRoutePosition, (LPARAM)0);
            m_pPICKEDTRIPS[nI].SERVICESrecordID = SendMessage(hCtlFROMSERVICE,
                  CB_GETITEMDATA, (WPARAM)fromServicePosition, (LPARAM)0);
          }
//
//  Dropback blocking isn't permitted unless it's been "standard" blocked already
//
          if(PARMS.bDropback)
          {
            bAbort = FALSE;
            for(nI = 0; nI < m_numPICKEDTRIPS; nI++)
            {
              if(bAbort)
                break;
              for(nJ = 0; nJ < 2; nJ++)
              {
                if(bAbort)
                  break;
                ROUTESKey0.recordID = m_pPICKEDTRIPS[nI].ROUTESrecordID;
                btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0);
                if(ROUTES.DIRECTIONSrecordID[nJ] == NO_RECORD)
                  continue;
                TRIPSKey1.ROUTESrecordID = m_pPICKEDTRIPS[nI].ROUTESrecordID;
                TRIPSKey1.SERVICESrecordID = m_pPICKEDTRIPS[nI].SERVICESrecordID;
                TRIPSKey1.directionIndex = nJ;
                TRIPSKey1.tripSequence = NO_TIME;
                rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
                while(rcode2 == 0 &&
                      TRIPS.ROUTESrecordID == m_pPICKEDTRIPS[nI].ROUTESrecordID &&
                      TRIPS.SERVICESrecordID == m_pPICKEDTRIPS[nI].SERVICESrecordID &&
                      TRIPS.directionIndex == nJ)
                {
                  if(TRIPS.standard.blockNumber == 0)
                  {
                    LoadString(hInst, TEXT_245, szFormatString, sizeof(szFormatString));
                    strncpy(routeNumber, ROUTES.number, ROUTES_NUMBER_LENGTH);
                    trim(routeNumber, ROUTES_NUMBER_LENGTH);
                    strncpy(routeName, ROUTES.name, ROUTES_NAME_LENGTH);
                    trim(routeName, ROUTES_NAME_LENGTH);
                    SERVICESKey0.recordID = m_pPICKEDTRIPS[nI].SERVICESrecordID;
                    btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
                    strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH);
                    trim(serviceName, SERVICES_NAME_LENGTH);
                    sprintf(tempString, szFormatString, serviceName, routeNumber, routeName);
                    MessageBeep(MB_ICONSTOP);
                    MessageBox(hWndDlg, tempString, TMS, MB_OK);
                    bAbort = TRUE;
                    break;
                  }
                  rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
                }
              }
            }
            if(bAbort)
              break;
          }
//  
//  IDMANUAL - Go into MANBLOCK
//
          if(wmId == IDMANUAL)
          {
            pDI->otherData = (long)(&PARMS);
            nRc = BlockDialog(pDI);
            if(nRc)
            {
              EndDialog(hWndDlg, TRUE);
            }
            break;
          }
//
//  IDOPTIMAL
//
          for(blockingType = 0; blockingType < 2; blockingType++)
          {
            if(blockingType == 0)
            {
              if(!PARMS.bStandard)
              {
                continue;
              }
              StatusBarStart(hWndDlg, "Optimal Standard Blocking Status");
              pTRIPSChunk = &TRIPS.standard;
              pLayover = &StandardLayover;
              layoverType = TMS_STANDARDBLOCKS;
            }
            else
            {
              if(!PARMS.bDropback)
              {
                continue;
              }
              StatusBarStart(hWndDlg, "Optimal Dropback Blocking Status");
              pTRIPSChunk = &TRIPS.dropback;
              pLayover = &DropbackLayover;
              layoverType = TMS_DROPBACKBLOCKS;
            }
            StatusBar(-1L, -1L);
            StatusBarText("Initializing...");
//
//  Initialize the interlining option
//
            BLSetOptions(SendMessage(hCtlILYES, BM_GETCHECK, (WPARAM)0, (LPARAM)0));
//
//  Loop through numPICKEDTRIPS to determine what we're dealing with
//
            StatusBarText("Examining selected trips...");
            m_numConnectionAlerts = 0;
            maxTrips = 512;
            pTRIPSrecordIDs = (long *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(long) * maxTrips); 
            if(pTRIPSrecordIDs == NULL)
            {
              AllocationError(__FILE__, __LINE__, FALSE);
              goto OptimalBlockCleanup;
            }
            for(numTrips = 0, nI = 0; nI < m_numPICKEDTRIPS; nI++)
            {
              StatusBar((long)nI, (long)m_numPICKEDTRIPS);
              if(StatusBarAbort())
              {
                goto OptimalBlockCleanup;
              }
              m_bEstablishRUNTIMES = TRUE;
              TRIPSKey1.ROUTESrecordID = m_pPICKEDTRIPS[nI].ROUTESrecordID;
              TRIPSKey1.SERVICESrecordID = m_pPICKEDTRIPS[nI].SERVICESrecordID;
              TRIPSKey1.directionIndex = NO_RECORD;
              TRIPSKey1.tripSequence = NO_RECORD;
              rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
              while(rcode2 == 0 &&
                    (m_pPICKEDTRIPS[nI].ROUTESrecordID == NO_RECORD ||
                          TRIPS.ROUTESrecordID == m_pPICKEDTRIPS[nI].ROUTESrecordID) &&
                    (m_pPICKEDTRIPS[nI].SERVICESrecordID == NO_RECORD ||
                          TRIPS.SERVICESrecordID == m_pPICKEDTRIPS[nI].SERVICESrecordID))
              {
                if(pTRIPSChunk->blockNumber == 0)
                {
                  if(numTrips >= maxTrips)
                  {
                    maxTrips += 512;
                    pTRIPSrecordIDs = (long *)HeapReAlloc(GetProcessHeap(),
                          HEAP_ZERO_MEMORY, pTRIPSrecordIDs, sizeof(long) * maxTrips); 
                    if(pTRIPSrecordIDs == NULL)
                    {
                      AllocationError(__FILE__, __LINE__, TRUE);
                      goto OptimalBlockCleanup;
                    }
                  }
                  pTRIPSrecordIDs[numTrips++] = TRIPS.recordID;
                }
                rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
              }
            }
            if((m_numTripsForBlocker = numTrips) == 0)
            {
              TMSError(hWndDlg, MB_ICONSTOP, ERROR_102, (HANDLE)NULL);
              goto OptimalBlockCleanup;
            }
//
//  If m_numConnectionAlerts is non-zero, blow him off
//
            if(m_numConnectionAlerts != 0)
            {
              TMSError(hWndDlg, MB_ICONSTOP, ERROR_173, (HANDLE)NULL);
              goto OptimalBlockCleanup;
            }
//
//  Make sure that we're not going in with bad values for min & max layover
//
            if(pLayover->minimum.type == NO_RECORD ||
                  pLayover->maximum.type == NO_RECORD ||
                  (pLayover->maximum.type == 0 && pLayover->maximum.minutes == 0))
            {
              MessageBeep(MB_ICONSTOP);
              LoadString(hInst, ERROR_030, szarString, sizeof(szarString));
              MessageBox(hWndDlg, szarString, TMS, MB_ICONSTOP);
              nRc = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_LAYOVER),
                    hWndDlg, (DLGPROC)LAYOVERMsgProc, (LPARAM)layoverType);
              if(!nRc)
                goto OptimalBlockCleanup;
            }
//
//  Generate trip data into TRIPINFO
//
            StatusBarText("Building trip data...");
            StatusBar(0L, 0L);
            BLInitNetwork();
            for(nI = 0; nI < numTrips; nI++)
            {
              StatusBar((long)nI, (long)numTrips);
              if(StatusBarAbort())
                goto OptimalBlockCleanup;
              TRIPSKey0.recordID = pTRIPSrecordIDs[nI];
              btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
              nJ = GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                    TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                    TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
//
//  If we've got a one-node trip, fool the blocker
//
              if(GTResults.firstNODESrecordID == GTResults.lastNODESrecordID &&
                    GTResults.firstNodeTime == GTResults.lastNodeTime)
              {
                GTResults.lastNodeTime++;
              }
              if(nJ != 0)
              {
                TRIPINFODef TRIPINFOrec;
                TRIPINFOrec.TRIPSrecordID = TRIPS.recordID;
                TRIPINFOrec.BUSTYPESrecordID = TRIPS.BUSTYPESrecordID;
                TRIPINFOrec.ROUTESrecordID = TRIPS.ROUTESrecordID;
//
//  If we're doing a dropback, and the standard block pulls out or in,
//  then replace the start/end node/time with the pullout/in gar/time.
//
//  Check pullouts
//
                if(PARMS.bStandard || TRIPS.standard.POGNODESrecordID == NO_RECORD)
                {
                  TRIPINFOrec.startNODESrecordID = GTResults.firstNODESrecordID;
                  TRIPINFOrec.startTime = GTResults.firstNodeTime;
                }
                else
                {
                  GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                  GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                  GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID;
                  GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID;
                  GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID;
                  GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID;
                  GCTData.fromNODESrecordID = TRIPS.standard.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;
                  TRIPINFOrec.startNODESrecordID = TRIPS.standard.POGNODESrecordID;
                  TRIPINFOrec.startTime = GTResults.firstNodeTime - dhd;
                }
//
//  Check pullins
//
                if(PARMS.bStandard || TRIPS.standard.PIGNODESrecordID == NO_RECORD)
                {
                  TRIPINFOrec.endNODESrecordID = GTResults.lastNODESrecordID;
                  TRIPINFOrec.endTime = GTResults.lastNodeTime;
                }
                else
                {
                  GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                  GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                  GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID;
                  GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID;
                  GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID;
                  GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID;
                  GCTData.fromNODESrecordID = GTResults.lastNODESrecordID;
                  GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID;
                  GCTData.timeOfDay = GTResults.lastNodeTime;
                  dhd = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
                  distance = (float)fabs((double)distance);
                  if(dhd == NO_TIME)
                    dhd = 0;
                  TRIPINFOrec.endNODESrecordID = TRIPS.standard.PIGNODESrecordID;
                  TRIPINFOrec.endTime = GTResults.lastNodeTime + dhd;
                }
//
//  Figure out the minimum layover
//
                if(pTRIPSChunk->layoverMin != NO_TIME)
                  TRIPINFOrec.layoverMin = pTRIPSChunk->layoverMin;
                else
                {
                  minutes = pLayover->minimum.minutes  * 60;
                  percent = (GTResults.lastNodeTime - GTResults.firstNodeTime) * pLayover->minimum.percent / 100;
                  if(pLayover->minimum.type == 0)
                    TRIPINFOrec.layoverMin = minutes;
                  else if(pLayover->minimum.type == 1)
                    TRIPINFOrec.layoverMin = percent;
                  else if(pLayover->minimum.type == 2)
                    TRIPINFOrec.layoverMin =
                          pLayover->minimum.lower ? min(minutes, percent) : max(minutes, percent);
                }
//
//  Figure out the maximum layover
//
                if(pTRIPSChunk->layoverMax != NO_TIME)
                  TRIPINFOrec.layoverMax = pTRIPSChunk->layoverMax;
                else
                {
                  minutes = pLayover->maximum.minutes * 60;
                  percent = (GTResults.lastNodeTime - GTResults.firstNodeTime) * pLayover->maximum.percent / 100;
                  if(pLayover->maximum.type == 0)
                    TRIPINFOrec.layoverMax = minutes;
                  else if(pLayover->maximum.type == 1)
                    TRIPINFOrec.layoverMax = percent;
                  else if(pLayover->maximum.type == 2)
                    TRIPINFOrec.layoverMax =
                          pLayover->maximum.lower ? min(minutes, percent) : max(minutes, percent);
                }
//
//  And generate the trip arc
//
                BLGenerateTripArc( &TRIPINFOrec );
              }
            }
//
//  If m_numConnectionAlerts is non-zero, blow him off
//
            if(m_numConnectionAlerts != 0)
            {
              TMSError(hWndDlg, MB_ICONSTOP, ERROR_173, (HANDLE)NULL);
              goto OptimalBlockCleanup;
            }
//
//  Generate the wait arcs between the trips
//
            StatusBarText("Generating wait arcs...");
            StatusBar(-1L, -1L);
            BLGenerateWaitArcs(FALSE);
//
//  Generate deadhead and equivalence data into DEADHEADINFO
//
            rcode2 = btrieve(B_GETFIRST, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0);
            numDeadheadsForBlocker = 0;
            while(rcode2 == 0)
            {
              if(StatusBarAbort())
                goto OptimalBlockCleanup;
              if(PARMS.bDeadheading)
              {
                if((CONNECTIONS.flags & CONNECTIONS_FLAG_DEADHEADTIME) &&
                      (PARMS.bDeadheadAll || CONNECTIONS.connectionTime <= PARMS.maxDeadheadTime))
                {
                  DEADHEADINFODef DEADHEADINFOrec;
                  DEADHEADINFOrec.fromTimeOfDay = CONNECTIONS.fromTimeOfDay;
                  DEADHEADINFOrec.toTimeOfDay = CONNECTIONS.toTimeOfDay;
                  DEADHEADINFOrec.fromNODESrecordID = CONNECTIONS.fromNODESrecordID;
                  DEADHEADINFOrec.toNODESrecordID = CONNECTIONS.toNODESrecordID;
                  DEADHEADINFOrec.flags = CONNECTIONS.flags;
                  DEADHEADINFOrec.deadheadTime = CONNECTIONS.connectionTime;
                  BLGenerateDeadheadArcs( &DEADHEADINFOrec );
                  numDeadheadsForBlocker++;
                }
              }
              if(CONNECTIONS.flags & CONNECTIONS_FLAG_EQUIVALENT)
              {
                DEADHEADINFODef DEADHEADINFOrec;
                DEADHEADINFOrec.fromTimeOfDay = CONNECTIONS.fromTimeOfDay;
                DEADHEADINFOrec.toTimeOfDay = CONNECTIONS.toTimeOfDay;
                DEADHEADINFOrec.fromNODESrecordID = CONNECTIONS.fromNODESrecordID;
                DEADHEADINFOrec.toNODESrecordID = CONNECTIONS.toNODESrecordID;
                DEADHEADINFOrec.flags = CONNECTIONS.flags;
                DEADHEADINFOrec.deadheadTime = 0;
                BLGenerateDeadheadArcs( &DEADHEADINFOrec );
                numDeadheadsForBlocker++;
              }
              rcode2 = btrieve(B_GETNEXT, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0);
            }
            if(StatusBarAbort())
              goto OptimalBlockCleanup;
//
//  Get the minimum and maximum number of vehicles parameters.
//  This only applies to Optimal, so it's done here rather than above.
//
            if(SendMessage(hCtlMIN, BM_GETCHECK, (WPARAM)0, (LPARAM)0))
            {
              maxVehicles = NO_TIME;
              SendMessage(hCtlMINVEHICLES, WM_GETTEXT,
                    (WPARAM)TEMPSTRING_LENGTH, (LONG)(LPSTR)tempString);
              if(strcmp(tempString, "") == 0)
                minVehicles = NO_TIME;
              else
                minVehicles = atol(tempString);
            }
            else
            {
              minVehicles = NO_TIME;
              SendMessage(hCtlMAXVEHICLES, WM_GETTEXT,
                    (WPARAM)TEMPSTRING_LENGTH, (LONG)(LPSTR)tempString);
              if(strcmp(tempString, "") == 0)
                maxVehicles = NO_TIME;
              else
                maxVehicles = atol(tempString);
            }
//
//  Call the blocker
//
            m_pBLOCKSDATA = (BLOCKSDATADef *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BLOCKSDATADef) * m_numTripsForBlocker); 
            if(m_pBLOCKSDATA == NULL)
            {
              AllocationError(__FILE__, __LINE__, FALSE);
              goto OptimalBlockCleanup;
            }
            StatusBarText("Optimal blocking in progress...");
            sblock(minVehicles, maxVehicles);
            if(StatusBarAbort())
            {
              goto OptimalBlockCleanup;
            }
//
//  Update the file with the results
//
            lastBlock = GetNewBlockNumber(pDI);
            StatusBarText("Blocking complete - writing results...");
            StatusBarEnableCancel(FALSE);
            for(nJ = 0; nJ < numTrips; nJ++)
            {
              StatusBar((long)nJ, (long)numTrips);
              TRIPSKey0.recordID = m_pBLOCKSDATA[nJ].TRIPSrecordID;
              if((rcode2 = btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0)) != 0)
              {
                MessageBeep(MB_ICONSTOP);
                LoadString(hInst, ERROR_015, szarString, sizeof(szarString));
                SetFocus(hCtlFROMROUTE);
                MessageBox(hWndDlg, szarString, TMS, MB_ICONSTOP);
                goto OptimalBlockCleanup;
              }
              GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                    TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                    TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
              pTRIPSChunk->blockNumber = m_pBLOCKSDATA[nJ].blockNumber + lastBlock;
              pTRIPSChunk->RGRPROUTESrecordID = pDI->fileInfo.routeRecordID;
              pTRIPSChunk->SGRPSERVICESrecordID = pDI->fileInfo.serviceRecordID;
              pTRIPSChunk->blockSequence = GTResults.firstNodeTime;
              btrieve(B_UPDATE, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0);
            }

            OptimalBlockCleanup:
              BLCleanup();
              TMSHeapFree(m_pBLOCKSDATA);
              TMSHeapFree(pTRIPSrecordIDs);
              m_numTripsForBlocker = 0;
              StatusBarEnd();
          }  // blockingType

          EndDialog(hWndDlg, TRUE);
          break;
       }
     break;    //  End of WM_COMMAND

    default:
      return FALSE;
  }

  return TRUE;
} //  End of ADDBLOCKMsgProc
コード例 #7
0
ファイル: GetDynamicTravelTime.c プロジェクト: ems/TMS
void InitTravelMatrix(long SERVICESrecordID, BOOL bDisplayStatus)
{
  typedef struct PATHStruct
  {
    long NODESrecordID;
    long ROUTESrecordID;
    long directionIndex;
    long PATTERNNAMESrecordID;
    long nodeSequence;
  } PATHDef;
  typedef struct COMBINEDStruct
  {
    long fromNODESrecordID;
    long toNODESrecordID;
    long ROUTESrecordID;
    long directionIndex;
    long PATTERNNAMESrecordID;
    int  fromNodePos;
    int  toNodePos;
  } COMBINEDDef;
  typedef struct BESTStruct
  {
    long fromNODESrecordID;
    long toNODESrecordID;
    long TRIPSrecordID;
    long cushionTime;
    long dwellTime;
    long tripTime[2];
  } BESTDef;
  PATHDef from[UPPERLIMIT];
  PATHDef to[UPPERLIMIT];
  COMBINEDDef fromTo[UPPERLIMIT];
  GenerateTripDef      GTResults;
  GetConnectionTimeDef GCTData;
  float distance;
  long fromEquiv[UPPERLIMIT];
  long toEquiv[UPPERLIMIT];
  long NODESrecordID;
  long nodeList[50];
  long fromNODESrecordID;
  long toNODESrecordID;
  long deadheadTime;
  BOOL bFound;
  int  rcode2;
  int  numNodes;
  int  nI;
  int  nJ;
  int  nK;
  int  nL;
  int  nM;
  int  pos;
  int  numFromEquiv;
  int  numToEquiv;
  int  numFromTo;
  int  numFrom;
  int  numTo;
  int  serviceIndex;

//
//  Set up the service index
//
  SERVICESKey0.recordID = SERVICESrecordID;
  btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0);
  serviceIndex = SERVICES.number - 1;
  if(serviceIndex < 0 || serviceIndex > NODES_RELIEFLABELS_LENGTH - 1)
  {
    serviceIndex = 0;
  }
  strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH);
  trim(szarString, SERVICES_NAME_LENGTH);
//
//  Show the status bar
//
  if(bDisplayStatus)
  {
    sprintf(tempString, "Status for service %s", szarString);
    StatusBarStart(NULL, tempString);
    LoadString(hInst, TEXT_135, tempString, TEMPSTRING_LENGTH);
    StatusBarText(tempString);
  }
//
//  Set up the node equivalences
//
  rcode2 = btrieve(B_GETFIRST, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0);
  numNodeEquiv = 0;
  while(rcode2 == 0 && numNodeEquiv < MAXNODEEQUIV)
  {
    if(CONNECTIONS.flags & CONNECTIONS_FLAG_EQUIVALENT)
    {
      NODEEQUIV[numNodeEquiv].fromNODESrecordID = CONNECTIONS.fromNODESrecordID;
      NODEEQUIV[numNodeEquiv].toNODESrecordID = CONNECTIONS.toNODESrecordID;
      numNodeEquiv++;
    }
    rcode2 = btrieve(B_GETNEXT, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey0, 0);
  }
//
//  Set up, along with all garages, all relief points
//
  rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0);
  numNodes = 0;
  while(rcode2 == 0)
  {
    if(NODES.flags & NODES_FLAG_GARAGE ||
          (NODES.reliefLabels[serviceIndex] != ' ' && NODES.reliefLabels[serviceIndex] != '-'))
    {
      nodeList[numNodes] = NODES.recordID;
      numNodes++;
    }
    rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0);
  }
//
//  Free any previous incarnation of the travel matrix
//
  for(nI = 0; nI < numInTM[serviceIndex]; nI++)
  {
    TMSHeapFree(TRAVELMATRIX[serviceIndex][nI].pTrips);
  }
//
//  Build the matrix
//
  numInTM[serviceIndex] = 0;
  for(nI = 0; nI < numNodes - 1; nI++)
  {
    if(bDisplayStatus)
    {
      StatusBar((long)nI, (long)numNodes);
    }
    for(nJ = 1; nJ < numNodes; nJ++)
    {
      for(nK = 0; nK < 2; nK++)
      {
        fromNODESrecordID = nK == 0 ? nodeList[nI] : nodeList[nJ];
        toNODESrecordID = nK == 0 ? nodeList[nJ] : nodeList[nI];
//
//  Get the node equivalences from the NODEEQUIV structure
//
        numFromEquiv = 0;
        numToEquiv = 0;
        for(nL = 0; nL < numNodeEquiv; nL++)
        {
          if(NODEEQUIV[nL].fromNODESrecordID == fromNODESrecordID)
          {
            fromEquiv[numFromEquiv++] = NODEEQUIV[nL].toNODESrecordID;
          }
          else if(NODEEQUIV[nL].toNODESrecordID == fromNODESrecordID)
          {
            fromEquiv[numFromEquiv++] = NODEEQUIV[nL].fromNODESrecordID;
          }
          else if(NODEEQUIV[nL].fromNODESrecordID == toNODESrecordID)
          {
            toEquiv[numToEquiv++] = NODEEQUIV[nL].toNODESrecordID;
          }
          else if(NODEEQUIV[nL].toNODESrecordID == toNODESrecordID)
          {
            toEquiv[numToEquiv++] = NODEEQUIV[nL].fromNODESrecordID;
          }
        }
//
//  Ok, we know where we are (fromNODESrecordID) and where we have to go to (toNODESrecordID).
//
//  The algorithm is find the route required to get us from a to b in the shortest time,
//  placing instructions in "travelInstructions".
//
//  First, get a list of patterns that fromNODESrecordID (or one of its equivalences) reside in.
//  Note that we keep PATTERNS.NODESrecordID, as it may actually be the substituted, equivalent, node.
//
        numFrom = 0;
        for(nL = 0; nL < numFromEquiv + 1; nL++)
        {
          NODESrecordID = nL == 0 ? fromNODESrecordID : fromEquiv[nL - 1];
          PATTERNSKey1.NODESrecordID = NODESrecordID;
          rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
          while(rcode2 == 0 && PATTERNS.NODESrecordID == NODESrecordID)
          {
            if(PATTERNS.SERVICESrecordID == SERVICESrecordID)
            {
              from[numFrom].NODESrecordID = PATTERNS.NODESrecordID;
              from[numFrom].ROUTESrecordID = PATTERNS.ROUTESrecordID;
              from[numFrom].directionIndex = PATTERNS.directionIndex;
              from[numFrom].PATTERNNAMESrecordID = PATTERNS.PATTERNNAMESrecordID;
              from[numFrom].nodeSequence = PATTERNS.nodeSequence;
              numFrom++;
            }
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
          }
        }
//
//  If there weren't any, cycle through
//
        if(numFrom == 0)
        {
          continue;
        }
//
//  Now, get a list of patterns that toNODESrecordID are in.
//
        numTo = 0;
        for(nL = 0; nL < numToEquiv + 1; nL++)
        {
          NODESrecordID = nL == 0 ? toNODESrecordID : toEquiv[nL - 1];
          PATTERNSKey1.NODESrecordID = NODESrecordID;
          rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
          while(rcode2 == 0 && PATTERNS.NODESrecordID == NODESrecordID)
          {
            if(PATTERNS.SERVICESrecordID == SERVICESrecordID)
            {
              to[numTo].NODESrecordID = PATTERNS.NODESrecordID;
              to[numTo].ROUTESrecordID = PATTERNS.ROUTESrecordID;
              to[numTo].directionIndex = PATTERNS.directionIndex;
              to[numTo].PATTERNNAMESrecordID = PATTERNS.PATTERNNAMESrecordID;
              to[numTo].nodeSequence = PATTERNS.nodeSequence;
              numTo++;
            }
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
          }
        }
//
//  If there weren't any, cycle through
//
        if(numTo == 0)
          continue;
//
//  Develop a list of patterns that have both the from and to nodes
//  on them, and that have the "to" node following the "from" node.
//
//  First, "merge" the lists
//
        numFromTo = 0;
        for(nL = 0; nL < numFrom; nL++)
        {
          for(nM = 0; nM < numTo; nM++)
          {
            if(from[nL].ROUTESrecordID == to[nM].ROUTESrecordID &&
                  from[nL].directionIndex == to[nM].directionIndex &&
                  from[nL].PATTERNNAMESrecordID == to[nM].PATTERNNAMESrecordID &&
                  from[nL].nodeSequence < to[nM].nodeSequence)
            {
              fromTo[numFromTo].fromNODESrecordID = from[nL].NODESrecordID;
              fromTo[numFromTo].toNODESrecordID = to[nM].NODESrecordID;
              fromTo[numFromTo].ROUTESrecordID = from[nL].ROUTESrecordID;
              fromTo[numFromTo].directionIndex = from[nL].directionIndex;
              fromTo[numFromTo].PATTERNNAMESrecordID = from[nL].PATTERNNAMESrecordID;
              fromTo[numFromTo].fromNodePos = NO_RECORD;
              fromTo[numFromTo].toNodePos = NO_RECORD;
              numFromTo++;
            }
          }
        }
//
//  Did we get any?
//
        if(numFromTo == 0)
          continue;
//
//  Second, establish fromNodePos and toNodePos so we
//  know where to look on the tripTimes array later on
//
        for(nL = 0; nL < numFromTo; nL++)
        {
          PATTERNSKey2.ROUTESrecordID = fromTo[nL].ROUTESrecordID;
          PATTERNSKey2.SERVICESrecordID = SERVICESrecordID;
          PATTERNSKey2.directionIndex = fromTo[nL].directionIndex;
          PATTERNSKey2.PATTERNNAMESrecordID = fromTo[nL].PATTERNNAMESrecordID;
          PATTERNSKey2.nodeSequence = NO_RECORD;
          rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          pos = 0;
          while(rcode2 == 0 &&
                PATTERNS.ROUTESrecordID == fromTo[nL].ROUTESrecordID &&
                PATTERNS.SERVICESrecordID == SERVICESrecordID &&
                PATTERNS.directionIndex == fromTo[nL].directionIndex &&
                PATTERNSKey2.PATTERNNAMESrecordID == fromTo[nL].PATTERNNAMESrecordID)
          {
            if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
            {
              if(PATTERNS.NODESrecordID == fromTo[nL].fromNODESrecordID &&
                    fromTo[nL].fromNodePos == NO_RECORD)
              {
                fromTo[nL].fromNodePos = pos;
              }
              else if(PATTERNS.NODESrecordID == fromTo[nL].toNODESrecordID &&
                    fromTo[nL].toNodePos == NO_RECORD)
              {
                fromTo[nL].toNodePos = pos;
                break;
              }
              pos++;
            }
            rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
          } 
        }
//
//  Build the matrix
//
        TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].fromNODESrecordID = fromNODESrecordID; // nodeList[nI];
        TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].toNODESrecordID = toNODESrecordID; // nodeList[nJ];
        TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = 
              (TMTRIPSDef *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TMTRIPSDef) * 50); 
        if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL)
        {
          AllocationError(__FILE__, __LINE__, FALSE);
          return;
        }
        TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc = 50;
        TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips = 0;
        for(nL = 0; nL < numFromTo; nL++)
        {
          TRIPSKey1.ROUTESrecordID = fromTo[nL].ROUTESrecordID;
          TRIPSKey1.SERVICESrecordID = SERVICESrecordID;
          TRIPSKey1.directionIndex = fromTo[nL].directionIndex;
          TRIPSKey1.tripSequence = NO_RECORD;
          rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
          while(rcode2 == 0 &&
                TRIPS.ROUTESrecordID == fromTo[nL].ROUTESrecordID &&
                TRIPS.SERVICESrecordID == SERVICESrecordID &&
                TRIPS.directionIndex == fromTo[nL].directionIndex)
          {
            if(TRIPS.PATTERNNAMESrecordID == fromTo[nL].PATTERNNAMESrecordID)
            {
              GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                    TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                    TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
              nM = TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips;
              TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].TRIPSrecordID = TRIPS.recordID;
              TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[0] = GTResults.tripTimes[fromTo[nL].fromNodePos];
              TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[1] = GTResults.tripTimes[fromTo[nL].toNodePos];
              TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips++;
              if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips >= TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc)
              {
                TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc += 50;
                TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = 
                      (TMTRIPSDef *)HeapReAlloc(GetProcessHeap(),
                      HEAP_ZERO_MEMORY, TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips,
                      sizeof(TMTRIPSDef) * TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc); 
                if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL)
                {
                  AllocationError(__FILE__, __LINE__, TRUE);
                  return;
                }
              }
            }
            rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey1, 1);
          }
//
//  Pass 2 - check on pullouts and pullins
//
          rcode2 = btrieve(B_GETFIRST, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2);
          while(rcode2 == 0)
          {
//
//  Pullout
//
            if(TRIPS.SERVICESrecordID == SERVICESrecordID &&
                  TRIPS.standard.POGNODESrecordID == fromNODESrecordID)
            {
              PATTERNSKey1.NODESrecordID = toNODESrecordID;
              rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
              bFound = FALSE;
              while(rcode2 == 0 && PATTERNS.NODESrecordID == toNODESrecordID)
              {
                if(PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
                      PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
                      PATTERNS.directionIndex == TRIPS.directionIndex &&
                      PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
                {
                  bFound = TRUE;
                  break;
                }
                rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
              }
              if(bFound)
              {
                PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID;
                PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID;
                PATTERNSKey2.directionIndex = TRIPS.directionIndex;
                PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                PATTERNSKey2.nodeSequence = NO_RECORD;
                rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                pos = 0;
                while(rcode2 == 0 &&
                      PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
                      PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
                      PATTERNS.directionIndex == TRIPS.directionIndex &&
                      PATTERNSKey2.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
                {
                  if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
                  {
                    if(PATTERNS.NODESrecordID == toNODESrecordID)
                      break;
                    pos++;
                  }
                  rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                } 
                GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                      TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                      TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
                GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID;
                GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID;
                GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID;
                GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID;
                GCTData.fromNODESrecordID = TRIPS.standard.POGNODESrecordID;
                GCTData.toNODESrecordID = GTResults.firstNODESrecordID;
                GCTData.timeOfDay = GTResults.firstNodeTime;
                deadheadTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
                distance = (float)fabs((double)distance);
                if(deadheadTime != NO_RECORD)
                {
                  nM = TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].TRIPSrecordID = TRIPS.recordID;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[0] = GTResults.firstNodeTime - deadheadTime;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[1] = GTResults.tripTimes[pos];
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips++;
                  if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips >= TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc)
                  {
                    TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc += 50;
                    TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = 
                          (TMTRIPSDef *)HeapReAlloc(GetProcessHeap(),
                          HEAP_ZERO_MEMORY, TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips,
                          sizeof(TMTRIPSDef) * TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc); 
                    if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL)
                    {
                      AllocationError(__FILE__, __LINE__, FALSE);
                      return;
                    }
                  }
                }
              }
            }
//
//  Pullin
//
            if(TRIPS.SERVICESrecordID == SERVICESrecordID &&
                  TRIPS.standard.PIGNODESrecordID == toNODESrecordID)
            {
              PATTERNSKey1.NODESrecordID = fromNODESrecordID;
              rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
              bFound = FALSE;
              while(rcode2 == 0 && PATTERNS.NODESrecordID == fromNODESrecordID)
              {
                if(PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
                      PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
                      PATTERNS.directionIndex == TRIPS.directionIndex &&
                      PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
                {
                  bFound = TRUE;
                  break;
                }
                rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey1, 1);
              }
              if(bFound)
              {
                PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID;
                PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID;
                PATTERNSKey2.directionIndex = TRIPS.directionIndex;
                PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                PATTERNSKey2.nodeSequence = NO_RECORD;
                rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                pos = 0;
                while(rcode2 == 0 &&
                      PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID &&
                      PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID &&
                      PATTERNS.directionIndex == TRIPS.directionIndex &&
                      PATTERNSKey2.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID)
                {
                  if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP))
                  {
                    if(PATTERNS.NODESrecordID == fromNODESrecordID)
                      break;
                    pos++;
                  }
                  rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2);
                } 
                GenerateTrip(TRIPS.ROUTESrecordID, TRIPS.SERVICESrecordID,
                      TRIPS.directionIndex, TRIPS.PATTERNNAMESrecordID,
                      TRIPS.timeAtMLP, GENERATETRIP_FLAG_DISPLAYERRORS, &GTResults);
                GCTData.fromPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                GCTData.toPATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID;
                GCTData.fromROUTESrecordID = TRIPS.ROUTESrecordID;
                GCTData.fromSERVICESrecordID = TRIPS.SERVICESrecordID;
                GCTData.toROUTESrecordID = TRIPS.ROUTESrecordID;
                GCTData.toSERVICESrecordID = TRIPS.SERVICESrecordID;
                GCTData.fromNODESrecordID = GTResults.lastNODESrecordID;
                GCTData.toNODESrecordID = TRIPS.standard.PIGNODESrecordID;
                GCTData.timeOfDay = GTResults.lastNodeTime;
                deadheadTime = GetConnectionTime(GCT_FLAG_DEADHEADTIME, &GCTData, &distance);
                distance = (float)fabs((double)distance);
                if(deadheadTime != NO_RECORD)
                {
                  nM = TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].TRIPSrecordID = TRIPS.recordID;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[0] = GTResults.tripTimes[pos];
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips[nM].tripTime[1] = GTResults.lastNodeTime + deadheadTime;
                  TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips++;
                  if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].numTrips >= TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc)
                  {
                    TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc += 50;
                    TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips = 
                          (TMTRIPSDef *)HeapReAlloc(GetProcessHeap(),
                          HEAP_ZERO_MEMORY, TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips,
                          sizeof(TMTRIPSDef) * TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].currentAlloc); 
                    if(TRAVELMATRIX[serviceIndex][numInTM[serviceIndex]].pTrips == NULL)
                    {
                      AllocationError(__FILE__, __LINE__, FALSE);
                      return;
                    }
                  }
                }
              }
            }
            rcode2 = btrieve(B_GETNEXT, TMS_TRIPS, &TRIPS, &TRIPSKey2, 2);
          }
        }// nL
        numInTM[serviceIndex]++;
      }  // nK
    }    // nJ
  }      // nI
  if(bDisplayStatus)
  {
    StatusBar((long)numNodes, (long)numNodes);
    StatusBarEnd();
  }
}