//----------------------------------------------------------------------------- //! Calculates the distance between 2 points in nautical miles //----------------------------------------------------------------------------- double tGisCalc::SphericalDistance( const tRCoord& coord1, const tRCoord& coord2, tGisCalcTraverseMethod method ) { double distance; if( method == GREAT_CIRCLE ) { distance = GreatCircleDistance( coord1, coord2 ); } else { double distRads; ShortestRhumbLineDistance( coord1.RLat(), coord1.RLon(), coord2.RLat(), coord2.RLon(), distRads ); distance = distRads * tGisConvert::RadiansToNauticalMiles; } return distance; }
int SetupMIFLINES(MIFPASSEDDATADef *pMIFPASSEDDATA, MIFLINESDef *pMIFLINES) { MIFLINESDef MIFLINES[TMSRPT61_MAXMIFLINES]; CString s; double dValue1, dValue2, dValue3, dValue4; double Lat, Long; double distance; double leastDistance; BOOL bDATAFound; BOOL bCoordSysNonEarthFound; BOOL bBreak; BOOL bFound; char *ptr; long firstNODESrecordID; long firstStopNumber; long firstStopNODESrecordID; long toNODESrecordID; long toStopNumber; long toStopNODESrecordID; long NODESrecordID; long previousNODESrecordID; long travelTime; int nI, nJ, nK; int numMultiples; int numSegments; int numMIFLINES; int rcode2; int leastDistanceIndex; int MIFPointer; // // Establish and open the .mif file // CString MIFFileName; CStdioFile MIFFile; MIFFileName = pMIFPASSEDDATA->szMIFFileName; // // Look for this pattern name attached to the szMIFFileName // to see if we have a spcialized trace file // PATTERNNAMESKey0.recordID = pMIFPASSEDDATA->PATTERNNAMESrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0); if(rcode2 != 0) { sprintf(tempString, "***ERR Pattern not found in PATTERNNAMES : RecordID = %ld\r\n", pMIFPASSEDDATA->PATTERNNAMESrecordID); _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString)); return(NO_RECORD); } else { strncpy(tempString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH); trim(tempString, PATTERNNAMES_NAME_LENGTH); MIFFileName += tempString; MIFFileName += ".mif"; sprintf(tempString, "***INF Opening Trace File : \"%s\"\r\n", MIFFileName); _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString)); // // The specialized trace file isn't there - look for the regular one // if(MIFFile.Open(MIFFileName, CFile::modeRead | CFile::typeText | CFile::shareDenyNone) == 0) { sprintf(tempString, "***INF Could not open Trace File : \"%s\"\r\n", MIFFileName); _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString)); MIFFileName = pMIFPASSEDDATA->szMIFFileName; MIFFileName += ".mif"; sprintf(tempString, "***INF Opening Trace File : \"%s\"\r\n", MIFFileName); _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString)); if(MIFFile.Open(MIFFileName, CFile::modeRead | CFile::typeText | CFile::shareDenyNone) == 0) { s.LoadString(ERROR_349); sprintf(szarString, s, MIFFileName); MessageBeep(MB_ICONINFORMATION); MessageBox(NULL, szarString, TMS, MB_OK | MB_ICONINFORMATION); sprintf(tempString, "***ERR Could not open Trace File : \"%s\"\r\n", MIFFileName); _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString)); return(NO_RECORD); } } } // // Cycle through the .MIF file // bDATAFound = FALSE; bCoordSysNonEarthFound = FALSE; numMIFLINES = 0; MIFFile.SeekToBegin(); while(MIFFile.ReadString(s)) { s.MakeUpper(); // // Scan through until we hit "DATA" and/or "CoordSys" // if(!bDATAFound) { // // Is "CoordSys NonEarth" present? // if(!bCoordSysNonEarthFound) { nI = s.Find("COORDSYS NONEARTH", 0); if(nI != -1) { bCoordSysNonEarthFound = TRUE; continue; } } // // Check for "DATA" // nI = s.Find("DATA", 0); if(nI != -1) { bDATAFound = TRUE; } continue; } // // "DATA" Encountered. Now look to see what lines are involved. // // "PLINE" // nI = s.Find("PLINE", 0); if(nI != -1) { // // There are two possibilities in a PLINE statement: // 1) It's followed (on the same line) by the number of points to follow // 2) It's followed (on the same line) by the keyword "MULTIPLE" and then the number of sections, // with each section starting with the number of points to follow // // Look for "MULTIPLE" // strcpy(tempString, s); nI = s.Find("MULTIPLE", 0); if(nI != -1) { if((ptr = strtok(tempString, wSpace)) == NULL) // Get rid of "PLINE" { continue; } if((ptr = strtok(NULL, wSpace)) == NULL) // Get rid of "MULTIPLE" { continue; } if((ptr = strtok(NULL, wSpace)) == NULL) // Get the number of multiples { continue; } numMultiples = atol(ptr); if(!MIFFile.ReadString(s)) { break; } numSegments = atol(s); } // // No "MULTIPLE" - get the number of segments // else { numMultiples = 1; if((ptr = strtok(tempString, wSpace)) == NULL) // Get rid of "PLINE" { continue; } if((ptr = strtok(NULL, wSpace)) == NULL) // Get the number of segments { continue; } numSegments = atol(ptr); } // // Loop through the segments and multiples // bBreak = FALSE; for(nI = 0; nI < numMultiples; nI++) { if(bBreak) { break; } for(nJ = 0; nJ < numSegments; nJ++) { if(!MIFFile.ReadString(s)) { bBreak = TRUE; break; } strcpy(tempString, s); if((ptr = strtok(tempString, wSpace)) == NULL) // Take the first numeric { continue; } dValue1 = (double)atof(ptr); if((ptr = strtok(NULL, wSpace)) == NULL) // Get the second numeric { continue; } dValue2 = (double)atof(ptr); // // Got two doubles - do we have to convert them to Lat/Long? // if(bCoordSysNonEarthFound) { EN2LL(23, dValue1, dValue2, szUTMZone, &Lat, &Long); } else { Long = dValue1; Lat = dValue2; // Long = dValue2; // Lat = dValue1; } // // Save Lat and Long to the data structure // MIFLINES[numMIFLINES].flags = nJ == 0 ? MIFLINES_FLAG_START : 0; if(nJ != numSegments - 1) { MIFLINES[numMIFLINES].from.longitude = Long; MIFLINES[numMIFLINES].from.latitude = Lat; } if(nJ > 0) { MIFLINES[numMIFLINES - 1].to.longitude = Long; MIFLINES[numMIFLINES - 1].to.latitude = Lat; } if(nJ != numSegments - 1) { numMIFLINES++; if(numMIFLINES >= TMSRPT61_MAXMIFLINES) { sprintf(tempString, "***ERR TMSRPT61_MAXMIFLINES too small (1)\r\n"); _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString)); return(NO_RECORD); } } } if(numMultiples > 1) { if(!MIFFile.ReadString(s)) { bBreak = TRUE; } else { numSegments = atol(s); } } } } // // "LINE" // else { nI = s.Find("LINE", 0); if(nI != -1) { strcpy(tempString, s); if((ptr = strtok(tempString, wSpace)) == NULL) // Get rid of "LINE" { continue; } if((ptr = strtok(NULL, wSpace)) == NULL) // Take the first numeric { continue; } dValue1 = (double)atof(ptr); if((ptr = strtok(NULL, wSpace)) == NULL) // Get the second numeric { continue; } dValue2 = (double)atof(ptr); if((ptr = strtok(NULL, wSpace)) == NULL) // Get the third numeric { continue; } dValue3 = (double)atof(ptr); if((ptr = strtok(NULL, wSpace)) == NULL) // Get the fourth numeric { continue; } dValue4 = (double)atof(ptr); // // Do we convert? // if(bCoordSysNonEarthFound) { EN2LL(23, dValue1, dValue2, szUTMZone, &Lat, &Long); } else { Long = dValue1; Lat = dValue2; } MIFLINES[numMIFLINES].flags = MIFLINES_FLAG_START; MIFLINES[numMIFLINES].from.longitude = Long; MIFLINES[numMIFLINES].from.latitude = Lat; if(bCoordSysNonEarthFound) { EN2LL(23, dValue3, dValue4, szUTMZone, &Lat, &Long); } else { Long = dValue3; Lat = dValue4; } MIFLINES[numMIFLINES].to.longitude = Long; MIFLINES[numMIFLINES].to.latitude = Lat; numMIFLINES++; if(numMIFLINES >= TMSRPT61_MAXMIFLINES) { sprintf(tempString, "***ERR TMSRPT61_MAXMIFLINES too small (2)\r\n"); _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString)); return(NO_RECORD); } } } } // // Establish the output lines // // Get the first node on the pattern // PATTERNSKey2.ROUTESrecordID = pMIFPASSEDDATA->ROUTESrecordID; PATTERNSKey2.SERVICESrecordID = pMIFPASSEDDATA->SERVICESrecordID; PATTERNSKey2.directionIndex = pMIFPASSEDDATA->directionIndex; PATTERNSKey2.PATTERNNAMESrecordID = pMIFPASSEDDATA->PATTERNNAMESrecordID; PATTERNSKey2.nodeSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); if(rcode2 == 0 && PATTERNS.ROUTESrecordID == pMIFPASSEDDATA->ROUTESrecordID && PATTERNS.SERVICESrecordID == pMIFPASSEDDATA->SERVICESrecordID && PATTERNS.directionIndex == pMIFPASSEDDATA->directionIndex && PATTERNS.PATTERNNAMESrecordID == pMIFPASSEDDATA->PATTERNNAMESrecordID) { NODESrecordID = NodeEquivalenced(PATTERNS.NODESrecordID); NODESKey0.recordID = NODESrecordID == NO_RECORD ? PATTERNS.NODESrecordID : NODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); firstNODESrecordID = NODES.recordID; firstStopNumber = (pMIFPASSEDDATA->directionIndex == 0 ? NODES.OBStopNumber : NODES.IBStopNumber); if(firstStopNumber <= 0) { firstStopNumber = NODES.number; } if(firstStopNumber > 0) { bFound = FALSE; rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0); while(rcode2 == 0) { if((NODES.flags & NODES_FLAG_STOP)) { if(NODES.number == firstStopNumber) { firstStopNODESrecordID = NODES.recordID; bFound = TRUE; break; } } rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0); } if(!bFound) { NODESKey0.recordID = PATTERNS.NODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); } // // Change to stop number (as derived from long name) : Bob Antonisse, 2-Aug-07 // else { strncpy(tempString, NODES.longName, NODES_LONGNAME_LENGTH); trim(tempString, NODES_LONGNAME_LENGTH); firstStopNumber = atol(&tempString[4]); } } Long = NODES.longitude; Lat = NODES.latitude; } else { sprintf(tempString, "***ERR Pattern without nodes\r\n"); _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString)); return(NO_RECORD); } // // Locate the closest MIFLINE to the starting node // and string the rest of the lines together in order // for(nI = 0; nI < numMIFLINES; nI++) { leastDistance = 10000; leastDistanceIndex = NO_RECORD; for(nJ = 0; nJ < numMIFLINES; nJ++) { if(MIFLINES[nJ].flags & MIFLINES_FLAG_USED) { continue; } distance = GreatCircleDistance(Long, Lat, MIFLINES[nJ].from.longitude, MIFLINES[nJ].from.latitude); if(distance < leastDistance) { leastDistance = distance; leastDistanceIndex = nJ; } } if(leastDistanceIndex == NO_RECORD) { sprintf(tempString, "***ERR Least distance index remained at NO_RECORD in search for starting node\r\n"); _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString)); return(NO_RECORD); } pMIFLINES[nI] = MIFLINES[leastDistanceIndex]; Long = MIFLINES[leastDistanceIndex].to.longitude; Lat = MIFLINES[leastDistanceIndex].to.latitude; MIFLINES[leastDistanceIndex].flags = MIFLINES_FLAG_USED; } if(pMIFPASSEDDATA->ROUTESrecordID == 16) { nI = 1; } // // Set all the lines to be contiguous (no "pen up") // and set all the nodes to NO_RECORD // for(nI = 1; nI < numMIFLINES; nI++) { pMIFLINES[nI].from.latitude = pMIFLINES[nI - 1].to.latitude; pMIFLINES[nI].from.longitude = pMIFLINES[nI - 1].to.longitude; } // // Nodes and associated stops refer to the "from" element of the // first line kept in MIFLINES, and to the "to" element of each // subsequent line. // // We got the first node in the pattern earlier // pMIFLINES[0].from.latitude = NODES.latitude; pMIFLINES[0].from.longitude = NODES.longitude; pMIFLINES[0].from.flags = 0; pMIFLINES[0].from.NODESrecordID = firstNODESrecordID; pMIFLINES[0].from.associatedStopNODESrecordID = firstStopNODESrecordID; pMIFLINES[0].from.associatedStopNumber = firstStopNumber; pMIFLINES[0].to.flags = 0; pMIFLINES[0].to.NODESrecordID = NO_RECORD; pMIFLINES[0].to.associatedStopNODESrecordID = NO_RECORD; pMIFLINES[0].to.associatedStopNumber = NO_RECORD; // // Clear out the (yet) unused portions of the structure // for(nI = 1; nI < numMIFLINES; nI++) { pMIFLINES[nI].from.flags = 0; pMIFLINES[nI].from.NODESrecordID = NO_RECORD; pMIFLINES[nI].from.associatedStopNODESrecordID = NO_RECORD; pMIFLINES[nI].from.associatedStopNumber = NO_RECORD; pMIFLINES[nI].to.flags = 0; pMIFLINES[nI].to.NODESrecordID = NO_RECORD; pMIFLINES[nI].to.associatedStopNODESrecordID = NO_RECORD; pMIFLINES[nI].to.associatedStopNumber = NO_RECORD; } // // And record the nodes/stops as encountered // pMIFPASSEDDATA->NODESrecordIDs[0] = PATTERNS.NODESrecordID; pMIFPASSEDDATA->numNodes = 1; // // Put the rest of the pattern nodes/stops into the MIFLINES structure // MIFPointer = 0; previousNODESrecordID = PATTERNS.NODESrecordID; rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); while(rcode2 == 0 && PATTERNS.ROUTESrecordID == pMIFPASSEDDATA->ROUTESrecordID && PATTERNS.SERVICESrecordID == pMIFPASSEDDATA->SERVICESrecordID && PATTERNS.directionIndex == pMIFPASSEDDATA->directionIndex && PATTERNS.PATTERNNAMESrecordID == pMIFPASSEDDATA->PATTERNNAMESrecordID) { pMIFPASSEDDATA->NODESrecordIDs[pMIFPASSEDDATA->numNodes] = PATTERNS.NODESrecordID; pMIFPASSEDDATA->numNodes++; // // If we encounter a mid-trip layover, it gets a special record. // // From Orbital: // "To declare a mid-trip layover, the pattern in the VTP File must contain exactly one record where the // 'from timepoint name' and 'to timepoint name' fields are set to exactly the same non-null value. // In the example case, they should both be set to 'LTCA'. It wouldn't work to set one to 'LTCA' and // the other to 'LTCD' because our software would interpret this as two distinct timepoints. The following // field pairs must also match: 'from timepoint id' = 'to timepoint id', 'from stop name' = 'to stop name', // 'from stop id' = 'to stop id', 'from longitude' = 'to longitude', 'from latitude' = 'to latitude'. // if(NodesEquivalent(previousNODESrecordID, PATTERNS.NODESrecordID, &travelTime)) { pMIFLINES[MIFPointer - 1].flags |= MIFLINES_FLAG_NEXTISSAMELOCATION; // MIFPointer can't be 0 } // // Not a mid-trip layover // else { // // Isolate the node // if(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP) { NODESKey0.recordID = PATTERNS.NODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); toNODESrecordID = NO_RECORD; toStopNODESrecordID = NODES.recordID; toStopNumber = (pMIFPASSEDDATA->directionIndex == 0 ? NODES.OBStopNumber : NODES.IBStopNumber); if(toStopNumber <= 0) { // toStopNumber = NODES.number; strncpy(tempString, NODES.longName, NODES_LONGNAME_LENGTH); trim(tempString, NODES_LONGNAME_LENGTH); toStopNumber = atol(&tempString[4]); } } else { NODESrecordID = NodeEquivalenced(PATTERNS.NODESrecordID); NODESKey0.recordID = NODESrecordID == NO_RECORD ? PATTERNS.NODESrecordID : NODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); toNODESrecordID = NODES.recordID; toStopNumber = (pMIFPASSEDDATA->directionIndex == 0 ? NODES.OBStopNumber : NODES.IBStopNumber); toStopNODESrecordID = NO_RECORD; if(toStopNumber <= 0) { toStopNumber = NODES.number; } if(toStopNumber > 0) { bFound = FALSE; rcode2 = btrieve(B_GETFIRST, TMS_NODES, &NODES, &NODESKey0, 0); while(rcode2 == 0) { if((NODES.flags & NODES_FLAG_STOP) && NODES.number == toStopNumber) { toStopNODESrecordID = NODES.recordID; bFound = TRUE; break; } rcode2 = btrieve(B_GETNEXT, TMS_NODES, &NODES, &NODESKey0, 0); } if(!bFound) { NODESrecordID = NodeEquivalenced(PATTERNS.NODESrecordID); NODESKey0.recordID = NODESrecordID == NO_RECORD ? PATTERNS.NODESrecordID : NODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); } else { strncpy(tempString, NODES.longName, NODES_LONGNAME_LENGTH); trim(tempString, NODES_LONGNAME_LENGTH); toStopNumber = atol(&tempString[4]); } } } // // Find the closest endpoint to the node/stop // if(pMIFPASSEDDATA->ROUTESrecordID == 21) { int nx = 1; } leastDistance = 10000; leastDistanceIndex = NO_RECORD; for(nI = MIFPointer; nI < numMIFLINES; nI++) { distance = GreatCircleDistance(NODES.longitude, NODES.latitude, pMIFLINES[nI].to.longitude, pMIFLINES[nI].to.latitude); if(distance < leastDistance) { leastDistance = distance; leastDistanceIndex = nI; } } if(leastDistanceIndex == NO_RECORD) { sprintf(tempString, "***ERR Least distance index remained at NO_RECORD in search for subsequent nodes\r\n"); _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString)); strncpy(szarString, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(szarString, NODES_ABBRNAME_LENGTH); sprintf(tempString, "***INF This function failed at or before the search for %s on the pattern\r\n", szarString); _lwrite(pMIFPASSEDDATA->hfErrorLog, tempString, strlen(tempString)); return(NO_RECORD); } // // Set the "to" portion of the line to the located node's coordinates // pMIFLINES[leastDistanceIndex].to.flags = PATTERNS.flags; pMIFLINES[leastDistanceIndex].to.latitude = NODES.latitude; pMIFLINES[leastDistanceIndex].to.longitude = NODES.longitude; pMIFLINES[leastDistanceIndex].to.NODESrecordID = toNODESrecordID; pMIFLINES[leastDistanceIndex].to.associatedStopNumber = toStopNumber; pMIFLINES[leastDistanceIndex].to.associatedStopNODESrecordID = toStopNODESrecordID; // // If we're not on the last one, set the "from" portion of // the next line to the located node's coordinates // if(leastDistanceIndex < numMIFLINES - 1) { pMIFLINES[leastDistanceIndex + 1].from = pMIFLINES[leastDistanceIndex].to; } // // Reset the MIFPointer to the next line and cycle back // MIFPointer = leastDistanceIndex + 1; } previousNODESrecordID = PATTERNS.NODESrecordID; rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } // // Go through MIFLINES and fill in the "blanks" where lines connect to just other lines // // Do "from" first // long setIndex = 0; nI = -1; while(nI < numMIFLINES - 1) { nI++; if(nI >= numMIFLINES) { break; } if(pMIFLINES[nI].from.NODESrecordID == NO_RECORD && pMIFLINES[nI].from.associatedStopNODESrecordID == NO_RECORD) { for(bFound = FALSE, nJ = nI; nJ < numMIFLINES; nJ++) { if(pMIFLINES[nJ].from.NODESrecordID == NO_RECORD && pMIFLINES[nJ].from.associatedStopNODESrecordID == NO_RECORD) { continue; } bFound = TRUE; break; } if(!bFound) { nJ = numMIFLINES; } for(nK = nI; nK < nJ; nK++) { pMIFLINES[nK].from.NODESrecordID = pMIFLINES[setIndex].from.NODESrecordID; pMIFLINES[nK].from.associatedStopNODESrecordID = pMIFLINES[setIndex].from.associatedStopNODESrecordID; pMIFLINES[nK].from.associatedStopNumber = pMIFLINES[setIndex].from.associatedStopNumber; pMIFLINES[nK].from.flags = pMIFLINES[setIndex].from.flags; } nI = nK - 1; } setIndex = nI; } // // Now do "to" // nI = -1; while(nI < numMIFLINES - 1) { nI++; if(nI >= numMIFLINES) { break; } if(pMIFLINES[nI].to.NODESrecordID == NO_RECORD && pMIFLINES[nI].to.associatedStopNODESrecordID == NO_RECORD) { for(nJ = nI; nI < numMIFLINES - 1; nJ++) { if(pMIFLINES[nJ].to.NODESrecordID == NO_RECORD && pMIFLINES[nJ].to.associatedStopNODESrecordID == NO_RECORD) { continue; } for(nK = nI; nK < nJ; nK++) { pMIFLINES[nK].to.NODESrecordID = pMIFLINES[nJ].to.NODESrecordID; pMIFLINES[nK].to.associatedStopNODESrecordID = pMIFLINES[nJ].to.associatedStopNODESrecordID; pMIFLINES[nK].to.associatedStopNumber = pMIFLINES[nJ].to.associatedStopNumber; pMIFLINES[nK].to.flags = pMIFLINES[nJ].to.flags; } nI = nK - 1; break; } } } // // // Close the file // MIFFile.Close(); // // All done // // Return MIFPointer instead of numMIFLINES in case we short turned // return(MIFPointer); }
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, >Results); // // 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, >Results); // // 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); }
// // OnSelchangeFromnode() // void CAddConnectionSD::OnSelchangeFromnode() { float longitude[2]; float latitude[2]; // // Detemine what we're dealing with // // First, get the from and to node record IDs // long fromNode, toNode; int nI; nI = pComboBoxFROMNODE->GetCurSel(); if(nI == CB_ERR) { return; } fromNode = pComboBoxFROMNODE->GetItemData(nI); nI = pComboBoxTONODE->GetCurSel(); if(nI == CB_ERR) { return; } toNode = pComboBoxTONODE->GetItemData(nI); // // Enable the Calculate button // pButtonIDCALCULATE->EnableWindow(TRUE); // // Case 1 - An entry on the Connections Table with hardwired distance // // Try two ways through the table: from:to and to:from // float distance = NO_RECORD; BOOL bFound = FALSE; int rcode2; CONNECTIONSKey1.fromNODESrecordID = fromNode; CONNECTIONSKey1.toNODESrecordID = toNode; CONNECTIONSKey1.fromTimeOfDay = NO_TIME; rcode2 = btrieve(B_GETGREATER, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey1, 1); if(rcode2 == 0) { if(CONNECTIONS.fromNODESrecordID == fromNode && CONNECTIONS.toNODESrecordID == toNode) { if(CONNECTIONS.distance > 0.0) { bFound = TRUE; } } } if(!bFound) { CONNECTIONSKey1.fromNODESrecordID = toNode; CONNECTIONSKey1.toNODESrecordID = fromNode; CONNECTIONSKey1.fromTimeOfDay = NO_TIME; rcode2 = btrieve(B_GETGREATER, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey1, 1); if(rcode2 == 0) { if(CONNECTIONS.fromNODESrecordID == toNode && CONNECTIONS.toNODESrecordID == fromNode) { if(CONNECTIONS.distance > 0.0) { bFound = TRUE; } } } } // // Nope. Get the from and to nodes' lat/long // if(!bFound) { NODESKey0.recordID = fromNode; rcode2 = btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); if(rcode2 == 0 && NODES.latitude != 0.0 && NODES.longitude != 0.0) { longitude[0] = NODES.longitude; latitude[0] = NODES.latitude; NODESKey0.recordID = toNode; rcode2 = btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); if(rcode2 == 0 && NODES.latitude != 0.0 && NODES.longitude != 0.0) { longitude[1] = NODES.longitude; latitude[1] = NODES.latitude; distance = (float)GreatCircleDistance(longitude[0], latitude[0], longitude[1], latitude[1]); bFound = TRUE; } } } // // If we found one, set the control to its value // if(bFound && distance > 0) { sprintf(tempString, "%10.6f", distance); pEditDISTANCE->SetWindowText(tempString); } }
BOOL FAR TMSRPT40(TMSRPTPassedDataDef *pPassedData) { REPORTPARMSDef REPORTPARMS; TMSRPT40NODESDef NODESrecordIDs[TMSRPT40_MAXNODES]; TMSRPT40TRIPSDef TRIPData[TMSRPT40_MAXNODES]; HANDLE hOutputFile; HANDLE hOutputFileRaw; DWORD dwBytesWritten; double distance; BOOL bKeepGoing = FALSE; char outputString[512]; char outputStringRaw[512]; long fromNODESrecordID; long toNODESrecordID; long arrivalTime; float longitude[2]; float latitude[2]; BOOL bRC; BOOL bFound; BOOL bDoneTitle; char fromNodeName[NODES_ABBRNAME_LENGTH * 2 + 1]; char toNodeName[NODES_ABBRNAME_LENGTH * 2 + 1]; long previousPATTERNNAMESrecordID; long previousNODESrecordID; long currentNodePositionInTrip; long actualTime; int nI; int nJ; int nK; int nL; int rcode2; int seqNum; int numConnections; int numEntries; // // Ok - let's go // pPassedData->nReportNumber = 39; pPassedData->numDataFiles = 1; // // See what he wants // REPORTPARMS.nReportNumber = pPassedData->nReportNumber; REPORTPARMS.ROUTESrecordID = m_RouteRecordID; REPORTPARMS.SERVICESrecordID = m_ServiceRecordID; REPORTPARMS.COMMENTSrecordID = NO_RECORD; REPORTPARMS.pRouteList = NULL; REPORTPARMS.pServiceList = NULL; REPORTPARMS.flags = RPFLAG_ROUTES | RPFLAG_SERVICES | RPFLAG_COMMENTS; bRC = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_RPTPARMS), hWndMain, (DLGPROC)RPTPARMSMsgProc, (LPARAM)&REPORTPARMS); if(!bRC) { return(FALSE); } // // Check the list of routes and services // if(REPORTPARMS.numRoutes == 0 || REPORTPARMS.numServices == 0) { goto deallocate; } // // Open the regular output file // strcpy(tempString, szReportsTempFolder); strcat(tempString, "\\TMSRPT40.txt"); hOutputFile = CreateFile(tempString, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hOutputFile == INVALID_HANDLE_VALUE) { LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString)); sprintf(szarString, szFormatString, tempString); MessageBeep(MB_ICONSTOP); MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP); goto deallocate; } strcpy(pPassedData->szReportDataFile[0], tempString); // // Open the raw output file // strcpy(tempString, szReportsTempFolder); strcat(tempString, "\\TMSRPT40RAW.txt"); hOutputFileRaw = CreateFile(tempString, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hOutputFileRaw == INVALID_HANDLE_VALUE) { LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString)); sprintf(szarString, szFormatString, tempString); MessageBeep(MB_ICONSTOP); MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP); goto deallocate; } // // Fire up the status bar // LoadString(hInst, TEXT_117, tempString, TEMPSTRING_LENGTH); StatusBarStart(hWndMain, tempString); // // Build the list of node pairs (more or less nick'd from PICKCONN // numConnections = 0; for(nI = 0; nI < REPORTPARMS.numRoutes; nI++) { if(StatusBarAbort()) { bKeepGoing = FALSE; goto deallocate; } ROUTESKey0.recordID = REPORTPARMS.pRouteList[nI]; btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0); for(nJ = 0; nJ < REPORTPARMS.numServices; nJ++) { if(StatusBarAbort()) { bKeepGoing = FALSE; goto deallocate; } for(nK = 0; nK < 2; nK++) { if(ROUTES.DIRECTIONSrecordID[nK] == NO_RECORD) continue; PATTERNSKey2.ROUTESrecordID = REPORTPARMS.pRouteList[nI]; PATTERNSKey2.SERVICESrecordID = REPORTPARMS.pServiceList[nJ]; PATTERNSKey2.directionIndex = nK; PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID; PATTERNSKey2.nodeSequence = 0; rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); // // Set up unique from/to node combinations. This section of code // assumes that ADDPATTERN has done its job and not permitted a // bus stop to be the first or last node in a pattern. // if(rcode2 == 0 && PATTERNS.ROUTESrecordID == REPORTPARMS.pRouteList[nI] && PATTERNS.SERVICESrecordID == REPORTPARMS.pServiceList[nJ] && PATTERNS.directionIndex == nK) { fromNODESrecordID = PATTERNS.NODESrecordID; rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); while(rcode2 == 0 && PATTERNS.ROUTESrecordID == REPORTPARMS.pRouteList[nI] && PATTERNS.SERVICESrecordID == REPORTPARMS.pServiceList[nJ] && PATTERNS.directionIndex == nK) { if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)) { toNODESrecordID = PATTERNS.NODESrecordID; for(bFound = FALSE, nL = 0; nL < numConnections; nL++) { if(fromNODESrecordID == NODESrecordIDs[nL].from && toNODESrecordID == NODESrecordIDs[nL].to) { bFound = TRUE; break; } } if(!bFound) { NODESrecordIDs[numConnections].from = fromNODESrecordID; NODESrecordIDs[numConnections++].to = toNODESrecordID; if(numConnections >= TMSRPT40_MAXNODES) break; } fromNODESrecordID = toNODESrecordID; } previousPATTERNNAMESrecordID = PATTERNS.PATTERNNAMESrecordID; rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); if(PATTERNS.PATTERNNAMESrecordID != previousPATTERNNAMESrecordID) { fromNODESrecordID = PATTERNS.NODESrecordID; rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } } } } } } // // Sort the connection pairs // qsort((void *)NODESrecordIDs, numConnections, sizeof(TMSRPT40NODESDef), TMSRPT40sort_nodes); // // Cycle through all the connection pairs // seqNum = 1; for(nI = 0; nI < numConnections; nI++) { if(StatusBarAbort()) { bKeepGoing = FALSE; goto deallocate; } // // From node // NODESKey0.recordID = NODESrecordIDs[nI].from; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(fromNodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(fromNodeName, NODES_ABBRNAME_LENGTH); longitude[0] = NODES.longitude; latitude[0] = NODES.latitude; // // To node // NODESKey0.recordID = NODESrecordIDs[nI].to; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(toNodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(toNodeName, NODES_ABBRNAME_LENGTH); longitude[1] = NODES.longitude; latitude[1] = NODES.latitude; // // Display it // sprintf(tempString, "%4s - %4s", fromNodeName, toNodeName); StatusBarText(tempString); StatusBar((long)(nI + 1), (long)numConnections); // // First, dump out the connections table entries for this pair under // the following rules: a) the entry must be a running time, and b) // B->A connections will only be listed if the 2-way flag is in effect. // // // Possibly From-To and To-From // bDoneTitle = FALSE; for(nJ = 0; nJ < 2; nJ++) { if(nJ == 0) { fromNODESrecordID = NODESrecordIDs[nI].from; toNODESrecordID = NODESrecordIDs[nI].to; } else { fromNODESrecordID = NODESrecordIDs[nI].to; toNODESrecordID = NODESrecordIDs[nI].from; } CONNECTIONSKey1.fromNODESrecordID = NODESrecordIDs[nI].from; CONNECTIONSKey1.toNODESrecordID = NODESrecordIDs[nI].to; CONNECTIONSKey1.fromTimeOfDay = NO_TIME; rcode2 = btrieve(B_GETGREATEROREQUAL, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey1, 1); while(rcode2 == 0 && CONNECTIONS.fromNODESrecordID == fromNODESrecordID && CONNECTIONS.toNODESrecordID == toNODESrecordID) { if((nJ == 0 || (CONNECTIONS.flags & CONNECTIONS_FLAG_TWOWAY)) && (CONNECTIONS.flags & CONNECTIONS_FLAG_RUNNINGTIME)) { // // Sequence + Title String // if(!bDoneTitle) { sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName); strcat(outputString, "Data from the Connections Table:\"\r\n"); WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL); sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName); strcat(outputString, " From To Route Service Pattern Route Service Pattern Min U/M Dist Spd/Hr"); strcat(outputString, "\"\r\n"); WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL); bDoneTitle = TRUE; } // // Sequence // sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName); // // From and to node names // if(nJ == 0) sprintf(tempString, " %4s %4s ", fromNodeName, toNodeName); else sprintf(tempString, " %4s %4s ", toNodeName, fromNodeName); strcat(outputString, tempString); // // From Route // if(CONNECTIONS.fromROUTESrecordID == NO_RECORD) strcpy(szarString, ""); else { ROUTESKey0.recordID = CONNECTIONS.fromROUTESrecordID; btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0); strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(szarString, 8); } sprintf(tempString, "%8s ", szarString); strcat(outputString, tempString); // // From Service // if(CONNECTIONS.fromSERVICESrecordID == NO_RECORD) strcpy(szarString, ""); else { SERVICESKey0.recordID = CONNECTIONS.fromSERVICESrecordID; btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH); trim(szarString, 8); } sprintf(tempString, "%8s ", szarString); strcat(outputString, tempString); // // From Pattern // if(CONNECTIONS.fromPATTERNNAMESrecordID == NO_RECORD) strcpy(szarString, ""); else { PATTERNNAMESKey0.recordID = CONNECTIONS.fromPATTERNNAMESrecordID; btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0); strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH); trim(szarString, 8); } sprintf(tempString, "%8s ", szarString); strcat(outputString, tempString); // // To Route // if(CONNECTIONS.toROUTESrecordID == NO_RECORD) strcpy(szarString, ""); else { ROUTESKey0.recordID = CONNECTIONS.toROUTESrecordID; btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0); strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(szarString, 8); } sprintf(tempString, "%8s ", szarString); strcat(outputString, tempString); // // To Service // if(CONNECTIONS.toSERVICESrecordID == NO_RECORD) strcpy(szarString, ""); else { SERVICESKey0.recordID = CONNECTIONS.toSERVICESrecordID; btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH); trim(szarString, 8); } sprintf(tempString, "%8s ", szarString); strcat(outputString, tempString); // // To Pattern // if(CONNECTIONS.toPATTERNNAMESrecordID == NO_RECORD) strcpy(szarString, ""); else { PATTERNNAMESKey0.recordID = CONNECTIONS.toPATTERNNAMESrecordID; btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0); strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH); trim(szarString, 8); } sprintf(tempString, "%8s ", szarString); strcat(outputString, tempString); // // Time // sprintf(tempString, "%3d ", CONNECTIONS.connectionTime / 60); strcat(outputString, tempString); // // Btwn // if(CONNECTIONS.fromTimeOfDay == NO_TIME) { strcpy(tempString, " "); } else { sprintf(tempString, "%s ", Tchar(CONNECTIONS.fromTimeOfDay)); } strcat(outputString, tempString); // // And // if(CONNECTIONS.toTimeOfDay == NO_TIME) { strcpy(tempString, " "); } else { sprintf(tempString, "%s ", Tchar(CONNECTIONS.toTimeOfDay)); } strcat(outputString, tempString); // // Distance type and distance // if(CONNECTIONS.distance == NO_RECORD || CONNECTIONS.distance == 0.0) { strcpy(szarString, "Map "); distance = GreatCircleDistance(longitude[0], latitude[0], longitude[1], latitude[1]); } else { strcpy(szarString, "User"); distance = CONNECTIONS.distance; } sprintf(tempString, "%s %7.2f ", szarString, distance); strcat(outputString, tempString); // // Speed per hour // if(CONNECTIONS.connectionTime == 0) strcpy(tempString, "-------"); else sprintf(tempString, "%7.2f", distance / ((double)CONNECTIONS.connectionTime / 3600)); strcat(outputString, tempString); // // Write it out // strcat(outputString, "\"\r\n"); WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL); } // if connection type == requested type to display rcode2 = btrieve(B_GETNEXT, TMS_CONNECTIONS, &CONNECTIONS, &CONNECTIONSKey1, 1); } // while } // nJ // // If we didn't output a title, there wasn't anything // if(!bDoneTitle) continue; // // Now get the stuff from the timechecks table // // Sequence + Title String // sprintf(outputString, "%d\t%s\t%s\t\"\"\r\n", seqNum++, fromNodeName, toNodeName); WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL); sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName); strcat(outputString, "Data from the Timechecks Table:\"\r\n"); WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL); // // Look up the "to node" on the timechecks table // numEntries = 0; TIMECHECKSKey4.NODESrecordID = NODESrecordIDs[nI].to; rcode2 = btrieve(B_GETEQUAL, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey4, 4); while(rcode2 == 0 && TIMECHECKS.NODESrecordID == NODESrecordIDs[nI].to) { if(StatusBarAbort()) { bKeepGoing = FALSE; goto deallocate; } // // Get the trip // TRIPSKey0.recordID = TIMECHECKS.TRIPSrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0); if(rcode2 == 0) { // // Get the pattern of the trip and find the "to node". // previousNODESrecordID = NO_RECORD; PATTERNSKey2.ROUTESrecordID = TRIPS.ROUTESrecordID; PATTERNSKey2.SERVICESrecordID = TRIPS.SERVICESrecordID; PATTERNSKey2.directionIndex = TRIPS.directionIndex; PATTERNSKey2.PATTERNNAMESrecordID = TRIPS.PATTERNNAMESrecordID; PATTERNSKey2.nodeSequence = NO_RECORD; currentNodePositionInTrip = 0; rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); while(rcode2 == 0 && PATTERNS.ROUTESrecordID == TRIPS.ROUTESrecordID && PATTERNS.SERVICESrecordID == TRIPS.SERVICESrecordID && PATTERNS.directionIndex == TRIPS.directionIndex && PATTERNS.PATTERNNAMESrecordID == TRIPS.PATTERNNAMESrecordID) { if(!(PATTERNS.flags & PATTERNS_FLAG_BUSSTOP)) { if(PATTERNS.NODESrecordID == TIMECHECKS.NODESrecordID) { if(currentNodePositionInTrip == TIMECHECKS.nodePositionInTrip) break; currentNodePositionInTrip++; } previousNODESrecordID = PATTERNS.NODESrecordID; } rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } // // If we have a "from node" and "to node", save the trip and the actual time // if(previousNODESrecordID == NODESrecordIDs[nI].from) { TRIPData[numEntries].TRIPSrecordID = TRIPS.recordID; TRIPData[numEntries].actualTimeOfDay = TIMECHECKS.actualTime; TRIPData[numEntries].nodePositionInTrip = TIMECHECKS.nodePositionInTrip; numEntries++; if(numEntries >= TMSRPT40_MAXNODES) break; } } rcode2 = btrieve(B_GETNEXT, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey4, 4); } // // Sort TRIPData based on actualTime and print out the title // if(numEntries > 0) { qsort((void *)TRIPData, numEntries, sizeof(TMSRPT40TRIPSDef), TMSRPT40sort_trips); sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName); strcat(outputString, " Trip# Route Service Pattern At Act Dist Spd/Hr\"\r\n"); WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL); } // // Cycle through the saved entries // for(nJ = 0; nJ < numEntries; nJ++) { if(StatusBarAbort()) { bKeepGoing = FALSE; goto deallocate; } // // Get the trip and generate it // TRIPSKey0.recordID = TRIPData[nJ].TRIPSrecordID; rcode2 = btrieve(B_GETEQUAL, TMS_TRIPS, &TRIPS, &TRIPSKey0, 0); if(rcode2 != 0) continue; sprintf(outputString, "%d\t%s\t%s\t\"", seqNum++, fromNodeName, toNodeName); sprintf(outputStringRaw, "%s\t%s\t", fromNodeName, toNodeName); // // Trip number // sprintf(tempString, " %5ld ", TRIPS.tripNumber); strcat(outputString, tempString); // // Route // ROUTESKey0.recordID = TRIPS.ROUTESrecordID; btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0); strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(szarString, 8); sprintf(tempString, "%8s ", szarString); strcat(outputString, tempString); strncpy(szarString, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(szarString, ROUTES_NUMBER_LENGTH); strcat(outputStringRaw, szarString); strcat(outputStringRaw, "\t"); DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[TRIPS.directionIndex]; btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0); strncpy(szarString, DIRECTIONS.abbrName, DIRECTIONS_ABBRNAME_LENGTH); trim(szarString, DIRECTIONS_ABBRNAME_LENGTH); strcat(outputStringRaw, szarString); strcat(outputStringRaw, "\t"); // // Service // SERVICESKey0.recordID = TRIPS.SERVICESrecordID; btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH); trim(szarString, 8); sprintf(tempString, "%8s ", szarString); strcat(outputString, tempString); strncpy(szarString, SERVICES.name, SERVICES_NAME_LENGTH); trim(szarString, SERVICES_NAME_LENGTH); strcat(outputStringRaw, szarString); strcat(outputStringRaw, "\t"); // // Pattern // PATTERNNAMESKey0.recordID = TRIPS.PATTERNNAMESrecordID; btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0); strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH); trim(szarString, 8); sprintf(tempString, "%8s ", szarString); strcat(outputString, tempString); strncpy(szarString, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH); trim(szarString, PATTERNNAMES_NAME_LENGTH); strcat(outputStringRaw, szarString); strcat(outputStringRaw, "\t"); // // At time // sprintf(tempString, "%s ", Tchar(TRIPData[nJ].actualTimeOfDay)); strcat(outputString, tempString); sprintf(tempString, "%ld\t", TRIPData[nJ].actualTimeOfDay); strcat(outputStringRaw, tempString); // // Actual running time // // Pass 1 - find the companion normally (nodeposition = 0) or if a pair repeats // actualTime = NO_TIME; TIMECHECKSKey5.TRIPSrecordID = TRIPS.recordID; rcode2 = btrieve(B_GETEQUAL, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5); while(rcode2 == 0) { if(TIMECHECKS.NODESrecordID == NODESrecordIDs[nI].from && TIMECHECKS.nodePositionInTrip == TRIPData[nJ].nodePositionInTrip) { actualTime = TRIPData[nJ].actualTimeOfDay - TIMECHECKS.actualTime; break; } rcode2 = btrieve(B_GETNEXT, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5); if(TIMECHECKS.TRIPSrecordID != TRIPS.recordID) break; } // // Pass 2 - find the companion when you have the same start and end node // if(actualTime == NO_TIME) { TIMECHECKSKey5.TRIPSrecordID = TRIPS.recordID; rcode2 = btrieve(B_GETEQUAL, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5); while(rcode2 == 0) { if(TIMECHECKS.NODESrecordID == NODESrecordIDs[nI].from) { actualTime = TRIPData[nJ].actualTimeOfDay - TIMECHECKS.actualTime; break; } rcode2 = btrieve(B_GETNEXT, TMS_TIMECHECKS, &TIMECHECKS, &TIMECHECKSKey5, 5); if(TIMECHECKS.TRIPSrecordID != TRIPS.recordID) break; } } if(actualTime == NO_TIME) { strcpy(tempString, " "); actualTime = 0; } else { sprintf(tempString, "%3d ", actualTime / 60); } strcat(outputString, tempString); arrivalTime = TRIPData[nJ].actualTimeOfDay + actualTime; sprintf(tempString, "%ld\r\n", arrivalTime); strcat(outputStringRaw, tempString); // // Distance // distance = GreatCircleDistance(longitude[0], latitude[0], longitude[1], latitude[1]); sprintf(tempString, "%7.2f ", distance); strcat(outputString, tempString); // // Speed per hour // if(actualTime == 0 || actualTime == NO_TIME) strcpy(tempString, "-------"); else sprintf(tempString, "%7.2f", distance / ((double)actualTime / 3600)); strcat(outputString, tempString); // // Write it out // strcat(outputString, "\"\r\n"); WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL); WriteFile(hOutputFileRaw, (LPCVOID *)outputStringRaw, strlen(outputStringRaw), &dwBytesWritten, NULL); } sprintf(outputString, "%d\t%s\t%s\t\" Total entries: %d\"\r\n", seqNum++, fromNodeName, toNodeName, numEntries); WriteFile(hOutputFile, (LPCVOID *)outputString, strlen(outputString), &dwBytesWritten, NULL); } // nI bKeepGoing = TRUE; // // Free allocated memory // deallocate: TMSHeapFree(REPORTPARMS.pRouteList); TMSHeapFree(REPORTPARMS.pServiceList); CloseHandle(hOutputFile); CloseHandle(hOutputFileRaw); StatusBarEnd(); if(!bKeepGoing) { return(FALSE); } // // All done // return(TRUE); }
BOOL FAR TMSRPT31(TMSRPTPassedDataDef *pPassedData) { REPORTPARMSDef REPORTPARMS; HANDLE hOutputFile; double distance; double longitude; double prevLongitude; double latitude; double prevLatitude; BOOL bKeepGoing = FALSE; BOOL bRC; char routeNumber[ROUTES_NUMBER_LENGTH + 1]; char routeName[ROUTES_NAME_LENGTH + 1]; char serviceName[SERVICES_NAME_LENGTH + 1]; char directionName[DIRECTIONS_LONGNAME_LENGTH + 1]; char patternName[PATTERNNAMES_NAME_LENGTH + 1]; char nodeName[NODES_ABBRNAME_LENGTH + 1]; char intersection[NODES_INTERSECTION_LENGTH + 1]; char *ptr; BYTE recordBody[512]; long statbarTotal; long prevPattern; long prevNode; int nI; int nJ; int nK; int rcode2; int recordBodyLength; short int sequenceNumber; short int rowNumber; short int colNumber; short int previousRow; pPassedData->nReportNumber = 30; pPassedData->numDataFiles = 1; // // See what he wants // REPORTPARMS.nReportNumber = pPassedData->nReportNumber; REPORTPARMS.ROUTESrecordID = m_RouteRecordID; REPORTPARMS.SERVICESrecordID = m_ServiceRecordID; REPORTPARMS.COMMENTSrecordID = NO_RECORD; REPORTPARMS.pRouteList = NULL; REPORTPARMS.pServiceList = NULL; REPORTPARMS.flags = RPFLAG_ROUTES | RPFLAG_SERVICES | RPFLAG_COMMENTS; bRC = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_RPTPARMS), hWndMain, (DLGPROC)RPTPARMSMsgProc, (LPARAM)&REPORTPARMS); if(!bRC) return(FALSE); // // Check the list of routes and services // if(REPORTPARMS.numRoutes == 0 || REPORTPARMS.numServices == 0) goto deallocate; // // Open the output file // strcpy(tempString, szDatabaseFileName); if((ptr = strrchr(tempString, '\\')) != NULL) *ptr = '\0'; strcat(tempString, "\\TMSRPT31.XLS"); hOutputFile = CreateFile(tempString, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hOutputFile == INVALID_HANDLE_VALUE) { LoadString(hInst, ERROR_202, szFormatString, sizeof(szFormatString)); sprintf(szarString, szFormatString, tempString); MessageBeep(MB_ICONSTOP); MessageBox((HWND)NULL, szarString, TMS, MB_ICONSTOP); goto deallocate; } strcpy(pPassedData->szReportDataFile[0], tempString); // // Write out the header for the Excel file // recordBody[0] = 0x02; recordBody[1] = 0x00; recordBody[2] = 0x10; recordBody[3] = 0x00; WriteExcel(EXCEL_BOF, hOutputFile, recordBody, 4); // // Loop through the routes // LoadString(hInst, TEXT_117, tempString, TEMPSTRING_LENGTH); StatusBarStart(hWndMain, tempString); statbarTotal = REPORTPARMS.numRoutes * REPORTPARMS.numServices; rowNumber = 0; for(nI = 0; nI < REPORTPARMS.numRoutes; nI++) { if(StatusBarAbort()) { bKeepGoing = FALSE; goto deallocate; } ROUTESKey0.recordID = REPORTPARMS.pRouteList[nI]; rcode2 = btrieve(B_GETEQUAL, TMS_ROUTES, &ROUTES, &ROUTESKey0, 0); if(rcode2 != 0) continue; strncpy(routeNumber, ROUTES.number, ROUTES_NUMBER_LENGTH); trim(routeNumber, ROUTES_NUMBER_LENGTH); strncpy(routeName, ROUTES.name, ROUTES_NAME_LENGTH); trim(routeName, ROUTES_NAME_LENGTH); // // Loop through the services // for(nJ = 0; nJ < REPORTPARMS.numServices; nJ++) { if(StatusBarAbort()) { bKeepGoing = FALSE; goto deallocate; } SERVICESKey0.recordID = REPORTPARMS.pServiceList[nJ]; rcode2 = btrieve(B_GETEQUAL, TMS_SERVICES, &SERVICES, &SERVICESKey0, 0); if(rcode2 != 0) continue; strncpy(serviceName, SERVICES.name, SERVICES_NAME_LENGTH); trim(serviceName, SERVICES_NAME_LENGTH); LoadString(hInst, TEXT_118, szFormatString, sizeof(szFormatString)); strcpy(szarString, routeNumber); strcat(szarString, " - "); strcat(szarString, routeName); sprintf(tempString, szFormatString, szarString, serviceName); StatusBarText(tempString); StatusBar((long)(nI * REPORTPARMS.numServices + nJ), (long)statbarTotal); if(StatusBarAbort()) { bKeepGoing = FALSE; goto deallocate; } // // Loop through the directions // for(nK = 0; nK < 2; nK++) { if(StatusBarAbort()) { bKeepGoing = FALSE; goto deallocate; } if(ROUTES.DIRECTIONSrecordID[nK] == NO_RECORD) continue; DIRECTIONSKey0.recordID = ROUTES.DIRECTIONSrecordID[nK]; rcode2 = btrieve(B_GETEQUAL, TMS_DIRECTIONS, &DIRECTIONS, &DIRECTIONSKey0, 0); if(rcode2 != 0) continue; strncpy(directionName, DIRECTIONS.longName, DIRECTIONS_LONGNAME_LENGTH); trim(directionName, DIRECTIONS_LONGNAME_LENGTH); // // Get the base pattern nodes // PATTERNSKey2.ROUTESrecordID = ROUTES.recordID; PATTERNSKey2.SERVICESrecordID = SERVICES.recordID; PATTERNSKey2.directionIndex = nK; PATTERNSKey2.PATTERNNAMESrecordID = basePatternRecordID; PATTERNSKey2.nodeSequence = NO_RECORD; rcode2 = btrieve(B_GETGREATER, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); prevPattern = NO_RECORD; while(rcode2 == 0 && PATTERNS.ROUTESrecordID == ROUTES.recordID && PATTERNS.SERVICESrecordID == SERVICES.recordID && PATTERNS.directionIndex == nK) { // // Determine a change in pattern // if(PATTERNS.PATTERNNAMESrecordID != prevPattern) { prevNode = NO_RECORD; prevPattern = PATTERNS.PATTERNNAMESrecordID; sequenceNumber = 1; } // // Start outputting the data // // Route number // colNumber = 0; recordBodyLength = SetRecordBodyForString(&rowNumber, &colNumber, routeNumber, recordBody); WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength); // // Route name // colNumber = 1; recordBodyLength = SetRecordBodyForString(&rowNumber, &colNumber, routeName, recordBody); WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength); // // Service name // colNumber = 2; recordBodyLength = SetRecordBodyForString(&rowNumber, &colNumber, serviceName, recordBody); WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength); // Direction name // colNumber = 3; recordBodyLength = SetRecordBodyForString(&rowNumber, &colNumber, directionName, recordBody); WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength); // // Pattern name // PATTERNNAMESKey0.recordID = PATTERNS.PATTERNNAMESrecordID; btrieve(B_GETEQUAL, TMS_PATTERNNAMES, &PATTERNNAMES, &PATTERNNAMESKey0, 0); strncpy(patternName, PATTERNNAMES.name, PATTERNNAMES_NAME_LENGTH); trim(patternName, PATTERNNAMES_NAME_LENGTH); colNumber = 4; recordBodyLength = SetRecordBodyForString(&rowNumber, &colNumber, patternName, recordBody); WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength); // // Sequence number // colNumber = 5; recordBodyLength = SetRecordBodyForShortInteger(&rowNumber, &colNumber, &sequenceNumber, recordBody); WriteExcel(EXCEL_INTEGER, hOutputFile, recordBody, recordBodyLength); sequenceNumber++; // // Node abbreviation // NODESKey0.recordID = PATTERNS.NODESrecordID; btrieve(B_GETEQUAL, TMS_NODES, &NODES, &NODESKey0, 0); strncpy(nodeName, NODES.abbrName, NODES_ABBRNAME_LENGTH); trim(nodeName, NODES_ABBRNAME_LENGTH); colNumber = 6; recordBodyLength = SetRecordBodyForString(&rowNumber, &colNumber, nodeName, recordBody); WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength); // // Node intersection // strncpy(intersection, NODES.intersection, NODES_INTERSECTION_LENGTH); trim(intersection, NODES_INTERSECTION_LENGTH); colNumber = 7; recordBodyLength = SetRecordBodyForString(&rowNumber, &colNumber, intersection, recordBody); WriteExcel(EXCEL_LABEL, hOutputFile, recordBody, recordBodyLength); // // Latitude // latitude = NODES.latitude; colNumber = 8; recordBodyLength = SetRecordBodyForDouble(&rowNumber, &colNumber, &latitude, recordBody); WriteExcel(EXCEL_NUMBER, hOutputFile, recordBody, recordBodyLength); // // Longitude // longitude = NODES.longitude; colNumber = 9; recordBodyLength = SetRecordBodyForDouble(&rowNumber, &colNumber, &longitude, recordBody); WriteExcel(EXCEL_NUMBER, hOutputFile, recordBody, recordBodyLength); // // Distance to next node // if(prevNode != NO_RECORD) { distance = GreatCircleDistance(prevLongitude, prevLatitude, longitude, latitude); colNumber = 10; previousRow = rowNumber - 1; recordBodyLength = SetRecordBodyForDouble(&previousRow, &colNumber, &distance, recordBody); WriteExcel(EXCEL_NUMBER, hOutputFile, recordBody, recordBodyLength); } prevNode = NODES.recordID; prevLatitude = latitude; prevLongitude = longitude; // // Bump up the row and get the next node in the BASE pattern // rowNumber++; rcode2 = btrieve(B_GETNEXT, TMS_PATTERNS, &PATTERNS, &PATTERNSKey2, 2); } // while } // nK } // nJ } // nI // // Write out the EOF marker for the Excel file // WriteExcel(EXCEL_EOF, hOutputFile, NULL, NO_RECORD); bKeepGoing = TRUE; // // Free allocated memory // deallocate: TMSHeapFree(REPORTPARMS.pRouteList); TMSHeapFree(REPORTPARMS.pServiceList); CloseHandle(hOutputFile); StatusBarEnd(); if(!bKeepGoing) { return(FALSE); } // // All done // // Let him know // strcpy(tempString, "TMSRPT31.xls was written to:\n"); strcpy(szarString, szDatabaseFileName); if((ptr = strrchr(szarString, '\\')) != NULL) { *ptr = '\0'; } strcat(tempString, szarString); MessageBox(hWndMain, tempString, TMS, MB_OK); return(TRUE); }