Field3D
main.cpp File Reference
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <fnmatch.h>
#include <boost/program_options.hpp>
#include <boost/foreach.hpp>
#include <Field3D/DenseField.h>
#include <Field3D/MACField.h>
#include <Field3D/SparseField.h>
#include <Field3D/InitIO.h>
#include <Field3D/Field3DFile.h>

Go to the source code of this file.

Functions

int main (int argc, char **argv)
bool matchString (const std::string &str, const vector< string > &patterns)
 Pattern matching used for field names and attributes.
Options parseOptions (int argc, char **argv)
 Parses command line options, puts them in Options struct.
template<typename Data_T >
void printFieldInfo (typename Field< Data_T >::Ptr field, const Options &options)
 Prints the information about a single field.
void printFileInfo (const std::string &filename, const Options &options)
 Prints information about all fields in file.
template<typename T >
void printMap (const map< string, T > m, const string &indent)
 Prints a std::map. Used for metadata. Called from printFieldInfo.
void printMapping (FieldMapping::Ptr mapping)
 Prints information about a mapping. Called from printFieldInfo.

Function Documentation

Options parseOptions ( int  argc,
char **  argv 
)

Parses command line options, puts them in Options struct.

Definition at line 110 of file main.cpp.

Referenced by main().

{
  namespace po = boost::program_options;

  Options options;

  po::options_description desc("Available options");

  desc.add_options()
    ("help", "Display help")
    ("input-file", po::value<vector<string> >(), "Input files")
    ("name,n", po::value<vector<string> >(), "Load field(s) by name")
    ("attribute,a", po::value<vector<string> >(), "Load field(s) by attribute")
    ;
  
  po::variables_map vm;
  po::store(po::parse_command_line(argc, argv, desc), vm);
  po::notify(vm);    
  
  po::positional_options_description p;
  p.add("input-file", -1);
  
  po::store(po::command_line_parser(argc, argv).
            options(desc).positional(p).run(), vm);
  po::notify(vm);
  
  if (vm.count("help")) {
    cout << desc << endl;
    exit(0);
  }

  if (vm.count("input-file"))
  {
    options.inputFiles = vm["input-file"].as<std::vector<std::string> >();
  }
  if (vm.count("name"))
  {
    options.names = vm["name"].as<std::vector<std::string> >();
  }
  if (vm.count("attribute"))
  {
    options.attributes = vm["attribute"].as<std::vector<std::string> >();
  }

  return options;
}
void printFileInfo ( const std::string &  filename,
const Options &  options 
)

Prints information about all fields in file.

Definition at line 248 of file main.cpp.

References FieldMetadata< CallBack_T >::floatMetadata(), Field3DFileBase::getPartitionNames(), Field3DFileBase::getScalarLayerNames(), Field3DFileBase::getVectorLayerNames(), half, FieldMetadata< CallBack_T >::intMetadata(), matchString(), Field3DFileBase::metadata(), Field3DInputFile::open(), printMap(), Field3DInputFile::readScalarLayers(), Field3DInputFile::readVectorLayers(), FieldMetadata< CallBack_T >::strMetadata(), FieldMetadata< CallBack_T >::vecFloatMetadata(), and FieldMetadata< CallBack_T >::vecIntMetadata().

Referenced by main().

{
  typedef Field3D::half half;

  Field3DInputFile in;

  if (!in.open(filename)) {
    cout << "Error: Couldn't open f3d file: " << filename << endl;
    exit(1);
  }

  cout << "Field3D file: " << filename << endl;

  vector<string> partitions;
  in.getPartitionNames(partitions);

  BOOST_FOREACH (const string &partition, partitions) {

    if (!matchString(partition, options.names)) {
      continue;
    }

    vector<string> scalarLayers, vectorLayers;
    in.getScalarLayerNames(scalarLayers, partition);
    in.getVectorLayerNames(vectorLayers, partition);

    BOOST_FOREACH (const string &scalarLayer, scalarLayers) {

      if (!matchString(scalarLayer, options.attributes)) {
        continue;
      }  

      Field<half>::Vec hScalarFields = 
        in.readScalarLayers<half>(partition, scalarLayer);
      BOOST_FOREACH (Field<half>::Ptr field, hScalarFields) {
        printFieldInfo<half>(field, options);
      }

      Field<float>::Vec fScalarFields = 
        in.readScalarLayers<float>(partition, scalarLayer);
      BOOST_FOREACH (Field<float>::Ptr field, fScalarFields) {
        printFieldInfo<float>(field, options);
      }

      Field<double>::Vec dScalarFields = 
        in.readScalarLayers<double>(partition, scalarLayer);
      BOOST_FOREACH (Field<double>::Ptr field, dScalarFields) {
        printFieldInfo<double>(field, options);
      }

    }

    BOOST_FOREACH (const string &vectorLayer, vectorLayers) {
      
      if (!matchString(vectorLayer, options.attributes)) {
        continue;
      }  

      Field<V3h>::Vec hVectorFields = 
        in.readVectorLayers<half>(partition, vectorLayer);
      BOOST_FOREACH (Field<V3h>::Ptr field, hVectorFields) {
        printFieldInfo<V3h>(field, options);
      }

      Field<V3f>::Vec fVectorFields = 
        in.readVectorLayers<float>(partition, vectorLayer);
      BOOST_FOREACH (Field<V3f>::Ptr field, fVectorFields) {
        printFieldInfo<V3f>(field, options);
      }

      Field<V3d>::Vec dVectorFields = 
        in.readVectorLayers<double>(partition, vectorLayer);
      BOOST_FOREACH (Field<V3d>::Ptr field, dVectorFields) {
        printFieldInfo<V3d>(field, options);
      }

    }
  }

  cout << "  Global metadata" << endl;

  cout << "    Int metadata:" << endl;
  printMap(in.metadata().intMetadata(), "      ");
  cout << "    Float metadata:" << endl;
  printMap(in.metadata().floatMetadata(), "      ");
  cout << "    V3i metadata:" << endl;
  printMap(in.metadata().vecIntMetadata(), "      ");
  cout << "    V3f metadata:" << endl;
  printMap(in.metadata().vecFloatMetadata(), "      ");
  cout << "    String metadata:" << endl;
  printMap(in.metadata().strMetadata(), "      ");

}
template<typename Data_T >
void printFieldInfo ( typename Field< Data_T >::Ptr  field,
const Options &  options 
)

Prints the information about a single field.

Definition at line 201 of file main.cpp.

References FieldBase::attribute, FieldBase::className(), Field< Data_T >::dataTypeString(), FieldRes::dataWindow(), FieldRes::extents(), FieldMetadata< CallBack_T >::floatMetadata(), FieldMetadata< CallBack_T >::intMetadata(), FieldRes::mapping(), FieldBase::metadata(), FieldBase::name, printMap(), printMapping(), FieldMetadata< CallBack_T >::strMetadata(), FieldMetadata< CallBack_T >::vecFloatMetadata(), and FieldMetadata< CallBack_T >::vecIntMetadata().

{
  Box3i dataWindow = field->dataWindow();
  Box3i extents = field->extents();

  cout << "  Field: " << endl
       << "    Name:        " << field->name << endl
       << "    Attribute:   " << field->attribute << endl
       << "    Field type:  " << field->className() << endl
       << "    Data type:   " << field->dataTypeString() << endl
       << "    Extents:     " << extents.min << " " << extents.max << endl
       << "    Data window: " << dataWindow.min << " " << dataWindow.max << endl;

  printMapping(field->mapping());

  cout << "    Int metadata:" << endl;
  printMap(field->metadata().intMetadata(), "      ");
  cout << "    Float metadata:" << endl;
  printMap(field->metadata().floatMetadata(), "      ");
  cout << "    V3i metadata:" << endl;
  printMap(field->metadata().vecIntMetadata(), "      ");
  cout << "    V3f metadata:" << endl;
  printMap(field->metadata().vecFloatMetadata(), "      ");
  cout << "    String metadata:" << endl;
  printMap(field->metadata().strMetadata(), "      ");
}
template<typename T >
void printMap ( const map< string, T >  m,
const string &  indent 
)

Prints a std::map. Used for metadata. Called from printFieldInfo.

Definition at line 160 of file main.cpp.

Referenced by printFieldInfo(), and printFileInfo().

{
  typedef pair<string, T> KeyValuePair;

  if (m.size() == 0) {
    cout << indent << "None" <<  endl;
  }

  BOOST_FOREACH(const KeyValuePair &i, m) {
    cout << indent << i.first << " : " << i.second << endl;
  }
}
void printMapping ( FieldMapping::Ptr  mapping)

Prints information about a mapping. Called from printFieldInfo.

Definition at line 175 of file main.cpp.

References MatrixFieldMapping::localToWorld().

Referenced by printFieldInfo().

{
  cout << "    Mapping:" << endl;
  cout << "      Type: " << mapping->className() << endl;

  // In the case of a MatrixFieldMapping, we print the local to world matrix.

  MatrixFieldMapping::Ptr matrixMapping = 
    boost::dynamic_pointer_cast<MatrixFieldMapping>(mapping);

  if (matrixMapping) {
    M44d m = matrixMapping->localToWorld();
    cout << "      Local to world transform:" << endl;
    for (int j = 0; j < 4; ++j) {
      cout << "        ";
      for (int i = 0; i < 4; ++i) {
        cout << m[i][j] << " ";
      }
      cout << endl;
    }
  }
}
bool matchString ( const std::string &  str,
const vector< string > &  patterns 
)

Pattern matching used for field names and attributes.

Definition at line 230 of file main.cpp.

Referenced by printFileInfo().

{
  // If patterns is empty all strings match
  if (patterns.size() == 0) {
    return true;
  }
  // Check all patterns
  BOOST_FOREACH (const string &pattern, patterns) {
    if (fnmatch(pattern.c_str(), str.c_str(), 0) != FNM_NOMATCH) {
      return true;
    }
  }
  // If no pattern matched return false
  return false;
}
int main ( int  argc,
char **  argv 
)

Definition at line 97 of file main.cpp.

References initIO(), parseOptions(), and printFileInfo().

{
  Field3D::initIO();

  Options options = parseOptions(argc, argv);

  BOOST_FOREACH (const string &file, options.inputFiles) {
    printFileInfo(file, options);
  }
}