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

Popular posts from this blog

javascript - DIV "hiding" when changing dropdown value -

Does Firefox offer AppleScript support to get URL of windows? -

android - How to install packaged app on Firefox for mobile? -