Mario,

Firstly, there's no way from Python to do what you want to do except
using the property mechanism, since well, the goal with ParaView was
not to provide a general purpose RPC framework. In C++, you can do
that you want as follows:

vtkSMProxy* proxy = ...
std::string arg = ...;
vtkClientServerStream stream;
stream << vtkClientServerStream::Invoke
            << VTKOBJECT(proxy)
            << "doSomething" << arg.c_str()
            << vtkClientServerStream::End;

vtkSMSession* session = proxy->GetSession();
session->ExecuteStream(
   /*location*/ proxy->GetLocation(),
  /* ignore_errores*/ false);

vtkClientServerStream result = session->GetLastResult(proxy->GetLocation());
if (result.GetNumberOfMessages() == 1 && result.GetNumberOfArguments(0) == 1)
{
   std:string aresult;
  result.GetArgument(0, 0, &aresult);
}

Utkarsh



On Sun, Dec 11, 2016 at 12:01 PM, Mario Schreiber
<schreibermari...@gmail.com> wrote:
> Why is it so complicated to call a procedure and receive a return value on
> the client?
>
> I am attaching my attempt (CMakeLists.txt, vtkSquareFun.cxx, vtkSquareFun.h
> and TestPlugin.xml, each less than 20 lines of code), which basically
> calculates the square of an argument in vtkSquareFun::eval(double x).
>
> When I load this plugin in Paraview and open the Python Shell, I can
> evaluate vtkSquareFun::eval() using a detour by first setting the argument
> and then getting the result, which is linked to the argument property in
> TestPlugin.xml:
>
> fun=servermanager.CreateProxy("test","SquareFun")
> fun.GetProperty("Arg").SetElement(0,999)
> fun.UpdateVTKObjects()
> fun.UpdatePropertyInformation()
> fun.GetProperty("Result").GetElement(0)
> ... showing the correct result 998001.
>
> Why can't I simply run the following?
> fun=servermanager.CreateProxy("test","SquareFun")
> result=fun.InvokeCommand("eval",[999.0])
>
> Does Paraview really not provide any means of calling a function with
> arguments and return value within a single client-server communication? All
> these individual message transfers are a bottleneck in our application. Does
> the Paraview architecture exclude more universal remote procedure calls, or
> do you think that one could just augment the available procedures with
> another procedure that can deliver a set of custom return values?
>
> Thanks
> Mario
>
>
> 2016-12-07 7:34 GMT+01:00 Mario Schreiber <schreibermari...@gmail.com>:
>>
>> Hello,
>> I have a use case, where a vtkObject on the server implements a method
>> like
>>
>> std::string doSomething(std::string arg);
>>
>> Now, with a proxy prx on the client for  that class, I would like to call
>> the remote procedure similar to
>>
>> result=prx.InvokeCommand("doSomething",[arg])
>>
>> Is something like this possible?
>> I found a very complicated workaround by first defining the arguments as
>> properties, defining the result as information_only property linked to on of
>> the args, then calling "UpdateVTKObjects" to push the arguments and finally
>> "UpdateInformationProperties" to pull the result. Is there an easier
>> solution, possible with a short example?
>>
>> Thank you
>> Mario
>
>
>
> _______________________________________________
> 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
>
_______________________________________________
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

Reply via email to