20 #include <vtkPolyData.h> 25 #include <QCoreApplication> 26 #include <itksys/SystemTools.hxx> 28 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION 29 #include <numpy/arrayobject.h> 37 typedef itksys::SystemTools
ist;
40 : m_ItkWrappingAvailable( true )
41 , m_OpenCVWrappingAvailable( true )
42 , m_VtkWrappingAvailable( true )
43 , m_ErrorOccured( false )
45 bool pythonInitialized =
static_cast<bool>( Py_IsInitialized() );
49 if( !pythonInitialized )
51 MITK_INFO <<
"Initializing python service";
57 mitkThrow() <<
"Python runtime could not be loaded: " << dlerror();
61 std::string programPath = QCoreApplication::applicationDirPath().toStdString() +
"/";
63 QString pythonCommand;
64 pythonCommand.append( QString(
"import site, sys\n") );
65 pythonCommand.append( QString(
"import SimpleITK as sitk\n") );
66 pythonCommand.append( QString(
"import SimpleITK._SimpleITK as _SimpleITK\n") );
67 pythonCommand.append( QString(
"import numpy\n") );
69 pythonCommand.append( QString(
"sys.path.append('')\n") );
70 pythonCommand.append( QString(
"sys.path.append('%1')\n").arg(programPath.c_str()) );
74 if( pythonInitialized )
75 m_PythonManager.setInitializationFlags(PythonQt::RedirectStdOut|PythonQt::PythonAlreadyInitialized);
77 m_PythonManager.setInitializationFlags(PythonQt::RedirectStdOut);
78 m_PythonManager.initialize();
80 m_PythonManager.executeString( pythonCommand, ctkAbstractPythonManager::FileInput );
86 MITK_DEBUG(
"mitk::PythonService") <<
"destructing PythonService";
91 std::string programPath = QCoreApplication::applicationDirPath().toStdString() +
"/";
92 std::string cwd = ist::GetCurrentWorkingDirectory() +
"/";
96 m_PythonManager.executeString(QString(
"sys.path.append('%1')").arg((programPath + dir).c_str()), ctkAbstractPythonManager::SingleInput );
97 m_PythonManager.executeString(QString(
"sys.path.append('%1')").arg((cwd + dir).c_str()), ctkAbstractPythonManager::SingleInput );
103 for (
auto dir : dirs)
105 m_PythonManager.executeString(QString(
"sys.path.append('%1')").arg(dir.c_str()), ctkAbstractPythonManager::SingleInput );
111 QString pythonCommand = QString::fromStdString(stdpythonCommand);
114 bool commandIssued =
true;
116 result = m_PythonManager.executeString(pythonCommand, ctkAbstractPythonManager::SingleInput );
118 result = m_PythonManager.executeString(pythonCommand, ctkAbstractPythonManager::FileInput );
120 result = m_PythonManager.executeString(pythonCommand, ctkAbstractPythonManager::EvalInput );
122 commandIssued =
false;
127 m_ErrorOccured = PythonQt::self()->hadError();
130 return result.toString().toStdString();
135 std::ifstream t(pythonScript.c_str());
136 std::string str((std::istreambuf_iterator<char>(t)),
137 std::istreambuf_iterator<char>());
140 m_PythonManager.executeString(QString::fromStdString(str));
145 std::vector<mitk::PythonVariable> list;
147 PyObject* dict = PyImport_GetModuleDict();
148 PyObject*
object = PyDict_GetItemString(dict,
"__main__");
149 PyObject* dirMain = PyObject_Dir(
object);
150 PyObject* tempObject =
nullptr;
155 std::string name, attrValue, attrType;
157 for(
int i = 0; i<PyList_Size(dirMain); i++)
159 tempObject = PyList_GetItem(dirMain, i);
160 name = PyString_AsString(tempObject);
161 tempObject = PyObject_GetAttrString(
object, name.c_str() );
162 attrType = tempObject->ob_type->tp_name;
164 if(tempObject && ( PyUnicode_Check(tempObject) || PyString_Check(tempObject) ) )
165 attrValue = PyString_AsString(tempObject);
183 for(
unsigned int i = 0; i< allVars.size(); i++)
185 if( allVars.at(i).m_Name == name )
186 return allVars.at(i).m_Value;
194 bool varExists =
false;
197 for(
unsigned int i = 0; i< allVars.size(); i++)
199 if( allVars.at(i).m_Name == name )
211 if(!m_Observer.contains(observer))
212 m_Observer.append(observer);
217 m_Observer.removeOne(observer);
222 MITK_DEBUG(
"mitk::PythonService") <<
"number of observer " << m_Observer.size();
223 for(
int i=0; i< m_Observer.size(); ++i )
225 m_Observer.at(i)->CommandExecuted(command);
231 QString varName = QString::fromStdString( stdvarName );
237 PyObject *pyMod = PyImport_AddModule(
"__main__");
239 PyObject *pyDict = PyModule_GetDict(pyMod);
244 PyObject* npyArray =
nullptr;
246 void* array =
const_cast<void*
>(racc.
GetData());
251 const vnl_matrix_fixed<ScalarType, 3, 3> &transform =
258 mitk::FillVector3D(xDirection, transform[0][0]/s[0], transform[0][1]/s[1], transform[0][2]/s[2]);
259 mitk::FillVector3D(yDirection, transform[1][0]/s[0], transform[1][1]/s[1], transform[1][2]/s[2]);
260 mitk::FillVector3D(zDirection, transform[2][0]/s[0], transform[2][1]/s[1], transform[2][2]/s[2]);
263 npy_intp* npy_dims =
new npy_intp[1];
264 npy_dims[0] = imgDim[0];
271 QString dimensionString;
272 dimensionString.append(QString(
"["));
273 dimensionString.append(QString::number(imgDim[0]));
274 for (
unsigned i = 1; i < 3; ++i)
278 dimensionString.append(QString(
","));
279 dimensionString.append(QString::number(imgDim[i]));
280 npy_dims[0] *= imgDim[i];
282 dimensionString.append(
"]");
289 NPY_TYPES npy_type = NPY_USHORT;
290 std::string sitk_type =
"sitkUInt8";
291 if( ioPixelType == itk::ImageIOBase::SCALAR )
294 npy_type = NPY_DOUBLE;
295 sitk_type =
"sitkFloat64";
297 npy_type = NPY_FLOAT;
298 sitk_type =
"sitkFloat32";
300 npy_type = NPY_SHORT;
301 sitk_type =
"sitkInt16";
304 sitk_type =
"sitkInt8";
307 sitk_type =
"sitkInt32";
310 sitk_type =
"sitkInt64";
312 npy_type = NPY_UBYTE;
313 sitk_type =
"sitkUInt8";
316 sitk_type =
"sitkUInt32";
319 sitk_type =
"sitkUInt64";
321 npy_type = NPY_USHORT;
322 sitk_type =
"sitkUInt16";
325 else if ( ioPixelType == itk::ImageIOBase::VECTOR ||
326 ioPixelType == itk::ImageIOBase::RGB ||
327 ioPixelType == itk::ImageIOBase::RGBA
331 npy_type = NPY_DOUBLE;
332 sitk_type =
"sitkVectorFloat64";
334 npy_type = NPY_FLOAT;
335 sitk_type =
"sitkVectorFloat32";
337 npy_type = NPY_SHORT;
338 sitk_type =
"sitkVectorInt16";
341 sitk_type =
"sitkVectorInt8";
344 sitk_type =
"sitkVectorInt32";
347 sitk_type =
"sitkVectorInt64";
349 npy_type = NPY_UBYTE;
350 sitk_type =
"sitkVectorUInt8";
353 sitk_type =
"sitkVectorUInt32";
356 sitk_type =
"sitkVectorUInt64";
358 npy_type = NPY_USHORT;
359 sitk_type =
"sitkVectorUInt16";
363 MITK_WARN <<
"not a recognized pixeltype";
368 import_array1 (
true);
369 npyArray = PyArray_SimpleNewFromData(npy_nd,npy_dims,npy_type,array);
372 const int status = PyDict_SetItemString( pyDict,QString(
"%1_numpy_array")
373 .arg(varName).toStdString().c_str(),
382 command.append( QString(
"%1 = sitk.Image(%2,sitk.%3,%4)\n").arg(varName)
383 .arg(dimensionString)
385 command.append( QString(
"%1.SetSpacing([%2,%3,%4])\n").arg(varName)
386 .arg(QString::number(spacing[0]))
387 .arg(QString::number(spacing[1]))
388 .arg(QString::number(spacing[2])) );
389 command.append( QString(
"%1.SetOrigin([%2,%3,%4])\n").arg(varName)
390 .arg(QString::number(origin[0]))
391 .arg(QString::number(origin[1]))
392 .arg(QString::number(origin[2])) );
393 command.append( QString(
"%1.SetDirection([%2,%3,%4,%5,%6,%7,%8,%9,%10])\n").arg(varName)
394 .arg(QString::number(xDirection[0]))
395 .arg(QString::number(xDirection[1]))
396 .arg(QString::number(xDirection[2]))
397 .arg(QString::number(yDirection[0]))
398 .arg(QString::number(yDirection[1]))
399 .arg(QString::number(yDirection[2]))
400 .arg(QString::number(zDirection[0]))
401 .arg(QString::number(zDirection[1]))
402 .arg(QString::number(zDirection[2]))
405 command.append( QString(
"_SimpleITK._SetImageFromArray(%1_numpy_array,%1)\n").arg(varName) );
406 command.append( QString(
"del %1_numpy_array").arg(varName) );
408 MITK_DEBUG(
"PythonService") <<
"Issuing python command " << command.toStdString();
419 typedef itk::RGBPixel< unsigned char > UCRGBPixelType;
420 typedef itk::RGBPixel< unsigned short > USRGBPixelType;
421 typedef itk::RGBPixel< float > FloatRGBPixelType;
422 typedef itk::RGBPixel< double > DoubleRGBPixelType;
423 typedef itk::Image< UCRGBPixelType > UCRGBImageType;
424 typedef itk::Image< USRGBPixelType > USRGBImageType;
425 typedef itk::Image< FloatRGBPixelType > FloatRGBImageType;
426 typedef itk::Image< DoubleRGBPixelType > DoubleRGBImageType;
427 typedef itk::RGBAPixel< unsigned char > UCRGBAPixelType;
428 typedef itk::RGBAPixel< unsigned short > USRGBAPixelType;
429 typedef itk::RGBAPixel< float > FloatRGBAPixelType;
430 typedef itk::RGBAPixel< double > DoubleRGBAPixelType;
431 typedef itk::Image< UCRGBAPixelType > UCRGBAImageType;
432 typedef itk::Image< USRGBAPixelType > USRGBAImageType;
433 typedef itk::Image< FloatRGBAPixelType > FloatRGBAImageType;
434 typedef itk::Image< DoubleRGBAPixelType > DoubleRGBAImageType;
436 auto pixelType = mitk::MakePixelType<char, char >(nrComponents);
438 if (nrComponents == 1)
440 if( pythonPixeltype.compare(
"float64") == 0 ) {
441 pixelType = mitk::MakePixelType<double, double >(nrComponents);
442 }
else if( pythonPixeltype.compare(
"float32") == 0 ) {
443 pixelType = mitk::MakePixelType<float, float >(nrComponents);
444 }
else if( pythonPixeltype.compare(
"int16") == 0) {
445 pixelType = mitk::MakePixelType<short, short >(nrComponents);
446 }
else if( pythonPixeltype.compare(
"int8") == 0 ) {
447 pixelType = mitk::MakePixelType<char, char >(nrComponents);
448 }
else if( pythonPixeltype.compare(
"int32") == 0 ) {
449 pixelType = mitk::MakePixelType<int, int >(nrComponents);
450 }
else if( pythonPixeltype.compare(
"int64") == 0 ) {
451 pixelType = mitk::MakePixelType<long, long >(nrComponents);
452 }
else if( pythonPixeltype.compare(
"uint8") == 0 ) {
453 pixelType = mitk::MakePixelType<unsigned char, unsigned char >(nrComponents);
454 }
else if( pythonPixeltype.compare(
"uint32") == 0 ) {
455 pixelType = mitk::MakePixelType<unsigned int, unsigned int >(nrComponents);
456 }
else if( pythonPixeltype.compare(
"uint64") == 0 ) {
457 pixelType = mitk::MakePixelType<unsigned long, unsigned long >(nrComponents);
458 }
else if( pythonPixeltype.compare(
"uint16") == 0 ) {
459 pixelType = mitk::MakePixelType<unsigned short, unsigned short >(nrComponents);
463 mitkThrow()<<
"unknown scalar PixelType";
465 }
else if(nrComponents == 3 && dimensions == 2) {
466 if( pythonPixeltype.compare(
"float64") == 0 ) {
467 pixelType = mitk::MakePixelType<DoubleRGBImageType>();
468 }
else if( pythonPixeltype.compare(
"float32") == 0 ) {
469 pixelType = mitk::MakePixelType<FloatRGBImageType>();
470 }
else if( pythonPixeltype.compare(
"uint8") == 0 ) {
471 pixelType = mitk::MakePixelType<UCRGBImageType>();
472 }
else if( pythonPixeltype.compare(
"uint16") == 0 ) {
473 pixelType = mitk::MakePixelType<USRGBImageType>();
475 }
else if( (nrComponents == 4) && dimensions == 2 ) {
476 if( pythonPixeltype.compare(
"float64") == 0 ) {
477 pixelType = mitk::MakePixelType<DoubleRGBAImageType>();
478 }
else if( pythonPixeltype.compare(
"float32") == 0 ) {
479 pixelType = mitk::MakePixelType<FloatRGBAImageType>();
480 }
else if( pythonPixeltype.compare(
"uint8") == 0 ) {
481 pixelType = mitk::MakePixelType<UCRGBAImageType>();
482 }
else if( pythonPixeltype.compare(
"uint16") == 0 ) {
483 pixelType = mitk::MakePixelType<USRGBAImageType>();
487 if( pythonPixeltype.compare(
"float64") == 0 ) {
488 pixelType = mitk::MakePixelType<double, itk::Vector<double,3> >(nrComponents);
489 }
else if( pythonPixeltype.compare(
"float32") == 0 ) {
490 pixelType = mitk::MakePixelType<float, itk::Vector<float,3> >(nrComponents);
491 }
else if( pythonPixeltype.compare(
"int16") == 0) {
492 pixelType = mitk::MakePixelType<short, itk::Vector<short,3> >(nrComponents);
493 }
else if( pythonPixeltype.compare(
"int8") == 0 ) {
494 pixelType = mitk::MakePixelType<char, itk::Vector<char,3> >(nrComponents);
495 }
else if( pythonPixeltype.compare(
"int32") == 0 ) {
496 pixelType = mitk::MakePixelType<int, itk::Vector<int,3> >(nrComponents);
497 }
else if( pythonPixeltype.compare(
"int64") == 0 ) {
498 pixelType = mitk::MakePixelType<long, itk::Vector<long,3> >(nrComponents);
499 }
else if( pythonPixeltype.compare(
"uint8") == 0 ) {
500 pixelType = mitk::MakePixelType<unsigned char, itk::Vector<unsigned char,3> >(nrComponents);
501 }
else if( pythonPixeltype.compare(
"uint16") == 0 ) {
502 pixelType = mitk::MakePixelType<unsigned short, itk::Vector<unsigned short,3> >(nrComponents);
503 }
else if( pythonPixeltype.compare(
"uint32") == 0 ) {
504 pixelType = mitk::MakePixelType<unsigned int, itk::Vector<unsigned int,3> >(nrComponents);
505 }
else if( pythonPixeltype.compare(
"uint64") == 0 ) {
506 pixelType = mitk::MakePixelType<unsigned long, itk::Vector<unsigned long,3> >(nrComponents);
508 mitkThrow()<<
"unknown vectorial PixelType";
519 PyObject *pyMod = PyImport_AddModule(
"__main__");
521 PyObject *pyDict = PyModule_GetDict(pyMod);
526 QString varName = QString::fromStdString( stdvarName );
528 command.append( QString(
"%1_numpy_array = sitk.GetArrayFromImage(%1)\n").arg(varName) );
529 command.append( QString(
"%1_spacing = numpy.asarray(%1.GetSpacing())\n").arg(varName) );
530 command.append( QString(
"%1_origin = numpy.asarray(%1.GetOrigin())\n").arg(varName) );
531 command.append( QString(
"%1_dtype = %1_numpy_array.dtype.name\n").arg(varName) );
532 command.append( QString(
"%1_direction = numpy.asarray(%1.GetDirection())\n").arg(varName) );
533 command.append( QString(
"%1_nrComponents = numpy.asarray(%1.GetNumberOfComponentsPerPixel())\n").arg(varName));
534 command.append( QString(
"%1_dtype = %1_numpy_array.dtype.name\n").arg(varName) );
537 MITK_DEBUG(
"PythonService") <<
"Issuing python command " << command.toStdString();
540 PyObject* py_dtype = PyDict_GetItemString(pyDict,QString(
"%1_dtype").arg(varName).toStdString().c_str() );
541 std::string dtype = PyString_AsString(py_dtype);
542 PyArrayObject* py_data = (PyArrayObject*) PyDict_GetItemString(pyDict,QString(
"%1_numpy_array").arg(varName).toStdString().c_str() );
543 PyArrayObject* py_spacing = (PyArrayObject*) PyDict_GetItemString(pyDict,QString(
"%1_spacing").arg(varName).toStdString().c_str() );
544 PyArrayObject* py_origin = (PyArrayObject*) PyDict_GetItemString(pyDict,QString(
"%1_origin").arg(varName).toStdString().c_str() );
545 PyArrayObject* py_direction = (PyArrayObject*) PyDict_GetItemString(pyDict,QString(
"%1_direction").arg(varName).toStdString().c_str() );
547 PyArrayObject* py_nrComponents = (PyArrayObject*) PyDict_GetItemString(pyDict,QString(
"%1_nrComponents").arg(varName).toStdString().c_str() );
549 unsigned int nr_Components = *(
reinterpret_cast<unsigned int*
>(PyArray_DATA(py_nrComponents)));
551 unsigned int nr_dimensions = PyArray_NDIM(py_data);
552 if (nr_Components > 1)
559 unsigned int* dimensions =
new unsigned int[nr_dimensions];
561 for(
unsigned i = 0; i < nr_dimensions; ++i )
563 dimensions[i] = PyArray_DIMS(py_data)[nr_dimensions - 1 - i];
566 mitkImage->Initialize(pixelType, nr_dimensions, dimensions);
569 mitkImage->SetChannel(PyArray_DATA(py_data));
572 ds =
reinterpret_cast<double*
>(PyArray_DATA(py_spacing));
577 mitkImage->GetGeometry()->SetSpacing(spacing);
580 ds =
reinterpret_cast<double*
>(PyArray_DATA(py_origin));
584 mitkImage->GetGeometry()->SetOrigin(origin);
587 itk::Matrix<double,3,3> py_transform;
589 ds =
reinterpret_cast<double*
>(PyArray_DATA(py_direction));
590 py_transform[0][0] = ds[0];
591 py_transform[0][1] = ds[1];
592 py_transform[0][2] = ds[2];
594 py_transform[1][0] = ds[3];
595 py_transform[1][1] = ds[4];
596 py_transform[1][2] = ds[5];
598 py_transform[2][0] = ds[6];
599 py_transform[2][1] = ds[7];
600 py_transform[2][2] = ds[8];
602 mitk::AffineTransform3D::Pointer affineTransform = mitkImage->GetGeometry()->GetIndexToWorldTransform();
604 itk::Matrix<double,3,3> transform = py_transform * affineTransform->GetMatrix();
606 affineTransform->SetMatrix(transform);
608 mitkImage->GetGeometry()->SetIndexToWorldTransform(affineTransform);
615 command.append( QString(
"del %1_numpy_array\n").arg(varName) );
616 command.append( QString(
"del %1_dtype\n").arg(varName) );
617 command.append( QString(
"del %1_spacing\n").arg(varName) );
618 command.append( QString(
"del %1_origin\n").arg(varName) );
619 command.append( QString(
"del %1_direction\n").arg(varName) );
620 command.append( QString(
"del %1_nrComponents\n").arg(varName) );
621 MITK_DEBUG(
"PythonService") <<
"Issuing python command " << command.toStdString();
632 QString varName = QString::fromStdString( stdvarName );
638 PyObject *pyMod = PyImport_AddModule((
char*)
"__main__");
640 PyObject *pyDict = PyModule_GetDict(pyMod);
642 PyObject* npyArray =
nullptr;
644 void* array = (
void*) racc.
GetData();
647 npy_intp* npy_dims =
new npy_intp[1];
648 npy_dims[0] = imgDim[0];
655 QString dimensionString;
656 dimensionString.append(QString(
"["));
657 dimensionString.append(QString::number(imgDim[0]));
659 for (
unsigned i = 1; i < 3; ++i)
663 dimensionString.append(QString(
","));
664 dimensionString.append(QString::number(imgDim[i]));
665 npy_dims[0] *= imgDim[i];
667 dimensionString.append(
"]");
674 NPY_TYPES npy_type = NPY_USHORT;
676 npy_type = NPY_DOUBLE;
678 npy_type = NPY_FLOAT;
680 npy_type = NPY_SHORT;
688 npy_type = NPY_UBYTE;
694 npy_type = NPY_USHORT;
697 MITK_WARN <<
"not a recognized pixeltype";
702 import_array1 (
true);
703 npyArray = PyArray_SimpleNewFromData(npy_nd,npy_dims,npy_type,array);
706 const int status = PyDict_SetItemString( pyDict,QString(
"%1_numpy_array")
707 .arg(varName).toStdString().c_str(),
713 command.append( QString(
"import numpy as np\n"));
716 command.append( QString(
"%1_array_tmp=%1_numpy_array.copy()\n").arg(varName));
717 command.append( QString(
"%1_array_tmp=%1_array_tmp.reshape(%2,%3,%4)\n").arg( varName,
718 QString::number(imgDim[1]),
719 QString::number(imgDim[0]),
722 command.append( QString(
"%1 = %1_array_tmp[:,...,::-1]\n").arg(varName));
723 command.append( QString(
"del %1_numpy_array\n").arg(varName) );
724 command.append( QString(
"del %1_array_tmp").arg(varName) );
726 MITK_DEBUG(
"PythonService") <<
"Issuing python command " << command.toStdString();
738 PyObject *pyMod = PyImport_AddModule((
char*)
"__main__");
740 PyObject *pyDict = PyModule_GetDict(pyMod);
743 QString varName = QString::fromStdString( stdvarName );
745 command.append( QString(
"import numpy as np\n"));
746 command.append( QString(
"%1_dtype=%1.dtype.name\n").arg(varName) );
747 command.append( QString(
"%1_shape=np.asarray(%1.shape)\n").arg(varName) );
748 command.append( QString(
"%1_np_array=%1[:,...,::-1]\n").arg(varName));
749 command.append( QString(
"%1_np_array=np.reshape(%1_np_array,%1.shape[0] * %1.shape[1] * %1.shape[2])").arg(varName) );
751 MITK_DEBUG(
"PythonService") <<
"Issuing python command " << command.toStdString();
754 PyObject* py_dtype = PyDict_GetItemString(pyDict,QString(
"%1_dtype").arg(varName).toStdString().c_str() );
755 std::string dtype = PyString_AsString(py_dtype);
756 PyArrayObject* py_data = (PyArrayObject*) PyDict_GetItemString(pyDict,QString(
"%1_np_array").arg(varName).toStdString().c_str() );
757 PyArrayObject* shape = (PyArrayObject*) PyDict_GetItemString(pyDict,QString(
"%1_shape").arg(varName).toStdString().c_str() );
759 size_t* d =
reinterpret_cast<size_t*
>(PyArray_DATA(shape));
761 unsigned int dimensions[3];
762 dimensions[0] = d[1];
763 dimensions[1] = d[0];
764 dimensions[2] = d[2];
766 unsigned int nr_dimensions = 2;
769 unsigned int nr_Components = (
unsigned int) d[2];
773 mitkImage->Initialize(pixelType, nr_dimensions, dimensions);
778 char* data = (
char*)(ra.
GetData());
779 memcpy(data, PyArray_DATA(py_data), dimensions[0] * dimensions[1] * pixelType.GetSize());
784 command.append( QString(
"del %1_shape\n").arg(varName) );
785 command.append( QString(
"del %1_dtype\n").arg(varName) );
786 command.append( QString(
"del %1_np_array").arg(varName));
788 MITK_DEBUG(
"PythonService") <<
"Issuing python command " << command.toStdString();
796 return &m_PythonManager;
802 PyObject *pyMod = PyImport_AddModule((
char*)
"__main__");
804 PyObject *pyDict = PyModule_GetDict(pyMod);
806 PyObject *pyAddr =
nullptr;
811 QString varName = QString::fromStdString( stdvarName );
813 command.append( QString(
"%1_addr_str = %1.GetAddressAsString(\"vtkPolyData\")\n").arg(varName) );
815 command.append( QString(
"%1_addr = int(%1_addr_str[5:],16)").arg(varName) );
817 MITK_DEBUG(
"PythonService") <<
"Issuing python command " << command.toStdString();
821 pyAddr = PyDict_GetItemString(pyDict,QString(
"%1_addr").arg(varName).toStdString().c_str());
824 addr = PyInt_AsLong(pyAddr);
826 MITK_DEBUG <<
"Python object address: " << addr;
829 vtkPolyData* poly = (vtkPolyData*)((
void*)addr);
830 surface->SetVtkPolyData(poly);
834 command.append( QString(
"del %1_addr_str\n").arg(varName) );
835 command.append( QString(
"del %1_addr").arg(varName) );
837 MITK_DEBUG(
"PythonService") <<
"Issuing python command " << command.toStdString();
845 QString varName = QString::fromStdString( stdvarName );
846 std::ostringstream oss;
847 std::string addr =
"";
857 address = QString::fromStdString(addr.substr(2));
859 command.append( QString(
"%1 = vtk.vtkPolyData(\"%2\")\n").arg(varName).arg(address) );
861 MITK_DEBUG(
"PythonService") <<
"Issuing python command " << command.toStdString();
882 return m_ItkWrappingAvailable;
890 return m_OpenCVWrappingAvailable;
899 return m_VtkWrappingAvailable;
904 return m_ErrorOccured;
bool CopyToPythonAsVtkPolyData(mitk::Surface *surface, const std::string &varName) override
Class for storing surfaces (vtkPolyData).
virtual vtkPolyData * GetVtkPolyData(unsigned int t=0) const
bool CopyToPythonAsSimpleItkImage(mitk::Image *image, const std::string &varName) override
const mitk::PixelType GetPixelType(int n=0) const
Returns the PixelType of channel n.
vcl_size_t GetNumberOfComponents() const
Get the number of components of which each element consists.
unsigned int * GetDimensions() const
Get the sizes of all dimensions as an integer-array.
void RemovePythonCommandObserver(PythonCommandObserver *observer) override
void AddRelativeSearchDirs(std::vector< std::string > dirs) override
void * GetData()
Gives full data access.
static const int MULTI_LINE_COMMAND
void NotifyObserver(const std::string &command) override
void FillVector3D(Tout &out, mitk::ScalarType x, mitk::ScalarType y, mitk::ScalarType z)
bool IsSimpleItkPythonWrappingAvailable() override
bool CopyToPythonAsCvImage(mitk::Image *image, const std::string &varName) override
int GetComponentType() const
Get the component type (the scalar (!) type). Each element may contain m_NumberOfComponents (more tha...
mitk::Image::Pointer CopySimpleItkImageFromPython(const std::string &varName) override
std::string GetVariable(const std::string &name) const override
mitk::Image::Pointer CopyCvImageFromPython(const std::string &varName) override
bool DoesVariableExist(const std::string &name) const override
ctkAbstractPythonManager * GetPythonManager() override
#define EXTERNAL_SITE_PACKAGES
static const int SINGLE_LINE_COMMAND
bool PythonErrorOccured() const override
Image class for storing images.
void ExecuteScript(const std::string &pathToPythonScript) override
itk::ImageIOBase::IOPixelType GetPixelType() const
void AddAbsoluteSearchDirs(std::vector< std::string > dirs) override
mitk::Image::Pointer image
mitk::Surface::Pointer CopyVtkPolyDataFromPython(const std::string &varName) override
const Point3D GetOrigin() const
Get the origin, e.g. the upper-left corner of the plane.
void AddPythonCommandObserver(PythonCommandObserver *observer) override
std::string Execute(const std::string &pythonCommand, int commandType=SINGLE_LINE_COMMAND) override
std::vector< PythonVariable > GetVariableStack() const override
bool IsOpenCvPythonWrappingAvailable() override
const mitk::Vector3D GetSpacing() const
Get the spacing (size of a pixel).
~PythonService() override
empty implementation...
ImageWriteAccessor class to get locked write-access for a particular image part.
mitk::PixelType DeterminePixelType(const std::string &pythonPixeltype, unsigned long nrComponents, int dimensions)
static const int EVAL_COMMAND
ImageReadAccessor class to get locked read access for a particular image part.
bool IsVtkPythonWrappingAvailable() override
mitk::BaseGeometry * GetGeometry(int t=0) const
Return the geometry, which is a TimeGeometry, of the data as non-const pointer.
PythonService()
instantiate python manager here
const void * GetData() const
Gives const access to the data.
Class for defining the data type of pixels.
mitk::AffineTransform3D * GetIndexToWorldTransform()
Get the transformation used to convert from index to world coordinates.
#define EXTERNAL_DIST_PACKAGES