When placing markups consistently (check the Place multiple control points
button), if I double clicked then it will terminate the place process. How can I avoid it?
Why do you need to double-click? Just curious?
In fact I don’t need double-click but sometimes you may just do it accidentally, and that is how I find this problem.
There needs to be a function to stop the placement so that, for example you can reorient your object in 3D view to get the new ones. That’s normally the right-click. I never tried double-click before, but I can confirm that it does indeed stop the placement mode. I don’t know whether its intentional, so I included @smrolfe @lassoan.
As for re-activating the placement mode, whether you stopped accidentally or intentionally, can be done via a quick keyboard shortcut CTRL+SHIFT+SPACE. See the documentation for Markups keyboard shortcuts here
You can also define your own (provided that it does not conflict with already existing ones).
Yes, in the Markups module documentation:
- Left-click in a slice view or 3D view to place points.
- Double-left-click or right-click to finish point placement.
Double-left-click is a thing as I believe it is a standard thing for ending for example a closed curve group of points.
@muratmaga @jamesobutler Thanks for the reply.
Since it is designed intentionally, I decided not to deal with it and found another way to solve my problem.
The solution goes like:
qvtkConnect(interactionNode, vtkMRMLInteractionNode::EndPlacementEvent, this,
SLOT(onEndPlacement()));
and in the slot function make a judgement when to reactive the placement mode.
void XXX::onEndPlacement()
{
auto scene = qSlicerApplication::application()->mrmlScene();
auto interactionNode = vtkMRMLInteractionNode::SafeDownCast(
scene->GetNodeByID("vtkMRMLInteractionNodeSingleton"));
auto selectionNode = vtkMRMLSelectionNode::SafeDownCast(
scene->GetNodeByID("vtkMRMLSelectionNodeSingleton"));
auto nodeID = selectionNode->GetActivePlaceNodeID();
auto node = vtkMRMLMarkupsFiducialNode::SafeDownCast(scene->GetNodeByID(nodeID));
if (Judgement about the MarkupsNode)
{
interactionNode->SetCurrentInteractionMode(vtkMRMLInteractionNode::Place);
}
}
Maybe it is a bit simpler if you customize the event mappings as shown in examples the script repository: [1] and [2]
For example, you can remove the double-click shortcut in the first 3D view like this:
threeDViewWidget = slicer.app.layoutManager().threeDWidget(0)
markupsDisplayableManager = threeDViewWidget.threeDView().displayableManagerByClassName('vtkMRMLMarkupsDisplayableManager')
markupsDisplayNodes = slicer.util.getNodesByClass("vtkMRMLMarkupsDisplayNode")
for markupsDisplayNode in markupsDisplayNodes:
markupsWidget = markupsDisplayableManager.GetWidget(markupsDisplayNode)
markupsWidget.SetEventTranslation(markupsWidget.WidgetStateDefine, vtk.vtkCommand.LeftButtonDoubleClickEvent, vtk.vtkEvent.NoModifier, vtk.vtkWidgetEvent.NoEvent)
Similarly, you can remove double-click event processing in the camera widget to prevent double-click from maximizing/restoring the current view.