Using the Path Files in the New Cube Voyager API
November 23rd, 2010Matthew M., The Citilabs Director of Development, released an API to use C/C++ to read Voyager Matrixes and Highway Path Files. Â I have started into using this API in C++ to read path files.
The first thing with the path files is that it is (as indicated in the documentation) Highway Path Files only. Â I first tried PT Route Files (which can be read in Viper in the same way one could use Highway Path files), but alas, you receive an error when trying to do that.
For this, I have created a console application, which could become something to run in a model run.
Setup
The first thing is to setup your include file with the DLL references.
Start by adding a reference to VoyagerFileAccess.lib. Â In Visual C++ Express 2010, right-click on your solution name and add an existing item (and point it to VoyagerFileAccess.lib). Â Then, in a header file (or in your source file, but normal programming conventions seem to dictate that these items belong in headers), add the following lines:
extern "C" __declspec(dllimport)void* PathReaderOpen(const char *filename, char *errMsg, int errBufLen); extern "C" __declspec(dllimport)void* PathReaderClose(void* state); extern "C" __declspec(dllimport)int PathReaderGetNumZones(void* state); extern "C" __declspec(dllimport)int PathReaderGetNumTables(void* state);
These lines tell the compiler that these four functions are imported through a DLL (and thus, it uses the lib file to know where to go).
The next thing, since this is a console application, is to correct the Character Set. Â Right-click on the solution, go to properties, select Configuration Properties – General, and set the Character Set to “Not Set”. Â If you leave it on Unicode, your command line arguments will have only one letter. Â See the screen capture below.
Main Application
This is a small application that just shows some simple reading the zones and tables in the path file. Â The application takes one command-line argument.
The source, fully commented, is below.
#include "stdafx.h" #include <Windows.h> #include <stdio.h> #include <iostream> using namespace std; int _tmain(int argc, char* argv[]) { // dim variables char errorMessage[256]=""; int Zones,Tables; // Opens the path file and sets the Zones and Tables variables void* state=PathReaderOpen(argv[1],errorMessage,256); Zones=PathReaderGetNumZones(state); Tables=PathReaderGetNumTables(state); // Dumps the variables to the screen cout << "State of PathReaderOpen: " << state << endl; cout << "PathReaderErrorMessage: " << errorMessage << endl; cout << "Zones: " << Zones << endl; cout << "Tables: " << Tables << endl; // Closes the path file PathReaderClose(state); cout << "Path Reader Closed"; // This makes the command window wait for input from the user before closing char tmp; cin >> tmp; return 0; }
For debugging, you will want to set the command-line argument. Â This is done by right-clicking on the solution and going to Configuration – Debugging. Â See the screen capture below.
Output
The output of this is fairly simple:
In the coming weeks, I will post more about using this new API.
You must be logged in to post a comment.