Не могу перекрасить края в vtk - PullRequest
0 голосов
/ 23 октября 2019

У меня есть неструктурированная сетка в VTK, которую я хочу визуализировать вместе с ее краевыми линиями. Я могу сделать это, используя vtkExtractEdges, однако, линии краев всегда окрашены в синий цвет, независимо от того, что я делаю.
У меня есть рабочий код, который прекрасно рисует контуры сетки в желаемом цвете, и япопытался использовать по существу один и тот же код для ребер:

vtkSmartPointer<vtkOutlineFilter> outline = vtkSmartPointer<vtkOutlineFilter>::New();
vtkSmartPointer<vtkPolyDataMapper> outline_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkActor> outline_actor = vtkSmartPointer<vtkActor>::New();

outline->SetInput(grid);
outline_mapper->SetInputConnection(outline->GetOutputPort());
outline_actor->SetMapper(outline_mapper);
outline_actor->GetProperty()->SetColor(1.,1.,1.); // << works just fine here
renderer->AddActor(outline_actor);

vtkSmartPointer<vtkExtractEdges> edges = vtkSmartPointer<vtkExtractEdges>::New();
vtkSmartPointer<vtkPolyDataMapper> edges_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkActor> edges_actor = vtkSmartPointer<vtkActor>::New();

edges_mapper->SetInputConnection(edges->GetOutputPort());
edges_actor->SetMapper(edges_mapper);
edges_actor->GetProperty()->SetColor(1.,1.,1.); // << still stays blue here
renderer->AddActor(edges_actor);

Это озадачивает, тем более что класс, который я называю SetColor on, равен vtkPolyDataMapper, и после этого код идентичен для обоих случаев.

Кто-нибудь еще сталкивался с этой проблемой и знает решение?
До сих пор я нашел это: https://public.kitware.com/pipermail/vtkusers/1999-September/087677.html,, в котором кто-то предложил решить ее путем рисования труб, но вместо этого я надеюсь на чистое решение.

Версия VTK, с которой я работаю, - 5.6, и я не могу использовать другую для совместимости.

1 Ответ

0 голосов
/ 23 октября 2019

Отвечая на мой собственный вопрос:

Я обнаружил, что данные, генерируемые vtkPolyDataMapper при подаче vtkExtractEdges, имеют скалярные значения (основанные на предполагаемых падающих ячейках), и линии окрашиваютсясправочная таблица, а не одним цветом.
Поэтому все, что мне нужно было сделать, это дать мапперу одноцветную справочную таблицу. Новый код теперь

    edges_mapper->SetInputConnection(edges->GetOutputPort());
    edges_mapper->SetLookupTable(build_mono_table(1.,1.,1.));
    edges_actor->SetMapper(edges_mapper);
    renderer->AddActor(edges_actor);

с вспомогательной функцией

inline vtkSmartPointer<vtkLookupTable> build_mono_table(double r, double g, double b)
{
    vtkSmartPointer<vtkLookupTable> table = vtkSmartPointer<vtkLookupTable>::New();
    table->SetNumberOfTableValues(1);
    table->Build();
    table->SetTableValue(0, r, g, b);
    return table;
}

Кажется, нет необходимости указывать скалярный диапазон.

...