[vtkusers] Updating vtkPolyData from vtkActor - passing/saving existing data

Constantinescu Mihai ultam93 at yahoo.com
Sat Mar 12 07:02:37 EST 2016


 I'm trying to use VTK in python to edit a `.stl` file using the `vtkBoxWidget`. I'm reading the `.stl` file, editing it with the `vtkBoxWidget` by using the mouse/drag in the window interactor and in the end I want to write the new data to a new `.stl` when hitting a certain key.
Here's the code I've been working on:
    #!/usr/bin/env python        import vtk    import sys    import os        filename = "file.stl"    # render the data    reader = vtk.vtkSTLReader()    reader.SetFileName(filename)          stlMapper = vtk.vtkPolyDataMapper()    stlMapper.SetInputConnection(reader.GetOutputPort())        # create an actor for our scene                        stlActor = vtk.vtkActor()    stlActor.SetMapper(stlMapper)                ren = vtk.vtkRenderer()    renWin = vtk.vtkRenderWindow()    renWin.AddRenderer(ren)    iren = vtk.vtkRenderWindowInteractor()    iren.SetRenderWindow(renWin)        # The box widget observes the events invoked by the render window    # interactor.  These events come from user interaction in the render    # window.    boxWidget = vtk.vtkBoxWidget()    boxWidget.SetInteractor(iren)    boxWidget.SetPlaceFactor(1.25)        # Add the actors to the renderer, set the background and window size.    ren.AddActor(stlActor)    ren.SetBackground(0.1, 0.2, 0.4)    renWin.SetSize(300, 300)        # As the box widget is interacted with, it produces a transformation    # matrix that is set on the actor.    t = vtk.vtkTransform()    def TransformActor(obj, event):        global t, stlActor        obj.GetTransform(t)        stlActor.SetUserTransform(t)        def onKeyPressEvent(self, renderer):        key = self.GetKeyCode()        if(key=='l'):            print stlActor.GetBounds()            if(os.path.isfile("done.stl")==1):                        os.remove("done.stl")            print stlActor.GetMapper().GetInput().GetBounds()            stlPolyData = stlActor.GetMapper().GetInput()            writer = vtk.vtkSTLWriter()            writer.SetFileName("done.stl")            writer.AddInputDataObject(stlPolyData)            writer.Write()    # Place the interactor initially. The actor is used to place and scale    # the interactor. An observer is added to the box widget to watch for    # interaction events. This event is captured and used to set the    # transformation matrix of the actor.    boxWidget.SetProp3D(stlActor)    boxWidget.PlaceWidget()    boxWidget.AddObserver("InteractionEvent", TransformActor)    iren.AddObserver('KeyPressEvent', onKeyPressEvent)        iren.Initialize()    renWin.Render()    iren.Start()
The problem is that I have no idea how to update the `vtkPolyData` or pass the transformations I applied to `vtkActor` to the `vtkPolyData`. In the code above, I tested this with the .GetBounds() in the two print functions. Originally the object had Bounds:
    (-2.0, 2.0, 0.0, 1.625, -1.5, 1.8125)
After updating, the actor Bounds changed, but I can't pass all those properties to the vtkPolyData.
    (-2.1331110248939638, 2.246371570191821, -1.5743578447908013, 2.5817210301577385, -2.1311284932847796, 2.0695034726591715)    (-2.0, 2.0, 0.0, 1.625, -1.5, 1.8125)

Thanks!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160312/01579048/attachment.html>


More information about the vtkusers mailing list