13 #include <itkSmoothingRecursiveGaussianImageFilter.h> 17 #include <QDirIterator> 18 #include <QTextStream> 50 QSettings
settings(parameterFilePath, QSettings::IniFormat);
51 settings.beginGroup(
"environment");
52 envPath = settings.value(
"path").toString();
54 settings.beginGroup(
"script");
56 cArguments = settings.value(
"arguments").toString();
58 model = settings.value(
"model").toString();
65 QSettings
settings(parameterFilePath, QSettings::IniFormat);
66 settings.beginGroup(
"output");
67 mCreateOutputVolume = settings.value(
"volume").toBool();
68 mCreateOutputMesh = settings.value(
"mesh").toBool();
69 QString allColors = settings.value(
"color").toString();
70 mOutputColorList = allColors.split(
";");
71 QString outputClass = settings.value(
"classes").toString();
72 mOutputClasses = outputClass.split(
" ");
78 mOutputChannelName(
"ExternalScript"),
79 mScriptPathAddition(
"/filter_scripts"),
97 QProcess::ProcessState newState =
mCommandLine->getProcess()->state();
98 if (newState == QProcess::Running)
100 CX_LOG_DEBUG() <<
"GenericScriptFilter process running";
103 if (newState == QProcess::NotRunning)
105 CX_LOG_DEBUG() <<
"GenericScriptFilter process finished running";
108 if (newState == QProcess::Starting)
110 CX_LOG_DEBUG() <<
"GenericScriptFilter process starting";
116 if (status == QProcess::CrashExit)
117 reportError(
"GenericScriptFilter process crashed");
123 msg +=
"GenericScriptFilter process reported an error: ";
127 case QProcess::FailedToStart:
128 msg +=
"Failed to start";
130 case QProcess::Crashed:
133 case QProcess::Timedout:
136 case QProcess::WriteError:
137 msg +=
"Write Error";
139 case QProcess::ReadError:
142 case QProcess::UnknownError:
143 msg +=
"Unknown Error";
146 msg +=
"Invalid error";
177 return "generic_script_filter";
184 "<p>Support for calling external scripts from Custus" 185 "<p>Uses parameter file... " 196 "Select configuration file",
197 "Select configuration file that specifies which script and parameters to use",
218 "Select a ini file for running command line script",
254 QString parameterFilePath =
mScriptFile->getEmbeddedPath().getAbsoluteFilepath();
255 CX_LOG_DEBUG() <<
"parameterFilePath: " << parameterFilePath;
268 QString commandString = variables.
envPath;
272 commandString.append(
" " + variables.
cArguments);
274 return commandString;
279 if(QString::compare(variables.
scriptEngine,
"DeepSintef", Qt::CaseInsensitive) == 0)
286 QString commandString = variables.
envPath;
288 commandString.append(
" --Task database --Arguments ");
289 commandString.append(
"\"");
290 commandString.append(
"InputVolume ");
292 commandString.append(
",OutputLabel ");
294 commandString.append(
",ModelsList ");
295 commandString.append(variables.
model);
296 commandString.append(
"\"");
297 return commandString;
302 return QFileInfo(path).exists();
307 QString envPath = variables.
envPath;
308 QString programPath = envPath.split(
" ")[0];
327 QString cdDown =
"..\\";
328 QStringList pathComponents = path.split(cdDown);
329 if(pathComponents.size() == 1)
332 pathComponents = path.split(cdDown);
335 for(
int i = 0; i < pathComponents.size(); ++i)
336 if(pathComponents[i].isEmpty())
338 QString strippedPath;
339 for(
int i = 0; i < pathComponents.size(); ++i)
340 if(!pathComponents[i].isEmpty())
341 strippedPath = pathComponents[i] +
"/";
344 QString tempPath = strippedPath +
"requirements.txt";
345 QString retval = path;
346 for(
int i = 0; i < 10; ++i)
354 tempPath = cdDown + tempPath;
378 if(path.contains(this->getFixedEnvironmentSubdir()))
385 QString retval(
"venv/bin/python");
393 QString parameterFilePath =
mScriptFile->getEmbeddedPath().getAbsoluteFilepath();
395 QSettings
settings(parameterFilePath, QSettings::IniFormat);
396 settings.beginGroup(
"script");
397 QString scriptFilePath = settings.value(
"path").toString();
400 scriptFilePath.replace(
"./",
"/");
402 retval = QFileInfo(parameterFilePath).absoluteDir().absolutePath()+QFileInfo(scriptFilePath).dir().path();
405 retval = QFileInfo(parameterFilePath).absoluteDir().absolutePath();
406 CX_LOG_DEBUG() <<
"Using ini file path as script path: " << retval;
413 QString inputFileName = input->getFilename();
414 QString inputFilePath =
mServices->patient()->getActivePatientFolder();
415 inputFilePath.append(
"/" + inputFileName);
416 return inputFilePath;
421 QFileInfo fi(input->getFilename());
422 QString outputFileName = fi.baseName();
423 QString outputFilePath =
mServices->patient()->getActivePatientFolder();
424 CX_LOG_DEBUG() <<
"ActivePatientFolder (output): " << outputFilePath;
425 QString parameterFilePath =
mScriptFile->getEmbeddedPath().getAbsoluteFilepath();
428 QSettings
settings(parameterFilePath, QSettings::IniFormat);
429 settings.beginGroup(
"output");
435 outputFilePath.append(
"/" + fi.path());
436 outputFilePath.append(
"/" + outputFileName);
439 return outputFilePath;
446 QString parameterFilePath =
mScriptFile->getEmbeddedPath().getAbsoluteFilepath();
458 CX_LOG_WARNING() <<
"GenericScriptFilter::runCommandStringAndWait: Cannot start command!";
468 temp->setValueName(
"Input");
469 temp->setHelp(
"Select image input");
520 mCommandLine->getProcess()->setProcessChannelMode(QProcess::MergedChannels);
562 QString parameterFilePath =
mScriptFile->getEmbeddedPath().getAbsoluteFilepath();
580 if (colorList.size() > i)
582 QStringList color = colorList[i].split(
",");
588 QString outputClass(
"");
591 CX_LOG_WARNING() <<
"In GenericScriptFilter::setupOutputColors(): No color set in ini for " << outputClass <<
" file. Setting mesh color to red.";
601 if (color.size() == 4)
602 retval.setRgb(color[0].toDouble(), color[1].toDouble(), color[2].toDouble(), color[3].toDouble());
603 if (!retval.isValid())
605 CX_LOG_WARNING() <<
"In GenericScriptFilter::createColor(): Invalid color set in ini file. Setting color to red.";
614 retval.setNamedColor(
"red");
622 double threshold = 1;
633 QString uidOutputMesh =
mOutputImage->getUid() +
"_mesh";
634 QString nameOutputMesh =
mOutputImage->getName() +
"_mesh";
637 outputMesh->setColor(color);
639 outputMesh->get_rMd_History()->setRegistration(
mOutputImage->get_rMd());
640 mServices->view()->autoShowData(outputMesh);
650 CX_LOG_WARNING() <<
"GenericScriptFilter::readGeneratedSegmentationFiles: No input image";
654 QFileInfo fileInfoInput(parentImage->getFilename());
655 QString outputFileName = fileInfoInput.baseName();
657 QString outputFilePath =
mServices->patient()->getActivePatientFolder();
658 QString outputDir(outputFilePath.append(
"/" + fileInfoInput.path()));
659 QString outputFileNamesNoExtention = outputFileInfo.baseName();
661 QDirIterator fileIterator(outputDir, QDir::Files);
662 while (fileIterator.hasNext())
664 QString filePath = fileIterator.next();
665 if(filePath.contains(outputFileNamesNoExtention) && filePath.contains(
".mhd"))
667 QFileInfo fileInfoOutput(filePath);
668 QString uid = fileInfoOutput.fileName().replace(
".mhd",
"");
672 CX_LOG_WARNING() <<
"GenericScriptFilter::readGeneratedSegmentationFiles: No new image file created";
678 newImage->getBaseVtkImageData(), parentImage);
681 CX_LOG_WARNING() <<
"GenericScriptFilter::readGeneratedSegmentationFiles: Problem creating derived image";
684 if (createOutputVolume)
705 else if(filePath.contains(outputFileNamesNoExtention) && filePath.contains(
".vtk"))
716 mServices->view()->autoShowData(outputMesh);
719 outputMesh->get_rMd_History()->setRegistration(inputImage->get_rMd());
728 QString retval = parentName;
730 nameEnding.replace(
".mhd",
"");
734 retval = retval + QString(
"_") +
mOutputClasses[i] + QString(
"_");
736 retval.append(nameEnding);
757 if (QFileInfo(fileNameMhd).exists() && !createOutputVolume)
758 QFile(fileNameMhd).remove();
760 QString fileNameRaw = fileNameMhd.left(fileNameMhd.lastIndexOf(
"."))+
".raw";
762 QFile(fileNameRaw).remove();
764 QString fileNameNii = fileNameMhd.left(fileNameMhd.lastIndexOf(
"."))+
".nii";
765 if (QFileInfo(fileNameNii).exists())
766 QFile(fileNameNii).remove();
#define CX_LOG_CHANNEL_INFO(channel)
cxResource_EXPORT ProfilePtr profile()
virtual ~GenericScriptFilter()
QString standardCommandString(CommandStringVariables variables)
void setupOutputColors(QStringList colorList)
std::vector< SelectDataStringPropertyBasePtr > mInputTypes
bool runCommandStringAndWait(QString command)
void reportError(QString msg)
virtual void createOutputTypes()
bool readGeneratedSegmentationFiles(bool createOutputVolume, bool createOutputMesh)
bool createVirtualPythonEnvironment(QString environmentPath, QString requirementsPath)
virtual QString getName() const
void processError(QProcess::ProcessError error)
void deleteNotUsedFiles(QString fileNameMhd, bool createOutputVolume)
bool isVirtualEnvironment(QString path)
#define CX_ASSERT(statement)
void processReadyReadError()
void createOutputVolume()
bool isUsingDeepSintefEngine(CommandStringVariables variables)
boost::shared_ptr< class VisServices > VisServicesPtr
QString createCommandString(ImagePtr input)
QString getFixedEnvironmentSubdir()
virtual void createInputTypes()
static StringPropertySelectDataPtr New(PatientModelServicePtr patientModelService, QString typeRegexp=".*")
QString mResultFileEnding
boost::shared_ptr< class Image > ImagePtr
boost::shared_ptr< class FilePreviewProperty > FilePreviewPropertyPtr
ProcessWrapperPtr mCommandLine
GenericScriptFilter(VisServicesPtr services)
QString getInputFilePath(ImagePtr input)
CommandStringVariables createCommandStringVariables(ImagePtr input)
FilePreviewPropertyPtr getIniFileOption(QDomElement root)
QStringList mOutputClasses
virtual QString getType() const
FilePathPropertyPtr getParameterFile(QDomElement root)
void processFinished(int code, QProcess::ExitStatus status)
SelectDataStringPropertyBasePtr mOutputImageSelectDataPtr
OutputVariables(QString parameterFilePath)
QString getEnvironmentBasePath(QString environmentPath)
QString mScriptPathAddition
virtual QString getHelp() const
std::vector< PropertyPtr > mOptionsAdapters
void processStateChanged()
QString mOutputChannelName
QStringList mOutputColorList
FilePreviewPropertyPtr mScriptFilePreview
ImagePtr createDerivedImage(PatientModelServicePtr dataManager, QString uid, QString name, vtkImageDataPtr raw, ImagePtr parent)
StringPropertySelectMeshPtr mOutputMeshSelectMeshPtr
boost::shared_ptr< class SelectDataStringPropertyBase > SelectDataStringPropertyBasePtr
QString deepSintefCommandString(CommandStringVariables variables)
PatientModelServicePtr patientService()
void setVtkPolyData(const vtkPolyDataPtr &polyData)
CommandStringVariables(QString parameterFilePath, ImagePtr input)
QList< QColor > mOutputColors
void setParameterFilePath(QString path)
ImagePtr getCopiedInputImage(int index=0)
Settings * settings()
Shortcut for accessing the settings instance.
QString createImageName(QString parentName, QString filePath)
FilePathPropertyPtr mScriptFile
virtual void createOptions()
void changed()
emit when the underlying data value is changed: The user interface will be updated.
vtkSmartPointer< vtkPolyData > vtkPolyDataPtr
static FilePathPropertyPtr initialize(const QString &uid, QString name, QString help, QString value, QStringList paths, QDomNode root=QDomNode())
boost::shared_ptr< class ProcessWrapper > ProcessWrapperPtr
QString getEnvironmentPath(CommandStringVariables variables)
std::vector< SelectDataStringPropertyBasePtr > mOutputTypes
static FilePreviewPropertyPtr initialize(const QString &uid, QString name, QString help, QString value, QStringList paths, QDomNode root=QDomNode())
bool environmentExist(QString path)
static StringPropertySelectMeshPtr New(PatientModelServicePtr patientModelService)
boost::shared_ptr< class FilePathProperty > FilePathPropertyPtr
static StringPropertySelectImagePtr New(PatientModelServicePtr patientModelService)
QStringList mOutputClasses
QString findRequirementsFileLocation(QString path)
boost::shared_ptr< class Mesh > MeshPtr
virtual bool postProcess()
QColor createColor(QStringList color)
QString getOutputFilePath(ImagePtr input)
void createOutputMesh(QColor color)
#define CX_LOG_CHANNEL_ERROR(channel)
void setColor(const QColor &color)
Set the color of the mesh.
Namespace for all CustusX production code.