[Paraview-developers] Interaction with server data within client plugin

Sebastien Jourdain sebastien.jourdain at kitware.com
Wed May 8 10:40:32 EDT 2013


yes ;-)


On Wed, May 8, 2013 at 10:36 AM, Andy Bauer <andy.bauer at kitware.com> wrote:

> I think you meant
> double ActiveNodeCoord[3];
>
> instead of
> double ActiveNodeCoord[2];
>
>
>
> On Wed, May 8, 2013 at 10:33 AM, Sebastien Jourdain <
> sebastien.jourdain at kitware.com> wrote:
>
>> Hi Matthias,
>>
>> you should use the following set of macro inside your vtkObject
>>
>> public:
>> vtkSetVector3Macro(ActiveNodeCoord, double);
>> vtkGetVector3Macro(ActiveNodeCoord, double);
>>
>> protected:
>> double ActiveNodeCoord[2];
>>
>> This should solve your wrapping issue.
>>
>>
>> On Wed, May 8, 2013 at 9:39 AM, Matthias Schneider <
>> schneider at vision.ee.ethz.ch> wrote:
>>
>>> Hi,
>>>
>>> Thanks for the useful hints. I have implemented the vtk class to
>>> interact with the vtk data object on the server side and use a proxy to
>>> interact with it from the client side as suggested by Sebastien - thanks!
>>> However, I'm still struggling with the proper xml definition for the proxy.
>>> Also there seems to be an issue with the Client/Server wrapper (see below).
>>>
>>> The pure vtk class has the interface:
>>>
>>> class vtkMyDataHandler: public vtkObject {
>>> public:
>>>         [...]
>>>         void SetInput(vtkAlgorithm* src);
>>>         void SetActiveNode(vtkIdType id);
>>>
>>>         double* GetActiveNodeCoord();
>>>         void GetActiveNodeCoord(double coord[3]);
>>>         [...]
>>> private:
>>>         [...]
>>>         vtkPolyData* m_data;
>>>         vtkIdType m_nodeId;
>>> };
>>>
>>> The Set* methods are used to define a vtkAlgorithm with a vtkPolyData
>>> output and a particular node/vertex id within the vtkPolyData. Eventually,
>>> the handler is supposed to return the node coordinates (x,y,z) of the
>>> selected vertex within the data set.
>>>
>>> The xml descriptor for the class looks like this:
>>>
>>> <ServerManagerConfiguration>
>>>   <ProxyGroup name="utility">
>>>    <Proxy name="MyProxy" class="vtkMyDataHandler" label="Data Handler">
>>>      <ProxyProperty name="Input"
>>>                     command="SetInput" />
>>>
>>>      <IdTypeVectorProperty name="ActiveNode"
>>>                         command="SetActiveNode"
>>>                         default_values="-1"
>>>                         number_of_elements="1" />
>>>
>>>       <DoubleVectorProperty command="GetActiveNodeCoord"
>>>
>>>                           default_values="0.0 0.0 0.0"
>>>                           information_only="1"
>>>                           name="ActiveNodeCoord"
>>>                           number_of_elements="3" />
>>>    </Proxy>
>>>  </ProxyGroup>
>>> </ServerManagerConfiguration>
>>>
>>> On the client side I do the following:
>>>
>>> // set up proxy on the client side
>>>
>>> vtkSMProxyManager *pxm = vtkSMProxyManager::**GetProxyManager();
>>> vtkSMProxy *proxy = pxm->NewProxy("utility", "MyProxy");
>>>
>>> // set internal state of proxy
>>> vtkSMPropertyHelper(proxy,"**Input").Set(properInputProxy);
>>> vtkSMPropertyHelper(proxy,"**ActiveNode").Set(1);
>>> proxy->UpdateVTKObjects();
>>>
>>> // obtain information from proxy
>>> proxy->UpdateProperty("**ActiveNodeCoord")
>>> double tmp[3] = { -1.0, -1.0, -1.0 };
>>> vtkSMPropertyHelper(proxy, "ActiveNodeCoord").Get(tmp, 3);
>>>
>>>
>>> Setting up the proxy and its initial state works perfectly fine.
>>> However, I am not able to update the desired property and invoke the call
>>> of vtkMyDataHandler::**GetActiveNodeCoord.
>>>
>>> There are two issues that I came accross here.
>>>
>>> 1) There seems to be a problem (?) with the Client/Server wrapper.
>>> For some reason the method without any argument
>>>
>>> double* GetActiveNodeCoord();
>>>
>>> does not get wrapped in vtkMyDataHandlerClientServer.**cxx
>>> This leads to an error if I change the update command to:
>>>
>>> proxy->**UpdatePropertyInformation(**proxy->GetProperty("**
>>> ActiveNodeCoord"));
>>>
>>> ERROR: In[...]/ParaView-3.98.1-**source/ParaViewCore/**
>>> ServerImplementation/Core/**vtkPVSessionCore.cxx, line 389
>>> vtkPVSessionCore (0x2aa9de0): Object type: vtkMyDataHandler, could not
>>> find requested method: "GetActiveNodeCoord"
>>> or the method was called with incorrect arguments.
>>>
>>> while processing
>>> Message 0 = Invoke
>>>   Argument 0 = vtk_object_pointer {vtkMyDataHandler (0x29cc970)}
>>>   Argument 1 = string_value {GetActiveNodeCoord}
>>>
>>> 2) With the update command used in the code snippet, the property values
>>> are set to the default values but the data handler function
>>> (GetActiveNodeCoord) doesn't get called as information only properties
>>> cannot be updated according to vtkSMProxy::UpdateProperty.
>>>
>>> So maybe I have a wrong understanding of information only properties?! I
>>> had a look at some of the xml examples in utilities.xml
>>> (ParaView-3.98.1-source/**ParaViewCore/ServerManager/**
>>> SMApplication/Resources/**utilities.xml) and it seemed to me like this
>>> is the way to go?!
>>>
>>> Removing the information_only tag from the xml property descriptor, the
>>> property obviously gets updated in proxy->UpdateVTKObjects(), which for
>>> obvious reasons results in an error as there is no method to *set* the node
>>> coordinates.
>>>
>>> So what am I missing here? I would be really happy about any kind of
>>> comments or hints how to do this.
>>>
>>> Best,
>>> Matthias
>>>
>>>
>>>
>>> On 04/05/2013 03:25 PM, Sebastien Jourdain wrote:
>>>
>>>> Hi Matthias,
>>>>
>>>>  However, getting access to the vtkPolyData object on the server will
>>>>> not be possible that easily I guess.
>>>>>
>>>>
>>>>  From the client side, not really unless you know that you will only run
>>>> in a built-in session.
>>>> That's precisely why you need to create a pure VTK class that will be
>>>> connected in some way to that object from the client side via proxy
>>>> while the real connection will happen on the server side.
>>>>
>>>>  I guess there is some kind of vtk algorithm required on the server side
>>>>>
>>>> to do the processing which is configured from the client via a proxy.
>>>>
>>>> Yes, although it doesn't need to be an algorithm if it is not a 'filter'
>>>> type of object.
>>>> But for instance you can create a VTK class that will provide an API
>>>> like that:
>>>>
>>>> SetMyVtkObjectToLookInto(**vtkObject* whatYouWant)
>>>> SetActiveNodeId(int id)
>>>> double* GetNewCenterOfRotation()
>>>>
>>>> And on the client side thanks to proxy (You will need to write a small
>>>> XML file for your VTK class) you will have to write something like that.
>>>>
>>>> myProxy = pxm.NewProxy('utility','**mySuperProxy');
>>>> vtkSMPropertyHelper(myProxy, 'ProxyPropName').Set(
>>>> yourProxyThatYouSelectedFromTh**eUI );
>>>> vtkSMPropertyHelper(myProxy, 'ActiveNode').Set( yourSelectedID );
>>>> myProxy->UpdateVTKObjects(); // This will push the changes to the server
>>>>
>>>> // Now it's time to retreive the info from the server
>>>> myProxy->**UpdateInformationProperty('**CenterOfRotation');
>>>> vtkSMPropertyHelper(myProxy, 'CenterOfRotation').Get(
>>>> localArrayToFillWithCenterOfRo**tation );
>>>>
>>>> Hope this give you a feeling on how the things works...
>>>>
>>>> Seb
>>>>
>>>> PS: I just wrote things from the top of my head, so names might not
>>>> exactly match but the idea is there.
>>>>
>>>>
>>>>
>>>> On Fri, Apr 5, 2013 at 8:48 AM, Matthias Schneider
>>>> <schneider at vision.ee.ethz.ch <mailto:schneider at vision.ee.**ethz.ch<schneider at vision.ee.ethz.ch>>>
>>>> wrote:
>>>>
>>>>     Hi Sebastian!
>>>>
>>>>     Thank you very much for you quick answer!
>>>>     I don't have any server side class yet.
>>>>
>>>>     I used the DockWidget example to setup a GUI (QDockWidget) along
>>>>     with some simple elements:
>>>>     pqOutputPortComboBox: define source
>>>>     QSpinBox: define node id
>>>>     QPushButton: trigger event
>>>>
>>>>     As I understand it the whole GUI processing takes place at the
>>>>     client side and has access to the server data via proxies only.
>>>>
>>>>     To stick with my simple example, I'd need a way to actually access
>>>>     the server source, which is a vtkPolyData in my case (originating
>>>>     from an exported graph, i.e., nodes connected by lines).
>>>>
>>>>     // Get source from pqOutputPortComboBox
>>>>     [...]
>>>>     vtkSMSourceProxy *source = ...
>>>>
>>>>     // obtain requested node id from GUI element
>>>>     vtkIdType nodeId = [...]
>>>>
>>>>     // If we had access to the vtkPolyData itself, we could do sth
>>>> like...
>>>>     vtkPolyData *data = ...
>>>>     double coord[3];
>>>>     data->GetPoints()->GetPoint(__**nodeId, coord);
>>>>
>>>>
>>>>     // Set rotation center of current view to coord and render view
>>>>     [...]
>>>>
>>>>     However, getting access to the vtkPolyData object on the server will
>>>>     not be possible that easily I guess. I guess there is some kind of
>>>>     vtk algorithm required on the server side to do the processing which
>>>>     is configured from the client via a proxy (set the desired source
>>>>     and the node id). But as I said, I do not fully understand the
>>>>     ServerManager concept here and couldn't find any similar examples.
>>>>
>>>>     Hope this helps to clarify my problem...
>>>>
>>>>     Thanks for your help,
>>>>     Matthias
>>>>
>>>>
>>>>
>>>>     On 04/05/2013 01:47 PM, Sebastien Jourdain wrote:
>>>>
>>>>         Hi Matthias,
>>>>
>>>>         I guess, you already have your vtk class that will do the
>>>>         processing on
>>>>         the server side ?
>>>>         If so what are the methods that you want to get called and with
>>>> what
>>>>         arguments ?
>>>>
>>>>         Then once, I know more about your special use case, I can dive
>>>>         into the
>>>>         server manager part properly...
>>>>
>>>>         Seb
>>>>
>>>>
>>>>         On Fri, Apr 5, 2013 at 7:16 AM, Matthias Schneider
>>>>         <schneider at vision.ee.ethz.ch
>>>>         <mailto:schneider at vision.ee.**ethz.ch<schneider at vision.ee.ethz.ch>
>>>> >
>>>>         <mailto:schneider at vision.ee.__**ethz.ch <http://ethz.ch>
>>>>
>>>>         <mailto:schneider at vision.ee.**ethz.ch<schneider at vision.ee.ethz.ch>>>>
>>>> wrote:
>>>>
>>>>              Hi,
>>>>
>>>>              I'm trying to implement an extension for Paraview but I'm
>>>>         somewhat
>>>>              stuck with the client/server and ServerManager concepts
>>>> used in
>>>>              Paraview. Maybe someone could give a hint where to find
>>>>         some more
>>>>              information on that. I was looking at the plugin examples
>>>>         but that
>>>>              didn't help me too much.
>>>>
>>>>              What I do not understand is how to establish some kind of
>>>> data
>>>>              transfer between the server and the client. A very simple
>>>>         example
>>>>              that I was trying to implement is as follows: For a
>>>>         vtkPolyDataSet
>>>>              source define a point id via a GUI element and set the
>>>> rotation
>>>>              center of the active view to the coordinate of this point.
>>>>
>>>>              Based on the DockWidget example and the SelectionInspector
>>>>         I was
>>>>              able to create the GUI elements on the client side to
>>>> select an
>>>>              appropriate source on the server side and get access to the
>>>>         active
>>>>              view. What I do not understand is how to interact with the
>>>>         actual
>>>>              data of the source to read the spatial coordinates of the
>>>>              user-defined vertex.
>>>>
>>>>              On the client side I use a pqOutputPortComboBox to select
>>>>         the source
>>>>              which gives access to the current
>>>>         pqOutputPort/pqPipelineSource.
>>>>               >From this I get a
>>>>         vtkSMSourceProxy/____**vtkPVDataInformation which
>>>>
>>>>
>>>>              allows me to read basic information of the data as shown in
>>>>              Paraview's statistics inspector (no. of cells/points,
>>>>         memory size,
>>>>              bounds, ...).
>>>>
>>>>              Can anybody give me a hint how to do this properly? Any
>>>> help is
>>>>              appreciated very much.
>>>>
>>>>              Thanks,
>>>>              Matthias
>>>>
>>>>              ______________________________**_____________________
>>>>              Paraview-developers mailing list
>>>>              Paraview-developers at paraview._**___org
>>>>              <mailto:Paraview-developers at __**paraview.org<http://paraview.org>
>>>>         <mailto:Paraview-developers@**paraview.org<Paraview-developers at paraview.org>
>>>> >>
>>>>         http://public.kitware.com/____**mailman/listinfo/paraview-____*
>>>> *developers<http://public.kitware.com/____mailman/listinfo/paraview-____developers>
>>>>         <http://public.kitware.com/__**mailman/listinfo/paraview-__**
>>>> developers<http://public.kitware.com/__mailman/listinfo/paraview-__developers>
>>>> >
>>>>
>>>>
>>>>         <http://public.kitware.com/__**mailman/listinfo/paraview-__**
>>>> developers<http://public.kitware.com/__mailman/listinfo/paraview-__developers>
>>>>         <http://public.kitware.com/**mailman/listinfo/paraview-**
>>>> developers<http://public.kitware.com/mailman/listinfo/paraview-developers>
>>>> >>
>>>>
>>>>
>>>>
>>>>     --
>>>>     Matthias Schneider
>>>>     Computer Vision Laboratory
>>>>
>>>>     ETH Zürich, ETF D114.1
>>>>     Sternwartstrasse 7
>>>>     8092 Zürich, Switzerland
>>>>
>>>>     fon: +41 44 63 20379 <tel:%2B41%2044%2063%2020379>
>>>>     fax: +41 44 63 21199 <tel:%2B41%2044%2063%2021199>
>>>>     www.vision.ee.ethz.ch/~__**schneima/<http://www.vision.ee.ethz.ch/~__schneima/>
>>>>     <http://www.vision.ee.ethz.ch/**~schneima/<http://www.vision.ee.ethz.ch/~schneima/>
>>>> >
>>>>
>>>
>>
>> _______________________________________________
>> Paraview-developers mailing list
>> Paraview-developers at paraview.org
>> http://public.kitware.com/mailman/listinfo/paraview-developers
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/paraview-developers/attachments/20130508/dfd61d79/attachment-0001.htm>


More information about the Paraview-developers mailing list