32
32
33
33
from qgis .core import (
34
34
QgsCategorizedSymbolRenderer ,
35
+ QgsProject ,
35
36
QgsRasterMarkerSymbolLayer ,
36
37
QgsRuleBasedRenderer ,
37
38
QgsSingleSymbolRenderer ,
@@ -229,7 +230,7 @@ def is_valid_filepath(path: str) -> bool:
229
230
return True
230
231
231
232
232
- def update_symbols_to_embedded (symbol : QgsSymbol ) -> None :
233
+ def update_symbols_to_embedded (symbol : QgsSymbol , new_path : Path ) -> None :
233
234
"""
234
235
Update SVG or Raster symbols layer to embed it in the QGIS project.
235
236
Args:
@@ -247,6 +248,10 @@ def update_symbols_to_embedded(symbol: QgsSymbol) -> None:
247
248
248
249
source_path = Path (symbol_layer .path ())
249
250
251
+ # If the symbol's path is already relative, we have nothing to do
252
+ if source_path .is_relative_to (new_path ):
253
+ continue
254
+
250
255
# Check if symbol is already embedded
251
256
if str (source_path )[:8 ].startswith ("base64:" ):
252
257
continue
@@ -261,7 +266,9 @@ def update_symbols_to_embedded(symbol: QgsSymbol) -> None:
261
266
symbol_layer .setPath (f"base64:{ encoded_data } " )
262
267
263
268
264
- def embed_layer_symbols_on_project (layer : QgsVectorLayer ) -> None :
269
+ def embed_layer_symbols_on_project (
270
+ layer : QgsVectorLayer , new_path : Optional [Path ] = None
271
+ ) -> None :
265
272
"""
266
273
Update the paths of symbols to embedded symbols in the QGIS project.
267
274
@@ -280,10 +287,15 @@ def embed_layer_symbols_on_project(layer: QgsVectorLayer) -> None:
280
287
if not renderer :
281
288
return
282
289
290
+ if new_path is None :
291
+ project = QgsProject .instance ()
292
+ project_home = project .homePath ()
293
+ new_path = Path (project_home )
294
+
283
295
if isinstance (renderer , QgsSingleSymbolRenderer ):
284
296
symbol = renderer .symbol ()
285
297
if symbol :
286
- update_symbols_to_embedded (symbol = symbol )
298
+ update_symbols_to_embedded (symbol = symbol , new_path = new_path )
287
299
288
300
elif isinstance (renderer , QgsRuleBasedRenderer ):
289
301
for rule in renderer .rootRule ().children ():
@@ -293,7 +305,7 @@ def embed_layer_symbols_on_project(layer: QgsVectorLayer) -> None:
293
305
continue
294
306
295
307
for symbol in symbols :
296
- update_symbols_to_embedded (symbol = symbol )
308
+ update_symbols_to_embedded (symbol = symbol , new_path = new_path )
297
309
298
310
elif isinstance (renderer , QgsCategorizedSymbolRenderer ):
299
311
categories = renderer .categories ()
@@ -302,7 +314,7 @@ def embed_layer_symbols_on_project(layer: QgsVectorLayer) -> None:
302
314
# Get a fresh category. The renderer doesn't update in-place modifications.
303
315
category = renderer .categories ()[index ]
304
316
symbol = category .symbol ().clone ()
305
- update_symbols_to_embedded (symbol = symbol )
317
+ update_symbols_to_embedded (symbol = symbol , new_path = new_path )
306
318
renderer .updateCategorySymbol (index , symbol )
307
319
308
320
layer .setRenderer (renderer )
0 commit comments