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!
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the ParaView Wiki at:
http://paraview.org/Wiki/ParaView
Search the list archives at: http://markmail.org/search/?q=ParaView
Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/paraview