From aef36300cce56f2a506423a282281fc2674c788f Mon Sep 17 00:00:00 2001
From: vahrenkamp <vahrenkamp@042f3d55-54a8-47e9-b7fb-15903f145c44>
Date: Thu, 11 Oct 2012 09:04:50 +0000
Subject: [PATCH] Convenient methods

git-svn-id: http://svn.code.sf.net/p/simox/code/trunk@327 042f3d55-54a8-47e9-b7fb-15903f145c44
---
 VirtualRobot/Compression/CompressionBZip2.cpp |  2 +-
 .../CoinVisualizationFactory.cpp              | 24 +++++++++++++++++++
 .../CoinVisualizationFactory.h                |  5 ++++
 .../Visualization/VisualizationFactory.h      |  1 +
 .../Workspace/WorkspaceRepresentation.cpp     |  1 +
 VirtualRobot/XML/ObjectIO.cpp                 | 22 +++++++++++------
 VirtualRobot/XML/ObjectIO.h                   | 10 ++++++++
 VirtualRobot/XML/SceneIO.h                    |  4 ++--
 8 files changed, 59 insertions(+), 10 deletions(-)

diff --git a/VirtualRobot/Compression/CompressionBZip2.cpp b/VirtualRobot/Compression/CompressionBZip2.cpp
index 1d2f36d3f..cbdbbd8a3 100644
--- a/VirtualRobot/Compression/CompressionBZip2.cpp
+++ b/VirtualRobot/Compression/CompressionBZip2.cpp
@@ -4020,4 +4020,4 @@ bool CompressionBZip2::write(std::ostream *file, const char *value, int num)
 	return file->good();
 }
 
-} // namespace
\ No newline at end of file
+} // namespace
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
index 56728c73a..1e4987391 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
@@ -100,6 +100,30 @@ VisualizationNodePtr CoinVisualizationFactory::getVisualizationFromFile(const st
 	return visualizationNode;
 }
 
+VisualizationNodePtr CoinVisualizationFactory::getVisualizationFromFile(const std::ifstream& ifs, bool boundingBox)
+{
+	VisualizationNodePtr visualizationNode(new VisualizationNode);
+
+	// passing an empty string to SoInput and trying to open it aborts the program
+	if (!ifs)
+	{
+		std::cerr <<  "Filestream not valid" << std::endl;
+		return visualizationNode;
+	}
+	
+	// try to open the given file
+	std::ostringstream oss;
+	oss << ifs.rdbuf();
+
+	if(!ifs && !ifs.eof())
+	{
+		std::cerr <<  "Error reading filestream " << std::endl;
+		return visualizationNode;
+	}
+	std::string contents(oss.str());
+	return getVisualizationFromString(contents);
+}
+
 /**
  * This method creates a VirtualRobot::CoinVisualizationNode from a given \p modelString.
  * An instance of VirtualRobot::VisualizationNode is returned in case of an occured error.
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
index 4e18d11e5..35b1a4f22 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
@@ -41,6 +41,7 @@
 #include <boost/shared_ptr.hpp>
 
 #include <string>
+#include <fstream>
 
 namespace VirtualRobot
 {
@@ -58,6 +59,7 @@ public:
 	virtual ~CoinVisualizationFactory();
 
 	virtual VisualizationNodePtr getVisualizationFromFile(const std::string& filename, bool boundingBox = false);
+	virtual VisualizationNodePtr getVisualizationFromFile(const std::ifstream& ifs, bool boundingBox = false);
 	virtual VisualizationNodePtr getVisualizationFromString(const std::string& modelString, bool boundingBox = false);
 	virtual VisualizationNodePtr createBox(float width, float height, float depth, float colorR, float colorG, float colorB);
 	virtual VisualizationNodePtr createLine(const Eigen::Vector3f &from, const Eigen::Vector3f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f);
@@ -238,6 +240,9 @@ private:
 	static SubClassRegistry registry;
 };
 
+typedef boost::shared_ptr<CoinVisualizationFactory> CoinVisualizationFactoryPtr;
+
+
 } // namespace VirtualRobot
 
 #endif // _VirtualRobot_CoinVisualizationFactory_h_
diff --git a/VirtualRobot/Visualization/VisualizationFactory.h b/VirtualRobot/Visualization/VisualizationFactory.h
index 3bed0e11c..452440be9 100644
--- a/VirtualRobot/Visualization/VisualizationFactory.h
+++ b/VirtualRobot/Visualization/VisualizationFactory.h
@@ -59,6 +59,7 @@ public:
 	virtual ~VisualizationFactory() {;}
 
 	virtual VisualizationNodePtr getVisualizationFromFile(const std::string& filename, bool boundingBox = false){return VisualizationNodePtr();}
+	virtual VisualizationNodePtr getVisualizationFromFile(const std::ifstream& ifs, bool boundingBox = false){return VisualizationNodePtr();};
 	virtual VisualizationNodePtr createBox(float length, float height, float width, float colorR, float colorG, float colorB){return VisualizationNodePtr();}
 	virtual VisualizationNodePtr createLine(const Eigen::Vector3f &from, const Eigen::Vector3f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return VisualizationNodePtr();}
 	virtual VisualizationNodePtr createLine(const Eigen::Matrix4f &from, const Eigen::Matrix4f &to, float width = 1.0f, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f){return VisualizationNodePtr();}
diff --git a/VirtualRobot/Workspace/WorkspaceRepresentation.cpp b/VirtualRobot/Workspace/WorkspaceRepresentation.cpp
index 3ec212abb..0b30d5a07 100644
--- a/VirtualRobot/Workspace/WorkspaceRepresentation.cpp
+++ b/VirtualRobot/Workspace/WorkspaceRepresentation.cpp
@@ -204,6 +204,7 @@ void WorkspaceRepresentation::load(const std::string &filename)
 		// first check if the current version is used
 		if (version[0] != versionMajor || version[1] != versionMinor)
 		{
+            cout << "File version: " << version[0] << "." << version[1] << endl;
 			// now check if an older version is used
 			THROW_VR_EXCEPTION_IF(
 				(version[0] > 2) || 
diff --git a/VirtualRobot/XML/ObjectIO.cpp b/VirtualRobot/XML/ObjectIO.cpp
index 17e4f00af..e6755ded9 100644
--- a/VirtualRobot/XML/ObjectIO.cpp
+++ b/VirtualRobot/XML/ObjectIO.cpp
@@ -27,19 +27,27 @@ VirtualRobot::ManipulationObjectPtr ObjectIO::loadManipulationObject( const std:
 	std::ifstream in(xmlFile.c_str());
 
 	THROW_VR_EXCEPTION_IF (!in.is_open(),"Could not open XML file:" << xmlFile);
-
-	std::stringstream buffer;
-	buffer << in.rdbuf();
-	std::string objectXML(buffer.str());
+	
 	boost::filesystem::path filenameBaseComplete(xmlFile);
 	boost::filesystem::path filenameBasePath = filenameBaseComplete.branch_path();
 	std::string basePath = filenameBasePath.string();
+	VirtualRobot::ManipulationObjectPtr res = loadManipulationObject(in,basePath);
+	THROW_VR_EXCEPTION_IF (!res,"Error while parsing file " << xmlFile);
+	res->setFilename(xmlFile);
+	return res;
+}
 
-	in.close();
+VirtualRobot::ManipulationObjectPtr ObjectIO::loadManipulationObject( const std::ifstream &xmlFile, const std::string &basePath /*= ""*/ )
+{
+	// load file
+	THROW_VR_EXCEPTION_IF (!xmlFile.is_open(),"Could not open XML file");
+
+	std::stringstream buffer;
+	buffer << xmlFile.rdbuf();
+	std::string objectXML(buffer.str());
 
 	VirtualRobot::ManipulationObjectPtr res = createManipulationObjectFromString(objectXML, basePath);
-	THROW_VR_EXCEPTION_IF (!res,"Error while parsing file " << xmlFile);
-	res->setFilename(xmlFile);
+	THROW_VR_EXCEPTION_IF (!res,"Error while parsing file.");
 	return res;
 }
 
diff --git a/VirtualRobot/XML/ObjectIO.h b/VirtualRobot/XML/ObjectIO.h
index e1d737983..d537f703b 100644
--- a/VirtualRobot/XML/ObjectIO.h
+++ b/VirtualRobot/XML/ObjectIO.h
@@ -27,6 +27,8 @@
 #include "BaseIO.h"
 #include "../Scene.h"
 
+#include <fstream>
+
 // using forward declarations here, so that the rapidXML header does not have to be parsed when this file is included
 namespace rapidxml
 {
@@ -48,6 +50,14 @@ public:
         @return Returns an empty pointer, when file access failed.
 	*/
     static ManipulationObjectPtr loadManipulationObject(const std::string &xmlFile);
+    
+ 	/*!
+        Load ManipulationObject from a file stream.
+		@param xmlFile The file stream
+		@param basePath If file tags are given, the base path for searching the object files can be specified.
+        @return Returns an empty pointer, when file access failed.
+	*/
+	static ManipulationObjectPtr loadManipulationObject(const std::ifstream &xmlFile, const std::string &basePath = "");
 
 	/*!
         Save ManipulationObject to file.
diff --git a/VirtualRobot/XML/SceneIO.h b/VirtualRobot/XML/SceneIO.h
index 933ad8da9..d6a8f9d98 100644
--- a/VirtualRobot/XML/SceneIO.h
+++ b/VirtualRobot/XML/SceneIO.h
@@ -43,14 +43,14 @@ public:
 
 	/*!
         Load scene from file.
-		\param xmlFile The file
+		\param xmlFile The file.
         \return Returns an empty pointer, when file access failed.
 	*/
 	static ScenePtr loadScene(const std::string &xmlFile);
 
 	/*!
 		Save a scene to file.
-		\param s The scen to be saved.
+		\param s The scene to be saved.
 		\param xmlFile The absolute filename.
 		\return true on success.
 	*/
-- 
GitLab