data.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. # -*- coding: utf-8 -*-
  2. """!
  3. @package animation.data
  4. @brief animation data structures
  5. Classes:
  6. - data::AnimationData
  7. - data::AnimationLayer
  8. (C) 2013 by the GRASS Development Team
  9. This program is free software under the GNU General Public License
  10. (>=v2). Read the file COPYING that comes with GRASS for details.
  11. @author Anna Petrasova <kratochanna gmail.com>
  12. """
  13. import os
  14. from grass.script import core as gcore
  15. from core.utils import _
  16. from core.gcmd import GException
  17. from animation.nviztask import NvizTask
  18. from animation.utils import validateMapNames, getRegisteredMaps, \
  19. checkSeriesCompatibility, validateTimeseriesName
  20. from core.layerlist import LayerList, Layer
  21. import grass.temporal as tgis
  22. class AnimationData(object):
  23. def __init__(self):
  24. self._name = None
  25. self._windowIndex = 0
  26. self._layerList = None
  27. # only this stds is taken into account for time computations
  28. # if there are any stds at all
  29. self._firstStdsNameType = None
  30. self._mapCount = None
  31. self._cmdMatrix = None
  32. self._viewModes = [('2d', _("2D view")),
  33. ('3d', _("3D view"))]
  34. self.viewMode = '2d'
  35. self.nvizTask = NvizTask()
  36. self._nvizParameters = self.nvizTask.ListMapParameters()
  37. self.nvizParameter = self._nvizParameters[0]
  38. self.workspaceFile = None
  39. self.legendCmd = None
  40. def GetName(self):
  41. return self._name
  42. def SetName(self, name):
  43. if name == '':
  44. raise ValueError(_("No animation name selected."))
  45. self._name = name
  46. name = property(fget=GetName, fset=SetName)
  47. def GetWindowIndex(self):
  48. return self._windowIndex
  49. def SetWindowIndex(self, windowIndex):
  50. self._windowIndex = windowIndex
  51. windowIndex = property(fget=GetWindowIndex, fset=SetWindowIndex)
  52. def SetLayerList(self, layerList):
  53. """!
  54. Throws GException if layer list's combination of stds is not valid.
  55. """
  56. mapSeriesList = []
  57. timeseriesList = []
  58. for layer in layerList:
  59. if layer.active and hasattr(layer, 'maps'):
  60. if layer.mapType in ('strds', 'stvds'):
  61. timeseriesList.append((layer.name, layer.mapType))
  62. self._firstStdsNameType = layer.name, layer.mapType
  63. else:
  64. mapSeriesList.append((layer.maps))
  65. if not timeseriesList:
  66. self._firstStdsNameType = None, None
  67. # this throws GException
  68. count = checkSeriesCompatibility(mapSeriesList=mapSeriesList,
  69. timeseriesList=timeseriesList)
  70. self._mapCount = count
  71. self._layerList = layerList
  72. def GetLayerList(self):
  73. return self._layerList
  74. layerList = property(fget=GetLayerList, fset=SetLayerList)
  75. def GetFirstStdsNameType(self):
  76. return self._firstStdsNameType
  77. firstStdsNameType = property(fget=GetFirstStdsNameType)
  78. def GetMapCount(self):
  79. return self._mapCount
  80. mapCount = property(fget=GetMapCount)
  81. def GetCmdMatrix(self):
  82. return self._cmdMatrix
  83. def SetCmdMatrix(self, cmdMatrix):
  84. self._cmdMatrix = cmdMatrix
  85. cmdMatrix = property(fget=GetCmdMatrix, fset=SetCmdMatrix)
  86. def GetWorkspaceFile(self):
  87. return self._workspaceFile
  88. def SetWorkspaceFile(self, fileName):
  89. if fileName is None:
  90. self._workspaceFile = None
  91. return
  92. if fileName == '':
  93. raise ValueError(_("No workspace file selected."))
  94. if not os.path.exists(fileName):
  95. raise IOError(_("File %s not found") % fileName)
  96. self._workspaceFile = fileName
  97. self.nvizTask.Load(self.workspaceFile)
  98. workspaceFile = property(fget=GetWorkspaceFile, fset=SetWorkspaceFile)
  99. def SetDefaultValues(self, windowIndex, animationIndex):
  100. self.windowIndex = windowIndex
  101. self.name = _("Animation %d") % (animationIndex + 1)
  102. self.layerList = LayerList()
  103. def GetNvizParameters(self):
  104. return self._nvizParameters
  105. nvizParameters = property(fget=GetNvizParameters)
  106. def GetNvizParameter(self):
  107. return self._nvizParameter
  108. def SetNvizParameter(self, param):
  109. self._nvizParameter = param
  110. nvizParameter = property(fget=GetNvizParameter, fset=SetNvizParameter)
  111. def GetViewMode(self):
  112. return self._viewMode
  113. def SetViewMode(self, mode):
  114. self._viewMode = mode
  115. viewMode = property(fget=GetViewMode, fset=SetViewMode)
  116. def GetViewModes(self):
  117. return self._viewModes
  118. viewModes = property(fget=GetViewModes)
  119. def SetLegendCmd(self, cmd):
  120. self._legendCmd = cmd
  121. def GetLegendCmd(self):
  122. return self._legendCmd
  123. legendCmd = property(fget=GetLegendCmd, fset=SetLegendCmd)
  124. def GetNvizCommands(self):
  125. if not self.workspaceFile or not self._layerList:
  126. return []
  127. cmds = self.nvizTask.GetCommandSeries(layerList=self._layerList,
  128. paramName=self.nvizParameter)
  129. region = self.nvizTask.GetRegion()
  130. return {'commands': cmds, 'region': region}
  131. def __repr__(self):
  132. return "%s(%r)" % (self.__class__, self.__dict__)
  133. class AnimLayer(Layer):
  134. """!Animation layer allows to add either space-time dataset
  135. or series of maps."""
  136. def __init__(self):
  137. Layer.__init__(self)
  138. self._mapTypes.extend(['strds', 'stvds'])
  139. self._maps = []
  140. tgis.init()
  141. def SetName(self, name):
  142. if not self.hidden:
  143. if self._mapType is None:
  144. raise ValueError("To set layer name, the type of layer must be specified.")
  145. if self._mapType in ('strds', 'stvds'):
  146. try:
  147. name = validateTimeseriesName(name, self._mapType)
  148. self._maps = getRegisteredMaps(name, self._mapType)
  149. except (GException, gcore.ScriptError), e:
  150. raise ValueError(str(e))
  151. else:
  152. self._maps = validateMapNames(name.split(','), self._internalTypes[self._mapType])
  153. self._name = name
  154. self.label = name
  155. def GetName(self):
  156. return self._name
  157. name = property(fget=GetName, fset=SetName)
  158. def GetMaps(self):
  159. return self._maps
  160. maps = property(fget=GetMaps)