Steps neccessary to add a generator. XXX refers to the output format you want to implement.
src/generator/XXX.h:
#include "../gnuclad.h"
derive class from generator:
class GeneratorXXX: public Generator
declare constructor and destructor
declare public method:
void writeData(Cladogram * clad, OutputFile & out);
src/generator/XXX.cpp:
#include "XXX.h"
implement constructor and destructor
implement writeData(Cladogram * clad, OutputFile & out) { ... }
src/gnuclad.cpp:
#include "generator/XXX.h"
update outFormats
add choser:
else if(outputExt == "XXX") generator = new GeneratorXXX;
src/Makefile.am:
add to SOURCES: generator/XXX.h generator/XXX.cpp
Your generator is called only by this function:
generator->writeData(Cladogram * clad, OutputFile & out);
Therefore it should implement the following one:
void generatorXXX::writeData(Cladogram * clad, OutputFile & out) { ... }
The OutputFile object holds a correctly opened output file. It also holds the file name in case your generator needs it. You can use the object like this:
ofstream * fp = out.p;
// or
ofstream & f = *(out.p);
// or
ofstream myfp(out.name);
You should try to utilise as much information from the Cladogram as possible. This can be done by iterating over its data vectors:
vector<Node *> nodes
vector<Connector *> connectors
vector<Domain *> domains
vector<Image *> includeSVG
vector<Image *> includePNG
Additionally, you should strive to make use of all configuration options the Cladogram contains.
If a variable is empty, try to handle it as gracefully as possible. All measures (height, thickness, ...) are "generic units".
Example:
#include "../gnuclad.h"
#include "generatorXXX.h"
#include <iostream>
void generatorXXX::writeData(Cladogram * clad, OutputFile & out) {
Node * n;
for(int i = 0; i < (int)clad->nodes.size(); ++i) {
n = clad->nodes[i];
std::cout << "\nWe have " << n->name
<< " at offset " << n->offset;
}
std::cout << "\n\nOur end of time is "
<< Date2str(clad->endOfTime) << "\n";
std::cout << "\n\nOur background color (in hex) is "
<< clad->mainBackground.hex << "\n";
}