"""
API for creating images that correspond to a set of queries.
Used by viewer primarily.
"""
import abc
import layer_rasters
[docs]class QueryMaker(object):
__metaclass__ = abc.ABCMeta
'''
Translates UI queries into a set of LayerRasters. Abstract class, Derive
from this class to implement different query specifications. The UI queries
are expected to fully define the image file paths.
'''
def __init__(self):
self.__store = None
def __loadLayers(self, layers):
''' Loads the required images in the LayerRasters instances.'''
# send queries to the store to obtain images
lcnt = 0
for l in range(0, len(layers)):
layers[l].loadImages(self.__store)
lcnt += 1
@abc.abstractmethod
def __createBaseLayerFromQuery(self, query):
'''
Creates a base LayerRasters containing the values that are shared
(global) by the set of user-selected layers (e.g. current time,
camera, etc.). This base LayerRasters will be used as an initial
template for all of the LayerRasters. Abstract, implement in a derived
class.
'''
return
@abc.abstractmethod
[docs] def supportsLayering(self):
'''
Predicate to query if a translator supports compositing (e.g. Spec-B).
Abstract, implement in a derived class.
'''
return
@abc.abstractmethod
[docs] def translateQuery(self, query):
'''
Receives a set of parameters from the UI. The parameters (or UI
queries) come in the following form:
total_query = { "parameter_1" : set([values_of_1]),
"parameter_2" : set([values_of_2]), ... }
Example:
total_query = { "phi" : set([-180]),
"theta" : set([0]),
"Slice2" : set([-0.34, -0.1, 0.1]) }
The queries are passed to the LayerRasters instances which then use
cinema_store to parse these queries into image file paths. This method
is expected to return a set of LayerRasters consisting of all the
layers to render (each LayerRasters instance holds all of its required
images). Abstract, implement in a derived class.
'''
return [layer_rasters.LayerRasters()]
[docs] def setStore(self, store):
self.__store = store
[docs] def store(self):
return self.__store
[docs]class QueryMaker_SpecA(QueryMaker):
'''
This class translates UI queries into a single Spec-A LayerRasters instance
(single-image).
'''
def __init__(self):
super(QueryMaker_SpecA, self).__init__()
def _QueryMaker__createBaseLayerFromQuery(self, query):
baseLayer = layer_rasters.LayerRasters()
for name in query.keys():
values = query[name]
v = list(iter(values))[0] # no options in query, so only 1 result
baseLayer.addToBaseQuery({name: v})
return baseLayer
[docs] def supportsLayering(self):
return False
[docs] def translateQuery(self, query):
# create a base layer (which in this case is the only one)
baseLayer = self._QueryMaker__createBaseLayerFromQuery(query)
# pass it as a list (for compatibility)
layerList = [baseLayer]
self._QueryMaker__loadLayers(layerList)
return layerList