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

Matthias Schneider schneider at vision.ee.ethz.ch
Wed May 8 09:39:23 EDT 2013


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(
> yourProxyThatYouSelectedFromTheUI );
> 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(
> localArrayToFillWithCenterOfRotation );
>
> 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>> 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>
>         <mailto:schneider at vision.ee.__ethz.ch
>         <mailto: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
>         <mailto: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>>
>
>
>
>     --
>     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/>


More information about the Paraview-developers mailing list