[vtkusers] Connecting to arrays in a reader

Greg Schussman greg.schussman at gmail.com
Thu Jul 17 16:59:45 EDT 2014


Hi, David.

Huge thanks for the explanation.  That makes sense and is now working well
for me.

Greg



On Thu, Jul 17, 2014 at 8:12 AM, David E DeMarle <dave.demarle at kitware.com>
wrote:

> Howdy.
>
> On Tue, Jul 15, 2014 at 8:35 PM, Greg Schussman <greg.schussman at gmail.com>
> wrote:
>
>> Hi.
>>
>
>
>> I'm not sure how things are meant to connect.  I'm working in python.
>> I'm trying to build and use a reader.  Many examples seem to assume there's
>> only a single field that can be made active.  But in my case, the reader is
>> where I keep all information, and there is no sense (at least in my mind)
>> of an "active" field, because several may be used at ones (scalar for
>> surface coloring, one vector field for one set of cone glyphs, and another
>> vector field for a different set of cone glyphs, all to be displayed at the
>> same time).
>>
>>
> The "Active" concept in VTK is mostly an artifact of days of yore. The
> modern way to tell a filter what array to operate on is with
> vtkAlgorithm::SetInputArrayToProcess (
> http://www.vtk.org/doc/nightly/html/classvtkAlgorithm.html#a42a55ca2c277aecc909ad592d12978aa).
> Most but not all filters respect that.
>
> I create the each field this way (where my_voltages is just a python list
>> that I parsed from a file):
>>
>>   voltage = vtkDoubleArray()
>>   voltage.SetName('voltage')
>>   voltage.SetNumberOfComponents(1)
>>   for v in my_voltages:
>>       voltage.InsertNextValue(v)
>>
>> And I did the same thing for the 3D fields, except using 3 for the number
>> of components.
>> Then, I add these fields to my reader (derived from
>> vtkProgrammableSource) this way:
>>
>>   # 1D fields:
>>   self.GetPolyDataOutput().GetCellData().AddArray(voltage)
>>   self.GetPolyDataOutput().GetCellData().AddArray(charge)
>>
>>   # 3D fields:
>>   self.GetPolyDataOutput().GetCellData().AddArray(current_density_real)
>>   self.GetPolyDataOutput().GetCellData().AddArray(current_density_imag)
>>
>> I'm able to iterate through those and print out the correct values and
>> some of my early scalar visualization with colormaps and such seem to be
>> working.
>>
>> So, first question is: does what I have done so far seem reasonable or is
>> there a more vtk-ish way of doing this?
>>
>>
> You are doing it just right.
>
>
>> Second question is how to connect to the reader.  I'm trying to use it
>> this way:
>>
>>     cone = vtkConeSource()
>>     cone.SetRadius(0.1)
>>     cone.SetHeight(0.5)
>>     cone.SetResolution(8)
>>
>>     glyph = vtkGlyph3D()
>>     glyph.SetInputConnection( WHAT GOES HERE??? )
>>
>>
> reader.GetOutputPort()
>
>
>     glyph.SetSourceConnection(self.cone.GetOutputPort())
>>     glyph.SetScaleModeToDataScalingOff()
>>     glyph.SetScaleFactor(1.0e-3)
>>     glyph.SetVectorModeToUseVector()
>>     glyph.OrientOn()
>>
>> So the "what goes here" is this question.  Because I used a named array,
>> I'd hope for something like:
>>
>>    glyph.SetInputConnection(reader.GetOutputPort('current_density_real'))
>>
>> But that doesn't work, and I've seen nothing to suggest that it would.
>> When I try this as the argument,
>>
>>
>> reader.GetPolyDataOutput().GetCellData().GetArray('current_density_real')
>>
>>
>
>> Is this a matter of converting an array to an algorithm output?   It
>> seems (probably quite wrongly) to me that algorithms can produce many
>> different kinds of output, and that a vtkArray would reasonably be one of
>> them.
>>
>
> Close but no cigar. Algorithms produce vtkDataObjects, which contain any
> number of vtkArrays. Use SetArrayToProcess to tell the filter which of the
> arrays you want it to process.
>
>
>> Or, when using the SetInput(), why wouldn't a vtkArray be a
>> vtkDataObject?  Of course, the easy answer is "that's not how the
>> inheritance diagrams are drawn", but that doesn't really get me closer to
>> groking the intended grand scheme of things.   I'm not complaining; I'm
>> just confused.
>>
>
> You are not the first.
>
>
>> How to I get the glyph to use the vector data (in the vtkArray) as its
>> input?  (or if that's the wrong way to think about this, then what's the
>> right way?)
>>
>>
> glyph.SetInputArrayToProcess(0,0,0,"vtkDataObject::FIELD_ASSOCIATION_CELLS",
> "thickness0")
>
>
>> Many thanks in advance for any help/enlightenment.
>>
>> Greg
>>
>>
> David E DeMarle
> Kitware, Inc.
> R&D Engineer
> 21 Corporate Drive
> Clifton Park, NY 12065-8662
> Phone: 518-881-4909
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20140717/a2c05df7/attachment.html>


More information about the vtkusers mailing list