/usr/lib/python2.7/dist-packages/paraview/webgl.py is in paraview-python 4.0.1-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | r"""
This module provide classes to handle Rest API for WebGL piece request.
"""
from twisted.web import server, resource
from twisted.web import server, resource
from twisted.web.error import Error
from paraview import simple
import web
import exceptions
import base64
class WebGLResource(resource.Resource):
"""
Resource using to serve WebGL data. If supports URLs of two forms:
- to get the meta-data as json-rpc message:
http://.../WebGL?q=meta&vid=456
- to get a binary webgl object:
http://.../WebGL?q=mesh&vid=456&id=1&part=0
vid : visualization view ID (GlobalID of the view Proxy)
id : id of the object in the scene
part: WebGL has a size limit, therefore an object can be splitted in
several part. This is the part index.
"""
def _missing_parameter(self, parameter):
raise Error(400, "Missing required parameter: %s" % parameter)
def _get_parameter(self, args, parameter, required=True):
"""
Extract a parameter value from the request args.
:param parameter: The parameter name
:type parameter: str
:param required: True if the function should raise an error is the
parameter is missing.
:type required: bool
"""
value = None
if not parameter in args:
if required:
self._missing_parameter(parameter)
else:
values = args[parameter]
if len(values) == 1:
value = values[0]
elif required:
self._missing_parameter(parameter)
return value
def _get_view(self, vid):
"""
Returns the view for a given view ID, if vid is None then return the
current active view.
:param vid: The view ID
:type vid: str
"""
def _get_active_view():
view = simple.GetActiveView()
if not view:
raise Error(404, "No view provided to WebGL resource")
return view
view = None
if vid:
try:
view = web.mapIdToProxy(vid)
except exceptions.TypeError:
pass
if not view:
view = _get_active_view()
return view
def _render_GET_mesh(self, vid, request):
"""
Handle GET requests to get WebGL data for a particular object.
"""
object_id = self._get_parameter(request.args, 'id')
part_number = self._get_parameter(request.args, 'part', False);
part = 0
if part_number:
part = int(part_number)
view = self._get_view(vid)
# There part is offset by 1
if part > 0:
part = part - 1
data = web.ParaViewServerProtocol.WebApplication.GetWebGLBinaryData(view.SMProxy,
object_id,
part);
if data:
request.setHeader('content-type', 'application/octet-stream+webgl')
request.setHeader('Cache-Control', 'max-age=99999');
data = base64.b64decode(data)
else:
raise Error(404, "Invalid request for WebGL object")
return data
def _render_GET_meta(self, vid, request):
"""
Handle GET request for meta data.
"""
view = self._get_view(vid)
data = web.ParaViewServerProtocol.WebApplication. GetWebGLSceneMetaData(view.SMProxy)
if data:
request.setHeader('content-type', 'application/json')
else:
raise Error(404, "Invalid request for WebGL meta data")
return data
def render_GET(self, request):
"""
Handle GET requests, parse out q parameter to delegate to the correct
internal function.
There is two types of queries allowed:
- to get the meta-data as json-rpc message:
http://.../WebGL?q=meta&vid=456
- to get a binary webgl object:
http://.../WebGL?q=mesh&vid=456&id=1&part=0
vid : visualization view ID (GlobalID of the view Proxy)
id : id of the object in the scene
part: WebGL has a size limit, therefore an object can be splitted in several part. This is the part index.
"""
try:
q = self._get_parameter(request.args, 'q')
vid = self._get_parameter(request.args, 'vid', False)
if q == 'mesh':
return self._render_GET_mesh(vid, request)
elif q == 'meta':
return self._render_GET_meta(vid, request)
else:
raise Error(400, "Invalid query for the WebGL resource");
except Error as err:
request.setResponseCode(err.status)
return err.message
|