-
Notifications
You must be signed in to change notification settings - Fork 5
/
ausmap.py
157 lines (128 loc) · 5.52 KB
/
ausmap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import os.path
import webbrowser
from PyQt5.QtCore import QFileInfo
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QMenu
from qgis.core import QgsProject, QgsSettings, QgsVectorLayer
from .config import Config
from .constants import ABOUT_FILE_URL, PLUGIN_NAME, QLR_URL
from .layer_locator_filter import LayerLocatorFilter
from .settings import AusMapOptionsFactory
class AusMap:
"""QGIS Plugin Implementation"""
def __init__(self, iface):
"""Constructor
:param iface: An interface instance that will be passed to this class
which provides the hook by which you can manipulate the
QGIS application at run time.
:type iface: QgsInterface
"""
self.iface = iface # Reference to the QGIS interface
self.settings = QgsSettings()
path = QFileInfo(os.path.realpath(__file__)).path()
cache_path = path + "/data/"
if not os.path.exists(cache_path):
os.makedirs(cache_path)
self.settings.setValue("cache_path", cache_path)
self.settings.setValue("ausmap_qlr", QLR_URL)
def initGui(self):
self.options_factory = AusMapOptionsFactory(self)
self.options_factory.setTitle(PLUGIN_NAME)
self.iface.registerOptionsWidgetFactory(self.options_factory)
self.create_menu()
def create_menu(self):
self.config = Config(self.settings)
self.config.load()
self.groups_and_layers = self.config.get_groups_and_layers()
self.menu = QMenu(self.iface.mainWindow().menuBar())
self.menu.setObjectName(PLUGIN_NAME)
self.menu.setTitle(PLUGIN_NAME)
helper = lambda _id: lambda: self.open_ausmap_node(_id)
local_helper = lambda _id: lambda: self.open_local_node(_id)
self.menu_with_actions = []
layer_action_map = {} # Used for the locator filter
for category in self.groups_and_layers:
for group in category:
group_menu = QMenu()
group_menu.setTitle(group["name"])
for layer in group["selectables"]:
action = QAction(layer["name"], self.iface.mainWindow())
if layer["source"] == "ausmap":
action.triggered.connect(helper(layer["id"]))
else:
action.triggered.connect(local_helper(layer["id"]))
group_menu.addAction(action)
layer_action_map[layer["name"]] = action
self.menu.addMenu(group_menu)
self.menu_with_actions.append(group_menu)
self.menu.addSeparator()
# Add locator filter
self.layer_locator_filter = LayerLocatorFilter(
self.iface, layer_action_map
)
self.iface.registerLocatorFilter(self.layer_locator_filter)
# Add About the plugin menu item
icon_about_path = os.path.join(
os.path.dirname(__file__), "img/icon_about.png"
)
self.about_menu = QAction(
QIcon(icon_about_path),
"About the plugin",
self.iface.mainWindow(),
)
self.about_menu.triggered.connect(self.about_plugin)
self.menu.addAction(self.about_menu)
menu_bar = self.iface.mainWindow().menuBar()
menu_bar.insertMenu(
self.iface.firstRightStandardMenu().menuAction(), self.menu
)
def open_local_node(self, id):
node = self.config.get_local_maplayer_node(id)
self.open_node(node, id)
def open_ausmap_node(self, id):
node = self.config.get_ausmap_maplayer_node(id)
self.open_node(node, id)
def open_node(self, node, id):
QgsProject.instance().readLayer(node)
layer = QgsProject.instance().mapLayer(id)
if layer:
layer = [
layer for layer in QgsProject.instance().mapLayers().values()
]
return layer
else:
return None
def custom_layer_dialog(self):
custom_file = self.settings.value("custom_qlr_file")
file_name, file_extension = os.path.splitext(custom_file)
if ".qlr" not in file_extension:
file_name_split = file_name.split("/")
final_file_name = file_name_split[len(file_name_split) - 1]
vector_layer_extensions = [".kml", ".mid", ".mif", ".shp"]
raster_layer_extensions = [".asc", ".jpg", ".png", ".tif"]
if file_extension in vector_layer_extensions:
vlayer = QgsVectorLayer(custom_file, final_file_name, "ogr")
QgsProject.instance().addMapLayer(vlayer)
elif file_extension in raster_layer_extensions:
self.iface.addRasterLayer(custom_file, final_file_name)
def about_plugin(self):
webbrowser.open(ABOUT_FILE_URL)
def unload(self):
self.iface.unregisterOptionsWidgetFactory(self.options_factory)
self.iface.deregisterLocatorFilter(self.layer_locator_filter)
self.options_factory = None
self.layer_locator_filter = None
self.clear_menu()
def reload_menu(self):
self.clear_menu()
self.iface.deregisterLocatorFilter(self.layer_locator_filter)
self.layer_locator_filter = None
self.create_menu()
def clear_menu(self):
# Remove the sub-menus and the menu bar item
for submenu in self.menu_with_actions:
if submenu:
submenu.deleteLater()
if self.menu:
self.menu.deleteLater()
self.menu = None