2011-07-01 55 views
1

我正在使用Visual Studio 2010,VTK 5.6並在不使用CMake的情況下配置我的項目。如何在不關閉VTK渲染窗口的情況下使代碼流動?

我正在處理數值計算,並希望在運行時使用VTK生成多個圖。從VTK網頁中給出的線條示例開始,我設法生成我想要的圖。問題在於,如果不關閉繪圖窗口,代碼不會繼續。

從我的「main.cpp」文件中,我發送命令到一個頭文件,VTK過程開始。

residualPlotter(x,xdim1d); 

「residualPlotter」是生成圖的函數。它如下:

int residualPlotter(double* res, int size) 
{ 

    // Create a table with some points in it 
    vtkSmartPointer<vtkTable> table = 
    vtkSmartPointer<vtkTable>::New(); 

    vtkSmartPointer<vtkFloatArray> arrX = 
    vtkSmartPointer<vtkFloatArray>::New(); 
    arrX->SetName("X Axis"); 
    table->AddColumn(arrX); 

    vtkSmartPointer<vtkFloatArray> arrF = 
    vtkSmartPointer<vtkFloatArray>::New(); 
    arrF->SetName("Function"); 
    table->AddColumn(arrF); 

    // Fill in the table with some example values 
    table->SetNumberOfRows(size); 
    for (int i = 0; i < size; ++i) 
    { 
    table->SetValue(i, 0, i); 
    table->SetValue(i, 1, res[i]); 
    } 

    // Set up the view 
    vtkSmartPointer<vtkContextView> view = 
    vtkSmartPointer<vtkContextView>::New(); 
    view->GetRenderer()->SetBackground(1.0, 1.0, 1.0); 
    view->GetRenderWindow()->SetSize(800,600); 

    // Add multiple line plots, setting the colors etc 
    vtkSmartPointer<vtkChartXY> chart = 
    vtkSmartPointer<vtkChartXY>::New(); 
    view->GetScene()->AddItem(chart); 
    vtkPlot *line = chart->AddPlot(vtkChart::LINE); 
    line->SetInput(table, 0, 1); 
    line->SetColor(0, 100, 0, 255); 
    line->SetWidth(1.75); 


    // Set up an interactor and start 
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = 
    vtkSmartPointer<vtkRenderWindowInteractor>::New(); 
    renderWindowInteractor->SetRenderWindow(view->GetRenderWindow()); 
    renderWindowInteractor->Initialize(); 
    renderWindowInteractor->Start(); 


    return EXIT_SUCCESS; 

} 

所以,我希望代碼繼續,而不需要關閉該窗口。我應該如何修改代碼?

謝謝大家。

+0

您可以參考這裏的解決方案! http://stackoverflow.com/questions/2136711/vtk-window-thread-from-main-thread-c/33363593#33363593 –

回答

4

如果你只是想呈現的情節,做別的事情,更新並再次渲染,你可以跳過renderWindowInteractor代碼,只需調用

view->Render(); 

,這會使得您所提供的數據的情節,和控制權將返回到您的代碼。您可以繼續執行此操作,只要您想查看更新的圖表,就可以在視圖上調用Render()。

+0

非常感謝。當我這樣做時,情節窗口會立即彈出,但隨着代碼的繼續,它會在一瞬間消失。有沒有辦法讓它留在屏幕上? –

+0

@馬庫斯,我有同樣的問題。當代碼繼續時,我的窗口也會消失。你解決了嗎?謝謝。 – gishara

+0

對不起 - 忘了問題。如果您希望窗口持續存在,您必須啓動交互器。然後您需要觸發一個計時器事件或類似的事件,這可能會觸發您更新圖表。任何GUI都需要進入事件循環才能保持,VTK是一樣的。 –

-1

我添加網格到vtkActor如下:

vtkSmartPointer actor_grid = vtkSmartPointer ::新();

vtkSmartPointer chart = vtkSmartPointer :: New();

renderer-> AddActor(actor_grid);

這很有效,因爲它沒有與交互器相關聯。

謝謝。

2

Marcus D. Hanwell在評論中提到了一個計時器事件。代碼爲VTK example section。對我而言,我修改了片段;

// Initialize must be called prior to creating timer events. 
renderWindowInteractor->Initialize(); 

// Sign up to receive TimerEvent 
vtkSmartPointer<vtkTimerCallback> cb = vtkSmartPointer<vtkTimerCallback>::New(); 
renderWindowInteractor->AddObserver(vtkCommand::TimerEvent, cb); 

int timerId = renderWindowInteractor->CreateRepeatingTimer(100); 
std::cout << "timerId: " << timerId << std::endl; 


renderWindowInteractor->Start(); 

和我在示例代碼改變了vtkTimerCallback類(在這裏,背景顏色不斷被改變);

class vtkTimerCallback : public vtkCommand 
{ 
public: 
    static vtkTimerCallback *New() 
    { 
     vtkTimerCallback *cb = new vtkTimerCallback; 
     cb->TimerCount = 0; 
     return cb; 
    } 

virtual void Execute(vtkObject *vtkNotUsed(caller), unsigned long eventId, void *vtkNotUsed(callData)) 
{ 
    if (vtkCommand::TimerEvent == eventId) 
    { 
     ++this->TimerCount; 
    } 
    /* this section will be excuted */ 
    cout << this->TimerCount << " " << "This is from vtkTimerCallback" << endl; 
    background_color = (double) rand()/RAND_MAX; 
    cout << background_color << endl; 
    renderer->SetBackground(background_color, background_color, background_color); 
    renderWindow->AddRenderer(renderer); 
    renderWindow->Render(); 
    /* ----- */ 
} 
private: 
    int TimerCount; 
}; 

我聲明瞭渲染器和renderWindow作爲全局變量,所以窗口更改了主要部分中的窗口。

相關問題