# Event about vtkMRMLModelNode

**URL:** <https://discourse.slicer.org/t/event-about-vtkmrmlmodelnode/25744>\
**Category:** Development\
**Created:** [October 18, 2022, 3:24am UTC](https://discourse.slicer.org/t/event-about-vtkmrmlmodelnode/25744 "2022-10-18T03:24:39Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![miniminic](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/miniminic/32/16647_2.png) [@miniminic](https://discourse.slicer.org/u/miniminic)\
**Post date:** [October 18, 2022, 3:24am UTC](https://discourse.slicer.org/t/event-about-vtkmrmlmodelnode/25744/1 "2022-10-18T03:24:39Z")

</div>

In the logic of my custom module, I can know that a new node has been added to the scene by OnMRMLSceneNodeAdded. For example, vtkMRMLModelNode, I can tell that a vtkMRMLMOdelNode was created and its displayNode was created, but they are not bound together at this point, So I can’t get displayNode from vtkMRMLModelNode in OnMRMLSceneNodeAdded or vtkMRMLDisplayableNode from displayNode. What event should I use to get a vtkMRMLModelNode that has completed initialization。 thaks。

 ![屏幕截图 2022-10-18 112243](https://us1.discourse-cdn.com/flex002/uploads/slicer/original/3X/7/3/73ed2a863a901a6d66b9942af5dbeb44139ca3ca.jpeg)  
displayNode and displayableNode are nullptr

---

<div class="post-metadata">

**Author:** ![cpinter](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/cpinter/32/7995_2.png) [@cpinter](https://discourse.slicer.org/u/cpinter)\
**Post date:** [October 18, 2022, 10:52am UTC](https://discourse.slicer.org/t/event-about-vtkmrmlmodelnode/25744/2 "2022-10-18T10:52:24Z")

</div>

> [@miniminic](#):
>
> new node has been added to the scene

In your case what adds new nodes to the scene? What is the use case?

---

<div class="post-metadata">

**Author:** ![miniminic](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/miniminic/32/16647_2.png) [@miniminic](https://discourse.slicer.org/u/miniminic)\
**Post date:** [October 19, 2022, 2:53am UTC](https://discourse.slicer.org/t/event-about-vtkmrmlmodelnode/25744/3 "2022-10-19T02:53:44Z")

</div>

I wanted to make it possible to move when a model was added, so I added the following code to logic.

```auto
	void vtkSlicerMaterialDatabaseLogic
::OnMRMLSceneNodeAdded(vtkMRMLNode* node)
{
	auto modelNode = vtkMRMLModelNode::SafeDownCast(node);
	if (nullptr != modelNode)
	{
		auto* transform = vtkMRMLTransformNode::SafeDownCast(node->GetScene()->AddNewNodeByClass("vtkMRMLTransformNode"));
		if (nullptr != transform)
		{
			transform->CreateDefaultDisplayNodes();
			modelNode->SetAndObserveTransformNodeID(transform->GetID());
			auto transformDisplay = vtkMRMLTransformDisplayNode::SafeDownCast(transform->GetDisplayNode());
			if (nullptr != transformDisplay)
			{
				transformDisplay->SetEditorVisibility(true);
				transformDisplay->UpdateEditorBounds();
			}
		}
	}
}

```

But when I call UpdateEditorBounds, modelNode doesn’t have a displayNode yet.  
But I am now using vtkMRMLModelNode: : DisplayModifiedEvent solved the problem。

```auto
void qSlicerMaterialDatabaseModule::onVtkMRMLModelDisplayNodeAdd(vtkMRMLModelNode* node)
{
	Q_D(qSlicerMaterialDatabaseModule);

	if (nullptr != node && nullptr != d->Widget && 0 != d->Widget->getLastDorpAction())
	{
		d->Widget->resetLastDropAction();

		d->ModelNode = node;
		this->qvtkConnect(d->ModelNode, vtkMRMLModelNode::DisplayModifiedEvent, this, SLOT(onDisplayModifiedEvent()));
	}
}

void qSlicerMaterialDatabaseModule::onDisplayModifiedEvent()
{
	Q_D(qSlicerMaterialDatabaseModule);
	if (nullptr != d->ModelNode)
	{
		this->qvtkDisconnect(d->ModelNode, vtkMRMLModelNode::DisplayModifiedEvent, this, SLOT(onDisplayModifiedEvent()));

		auto* transform = vtkMRMLTransformNode::SafeDownCast(d->ModelNode->GetScene()->AddNewNodeByClass("vtkMRMLTransformNode"));
		if (nullptr != transform)
		{
			transform->CreateDefaultDisplayNodes();
			d->ModelNode->SetAndObserveTransformNodeID(transform->GetID());
			auto transformDisplay = vtkMRMLTransformDisplayNode::SafeDownCast(transform->GetDisplayNode());
			if (nullptr != transformDisplay)
			{
				transformDisplay->SetEditorVisibility(true);
				transformDisplay->UpdateEditorBounds();
			}
		}

		d->ModelNode = nullptr;
	}
}

```

---

<div class="post-metadata">

**Author:** ![lassoan](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/lassoan/32/13_2.png) [@lassoan](https://discourse.slicer.org/u/lassoan)\
**Post date:** [October 19, 2022, 4:59am UTC](https://discourse.slicer.org/t/event-about-vtkmrmlmodelnode/25744/4 "2022-10-19T04:59:05Z")

</div>

It probably makes sense to not react immediately when the new node is created but when the application has performed all the processing and becomes idle. You can do that by using QTimer as shown in [this script repository example](https://slicer.readthedocs.io/en/latest/developer_guide/script_repository.html#show-volume-rendering-automatically-when-a-volume-is-loaded).
