44 #include <Cleaver/Cleaver.h>    45 #include <Cleaver/InverseField.h>    46 #include <Cleaver/SizingFieldCreator.h>    47 #include <NRRDTools.h>    49 #include <boost/program_options.hpp>    60 const std::string kDefaultOutputName   = 
"sizingfield";
    62 const double kDefaultScale = 2.0;
    63 const double kDefaultLipschitz = 0.2;
    64 const double kDefaultMultiplier = 1.0;
    65 const int    kDefaultPadding = 0;
    67 const std::string kDefaultScaleString = 
"2.0";
    68 const std::string kDefaultLipschitzString = 
"0.2";
    69 const std::string kDefaultMultiplierString = 
"1.0";
    71 namespace po = boost::program_options;
    74 int main(
int argc,  
char* argv[])
    77     std::vector<std::string> material_fields;
    78     std::string output_path = kDefaultOutputName;
    79     double scale      = kDefaultScale;
    80     double lipschitz  = kDefaultLipschitz;
    81     double multiplier = kDefaultMultiplier;
    82     int    padding    = kDefaultPadding;
    88         po::options_description description(
"Command line flags");
    89         description.add_options()
    90                 (
"help,h", 
"display help message")
    91                 (
"verbose,v", 
"enable verbose output")
    92                 (
"version", 
"display version information")
    93                 (
"material_fields", po::value<std::vector<std::string> >()->multitoken(), 
"material field paths")
    94                 (
"grading", po::value<double>(&lipschitz)->default_value(kDefaultLipschitz, kDefaultLipschitzString), 
"sizing field grading")
    95                 (
"multiplier", po::value<double>(&multiplier)->default_value(kDefaultMultiplier), 
"sizing field multiplier")
    96                 (
"scale", po::value<double>(&scale)->default_value(kDefaultScale), 
"sizing field scale")
    97                 (
"output", po::value<std::string>()->default_value(kDefaultOutputName, 
"sizingfield"), 
"output path")
    98                 (
"padding", po::value<int>()->default_value(kDefaultPadding), 
"padding")
   101         boost::program_options::variables_map variables_map;
   102         boost::program_options::store(boost::program_options::parse_command_line(argc, argv, description), variables_map);
   103         boost::program_options::notify(variables_map);
   106         if (variables_map.count(
"version")) {
   107             std::cout << cleaver::Version << std::endl;
   111         else if (variables_map.count(
"help") || (argc ==1)) {
   112             std::cout << description << std::endl;
   117         if (variables_map.count(
"verbose")) {
   122         if (variables_map.count(
"material_fields")) {
   123             material_fields = variables_map[
"material_fields"].as<std::vector<std::string> >();
   124             int file_count = material_fields.size();
   127             std::cout << 
"Error: At least one material field file must be specified." << std::endl;
   132         if (variables_map.count(
"output")) {
   133             output_path = variables_map[
"output"].as<std::string>();
   136     catch (std::exception& e) {
   137         std::cerr << 
"Error: " << e.what() << std::endl;
   141         std::cerr << 
"Unhandled exception caught. Terminating." << std::endl;
   148     std::cout << 
" Loading input fields:" << std::endl;
   149     for (
size_t i=0; i < material_fields.size(); i++) {
   150         std::cout << 
" - " << material_fields[i] << std::endl;
   153     std::vector<cleaver::AbstractScalarField*> fields = NRRDTools::loadNRRDFiles(material_fields);
   155         std::cerr << 
"Failed to load image data. Terminating." << std::endl;
   158     else if(fields.size() == 1) {
   168             cleaver::SizingFieldCreator::createSizingFieldFromVolume(
   170                 (
float)(1.0/lipschitz),
   179     std::cout << 
" Writing sizing field to file: " << output_path << 
".nrrd" << std::endl;  
   180     NRRDTools::saveNRRDFile(sizingField, output_path);
   184     std::cout << 
" Done." << std::endl;