[Paraview] custom filter doesn't update property in the Paraview UI

corinna reuter corinnareuter75 at gmail.com
Tue Aug 9 16:10:29 EDT 2016


Hi Cory,
that's fine, I have some experience developing Qt UIs. But there is one
difficulty with ParaView: I couldn't find any examples or documentation how
to extend the existing widgets? Where do I plug in the additional elements,
is it possible in some xml plugin description, or do I have to hard code it
into the ParaView sources?

The manual update is fine, although not perfect. Ideally I would like to
let the user choose once whether update is automatic or manual. Since the
manual update button of the Threshold filter changes its color when the
filter input is modified, I assume that I should be able to use the event
that triggers the color change to trigger the update of the displayed
property instead.

Thank you
Corinna

On Mon, Aug 8, 2016 at 8:29 PM, Cory Quammen <cory.quammen at kitware.com>
wrote:

> Hi Corinna,
>
> Utkarsh addressed the updating of properties in his earlier response
> about the directionality of property changes in ParaView:
>
> "
> 2. ParaView's properties are not bi-directional. They are only
> intended to be set on the UI side and pushed to the VTK side. There
> are of course exceptions to this, and you can add what's called a
> "information_only" property that instead reads a value from the VTK
> side and provides it on the "client" side, but for such properties,
> often there's no UI. They are instead, used to define the "domain" for
> the property which controls things like range for the slider, for
> example.
> "
>
> So, in short, ParaView is not really designed to do this. However, it
> may be possible to define a custom panel for your NPoints property
> that, when clicked, updates the property value to the current scalar
> range. For example, there is a custom panel widget in the Threshold
> filter that lets you update the ranges based on the range of the
> currently selected scalar array. You would need this kind of custom
> panel widget for your NPoints property. The only catch is you would
> need to update the value manually, or perhaps you could use a QTimer
> to periodically refresh the value.
>
> HTH,
> Cory
>
> On Mon, Aug 8, 2016 at 2:14 PM, corinna reuter
> <corinnareuter75 at gmail.com> wrote:
> > Dear Cory,
> > I wonder, if you still have an idea how to implement a filter that
> > initializes its properties from upstream objects and updates these
> > properties when those objects change.
> > Isn't the whole ParaView designed such that changes are propagated along
> the
> > pipeline? Why is it so complicated to render propagated changes in the
> > filter parameters visible?
> >
> >
> > Thank you
> > Corinna
> >
> >
> > On Tue, Aug 2, 2016 at 4:55 PM, corinna reuter <
> corinnareuter75 at gmail.com>
> > wrote:
> >>
> >> Dear Cory, dear all,
> >> sorry for not getting back to this topic earlier. Your solution works
> >> perfectly for the described problem. When I create e.g. a SphereSource
> and
> >> attach the TestProperty filter with its NPoints property, this property
> is
> >> initialized with the correct number of points in the sphere.
> >>
> >> However, I have another requirement which is that the property should
> also
> >> be updated, when the input changes. I thought the same mechanism for
> >> initializing the property would also take care of updating the property
> upon
> >> modified input.
> >>
> >> If I modify the SphereSource from above by changing the ThetaResolution
> or
> >> PhiResolution, then vtkTestProperty::RequestInformation is called as
> >> expected, and the included print statements show the new number of
> points,
> >> but the NPoints property won't reflect this new value. Do you know of
> >> another short trick, how to fix this? You mentioned that you found the
> need
> >> for a domain element in the ParaView source code. Where exactly? If I
> >> understand what prevented the property initialization, I might be able
> to
> >> find out what prevents the update.
> >>
> >> The complete filter sources, updated to include your corrections, are
> >> attached.
> >>
> >> Thank you
> >> Corinna
> >>
> >> On Fri, Jul 15, 2016 at 6:02 PM, Cory Quammen <cory.quammen at kitware.com
> >
> >> wrote:
> >>>
> >>> Corinna,
> >>>
> >>> Looking at the ParaView source code, I believe that vector properties
> >>> with information properties must have a domain associated with them.
> >>> In your case, you can add an IntRangeDomain with only a minimum
> >>> defined:
> >>>
> >>> <IntVectorProperty name="NPoints"
> >>>                         command="SetNPoints"
> >>>                         information_property="NPointsInfo"
> >>>                         number_of_elements="1"
> >>>                         default_values="42">
> >>>     <IntRangeDomain name="range" min="0" />
> >>> </IntVectorProperty>
> >>>
> >>> 0 seems like a reasonable minimum in your case.
> >>>
> >>> Keep your information_only property as it is. You'll need to change
> >>> where your NPoints is set, though - moving this to the
> >>> RequestInformation() member function should work.
> >>>
> >>> Cory
> >>>
> >>>
> >>> On Fri, Jul 15, 2016 at 3:46 AM, corinna reuter
> >>> <corinnareuter75 at gmail.com> wrote:
> >>> > Cory, thanks for mentioning the TIFFReader proxy. I tried to modify
> my
> >>> > previously attached code such that the NPoints property links to a
> >>> > NPointsInfo property. Plus, I have removed the call
> >>> > "this->SetNPoints(nset);" inside vtkTestProperty::RequestData as
> >>> > suggested
> >>> > by Utkarsh. The NPoints property is still showing the default "42",
> >>> > though,
> >>> > and not initialized or updated from the number of points of the input
> >>> > dataset. I am obviously missing another important step in addition to
> >>> > changing the xml definitions, but which one?
> >>> >
> >>> > Here is the detailed modification of TestProperty.xml compared to the
> >>> > earlier attachment:
> >>> > replace
> >>> > "<IntVectorProperty name="NPoints"
> >>> >                         command="SetNPoints"
> >>> >                         number_of_elements="1"
> >>> >                         default_values="42">
> >>> >   </IntVectorProperty>"
> >>> > with:
> >>> > "<IntVectorProperty name="NPoints"
> >>> >                         command="SetNPoints"
> >>> >                         information_property="NPointsInfo"
> >>> >                         number_of_elements="1"
> >>> >                         default_values="42">
> >>> >   </IntVectorProperty>
> >>> >   <IntVectorProperty name="NPointsInfo"
> >>> >                         command="GetNPoints"
> >>> >                         information_only="1">
> >>> >     <SimpleIntInformationHelper />
> >>> >   </IntVectorProperty>"
> >>> >
> >>> > Thank you
> >>> > Corinna
> >>> >
> >>> >
> >>> > On Thu, Jul 14, 2016 at 5:24 PM, Cory Quammen
> >>> > <cory.quammen at kitware.com>
> >>> > wrote:
> >>> >>
> >>> >> Corinna,
> >>> >>
> >>> >> Take a look at the TIFFReader SourceProxy in
> >>> >> ParaViewCore/ServerManager/SMApplication/Resources/readers.xml. It
> has
> >>> >> a CustomDataSpacing property that enables you to set voxel spacing,
> >>> >> and has an associated information property CustomDataSpacingInfo
> that
> >>> >> should initially populate the spacing property when the reader is
> >>> >> created.
> >>> >>
> >>> >> HTH,
> >>> >> Cory
> >>> >>
> >>> >> On Thu, Jul 14, 2016 at 11:17 AM, Utkarsh Ayachit
> >>> >> <utkarsh.ayachit at kitware.com> wrote:
> >>> >> >> I'll check the meaning of MTime.
> >>> >> >
> >>> >> > See the implementation of vtkSetMacro() in vtkSetGet.h. Every time
> >>> >> > the
> >>> >> > value changes, it call this->Modified() which updates the MTime.
> >>> >> > Since
> >>> >> > VTK is a demand-driven pipeline, changes to MTime is what tells
> the
> >>> >> > pipeline that the algorithm has been modified and needs
> reexecution.
> >>> >> > If one modifies the MTime in RequestData() (the method called by
> the
> >>> >> > pipeline to process the input to produce output), the pipeline
> >>> >> > thinks
> >>> >> > the filter is always dirty and that can cause unexpected side
> >>> >> > effects.
> >>> >> >
> >>> >> >
> >>> >> >> I'd need something similar to an image resize filter. The output
> >>> >> >> size
> >>> >> >> should
> >>> >> >> be identical to the input size, when the filter is first attached
> >>> >> >> to
> >>> >> >> the
> >>> >> >> input. The output size should be shown in the UI and the user
> >>> >> >> should be
> >>> >> >> able
> >>> >> >> to enter a different output size.
> >>> >> >
> >>> >> > This is possible. Let me see if I can find you a simple example
> for
> >>> >> > the same. I'll get back to you.
> >>> >> > _______________________________________________
> >>> >> > 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 ParaView Wiki at:
> >>> >> > http://paraview.org/Wiki/ParaView
> >>> >> >
> >>> >> > Search the list archives at: http://markmail.org/search/?q=
> ParaView
> >>> >> >
> >>> >> > Follow this link to subscribe/unsubscribe:
> >>> >> > http://public.kitware.com/mailman/listinfo/paraview
> >>> >>
> >>> >>
> >>> >>
> >>> >> --
> >>> >> Cory Quammen
> >>> >> R&D Engineer
> >>> >> Kitware, Inc.
> >>> >
> >>> >
> >>>
> >>>
> >>>
> >>> --
> >>> Cory Quammen
> >>> R&D Engineer
> >>> Kitware, Inc.
> >>
> >>
> >
>
>
>
> --
> Cory Quammen
> R&D Engineer
> Kitware, Inc.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/paraview/attachments/20160809/6cb4b1e3/attachment.html>


More information about the ParaView mailing list