Hi, sorry, never did this. Maybe you can look into InitializeViews() and 
isolate the code that you actually want to execute from the slice reset? Best,
Stefan

From: Daphné Wallach [mailto:daphne.wall...@hrv-simulation.com]
Sent: Mittwoch, 19. April 2017 11:41
To: Dinkelacker, Stefan; mitk-users@lists.sourceforge.net
Subject: [mitk-users] Cropped planes with curved MPR


Dear Stefan,

I am now using something very similar to the code you sent, and everything is 
working perfectly except for one thing: the planar views are cropped.

I implemented a class similar to QmitkStdMultiWidget, where each individual 
viewer belongs to a class inheriting QmitkRenderWindow. I reimplemented the 
wheelEvent method to scroll along a curve. The planes in the 3D viewer are 
normal, but the images in the individual viewers are cropped (see attached 
image).

I tried to call a reinit, which solves the cropping problem, but this 
unfortunately also resets the slicing to the default one.

This is the code I use to reinitialize the views:

mitk::DataNode::Pointer originalImageNode = 
_dataStorage->GetNamedNode("originalImage");
mitk::RenderingManager::GetInstance()->InitializeViews(originalImageNode->GetData()->GetTimeGeometry(),
 mitk::RenderingManager::REQUEST_UPDATE_ALL, true);

Do you know how I could recenter the views on my image, without resetting the 
slicing?

Best regards,

Daphné



--

Daphné Wallach

Ingénieur de recherche

http://www.hrv-simulation.com


Le 07/03/2017 à 15:54, Dinkelacker, Stefan a écrit :
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<mailto: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



--

Daphné Wallach

Ingénieur de recherche

http://www.hrv-simulation.com
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
mitk-users mailing list
mitk-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mitk-users

Reply via email to