giface.py 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. """
  2. @package lmgr.giface
  3. @brief Layer Manager GRASS interface
  4. Classes:
  5. - giface::LayerManagerGrassInterface
  6. (C) 2012 by the GRASS Development Team
  7. This program is free software under the GNU General Public License
  8. (>=v2). Read the file COPYING that comes with GRASS for details.
  9. @author Anna Kratochvilova <kratochanna gmail.com>
  10. @author Vaclav Petras <wenzeslaus gmail.com>
  11. """
  12. from __future__ import print_function
  13. from grass.pydispatch.signal import Signal
  14. from core.giface import Notification
  15. from core.utils import GetLayerNameFromCmd
  16. class Layer(object):
  17. """@implements core::giface::Layer
  18. .. note::
  19. Currently implemented without specifying the interface.
  20. It only provides all attributes of existing layer as used in lmgr.
  21. """
  22. def __init__(self, layer, pydata):
  23. self._layer = layer
  24. self._pydata = pydata
  25. def __getattr__(self, name):
  26. return self._pydata[0][name]
  27. def __dir__(self):
  28. return self._pydata[0].keys()
  29. def __str__(self):
  30. return (
  31. ""
  32. if (self.maplayer is None or self.maplayer.name is None)
  33. else self.maplayer.name
  34. )
  35. class LayerList(object):
  36. """@implements core.giface.Layer"""
  37. def __init__(self, tree):
  38. self._tree = tree
  39. def __len__(self):
  40. return len([layer for layer in self])
  41. def __iter__(self):
  42. """Iterates over the contents of the list."""
  43. item = self._tree.GetFirstChild(self._tree.root)[0]
  44. while item and item.IsOk():
  45. yield Layer(item, self._tree.GetPyData(item))
  46. item = self._tree.GetNextItem(item)
  47. def __getitem__(self, index):
  48. """Select a layer from the LayerList using the index."""
  49. return [l for l in self][index]
  50. def __repr__(self):
  51. """Return a representation of the object."""
  52. return "LayerList(%r)" % [layer for layer in self]
  53. def GetSelectedLayers(self, checkedOnly=True):
  54. items = self._tree.GetSelectedLayer(multi=True, checkedOnly=checkedOnly)
  55. layers = []
  56. for item in items:
  57. layer = Layer(item, self._tree.GetPyData(item))
  58. layers.append(layer)
  59. return layers
  60. # TODO: it is not clear if default of checkedOnly should be False or True
  61. def GetSelectedLayer(self, checkedOnly=False):
  62. """Returns selected layer or None when there is no selected layer."""
  63. item = self._tree.GetSelectedLayer(multi=False, checkedOnly=checkedOnly)
  64. if item is None:
  65. return None
  66. else:
  67. data = self._tree.GetPyData(item)
  68. return Layer(item, data)
  69. def GetLayerInfo(self, layer):
  70. """For compatibility only, will be removed."""
  71. return Layer(layer, self._tree.GetPyData(layer))
  72. def AddLayer(self, ltype, name=None, checked=None, opacity=1.0, cmd=None):
  73. """Adds a new layer to the layer list.
  74. Launches property dialog if needed (raster, vector, etc.)
  75. :param ltype: layer type (raster, vector, raster_3d, ...)
  76. :param name: layer name
  77. :param checked: if True layer is checked
  78. :param opacity: layer opacity level
  79. :param cmd: command (given as a list)
  80. """
  81. l = self._tree.AddLayer(
  82. ltype=ltype, lname=name, lchecked=checked, lopacity=opacity, lcmd=cmd
  83. )
  84. return Layer(l, self._tree.GetPyData(l))
  85. def DeleteLayer(self, layer):
  86. """Remove layer from layer list"""
  87. self._tree.Delete(layer._layer)
  88. def CheckLayer(self, layer, checked=True):
  89. """Check or uncheck layer"""
  90. self._tree.forceCheck = True
  91. self._tree.CheckItem(layer._layer, checked=checked)
  92. def SelectLayer(self, layer, select=True):
  93. "Select or unselect layer"
  94. self._tree.SelectItem(layer._layer, select)
  95. def ChangeLayer(self, layer, **kwargs):
  96. "Change layer (cmd, ltype, opacity)"
  97. if "cmd" in kwargs:
  98. layer._pydata[0]["cmd"] = kwargs["cmd"]
  99. layerName, found = GetLayerNameFromCmd(kwargs["cmd"], fullyQualified=True)
  100. if found:
  101. layer._pydata[0]["label"] = layerName
  102. if "ltype" in kwargs:
  103. layer._pydata[0]["type"] = kwargs["ltype"]
  104. if "opacity" in kwargs:
  105. layer._pydata[0]["maplayer"].SetOpacity(kwargs["opacity"])
  106. self._tree.ChangeLayer(layer._layer)
  107. self._tree.SetItemIcon(layer._layer)
  108. self._tree.SetItemText(layer._layer, self._tree._getLayerName(layer._layer))
  109. def IsLayerChecked(self, layer):
  110. """Returns True if layer is checked, False otherwise"""
  111. return self._tree.IsItemChecked(layer._layer)
  112. def GetLayersByName(self, name):
  113. items = self._tree.FindItemByData(key="name", value=name)
  114. if items is None:
  115. return []
  116. else:
  117. layers = []
  118. for item in items:
  119. layer = Layer(item, self._tree.GetPyData(item))
  120. layers.append(layer)
  121. return layers
  122. def GetLayerByData(self, key, value):
  123. """Returns layer with specified.
  124. Returns only one layer.
  125. Avoid using this method, it might be removed in the future.
  126. """
  127. if key == "name":
  128. print(
  129. "giface.GetLayerByData(): Do not with use key='name',"
  130. " use GetLayersByName instead."
  131. )
  132. item = self._tree.FindItemByData(key=key, value=value)
  133. if item is None:
  134. return None
  135. else:
  136. return Layer(item, self._tree.GetPyData(item))
  137. class LayerManagerGrassInterface(object):
  138. """@implements core::giface::GrassInterface"""
  139. def __init__(self, lmgr):
  140. """Costructor is specific to the current implementation.
  141. Uses Layer Manager object including its private attributes.
  142. (It encapsulates existing Layer Manager so access to private members
  143. is intention.)
  144. """
  145. self.lmgr = lmgr
  146. # Signal when some map is created or updated by a module.
  147. # Used for adding/refreshing displayed layers.
  148. # attributes: name: map name, ltype: map type,
  149. # add: if map should be added to layer tree (questionable attribute)
  150. self.mapCreated = Signal("LayerManagerGrassInterface.mapCreated")
  151. # Signal for communicating current mapset has been switched
  152. self.currentMapsetChanged = Signal(
  153. "LayerManagerGrassInterface.currentMapsetChanged"
  154. )
  155. # Signal for communicating something in current grassdb has changed.
  156. # Parameters:
  157. # action: required, is one of 'new', 'rename', 'delete'
  158. # element: required, can be one of 'grassdb', 'location', 'mapset', 'raster', 'vector' and 'raster_3d'
  159. # grassdb: path to grass db, required
  160. # location: location name, required
  161. # mapset: mapset name, required when element is 'mapset', 'raster', 'vector' or 'raster_3d'
  162. # map: map name, required when element is 'raster', 'vector' or 'raster_3d'
  163. # newname: new name (of mapset, map), required with action='rename'
  164. self.grassdbChanged = Signal("LayerManagerGrassInterface.grassdbChanged")
  165. # Signal emitted to request updating of map
  166. self.updateMap = Signal("LayerManagerGrassInterface.updateMap")
  167. # Signal emitted when workspace is changed
  168. self.workspaceChanged = Signal("LayerManagerGrassInterface.workspaceChanged")
  169. def RunCmd(self, *args, **kwargs):
  170. self.lmgr._gconsole.RunCmd(*args, **kwargs)
  171. def Help(self, entry, online=False):
  172. cmdlist = ["g.manual", "entry=%s" % entry]
  173. if online:
  174. cmdlist.append("-o")
  175. self.RunCmd(cmdlist, compReg=False, notification=Notification.NO_NOTIFICATION)
  176. def WriteLog(self, text, wrap=None, notification=Notification.HIGHLIGHT):
  177. self.lmgr._gconsole.WriteLog(text=text, wrap=wrap, notification=notification)
  178. def WriteCmdLog(self, text, pid=None, notification=Notification.MAKE_VISIBLE):
  179. self.lmgr._gconsole.WriteCmdLog(text=text, pid=pid, notification=notification)
  180. def WriteWarning(self, text):
  181. self.lmgr._gconsole.WriteWarning(text=text)
  182. def WriteError(self, text):
  183. self.lmgr._gconsole.WriteError(text=text)
  184. def GetLog(self, err=False):
  185. return self.lmgr._gconsole.GetLog(err=err)
  186. def GetLayerTree(self):
  187. return self.lmgr.GetLayerTree()
  188. def GetLayerList(self):
  189. return LayerList(self.lmgr.GetLayerTree())
  190. def GetMapDisplay(self):
  191. return self.lmgr.GetMapDisplay(onlyCurrent=True)
  192. def GetAllMapDisplays(self):
  193. return self.lmgr.GetMapDisplay(onlyCurrent=False)
  194. def GetMapWindow(self):
  195. if self.lmgr.GetMapDisplay(onlyCurrent=True):
  196. return self.lmgr.GetMapDisplay(onlyCurrent=True).GetMapWindow()
  197. else:
  198. return None
  199. def GetProgress(self):
  200. return self.lmgr.goutput.GetProgressBar()
  201. def UpdateCmdHistory(self, cmd):
  202. self.lmgr.goutput.GetPrompt().UpdateCmdHistory(cmd)
  203. class LayerManagerGrassInterfaceForMapDisplay(object):
  204. """Provides reference only to the given layer list (according to tree),
  205. not to the current.
  206. @implements core::giface::GrassInterface
  207. """
  208. def __init__(self, giface, tree):
  209. """
  210. :param giface: original grass interface
  211. :param tree: tree which will be used instead of the tree from giface
  212. """
  213. self._giface = giface
  214. self.tree = tree
  215. # Signal emitted to request updating of map
  216. self.updateMap = Signal("LayerManagerGrassInterfaceForMapDisplay.updateMap")
  217. def GetLayerTree(self):
  218. return self.tree
  219. def GetLayerList(self):
  220. return LayerList(self.tree)
  221. def GetMapWindow(self):
  222. return self.tree.GetMapDisplay().GetMapWindow()
  223. def __getattr__(self, name):
  224. return getattr(self._giface, name)