File: TestAlignImageDataSetFilter.cxx

package info (click to toggle)
vtk9 9.5.2%2Bdfsg3-4
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 205,916 kB
  • sloc: cpp: 2,336,565; ansic: 327,116; python: 111,200; yacc: 4,104; java: 3,977; sh: 3,032; xml: 2,771; perl: 2,189; lex: 1,787; makefile: 178; javascript: 165; objc: 153; tcl: 59
file content (121 lines) | stat: -rw-r--r-- 3,961 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
#include "vtkAlignImageDataSetFilter.h"
#include "vtkBoundingBox.h"
#include "vtkImageData.h"
#include "vtkLogger.h"
#include "vtkNew.h"
#include "vtkPartitionedDataSet.h"
#include "vtkRTAnalyticSource.h"
#include "vtkVector.h"

namespace
{
constexpr int NUM_PIECES = 6;
constexpr int NUM_GHOSTS = 1;

bool Validate(vtkDataObject* dobj, vtkVector3d origin, bool checkCoord = true)
{
  vtkNew<vtkRTAnalyticSource> source;
  source->SetWholeExtent(-10, 10, -10, 10, -10, 10);

  auto images = vtkCompositeDataSet::GetDataSets<vtkImageData>(dobj);
  int piece = 0;
  for (auto& image : images)
  {
    if (vtkVector3d(image->GetOrigin()) != origin)
    {
      double outputOrigin[3];
      image->GetOrigin(outputOrigin);
      vtkLogF(ERROR, "Incorrect origin (%f, %f, %f) != (%f, %f, %f) for piece %d!", outputOrigin[0],
        outputOrigin[1], outputOrigin[2], origin[0], origin[1], origin[2], piece);
      return false;
    }

    if (checkCoord)
    {
      source->UpdatePiece(piece, NUM_PIECES, NUM_GHOSTS);
      auto* input = vtkImageData::SafeDownCast(source->GetOutputDataObject(0));
      const vtkVector3d p0(input->GetPoint(0));
      const vtkVector3d p1(image->GetPoint(0));
      if (p0 != p1)
      {
        vtkLogF(ERROR, "Incorrect point 0 (%f, %f, %f) != (%f, %f, %f) for piece %d", p0[0], p0[1],
          p0[2], p1[0], p1[1], p1[2], piece);
        return false;
      }
    }

    ++piece;
  }

  return true;
}

}

int TestAlignImageDataSetFilter(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
{
  vtkNew<vtkPartitionedDataSet> pd;

  vtkNew<vtkRTAnalyticSource> source;
  source->SetWholeExtent(-10, 10, -10, 10, -10, 10);
  for (int cc = 0; cc < NUM_PIECES; ++cc)
  {
    source->UpdatePiece(cc, NUM_PIECES, NUM_GHOSTS);
    auto* img = vtkImageData::SafeDownCast(source->GetOutputDataObject(0));

    // Create a clone with extent (0, x, 0, y, 0, z). Thus each image has
    // a different origin, but all images still form a single dataset in 3D
    // space.
    vtkNew<vtkImageData> clone;
    clone->ShallowCopy(img);

    vtkBoundingBox bbox(clone->GetBounds());
    vtkVector3d origin(bbox.GetMinPoint());
    vtkVector3i dims(clone->GetDimensions());

    clone->SetOrigin(origin.GetData());
    clone->SetExtent(0, dims[0] - 1, 0, dims[1] - 1, 0, dims[2] - 1);
    pd->SetPartition(cc, clone);
  }

  vtkNew<vtkAlignImageDataSetFilter> aligner;
  aligner->SetInputDataObject(pd);
  aligner->Update();
  vtkLogIf(ERROR, !Validate(aligner->GetOutputDataObject(0), vtkVector3d(-10, -10, -10)),
    "Failed case #0 (MinimumExtent=default)");

  aligner->SetMinimumExtent(10, 10, 10);
  aligner->Update();
  vtkLogIf(ERROR, !Validate(aligner->GetOutputDataObject(0), vtkVector3d(-20, -20, -20)),
    "Failed case #2 (MinimumExtent=[10, 10, 10])");

  aligner->SetMinimumExtent(-10, -10, 10);
  aligner->Update();
  vtkLogIf(ERROR, !Validate(aligner->GetOutputDataObject(0), vtkVector3d(0, 0, -20)),
    "Failed case #3 (MinimumExtent=[-10, -10, 10])");

  // case set up that ParaView issue #21285 fails on:
  // https://gitlab.kitware.com/paraview/paraview/-/issues/21285
  pd->Initialize();
  source->UpdatePiece(0, 1, 0);
  auto* img = vtkImageData::SafeDownCast(source->GetOutputDataObject(0));
  vtkNew<vtkImageData> clone0;
  clone0->ShallowCopy(img);
  pd->SetPartition(0, clone0);

  vtkNew<vtkImageData> clone1;
  clone1->ShallowCopy(img);
  clone1->SetOrigin(20, 0, 0);
  pd->SetPartition(1, clone1);
  aligner->SetInputDataObject(pd);
  aligner->SetMinimumExtent(0, 0, 0);
  aligner->Update();
  // we don't check the location of the points since we didn't use pieces from the source to set
  // up the input to the filter
  vtkLogIf(ERROR, !Validate(aligner->GetOutputDataObject(0), vtkVector3d(-10, -10, -10), false),
    "Failed case #4 (MinimumExtent=default)");

  return EXIT_SUCCESS;
}