14 #include <vtkAxesActor.h>
15 #include <vtkDataObject.h>
16 #include <vtkDataSetMapper.h>
17 #include <vtkLODActor.h>
18 #include <vtkOrientationMarkerWidget.h>
19 #include <vtkPolyData.h>
20 #include <vtkProperty.h>
21 #include <vtkRenderWindow.h>
22 #include <vtkRenderer.h>
23 #include <vtkRendererCollection.h>
32 class VtkWidgetPrivate {
34 VtkWidgetPrivate(VtkWidget* q);
38 void configRenderer(vtkRenderer* renderer,
bool gradient =
true);
43 QColor backgroundColor2 = QColor(134.895, 205.989, 235.00035);
44 bool multiViewports =
false;
45 vtkRenderer* defaultRenderer =
nullptr;
46 vtkOrientationMarkerWidget* orientationMarkerWidget =
nullptr;
48 QList<vtkRenderer*> renderers;
49 QList<vtkProp*> actors;
50 QList<vtkProp*> props;
55 VtkWidgetPrivate::VtkWidgetPrivate(VtkWidget* q) : q_ptr(q) { init(); }
57 VtkWidgetPrivate::~VtkWidgetPrivate() {}
59 void VtkWidgetPrivate::configRenderer(vtkRenderer* renderer,
bool gradient) {
60 if (!renderer)
return;
67 renderer->SetBackground2(bgclr2);
68 renderer->SetBackground(bgclr1);
69 renderer->SetGradientBackground(gradient);
75 if ((cols * cols) >=
count)
return cols;
82 switch (renderers.size()) {
130 VtkWidget::VtkWidget(QWidget* parent) : QVTKOpenGLNativeWidget(parent) {
131 vtkObject::GlobalWarningDisplayOff();
132 d_ptr =
new VtkWidgetPrivate(
this);
139 if (d_ptr->multiViewports != multi) {
140 d_ptr->multiViewports = multi;
152 vtkPolyData* polyData = vtkPolyData::SafeDownCast(
155 polyData->GetNumberOfCells() != polyData->GetNumberOfVerts());
168 #if VTK_MAJOR_VERSION < 6
169 mapper->SetInput(
data);
171 mapper->SetInputData(
data);
176 data->GetPointData()->GetScalars();
179 scalars->GetRange(minmax);
180 mapper->SetScalarRange(minmax);
182 mapper->SetScalarModeToUsePointData();
183 mapper->SetInterpolateScalarsBeforeMapping(
185 mapper->ScalarVisibilityOn();
190 actor->SetNumberOfCloudPoints(
191 int(std::max<vtkIdType>(1,
data->GetNumberOfPoints() / 10)));
192 actor->GetProperty()->SetInterpolationToFlat();
200 actor->SetMapper(mapper);
205 if (!actor || d_ptr->actors.contains(actor))
return;
210 d_ptr->actors.append(actor);
212 if (!d_ptr->multiViewports) {
213 if (d_ptr->renderers.isEmpty()) {
214 vtkRenderer* renderer = vtkRenderer::New();
215 renderer->SetBackground(vtkClr);
216 d_ptr->configRenderer(renderer);
217 renderer->AddActor(actor);
219 d_ptr->renderers.append(renderer);
220 renderer->ResetCamera();
232 vtkRenderer* renderer = vtkRenderer::New();
233 renderer->SetBackground(vtkClr);
234 d_ptr->configRenderer(renderer);
235 renderer->AddActor(actor);
237 d_ptr->renderers.append(renderer);
238 d_ptr->layoutRenderers();
239 renderer->ResetCamera();
245 if (!prop || d_ptr->props.contains(prop))
return;
247 d_ptr->props.append(prop);
249 if (!d_ptr->multiViewports) {
250 if (d_ptr->renderers.isEmpty()) {
251 vtkRenderer* renderer = vtkRenderer::New();
252 d_ptr->configRenderer(renderer);
253 renderer->AddViewProp(prop);
255 d_ptr->renderers.append(renderer);
256 renderer->ResetCamera();
265 vtkRenderer* renderer = vtkRenderer::New();
266 d_ptr->configRenderer(renderer);
267 renderer->AddViewProp(prop);
269 d_ptr->renderers.append(renderer);
270 d_ptr->layoutRenderers();
271 renderer->ResetCamera();
279 foreach (
auto actor, d_ptr->actors) actor->SetVisibility(visible);
283 actor->SetVisibility(visible);
289 foreach (vtkRenderer* renderer, d_ptr->renderers)
290 d_ptr->configRenderer(renderer);
294 if (d_ptr->backgroundColor1 != clr) {
295 d_ptr->backgroundColor1 = clr;
297 foreach (vtkRenderer* renderer, d_ptr->renderers)
298 d_ptr->configRenderer(renderer);
302 vtkRenderer* renderer = renderers->GetFirstRenderer();
304 renderer = renderers->GetNextItem();
316 if (!d_ptr->renderers.contains(d_ptr->defaultRenderer))
317 d_ptr->renderers.append(d_ptr->defaultRenderer);
318 return d_ptr->defaultRenderer;
322 if (!d_ptr->defaultRenderer)
return false;
323 return d_ptr->defaultRenderer->GetActors()->GetNumberOfItems() != 0;
327 if (!d_ptr->orientationMarkerWidget) {
329 axes->SetShaftTypeToCylinder();
331 d_ptr->orientationMarkerWidget = vtkOrientationMarkerWidget::New();
332 d_ptr->orientationMarkerWidget->SetOutlineColor(0.9300, 0.5700, 0.1300);
333 d_ptr->orientationMarkerWidget->SetOrientationMarker(axes);
334 d_ptr->orientationMarkerWidget->SetInteractor(
GetInteractor());
335 d_ptr->orientationMarkerWidget->SetViewport(0.0, 0.0, 0.23, 0.23);
336 d_ptr->orientationMarkerWidget->SetEnabled(1);
337 d_ptr->orientationMarkerWidget->InteractiveOff();
340 d_ptr->orientationMarkerWidget->SetEnabled(show);
346 aa(bounds, d_ptr->bounds);
void vtkColor(const QColor &clr, double *vtkClr)
void layoutRenderers< 7 >(const QList< vtkRenderer * > &renderers)
void layoutRenderers< 5 >(const QList< vtkRenderer * > &renderers)
void layoutRenderers(const QList< vtkRenderer * > &renderers)
void layoutRenderers< 8 >(const QList< vtkRenderer * > &renderers)
void vtkInitOnce(T **obj)
void layoutRenderers< 10 >(const QList< vtkRenderer * > &renderers)
void layoutRenderers< 1 >(const QList< vtkRenderer * > &renderers)
void layoutRenderers< 4 >(const QList< vtkRenderer * > &renderers)
void layoutRenderers< 3 >(const QList< vtkRenderer * > &renderers)
int getDefaultScalarInterpolationForDataSet(vtkDataSet *data)
void layoutRenderers< 9 >(const QList< vtkRenderer * > &renderers)
void layoutRenderers< 2 >(const QList< vtkRenderer * > &renderers)
void layoutRenderers< 6 >(const QList< vtkRenderer * > &renderers)
constexpr Rgb black(0, 0, 0)
#define VTK_CREATE(type, name)