-
Olivier Sallou authoredOlivier Sallou authored
0002-Fix-to-be-able-to-use-the-library-either-from-build-.patch 15.18 KiB
From a3de4582022b3e71a5ccfda7bca517af104624c7 Mon Sep 17 00:00:00 2001
From: Fabien Spindler <Fabien.Spindler@inria.fr>
Date: Sun, 15 Mar 2015 10:22:11 +0100
Subject: [PATCH 2/4] Fix to be able to use the library either from build dir
of from install dir. Now VISP_SCENES_DIR, VISP_ROBOT_ARMS_DIR,
VISP_HAVE_OGRE_PLUGINS_PATH, VISP_HAVE_OGRE_RESOURCES_PATH defined in
vpConfig.h may contain multiple path locations separated with ; character.
These locations are the one to found the resources in the build tree, and the
one to found the resources in the install tree.
---
CMakeLists.txt | 21 +++----
CMakeModules/VISPGenerateConfig.cmake | 3 -
src/robot/simulator-robot/vpSimulatorAfma6.cpp | 28 +++++++--
src/robot/simulator-robot/vpSimulatorViper850.cpp | 26 +++++++--
src/simulator/ogre-simulator/vpAROgre.cpp | 50 ++++++++++++----
.../wireframe-simulator/vpWireFrameSimulator.cpp | 13 ++++-
src/tools/io/vpIoTools.cpp | 68 ++++++++++++++++++++++
src/tools/io/vpIoTools.h | 1 +
8 files changed, 172 insertions(+), 38 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d10e231..1f129e6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2180,11 +2180,6 @@ set(VISP_ROOT_DIR_DATA_CONFIGCMAKE "${VISP_BINARY_DIR}")
SET(VISP_SCENES_DIR ${VISP_ROOT_DIR_DATA_CONFIGCMAKE}/data/wireframe-simulator)
SET(VISP_ROBOT_ARMS_DIR ${VISP_ROOT_DIR_DATA_CONFIGCMAKE}/data/robot-simulator)
-# Generate the package dependent file include/visp/vpConfig.h
-CONFIGURE_FILE(${VISP_SOURCE_DIR}/include/vpConfig.h.cmake
- ${VISP_INCLUDE_DIR}/vpConfig.h
-)
-
# case 2: when ViSP is build with make install; files are used in <install dir>
#--------------
IF(UNIX)
@@ -2193,17 +2188,23 @@ ELSE()
set(VISP_ROOT_DIR_DATA_CONFIGCMAKE "${CMAKE_INSTALL_PREFIX}")
ENDIF()
-SET(VISP_SCENES_DIR ${VISP_ROOT_DIR_DATA_CONFIGCMAKE}/data/wireframe-simulator)
-SET(VISP_ROBOT_ARMS_DIR ${VISP_ROOT_DIR_DATA_CONFIGCMAKE}/data/robot-simulator)
+list(APPEND VISP_SCENES_DIR ${VISP_ROOT_DIR_DATA_CONFIGCMAKE}/data/wireframe-simulator)
+list(APPEND VISP_ROBOT_ARMS_DIR ${VISP_ROOT_DIR_DATA_CONFIGCMAKE}/data/robot-simulator)
# Only if resources.cfg created by hand, we change the path to resources.cfg in install/vpConfig.h
if(VISP_INSTALL_DIR_OGRE_RESOURCES)
- SET(VISP_HAVE_OGRE_RESOURCES_PATH ${VISP_ROOT_DIR_DATA_CONFIGCMAKE}/data/ogre-simulator)
+ list(APPEND VISP_HAVE_OGRE_RESOURCES_PATH "${VISP_ROOT_DIR_DATA_CONFIGCMAKE}/data/ogre-simulator")
endif()
-# Only if plugins.cfg created by hand, we change the path to plugins.cfg in install/vpConfig.h
+# append to VISP_HAVE_OGRE_PLUGINS_PATH the path of the installed plugins.cfg file
+# to be able to use ViSP from build tree or install tree
if(VISP_INSTALL_DIR_OGRE_RESOURCES)
- SET(VISP_HAVE_OGRE_PLUGINS_PATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/visp/data/ogre-simulator)
+ list(APPEND VISP_HAVE_OGRE_PLUGINS_PATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/visp/data/ogre-simulator")
endif()
+# Generate the package dependent file include/visp/vpConfig.h
+CONFIGURE_FILE(${VISP_SOURCE_DIR}/include/vpConfig.h.cmake
+ ${VISP_INCLUDE_DIR}/vpConfig.h
+)
+
#----------------------------------------------------------------------
# Generate the ViSP-third-party.txt information file
#----------------------------------------------------------------------
diff --git a/CMakeModules/VISPGenerateConfig.cmake b/CMakeModules/VISPGenerateConfig.cmake
index d7d2ef5..d64c568 100755
--- a/CMakeModules/VISPGenerateConfig.cmake
+++ b/CMakeModules/VISPGenerateConfig.cmake
@@ -120,9 +120,6 @@ if(UNIX)
${VISP_BINARY_DIR}/unix-install/VISPUse.cmake
IMMEDIATE @ONLY)
- configure_file(${VISP_SOURCE_DIR}/include/vpConfig.h.cmake
- ${VISP_BINARY_DIR}/unix-install/vpConfig.h @ONLY)
-
install(FILES
${VISP_BINARY_DIR}/unix-install/VISPConfig.cmake
${VISP_BINARY_DIR}/unix-install/VISPConfigVersion.cmake
diff --git a/src/robot/simulator-robot/vpSimulatorAfma6.cpp b/src/robot/simulator-robot/vpSimulatorAfma6.cpp
index 2a38013..b794825 100644
--- a/src/robot/simulator-robot/vpSimulatorAfma6.cpp
+++ b/src/robot/simulator-robot/vpSimulatorAfma6.cpp
@@ -196,9 +196,16 @@ void
vpSimulatorAfma6::init()
{
// set arm_dir from #define VISP_ROBOT_ARMS_DIR if it exists
- if (vpIoTools::checkDirectory(VISP_ROBOT_ARMS_DIR) == true) // directory exists
- arm_dir = VISP_ROBOT_ARMS_DIR;
- else {
+ // VISP_ROBOT_ARMS_DIR may contain multiple locations separated by ";"
+ std::vector<std::string> arm_dirs = vpIoTools::splitChain(std::string(VISP_ROBOT_ARMS_DIR), std::string(";"));
+ bool armDirExists = false;
+ for(size_t i=0; i < arm_dirs.size(); i++)
+ if (vpIoTools::checkDirectory(arm_dirs[i]) == true) { // directory exists
+ arm_dir = arm_dirs[i];
+ armDirExists = true;
+ break;
+ }
+ if (! armDirExists) {
try {
arm_dir = vpIoTools::getenv("VISP_ROBOT_ARMS_DIR");
std::cout << "The simulator uses data from VISP_ROBOT_ARMS_DIR=" << arm_dir << std::endl;
@@ -2298,10 +2305,17 @@ void
vpSimulatorAfma6::initArms()
{
// set scene_dir from #define VISP_SCENE_DIR if it exists
+ // VISP_SCENES_DIR may contain multiple locations separated by ";"
std::string scene_dir_;
- if (vpIoTools::checkDirectory(VISP_SCENES_DIR) == true) // directory exists
- scene_dir_ = VISP_SCENES_DIR;
- else {
+ std::vector<std::string> scene_dirs = vpIoTools::splitChain(std::string(VISP_SCENES_DIR), std::string(";"));
+ bool sceneDirExists = false;
+ for(size_t i=0; i < scene_dirs.size(); i++)
+ if (vpIoTools::checkDirectory(scene_dirs[i]) == true) { // directory exists
+ scene_dir_ = scene_dirs[i];
+ sceneDirExists = true;
+ break;
+ }
+ if (! sceneDirExists) {
try {
scene_dir_ = vpIoTools::getenv("VISP_SCENES_DIR");
std::cout << "The simulator uses data from VISP_SCENES_DIR=" << scene_dir_ << std::endl;
@@ -2311,6 +2325,7 @@ vpSimulatorAfma6::initArms()
}
}
+
unsigned int name_length = 30; // the size of this kind of string "/afma6_arm2.bnd"
if (scene_dir_.size() > FILENAME_MAX)
throw vpException (vpException::dimensionError, "Cannot initialize Afma6 simulator");
@@ -2333,6 +2348,7 @@ vpSimulatorAfma6::initArms()
char *name_arm = new char [full_length];
strcpy(name_arm, arm_dir.c_str());
strcat(name_arm,"/afma6_gate.bnd");
+ std::cout <<"name arm: " << name_arm << std::endl;
set_scene(name_arm, robotArms, 1.0);
strcpy(name_arm, arm_dir.c_str());
strcat(name_arm,"/afma6_arm1.bnd");
diff --git a/src/robot/simulator-robot/vpSimulatorViper850.cpp b/src/robot/simulator-robot/vpSimulatorViper850.cpp
index 9286b2a..85ea1c0 100644
--- a/src/robot/simulator-robot/vpSimulatorViper850.cpp
+++ b/src/robot/simulator-robot/vpSimulatorViper850.cpp
@@ -195,9 +195,16 @@ void
vpSimulatorViper850::init()
{
// set arm_dir from #define VISP_ROBOT_ARMS_DIR if it exists
- if (vpIoTools::checkDirectory(VISP_ROBOT_ARMS_DIR) == true) // directory exists
- arm_dir = VISP_ROBOT_ARMS_DIR;
- else {
+ // VISP_ROBOT_ARMS_DIR may contain multiple locations separated by ";"
+ std::vector<std::string> arm_dirs = vpIoTools::splitChain(std::string(VISP_ROBOT_ARMS_DIR), std::string(";"));
+ bool armDirExists = false;
+ for(size_t i=0; i < arm_dirs.size(); i++)
+ if (vpIoTools::checkDirectory(arm_dirs[i]) == true) { // directory exists
+ arm_dir = arm_dirs[i];
+ armDirExists = true;
+ break;
+ }
+ if (! armDirExists) {
try {
arm_dir = vpIoTools::getenv("VISP_ROBOT_ARMS_DIR");
std::cout << "The simulator uses data from VISP_ROBOT_ARMS_DIR=" << arm_dir << std::endl;
@@ -2290,10 +2297,17 @@ void
vpSimulatorViper850::initArms()
{
// set scene_dir from #define VISP_SCENE_DIR if it exists
+ // VISP_SCENES_DIR may contain multiple locations separated by ";"
std::string scene_dir_;
- if (vpIoTools::checkDirectory(VISP_SCENES_DIR) == true) // directory exists
- scene_dir_ = VISP_SCENES_DIR;
- else {
+ std::vector<std::string> scene_dirs = vpIoTools::splitChain(std::string(VISP_SCENES_DIR), std::string(";"));
+ bool sceneDirExists = false;
+ for(size_t i=0; i < scene_dirs.size(); i++)
+ if (vpIoTools::checkDirectory(scene_dirs[i]) == true) { // directory exists
+ scene_dir_ = scene_dirs[i];
+ sceneDirExists = true;
+ break;
+ }
+ if (! sceneDirExists) {
try {
scene_dir_ = vpIoTools::getenv("VISP_SCENES_DIR");
std::cout << "The simulator uses data from VISP_SCENES_DIR=" << scene_dir_ << std::endl;
diff --git a/src/simulator/ogre-simulator/vpAROgre.cpp b/src/simulator/ogre-simulator/vpAROgre.cpp
index 074a0e6..52400ac 100644
--- a/src/simulator/ogre-simulator/vpAROgre.cpp
+++ b/src/simulator/ogre-simulator/vpAROgre.cpp
@@ -222,14 +222,31 @@ void vpAROgre::init(bool
)
{
// Create the root
+ // mPluginsPath may contain more than one folder location separated by ";"
+ bool pluginsFileExists = false;
+ std::string pluginFile;
+ std::vector<std::string> plugingsPaths = vpIoTools::splitChain(std::string(mPluginsPath), std::string(";"));
+ for (size_t i=0; i<plugingsPaths.size(); i++) {
#if defined(NDEBUG) || !defined(_WIN32)
- std::string pluginFile = mPluginsPath+"/plugins.cfg";
+ pluginFile = plugingsPaths[i]+"/plugins.cfg";
#else
- std::string pluginFile = mPluginsPath+"/plugins_d.cfg";
+ pluginFile = plugingsPaths[i]+"/plugins_d.cfg";
#endif
- if(!vpIoTools::checkFilename(pluginFile)){
- std::string errorMsg = "Error: the requested plugins file \""
- + pluginFile + "\" doesn't exist.";
+
+ if(vpIoTools::checkFilename(pluginFile)) {
+ pluginsFileExists = true;
+ break;
+ }
+ }
+ if (! pluginsFileExists) {
+ std::string errorMsg = std::string("Error: the requested plugins file \"")
+#if defined(NDEBUG) || !defined(_WIN32)
+ + std::string("plugins.cfg")
+#else
+ + std::string("plugins_d.cfg")
+#endif
+ + std::string("\" doesn't exist in ")
+ + std::string(mPluginsPath);
std::cout << errorMsg << std::endl;
throw (vpException(vpException::ioError, errorMsg));
@@ -251,16 +268,29 @@ void vpAROgre::init(bool
// [General]
// FileSystem=media/
// Zip=packages/level1.zip
- Ogre::ConfigFile cf;
- std::string resourceFile = mResourcePath+"/resources.cfg";
- if(!vpIoTools::checkFilename(resourceFile)){
- std::string errorMsg = "Error: the requested resource file \""
- + resourceFile + "\" doesn't exist.";
+
+ // mResourcePath may contain more than one folder location separated by ";"
+ bool resourcesFileExists = false;
+ std::string resourceFile;
+ std::vector<std::string> resourcesPaths = vpIoTools::splitChain(std::string(mResourcePath), std::string(";"));
+ for (size_t i=0; i<resourcesPaths.size(); i++) {
+ resourceFile = resourcesPaths[i]+"/resources.cfg";
+ if(vpIoTools::checkFilename(resourceFile)) {
+ resourcesFileExists = true;
+ break;
+ }
+ }
+ if (! resourcesFileExists) {
+ std::string errorMsg = std::string("Error: the requested resource file \"resources.cfg\"")
+ + std::string("doesn't exist in ")
+ + std::string(mResourcePath);
+
std::cout << errorMsg << std::endl;
throw (vpException(vpException::ioError, errorMsg));
}
std::cout << "######################### Load resource file: " << resourceFile << std::endl;
+ Ogre::ConfigFile cf;
cf.load(resourceFile);
// Go through all sections & settings in the file
diff --git a/src/simulator/wireframe-simulator/vpWireFrameSimulator.cpp b/src/simulator/wireframe-simulator/vpWireFrameSimulator.cpp
index e5e38dd..e015dab 100644
--- a/src/simulator/wireframe-simulator/vpWireFrameSimulator.cpp
+++ b/src/simulator/wireframe-simulator/vpWireFrameSimulator.cpp
@@ -522,9 +522,16 @@ vpWireFrameSimulator::vpWireFrameSimulator()
cameraFactor(1.), camTrajType(CT_LINE), extCamChanged(false), rotz(), thickness_(1), scene_dir()
{
// set scene_dir from #define VISP_SCENE_DIR if it exists
- if (vpIoTools::checkDirectory(VISP_SCENES_DIR) == true) // directory exists
- scene_dir = VISP_SCENES_DIR;
- else {
+ // VISP_SCENES_DIR may contain multiple locations separated by ";"
+ std::vector<std::string> scene_dirs = vpIoTools::splitChain(std::string(VISP_SCENES_DIR), std::string(";"));
+ bool sceneDirExists = false;
+ for(size_t i=0; i < scene_dirs.size(); i++)
+ if (vpIoTools::checkDirectory(scene_dirs[i]) == true) { // directory exists
+ scene_dir = scene_dirs[i];
+ sceneDirExists = true;
+ break;
+ }
+ if (! sceneDirExists) {
try {
scene_dir = vpIoTools::getenv("VISP_SCENES_DIR");
std::cout << "The simulator uses data from VISP_SCENES_DIR=" << scene_dir << std::endl;
diff --git a/src/tools/io/vpIoTools.cpp b/src/tools/io/vpIoTools.cpp
index ae85396..5ccc1a8 100644
--- a/src/tools/io/vpIoTools.cpp
+++ b/src/tools/io/vpIoTools.cpp
@@ -1405,3 +1405,71 @@ std::pair<std::string, std::string> vpIoTools::splitDrive(const std::string& pat
return std::pair<std::string, std::string>("", pathname);
#endif
}
+
+/*!
+ Split a chain.
+ \param chain : Input chain to split.
+ \param sep : Character separator.
+ \return A vector that contains all the subchains.
+
+ The following code shows how to use this function:
+ \code
+#include <visp/vpIoTools.h>
+
+int main()
+{
+ {
+ std::string chain("/home/user;/usr/local/include;/usr/include");
+ std::string sep = ";";
+
+ std::vector<std::string> subChain = vpIoTools::splitChain(chain, sep);
+ std::cout << "Found the following subchains: " << std::endl;
+ for (size_t i=0; i < subChain.size(); i++)
+ std::cout << subChain[i] << std::endl;
+ }
+
+ {
+ std::string chain("This is an other example");
+ std::string sep = " ";
+
+ std::vector<std::string> subChain = vpIoTools::splitChain(chain, sep);
+ std::cout << "Found the following subchains: " << std::endl;
+ for (size_t i=0; i < subChain.size(); i++)
+ std::cout << subChain[i] << std::endl;
+ }
+}
+ \endcode
+
+ It produces the following output:
+ \code
+Found the following subchains:
+/home/user
+/usr/local/include
+/usr/include
+Found the following subchains:
+This
+is
+an
+other
+example
+ \endcode
+ */
+std::vector<std::string> vpIoTools::splitChain(const std::string & chain, const std::string & sep)
+{
+ size_t startIndex = 0;
+
+ std::string chainToSplit = chain;
+ std::vector<std::string> subChain;
+ size_t sepIndex = chainToSplit.find(sep);
+
+ while(sepIndex != std::string::npos) {
+
+ subChain.push_back( chainToSplit.substr(startIndex, sepIndex) );
+ chainToSplit = chainToSplit.substr(sepIndex+1, chain.size()-1);
+
+ sepIndex = chainToSplit.find(sep);
+ }
+ subChain.push_back(chainToSplit);
+
+ return subChain;
+}
diff --git a/src/tools/io/vpIoTools.h b/src/tools/io/vpIoTools.h
index 7d7ef70..38ac58a 100644
--- a/src/tools/io/vpIoTools.h
+++ b/src/tools/io/vpIoTools.h
@@ -195,6 +195,7 @@ public:
static std::string createFilePath(const std::string& parent, const std::string child);
static bool isAbsolutePathname(const std::string& pathname);
static std::pair<std::string, std::string> splitDrive(const std::string& pathname);
+ static std::vector<std::string> splitChain(const std::string & chain, const std::string & sep);
// read configuration file
static bool loadConfigFile(const std::string &confFile);
--
2.1.4