13 #include <itkSmoothingRecursiveGaussianImageFilter.h>
17 #include <QDirIterator>
18 #include <QTextStream>
50 QSettings
settings(parameterFilePath, QSettings::IniFormat);
65 QSettings
settings(parameterFilePath, QSettings::IniFormat);
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);
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);
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",
"");
669 ImagePtr newImage = boost::dynamic_pointer_cast<Image>(
mServices->file()->load(uid, filePath));
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";
705 else if(filePath.contains(outputFileNamesNoExtention) && filePath.contains(
".vtk"))
714 MeshPtr outputMesh = boost::dynamic_pointer_cast<Mesh>(
patientService()->importData(filePath, info));
715 outputMesh->setColor(outputColor);
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);
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();