Python - How to track (add/remove) lots of class instances over mulitple iterations? -
i building dynamic map of earthquakes, using vtk library.
i've made static one, (see here: https://github.com/yacobuk/quakecloud , here: http://www.youtube.com/watch?v=4hvdtci_ozi) know basic idea works, want try , show quakes on time.
i have code examples show me how update frame, , how add / remove objects, i'm stuck on figuring out how spin instance, track few periods, remove it.
the basic add/ remove code looks this:
for point_and_mag in pm.points_mag: time.sleep(0.5) mag = point_and_mag[1] point = point_and_mag[0] if mag > 2: pointcloud = vtkpointcloud(pm) pointcloud.addpoint(point, math.log(mag)*10) renderer.addactor(pointcloud.vtkactor) renderer.resetcamera() renderwindow.render() time.sleep(0.3) renderer.removeactor(pointcloud.vtkactor) renderer.resetcamera() renderwindow.render()
but of course, allows 1 object @ time (an instance of pointcloud.vtkactor
via renderer.addactor(pointcloud.vtkactor)
waits while, removes renderer.removeactor(pointcloud.vtkactor)
how can add number of actors (i'm going use 10 min interval, , there many 5 quakes in time), tag counter, increment counter @ every loop iteration, , when reaches 5 iterations, remove actor?
there more context question here: python/vtk - set each point size individually in vtkpolydata object?
a possible(untested) solution might be:
from collections import deque # number 5 indicates how many iterations actors should rendered. rendered_actors = deque([none] * 5, maxlen=5) point_and_mag in pm.points_mag: if rendered_actors[-1] not none: renderer.removeactor(rendered_actors[-1]) renderer.resetcamera() renderwindow.render() time.sleep(0.5) mag = point_and_mag[1] point = point_and_mag[0] if mag > 2: pointcloud = vtkpointcloud(pm) pointcloud.addpoint(point, math.log(mag)*10) rendered_actors.appendleft(pointcloud.vtkactor) renderer.addactor(pointcloud.vtkactor) renderer.resetcamera() renderwindow.render() else: rendered_actors.appendleft(none)
this code creates deque
(which double-linked list) of length 5. actors inserted @ left of deque , @ each iteration rightmost value, if "actor", removed scene , scene re-rendered.
note don't have vtk cannot test code.
a small style note: unpythonic code-style:
for point_and_mag in pm.points_mag: mag = point_and_mag[1] point = point_and_mag[0]
use tuple-unpacking:
for point, mag in pm.points_mag: # ... if mag > 2: # ...
Comments
Post a Comment