[Paraview-developers] Interaction with server data within client plugin
Andy Bauer
andy.bauer at kitware.com
Wed May 8 10:36:34 EDT 2013
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/0499227f/attachment-0001.htm>
More information about the Paraview-developers
mailing list