[Paraview-developers] Interaction with server data within client plugin
Sebastien Jourdain
sebastien.jourdain at kitware.com
Wed May 8 14:23:18 EDT 2013
Hi Mattias,
So you're suggesting to make the active node coordinate part of the
> internal state of the pure vtk class and access it as a proxy property from
> the client side with the information_only flag enabled?
>
Yes
> At what point will this property be updated? I rather thought this will be
> done in one of the GetActiveNodeCoord variants, something like
>
> double* vtkMyDataHandler::**GetActiveNodeCoord() {
> return m_data->GetPoint(m_nodeId);
> }
>
This could but since you seems to have the 'wrong' api to be wrapped, then
just do something that works.
You can have a method that has no argument that trigger the computation.
Like the one here.
<Property command="ComputeIntersection" name="Update"></Property>
This of course assumes that the input and node id property have been set
> properly by the client. Obviously, I am still missing part of the design
> here?!
>
> As for the wrapping I get even more confused. Is it really true that the
> header files/class defintions are specifically parsed for the appearance of
> the vtkSet/Get*Macros? At least I obtain different results when I use
> vtkGetVector3Macro and a manual expansion of the macro with exactly the
> same definitions. In all cases only one of the get methods are wrapped.
>
That's possible and if you implement your way the wrapped one, that should
also work.
On 05/08/2013 04:33 PM, Sebastien Jourdain 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 <mailto:schneider at vision.ee.**ethz.ch<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>
> >
> <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 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>
> >>
> <mailto:schneider at vision.ee.
> <mailto:schneider at vision.ee.>_**___ethz.ch <http://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@
> <mailto:Paraview-developers@>_**___paraview.org <
> http://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>
> >>
>
>
>
> <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>
> <tel:%2B41%2044%2063%2020379>
> fax: +41 44 63 21199 <tel:%2B41%2044%2063%2021199>
> <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/>
> >
> <http://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/>
> >>
>
>
>
--
Matthias Schneider
Computer Vision Laboratory
ETH Zürich, ETF D114.1
Sternwartstrasse 7
8092 Zürich, Switzerland
fon: +41 44 63 20379
fax: +41 44 63 21199
www.vision.ee.ethz.ch/~**schneima/ <http://www.vision.ee.ethz.ch/~schneima/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/paraview-developers/attachments/20130508/0b0972a4/attachment-0001.htm>
More information about the Paraview-developers
mailing list