g.gui.vdigit.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #!/usr/bin/env python3
  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 grass.script.setup import set_gui_path
  44. set_gui_path()
  45. from core.render import Map
  46. from mapdisp.frame import MapFrame
  47. from mapdisp.main import DMonGrassInterface
  48. from core.settings import UserSettings
  49. from vdigit.main import haveVDigit, errorMsg
  50. from grass.exceptions import CalledModuleError
  51. # define classes which needs imports as local
  52. # for longer definitions, a separate file would be a better option
  53. class VDigitMapFrame(MapFrame):
  54. def __init__(self, vectorMap):
  55. MapFrame.__init__(
  56. self,
  57. parent=None,
  58. Map=Map(),
  59. giface=DMonGrassInterface(None),
  60. title=_("Vector Digitizer - GRASS GIS"),
  61. size=(850, 600),
  62. )
  63. # this giface issue not solved yet, we must set mapframe aferwards
  64. self._giface._mapframe = self
  65. # load vector map
  66. mapLayer = self.GetMap().AddLayer(
  67. ltype="vector",
  68. name=vectorMap,
  69. command=["d.vect", "map=%s" % vectorMap],
  70. active=True,
  71. hidden=False,
  72. opacity=1.0,
  73. render=True,
  74. )
  75. # switch toolbar
  76. self.AddToolbar("vdigit", fixed=True)
  77. # start editing
  78. self.toolbars["vdigit"].StartEditing(mapLayer)
  79. if not haveVDigit:
  80. grass.fatal(_("Vector digitizer not available. %s") % errorMsg)
  81. if not grass.find_file(
  82. name=options["map"], element="vector", mapset=grass.gisenv()["MAPSET"]
  83. )["fullname"]:
  84. if not flags["c"]:
  85. grass.fatal(
  86. _(
  87. "Vector map <%s> not found in current mapset. "
  88. "New vector map can be created by providing '-c' flag."
  89. )
  90. % options["map"]
  91. )
  92. else:
  93. grass.verbose(_("New vector map <%s> created") % options["map"])
  94. try:
  95. grass.run_command(
  96. "v.edit", map=options["map"], tool="create", quiet=True
  97. )
  98. except CalledModuleError:
  99. grass.fatal(_("Unable to create new vector map <%s>") % options["map"])
  100. # allow immediate rendering
  101. driver = UserSettings.Get(group="display", key="driver", subkey="type")
  102. if driver == "png":
  103. os.environ["GRASS_RENDER_IMMEDIATE"] = "png"
  104. else:
  105. os.environ["GRASS_RENDER_IMMEDIATE"] = "cairo"
  106. app = wx.App()
  107. frame = VDigitMapFrame(options["map"])
  108. frame.Show()
  109. app.MainLoop()
  110. if __name__ == "__main__":
  111. main()