【MITK】深入理解导航(IGT)插件

来源: http://docs.mitk.org/nightly/IGTTutorialStepAdvanced.html


1 IGT组件

QmitkNavigationToolCreationWidget等等:
在这里插入图片描述

2 数据获取

如何获得跟踪工具及跟踪数据?最简单的方法是使用The MITK-IGT Navigation Tool Manager加载、创建或编辑工具并通过NavigationToolStorage访问它。它由microservice提供,可以通过如下方法访问它(确保你的模块依赖于IGT):

us::ModuleContext* context = us::GetModuleContext();
std::vector<us::ServiceReference <mitk::NavigationToolStorage> > refs = context->GetServiceReferences<mitk::NavigationToolStorage>();
m_ToolStorage = context->GetService<mitk::NavigationToolStorage>(refs.front());

然后,通过下面的方法获取工具:

m_ToolStorage->GetTool();

它还有很多不同的功能,例如提供可用工具的数量或当前跟踪设备的名称。详细参见mitk :: NavigationToolStorage的文档。

3 自动加载上次会话中的所有参数

为增加应用程序可用性,跟踪工具箱将恢复上次会话的所有参数。因此我们将使用下面的代码来保存所有参数,它也可以用于特定的跟踪设备小部件。

3.1 存储当前设置

void QmitkMITKIGTTrackingToolboxView::StoreUISettings()
{
	// persistence service does not directly work in plugins for now
	// -> using QSettings
	QSettings settings;
	settings.beginGroup(QString::fromStdString(VIEW_ID));
	MITK_DEBUG << "Store UI settings";
	// set the values of some widgets and attrbutes to the QSettings
	settings.setValue("ShowTrackingVolume", QVariant(m_Controls->m_ShowTrackingVolume->isChecked()));
	settings.setValue("toolStorageFilename", QVariant(m_ToolStorageFilename));
	settings.setValue("VolumeSelectionBox", QVariant(m_Controls->m_VolumeSelectionBox->currentIndex()));
	settings.setValue("SimpleModeEnabled", QVariant(m_SimpleModeEnabled));
	settings.setValue("OpenIGTLinkDataFormat", QVariant(m_Controls->m_OpenIGTLinkDataFormat->currentIndex()));
	settings.setValue("EnableOpenIGTLinkMicroService", QVariant(m_Controls->m_EnableOpenIGTLinkMicroService->isChecked()));
	settings.endGroup();
}

3.2 重新加载(存储的)设置

void QmitkMITKIGTTrackingToolboxView::LoadUISettings()
{
	// persistence service does not directly work in plugins for now -> using QSettings
	QSettings settings;
	settings.beginGroup(QString::fromStdString(VIEW_ID));
	// set some widgets and attributes by the values from the QSettings
	m_Controls->m_ShowTrackingVolume->setChecked(settings.value("ShowTrackingVolume", false).toBool());
	m_Controls->m_EnableOpenIGTLinkMicroService->setChecked(settings.value("EnableOpenIGTLinkMicroService", true).toBool());
	m_Controls->m_VolumeSelectionBox->setCurrentIndex(settings.value("VolumeSelectionBox", 0).toInt());
	m_Controls->m_OpenIGTLinkDataFormat->setCurrentIndex(settings.value("OpenIGTLinkDataFormat", 0).toInt());
	m_ToolStorageFilename = settings.value("toolStorageFilename", QVariant("")).toString();
	if (settings.value("SimpleModeEnabled", false).toBool()) 
	{ 
		this->OnToggleAdvancedSimpleMode(); 
	}
	settings.endGroup();
}

4 加载工具集(Tool Storage)

该代码用于加载以前存储或自动保存的tool storage:

// try to deserialize the tool storage from the given tool storage file name
if (!m_ToolStorageFilename.isEmpty())
{
	// try-catch block for exceptions
	try
	{
		mitk::NavigationToolStorageDeserializer::Pointer myDeserializer = mitk::NavigationToolStorageDeserializer::New(GetDataStorage());
		m_toolStorage->UnRegisterMicroservice();
		m_toolStorage = myDeserializer->Deserialize(m_ToolStorageFilename.toStdString());
		m_toolStorage->RegisterAsMicroservice();
		//update label
		UpdateToolStorageLabel(m_ToolStorageFilename);
		//update tool preview
		m_Controls->m_TrackingToolsStatusWidget->RemoveStatusLabels();
		m_Controls->m_TrackingToolsStatusWidget->PreShowTools(m_toolStorage);
	}
	catch (mitk::IGTException e)
	{
		MITK_WARN("QmitkMITKIGTTrackingToolBoxView") << "Error during restoring tools. Problems with file (" << m_ToolStorageFilename.toStdString() << "), please check the file? Error message: "<<e.GetDescription();
		this->OnResetTools(); //if there where errors reset the tool storage to avoid problems later on
	}
}

5 多线程跟踪

//initialize worker thread
m_WorkerThread = new QThread();
m_Worker = new QmitkMITKIGTTrackingToolboxViewWorker();

连接槽函数:

//connect worker thread
connect(m_Worker, SIGNAL(AutoDetectToolsFinished(bool, QString)), this, SLOT(OnAutoDetectToolsFinished(bool, QString)));
connect(m_Worker, SIGNAL(ConnectDeviceFinished(bool, QString)), this, SLOT(OnConnectFinished(bool, QString)));
connect(m_Worker, SIGNAL(StartTrackingFinished(bool, QString)), this, SLOT(OnStartTrackingFinished(bool, QString)));
connect(m_Worker, SIGNAL(StopTrackingFinished(bool, QString)), this, SLOT(OnStopTrackingFinished(bool, QString)));
connect(m_Worker, SIGNAL(DisconnectDeviceFinished(bool, QString)), this, SLOT(OnDisconnectFinished(bool, QString)));
connect(m_WorkerThread, SIGNAL(started()), m_Worker, SLOT(ThreadFunc()));
connect(m_Worker, SIGNAL(ConnectDeviceFinished(bool, QString)), m_Controls->m_ConfigurationWidget, SLOT(OnConnected(bool)));
connect(m_Worker, SIGNAL(DisconnectDeviceFinished(bool, QString)), m_Controls->m_ConfigurationWidget, SLOT(OnDisconnected(bool)));
connect(m_Worker, SIGNAL(StartTrackingFinished(bool, QString)), m_Controls->m_ConfigurationWidget, SLOT(OnStartTracking(bool)));
connect(m_Worker, SIGNAL(StopTrackingFinished(bool, QString)), m_Controls->m_ConfigurationWidget, SLOT(OnStopTracking(bool)));
//Add Listener, so that we know when the toolStorage changed.
std::string m_Filter = "(" + us::ServiceConstants::OBJECTCLASS() + "=" + "org.mitk.services.NavigationToolStorage" + ")";
mitk::PluginActivator::GetContext()->connectServiceListener(this, "OnToolStorageChanged", QString(m_Filter.c_str()));
//move the worker to the thread
m_Worker->moveToThread(m_WorkerThread);

点击按钮后开启线程:

//initialize worker thread
m_Worker->SetWorkerMethod(QmitkMITKIGTTrackingToolboxViewWorker::eConnectDevice);
m_Worker->SetTrackingDevice(this->m_Controls->m_ConfigurationWidget->GetTrackingDevice());
m_Worker->SetInverseMode(m_Controls->m_InverseMode->isChecked());
m_Worker->SetNavigationToolStorage(this->m_toolStorage);
m_Worker->SetTrackingDeviceData(data);
//start worker thread
m_WorkerThread->start();

完成之后:

m_WorkerThread->quit();
m_WorkerThread->wait();

可以从线程中获取数据:

//get data from worker thread
m_TrackingDeviceData = m_Worker->GetTrackingDeviceData();
m_ToolVisualizationFilter = m_Worker->GetToolVisualizationFilter();
if( m_ToolVisualizationFilter.IsNotNull() )
{
	//Connect the NeedleProjectionFilter to the ToolVisualizationFilter as third filter of the IGT pipeline
	m_NeedleProjectionFilter->ConnectTo(m_ToolVisualizationFilter);
	if (m_Controls->showHideToolProjectionCheckBox->isChecked())
	{
		ShowToolProjection(m_Controls->m_toolselector->currentIndex());
	}
}

这些函数通过ThreadFunc函数的选择来执行:

void QmitkMITKIGTTrackingToolboxViewWorker::ThreadFunc()
{
	switch (m_WorkerMethod)
	{
		case eAutoDetectTools:
			this->AutoDetectTools();
			break;
		case eConnectDevice:
			this->ConnectDevice();
			break;
		case eStartTracking:
			this->StartTracking();
			break;
		case eStopTracking:
			this->StopTracking();
			break;
		case eDisconnectDevice:
			this->DisconnectDevice();
			break;
		default:
			MITK_WARN << "Undefined worker method was set ... something went wrong!";
			break;
	}
}

终止并删除线程:

// wait for thread to finish
m_WorkerThread->terminate();
m_WorkerThread->wait();
//clean up worker thread
if (m_WorkerThread) 
{ 
	delete m_WorkerThread; 
	}
if (m_Worker) 
{ 
	delete m_Worker; 
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值