#include <visp3/core/vpConfig.h>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <visp3/gui/vpDisplayD3D.h>
#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayGTK.h>
#include <visp3/gui/vpDisplayOpenCV.h>
#include <visp3/gui/vpDisplayX.h>
#include <visp3/io/vpParseArgv.h>
#include <visp3/core/vpHomogeneousMatrix.h>
#include <visp3/core/vpImage.h>
#include <visp3/core/vpPoseVector.h>
#include <visp3/ustk_needle_modeling/usNeedleInsertionModelRayleighRitzSpline.h>
#include <visp3/ustk_needle_modeling/usNeedleModelingDisplayTools.h>
#define GETOPTARGS "hlt:cd"
typedef enum { vpX11, vpGTK, vpGDI, vpD3D, vpCV } vpDisplayType;
void usage(const char *name, const char *badparam, vpDisplayType &dtype);
bool getOptions(int argc, const char **argv, vpDisplayType &dtype, bool &list, bool &display);
void usage(const char *name, const char *badparam, vpDisplayType &dtype)
{
fprintf(stdout, "\n\
Test the class usNeedleInsertionModelRayleighRitzSpline.\n\
\n\
SYNOPSIS\n\
%s [-t <type of video device>] [-l] [-d] [-h]\n\
", name);
switch (dtype) {
case vpX11:
break;
case vpGTK:
break;
case vpGDI:
break;
case vpD3D:
break;
case vpCV:
break;
}
fprintf(stdout, "\n\
OPTIONS: Default\n\
\n\
-t <type of video device> \"%s\"\n\
String specifying the video device to use.\n\
Possible values:\n\
\"X11\": only on UNIX platforms,\n\
\"GTK\": on all plaforms,\n\
\"GDI\": only on Windows platform (Graphics Device Interface),\n\
\"D3D\": only on Windows platform (Direct3D).\n\
\"CV\" : (OpenCV).\n\
\n\
-l\n\
Print the list of video-devices available and exit.\n\
\n\
-d \n\
Turn off the display.\n\
\n\
-h\n\
Print the help.\n\n",
display.c_str());
if (badparam)
fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
}
bool getOptions(int argc, const char **argv, vpDisplayType &dtype, bool &list, bool &display)
{
const char *optarg_;
int c;
std::string sDisplayType;
while((c = vpParseArgv::parse(argc, argv, GETOPTARGS, &optarg_)) > 1)
{
switch (c)
{
case 'l':
list = true;
break;
case 't':
sDisplayType = optarg_;
if(sDisplayType.compare("X11") == 0) dtype = vpX11;
else if (sDisplayType.compare("GTK") == 0) dtype = vpGTK;
else if (sDisplayType.compare("GDI") == 0) dtype = vpGDI;
else if (sDisplayType.compare("D3D") == 0) dtype = vpD3D;
else if (sDisplayType.compare("CV") == 0) dtype = vpCV;
break;
case 'h':
usage(argv[0], NULL, dtype);
return false;
break;
case 'c':
break;
case 'd':
break;
default:
usage(argv[0], optarg_, dtype);
return false;
break;
}
}
if((c == 1) || (c == -1))
{
usage(argv[0], NULL, dtype);
std::cerr << "ERROR: " << std::endl;
std::cerr << " Bad argument " << optarg_ << std::endl << std::endl;
return false;
}
return true;
}
int main(int argc, const char **argv)
{
bool opt_list = false;
vpDisplayType opt_dtype;
bool opt_display = true;
#if defined VISP_HAVE_GTK
opt_dtype = vpGTK;
#elif defined VISP_HAVE_X11
opt_dtype = vpX11;
#elif defined VISP_HAVE_GDI
opt_dtype = vpGDI;
#elif defined VISP_HAVE_D3D9
opt_dtype = vpD3D;
#elif defined VISP_HAVE_OPENCV
opt_dtype = vpCV;
#endif
if(!getOptions(argc, argv, opt_dtype, opt_list, opt_display)) exit(-1);
if (opt_list) {
unsigned nbDevices = 0;
std::cout << "List of video-devices available: \n";
#if defined VISP_HAVE_GTK
std::cout << " GTK (use \"-t GTK\" option to use it)\n";
nbDevices++;
#endif
#if defined VISP_HAVE_X11
std::cout << " X11 (use \"-t X11\" option to use it)\n";
nbDevices++;
#endif
#if defined VISP_HAVE_GDI
std::cout << " GDI (use \"-t GDI\" option to use it)\n";
nbDevices++;
#endif
#if defined VISP_HAVE_D3D9
std::cout << " D3D (use \"-t D3D\" option to use it)\n";
nbDevices++;
#endif
#if defined VISP_HAVE_OPENCV
std::cout << " CV (use \"-t CV\" option to use it)\n";
nbDevices++;
#endif
if (!nbDevices) {
std::cout << " No display is available\n";
}
return (0);
}
vpImage<unsigned char> I(700, 500, 255);
if(opt_display)
{
switch (opt_dtype)
{
case vpX11:
std::cout << "Requested X11 display functionnalities..." << std::endl;
#if defined VISP_HAVE_X11
#else
std::cout << " Sorry, X11 video device is not available.\n";
std::cout << "Use \"" << argv[0] << " -l\" to print the list of available devices.\n";
return 0;
#endif
break;
case vpGTK:
std::cout << "Requested GTK display functionnalities..." << std::endl;
#if defined VISP_HAVE_GTK
#else
std::cout << " Sorry, GTK video device is not available.\n";
std::cout << "Use \"" << argv[0] << " -l\" to print the list of available devices.\n";
return 0;
#endif
break;
case vpGDI:
std::cout << "Requested GDI display functionnalities..." << std::endl;
#if defined VISP_HAVE_GDI
#else
std::cout << " Sorry, GDI video device is not available.\n";
std::cout << "Use \"" << argv[0] << " -l\" to print the list of available devices.\n";
return 0;
#endif
break;
case vpD3D:
std::cout << "Requested D3D display functionnalities..." << std::endl;
#if defined VISP_HAVE_D3D9
#else
std::cout << " Sorry, D3D video device is not available.\n";
std::cout << "Use \"" << argv[0] << " -l\" to print the list of available devices.\n";
return 0;
#endif
break;
case vpCV:
std::cout << "Requested OpenCV display functionnalities..." << std::endl;
#if defined(VISP_HAVE_OPENCV)
#else
std::cout << " Sorry, OpenCV video device is not available.\n";
std::cout << "Use \"" << argv[0] << " -l\" to print the list of available devices.\n";
return 0;
#endif
break;
}
}
n1.moveBaseWorldFrame(0.01,0,0,0,0,0);
for(int i=0 ; i<300 ; i++)
{
if(i > 50 && i < 100)
{
n1.accessNeedle().setFullLength(n1.accessNeedle().getFullLength()+0.0002);
n1.updateState();
}
if(i > 50)
{
}
n1.moveBase(0,0,0.001,0,0,0.1);
if(opt_display)
{
vpDisplay::display(I);
vpDisplay::flush(I);
}
}
return 0;
}
const usPolynomialCurve3D & accessSegment(int i) const
bool moveBase(const vpColVector &v, double time)
void loadPreset(const ModelPreset preset)
Parameters saving and loading.
bool setStiffnessPerUnitLength(int i, double K)
usNeedleTip const & accessNeedleTip() const
bool setBasePose(const vpPoseVector &p)
The following methods should be redefined in the derived classes.
const usTissueModelSpline & accessTissue() const
Tissue parameters.
const usNeedleModelSpline & accessNeedle() const
Parameters setters and getters.
void setNeedleTipType(NeedleTipType type)
void setSolvingMethod(SolvingMethod method)
void setPathUpdateLengthThreshold(double length)
void setPathUpdateType(PathUpdateType type)
Model behavior.
virtual bool updateState()
vpColVector getTipDirection() const
vpColVector getTipPosition() const
void setFullLength(double length)
Parameters setters and getters.
void setNeedleYoungModulus(double E)
double getOuterDiameter() const
void setInsideDiameter(double diameter)
void setOuterDiameter(double diameter)
void setDirection(const vpColVector &D)
void setPosition(const vpColVector &P)
void setOrder(unsigned int order)
const usOrientedPlane3D & accessSurface() const
Parameters setters and getters.