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;