------------------------------------------------------------------------------
| 732 | |
| 733 | //------------------------------------------------------------------------------ |
| 734 | vtkSmartPointer<vtkDataObject> vtkExtractSelection::ExtractElements(vtkDataObject* inputBlock, |
| 735 | vtkDataObject::AttributeTypes type, EvaluationResult evaluationResult, vtkDataObject* outputBlock) |
| 736 | { |
| 737 | bool extractAll = evaluationResult == EvaluationResult::ALL; |
| 738 | bool extractNone = evaluationResult == EvaluationResult::NONE; |
| 739 | if (extractNone) |
| 740 | { |
| 741 | // Assume nothing was selected and return. |
| 742 | return nullptr; |
| 743 | } |
| 744 | auto fd = outputBlock->GetAttributes(type); |
| 745 | vtkSmartPointer<vtkSignedCharArray> insidednessArray = |
| 746 | fd ? vtkSignedCharArray::SafeDownCast(fd->GetArray("__vtkInsidedness__")) : nullptr; |
| 747 | if (!insidednessArray || insidednessArray->GetNumberOfTuples() <= 0) |
| 748 | { |
| 749 | // No insidedness array |
| 750 | return nullptr; |
| 751 | } |
| 752 | vtkSmartPointer<vtkDataObject> result; |
| 753 | |
| 754 | if (vtkHyperTreeGrid* htg = vtkHyperTreeGrid::SafeDownCast(inputBlock)) |
| 755 | { |
| 756 | vtkNew<vtkBitArray> mask; |
| 757 | mask->SetNumberOfComponents(1); |
| 758 | mask->SetNumberOfTuples(insidednessArray->GetNumberOfTuples()); |
| 759 | auto masking = [&mask, &insidednessArray](vtkIdType begin, vtkIdType end) |
| 760 | { |
| 761 | for (vtkIdType iMask = begin; iMask < end; ++iMask) |
| 762 | { |
| 763 | mask->SetValue(iMask, static_cast<int>(insidednessArray->GetValue(iMask) == 0)); |
| 764 | } |
| 765 | }; |
| 766 | // lambda method is not thread safe due to vtkBitArray (see issue #18837) |
| 767 | //--------------------------------------------------------------------- |
| 768 | masking(0, mask->GetNumberOfTuples()); |
| 769 | // vtkSMPTools::For(0, mask->GetNumberOfTuples(), masking); |
| 770 | //--------------------------------------------------------------------- |
| 771 | if (htg->HasMask()) |
| 772 | { |
| 773 | auto originalMask = htg->GetMask(); |
| 774 | auto maskOring = [&mask, &originalMask](vtkIdType begin, vtkIdType end) |
| 775 | { |
| 776 | for (vtkIdType iMask = begin; iMask < end; ++iMask) |
| 777 | { |
| 778 | if (originalMask->GetValue(iMask)) |
| 779 | { |
| 780 | mask->SetValue(iMask, 1); |
| 781 | } |
| 782 | } |
| 783 | }; |
| 784 | maskOring(0, mask->GetNumberOfTuples()); |
| 785 | } |
| 786 | result.TakeReference(htg->NewInstance()); |
| 787 | vtkHyperTreeGrid* outHTG = vtkHyperTreeGrid::SafeDownCast(result); |
| 788 | outHTG->ShallowCopy(htg); |
| 789 | outHTG->SetMask(mask); |
| 790 | // sanitize the mask |
| 791 | { |
no test coverage detected