2013-07-24 66 views
0

我正在使用vtk庫構建地震動態地圖。Python - 如何追蹤(添加/刪除)多個迭代中的大量類實例?

我已經做了一個靜態的(見這裏:https://github.com/yacobuk/QuakeCloud和這裏:http://www.youtube.com/watch?v=4HVdTcI_ozI),所以我知道基本思想的作品,但現在我想嘗試並隨時間顯示地震。

我有一些代碼示例,告訴我如何更新框架,以及如何添加/刪除對象,但我堅持搞清楚如何啓動一個實例,跟蹤它幾個時期,然後刪除它。

基本的添加/刪除的代碼看起來是這樣的:

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() 

但當然,這僅允許一個對象在時間(通過renderer.AddActor(pointCloud.vtkActor)pointCloud.vtkActor一個實例等待一段時間,然後用renderer.RemoveActor(pointCloud.vtkActor)

刪除它

如何添加一些演員(我將使用10分鐘的時間間隔,並且當時有多達5次地震),用計數器標記它,在每次循環迭代時增加計數器,並且當它達到5次迭代時,刪除演員?

有一些更多的上下文這個問題在這裏:Python/vtk - set each point size individually in a vtkPolyData object?

回答

1

的可能(未經測試)解決方案可能是:

from collections import deque 

# The number 5 indicates for how many iterations the actors should be rendered. 
rendered_actors = deque([None] * 5, maxlen=5) 

for point_and_mag in pm.points_mag: 
    if rendered_actors[-1] is 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) 

此代碼創建一個deque(這是一個雙向鏈表)長度爲5.演員插入在該雙排扣的左側,在每次迭代時插入最右側的值,如果它是「演員」,則將其從場景中移除並且場景重新呈現。

請注意,我沒有vtk,所以我無法測試此代碼。


小樣式注意:這是真的unpythonic代碼風格:

for point_and_mag in pm.points_mag: 
    mag = point_and_mag[1] 
    point = point_and_mag[0] 

使用元組拆包:

for point, mag in pm.points_mag: 
    # ... 
    if mag > 2: 
     # ... 
+0

啊,OK。我認爲我正朝着正確的方向前進,計劃是將一個時間段中的每個點添加到單個演員,然後我只有5個演員跟蹤該集。我沒有意識到這個想法,我可以看到使用滾動緩衝區/隊列來有效地窗口實時數據的價值。謝謝,這很好。我還看到了雙開箱,並認爲它是笨拙的,我打算單獨解開它,但你的方法是waaaay更清潔 - 謝謝你的提示!讚賞。 –

+0

這是非常接近的,但是當它碰到'不是None'子句--' AttributeError:removeActor'時會拋出一個錯誤。我查看了'rendered_actors [-1]'對象,它看起來是相同的對象(數據在'pointCloud.vtkActor' =='rendered_actors [-1]'中。 –

+0

糾錯:'renderer.RemoveActor(rendered_actors [-1])'。就像一個魅力!太棒了,謝謝! –