Hi Daphné,

Sorry for the late answer. We asked around to check if really nobody is/was 
using the curved geometry stuff. Unfortunately not. However, I remember that I 
once implemented a slider in a plugin which was supposed to slide through 
slices along a curved path. The path was defined by points (center + 2 points 
for axes) per slice. And here is the snippet (quite old, but shouldn't be too 
hard to adapt, if necessary at all):

#include <QmitkRenderWindow.h>

void QmitkMyPrototypeView::OnSliderValueChanged(int value)
{
  if (value >= m_SliceOrientations.size())
    return;

  vtkSmartPointer<vtkSphereSource> originSource = 
vtkSmartPointer<vtkSphereSource>::New();

  originSource->SetCenter(
    m_SliceOrientations[value].Origin[0],
    m_SliceOrientations[value].Origin[1],
    m_SliceOrientations[value].Origin[2]);
  originSource->SetRadius(1.0);
  originSource->SetThetaResolution(32);
  originSource->SetPhiResolution(32);

  vtkSmartPointer<vtkSphereSource> xAxisSource = 
vtkSmartPointer<vtkSphereSource>::New();

  xAxisSource->SetCenter(
    m_SliceOrientations[value].Origin[0] + m_SliceOrientations[value].XAxis[0] 
* (0.5 * m_TubeMajorAxis),
    m_SliceOrientations[value].Origin[1] + m_SliceOrientations[value].XAxis[1] 
* (0.5 * m_TubeMajorAxis),
    m_SliceOrientations[value].Origin[2] + m_SliceOrientations[value].XAxis[2] 
* (0.5 * m_TubeMajorAxis));
  xAxisSource->SetRadius(0.5);
  xAxisSource->SetThetaResolution(32);
  xAxisSource->SetPhiResolution(32);

  vtkSmartPointer<vtkSphereSource> zAxisSource = 
vtkSmartPointer<vtkSphereSource>::New();

  zAxisSource->SetCenter(
    m_SliceOrientations[value].Origin[0] + m_SliceOrientations[value].ZAxis[0] 
* (0.5 * m_TubeMinorAxis),
    m_SliceOrientations[value].Origin[1] + m_SliceOrientations[value].ZAxis[1] 
* (0.5 * m_TubeMinorAxis),
    m_SliceOrientations[value].Origin[2] + m_SliceOrientations[value].ZAxis[2] 
* (0.5 * m_TubeMinorAxis));
  zAxisSource->SetRadius(0.5);
  zAxisSource->SetThetaResolution(32);
  zAxisSource->SetPhiResolution(32);

  vtkSmartPointer<vtkAppendPolyData> appendPolyData = 
vtkSmartPointer<vtkAppendPolyData>::New();
  appendPolyData->AddInputConnection(originSource->GetOutputPort(0));
  appendPolyData->AddInputConnection(xAxisSource->GetOutputPort(0));
  appendPolyData->AddInputConnection(zAxisSource->GetOutputPort(0));

  appendPolyData->Update();
  
m_Surface->SetVtkPolyData(static_cast<vtkPolyData*>(appendPolyData->GetOutputDataObject(0)));

  // this->RequestRenderWindowUpdate();

  
this->GetRenderWindowPart()->GetQmitkRenderWindow("axial")->GetSliceNavigationController()->SelectSliceByPoint(
    m_SliceOrientations[value].Origin + 
mitk::Vector3D(m_Surface->GetGeometry()->GetOrigin().GetDataPointer()));

  
this->GetRenderWindowPart()->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()->SelectSliceByPoint(
    m_SliceOrientations[value].Origin + 
mitk::Vector3D(m_Surface->GetGeometry()->GetOrigin().GetDataPointer()));

  
this->GetRenderWindowPart()->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()->ReorientSlices(
    m_SliceOrientations[value].Origin + 
mitk::Vector3D(m_Surface->GetGeometry()->GetOrigin().GetDataPointer()),
    m_SliceOrientations[value].XAxis,
    m_SliceOrientations[value].ZAxis);
}


From: Daphné Wallach [mailto:daphne.wall...@hrv-simulation.com]
Sent: Freitag, 3. März 2017 16:50
To: mitk-users@lists.sourceforge.net
Subject: Re: [mitk-users] Curved MPR


Dear Mitk users,
I am still struggling with displaying a curved MPR, based on a set of points 
placed on the axial view by the user.

I wrote a piece of code similar to the one presented in a quite old thread 
(http://mitk-users.1123740.n5.nabble.com/Curved-MPR-is-cropped-for-some-reason-td2823.html,
 dating back from 2011). The workflow is the following:
 - create a ThinPlateSplineCurvedGeometry
 - give a frameGeometry (the same one as the dicom image) and a 
referenceGeometry to it
 - create a PlaneLandmarkProjector
 - give a projection plane and the landmarks to it
 - give the projector and the landmark to the ThinPlateSplineCurvedGeometry
 - compute the geometry of the ThinPlateSplineCurvedGeometry
 - give the ThinPlateSplineCurvedGeometry to the multiWidget through 
SetWorldGeometry3D.

However, the code crashes on the last instruction (SetWorldGeometry3D) with a 
cryptic message ("0xC0000005: Access violation reading...").

First, is this workflow correct? I saw other examples, where the 
ThinPlateSplineCurvedGeometry was also added to the datastorage (I tried it, 
and the same crash appears).

Second, I also looked at the code for the curvedmpr pluging (at 
http://mitk.org/git/?p=MITK.git;a=shortlog;h=refs/heads/bug-10719-curved-mpr-master-integration),
 and I have the impression that the main difference with the workflow I use is 
that the ThinPlateSplineCurvedGeometry is added to the datastorage. Moreover, 
it seems like development was stopped in 2014, is that correct?

I would greatly appreciate any help about the correct workflow to display a 
curved MPR, or comments about my code below.

Best regards,
Daphné

Code snippet:
    mitk::DataNode::Pointer originalImageNode = 
_ds->GetNamedNode("originalImage");
    const mitk::PointSet::DataType::PointsContainer::Pointer splineLandmarks =  
mitk::PointSet::DataType::PointsContainer::New();
// Get landmarks...

    if (splineLandmarks->Size() != 0 && originalImageNode->GetData())
    {
        mitk::ThinPlateSplineCurvedGeometry::Pointer tpsGeometry = 
mitk::ThinPlateSplineCurvedGeometry::New();
        const mitk::PlaneGeometry *plane = 
_dataView->GetRenderWindow2()->GetSliceNavigationController()->GetCurrentPlaneGeometry();

        // Set a reference 3D geometry (e.g. Geometry3D of an existing image 
volume)
        
tpsGeometry->SetFrameGeometry(originalImageNode->GetData()->GetGeometry());
        tpsGeometry->SetReferenceGeometry(plane->GetReferenceGeometry());

        // Create projector class; target landmarks will be projected on
        // a plane to create source landmarks for thin plate spline
        // (plane is a mitk::PlaneGeometry, e.g. one of the standard
        // coronal, sagittal, or transversal planes)
        mitk::PlaneLandmarkProjector::Pointer planeLandmarkProjector = 
mitk::PlaneLandmarkProjector::New();

        planeLandmarkProjector->SetProjectionPlane(plane);
        planeLandmarkProjector->ProjectLandmarks(splineLandmarks);

        // Initialize TPS geometry with projector
        tpsGeometry->SetLandmarkProjector(planeLandmarkProjector);
        tpsGeometry->SetTargetLandmarks(splineLandmarks);
        tpsGeometry->ComputeGeometry();

        mitk::BaseRenderer* mappingRenderer = 
mitk::BaseRenderer::GetInstance(_dataView->mitkWidget2->GetRenderWindow());
        mappingRenderer->SetWorldGeometry3D(tpsGeometry); // Crash happens here
    }

    mitk::RenderingManager::GetInstance()->RequestUpdateAll();



Le 02/03/2017 à 14:44, Daphné Wallach a écrit :
Dear MITK users,

I am developping an application using MITK as a library, and I am currently 
trying to display a curved MPR, based on a set of points placed on the axial 
view by the user.

I saw two related questions in the mailing list, but both answers were quite 
dated (2010 and 2014), so things might have changed since then. The most recent 
answer referred to a "Curved MPR" plugin, and mentionned it was under 
developpement.

Does anybody have news about this plugin?

Best regards,
Daphné



--

Daphné Wallach

Ingénieur de recherche

http://www.hrv-simulation.com
------------------------------------------------------------------------------
Announcing the Oxford Dictionaries API! The API offers world-renowned
dictionary content that is easy and intuitive to access. Sign up for an
account today to start using our lexical data to power your apps and
projects. Get started today and enter our developer competition.
http://sdm.link/oxford
_______________________________________________
mitk-users mailing list
mitk-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mitk-users

Reply via email to