123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- """
- @package mapdisp.toolbars
- @brief Map display frame - toolbars
- Classes:
- - toolbars::MapToolbar
- (C) 2007-2015 by the GRASS Development Team
- This program is free software under the GNU General Public License
- (>=v2). Read the file COPYING that comes with GRASS for details.
- @author Michael Barton
- @author Jachym Cepicky
- @author Martin Landa <landa.martin gmail.com>
- """
- import wx
- from gui_core.toolbars import BaseToolbar, BaseIcons
- from nviz.main import haveNviz
- from vdigit.main import haveVDigit
- from icons.icon import MetaIcon
- MapIcons = {
- "query": MetaIcon(
- img="info",
- label=_("Query raster/vector map(s)"),
- desc=_("Query selected raster/vector map(s)"),
- ),
- "select": MetaIcon(
- img="select",
- label=_("Select vector feature(s)"),
- desc=_("Select features interactively from vector map"),
- ),
- "addBarscale": MetaIcon(img="scalebar-add", label=_("Add scale bar")),
- "addRasterLegend": MetaIcon(img="legend-add", label=_("Add raster legend")),
- "addVectorLegend": MetaIcon(img="legend-add", label=_("Add vector legend")),
- "addNorthArrow": MetaIcon(img="north-arrow-add", label=_("Add north arrow")),
- "analyze": MetaIcon(
- img="layer-raster-analyze",
- label=_("Analyze map"),
- desc=_("Measuring, profiling, histogramming, ..."),
- ),
- "measureDistance": MetaIcon(img="measure-length", label=_("Measure distance")),
- "measureArea": MetaIcon(img="area-measure", label=_("Measure area")),
- "profile": MetaIcon(img="layer-raster-profile", label=_("Profile surface map")),
- "scatter": MetaIcon(
- img="layer-raster-profile",
- label=_("Create bivariate scatterplot of raster maps"),
- ),
- "addText": MetaIcon(img="text-add", label=_("Add text")),
- "histogram": MetaIcon(
- img="layer-raster-histogram", label=_("Create histogram of raster map")
- ),
- "vnet": MetaIcon(img="vector-tools", label=_("Vector network analysis tool")),
- }
- NvizIcons = {
- "rotate": MetaIcon(
- img="3d-rotate",
- label=_("Rotate 3D scene"),
- desc=_("Drag with mouse to rotate 3D scene"),
- ),
- "flyThrough": MetaIcon(
- img="flythrough",
- label=_("Fly-through mode"),
- desc=_(
- "Drag with mouse, hold Ctrl down for different mode"
- " or Shift to accelerate"
- ),
- ),
- "zoomIn": BaseIcons["zoomIn"].SetLabel(desc=_("Click mouse to zoom")),
- "zoomOut": BaseIcons["zoomOut"].SetLabel(desc=_("Click mouse to unzoom")),
- }
- class MapToolbar(BaseToolbar):
- """Map Display toolbar"""
- def __init__(self, parent, toolSwitcher, giface):
- """Map Display constructor
- :param parent: reference to MapFrame
- """
- BaseToolbar.__init__(self, parent=parent, toolSwitcher=toolSwitcher) # MapFrame
- self.InitToolbar(self._toolbarData())
- self._default = self.pointer
- self._giface = giface
- # optional tools
- toolNum = 0
- choices = [
- _("2D view"),
- ]
- self.toolId = {"2d": toolNum}
- toolNum += 1
- if haveNviz:
- choices.append(_("3D view"))
- self.toolId["3d"] = toolNum
- toolNum += 1
- else:
- from nviz.main import errorMsg
- self._giface.WriteCmdLog(_("3D view mode not available"))
- self._giface.WriteWarning(_("Reason: %s") % str(errorMsg))
- self.toolId["3d"] = -1
- if haveVDigit:
- choices.append(_("Vector digitizer"))
- self.toolId["vdigit"] = toolNum
- toolNum += 1
- else:
- from vdigit.main import errorMsg
- self._giface.WriteCmdLog(_("Vector digitizer not available"))
- self._giface.WriteWarning(_("Reason: %s") % errorMsg)
- self._giface.WriteLog(
- _(
- "Note that the wxGUI's vector digitizer is disabled in this installation. "
- "Please keep an eye out for updated versions of GRASS. "
- 'In the meantime you can use "v.edit" for non-interactive editing '
- "from the Develop vector map menu."
- ),
- wrap=60,
- )
- self.toolId["vdigit"] = -1
- choices.append(_("Raster digitizer"))
- self.toolId["rdigit"] = toolNum
- self.combo = wx.ComboBox(
- parent=self,
- id=wx.ID_ANY,
- choices=choices,
- style=wx.CB_READONLY,
- size=(110, -1),
- )
- self.combo.SetSelection(0)
- self.comboid = self.AddControl(self.combo)
- self.parent.Bind(wx.EVT_COMBOBOX, self.OnSelectTool, self.comboid)
- # realize the toolbar
- self.Realize()
- # workaround for Mac bug. May be fixed by 2.8.8, but not before then.
- self.combo.Hide()
- self.combo.Show()
- for tool in (
- self.pointer,
- self.select,
- self.query,
- self.pan,
- self.zoomIn,
- self.zoomOut,
- ):
- self.toolSwitcher.AddToolToGroup(group="mouseUse", toolbar=self, tool=tool)
- self.EnableTool(self.zoomBack, False)
- self.FixSize(width=90)
- def _toolbarData(self):
- """Toolbar data"""
- return self._getToolbarData(
- (
- (
- ("renderMap", BaseIcons["render"].label),
- BaseIcons["render"],
- self.parent.OnRender,
- ),
- (
- ("pointer", BaseIcons["pointer"].label),
- BaseIcons["pointer"],
- self.parent.OnPointer,
- wx.ITEM_CHECK,
- ),
- (
- ("select", MapIcons["select"].label),
- MapIcons["select"],
- self.parent.OnSelect,
- wx.ITEM_CHECK,
- ),
- (
- ("query", MapIcons["query"].label),
- MapIcons["query"],
- self.parent.OnQuery,
- wx.ITEM_CHECK,
- ),
- (
- ("pan", BaseIcons["pan"].label),
- BaseIcons["pan"],
- self.parent.OnPan,
- wx.ITEM_CHECK,
- ),
- (
- ("zoomIn", BaseIcons["zoomIn"].label),
- BaseIcons["zoomIn"],
- self.parent.OnZoomIn,
- wx.ITEM_CHECK,
- ),
- (
- ("zoomOut", BaseIcons["zoomOut"].label),
- BaseIcons["zoomOut"],
- self.parent.OnZoomOut,
- wx.ITEM_CHECK,
- ),
- (
- ("zoomExtent", BaseIcons["zoomExtent"].label),
- BaseIcons["zoomExtent"],
- self.parent.OnZoomToMap,
- ),
- (
- ("zoomRegion", BaseIcons["zoomRegion"].label),
- BaseIcons["zoomRegion"],
- self.parent.OnZoomToWind,
- ),
- (
- ("zoomBack", BaseIcons["zoomBack"].label),
- BaseIcons["zoomBack"],
- self.parent.OnZoomBack,
- ),
- (
- ("zoomMenu", BaseIcons["zoomMenu"].label),
- BaseIcons["zoomMenu"],
- self.parent.OnZoomMenu,
- ),
- (
- ("analyze", MapIcons["analyze"].label),
- MapIcons["analyze"],
- self.OnAnalyze,
- ),
- (
- ("overlay", BaseIcons["overlay"].label),
- BaseIcons["overlay"],
- self.OnDecoration,
- ),
- (
- ("saveFile", BaseIcons["saveFile"].label),
- BaseIcons["saveFile"],
- self.parent.SaveToFile,
- ),
- (
- ("mapDispSettings", BaseIcons["mapDispSettings"].label),
- BaseIcons["mapDispSettings"],
- self.parent.OnMapDisplayProperties,
- ),
- )
- )
- def InsertTool(self, data):
- """Insert tool to toolbar
- :param data: toolbar data"""
- data = self._getToolbarData(data)
- for tool in data:
- self.CreateTool(*tool)
- self.Realize()
- self.parent._mgr.GetPane("mapToolbar").BestSize(self.GetBestSize())
- self.parent._mgr.Update()
- def RemoveTool(self, tool):
- """Remove tool from toolbar
- :param tool: tool id"""
- self.DeleteTool(tool)
- self.parent._mgr.GetPane("mapToolbar").BestSize(self.GetBestSize())
- self.parent._mgr.Update()
- def ChangeToolsDesc(self, mode2d):
- """Change description of zoom tools for 2D/3D view"""
- if mode2d:
- icons = BaseIcons
- else:
- icons = NvizIcons
- for i, data in enumerate(self._data):
- for tool in ("zoomIn", "zoomOut"):
- if data[0] == tool:
- tmp = list(data)
- tmp[4] = icons[tool].GetDesc()
- self._data[i] = tuple(tmp)
- def OnSelectTool(self, event):
- """Select / enable tool available in tools list"""
- tool = event.GetSelection()
- if tool == self.toolId["2d"]:
- self.ExitToolbars()
- self.Enable2D(True)
- elif tool == self.toolId["3d"] and not (
- self.parent.MapWindow3D and self.parent.IsPaneShown("3d")
- ):
- self.ExitToolbars()
- self.parent.AddNviz()
- elif tool == self.toolId["vdigit"] and not self.parent.GetToolbar("vdigit"):
- self.ExitToolbars()
- self.parent.AddToolbar("vdigit")
- self.parent.MapWindow.SetFocus()
- elif tool == self.toolId["rdigit"]:
- self.ExitToolbars()
- self.parent.AddRDigit()
- def OnAnalyze(self, event):
- """Analysis tools menu"""
- self._onMenu(
- (
- (MapIcons["measureDistance"], self.parent.OnMeasureDistance),
- (MapIcons["measureArea"], self.parent.OnMeasureArea),
- (MapIcons["profile"], self.parent.OnProfile),
- (MapIcons["scatter"], self.parent.OnScatterplot),
- (MapIcons["histogram"], self.parent.OnHistogramPyPlot),
- (BaseIcons["histogram"], self.parent.OnHistogram),
- (MapIcons["vnet"], self.parent.OnVNet),
- )
- )
- def OnDecoration(self, event):
- """Decorations overlay menu"""
- self._onMenu(
- (
- (MapIcons["addRasterLegend"], lambda evt: self.parent.AddLegendRast()),
- (MapIcons["addVectorLegend"], lambda evt: self.parent.AddLegendVect()),
- (MapIcons["addBarscale"], lambda evt: self.parent.AddBarscale()),
- (MapIcons["addNorthArrow"], lambda evt: self.parent.AddArrow()),
- (MapIcons["addText"], lambda evt: self.parent.AddDtext()),
- )
- )
- def ExitToolbars(self):
- if self.parent.GetToolbar("vdigit"):
- self.parent.toolbars["vdigit"].OnExit()
- self.parent.RemoveNviz()
- if self.parent.GetToolbar("rdigit"):
- self.parent.QuitRDigit()
- def Enable2D(self, enabled):
- """Enable/Disable 2D display mode specific tools"""
- for tool in (self.zoomRegion, self.zoomMenu, self.analyze, self.select):
- self.EnableTool(tool, enabled)
- self.ChangeToolsDesc(enabled)
- if enabled:
- self.combo.SetValue(_("2D view"))
|