100 vtkInformationVector **inputVector,
101 vtkInformationVector *outputVector) {
106 auto blocks = vtkMultiBlockDataSet::GetData(inputVector[0], 0);
107 auto table = vtkTable::GetData(inputVector[1], 0);
113 std::vector<vtkSmartPointer<vtkMultiBlockDataSet>> inputTrees;
116 auto assignmentSolverArray
117 = blocks->GetFieldData()->GetArray(
"AssignmentSolver");
118 if(assignmentSolverArray)
122 if(treesNodes.size() != 0 and inputTrees[0]->GetBlock(0) != treesNodes[0])
123 resetDataVisualization();
125 std::vector<std::tuple<double, int, int, int, int>> coefs;
126 int const totalInputs = inputTrees.size() + table->GetNumberOfRows();
127 std::vector<bool> interpolatedTrees(totalInputs,
false);
128 for(
int i = 0; i < table->GetNumberOfRows(); ++i) {
130 = vtkDataArray::SafeDownCast(table->GetColumnByName(
"Alpha"))
133 = vtkDataArray::SafeDownCast(table->GetColumnByName(
"Index1_R"))
136 = vtkDataArray::SafeDownCast(table->GetColumnByName(
"Index2_R"))
139 = vtkDataArray::SafeDownCast(table->GetColumnByName(
"Index1"))
142 = vtkDataArray::SafeDownCast(table->GetColumnByName(
"Index2"))
145 coefs.emplace_back(alpha, index1R, index2R, index1, index2);
146 for(
int j = index1 + 1; j < index2; ++j)
147 interpolatedTrees[j] =
true;
150 return run<float>(outputVector, inputTrees, coefs, interpolatedTrees);
203 vtkInformationVector *outputVector,
205 std::vector<std::tuple<double, int, int, int, int>> &coefs,
206 std::vector<bool> &interpolatedTrees) {
207 bool const OutputSegmentation =
false;
211 auto output_sequence = vtkMultiBlockDataSet::GetData(outputVector, 0);
212 auto output_matchings = vtkMultiBlockDataSet::GetData(outputVector, 1);
217 std::vector<vtkUnstructuredGrid *> treesNodesT;
218 std::vector<vtkUnstructuredGrid *> treesArcsT;
219 std::vector<vtkDataSet *> treesSegmentationT;
220 std::vector<std::vector<int>> treesNodeCorrMeshT;
221 std::vector<vtkSmartPointer<vtkMultiBlockDataSet>> inputTreesT;
224 while(cpt < coefs.size()) {
225 while(cpt < coefs.size() and std::get<2>(coefs[cpt]) <= index) {
226 treesNodesT.emplace_back(
nullptr);
227 treesArcsT.emplace_back(
nullptr);
228 treesSegmentationT.emplace_back(
nullptr);
229 treesNodeCorrMeshT.emplace_back();
230 inputTreesT.emplace_back(
nullptr);
233 treesNodesT.emplace_back(treesNodes[index]);
234 treesArcsT.emplace_back(treesArcs[index]);
235 treesSegmentationT.emplace_back(treesSegmentation[index]);
236 treesNodeCorrMeshT.emplace_back(treesNodeCorrMesh[index]);
237 inputTreesT.emplace_back(inputTrees[index]);
240 treesNodes.swap(treesNodesT);
241 treesArcs.swap(treesArcsT);
242 treesSegmentation.swap(treesSegmentationT);
243 treesNodeCorrMesh.swap(treesNodeCorrMeshT);
244 inputTrees.swap(inputTreesT);
246 std::vector<MergeTree<dataType>> intermediateMTrees;
248 std::vector<FTMTree_MT *> trees;
251 output_sequence->SetNumberOfBlocks((OutputSegmentation ? 3 : 2));
254 vtkBlockNodes->SetNumberOfBlocks(intermediateMTrees.size());
255 output_sequence->SetBlock(0, vtkBlockNodes);
258 vtkBlockArcs->SetNumberOfBlocks(intermediateMTrees.size());
259 output_sequence->SetBlock(1, vtkBlockArcs);
260 if(OutputSegmentation) {
263 vtkBlockSegs->SetNumberOfBlocks(intermediateMTrees.size());
264 output_sequence->SetBlock(2, vtkBlockSegs);
268 std::vector<std::vector<SimplexId>> nodeCorr(intermediateMTrees.size());
269 int cptInterpolatedTree = 0;
270 for(
size_t i = 0; i < intermediateMTrees.size(); ++i) {
281 BranchDecompositionPlanarLayout);
301 visuMaker.
copyPointData(treesNodes[i], treesNodeCorrMesh[i]);
315 vtkOutputNode1->GetFieldData()->ShallowCopy(
316 treesNodes[i]->GetFieldData());
318 vtkOutputArc1->GetFieldData()->ShallowCopy(treesArcs[i]->GetFieldData());
319 if(treesSegmentation[i] and OutputSegmentation)
320 vtkOutputSegmentation1->GetFieldData()->ShallowCopy(
321 treesSegmentation[i]->GetFieldData());
324 if(interpolatedTrees[i]) {
326 vtkNew<vtkDoubleArray> vtkDistancePreviousKey{};
327 vtkDistancePreviousKey->SetName(
"DistancePreviousKeyFrame");
328 vtkDistancePreviousKey->SetNumberOfTuples(1);
329 vtkDistancePreviousKey->SetTuple1(
331 vtkOutputNode1->GetFieldData()->AddArray(vtkDistancePreviousKey);
333 vtkNew<vtkDoubleArray> vtkDistanceNextKey{};
334 vtkDistanceNextKey->SetName(
"DistanceNextKeyFrame");
335 vtkDistanceNextKey->SetNumberOfTuples(1);
336 vtkDistanceNextKey->SetTuple1(
338 vtkOutputNode1->GetFieldData()->AddArray(vtkDistanceNextKey);
340 vtkNew<vtkIntArray> vtkIndexPreviousKey{};
341 vtkIndexPreviousKey->SetName(
"IndexPreviousKeyFrame");
342 vtkIndexPreviousKey->SetNumberOfTuples(1);
343 vtkIndexPreviousKey->SetTuple1(
344 0, std::get<3>(coefs[cptInterpolatedTree]));
345 vtkOutputNode1->GetFieldData()->AddArray(vtkIndexPreviousKey);
347 vtkNew<vtkIntArray> vtkIndexNextKey{};
348 vtkIndexNextKey->SetName(
"IndexNextKeyFrame");
349 vtkIndexNextKey->SetNumberOfTuples(1);
350 vtkIndexNextKey->SetTuple1(0, std::get<4>(coefs[cptInterpolatedTree]));
351 vtkOutputNode1->GetFieldData()->AddArray(vtkIndexNextKey);
353 ++cptInterpolatedTree;
357 vtkMultiBlockDataSet::SafeDownCast(output_sequence->GetBlock(0))
358 ->SetBlock(i, vtkOutputNode1);
359 vtkMultiBlockDataSet::SafeDownCast(output_sequence->GetBlock(1))
360 ->SetBlock(i, vtkOutputArc1);
361 if(OutputSegmentation)
362 vtkMultiBlockDataSet::SafeDownCast(output_sequence->GetBlock(2))
363 ->SetBlock(i, vtkOutputSegmentation1);
369 output_matchings->SetNumberOfBlocks(intermediateMTrees.size() - 1);
370 for(
size_t i = 0; i < intermediateMTrees.size() - 1; ++i) {
375 = vtkUnstructuredGrid::SafeDownCast(
376 vtkMultiBlockDataSet::SafeDownCast(output_sequence->GetBlock(0))
379 = vtkUnstructuredGrid::SafeDownCast(
380 vtkMultiBlockDataSet::SafeDownCast(output_sequence->GetBlock(0))
382 std::vector<std::vector<SimplexId>> nodeCorrTemp;
383 nodeCorrTemp.emplace_back(nodeCorr[i]);
384 nodeCorrTemp.emplace_back(nodeCorr[i + 1]);
398 vtkNew<vtkDoubleArray> vtkDistance{};
399 vtkDistance->SetName(
"Distance");
400 vtkDistance->SetNumberOfTuples(1);
402 vtkOutputMatching->GetFieldData()->AddArray(vtkDistance);
405 output_matchings->SetBlock(i, vtkOutputMatching);
409 treesNodes.swap(treesNodesT);
410 treesArcs.swap(treesArcsT);
411 treesSegmentation.swap(treesSegmentationT);
412 treesNodeCorrMesh.swap(treesNodeCorrMeshT);
413 inputTrees.swap(inputTreesT);