14#include <berryISelectionService.h>
15#include <berryIWorkbenchWindow.h>
18#include <mitkDataNode.h>
19#include <mitkNodePredicateNot.h>
20#include <mitkNodePredicateProperty.h>
21#include <mitkIRenderingManager.h>
22#include <mitkImageGenerator.h>
36#include <usModuleContext.h>
37#include <usGetModuleContext.h>
38#include "usServiceReference.h"
41#include <ui_QmitkUltrasoundSupportControls.h>
46 : m_Controls(nullptr), m_ControlCustomWidget(nullptr), m_ControlBModeWidget(nullptr),
47 m_ControlProbesWidget(nullptr), m_ImageAlreadySetToNode(false),
48 m_CurrentImageWidth(0), m_CurrentImageHeight(0)
55 pluginContext->connectServiceListener(
this,
"OnDeviceServiceEvent",
56 QString::fromStdString(
"(" + us::ServiceConstants::OBJECTCLASS() +
"=" + us_service_interface_iid<mitk::USDevice>() +
")"));
69 for (
size_t i = 0; i < devices.size(); i++)
71 mitk::USDevice::Pointer device = devices[i];
72 if (device.IsNotNull() && device->GetIsActive())
79 catch (std::exception &e)
81 MITK_ERROR <<
"Exception during call of destructor! Message: " << e.what();
100 m_Controls =
new Ui::UltrasoundSupportControls;
110 connect(
m_Controls->m_DeviceManagerWidget, SIGNAL(NewDeviceButtonClicked()), this->
m_Controls->m_NewVideoDeviceWidget, SLOT(CreateNewDevice()));
125 connect(
m_Controls->m_DeviceManagerWidget, SIGNAL(EditDeviceButtonClicked(mitk::USDevice::Pointer)), this->
m_Controls->m_NewVideoDeviceWidget, SLOT(EditDevice(mitk::USDevice::Pointer)));
135 m_Controls->m_NewVideoDeviceWidget->setVisible(
false);
136 std::string filter =
"(&(" + us::ServiceConstants::OBJECTCLASS() +
"="
137 +
"org.mitk.services.UltrasoundDevice)("
141 m_Controls->m_ActiveVideoDevices->SetAutomaticallySelectFirstEntry(
true);
146 m_Controls->tabWidget->setTabEnabled(1,
false);
152 m_Controls->m_NewVideoDeviceWidget->setVisible(
true);
153 m_Controls->m_DeviceManagerWidget->setVisible(
false);
154 m_Controls->m_Headline->setText(
"Add New Video Device:");
155 m_Controls->m_WidgetActiveDevices->setVisible(
false);
160 m_Controls->m_NewVideoDeviceWidget->setVisible(
true);
161 m_Controls->m_DeviceManagerWidget->setVisible(
false);
162 m_Controls->m_WidgetActiveDevices->setVisible(
false);
163 m_Controls->m_Headline->setText(
"Edit Video Device:");
174 if (
m_Controls->m_ShowImageStream->isChecked())
179 mitk::Image::Pointer curOutput =
m_Device->GetOutput(i);
180 if (curOutput->IsEmpty())
182 m_Node.at(i)->SetName(
"No Data received yet ...");
184 mitk::Image::Pointer randomImage = mitk::ImageGenerator::GenerateRandomImage<float>(32, 32, 1, 1, 1, 1, 1, 255, 0);
185 m_Node.at(i)->SetData(randomImage);
186 curOutput->SetGeometry(randomImage->GetGeometry());
190 std::stringstream nodeName;
191 nodeName <<
"US Viewing Stream - Image " << i;
192 m_Node.at(i)->SetName(nodeName.str());
193 m_Node.at(i)->SetData(curOutput);
198 (curOutput->GetGeometry() !=
nullptr) &&
202 mitk::IRenderWindowPart* renderWindow = this->GetRenderWindowPart();
203 if ((renderWindow !=
nullptr) && (curOutput->GetTimeGeometry()->IsValid()) && (
m_Controls->m_ShowImageStream->isChecked()))
205 renderWindow->GetRenderingManager()->InitializeViews(curOutput->GetGeometry());
209 m_OldGeometry =
dynamic_cast<mitk::SlicedGeometry3D*
>(curOutput->GetGeometry());
221 int nMilliseconds =
m_Clock.restart();
222 int fps = 1000.0 / nMilliseconds;
230 m_Controls->m_FramerateLabel->setText(
"Current Framerate: " + QString::number(lowestFPS) +
" FPS");
239 this->RequestRenderWindowUpdate(mitk::RenderingManager::REQUEST_UPDATE_2DWINDOWS);
245 int fps = 1000.0f / (nMilliseconds);
256 this->RequestRenderWindowUpdate(mitk::RenderingManager::REQUEST_UPDATE_3DWINDOWS);
262 int fps = 1000.0f / (nMilliseconds);
271 int intervalPipeline = (1000 /
m_Controls->m_FrameRatePipeline->value());
272 int interval2D = (1000 /
m_Controls->m_FrameRate2d->value());
273 int interval3D = (1000 /
m_Controls->m_FrameRate3d->value());
282 MITK_WARN(
"UltrasoundSupport") <<
"Freeze button clicked though no device is selected.";
288 m_Controls->m_FreezeButton->setText(
"Freeze");
293 m_Controls->m_FreezeButton->setText(
"Start Viewing Again");
302 for (
size_t j = 0; j <
m_Node.size(); j++)
304 this->GetDataStorage()->Remove(
m_Node.at(j));
305 m_Node.at(j)->ReleaseData();
312 m_Controls->tabWidget->setTabEnabled(1,
false);
319 mitk::DataNode::Pointer currentNode = mitk::DataNode::New();
320 std::stringstream nodeName;
321 nodeName <<
"US Viewing Stream - Image " << i;
322 currentNode->SetName(nodeName.str());
324 mitk::Image::Pointer dummyImage = mitk::ImageGenerator::GenerateRandomImage<float>(100, 100, 1, 1, 1, 1, 1, 255, 0);
325 currentNode->SetData(dummyImage);
326 m_OldGeometry =
dynamic_cast<mitk::SlicedGeometry3D*
>(dummyImage->GetGeometry());
327 m_Node.push_back(currentNode);
329 if (
m_Controls->m_ShowImageStream->isChecked())
331 this->GetDataStorage()->Add(
m_Node.at(i));
337 m_Controls->tabWidget->setTabEnabled(1,
true);
342 int intervalPipeline = (1000 /
m_Controls->m_FrameRatePipeline->value());
343 int interval2D = (1000 /
m_Controls->m_FrameRate2d->value());
344 int interval3D = (1000 /
m_Controls->m_FrameRate3d->value());
357 m_Controls->m_NewVideoDeviceWidget->setVisible(
false);
358 m_Controls->m_DeviceManagerWidget->setVisible(
true);
359 m_Controls->m_Headline->setText(
"Ultrasound Devices:");
360 m_Controls->m_WidgetActiveDevices->setVisible(
true);
371 if (!
m_Device->GetControlInterfaceBMode())
373 m_Controls->m_ToolBoxControlWidgets->setItemEnabled(
m_Controls->m_ToolBoxControlWidgets->count() - 1,
false);
379 if (!
m_Device->GetControlInterfaceDoppler())
381 m_Controls->m_ToolBoxControlWidgets->setItemEnabled(
m_Controls->m_ToolBoxControlWidgets->count() - 1,
false);
387 std::string filter =
"(org.mitk.services.UltrasoundCustomWidget.deviceClass=" +
m_Device->GetDeviceClass() +
")";
397 if (
m_Device->GetDeviceClass().compare(
"IGTL Client") == 0)
402 QString interfaceName = QString::fromStdString(us_service_interface_iid<QmitkUSAbstractCustomWidget>());
414 m_Controls->m_ToolBoxControlWidgets->addItem(
new QWidget(
m_Controls->m_ToolBoxControlWidgets),
"Custom Controls");
415 m_Controls->m_ToolBoxControlWidgets->setItemEnabled(
m_Controls->m_ToolBoxControlWidgets->count() - 1,
false);
420 for (
int n = 0; n <
m_Controls->m_ToolBoxControlWidgets->count(); ++n)
422 if (
m_Controls->m_ToolBoxControlWidgets->isItemEnabled(n))
424 m_Controls->m_ToolBoxControlWidgets->setCurrentIndex(n);
435 while (
m_Controls->m_ToolBoxControlWidgets->count() > 0)
437 m_Controls->m_ToolBoxControlWidgets->removeItem(0);
465 if (
m_Device.IsNull() || event.getType() != ctkServiceEvent::MODIFIED)
470 ctkServiceReference service =
event.getServiceReference();
488 mitk::LevelWindow levelWindow;
489 m_Node.at(0)->GetLevelWindow(levelWindow);
490 levelWindow.SetAuto(
m_curOutput.at(0),
true,
true);
491 m_Node.at(0)->SetLevelWindow(levelWindow);
498 settings.beginGroup(QString::fromStdString(
VIEW_ID));
499 settings.setValue(
"DisplayImage", QVariant(
m_Controls->m_ShowImageStream->isChecked()));
500 settings.setValue(
"RunImageTimer", QVariant(
m_Controls->m_RunImageTimer->isChecked()));
501 settings.setValue(
"Update2DView", QVariant(
m_Controls->m_Update2DView->isChecked()));
502 settings.setValue(
"Update3DView", QVariant(
m_Controls->m_Update3DView->isChecked()));
503 settings.setValue(
"UpdateRatePipeline", QVariant(
m_Controls->m_FrameRatePipeline->value()));
504 settings.setValue(
"UpdateRate2d", QVariant(
m_Controls->m_FrameRate2d->value()));
505 settings.setValue(
"UpdateRate3d", QVariant(
m_Controls->m_FrameRate3d->value()));
512 settings.beginGroup(QString::fromStdString(
VIEW_ID));
513 m_Controls->m_ShowImageStream->setChecked(settings.value(
"DisplayImage",
true).toBool());
514 m_Controls->m_RunImageTimer->setChecked(settings.value(
"RunImageTimer",
true).toBool());
515 m_Controls->m_Update2DView->setChecked(settings.value(
"Update2DView",
true).toBool());
516 m_Controls->m_Update3DView->setChecked(settings.value(
"Update3DView",
true).toBool());
517 m_Controls->m_FrameRatePipeline->setValue(settings.value(
"UpdateRatePipeline", 50).toInt());
518 m_Controls->m_FrameRate2d->setValue(settings.value(
"UpdateRate2d", 20).toInt());
519 m_Controls->m_FrameRate3d->setValue(settings.value(
"UpdateRate3d", 5).toInt());
549 m_Xpoint1 = this->GetRenderWindowPart(mitk::WorkbenchUtil::OPEN)->GetSelectedPosition();
555 m_Xpoint2 = this->GetRenderWindowPart(mitk::WorkbenchUtil::OPEN)->GetSelectedPosition();
561 m_Ypoint1 = this->GetRenderWindowPart(mitk::WorkbenchUtil::OPEN)->GetSelectedPosition();
567 m_Ypoint2 = this->GetRenderWindowPart(mitk::WorkbenchUtil::OPEN)->GetSelectedPosition();
574 MITK_INFO <<
"Spacing saved to device object, please save device data to permanently store the spacing.";
579 double pointDistance = p1.EuclideanDistanceTo(p2);
580 spacing = distance / pointDistance;
QmitkUSAbstractCustomWidget * m_ControlCustomWidget
void OnClickedAddNewDevice()
int m_FrameCounterPipeline
~QmitkUltrasoundSupport() override
void CreateQtPartControl(QWidget *parent) override
void OnChangedFramerateLimit()
void OnClickedEditDevice()
mitk::USDevice::Pointer m_Device
unsigned int m_AmountOfOutputs
QmitkUSControlsProbesWidget * m_ControlProbesWidget
QTimer * m_RenderingTimer2d
void OnNewDeviceWidgetDone()
std::vector< mitk::Image::Pointer > m_curOutput
void RemoveControlWidgets()
void OnClickedFreezeButton()
unsigned int m_CurrentImageHeight
QmitkUSControlsDopplerWidget * m_ControlDopplerWidget
void WriteSpacingToDevice()
QmitkUSControlsBModeWidget * m_ControlBModeWidget
QTimer * m_RenderingTimer3d
static const std::string VIEW_ID
void OnDeviceServiceEvent(const ctkServiceEvent event)
std::vector< mitk::DataNode::Pointer > m_Node
Ui::UltrasoundSupportControls * m_Controls
unsigned int m_CurrentImageWidth
void CreateControlWidgets()
double m_CurrentDynamicRange
void OnChangedActiveDevice()
QList< ctkServiceReference > m_CustomWidgetServiceReference
void SetTimerIntervals(int intervalPipeline, int interval2D, int interval3D)
mitk::SlicedGeometry3D::Pointer m_OldGeometry
double ComputeSpacing(mitk::Point3D p1, mitk::Point3D p2, double distance)
A device holds information about it's model, make and the connected probes. It is the common super cl...
static mitk::USDevice::PropertyKeys GetPropertyKeys()
static std::string GetDeviceClassStatic()
static ctkPluginContext * GetContext()
MITKIGTBASE_EXPORT bool Equal(const mitk::NavigationData &leftHandSide, const mitk::NavigationData &rightHandSide, ScalarType eps=mitk::eps, bool verbose=false)
Equal A function comparing two navigation data objects for beeing equal in meta- and imagedata.
const std::string US_PROPKEY_ISACTIVE
const std::string US_PROPKEY_MANUFACTURER
const std::string US_PROPKEY_NAME
const std::string US_PROPKEY_BMODE_DYNAMIC_RANGE
const std::string US_PROPKEY_LABEL