diff --git a/Plugins/org.blueberry.ui.qt.help/resources/help.svg b/Plugins/org.blueberry.ui.qt.help/resources/help.svg
index 453a0a744d..13b270ac75 100644
--- a/Plugins/org.blueberry.ui.qt.help/resources/help.svg
+++ b/Plugins/org.blueberry.ui.qt.help/resources/help.svg
@@ -1,54 +1,54 @@
diff --git a/Plugins/org.blueberry.ui.qt.help/resources/helpIndex.svg b/Plugins/org.blueberry.ui.qt.help/resources/helpIndex.svg
index 79ea1f49d3..df07bbce39 100644
--- a/Plugins/org.blueberry.ui.qt.help/resources/helpIndex.svg
+++ b/Plugins/org.blueberry.ui.qt.help/resources/helpIndex.svg
@@ -1,62 +1,62 @@
diff --git a/Plugins/org.blueberry.ui.qt.help/resources/helpSearch.svg b/Plugins/org.blueberry.ui.qt.help/resources/helpSearch.svg
index 300d23aa5a..3f27badd40 100644
--- a/Plugins/org.blueberry.ui.qt.help/resources/helpSearch.svg
+++ b/Plugins/org.blueberry.ui.qt.help/resources/helpSearch.svg
@@ -1,59 +1,59 @@
diff --git a/Plugins/org.blueberry.ui.qt.log/resources/logging.svg b/Plugins/org.blueberry.ui.qt.log/resources/logging.svg
index f532a58001..2b9894f8f8 100644
--- a/Plugins/org.blueberry.ui.qt.log/resources/logging.svg
+++ b/Plugins/org.blueberry.ui.qt.log/resources/logging.svg
@@ -1,74 +1,74 @@
diff --git a/Plugins/org.blueberry.ui.qt/resources/dark/tab_close_grey.svg b/Plugins/org.blueberry.ui.qt/resources/dark/tab_close_grey.svg
index 23175afa14..2d55a20f8c 100644
--- a/Plugins/org.blueberry.ui.qt/resources/dark/tab_close_grey.svg
+++ b/Plugins/org.blueberry.ui.qt/resources/dark/tab_close_grey.svg
@@ -1,74 +1,74 @@
diff --git a/Plugins/org.blueberry.ui.qt/resources/dark/tab_close_grey_active.svg b/Plugins/org.blueberry.ui.qt/resources/dark/tab_close_grey_active.svg
index 416b17b325..4582f8cfae 100644
--- a/Plugins/org.blueberry.ui.qt/resources/dark/tab_close_grey_active.svg
+++ b/Plugins/org.blueberry.ui.qt/resources/dark/tab_close_grey_active.svg
@@ -1,79 +1,79 @@
diff --git a/Plugins/org.blueberry.ui.qt/resources/tab_close.svg b/Plugins/org.blueberry.ui.qt/resources/tab_close.svg
index 90a493a1a8..8e9ca2109d 100644
--- a/Plugins/org.blueberry.ui.qt/resources/tab_close.svg
+++ b/Plugins/org.blueberry.ui.qt/resources/tab_close.svg
@@ -1,56 +1,56 @@
diff --git a/Plugins/org.mitk.gui.qt.basicimageprocessing/plugin.xml b/Plugins/org.mitk.gui.qt.basicimageprocessing/plugin.xml
index ffc671d614..bb84a730ad 100644
--- a/Plugins/org.mitk.gui.qt.basicimageprocessing/plugin.xml
+++ b/Plugins/org.mitk.gui.qt.basicimageprocessing/plugin.xml
@@ -1,47 +1,47 @@
-
+
Perform basic image operations like add, subtract etc..
diff --git a/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingViewControls.ui b/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingViewControls.ui
index 179daf05a9..b6a6c4dd2b 100644
--- a/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingViewControls.ui
+++ b/Plugins/org.mitk.gui.qt.basicimageprocessing/src/internal/QmitkBasicImageProcessingViewControls.ui
@@ -1,473 +1,428 @@
QmitkBasicImageProcessingViewControls
0
0
448
980
Form
-
- true
+ false
-
- 0
-
-
- 6
-
-
- 0
-
-
- 6
-
-
Filters
(One Image)
true
-
Arithmetic
(Two Images)
-
- Select an Image in Data Manager
+ Select an image in the Data Manager
true
-
false
Output image will be 3D
Choose time step if 4D
(Slider for both images)
false
-
false
Output image will be 3D
-
true
-
- true
-
-
- false
-
false
-
- 0
-
-
- 6
-
-
- 0
-
-
- 0
-
-
false
Select second image:
false
m_ImageSelector2
-
false
-
false
E&xecute
-
false
Select an operation:
false
cbWhat2
-
false
-
Qt::Vertical
254
403
-
-
- true
-
-
- 0
-
-
- 6
-
-
- 0
-
-
- 0
-
-
false
Select an operation:
false
cbWhat1
-
false
-
false
... and parameters:
false
-
false
Parameter 1:
false
sbParam1
-
false
Parameter 2:
false
sbParam2
-
false
&Execute
-
false
Hide Original Image
true
-
false
Parameter 3:
-
false
Parameter 4:
-
false
0
0
-
false
0
0
Qt::LeftToRight
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
4
-999999999.000000000000000
999999999.000000000000000
-
false
0
0
4
-999999999.000000000000000
999999999.000000000000000
-
false
0
0
4
-999999999.000000000000000
999999999.000000000000000
-
false
0
0
-999999999
999999999
-
false
0
0
-999999999
999999999
QmitkDataStorageComboBox
QComboBox
QmitkDataStorageComboBox.h
QmitkSliderNavigatorWidget
QWidget
QmitkSliderNavigatorWidget.h
diff --git a/Plugins/org.mitk.gui.qt.datamanager/resources/data-manager.svg b/Plugins/org.mitk.gui.qt.datamanager/resources/data-manager.svg
index 05416fc515..82a332cdab 100644
--- a/Plugins/org.mitk.gui.qt.datamanager/resources/data-manager.svg
+++ b/Plugins/org.mitk.gui.qt.datamanager/resources/data-manager.svg
@@ -1,55 +1,55 @@
diff --git a/Plugins/org.mitk.gui.qt.imagecropper/documentation/UserManual/Advanced_ImageCropperView.png b/Plugins/org.mitk.gui.qt.imagecropper/documentation/UserManual/Advanced_ImageCropperView.png
index 6b31cf0297..62f78ff57a 100644
Binary files a/Plugins/org.mitk.gui.qt.imagecropper/documentation/UserManual/Advanced_ImageCropperView.png and b/Plugins/org.mitk.gui.qt.imagecropper/documentation/UserManual/Advanced_ImageCropperView.png differ
diff --git a/Plugins/org.mitk.gui.qt.imagecropper/documentation/UserManual/Basic_ImageCropperView.png b/Plugins/org.mitk.gui.qt.imagecropper/documentation/UserManual/Basic_ImageCropperView.png
index eb0b3ee384..7cb45a0828 100644
Binary files a/Plugins/org.mitk.gui.qt.imagecropper/documentation/UserManual/Basic_ImageCropperView.png and b/Plugins/org.mitk.gui.qt.imagecropper/documentation/UserManual/Basic_ImageCropperView.png differ
diff --git a/Plugins/org.mitk.gui.qt.imagecropper/resources/crop.svg b/Plugins/org.mitk.gui.qt.imagecropper/resources/crop.svg
index 97b163a6fe..149209316f 100644
--- a/Plugins/org.mitk.gui.qt.imagecropper/resources/crop.svg
+++ b/Plugins/org.mitk.gui.qt.imagecropper/resources/crop.svg
@@ -1,31 +1,31 @@
diff --git a/Plugins/org.mitk.gui.qt.imagecropper/src/internal/ImageCropperControls.ui b/Plugins/org.mitk.gui.qt.imagecropper/src/internal/ImageCropperControls.ui
index e45fe66627..2c0107ebed 100644
--- a/Plugins/org.mitk.gui.qt.imagecropper/src/internal/ImageCropperControls.ui
+++ b/Plugins/org.mitk.gui.qt.imagecropper/src/internal/ImageCropperControls.ui
@@ -1,1133 +1,1133 @@
ImageCropperControls
0
0
329
863
0
0
QmitkTemplate
-
3
-
0
0
QLabel { color: rgb(255, 0, 0) }
Please select an image.
-
255
0
0
255
0
0
255
127
127
255
63
63
127
0
0
170
0
0
0
0
0
255
255
255
0
0
0
255
255
255
255
0
0
0
0
0
255
127
127
255
255
220
0
0
0
255
0
0
255
0
0
255
127
127
255
63
63
127
0
0
170
0
0
0
0
0
255
255
255
0
0
0
255
255
255
255
0
0
0
0
0
255
127
127
255
255
220
0
0
0
120
120
120
255
0
0
255
127
127
255
63
63
127
0
0
170
0
0
127
0
0
255
255
255
127
0
0
255
0
0
255
0
0
0
0
0
255
0
0
255
255
220
0
0
0
Please select a bounding object.
-
false
0
0
0
90
Bounding object
-
-
0
0
16777215
16777215
-
0
0
- New...
+ New
-
0
0
Do Cropping
Mask
-
0
0
Crop
-
true
255
0
0
255
0
0
255
127
127
255
63
63
127
0
0
170
0
0
255
0
0
255
255
255
0
0
0
255
255
255
255
0
0
0
0
0
255
127
127
255
255
220
0
0
0
255
0
0
255
0
0
255
127
127
255
63
63
127
0
0
170
0
0
255
0
0
255
255
255
0
0
0
255
255
255
255
0
0
0
0
0
255
127
127
255
255
220
0
0
0
127
0
0
255
0
0
255
127
127
255
63
63
127
0
0
170
0
0
127
0
0
255
255
255
127
0
0
255
0
0
255
0
0
0
0
0
255
0
0
255
255
220
0
0
0
Image geometry is rotated, result won't be pixel-aligned. You can reinit your image to get a pixel-aligned result, though.
Qt::PlainText
true
-
0
0
0
25
Advanced settings
false
100
Qt::ToolButtonTextBesideIcon
false
-
0
0
0
120
Output image settings
-
-
0
0
Outside pixel value (masking):
-
false
0
0
16777210
16777215
-
0
0
Overrride original image
false
-
0
0
Only crop current timestep
/ cut off other timesteps
-
Qt::Vertical
20
40
QmitkDataStorageComboBox
QComboBox
QmitkDataStorageComboBox.h
ctkExpandButton
QToolButton
diff --git a/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.cpp b/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.cpp
index 42f42ff803..0fe5b72b9f 100644
--- a/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.cpp
+++ b/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.cpp
@@ -1,606 +1,578 @@
/*=========================================================================
Program: Medical Imaging & Interaction Toolkit
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) German Cancer Research Center, Division of Medical and
Biological Informatics. All rights reserved.
See MITKCopyright.txt or http://www.mitk.org/copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#include "QmitkImageCropper.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include // Includes for image casting between ITK and MITK: added after using Plugin Generator
#include
#include
#include
#include
#include
#include
#include
#include
#include
+#include
#include
#include
#include
#include
#include
#include
const std::string QmitkImageCropper::VIEW_ID = "org.mitk.views.qmitkimagecropper";
QmitkImageCropper::QmitkImageCropper(QObject *)
: m_ParentWidget(0),
m_ImageNode(nullptr),
m_CroppingObject(nullptr),
m_CroppingObjectNode(nullptr),
m_BoundingShapeInteractor(nullptr),
m_CropOutsideValue(0),
m_Advanced(0),
m_Active(0),
m_ScrollEnabled(true)
{
CreateBoundingShapeInteractor(false);
}
QmitkImageCropper::~QmitkImageCropper()
{
//delete pointer objects
m_CroppingObjectNode = nullptr;
m_CroppingObject = nullptr;
//disable interactor
if (m_BoundingShapeInteractor != nullptr)
{
m_BoundingShapeInteractor->SetDataNode(nullptr);
m_BoundingShapeInteractor->EnableInteraction(false);
}
}
void QmitkImageCropper::SetFocus()
{
m_Controls.buttonCreateNewBoundingBox->setFocus();
}
void QmitkImageCropper::CreateQtPartControl(QWidget *parent)
{
// create GUI widgets from the Qt Designer's .ui file
m_Controls.setupUi(parent);
m_Controls.boundingShapeSelector->SetDataStorage(this->GetDataStorage());
m_Controls.boundingShapeSelector->SetPredicate(mitk::NodePredicateAnd::New(
mitk::TNodePredicateDataType::New(),
mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New("helper object"))));
m_CroppingObjectNode = m_Controls.boundingShapeSelector->GetSelectedNode();
connect(m_Controls.buttonCropping, SIGNAL(clicked()), this, SLOT(DoCropping()));
connect(m_Controls.buttonMasking, SIGNAL(clicked()), this, SLOT(DoMasking()));
connect(m_Controls.boundingShapeSelector, SIGNAL(OnSelectionChanged(const mitk::DataNode*)),
this, SLOT(OnDataSelectionChanged(const mitk::DataNode*)));
connect(m_Controls.buttonCreateNewBoundingBox, SIGNAL(clicked()), this, SLOT(DoCreateNewBoundingObject()));
connect(m_Controls.buttonAdvancedSettings, SIGNAL(clicked()), this, SLOT(OnAdvancedSettingsButtonToggled()));
connect(m_Controls.spinBoxOutsidePixelValue, SIGNAL(valueChanged(int)), this, SLOT(OnSliderValueChanged(int)));
setDefaultGUI();
m_Controls.labelWarningRotation->setVisible(false);
- m_BoundingObjectNames.clear();
-
m_Advanced = false;
this->OnAdvancedSettingsButtonToggled();
m_ParentWidget = parent;
}
void QmitkImageCropper::OnDataSelectionChanged(const mitk::DataNode*)
{
m_Controls.boundingShapeSelector->setEnabled(true);
m_CroppingObjectNode = m_Controls.boundingShapeSelector->GetSelectedNode();
if (m_CroppingObjectNode.IsNotNull() && dynamic_cast(this->m_CroppingObjectNode->GetData()))
{
m_Controls.buttonAdvancedSettings->setEnabled(true);
m_Controls.labelWarningBB->setVisible(false);
m_CroppingObject = dynamic_cast(m_CroppingObjectNode->GetData());
m_Advanced = true;
mitk::RenderingManager::GetInstance()->InitializeViews();
mitk::RenderingManager::GetInstance()->RequestUpdateAll();
}
else
{
setDefaultGUI();
m_CroppingObject = nullptr;
m_BoundingShapeInteractor->EnableInteraction(false);
m_BoundingShapeInteractor->SetDataNode(nullptr);
m_Advanced = false;
this->OnAdvancedSettingsButtonToggled();
}
}
void QmitkImageCropper::OnAdvancedSettingsButtonToggled()
{
m_Controls.groupImageSettings->setVisible(m_Advanced);
m_Advanced = !m_Advanced;
}
void QmitkImageCropper::CreateBoundingShapeInteractor(bool rotationEnabled)
{
if (m_BoundingShapeInteractor.IsNull())
{
m_BoundingShapeInteractor = mitk::BoundingShapeInteractor::New();
m_BoundingShapeInteractor->LoadStateMachine("BoundingShapeInteraction.xml", us::ModuleRegistry::GetModule("MitkBoundingShape"));
m_BoundingShapeInteractor->SetEventConfig("BoundingShapeMouseConfig.xml", us::ModuleRegistry::GetModule("MitkBoundingShape"));
}
m_BoundingShapeInteractor->SetRotationEnabled(rotationEnabled);
}
mitk::Geometry3D::Pointer QmitkImageCropper::InitializeWithImageGeometry(mitk::BaseGeometry::Pointer geometry)
{
// convert a basegeometry into a Geometry3D (otherwise IO is not working properly)
if (geometry == nullptr)
mitkThrow() << "Geometry is not valid.";
auto boundingGeometry = mitk::Geometry3D::New();
boundingGeometry->SetBounds(geometry->GetBounds());
boundingGeometry->SetImageGeometry(geometry->GetImageGeometry());
boundingGeometry->SetOrigin(geometry->GetOrigin());
boundingGeometry->SetSpacing(geometry->GetSpacing());
boundingGeometry->SetIndexToWorldTransform(geometry->GetIndexToWorldTransform());
boundingGeometry->Modified();
return boundingGeometry;
}
-QString QmitkImageCropper::getAdaptedBoundingObjectName(const QString& name) const
+QString QmitkImageCropper::AdaptBoundingObjectName(const QString& name) const
{
- bool nameNotTaken = false;
unsigned int counter = 2;
- QString newName;
- while (!nameNotTaken)
+ QString newName = QString("%1 %2").arg(name).arg(counter);
+
+ while (nullptr != this->GetDataStorage()->GetNode(mitk::NodePredicateFunction::New([&newName](const mitk::DataNode *node)
{
- newName = name + "_" + QString::number(counter);
- if (!m_BoundingObjectNames.contains(newName))
- {
- nameNotTaken = true;
- }
- ++counter;
+ return 0 == node->GetName().compare(newName.toStdString());
+ })))
+ {
+ newName = QString("%1 %2").arg(name).arg(++counter);
}
+
return newName;
}
void QmitkImageCropper::DoCreateNewBoundingObject()
{
if (!m_ImageNode.IsExpired())
{
auto imageNode = m_ImageNode.Lock();
bool ok = false;
- QString defaultName = "BoundingShape";
- if (m_BoundingObjectNames.contains(defaultName))
- {
- defaultName = getAdaptedBoundingObjectName(defaultName);
- }
- QString name = QInputDialog::getText(QApplication::activeWindow()
- , "Add cropping shape...", "Enter name for the new cropping shape", QLineEdit::Normal, defaultName, &ok);
- if (!ok)
- return;
- if (name == "")
- {
- name = "Bounding Shape";
- }
- if (m_BoundingObjectNames.contains(name))
+ QString name = QString::fromStdString(imageNode->GetName() + " Bounding Shape");
+
+ auto boundingShape = this->GetDataStorage()->GetNode(mitk::NodePredicateFunction::New([&name](const mitk::DataNode *node)
{
- name = getAdaptedBoundingObjectName(name);
- QMessageBox::information(nullptr, "Information", "Bounding object name already exists. It was changed to: " + name);
- }
- m_BoundingObjectNames.append(name);
+ return 0 == node->GetName().compare(name.toStdString());
+ }));
+
+ if (nullptr != boundingShape)
+ name = this->AdaptBoundingObjectName(name);
m_Controls.buttonCropping->setEnabled(true);
m_Controls.buttonMasking->setEnabled(true);
m_Controls.boundingShapeSelector->setEnabled(true);
m_Controls.groupImageSettings->setEnabled(true);
// get current timestep to support 3d+t images
auto renderWindowPart = this->GetRenderWindowPart(OPEN);
int timeStep = renderWindowPart->GetTimeNavigationController()->GetTime()->GetPos();
mitk::BaseGeometry::Pointer imageGeometry = static_cast(imageNode->GetData()->GetGeometry(timeStep));
m_CroppingObject = mitk::GeometryData::New();
m_CroppingObject->SetGeometry(static_cast(this->InitializeWithImageGeometry(imageGeometry)));
m_CroppingObjectNode = mitk::DataNode::New();
m_CroppingObjectNode->SetData(m_CroppingObject);
m_CroppingObjectNode->SetProperty("name", mitk::StringProperty::New(name.toStdString()));
m_CroppingObjectNode->SetProperty("color", mitk::ColorProperty::New(1.0, 1.0, 1.0));
m_CroppingObjectNode->SetProperty("opacity", mitk::FloatProperty::New(0.6));
m_CroppingObjectNode->SetProperty("layer", mitk::IntProperty::New(99));
m_CroppingObjectNode->AddProperty("handle size factor", mitk::DoubleProperty::New(1.0 / 40.0));
m_CroppingObjectNode->SetBoolProperty("pickable", true);
if (!this->GetDataStorage()->Exists(m_CroppingObjectNode))
{
GetDataStorage()->Add(m_CroppingObjectNode, imageNode);
m_Controls.boundingShapeSelector->SetSelectedNode(m_CroppingObjectNode);
m_CroppingObjectNode->SetVisibility(true);
m_BoundingShapeInteractor->EnableInteraction(true);
m_BoundingShapeInteractor->SetDataNode(this->m_CroppingObjectNode);
this->OnDataSelectionChanged(m_CroppingObjectNode);
}
}
// Adjust coordinate system by doing a reinit on
auto tempDataStorage = mitk::DataStorage::SetOfObjects::New();
tempDataStorage->InsertElement(0, m_CroppingObjectNode);
//// initialize the views to the bounding geometry
//mitk::TimeGeometry::Pointer bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(tempDataStorage);
//mitk::RenderingManager::GetInstance()->InitializeViews(bounds);
//mitk::RenderingManager::GetInstance()->RequestUpdateAll();
}
void QmitkImageCropper::setDefaultGUI()
{
m_Controls.labelWarningImage->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }");
m_Controls.labelWarningImage->setText(QString::fromStdString("Select an image."));
m_Controls.labelWarningImage->setVisible(true);
m_Controls.labelWarningBB->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }");
m_Controls.labelWarningBB->setText(QString::fromStdString("Create a bounding shape below."));
m_Controls.labelWarningBB->setVisible(true);
m_Controls.buttonCreateNewBoundingBox->setEnabled(false);
m_Controls.labelWarningRotation->setVisible(false);
m_Controls.buttonCropping->setEnabled(false);
m_Controls.buttonMasking->setEnabled(false);
m_Controls.boundingShapeSelector->setEnabled(false);
m_Controls.buttonAdvancedSettings->setEnabled(false);
m_Controls.groupImageSettings->setEnabled(false);
m_Controls.checkOverwriteImage->setChecked(false);
m_Controls.checkBoxCropTimeStepOnly->setChecked(false);
}
void QmitkImageCropper::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/,
const QList& nodes)
{
bool rotationEnabled = false;
if (nodes.empty())
{
setDefaultGUI();
return;
}
m_ParentWidget->setEnabled(true);
foreach(mitk::DataNode::Pointer node, nodes)
{
if (node.IsNotNull() && dynamic_cast(node->GetData()))
{
m_ImageNode = nodes[0];
m_Controls.groupBoundingObject->setEnabled(true);
- m_Controls.labelWarningImage->setStyleSheet(" QLabel { color: rgb(0, 0, 0) }");
- m_Controls.labelWarningImage->setText(QString::fromStdString("File name: " + nodes[0]->GetName()));
+ m_Controls.labelWarningImage->setStyleSheet("");
+ m_Controls.labelWarningImage->setText(QString::fromStdString("Selected image: " + nodes[0]->GetName()));
m_Controls.buttonCreateNewBoundingBox->setEnabled(true);
mitk::Image::Pointer image = dynamic_cast(nodes[0]->GetData());
if (image != nullptr)
{
if (image->GetDimension() < 3) {
QMessageBox::warning(nullptr,
tr("Invalid image selected"),
tr("ImageCropper only works with 3 or more dimensions."),
QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton);
setDefaultGUI();
return;
}
vtkSmartPointer imageMat = image->GetGeometry()->GetVtkMatrix();
// check whether the image geometry is rotated, if so, no pixel aligned cropping or masking can be performed
if ((imageMat->GetElement(1, 0) == 0.0) && (imageMat->GetElement(0, 1) == 0.0) &&
(imageMat->GetElement(1, 2) == 0.0) && (imageMat->GetElement(2, 1) == 0.0) &&
(imageMat->GetElement(2, 0) == 0.0) && (imageMat->GetElement(0, 2) == 0.0))
{
rotationEnabled = false;
m_Controls.labelWarningRotation->setVisible(false);
}
else
{
rotationEnabled = true;
m_Controls.labelWarningRotation->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }");
m_Controls.labelWarningRotation->setVisible(true);
}
this->CreateBoundingShapeInteractor(rotationEnabled);
m_CroppingObjectNode = m_Controls.boundingShapeSelector->GetSelectedNode();
if (m_CroppingObjectNode != nullptr)
{
this->OnDataSelectionChanged(m_CroppingObjectNode);
m_BoundingShapeInteractor->EnableInteraction(true);
m_BoundingShapeInteractor->SetDataNode(this->m_CroppingObjectNode);
m_Controls.boundingShapeSelector->setEnabled(true);
}
if (image->GetPixelType().GetPixelType() == itk::ImageIOBase::SCALAR)
{
// Might be changed with the upcoming new image statistics plugin
//(recomputation might be very expensive for large images ;) )
auto statistics = image->GetStatistics();
auto minPixelValue = statistics->GetScalarValueMin();
auto maxPixelValue = statistics->GetScalarValueMax();
if (minPixelValue < std::numeric_limits::min()) {
minPixelValue = std::numeric_limits::min();
}
if (maxPixelValue > std::numeric_limits::max()) {
maxPixelValue = std::numeric_limits::max();
}
m_Controls.spinBoxOutsidePixelValue->setEnabled(true);
m_Controls.spinBoxOutsidePixelValue->setMaximum(static_cast(maxPixelValue));
m_Controls.spinBoxOutsidePixelValue->setMinimum(static_cast(minPixelValue));
m_Controls.spinBoxOutsidePixelValue->setValue(static_cast(minPixelValue));
}
else
{
m_Controls.spinBoxOutsidePixelValue->setEnabled(false);
}
unsigned int dim = image->GetDimension();
if (dim < 2 || dim > 4)
{
m_Controls.labelWarningImage->setStyleSheet(" QLabel { color: rgb(255, 0, 0) }");
m_Controls.labelWarningImage->setText(QString::fromStdString("Select an image."));
m_ParentWidget->setEnabled(false);
}
if (m_CroppingObjectNode != nullptr)
{
m_Controls.buttonCropping->setEnabled(true);
m_Controls.buttonMasking->setEnabled(true);
m_Controls.boundingShapeSelector->setEnabled(true);
m_Controls.labelWarningBB->setVisible(false);
}
else
{
m_Controls.buttonCropping->setEnabled(false);
m_Controls.buttonMasking->setEnabled(false);
m_Controls.boundingShapeSelector->setEnabled(false);
m_Controls.labelWarningBB->setVisible(true);
}
return;
}
// iterate all selected objects, adjust warning visibility
setDefaultGUI();
m_ParentWidget->setEnabled(true);
m_Controls.labelWarningRotation->setVisible(false);
}
}
}
-void QmitkImageCropper::NodeRemoved(const mitk::DataNode * node)
-{
- QList::iterator it = m_BoundingObjectNames.begin();
- while (it != m_BoundingObjectNames.end())
- {
- if (node->GetName() == it->toStdString())
- {
- it = m_BoundingObjectNames.erase(it);
- }
- else
- {
- ++it;
- }
- }
-}
-
void QmitkImageCropper::OnComboBoxSelectionChanged(const mitk::DataNode* node)
{
mitk::DataNode* selectedNode = const_cast(node);
if (selectedNode != nullptr)
{
if (!m_ImageNode.IsExpired())
selectedNode->SetDataInteractor(m_ImageNode.Lock()->GetDataInteractor());
// m_ImageNode->GetDataInteractor()->SetDataNode(selectedNode);
m_ImageNode = selectedNode;
}
}
void QmitkImageCropper::OnSliderValueChanged(int slidervalue)
{
m_CropOutsideValue = slidervalue;
}
void QmitkImageCropper::DoMasking()
{
this->ProcessImage(true);
}
void QmitkImageCropper::DoCropping()
{
this->ProcessImage(false);
}
void QmitkImageCropper::ProcessImage(bool mask)
{
// cropping only possible if valid bounding shape as well as a valid image are loaded
QList nodes = this->GetDataManagerSelection();
auto renderWindowPart = this->GetRenderWindowPart(OPEN);
int timeStep = renderWindowPart->GetTimeNavigationController()->GetTime()->GetPos();
if (nodes.empty()) return;
mitk::DataNode* node = nodes[0];
if (node == nullptr)
{
QMessageBox::information(nullptr, "Warning", "Please load and select an image before starting image processing.");
return;
}
if (m_CroppingObject == nullptr)
{
QMessageBox::information(nullptr, "Warning", "Please load and select a cropping object before starting image processing.");
return;
}
mitk::BaseData* data = node->GetData(); //get data from node
if (data != nullptr)
{
QString imageName;
if (mask)
{
imageName = QString::fromStdString(node->GetName() + "_" + m_CroppingObjectNode->GetName() + "_masked");
}
else
{
imageName = QString::fromStdString(node->GetName() + "_" + m_CroppingObjectNode->GetName() + "_cropped");
}
if (m_Controls.checkBoxCropTimeStepOnly->isChecked())
{
imageName = imageName + "_T" + QString::number(timeStep);
}
// image and bounding shape ok, set as input
auto croppedImageNode = mitk::DataNode::New();
auto cutter = mitk::BoundingShapeCropper::New();
cutter->SetGeometry(m_CroppingObject);
// adjustable in advanced settings
cutter->SetUseWholeInputRegion(mask); //either mask (mask=true) or crop (mask=false)
cutter->SetOutsideValue(m_CropOutsideValue);
cutter->SetUseCropTimeStepOnly(m_Controls.checkBoxCropTimeStepOnly->isChecked());
cutter->SetCurrentTimeStep(timeStep);
// TODO: Add support for MultiLayer (right now only Mulitlabel support)
mitk::LabelSetImage* labelsetImageInput = dynamic_cast(data);
if (labelsetImageInput != nullptr)
{
cutter->SetInput(labelsetImageInput);
// do the actual cutting
try
{
cutter->Update();
}
catch (const itk::ExceptionObject& e)
{
std::string message = std::string("The Cropping filter could not process because of: \n ") + e.GetDescription();
QMessageBox::warning(nullptr,
tr("Cropping not possible!"),
tr(message.c_str()),
QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton);
return;
}
auto labelSetImage = mitk::LabelSetImage::New();
labelSetImage->InitializeByLabeledImage(cutter->GetOutput());
for (unsigned int i = 0; i < labelsetImageInput->GetNumberOfLayers(); i++)
{
labelSetImage->AddLabelSetToLayer(i, labelsetImageInput->GetLabelSet(i));
}
croppedImageNode->SetData(labelSetImage);
croppedImageNode->SetProperty("name", mitk::StringProperty::New(imageName.toStdString()));
//add cropping result to the current data storage as child node to the image node
if (!m_Controls.checkOverwriteImage->isChecked())
{
if (!this->GetDataStorage()->Exists(croppedImageNode))
{
this->GetDataStorage()->Add(croppedImageNode, m_ImageNode.Lock());
}
}
else // original image will be overwritten by the result image and the bounding box of the result is adjusted
{
node->SetData(labelSetImage);
node->Modified();
// Adjust coordinate system by doing a reinit on
auto tempDataStorage = mitk::DataStorage::SetOfObjects::New();
tempDataStorage->InsertElement(0, node);
// initialize the views to the bounding geometry
auto bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(tempDataStorage);
mitk::RenderingManager::GetInstance()->InitializeViews(bounds);
mitk::RenderingManager::GetInstance()->RequestUpdateAll();
}
}
else
{
mitk::Image::Pointer imageInput = dynamic_cast(data);
if (imageInput != nullptr)
{
cutter->SetInput(imageInput);
// do the actual cutting
try
{
cutter->Update();
}
catch (const itk::ExceptionObject& e)
{
std::string message = std::string("The Cropping filter could not process because of: \n ") + e.GetDescription();
QMessageBox::warning(nullptr,
tr("Cropping not possible!"),
tr(message.c_str()),
QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton);
return;
}
//add cropping result to the current data storage as child node to the image node
if (!m_Controls.checkOverwriteImage->isChecked())
{
croppedImageNode->SetData(cutter->GetOutput());
croppedImageNode->SetProperty("name", mitk::StringProperty::New(imageName.toStdString()));
croppedImageNode->SetProperty("color", mitk::ColorProperty::New(1.0, 1.0, 1.0));
croppedImageNode->SetProperty("layer", mitk::IntProperty::New(99)); // arbitrary, copied from segmentation functionality
if (!this->GetDataStorage()->Exists(croppedImageNode))
{
this->GetDataStorage()->Add(croppedImageNode, m_ImageNode.Lock());
}
}
else // original image will be overwritten by the result image and the bounding box of the result is adjusted
{
node->SetData(cutter->GetOutput());
node->Modified();
// Adjust coordinate system by doing a reinit on
auto tempDataStorage = mitk::DataStorage::SetOfObjects::New();
tempDataStorage->InsertElement(0, node);
// initialize the views to the bounding geometry
auto bounds = this->GetDataStorage()->ComputeBoundingGeometry3D(tempDataStorage);
mitk::RenderingManager::GetInstance()->InitializeViews(bounds);
mitk::RenderingManager::GetInstance()->RequestUpdateAll();
}
}
}
}
else
{
QMessageBox::information(nullptr, "Warning", "Please load and select an image before starting image processing.");
}
}
diff --git a/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.h b/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.h
index 6c70c8fe40..845ab34055 100644
--- a/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.h
+++ b/Plugins/org.mitk.gui.qt.imagecropper/src/internal/QmitkImageCropper.h
@@ -1,179 +1,173 @@
/*=========================================================================
Program: Medical Imaging & Interaction Toolkit
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) German Cancer Research Center, Division of Medical and
Biological Informatics. All rights reserved.
See MITKCopyright.txt or http://www.mitk.org/copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef QmitkImageCropper_h
#define QmitkImageCropper_h
#include
#ifdef WIN32
#pragma warning( disable : 4250 )
#endif
#include
#include "QmitkRegisterClasses.h"
#include
#include "itkCommand.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "ui_ImageCropperControls.h"
#include "usServiceRegistration.h"
/*!
@brief QmitkImageCropperView
\warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation.
\sa QmitkFunctionality
\ingroup ${plugin_target}_internal
*/
class QmitkImageCropper : public QmitkAbstractView
{
// this is needed for all Qt objects that should have a Qt meta-object
// (everything that derives from QObject and wants to have signal/slots)
private:
Q_OBJECT
public:
/*!
@brief Constructor. Called by SampleApp (or other apps that use functionalities)
*/
QmitkImageCropper(QObject *parent = 0);
virtual ~QmitkImageCropper();
static const std::string VIEW_ID;
virtual void CreateQtPartControl(QWidget *parent);
virtual void SetFocus() override;
/*!
@brief Creates the Qt connections needed
*/
QWidget* GetControls();
/// @brief Called when the user clicks the GUI button
protected slots:
/*!
* @brief Creates a new bounding object
*/
virtual void DoCreateNewBoundingObject();
/*!
* @brief Whenever Crop button is pressed, issue a cropping action
*/
void DoCropping();
/*!
* @brief Whenever Mask button is pressed, issue a masking action
*/
void DoMasking();
/*!
* @brief Dis- or enable the advanced setting section
*/
void OnAdvancedSettingsButtonToggled();
/*!
* @brief Updates current selection of the bounding object
*/
void OnDataSelectionChanged(const mitk::DataNode* node);
/*!
* @brief Sets the scalar value for outside pixels in case of masking
*/
void OnSliderValueChanged(int slidervalue);
protected:
/*!
@brief called by QmitkFunctionality when DataManager's selection has changed
*/
void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override;
/*!
- @brief called by QmitkFunctionality when DataNode is removed from DataManager
- */
- void NodeRemoved(const mitk::DataNode* node) override;
- /*!
@brief Sets the selected bounding object as current bounding object and set up interactor
*/
void OnComboBoxSelectionChanged(const mitk::DataNode* node);
/*!
* @brief Initializes a new bounding shape using the selected image geometry.
*/
mitk::Geometry3D::Pointer InitializeWithImageGeometry(mitk::BaseGeometry::Pointer geometry);
void CreateBoundingShapeInteractor(bool rotationEnabled);
private:
/*!
* The parent QWidget
*/
QWidget* m_ParentWidget;
/*!
* @brief A pointer to the node of the image to be cropped.
*/
mitk::WeakPointer m_ImageNode;
/*!
* @brief The cuboid used for cropping.
*/
mitk::GeometryData::Pointer m_CroppingObject;
/*!
* @brief Tree node of the cuboid used for cropping.
*/
mitk::DataNode::Pointer m_CroppingObjectNode;
/*!
* @brief Interactor for moving and scaling the cuboid
*/
mitk::BoundingShapeInteractor::Pointer m_BoundingShapeInteractor;
void ProcessImage(bool crop);
- QList m_BoundingObjectNames;
-
/*!
* @brief Resets GUI to default
*/
void setDefaultGUI();
- QString getAdaptedBoundingObjectName(const QString& name) const;
+ QString AdaptBoundingObjectName(const QString& name) const;
// cropping parameter
mitk::ScalarType m_CropOutsideValue;
bool m_Advanced;
bool m_Active;
bool m_ScrollEnabled;
Ui::ImageCropperControls m_Controls;
};
#endif // QmitkImageCropper_h
diff --git a/Plugins/org.mitk.gui.qt.lasercontrol/resources/iconLaserControl.svg b/Plugins/org.mitk.gui.qt.lasercontrol/resources/iconLaserControl.svg
index f850e3a0d3..639a54b9c3 100644
--- a/Plugins/org.mitk.gui.qt.lasercontrol/resources/iconLaserControl.svg
+++ b/Plugins/org.mitk.gui.qt.lasercontrol/resources/iconLaserControl.svg
@@ -1,88 +1,88 @@
diff --git a/Plugins/org.mitk.gui.qt.measurementtoolbox/resources/bar-chart.svg b/Plugins/org.mitk.gui.qt.measurementtoolbox/resources/bar-chart.svg
index 2a87f07dda..5bae539eb8 100644
--- a/Plugins/org.mitk.gui.qt.measurementtoolbox/resources/bar-chart.svg
+++ b/Plugins/org.mitk.gui.qt.measurementtoolbox/resources/bar-chart.svg
@@ -1,54 +1,57 @@
diff --git a/Plugins/org.mitk.gui.qt.moviemaker/documentation/UserManual/QmitkMovieMaker_ScreenshotMakerInterface.png b/Plugins/org.mitk.gui.qt.moviemaker/documentation/UserManual/QmitkMovieMaker_ScreenshotMakerInterface.png
index cbf2067d84..567bee6f1d 100644
Binary files a/Plugins/org.mitk.gui.qt.moviemaker/documentation/UserManual/QmitkMovieMaker_ScreenshotMakerInterface.png and b/Plugins/org.mitk.gui.qt.moviemaker/documentation/UserManual/QmitkMovieMaker_ScreenshotMakerInterface.png differ
diff --git a/Plugins/org.mitk.gui.qt.moviemaker/documentation/UserManual/QmitkScreenshotMaker.dox b/Plugins/org.mitk.gui.qt.moviemaker/documentation/UserManual/QmitkScreenshotMaker.dox
index 05b657bdeb..71a6a17ed4 100644
--- a/Plugins/org.mitk.gui.qt.moviemaker/documentation/UserManual/QmitkScreenshotMaker.dox
+++ b/Plugins/org.mitk.gui.qt.moviemaker/documentation/UserManual/QmitkScreenshotMaker.dox
@@ -1,19 +1,19 @@
/**
\page org_mitk_views_screenshotmaker The Screenshot Maker
This view provides the functionality to create and save screenshots of the data.
Available sections:
- \ref QmitkScreenshotMakerUserManualUse
\imageMacro{QmitkMovieMaker_ScreenshotMakerInterface.png,"The Screenshot Maker User Interface",7.09}
\section QmitkScreenshotMakerUserManualUse Usage
The first section offers the option of creating a screenshot of the last activated render window (thus the one, which was last clicked into). Upon clicking the button, the Screenshot Maker asks for a filename in which the screenshot is to be stored. The multiplanar Screenshot button asks for a folder, where screenshots of the three 2D views will be stored with default names.
The high resolution screenshot section works the same as the simple screenshot section, aside from the fact, that the user can choose a magnification factor.
-In the option section one can rotate the camera in the 3D view by using the buttons. Furthermore one can choose the background colour for the screenshots, default is black.
+In the option section one can choose the background color for the screenshots, default is black.
*/
diff --git a/Plugins/org.mitk.gui.qt.moviemaker/resources/camera.svg b/Plugins/org.mitk.gui.qt.moviemaker/resources/camera.svg
index d58c7d30c7..83bd2c07d1 100644
--- a/Plugins/org.mitk.gui.qt.moviemaker/resources/camera.svg
+++ b/Plugins/org.mitk.gui.qt.moviemaker/resources/camera.svg
@@ -1,54 +1,57 @@
diff --git a/Plugins/org.mitk.gui.qt.moviemaker/resources/video-camera.svg b/Plugins/org.mitk.gui.qt.moviemaker/resources/video-camera.svg
index 253d2d4cb9..2cb2d02eae 100644
--- a/Plugins/org.mitk.gui.qt.moviemaker/resources/video-camera.svg
+++ b/Plugins/org.mitk.gui.qt.moviemaker/resources/video-camera.svg
@@ -1,54 +1,57 @@
diff --git a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp
index 12b65c6b6e..413aca9909 100644
--- a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp
+++ b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp
@@ -1,448 +1,427 @@
/*===================================================================
The Medical Imaging Interaction Toolkit (MITK)
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#include "QmitkScreenshotMaker.h"
//#include "QmitkMovieMakerControls.h"
#include "QmitkStepperAdapter.h"
#include "mitkVtkPropRenderer.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "qapplication.h"
#include "vtkImageWriter.h"
#include "vtkJPEGWriter.h"
#include "vtkPNGWriter.h"
#include "vtkRenderLargeImage.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkTestUtilities.h"
#include
#include "vtkMitkRenderProp.h"
#include
#include
#include "vtkRenderWindowInteractor.h"
#include
#include "mitkSliceNavigationController.h"
#include "mitkPlanarFigure.h"
QmitkScreenshotMaker::QmitkScreenshotMaker(QObject *parent, const char * /*name*/)
: QmitkAbstractView(),
m_Controls(nullptr),
m_BackgroundColor(QColor(0,0,0)),
m_SelectedNode(0)
{
parentWidget = parent;
}
QmitkScreenshotMaker::~QmitkScreenshotMaker()
{
}
void QmitkScreenshotMaker::CreateConnections()
{
if (m_Controls)
{
connect((QObject*) m_Controls->m_AllViews, SIGNAL(clicked()), (QObject*) this, SLOT(GenerateMultiplanar3DHighresScreenshot()));
- connect((QObject*) m_Controls->m_View1, SIGNAL(clicked()), (QObject*) this, SLOT(View1()));
- connect((QObject*) m_Controls->m_View2, SIGNAL(clicked()), (QObject*) this, SLOT(View2()));
- connect((QObject*) m_Controls->m_View3, SIGNAL(clicked()), (QObject*) this, SLOT(View3()));
connect((QObject*) m_Controls->m_Shot, SIGNAL(clicked()), (QObject*) this, SLOT(GenerateMultiplanarScreenshots()));
connect((QObject*) m_Controls->m_BackgroundColor, SIGNAL(clicked()), (QObject*) this, SLOT(SelectBackgroundColor()));
connect((QObject*) m_Controls->btnScreenshot, SIGNAL(clicked()), this, SLOT(GenerateScreenshot()));
connect((QObject*) m_Controls->m_HRScreenshot, SIGNAL(clicked()), this, SLOT(Generate3DHighresScreenshot()));
QString styleSheet = "background-color:rgb(0,0,0)";
m_Controls->m_BackgroundColor->setStyleSheet(styleSheet);
}
}
void QmitkScreenshotMaker::GenerateScreenshot()
{
if (m_LastFile.size()==0)
m_LastFile = QDir::currentPath()+"/screenshot.png";
QString filter;
QString fileName = QFileDialog::getSaveFileName(nullptr, "Save screenshot to...", m_LastFile, m_PNGExtension + ";;" + m_JPGExtension, &filter);
if (fileName.size()>0)
m_LastFile = fileName;
auto renderWindowPart = this->GetRenderWindowPart(OPEN);
mitk::BaseRenderer* renderer = renderWindowPart->GetActiveQmitkRenderWindow()->GetRenderer();
renderer = nullptr; // WORKAROUND FOR T23702
if (renderer == nullptr)
{
renderer = renderWindowPart->GetQmitkRenderWindow(m_Controls->m_DirectionBox->currentText())->GetRenderer();
if (renderer == nullptr)
return;
}
this->TakeScreenshot(renderer->GetVtkRenderer(), 1, fileName, filter);
}
void QmitkScreenshotMaker::GenerateMultiplanarScreenshots()
{
if (m_LastPath.size()==0)
m_LastPath = QDir::currentPath();
QString filePath = QFileDialog::getExistingDirectory(nullptr, "Save screenshots to...", m_LastPath);
if (filePath.size()>0)
m_LastPath = filePath;
if( filePath.isEmpty() )
{
return;
}
//emit StartBlockControls();
auto renderWindowPart = this->GetRenderWindowPart(OPEN);
renderWindowPart->EnableDecorations(false, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION});
QString fileName = "/axial.png";
int c = 1;
while (QFile::exists(filePath+fileName))
{
fileName = QString("/axial_");
fileName += QString::number(c);
fileName += ".png";
c++;
}
vtkRenderer* renderer = renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer()->GetVtkRenderer();
if (renderer != nullptr)
this->TakeScreenshot(renderer, 1, filePath+fileName);
fileName = "/sagittal.png";
c = 1;
while (QFile::exists(filePath+fileName))
{
fileName = QString("/sagittal_");
fileName += QString::number(c);
fileName += ".png";
c++;
}
renderer = renderWindowPart->GetQmitkRenderWindow("sagittal")->GetRenderer()->GetVtkRenderer();
if (renderer != nullptr)
this->TakeScreenshot(renderer, 1, filePath+fileName);
fileName = "/coronal.png";
c = 1;
while (QFile::exists(filePath+fileName))
{
fileName = QString("/coronal_");
fileName += QString::number(c);
fileName += ".png";
c++;
}
renderer = renderWindowPart->GetQmitkRenderWindow("coronal")->GetRenderer()->GetVtkRenderer();
if (renderer != nullptr)
this->TakeScreenshot(renderer, 1, filePath+fileName);
/// TODO I do not find a simple way of doing this through the render window part API,
/// however, I am also not convinced that this code is needed at all. The colour
/// of the crosshair planes is never set to any colour other than these.
/// I suggest a new 'mitk::DataNode* mitk::ILinkedRendererPart::GetSlicingPlane(const std::string& name) const'
/// function to introduce that could return the individual ("axial", "sagittal" or
/// "coronal" crosshair planes.
// mitk::DataNode* n = renderWindowPart->GetSlicingPlane("axial");
// if (n)
// {
// n->SetProperty( "color", mitk::ColorProperty::New( 1,0,0 ) );
// }
//
// n = renderWindowPart->GetSlicingPlane("sagittal");
// if (n)
// {
// n->SetProperty( "color", mitk::ColorProperty::New( 0,1,0 ) );
// }
//
// n = renderWindowPart->GetSlicingPlane("coronal");
// if (n)
// {
// n->SetProperty( "color", mitk::ColorProperty::New( 0,0,1 ) );
// }
renderWindowPart->EnableDecorations(true, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION});
}
void QmitkScreenshotMaker::Generate3DHighresScreenshot()
{
if (m_LastFile.size()==0)
m_LastFile = QDir::currentPath()+"/3D_screenshot.png";
QString filter;
QString fileName = QFileDialog::getSaveFileName(nullptr, "Save screenshot to...", m_LastFile, m_PNGExtension + ";;" + m_JPGExtension, &filter);
if (fileName.size()>0)
m_LastFile = fileName;
GenerateHR3DAtlasScreenshots(fileName, filter);
mitk::RenderingManager::GetInstance()->RequestUpdateAll();
}
void QmitkScreenshotMaker::GenerateMultiplanar3DHighresScreenshot()
{
if (m_LastPath.size()==0)
m_LastPath = QDir::currentPath();
QString filePath = QFileDialog::getExistingDirectory( nullptr, "Save screenshots to...", m_LastPath);
if (filePath.size()>0)
m_LastPath = filePath;
if( filePath.isEmpty() )
{
return;
}
QString fileName = "/3D_View1.png";
int c = 1;
while (QFile::exists(filePath+fileName))
{
fileName = QString("/3D_View1_");
fileName += QString::number(c);
fileName += ".png";
c++;
}
GetCam()->Azimuth( -7.5 );
GetCam()->Roll(-4);
GenerateHR3DAtlasScreenshots(filePath+fileName);
GetCam()->Roll(4);
fileName = "/3D_View2.png";
c = 1;
while (QFile::exists(filePath+fileName))
{
fileName = QString("/3D_View2_");
fileName += QString::number(c);
fileName += ".png";
c++;
}
GetCam()->Azimuth( 90 );
GetCam()->Elevation( 4 );
GenerateHR3DAtlasScreenshots(filePath+fileName);
fileName = "/3D_View3.png";
c = 1;
while (QFile::exists(filePath+fileName))
{
fileName = QString("/3D_View3_");
fileName += QString::number(c);
fileName += ".png";
c++;
}
GetCam()->Elevation( 90 );
GetCam()->Roll( -2.5 );
GenerateHR3DAtlasScreenshots(filePath+fileName);
mitk::RenderingManager::GetInstance()->RequestUpdateAll();
}
void QmitkScreenshotMaker::GenerateHR3DAtlasScreenshots(QString fileName, QString filter)
{
// only works correctly for 3D RenderWindow
this->GetRenderWindowPart()->EnableDecorations(false, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION});
vtkRenderer* renderer = this->GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetRenderer()->GetVtkRenderer();
if (renderer == nullptr)
return;
this->TakeScreenshot(renderer, this->m_Controls->m_MagFactor->text().toFloat(), fileName, filter);
this->GetRenderWindowPart()->EnableDecorations(true, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION});
}
vtkCamera* QmitkScreenshotMaker::GetCam()
{
mitk::BaseRenderer* renderer = this->GetRenderWindowPart(OPEN)->GetQmitkRenderWindow("3d")->GetRenderer();
vtkCamera* cam = 0;
const mitk::VtkPropRenderer *propRenderer = dynamic_cast( renderer );
if (propRenderer)
{
// get vtk renderer
vtkRenderer* vtkrenderer = propRenderer->GetVtkRenderer();
if (vtkrenderer)
{
// get vtk camera
vtkCamera* vtkcam = vtkrenderer->GetActiveCamera();
if (vtkcam)
{
// vtk smart pointer handling
cam = vtkcam;
cam->Register( nullptr );
}
}
}
return cam;
}
-void QmitkScreenshotMaker::View1()
-{
- GetCam()->Elevation( 45 );
- mitk::RenderingManager::GetInstance()->RequestUpdateAll();
-}
-
-void QmitkScreenshotMaker::View2()
-{
- GetCam()->Azimuth(45);
- mitk::RenderingManager::GetInstance()->RequestUpdateAll();
-}
-
-void QmitkScreenshotMaker::View3()
-{
- GetCam()->Roll(45);
- mitk::RenderingManager::GetInstance()->RequestUpdateAll();
-}
-
void QmitkScreenshotMaker::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes)
{
if(nodes.size())
m_SelectedNode = nodes[0];
}
void QmitkScreenshotMaker::CreateQtPartControl(QWidget *parent)
{
if (!m_Controls)
{
m_Parent = parent;
m_Controls = new Ui::QmitkScreenshotMakerControls;
m_Controls->setupUi(parent);
// Initialize "Selected Window" combo box
const mitk::RenderingManager::RenderWindowVector rwv =
mitk::RenderingManager::GetInstance()->GetAllRegisteredRenderWindows();
}
this->CreateConnections();
}
void QmitkScreenshotMaker::SetFocus()
{
m_Controls->btnScreenshot->setFocus();
}
void QmitkScreenshotMaker::RenderWindowPartActivated(mitk::IRenderWindowPart* /*renderWindowPart*/)
{
m_Parent->setEnabled(true);
}
void QmitkScreenshotMaker::RenderWindowPartDeactivated(mitk::IRenderWindowPart* /*renderWindowPart*/)
{
m_Parent->setEnabled(false);
}
void QmitkScreenshotMaker::TakeScreenshot(vtkRenderer* renderer, unsigned int magnificationFactor, QString fileName, QString filter)
{
if ((renderer == nullptr) ||(magnificationFactor < 1) || fileName.isEmpty())
return;
bool doubleBuffering( renderer->GetRenderWindow()->GetDoubleBuffer() );
renderer->GetRenderWindow()->DoubleBufferOff();
vtkImageWriter* fileWriter = nullptr;
QFileInfo fi(fileName);
QString suffix = fi.suffix().toLower();
if (suffix.isEmpty() || (suffix != "png" && suffix != "jpg" && suffix != "jpeg"))
{
if (filter == m_PNGExtension)
{
suffix = "png";
}
else if (filter == m_JPGExtension)
{
suffix = "jpg";
}
fileName += "." + suffix;
}
if (suffix.compare("jpg", Qt::CaseInsensitive) == 0 || suffix.compare("jpeg", Qt::CaseInsensitive) == 0)
{
vtkJPEGWriter* w = vtkJPEGWriter::New();
w->SetQuality(100);
w->ProgressiveOff();
fileWriter = w;
}
else //default is png
{
fileWriter = vtkPNGWriter::New();
}
vtkRenderLargeImage* magnifier = vtkRenderLargeImage::New();
magnifier->SetInput(renderer);
magnifier->SetMagnification(magnificationFactor);
//magnifier->Update();
fileWriter->SetInputConnection(magnifier->GetOutputPort());
fileWriter->SetFileName(fileName.toLatin1());
// vtkRenderLargeImage has problems with different layers, therefore we have to
// temporarily deactivate all other layers.
// we set the background to white, because it is nicer than black...
double oldBackground[3];
renderer->GetBackground(oldBackground);
// QColor color = QColorDialog::getColor();
double bgcolor[] = {m_BackgroundColor.red()/255.0, m_BackgroundColor.green()/255.0, m_BackgroundColor.blue()/255.0};
renderer->SetBackground(bgcolor);
mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart();
renderWindowPart->EnableDecorations(false);
fileWriter->Write();
fileWriter->Delete();
renderWindowPart->EnableDecorations(true);
renderer->SetBackground(oldBackground);
renderer->GetRenderWindow()->SetDoubleBuffer(doubleBuffering);
}
void QmitkScreenshotMaker::SelectBackgroundColor()
{
m_BackgroundColor = QColorDialog::getColor();
m_Controls->m_BackgroundColor->setAutoFillBackground(true);
QString styleSheet = "background-color:rgb(";
styleSheet.append(QString::number(m_BackgroundColor.red()));
styleSheet.append(",");
styleSheet.append(QString::number(m_BackgroundColor.green()));
styleSheet.append(",");
styleSheet.append(QString::number(m_BackgroundColor.blue()));
styleSheet.append(")");
m_Controls->m_BackgroundColor->setStyleSheet(styleSheet);
}
diff --git a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h
index d5028f4715..3fde4127d5 100644
--- a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h
+++ b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h
@@ -1,132 +1,129 @@
/*===================================================================
The Medical Imaging Interaction Toolkit (MITK)
Copyright (c) German Cancer Research Center,
Division of Medical and Biological Informatics.
All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
See LICENSE.txt or http://www.mitk.org for details.
===================================================================*/
#if !defined(QMITK_ScreenshotMaker_H__INCLUDED)
#define QMITK_ScreenshotMaker_H__INCLUDED
#include
#include
#include "mitkCameraRotationController.h"
#include "mitkStepper.h"
#include "mitkMultiStepper.h"
#include "mitkMovieGenerator.h"
#include "itkCommand.h"
#include "vtkEventQtSlotConnect.h"
#include "vtkRenderWindow.h"
#include "mitkVtkPropRenderer.h"
#include "ui_QmitkScreenshotMakerControls.h"
//#include "../MovieMakerDll.h"
//class QmitkMovieMakerControls;
class QmitkStepperAdapter;
class vtkCamera;
class QTimer;
class QTime;
/**
* \brief View for creating movies (AVIs)
*/
class QmitkScreenshotMaker: public QmitkAbstractView, public mitk::IRenderWindowPartListener
{
Q_OBJECT
public:
/** \brief Constructor. */
QmitkScreenshotMaker(QObject *parent=0, const char *name=0);
/** \brief Destructor. */
virtual ~QmitkScreenshotMaker();
/** \brief Method for creating the widget containing the application
* controls, like sliders, buttons etc.
*/
virtual void CreateQtPartControl(QWidget *parent) override;
// virtual QWidget * CreateControlWidget(QWidget *parent);
///
/// Sets the focus to an internal widget.
///
virtual void SetFocus() override;
/** \brief Method for creating the connections of main and control widget.
*/
virtual void CreateConnections();
/** \brief Method for creating an QAction object, i.e. button & menu entry.
* @param parent the parent QWidget
*/
// virtual QAction * CreateAction(QActionGroup *parent);
///
/// Called when a RenderWindowPart becomes available.
///
virtual void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override;
///
/// Called when a RenderWindowPart becomes unavailable.
///
virtual void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override;
signals:
protected slots:
void GenerateScreenshot();
void GenerateMultiplanarScreenshots();
void Generate3DHighresScreenshot();
void GenerateMultiplanar3DHighresScreenshot();
- void View1();
- void View2();
- void View3();
void SelectBackgroundColor();
protected:
QObject *parentWidget;
QWidget* m_Parent;
vtkEventQtSlotConnect * connections;
vtkRenderWindow * renderWindow;
mitk::VtkPropRenderer::Pointer m_PropRenderer;
Ui::QmitkScreenshotMakerControls* m_Controls;
private:
virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override;
vtkCamera* GetCam();
void GenerateHR3DAtlasScreenshots(QString fileName, QString filter = "");
void GenerateMultiplanarScreenshots(QString fileName);
/*!
\brief taking a screenshot "from" the specified renderer
\param magnificationFactor specifying the quality of the screenshot (the magnification of the actual RenderWindow size)
\param fileName file location and name where the screenshot should be saved
*/
void TakeScreenshot(vtkRenderer* renderer, unsigned int magnificationFactor, QString fileName, QString filter = "");
QColor m_BackgroundColor;
mitk::DataNode* m_SelectedNode;
QString m_LastPath;
QString m_LastFile;
QString m_PNGExtension = "PNG File (*.png)";
QString m_JPGExtension = "JPEG File (*.jpg)";
};
#endif // !defined(QMITK_ScreenshotMaker_H__INCLUDED)
diff --git a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMakerControls.ui b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMakerControls.ui
index d406327559..f80d180dac 100644
--- a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMakerControls.ui
+++ b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMakerControls.ui
@@ -1,241 +1,175 @@
QmitkScreenshotMakerControls
0
0
315
368
ScreenshotMaker
-
2D Screenshots
-
-
axial
-
coronal
-
sagittal
-
Single
-
Multiplanar
-
3D Screenshots (High-res)
-
Single
-
Multiplanar
-
-
0
0
Upsampling:
-
1
4
-
Options
-
-
-
-
- 30
- 30
-
-
-
-
- 30
- 30
-
-
-
- Rotate 3D camera 45° around x-axis.
-
-
- x
-
-
-
- -
-
-
-
- 30
- 30
-
-
-
-
- 30
- 30
-
-
-
- Rotate 3D camera 45° around y-axis.
-
+
- y
+ Background Color:
-
-
+
30
30
30
30
-
- Rotate 3D camera 45° around z-axis.
-
- z
+
-
Qt::Horizontal
- 36
+ 40
20
- -
-
-
- Background Color:
-
-
-
- -
-
-
-
- 30
- 30
-
-
-
-
- 30
- 30
-
-
-
-
-
-
-
-
Qt::Vertical
20
31
diff --git a/Plugins/org.mitk.gui.qt.photoacoustics.imageprocessing/resources/pai.svg b/Plugins/org.mitk.gui.qt.photoacoustics.imageprocessing/resources/pai.svg
index 0d16e11a8c..8002f7c6ec 100644
--- a/Plugins/org.mitk.gui.qt.photoacoustics.imageprocessing/resources/pai.svg
+++ b/Plugins/org.mitk.gui.qt.photoacoustics.imageprocessing/resources/pai.svg
@@ -1,49 +1,49 @@
diff --git a/Plugins/org.mitk.gui.qt.photoacoustics.pausviewer/resources/iconPAUSViewer.svg b/Plugins/org.mitk.gui.qt.photoacoustics.pausviewer/resources/iconPAUSViewer.svg
index 74e5579177..fa91872af4 100644
--- a/Plugins/org.mitk.gui.qt.photoacoustics.pausviewer/resources/iconPAUSViewer.svg
+++ b/Plugins/org.mitk.gui.qt.photoacoustics.pausviewer/resources/iconPAUSViewer.svg
@@ -1,62 +1,62 @@
diff --git a/Plugins/org.mitk.gui.qt.photoacoustics.simulation/resources/pai_simulation.svg b/Plugins/org.mitk.gui.qt.photoacoustics.simulation/resources/pai_simulation.svg
index 421003dd97..23e71640e5 100644
--- a/Plugins/org.mitk.gui.qt.photoacoustics.simulation/resources/pai_simulation.svg
+++ b/Plugins/org.mitk.gui.qt.photoacoustics.simulation/resources/pai_simulation.svg
@@ -1,74 +1,74 @@
diff --git a/Plugins/org.mitk.gui.qt.pointsetinteraction/plugin.xml b/Plugins/org.mitk.gui.qt.pointsetinteraction/plugin.xml
index 0f6f71c23d..6abe4aa718 100644
--- a/Plugins/org.mitk.gui.qt.pointsetinteraction/plugin.xml
+++ b/Plugins/org.mitk.gui.qt.pointsetinteraction/plugin.xml
@@ -1,10 +1,10 @@
diff --git a/Plugins/org.mitk.gui.qt.preprocessing.resampling/plugin.xml b/Plugins/org.mitk.gui.qt.preprocessing.resampling/plugin.xml
index 98e852ca8a..54ddf557d0 100644
--- a/Plugins/org.mitk.gui.qt.preprocessing.resampling/plugin.xml
+++ b/Plugins/org.mitk.gui.qt.preprocessing.resampling/plugin.xml
@@ -1,20 +1,20 @@
-
+
Resampling an Image to an specific sizes
diff --git a/Plugins/org.mitk.gui.qt.preprocessing.resampling/src/internal/QmitkPreprocessingResamplingViewControls.ui b/Plugins/org.mitk.gui.qt.preprocessing.resampling/src/internal/QmitkPreprocessingResamplingViewControls.ui
index da47359e1b..46da982a20 100644
--- a/Plugins/org.mitk.gui.qt.preprocessing.resampling/src/internal/QmitkPreprocessingResamplingViewControls.ui
+++ b/Plugins/org.mitk.gui.qt.preprocessing.resampling/src/internal/QmitkPreprocessingResamplingViewControls.ui
@@ -1,316 +1,286 @@
QmitkPreprocessingResamplingViewControls
0
0
448
980
Form
-
- Resample multiple images
+ Resample all selected images
-
-
- true
-
-
- 0
-
-
- 6
-
-
- 0
-
-
- 6
-
-
- Select an Image in Data Manager
+ Select an image in the Data Manager
true
-
false
Output image will be 3D
Choose time step if 4D
(Slider for both images)
false
-
false
Output image will be 3D
-
Qt::Vertical
254
403
-
Resample single image
-
-
- true
-
-
- 0
-
-
- 6
-
-
- 0
-
-
- 0
-
-
true
0
0
Qt::LeftToRight
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
5
-100.000000000000000
100.000000000000000
1.000000000000000
-
true
0
0
5
-100.000000000000000
100.000000000000000
1.000000000000000
-
true
0
0
5
-100.000000000000000
100.000000000000000
1.000000000000000
-
false
Resampling Parameter
false
-
false
x-spacing
false
-
false
y-spacing
false
-
false
Hide Original Image
true
-
false
z-spacing
-
false
Interpolation:
-
true
0
0
QmitkSliderNavigatorWidget
QWidget
QmitkSliderNavigatorWidget.h
dsbParam1
dsbParam2
dsbParam3
cbParam4
cbHideOrig
btnDoIt
buttonExecuteOnMultipleImages
leImage1
diff --git a/Plugins/org.mitk.gui.qt.properties/resources/property_list.svg b/Plugins/org.mitk.gui.qt.properties/resources/property_list.svg
index 64b70d796a..d0e8f3e4ae 100644
--- a/Plugins/org.mitk.gui.qt.properties/resources/property_list.svg
+++ b/Plugins/org.mitk.gui.qt.properties/resources/property_list.svg
@@ -1,54 +1,54 @@
diff --git a/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_IMGLiveWireUsage.PNG b/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_IMGLiveWireUsage.PNG
index 85e7b4e2aa..88e58d95d8 100644
Binary files a/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_IMGLiveWireUsage.PNG and b/Plugins/org.mitk.gui.qt.segmentation/documentation/UserManual/QmitkSegmentation_IMGLiveWireUsage.PNG differ
diff --git a/Plugins/org.mitk.gui.qt.viewnavigator/resources/view-manager.svg b/Plugins/org.mitk.gui.qt.viewnavigator/resources/view-manager.svg
index 0855bf469f..e86842ff3d 100644
--- a/Plugins/org.mitk.gui.qt.viewnavigator/resources/view-manager.svg
+++ b/Plugins/org.mitk.gui.qt.viewnavigator/resources/view-manager.svg
@@ -1,54 +1,57 @@