Dear MITK users,
I am developping an application using MITK as a library, and I am
currently trying to load a planar figure from its 3D control points.
However, I can only manage to display the figure when I start
interacting with it. Otherwise, the figure is not displayed.
Here is the workflow I am using:
- create a new figure
- create a new node containing the figure, select it, and add to the
datastorage
- set a planar figure interactor to the node
- set the geometry of the figure: the geometry is computed from a
dicom image stored in the datastorage. The planar figure is placed on an
axial slice of this image.
- set the points to the figure
- finalize the interaction
- update all viewers
When I comment the lines in the "Finalize interaction" part, the figure
appears when I click on the viewer at the slice where the figure is (and
a new point is added at the click).
I have struggled with this issue for several days now, and I would
grealty appreciate any help!
Best regards,
Daphné
Below is a snippet of my code:
mitk::PlanarFigure::Pointer figure =
mitk::PlanarBezierCurve::New();
// Create node containing the curve, select it and add it to
datastorage
mitk::DataNode::Pointer newNode = mitk::DataNode::New();
newNode->SetData(figure);
newNode->SetSelected(true);
if (!_ds->Exists(newNode))
{
_ds->Add(newNode);
}
// Set new interactor
mitk::PlanarFigureInteractor::Pointer interactor =
dynamic_cast<mitk::PlanarFigureInteractor*>(newNode->GetDataInteractor().GetPointer());
if (interactor.IsNull())
{
interactor = mitk::PlanarFigureInteractor::New();
auto planarFigureModule =
us::ModuleRegistry::GetModule("MitkPlanarFigure");
interactor->LoadStateMachine("PlanarFigureInteraction.xml",
planarFigureModule);
interactor->SetEventConfig("PlanarFigureConfig.xml",
planarFigureModule);
}
interactor->SetDataNode(newNode);
// Set figure plane geometry
mitk::PlaneGeometry::Pointer curvePlane =
mitk::PlaneGeometry::New();
mitk::DataNode::Pointer originalImageNode =
_ds->GetNamedNode("originalImage"); // This node contains a dicom image
on which we want to draw the planar figure
mitk::BaseGeometry* originalImageGeometry =
originalImageNode->GetData()->GetGeometry();
itk::Index<3> idx;
originalImageGeometry->WorldToIndex(curve.points[0], idx); //
the "curve" variable contains the 3D control points
mitk::ScalarType planeZPosition = idx[2];
curvePlane->InitializeStandardPlane(originalImageGeometry,
mitk::PlaneGeometry::Axial, planeZPosition);
figure->SetPlaneGeometry(curvePlane);
//Set points to figure
for (int i = 0; i < curve.points.size(); i++)
{
mitk::Point2D indexPoint2d;
for (int dim = 0; dim < 2; dim++)
{
indexPoint2d[dim] = (curve.points[i][dim] -
originalImageGeometry->GetOrigin()[dim]);
}
if (i == 0)
{
figure->InvokeEvent(mitk::StartPlacementPlanarFigureEvent());
figure->PlaceFigure(indexPoint2d);
newNode->SetBoolProperty("PlanarFigureInitializedWindow", true);
}
else
{
figure->SetControlPoint(i, indexPoint2d, true);
}
}
figure->EvaluateFeatures();
figure->DeselectControlPoint();
// Finalize interaction: when these six lines are commented,
the figure is displayed when the user clicks on the slice where the
figure is placed
figure->Modified();
figure->SetProperty("initiallyplaced",
mitk::BoolProperty::New(true));
newNode->SetBoolProperty("planarfigure.drawcontrolpoints", true);
newNode->Modified();
figure->InvokeEvent(mitk::EndPlacementPlanarFigureEvent());
figure->InvokeEvent(mitk::EndInteractionPlanarFigureEvent());
mitk::RenderingManager::GetInstance()->RequestUpdateAll();
--
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/mitk-users