g.gui.vdigit.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #!/usr/bin/env python
  2. ############################################################################
  3. #
  4. # MODULE: g.gui.vdigit
  5. # AUTHOR(S): Martin Landa <landa.martin gmail.com>
  6. # PURPOSE: wxGUI Vector Digitizer
  7. # COPYRIGHT: (C) 2007-2013 by Martin Landa, and the GRASS Development Team
  8. #
  9. # This program is free software; you can 1redistribute it and/or
  10. # modify it under the terms of the GNU General Public License as
  11. # published by the Free Software Foundation; either version 2 of the
  12. # License, or (at your option) any later version.
  13. #
  14. # This program is distributed in the hope that it will be useful, but
  15. # WITHOUT ANY WARRANTY; without even the implied warranty of
  16. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. # General Public License for more details.
  18. #
  19. ############################################################################
  20. #%module
  21. #% description: Interactive editing and digitization of vector maps.
  22. #% keyword: general
  23. #% keyword: GUI
  24. #% keyword: vector
  25. #% keyword: editing
  26. #% keyword: digitizer
  27. #%end
  28. #%flag
  29. #% key: c
  30. #% description: Create new vector map if doesn't exist
  31. #%end
  32. #%option G_OPT_V_MAP
  33. #% label: Name of vector map to edit
  34. #%end
  35. import os
  36. import grass.script as grass
  37. def main():
  38. grass.set_raise_on_error(False)
  39. options, flags = grass.parser()
  40. # import wx only after running parser
  41. # to avoid issues with complex imports when only interface is needed
  42. import wx
  43. from core.globalvar import CheckWxVersion
  44. from core.utils import _
  45. from mapdisp.frame import MapFrame
  46. from mapdisp.main import DMonGrassInterface
  47. from core.settings import UserSettings
  48. from vdigit.main import haveVDigit, errorMsg
  49. from grass.exceptions import CalledModuleError
  50. # define classes which needs imports as local
  51. # for longer definitions, a separate file would be a better option
  52. class VDigitMapFrame(MapFrame):
  53. def __init__(self, vectorMap):
  54. MapFrame.__init__(
  55. self, parent=None, giface=DMonGrassInterface(None),
  56. title=_("GRASS GIS Vector Digitizer"), size=(850, 600))
  57. # this giface issue not solved yet, we must set mapframe aferwards
  58. self._giface._mapframe = self
  59. # load vector map
  60. mapLayer = self.GetMap().AddLayer(
  61. ltype='vector', name=vectorMap,
  62. command=['d.vect', 'map=%s' % vectorMap],
  63. active=True, hidden=False, opacity=1.0, render=True)
  64. # switch toolbar
  65. self.AddToolbar('vdigit', fixed=True)
  66. # start editing
  67. self.toolbars['vdigit'].StartEditing(mapLayer)
  68. if not haveVDigit:
  69. grass.fatal(_("Vector digitizer not available. %s") % errorMsg)
  70. if not grass.find_file(name=options['map'], element='vector',
  71. mapset=grass.gisenv()['MAPSET'])['fullname']:
  72. if not flags['c']:
  73. grass.fatal(_("Vector map <%s> not found in current mapset. "
  74. "New vector map can be created by providing '-c' flag.") % options['map'])
  75. else:
  76. grass.message(_("New vector map <%s> created") % options['map'])
  77. try:
  78. grass.run_command('v.edit', map=options['map'], tool='create')
  79. except CalledModuleError:
  80. grass.fatal(_("Unable to create new vector map <%s>") % options['map'])
  81. # allow immediate rendering
  82. driver = UserSettings.Get(group='display', key='driver', subkey='type')
  83. if driver == 'png':
  84. os.environ['GRASS_RENDER_IMMEDIATE'] = 'png'
  85. else:
  86. os.environ['GRASS_RENDER_IMMEDIATE'] = 'cairo'
  87. app = wx.App()
  88. if not CheckWxVersion([2, 9]):
  89. wx.InitAllImageHandlers()
  90. frame = VDigitMapFrame(options['map'])
  91. frame.Show()
  92. app.MainLoop()
  93. if __name__ == "__main__":
  94. main()