[vtkusers] SetActiveVectors when there are many pipelines that use different arrays

Dan Lipsa dan.lipsa at kitware.com
Thu Oct 27 09:56:43 EDT 2016


Hi Fernando,
I am not sure what is going on.
I would save VTK datasets at points in your pipeline to narrow down where
the problem is. For instance, save the datasets after the passarray filter.
Also save the datasets before and after your append filter that produces
the wrong result.
You can load those datasets in paraview and to see exactly what you get
after each filter.

I use the following function in Python. You'll need to convert this to C++.

def debugWriteGrid(grid, name):
        writer = vtk.vtkXMLDataSetWriter()
        gridType = grid.GetDataObjectType()
        if (gridType == vtk.VTK_STRUCTURED_GRID):
            ext = ".vts"
        elif (gridType == vtk.VTK_UNSTRUCTURED_GRID):
            ext = ".vtu"
        elif (gridType == vtk.VTK_POLY_DATA):
            ext = ".vtp"
        else:
            print "Unknown grid type: %d" % gridType
            ext = ".vtk"
        writer.SetFileName(name + ext)
        writer.SetInputData(grid)
        writer.Write()



On Thu, Oct 27, 2016 at 4:38 AM, Fernando Nellmeldin <
f.nellmeldin at open-engineering.com> wrote:

> Hello, I am still having problems....
> I added the casting as you suggested:
>
> -----
> // given that model is first an UnstructuredGrid1 and then
> UnstructuredGridFull
> vtkSmartPointer<vtkPassArrays> passArrays = vtkSmartPointer<vtkPassArrays>
> ::New();
> passArrays->SetInput(model);
> passArrays->UseFieldTypesOn(); // restrict to only pass what I say
> passArrays->AddFieldType(vtkDataObject::POINT);
> passArrays->AddArray(fieldType, "nameOfArray");
> passArrays->Update();
>
> // modelForFilter is a vtkUnstructuredGrid
> modelForFilter = vtkUnstructuredGrid::SafeDownCast(passArrays->GetOutput());
> // cast to UnstructuredGrid
> modelForFilter->GetPointData()->SetActiveVectors("nameOfArray"); // set
> the active vectors in the new data
> modelForFilter->Update();
>
> //warping vector is a vtkWarpVector
> warpingVector->SetInputConnection(modelForFilter->GetProducerPort());
> warpingVector->SetInputArrayToProcess(0, 0, 0, vtkDataObject::FIELD_ASSOCIATION_POINTS,
> "nameOfArray");
> // the rest of the pipeline is the same...
> -----
> The result is the same. I put some modelForFilter->Print(std::cout) and I
> can see that the selected array is indeed the active vectors...
>
> Other thing I tried:
> modelForFilter->DeepCopy(model); // full copy the model to the new
> modelForFilter->GetPointData()->SetActiveVectors("nameOfArray"); // set
> the active in the new
> modelForFilter->Update();
> Still, same result.
>
> The only thing that works is:
> modelForFilter = model;
> But of course, here I only copy the vtkSmartPointer and not the data, so
> this is the thing I want to avoid.
>
> Any ideas?
> Thank you!
>
> On 26 October 2016 at 16:54, Dan Lipsa <dan.lipsa at kitware.com> wrote:
>
>> Can you cast the data object to an unstructured grid and then set the
>> active vector on it? Make sure you call update before you do that.
>>
>> Dan
>>
>>
>> On Wed, Oct 26, 2016 at 10:44 AM, Fernando Nellmeldin <
>> f.nellmeldin at open-engineering.com> wrote:
>>
>>> Hello and thank you for your reply!
>>>
>>> After your suggestion, I tried using vtkPassArray, but I can't find how
>>> to set the Active Vectors. The output is a vtkDataObject*, which of course
>>> doesn't have the PointsData and therefore no setActiveVectors.
>>> The result is the same as before, when I change the input to Full, I see
>>> the wrong deformed mesh.
>>>
>>> This is my modified code:
>>>
>>> // given that model is first an UnstructuredGrid1 and then
>>> UnstructuredGridFull
>>> vtkSmartPointer<vtkPassArrays> passArrays =
>>> vtkSmartPointer<vtkPassArrays>::New();
>>> passArrays->SetInput(model);
>>> passArrays->UseFieldTypesOn(); // restrict to only pass what I say
>>> passArrays->AddFieldType(vtkDataObject::POINT);
>>> passArrays->AddArray(fieldType, "nameOfArray");
>>> passArrays->Update();
>>>
>>> //warping vector is a vtkWarpVector
>>> warpingVector->SetInputConnection(passArrays->GetProducerPort());
>>> warpingVector->SetInputArrayToProcess(0, 0,
>>> 0, vtkDataObject::FIELD_ASSOCIATION_POINTS, "nameOfArray"); // I don't
>>> know why this line is needed to see something
>>> // the rest of the pipeline is the same...
>>>
>>> Am I missing something?
>>>
>>> Thank you.
>>>
>>>
>>>
>>> On 26 October 2016 at 15:40, Dan Lipsa <dan.lipsa at kitware.com> wrote:
>>>
>>>> Fernando,
>>>> Can you try vtkPassArray to pass the proper vector array to each of
>>>> your pipelines? Then you can set the active vector on the output of this
>>>> algorithm.
>>>>
>>>> Dan
>>>>
>>>>
>>>> On Wed, Oct 26, 2016 at 6:23 AM, Fernando Nellmeldin <
>>>> f.nellmeldin at open-engineering.com> wrote:
>>>>
>>>>> Hello.
>>>>> I would like to show the deformed mesh of a model based on the values
>>>>> of a point data array of dimension 3 (vectorial data).
>>>>>
>>>>> I have the following pipeline:
>>>>> UnstructuredGrid1 -> WarpVector -> GeometryFilter -> ExtractEdges ->
>>>>> PolyDataMapper -> Actor
>>>>> In the WarpVector, I call to say which array to use
>>>>> WarpVector->SetInputArrayToProcess(0,0,0,
>>>>> FIELD_ASSOCIATION_POINTS,"nameOfArray");
>>>>>
>>>>> The first time I load the actor in screen, everything is OK.
>>>>>
>>>>> Later, I would like to mirror the input UnstructuredGrid1 because it
>>>>> represents half the model. So I do the following:
>>>>> UnstructuredGrid1 -> ReflectionFilter -> UnstructuredGrid2
>>>>> {UnstructuredGrid1, UnstructuredGrid2} -> AppendFilter ->
>>>>> UnstructuredGridFull
>>>>>
>>>>> Then, I replace the input of WarpVector by UnstructuredGridFull, and I
>>>>> reload the actor.
>>>>> However, what I see on screen is the same deformed mesh than before,
>>>>> plus another deformed mesh that is not its mirror, it's something different
>>>>> and not correct, of course.
>>>>>
>>>>> If, however, I call:
>>>>> At the beginning: UnstructuredGrid1->GetPointDat
>>>>> a()->SetActiveVectors("nameOfArray");
>>>>> After I did the mirroring: UnstructuredGridFull->GetPoint
>>>>> Data()->SetActiveVectors("nameOfArray");
>>>>> I don't have the problem and everything works OK.
>>>>>
>>>>> Problem is, I don't want to call setActiveVectors because I can have
>>>>> more than one pipeline that makes uses of the same UnstructuredGrid with
>>>>> different vectorial data, and  I noticed that each call to setActive* will
>>>>> modify all the pipelines that makes use of the Scalars/Vectors/Tensors. So
>>>>> this doesn't seem an option.
>>>>>
>>>>> What is the alternative to use here to solve the problem?
>>>>>
>>>>> I tried with vtkAssignAttributes but didn't work.
>>>>> vtkSmartPointer<vtkAssignAttribute> aa =
>>>>> vtkSmartPointer<vtkAssignAttribute>::New();
>>>>> aa->SetInput(UnstructuredGridFull);
>>>>> aa->Assign("nameOfArray", vtkDataSetAttributes::VECTORS,
>>>>> vtkAssignAttribute::POINT_DATA);
>>>>> aa->Update();
>>>>>
>>>>> And then:
>>>>> AssignAttribute -> WarpVector instead of UnstructuredGridFull ->
>>>>> WarpVector.
>>>>> but same result...
>>>>>
>>>>> Thank you.
>>>>>
>>>>> --
>>>>> *Fernando NELLMELDIN*
>>>>> Software Engineer
>>>>> *_______________________________________________________________*
>>>>>
>>>>> *Open Engineering s.a.*
>>>>>
>>>>> Rue Bois Saint-Jean 15/1
>>>>> B-4102 Seraing (Belgium)
>>>>> Tel: +32.4.353.30.34
>>>>>
>>>>> http://www.open-engineering.com
>>>>> https://www.linkedin.com/company/open-engineering?trk=biz-co
>>>>> mpanies-cym
>>>>>
>>>>>
>>>>> *_________________________________________________________________________*
>>>>>
>>>>> _______________________________________________
>>>>> Powered by www.kitware.com
>>>>>
>>>>> Visit other Kitware open-source projects at
>>>>> http://www.kitware.com/opensource/opensource.html
>>>>>
>>>>> Please keep messages on-topic and check the VTK FAQ at:
>>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>>>
>>>>> Search the list archives at: http://markmail.org/search/?q=vtkusers
>>>>>
>>>>> Follow this link to subscribe/unsubscribe:
>>>>> http://public.kitware.com/mailman/listinfo/vtkusers
>>>>>
>>>>>
>>>>
>>>
>>>
>>> --
>>> *Fernando NELLMELDIN*
>>> Software Engineer
>>> *_______________________________________________________________*
>>>
>>> *Open Engineering s.a.*
>>>
>>> Rue Bois Saint-Jean 15/1
>>> B-4102 Seraing (Belgium)
>>> Tel: +32.4.353.30.34
>>>
>>> http://www.open-engineering.com
>>> https://www.linkedin.com/company/open-engineering?trk=biz-companies-cym
>>>
>>>
>>> *_________________________________________________________________________*
>>>
>>
>>
>
>
> --
> *Fernando NELLMELDIN*
> Software Engineer
> *_______________________________________________________________*
>
> *Open Engineering s.a.*
>
> Rue Bois Saint-Jean 15/1
> B-4102 Seraing (Belgium)
> Tel: +32.4.353.30.34
>
> http://www.open-engineering.com
> https://www.linkedin.com/company/open-engineering?trk=biz-companies-cym
>
> *_________________________________________________________________________*
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20161027/ae778f8e/attachment.html>


More information about the vtkusers mailing list