2016-04-14 5 views
0

У меня есть следующий код, чтобы прочитать данные в ячейке из файла stl и показать его в окне. Код работает нормально; но мне нужно получить доступ к массивам вершин и индексов, чтобы выполнить некоторую обработку данных; измените сетку и затем отрисуйте ее. Мне было интересно, как можно получить доступ к тем массивам, которые имеют координаты вершин сетки и номера индексов из них при формировании треугольников сетки. Кажется, это очень простой шаг, но я не нашел ответа в вики WTK.Как получить доступ к массиву вершин и индексов сетки, полученной из STLreader в VTK?

int main (int argc, char *argv[]) 
{ 

    std::string inputFilename = "Scapula.stl"; 

    vtkSmartPointer<vtkSTLReader> reader = 
    vtkSmartPointer<vtkSTLReader>::New(); 
    reader->SetFileName(inputFilename.c_str()); 
    reader->Update(); 

    // Visualize 
    vtkSmartPointer<vtkPolyDataMapper> mapper = 
    vtkSmartPointer<vtkPolyDataMapper>::New(); 
    mapper->SetInputConnection(reader->GetOutputPort()); 

    vtkSmartPointer<vtkActor> actor = 
    vtkSmartPointer<vtkActor>::New(); 
    actor->SetMapper(mapper); 

    vtkSmartPointer<vtkRenderer> renderer = 
    vtkSmartPointer<vtkRenderer>::New(); 
    vtkSmartPointer<vtkRenderWindow> renderWindow = 
    vtkSmartPointer<vtkRenderWindow>::New(); 
    renderWindow->AddRenderer(renderer); 
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = 
    vtkSmartPointer<vtkRenderWindowInteractor>::New(); 
    renderWindowInteractor->SetRenderWindow(renderWindow); 

    renderer->AddActor(actor); 
    renderer->SetBackground(.3, .6, .3); // Background color green 

    renderWindow->Render(); 
    renderWindowInteractor->Start(); 

    return EXIT_SUCCESS; 
} 

ответ

1

Вся эта информация хранится в vtkPolyData, которые могут быть извлечены из vtkSTLreader. Вот как я мог бы получить вершины и индексы сетки, хранящуюся в файле СТЛ:

//Data source 

std::string inputFilename = "reamer.stl"; 

vtkSmartPointer<vtkSTLReader> reader = 
    vtkSmartPointer<vtkSTLReader>::New(); 

reader->SetFileName(inputFilename.c_str()); 

reader->Update(); 

vtkSmartPointer<vtkPolyData> mesh = reader->GetOutput(); 

vtkSmartPointer<vtkPoints> points = mesh->GetPoints(); 

vtkSmartPointer<vtkDataArray> dataArray = points->GetData(); 

vtkIdType numberOfFaces = mesh->GetNumberOfCells(); 

    mesh->GetCellPoints(i, faceIndex); 

    vertexIndex = faceIndex->GetId(0); 

    vertexArray[0] = dataArray->GetComponent(vertexIndex, 0); 

    vertexArray[1] = dataArray->GetComponent(vertexIndex, 1); 

    vertexArray[2] = dataArray->GetComponent(vertexIndex, 2); 

    vertexIndex = faceIndex->GetId(1); 

    vertexArray[3] = dataArray->GetComponent(vertexIndex, 0); 

    vertexArray[4] = dataArray->GetComponent(vertexIndex, 1); 

    vertexArray[5] = dataArray->GetComponent(vertexIndex, 2); 

    vertexIndex = faceIndex->GetId(2); 

    vertexArray[6] = dataArray->GetComponent(vertexIndex, 0); 

    vertexArray[7] = dataArray->GetComponent(vertexIndex, 1); 

    vertexArray[8] = dataArray->GetComponent(vertexIndex, 2); 

Если vertexArray является массивом, который имеет координаты первого индексируемого треугольника сетки при г = 0. Вы можете перебрать i, чтобы получить координаты остальных треугольников.

+0

Этот пример очень помог мне. Спасибо. Можно также упомянуть: vtkSmartPointer faceIndex = vtkSmartPointer :: New(); – eidelen