[vtk-developers] Problem when creating vtkImageData by hand

Goodwin Lawlor goodwin.lawlor at ucd.ie
Mon Jul 11 11:48:02 EDT 2005


Hi Prabhu,

I tried your script below with tcl and got the same problem. It looks like 
the extent set in each IPW travels back up the pipeline and changes 
my_img_data but it doesn't do this with img_data. From debugging the 
example, it seems that the extent info going upstream is coming from the 
vtkImageReslice contained in vtkImagePlaneWidget.

hth

Goodwin

----- Original Message ----- 
From: "Prabhu Ramachandran" <prabhu_r at users.sourceforge.net>
To: <vtk-developers at vtk.org>
Sent: Sunday, July 10, 2005 12:22 PM
Subject: [vtk-developers] Problem when creating vtkImageData by hand


> Hi,
>
> Sorry for the barrage of emails this week.  I just ran into a peculiar
> problem with VTK from CVS.  If I use the vtkImagePlaneWidget along
> with image data read from a file, everything seems to work.  However,
> when I create a vtkImageData object by hand and use that as input, I
> get wierd problems.  Stranger still, this works fine with VTK-4.4.
>
> I've attached a slightly modified version of
> Examples/GUI/Python/ImagePlaneWidget.py that demonstrates this
> problem.
>
> When run without modifications everything runs fine.  I recreate the
> same image data like so:
>
>    img_data = v16.GetOutput()
>    # Now lets create this data without the reader.
>    my_img_data = vtk.vtkImageData()
>    my_img_data.SetDimensions(img_data.GetDimensions())
>    my_img_data.SetSpacing(img_data.GetSpacing())
>    my_img_data.SetOrigin(img_data.GetOrigin())
>    my_img_data.SetScalarType(img_data.GetScalarType())
> 
> my_img_data.GetPointData().SetScalars(img_data.GetPointData().GetScalars())
>    my_img_data.Update()
>
> I then use 'my_img_data' instead of img_data as the input to the image
> plane widgets.  The example breaks and I get black planes which can't
> be moved.  The outline disappears (or maybe reduces to a point).
> Something seems very wrong.  If I don't use the vtkImagePlaneWidgets
> and only use the outline then it is visible and looks OK.
>
> The same exact code works with VTK-4.4.  I wonder if I am doing
> something wrong or is there a bug somewhere?
>
> Any clarifications would be appreciated.
>
> cheers,
> prabhu
>
>


--------------------------------------------------------------------------------


> #!/usr/bin/env python
>
> import vtk
> import Tkinter
> from vtk.tk.vtkTkRenderWindowInteractor import \
>     vtkTkRenderWindowInteractor
> from vtk.util.misc import vtkGetDataRoot
> VTK_DATA_ROOT = vtkGetDataRoot()
>
> # Start by loading some data.
> v16 = vtk.vtkVolume16Reader()
> v16.SetDataDimensions(64, 64)
> v16.SetDataByteOrderToLittleEndian()
> v16.SetFilePrefix(VTK_DATA_ROOT + "/Data/headsq/quarter")
> v16.SetImageRange(1, 93)
> v16.SetDataSpacing(3.2, 3.2, 1.5)
> v16.Update()
>
> xMin, xMax, yMin, yMax, zMin, zMax = v16.GetOutput().GetWholeExtent()
> img_data = v16.GetOutput()
>
> # **************************************************
> # Look here for wierdness.
>
> # Now lets create this data without the reader.
> my_img_data = vtk.vtkImageData()
> my_img_data.SetDimensions(img_data.GetDimensions())
> my_img_data.SetSpacing(img_data.GetSpacing())
> my_img_data.SetOrigin(img_data.GetOrigin())
> my_img_data.SetScalarType(img_data.GetScalarType())
> my_img_data.GetPointData().SetScalars(img_data.GetPointData().GetScalars())
> my_img_data.Update()
> # hang on to original image data.
> orig_img_data = img_data
>
> # hijack img_data with our own.  If you comment this out everything is
> # fine.
> img_data = my_img_data
> # **************************************************
>
> spacing = img_data.GetSpacing()
> sx, sy, sz = spacing
>
> origin = img_data.GetOrigin()
> ox, oy, oz = origin
>
> # An outline is shown for context.
> outline = vtk.vtkOutlineFilter()
> outline.SetInput(img_data)
>
> outlineMapper = vtk.vtkPolyDataMapper()
> outlineMapper.SetInput(outline.GetOutput())
>
> outlineActor = vtk.vtkActor()
> outlineActor.SetMapper(outlineMapper)
>
> # The shared picker enables us to use 3 planes at one time
> # and gets the picking order right
> picker = vtk.vtkCellPicker()
> picker.SetTolerance(0.005)
>
> # The 3 image plane widgets are used to probe the dataset.
> planeWidgetX = vtk.vtkImagePlaneWidget()
> planeWidgetX.DisplayTextOn()
> planeWidgetX.SetInput(img_data)
> planeWidgetX.SetPlaneOrientationToXAxes()
> planeWidgetX.SetSliceIndex(32)
> planeWidgetX.SetPicker(picker)
> planeWidgetX.SetKeyPressActivationValue("x")
> prop1 = planeWidgetX.GetPlaneProperty()
> prop1.SetColor(1, 0, 0)
>
> planeWidgetY = vtk.vtkImagePlaneWidget()
> planeWidgetY.DisplayTextOn()
> planeWidgetY.SetInput(img_data)
> planeWidgetY.SetPlaneOrientationToYAxes()
> planeWidgetY.SetSliceIndex(32)
> planeWidgetY.SetPicker(picker)
> planeWidgetY.SetKeyPressActivationValue("y")
> prop2 = planeWidgetY.GetPlaneProperty()
> prop2.SetColor(1, 1, 0)
> planeWidgetY.SetLookupTable(planeWidgetX.GetLookupTable())
>
> # for the z-slice, turn off texture interpolation:
> # interpolation is now nearest neighbour, to demonstrate
> # cross-hair cursor snapping to pixel centers
> planeWidgetZ = vtk.vtkImagePlaneWidget()
> planeWidgetZ.DisplayTextOn()
> planeWidgetZ.SetInput(img_data)
> planeWidgetZ.SetPlaneOrientationToZAxes()
> planeWidgetZ.SetSliceIndex(46)
> planeWidgetZ.SetPicker(picker)
> planeWidgetZ.SetKeyPressActivationValue("z")
> prop3 = planeWidgetZ.GetPlaneProperty()
> prop3.SetColor(0, 0, 1)
> planeWidgetZ.SetLookupTable(planeWidgetX.GetLookupTable())
>
> # Create the RenderWindow and Renderer
> ren = vtk.vtkRenderer()
> renWin = vtk.vtkRenderWindow()
> renWin.AddRenderer(ren)
>
> # Add the outline actor to the renderer, set the background color and size
> ren.AddActor(outlineActor)
> renWin.SetSize(600, 600)
> ren.SetBackground(0.1, 0.1, 0.2)
>
> current_widget = planeWidgetZ
> mode_widget = planeWidgetZ
>
> # Create the GUI
> # We first create the supporting functions (callbacks) for the GUI
> #
> # Align the camera so that it faces the desired widget
> def AlignCamera():
>    #global ox, oy, oz, sx, sy, sz, xMax, xMin, yMax, yMin, zMax, \
>    #      zMin, slice_number
>    #global current_widget
>    cx = ox+(0.5*(xMax-xMin))*sx
>    cy = oy+(0.5*(yMax-yMin))*sy
>    cz = oy+(0.5*(zMax-zMin))*sz
>    vx, vy, vz = 0, 0, 0
>    nx, ny, nz = 0, 0, 0
>    iaxis = current_widget.GetPlaneOrientation()
>    if iaxis == 0:
>        vz = -1
>        nx = ox + xMax*sx
>        cx = ox + slice_number*sx
>    elif iaxis == 1:
>        vz = -1
>        ny = oy+yMax*sy
>        cy = oy+slice_number*sy
>    else:
>        vy = 1
>        nz = oz+zMax*sz
>        cz = oz+slice_number*sz
>
>    px = cx+nx*2
>    py = cy+ny*2
>    pz = cz+nz*3
>
>    camera = ren.GetActiveCamera()
>    camera.SetViewUp(vx, vy, vz)
>    camera.SetFocalPoint(cx, cy, cz)
>    camera.SetPosition(px, py, pz)
>    camera.OrthogonalizeViewUp()
>    ren.ResetCameraClippingRange()
>    renWin.Render()
>
> # Capture the display and place in a tiff
> def CaptureImage():
>    w2i = vtk.vtkWindowToImageFilter()
>    writer = vtk.vtkTIFFWriter()
>    w2i.SetInput(renWin)
>    w2i.Update()
>    writer.SetInput(w2i.GetOutput())
>    writer.SetFileName("image.tif")
>    renWin.Render()
>    writer.Write()
>
>
> # Align the widget back into orthonormal position,
> # set the slider to reflect the widget's position,
> # call AlignCamera to set the camera facing the widget
> def AlignXaxis():
>    global xMax, xMin, current_widget, slice_number
>    po = planeWidgetX.GetPlaneOrientation()
>    if po == 3:
>        planeWidgetX.SetPlaneOrientationToXAxes()
>        slice_number = (xMax-xMin)/2
>        planeWidgetX.SetSliceIndex(slice_number)
>    else:
>        slice_number = planeWidgetX.GetSliceIndex()
>
>    current_widget = planeWidgetX
>
>    slice.config(from_=xMin, to=xMax)
>    slice.set(slice_number)
>    AlignCamera()
>
>
> def AlignYaxis():
>    global yMin, yMax, current_widget, slice_number
>    po = planeWidgetY.GetPlaneOrientation()
>    if po == 3:
>        planeWidgetY.SetPlaneOrientationToYAxes()
>        slice_number = (yMax-yMin)/2
>        planeWidgetY.SetSliceIndex(slice_number)
>    else:
>        slice_number = planeWidgetY.GetSliceIndex()
>
>    current_widget = planeWidgetY
>
>    slice.config(from_=yMin, to=yMax)
>    slice.set(slice_number)
>    AlignCamera()
>
> def AlignZaxis():
>    global yMin, yMax, current_widget, slice_number
>    po = planeWidgetZ.GetPlaneOrientation()
>    if po == 3:
>        planeWidgetZ.SetPlaneOrientationToZAxes()
>        slice_number = (zMax-zMin)/2
>        planeWidgetZ.SetSliceIndex(slice_number)
>    else:
>        slice_number = planeWidgetZ.GetSliceIndex()
>
>    current_widget = planeWidgetZ
>
>    slice.config(from_=zMin, to=zMax)
>    slice.set(slice_number)
>    AlignCamera()
>
>
> # Set the widget's reslice interpolation mode
> # to the corresponding popup menu choice
> def SetInterpolation():
>    global mode_widget, mode
>    if mode.get() == 0:
>        mode_widget.TextureInterpolateOff()
>    else:
>        mode_widget.TextureInterpolateOn()
>
>    mode_widget.SetResliceInterpolate(mode.get())
>    renWin.Render()
>
> # Share the popup menu among buttons, keeping track of associated
> # widget's interpolation mode
> def buttonEvent(event, arg=None):
>    global mode, mode_widget, popm
>    if arg == 0:
>        mode_widget = planeWidgetX
>    elif arg == 1:
>        mode_widget = planeWidgetY
>    elif arg == 2:
>        mode_widget = planeWidgetZ
>    else:
>        return
>    mode.set(mode_widget.GetResliceInterpolate())
>    popm.entryconfigure(arg, variable=mode)
>    popm.post(event.x + event.x_root, event.y + event.y_root)
>
> def SetSlice(sl):
>    global current_widget
>    current_widget.SetSliceIndex(int(sl))
>    ren.ResetCameraClippingRange()
>    renWin.Render()
>
>
> ###
> # Now actually create the GUI
> root = Tkinter.Tk()
> root.withdraw()
> top = Tkinter.Toplevel(root)
>
> # Define a quit method that exits cleanly.
> def quit(obj=root):
>    obj.quit()
>
> # Popup menu
> popm = Tkinter.Menu(top, tearoff=0)
> mode = Tkinter.IntVar()
> mode.set(1)
> popm.add_radiobutton(label="nearest", variable=mode, value=0,
>                     command=SetInterpolation)
> popm.add_radiobutton(label="linear", variable=mode, value=1,
>                     command=SetInterpolation)
> popm.add_radiobutton(label="cubic", variable=mode, value=2,
>                     command=SetInterpolation)
>
> display_frame = Tkinter.Frame(top)
> display_frame.pack(side="top", anchor="n", fill="both", expand="false")
>
> # Buttons
> ctrl_buttons = Tkinter.Frame(top)
> ctrl_buttons.pack(side="top", anchor="n", fill="both", expand="false")
>
> quit_button = Tkinter.Button(ctrl_buttons, text="Quit", command=quit)
> capture_button = Tkinter.Button(ctrl_buttons, text="Tif",
>                                command=CaptureImage)
>
> x_button = Tkinter.Button(ctrl_buttons, text="x", command=AlignXaxis)
> y_button = Tkinter.Button(ctrl_buttons, text="y", command=AlignYaxis)
> z_button = Tkinter.Button(ctrl_buttons, text="z", command=AlignZaxis)
> x_button.bind("<Button-3>", lambda e: buttonEvent(e, 0))
> y_button.bind("<Button-3>", lambda e: buttonEvent(e, 1))
> z_button.bind("<Button-3>", lambda e: buttonEvent(e, 2))
>
> for i in (quit_button, capture_button, x_button, y_button, z_button):
>    i.pack(side="left", expand="true", fill="both")
>
>
> # Create the render widget
> renderer_frame = Tkinter.Frame(display_frame)
> renderer_frame.pack(padx=3, pady=3,side="left", anchor="n",
>                    fill="both", expand="false")
>
> render_widget = vtkTkRenderWindowInteractor(renderer_frame,
>                                            rw=renWin, width=600,
>                                            height=600)
> for i in (render_widget, display_frame):
>    i.pack(side="top", anchor="n",fill="both", expand="false")
>
> # Add a slice scale to browse the current slice stack
> slice_number = Tkinter.IntVar()
> slice_number.set(current_widget.GetSliceIndex())
> slice = Tkinter.Scale(top, from_=zMin, to=zMax, orient="horizontal",
>                      command=SetSlice,variable=slice_number,
>                      label="Slice")
> slice.pack(fill="x", expand="false")
>
> # Done with the GUI.
> ###
>
> # Set the interactor for the widgets
> iact = render_widget.GetRenderWindow().GetInteractor()
> planeWidgetX.SetInteractor(iact)
> planeWidgetX.On()
> planeWidgetY.SetInteractor(iact)
> planeWidgetY.On()
> planeWidgetZ.SetInteractor(iact)
> planeWidgetZ.On()
>
> # Create an initial interesting view
> cam1 = ren.GetActiveCamera()
> cam1.Elevation(110)
> cam1.SetViewUp(0, 0, -1)
> cam1.Azimuth(45)
> ren.ResetCameraClippingRange()
>
> # Render it
> render_widget.Render()
>
> iact.Initialize()
> renWin.Render()
> iact.Start()
>
> # Start Tkinter event loop
> root.mainloop()
>


--------------------------------------------------------------------------------


> _______________________________________________
> vtk-developers mailing list
> vtk-developers at vtk.org
> http://www.vtk.org/mailman/listinfo/vtk-developers
> 




More information about the vtk-developers mailing list