Paraview Lite change default representation

Hi,

How do I change default representation from ‘Surface’ to ‘Surface with Edges’ in Paraview Lite?

I have changed the default in script.js in RepresentationToolbar folder like this:

representation: {
  name: 'Representation',
  autoApply: true,
  default: 'Surface With Edges',
},

but it continues to render it as Surface.

Thanks in advance,

Francesc

Setting custom defaults for the Representation is not yet supported, unfortunately…

Thanks

Is there any workaround? Can I load the default by code?

It seems to me that what I want to do is very basic.

Francesc

You just have to change the code in the protocol to override the default behavior when a new representation gets created.

Can I do this from lite_protocols.py or pvw-lite.py? Or do I need to modify vtk.js library?

I would appreciate if you can point to the file.

Thanks,

Francesc

That part seems to be defined inside ParaView but could be overridden on your side.
The protocol that you will have to fix/override is that one.

More specifically at that line you should do something like

rep = simple.Show()
rep.Representation = 'Surface With Edges'

Thanks!

Is there a tutorial on how to override a protocol?

it is not as simple as overriding @exportRpc(“pv.proxy.manager.create”) inside class ParaViewLite, is it?

Should I create a custom protocol for ParaViewWebProxyManager and instantiate it? How do I do that?

Thanks,

Francesc

You might be able to just register @exportRpc(“pv.proxy.manager.create”) after the main one and yours will be called rather than the first one. You may have to play with it and test it out.

I try it inside lite_protocols.py and pvw-lite.py but my exportRpc(“pv.proxy.manager.create”) is not being called

Can you provide more hints?

I do not seem to progress blindly playing with it.

Thanks in advance,

Francesc

Did you swap the order in which the protocols are registered?

No. I understood ParaViewLite should be after ParaViewWebProxyManager

The order should not matter since we are not generally expecting override. But in your case, you want to play with it. So if one order does not work, then maybe the other will?

I change it (play with it as you say) but it didn’t work.

All this does not seem very deterministic. I found it strange that it is seems to me that I am the first one to request changing the default Representation.

Any other idea to achieve it?

Francesc

Simple create your own protocol that replace the default one with the same expected rpc endpoint.

I’ve just tested it since you were not clear. And the last registered method is indeed overriding any previous one and it is working great.

diff --git a/server/lite_protocols.py b/server/lite_protocols.py
index 2d52202..d64f54e 100644
--- a/server/lite_protocols.py
+++ b/server/lite_protocols.py
@@ -33,9 +33,19 @@ except:
     pass
 
 class ParaViewLite(pv_protocols.ParaViewWebProtocol):
-    def __init__(self, **kwargs):
+    def __init__(self, pxm=None, **kwargs):
       super(pv_protocols.ParaViewWebProtocol, self).__init__()
       self.lineContext = None
+      self.pxm = pxm
+
+    @exportRpc("pv.proxy.manager.create")
+    def customCreate(self, functionName, parentId, initialValues={}, skipDomain=False, subProxyValues={}):
+        response = self.pxm.create(functionName, parentId, initialValues, skipDomain, subProxyValues)
+        rep = simple.Show()
+        rep.Representation = 'Surface With Edges'
+        self.getApplication().InvokeEvent('UpdateEvent')
+
+        return response
 
     @exportRpc("paraview.lite.proxy.name")
     def getProxyName(self, pid):
diff --git a/server/pvw-lite.py b/server/pvw-lite.py
index a96743b..5a634da 100644
--- a/server/pvw-lite.py
+++ b/server/pvw-lite.py
@@ -177,10 +177,12 @@ class _Server(pv_wslink.PVServerProtocol):
 
     def initialize(self):
         # Bring used components from ParaView
+        pxm_protocol = pv_protocols.ParaViewWebProxyManager(
+            allowedProxiesFile=_Server.proxies, baseDir=_Server.dataDir, fileToLoad=_Server.fileToLoad, allowUnconfiguredReaders=_Server.allReaders)
         self.registerVtkWebProtocol(pv_protocols.ParaViewWebStartupRemoteConnection(_Server.dsHost, _Server.dsPort, _Server.rsHost, _Server.rsPort, _Server.rcPort))
         self.registerVtkWebProtocol(pv_protocols.ParaViewWebStartupPluginLoader(_Server.plugins))
         self.registerVtkWebProtocol(pv_protocols.ParaViewWebFileListing(_Server.dataDir, "Home", _Server.excludeRegex, _Server.groupRegex))
-        self.registerVtkWebProtocol(pv_protocols.ParaViewWebProxyManager(allowedProxiesFile=_Server.proxies, baseDir=_Server.dataDir, fileToLoad=_Server.fileToLoad, allowUnconfiguredReaders=_Server.allReaders))
+        self.registerVtkWebProtocol(pxm_protocol)
         self.registerVtkWebProtocol(pv_protocols.ParaViewWebColorManager(pathToColorMaps=_Server.colorPalette, showBuiltin=_Server.showBuiltin))
         self.registerVtkWebProtocol(pv_protocols.ParaViewWebMouseHandler())
         self.registerVtkWebProtocol(pv_protocols.ParaViewWebViewPort(_Server.viewportScale, _Server.viewportMaxWidth, _Server.viewportMaxHeight))
@@ -192,7 +194,7 @@ class _Server(pv_wslink.PVServerProtocol):
         self.registerVtkWebProtocol(pv_protocols.ParaViewWebSaveData(baseSavePath=_Server.saveDataDir))
 
         # Bring used components from ParaView Lite
-        self.registerVtkWebProtocol(local_protocols.ParaViewLite())
+        self.registerVtkWebProtocol(local_protocols.ParaViewLite(pxm_protocol))
 
         # Update authentication key to use
         self.updateSecret(_Server.authKey)

I appreciate your dedication Sebastian but after doing exactly the same thing as your diff, I still get Surface as default representation:

image

If I add some print traces in customCreate should they appear in the console? I don’t get them

Could you explain what you are doing as it is working for me…

What are you running (command line)?
Which file are you editing (paths)?
Which version of ParaView are you using?
Do you see any error (client/server)?

If you do a print('custom code') in your method it should show up in your terminal where you start the process. Not in the web browser.

pvpython --force-offscreen-rendering ./server/pvw-lite.py --data C:\projects_web\3d_samples --port 8082

server/lite_protocols.py
server/pvw-lite.py

ParaView-5.8.1-Windows-Python3.7-msvc2015-64bit/bin/pvpython

no errors(client/server)

I know it should be in the console. I get a trace from this:
def initialize(self):
# Bring used components from ParaView
print(‘initialize’)

but nothing from this:
@exportRpc(“pv.proxy.manager.create”)
def customCreate(self, functionName, parentId, initialValues={}, skipDomain=False, subProxyValues={}):
print(‘custom create’)

I have no idea why it is not working on your end. I don’t know if it is a Windows issue vs Linux (where I’ve tested it).

I checked and I was also using PV 5.8.1 with Python 3.7.4.