diff --git a/g2o/apps/g2o_viewer/main_window.cpp b/g2o/apps/g2o_viewer/main_window.cpp index 444292b0b..5be7074d9 100644 --- a/g2o/apps/g2o_viewer/main_window.cpp +++ b/g2o/apps/g2o_viewer/main_window.cpp @@ -228,11 +228,17 @@ void MainWindow::updateDisplayedSolvers() bool MainWindow::load(const QString& filename) { - ifstream ifs(filename.toStdString().c_str()); - if (! ifs) - return false; viewer->graph->clear(); - bool loadStatus = viewer->graph->load(ifs); + bool loadStatus = false; + if (filename == "-") { + cerr << "reading stdin" << endl; + loadStatus = viewer->graph->load(cin); + } else { + ifstream ifs(filename.toStdString().c_str()); + if (! ifs) + return false; + loadStatus = viewer->graph->load(ifs); + } if (! loadStatus) return false; _lastSolver = -1; diff --git a/g2o/apps/g2o_viewer/run_g2o_viewer.cpp b/g2o/apps/g2o_viewer/run_g2o_viewer.cpp index 979e2705d..23876d760 100644 --- a/g2o/apps/g2o_viewer/run_g2o_viewer.cpp +++ b/g2o/apps/g2o_viewer/run_g2o_viewer.cpp @@ -52,6 +52,8 @@ class SleepThread : public QThread int RunG2OViewer::run(int argc, char** argv, CommandArgs& arg) { std::string inputFilename; + std::string loadLookup; + arg.param("renameTypes", loadLookup, "", "create a lookup for loading types into other types,\n\t TAG_IN_FILE=INTERNAL_TAG_FOR_TYPE,TAG2=INTERNAL2\n\t e.g., VERTEX_CAM=VERTEX_SE3:EXPMAP"); arg.paramLeftOver("graph-input", inputFilename, "", "graph file which will be processed", true); arg.parseArgs(argc, argv); @@ -65,6 +67,10 @@ int RunG2OViewer::run(int argc, char** argv, CommandArgs& arg) // setting up the optimizer SparseOptimizer* optimizer = new SparseOptimizer(); + // Loading the input data + if (loadLookup.size() > 0) { + optimizer->setRenamedTypesFromString(loadLookup); + } mw.viewer->graph = optimizer; // set up the GUI action diff --git a/g2o/core/factory.h b/g2o/core/factory.h index 85180564f..400bf1c08 100644 --- a/g2o/core/factory.h +++ b/g2o/core/factory.h @@ -136,7 +136,8 @@ namespace g2o { #ifdef G2O_DEBUG_FACTORY std::cout << __FUNCTION__ << ": Registering " << _name << " of type " << typeid(T).name() << std::endl; #endif - Factory::instance()->registerType(_name, new HyperGraphElementCreator()); + _creator = new HyperGraphElementCreator(); + Factory::instance()->registerType(_name, _creator); } ~RegisterTypeProxy() @@ -145,10 +146,12 @@ namespace g2o { std::cout << __FUNCTION__ << ": Unregistering " << _name << " of type " << typeid(T).name() << std::endl; #endif Factory::instance()->unregisterType(_name); + delete _creator; } private: std::string _name; + HyperGraphElementCreator* _creator; }; #if defined _MSC_VER && defined G2O_SHARED_LIBS diff --git a/g2o/core/hyper_graph_action.cpp b/g2o/core/hyper_graph_action.cpp index a7fea30bd..667bd375c 100644 --- a/g2o/core/hyper_graph_action.cpp +++ b/g2o/core/hyper_graph_action.cpp @@ -159,9 +159,10 @@ namespace g2o { HyperGraphActionLibrary::~HyperGraphActionLibrary() { - for (HyperGraphElementAction::ActionMap::iterator it = _actionMap.begin(); it != _actionMap.end(); ++it) { - delete it->second; - } + // memory is freed by Proxy + //for (HyperGraphElementAction::ActionMap::iterator it = _actionMap.begin(); it != _actionMap.end(); ++it) { + //delete it->second; + //} } HyperGraphElementAction* HyperGraphActionLibrary::actionByName(const std::string& name) diff --git a/g2o/core/optimizable_graph.cpp b/g2o/core/optimizable_graph.cpp index f8e0ff8b7..75bb4ffe8 100644 --- a/g2o/core/optimizable_graph.cpp +++ b/g2o/core/optimizable_graph.cpp @@ -370,7 +370,7 @@ void OptimizableGraph::discardTop(HyperGraph::VertexSet& vset) } } - void OptimizableGraph::setFixed(HyperGraph::VertexSet& vset, bool fixed) +void OptimizableGraph::setFixed(HyperGraph::VertexSet& vset, bool fixed) { for (HyperGraph::VertexSet::iterator it=vset.begin(); it!=vset.end(); ++it) { OptimizableGraph::Vertex* v = static_cast(*it); @@ -378,17 +378,8 @@ void OptimizableGraph::discardTop(HyperGraph::VertexSet& vset) } } - bool OptimizableGraph::load(istream& is, bool createEdges) { - // scna for the paramers in the whole file - if (!_parameters.read(is,&_renamedTypesLookup)) - return false; -#ifndef NDEBUG - cerr << "Loaded " << _parameters.size() << " parameters" << endl; -#endif - is.clear(); - is.seekg(ios_base::beg); set warnedUnknownTypes; stringstream currentLine; string token; @@ -398,7 +389,10 @@ bool OptimizableGraph::load(istream& is, bool createEdges) elemBitset[HyperGraph::HGET_PARAMETER] = 1; elemBitset.flip(); - HyperGraph::DataContainer* previousDataContainer = 0; + HyperGraph::GraphElemBitset elemParamBitset; + elemParamBitset[HyperGraph::HGET_PARAMETER] = 1; + + HyperGraph::DataContainer* previousDataContainer = 0; Data* previousData = 0; int lineNumber = 0; @@ -450,6 +444,26 @@ bool OptimizableGraph::load(istream& is, bool createEdges) continue; } + // first handle the parameters + HyperGraph::HyperGraphElement* pelement = factory->construct(token, elemParamBitset); + if (pelement) { // not a parameter or otherwise unknown tag + assert(pelement->elementType() == HyperGraph::HGET_PARAMETER && "Should be a param"); + Parameter* p = static_cast(pelement); + int pid; + currentLine >> pid; + p->setId(pid); + bool r = p->read(currentLine); + if (! r) { + cerr << __PRETTY_FUNCTION__ << ": Error reading data " << token << " for parameter " << pid << endl; + delete p; + } else { + if (! _parameters.addParameter(p) ){ + cerr << __PRETTY_FUNCTION__ << ": Parameter of type:" << token << " id:" << pid << " already defined" << endl; + } + } + continue; + } + HyperGraph::HyperGraphElement* element = factory->construct(token, elemBitset); if (dynamic_cast(element)) { // it's a vertex type //cerr << "it is a vertex" << endl; @@ -623,6 +637,10 @@ bool OptimizableGraph::load(istream& is, bool createEdges) } } // while read line +#ifndef NDEBUG + cerr << "Loaded " << _parameters.size() << " parameters" << endl; +#endif + return true; } @@ -646,6 +664,7 @@ bool OptimizableGraph::save(const char* filename, int level) const bool OptimizableGraph::save(ostream& os, int level) const { + // write the parameters to the top of the file if (! _parameters.write(os)) return false; set verticesToSave;