# How to enlarge(zoom in/out) the volume of a slice with python code?

**URL:** <https://discourse.slicer.org/t/how-to-enlarge-zoom-in-out-the-volume-of-a-slice-with-python-code/20049>\
**Category:** Development\
**Tags:** python\
**Created:** [October 7, 2021, 9:50am UTC](https://discourse.slicer.org/t/how-to-enlarge-zoom-in-out-the-volume-of-a-slice-with-python-code/20049 "2021-10-07T09:50:36Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![jumbojing](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/jumbojing/32/10811_2.png) [@jumbojing](https://discourse.slicer.org/u/jumbojing)\
**Post date:** [October 7, 2021, 9:50am UTC](https://discourse.slicer.org/t/how-to-enlarge-zoom-in-out-the-volume-of-a-slice-with-python-code/20049/1 "2021-10-07T09:50:36Z")

</div>

如何用python代码放大某个slice的volume呢?

> How to enlarge(zoom in/out) the volume of a slice with python code?

---

<div class="post-metadata">

**Author:** ![pieper](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/pieper/32/8_2.png) [@pieper](https://discourse.slicer.org/u/pieper)\
**Post date:** [October 7, 2021, 11:40am UTC](https://discourse.slicer.org/t/how-to-enlarge-zoom-in-out-the-volume-of-a-slice-with-python-code/20049/2 "2021-10-07T11:40:54Z")

</div>

This should help:

> <https://github.com/pieper/CompareVolumes/blob/master/CompareVolumes.py#L447-L465>

---

<div class="post-metadata">

**Author:** ![jumbojing](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/jumbojing/32/10811_2.png) [@jumbojing](https://discourse.slicer.org/u/jumbojing)\
**Post date:** [October 9, 2021, 12:13am UTC](https://discourse.slicer.org/t/how-to-enlarge-zoom-in-out-the-volume-of-a-slice-with-python-code/20049/3 "2021-10-09T00:13:04Z")

</div>

> [@pieper](#):
>
> ```auto
> def zoom(self,factor,sliceNodes=None):
> """Zoom slice nodes by factor.
> factor: "Fit" or +/- amount to zoom
> sliceNodes: list of slice nodes to change, None means all.
> """
> if not sliceNodes:
> sliceNodes = slicer.util.getNodes('vtkMRMLSliceNode*')
> layoutManager = slicer.app.layoutManager()
> for sliceNode in list(sliceNodes.values()):
> if factor == "Fit":
> sliceWidget = layoutManager.sliceWidget(sliceNode.GetLayoutName())
> if sliceWidget:
> sliceWidget.sliceLogic().FitSliceToAll()
> else:
> newFOVx = sliceNode.GetFieldOfView()[0] * factor
> newFOVy = sliceNode.GetFieldOfView()[1] * factor
> newFOVz = sliceNode.GetFieldOfView()[2]
> sliceNode.SetFieldOfView( newFOVx, newFOVy, newFOVz )
> sliceNode.UpdateMatrices()
> 
> ```

谢谢老师! 👍

> <https://github.com/pieper/CompareVolumes/blob/master/CompareVolumes.py#L447-L465>

[/quote]

---

<div class="post-metadata">

**Author:** ![jumbojing](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/jumbojing/32/10811_2.png) [@jumbojing](https://discourse.slicer.org/u/jumbojing)\
**Post date:** [October 9, 2021, 3:22am UTC](https://discourse.slicer.org/t/how-to-enlarge-zoom-in-out-the-volume-of-a-slice-with-python-code/20049/4 "2021-10-09T03:22:45Z")

</div>

根据老师的代码和我的需求我加了这些, 感觉不够简洁…您有没有更简洁的建议呢?

> [quote=“pieper, post:2, topic:20049”]  
> [CompareVolumes/CompareVolumes.py at master · pieper/CompareVolumes · GitHub](https://github.com/pieper/CompareVolumes/blob/master/CompareVolumes.py#L447-L465)  
> [/quote]

> According to the teacher’s code and my needs, I added these codes, which is not concise enough… Do you have any more concise suggestions?

```auto
def zoomplus(factor,sliceNodes=None):
  """Zoom slice nodes by factor.
  factor: "Fit" or +/- amount to zoom
  sliceNodes: list of slice nodes to change, None means all.
  """
  layoutManager = slicer.app.layoutManager()
  if sliceNodes==None:
    sliceNodes = slicer.util.getNodes('vtkMRMLSliceNode*')
    for sliceNode in list(sliceNodes.values()):
      if factor == "Fit":
        sliceWidget = layoutManager.sliceWidget(sliceNode.GetLayoutName())
        if sliceWidget:
          sliceWidget.sliceLogic().FitSliceToAll()
      else:
        newFOVx = sliceNode.GetFieldOfView()[0] * factor
        newFOVy = sliceNode.GetFieldOfView()[1] * factor
        newFOVz = sliceNode.GetFieldOfView()[2]
        sliceNode.SetFieldOfView( newFOVx, newFOVy, newFOVz )
  else:          
    if sliceNodes == "R":
      sliceNode = slicer.mrmlScene.GetNodeByID("vtkMRMLSliceNodeRed")
    elif sliceNodes == "Y":
      sliceNode = slicer.mrmlScene.GetNodeByID("vtkMRMLSliceNodeYellow")
    elif sliceNodes == "G":
      sliceNode = slicer.mrmlScene.GetNodeByID("vtkMRMLSliceNodeGreen")
    if factor == "Fit":
      sliceWidget = layoutManager.sliceWidget(sliceNode.GetLayoutName())      
      if sliceWidget:
          sliceWidget.sliceLogic().FitSliceToAll()
    else:   
      newFOVx = sliceNode.GetFieldOfView()[0] * factor
      newFOVy = sliceNode.GetFieldOfView()[1] * factor
      newFOVz = sliceNode.GetFieldOfView()[2]
      sliceNode.SetFieldOfView( newFOVx, newFOVy, newFOVz )
  sliceNode.UpdateMatrices() 

```

---

<div class="post-metadata">

**Author:** ![pieper](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/pieper/32/8_2.png) [@pieper](https://discourse.slicer.org/u/pieper)\
**Post date:** [October 9, 2021, 10:12pm UTC](https://discourse.slicer.org/t/how-to-enlarge-zoom-in-out-the-volume-of-a-slice-with-python-code/20049/5 "2021-10-09T22:12:52Z")

</div>

The original idea of the `sliceNodes` argument would that it’s a list of nodes to which the zoom operation should be applied, so it would be better to keep the node ids out of the function. Instead you would invoke it like this an you wouldn’t need to change the function at all.

```auto
sliceNodes = [slicer.mrmlScene.GetNodeByID("vtkMRMLSliceNodeRed")]
zoom('fit', sliceNodes)

```

---

<div class="post-metadata">

**Author:** ![jumbojing](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/jumbojing/32/10811_2.png) [@jumbojing](https://discourse.slicer.org/u/jumbojing)\
**Post date:** [October 10, 2021, 12:35am UTC](https://discourse.slicer.org/t/how-to-enlarge-zoom-in-out-the-volume-of-a-slice-with-python-code/20049/6 "2021-10-10T00:35:32Z")

</div>

I see, thanks.

like that:

```auto
def zoomSlice(factor,sliceNodes=None):
  """Zoom slice nodes by factor.
  factor: "Fit" or +/- amount to zoom
  sliceNodes: list of slice nodes to change, None means all.
  """
  layoutManager = slicer.app.layoutManager()
  
  if sliceNodes==None:
    sliceNodes = slicer.util.getNodes('vtkMRMLSliceNode*')
  else:
    if sliceNodes == "R":
      sliceNodes = slicer.util.getNodes('vtkMRMLSliceNodeR*')
    elif sliceNodes == "Y":
      sliceNodes = slicer.util.getNodes('vtkMRMLSliceNodeY*')
    elif sliceNodes == "G":
      sliceNodes = slicer.util.getNodes('vtkMRMLSliceNodeG*')
    for sliceNode in list(sliceNodes.values()):
      sliceWidget = layoutManager.sliceWidget(sliceNode.GetLayoutName())      
      if factor == "Fit":
        sliceWidget.sliceLogic().FitSliceToAll()
      else:
        sliceWidget.sliceLogic().FitSliceToAll()        
        newFOVx = sliceNode.GetFieldOfView()[0] * factor
        newFOVy = sliceNode.GetFieldOfView()[1] * factor
        newFOVz = sliceNode.GetFieldOfView()[2]
        sliceNode.SetFieldOfView( newFOVx, newFOVy, newFOVz )
  sliceNode.UpdateMatrices() 

```

---

<div class="post-metadata">

**Author:** ![jumbojing](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.slicer.org/jumbojing/32/10811_2.png) [@jumbojing](https://discourse.slicer.org/u/jumbojing)\
**Post date:** [October 20, 2021, 3:27am UTC](https://discourse.slicer.org/t/how-to-enlarge-zoom-in-out-the-volume-of-a-slice-with-python-code/20049/7 "2021-10-20T03:27:02Z")

</div>

# 最终解决方案:

```auto
def zoomSlice(factor, sliceNode=None):
  """Zoom slice nodes by factor.
  factor: "Fit" or +/- amount to zoom
  sliceNode:"R";"Y";"G":"None"
  sliceNodes: list of slice nodes to change, None means all.
  """
  layoutManager = slicer.app.layoutManager()    
  if sliceNode==None:
    sliceNodes = slicer.util.getNodes('vtkMRMLSliceNode*')
  else:      
    sliceNodes = {"R": "vtkMRMLSliceNodeRed", "Y": "vtkMRMLSliceNodeYellow", "G": "vtkMRMLSliceNodeGreen"}
    sliceNodes = slicer.util.getNodes(sliceNodes[sliceNode])      
  for sliceNode in list(sliceNodes.values()):
    sliceWidget = layoutManager.sliceWidget(sliceNode.GetLayoutName())
    sliceWidget.sliceLogic().FitSliceToAll()        
    newFOVx = sliceNode.GetFieldOfView()[0] / factor
    newFOVy = sliceNode.GetFieldOfView()[1] / factor
    newFOVz = sliceNode.GetFieldOfView()[2]
    sliceNode.SetFieldOfView( newFOVx, newFOVy, newFOVz )
    sliceNode.UpdateMatrices()

```
