2011-07-01 32 views
1

私はVisual Studio 2010、VTK 5.6を使っていて、CMakeを使わずにプロジェクトを設定しています。VTKレンダリングウィンドウを閉じずにコードフローを作成する方法は?

私は数値計算を扱っており、VTKを使用してランタイム中にいくつかのプロットを生成したいと考えています。 VTKのWebページで与えられた線グラフの例から、私は自分が望むプロットを生成することができました。問題は、プロットウィンドウを閉じることなくコードが続行されないことです。

私の "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

@Marcus、私は同じ問題があります。コードが実行されると、私のウィンドウも消えてしまいます。あなたはそれを修正しましたか?ありがとう。 – gishara

+0

申し訳ありません - 質問を忘れました。ウィンドウを永続させるには、インタラクターを開始する必要があります。その後、チャートの更新をトリガーできるタイマーイベントなどを起動する必要があります。どのGUIも持続するためにはイベントループに入る必要があり、VTKは同じです。 –

-1

私は次のようにvtkActorにグリッドを追加しました:

vtkSmartPointer actor_grid = vtkSmartPointer ::新();

vtkSmartPointer chart = vtkSmartPointer :: New();

レンダラー - > 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をグローバル変数として宣言したので、メインセクションのウィンドウが変更されます。

関連する問題