3232
3333from qgis .core import (
3434 QgsCategorizedSymbolRenderer ,
35+ QgsProject ,
3536 QgsRasterMarkerSymbolLayer ,
3637 QgsRuleBasedRenderer ,
3738 QgsSingleSymbolRenderer ,
@@ -229,7 +230,7 @@ def is_valid_filepath(path: str) -> bool:
229230 return True
230231
231232
232- def update_symbols_to_embedded (symbol : QgsSymbol ) -> None :
233+ def update_symbols_to_embedded (symbol : QgsSymbol , new_path : Path ) -> None :
233234 """
234235 Update SVG or Raster symbols layer to embed it in the QGIS project.
235236 Args:
@@ -247,6 +248,10 @@ def update_symbols_to_embedded(symbol: QgsSymbol) -> None:
247248
248249 source_path = Path (symbol_layer .path ())
249250
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+
250255 # Check if symbol is already embedded
251256 if str (source_path )[:8 ].startswith ("base64:" ):
252257 continue
@@ -261,7 +266,9 @@ def update_symbols_to_embedded(symbol: QgsSymbol) -> None:
261266 symbol_layer .setPath (f"base64:{ encoded_data } " )
262267
263268
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 :
265272 """
266273 Update the paths of symbols to embedded symbols in the QGIS project.
267274
@@ -280,10 +287,15 @@ def embed_layer_symbols_on_project(layer: QgsVectorLayer) -> None:
280287 if not renderer :
281288 return
282289
290+ if new_path is None :
291+ project = QgsProject .instance ()
292+ project_home = project .homePath ()
293+ new_path = Path (project_home )
294+
283295 if isinstance (renderer , QgsSingleSymbolRenderer ):
284296 symbol = renderer .symbol ()
285297 if symbol :
286- update_symbols_to_embedded (symbol = symbol )
298+ update_symbols_to_embedded (symbol = symbol , new_path = new_path )
287299
288300 elif isinstance (renderer , QgsRuleBasedRenderer ):
289301 for rule in renderer .rootRule ().children ():
@@ -293,7 +305,7 @@ def embed_layer_symbols_on_project(layer: QgsVectorLayer) -> None:
293305 continue
294306
295307 for symbol in symbols :
296- update_symbols_to_embedded (symbol = symbol )
308+ update_symbols_to_embedded (symbol = symbol , new_path = new_path )
297309
298310 elif isinstance (renderer , QgsCategorizedSymbolRenderer ):
299311 categories = renderer .categories ()
@@ -302,7 +314,7 @@ def embed_layer_symbols_on_project(layer: QgsVectorLayer) -> None:
302314 # Get a fresh category. The renderer doesn't update in-place modifications.
303315 category = renderer .categories ()[index ]
304316 symbol = category .symbol ().clone ()
305- update_symbols_to_embedded (symbol = symbol )
317+ update_symbols_to_embedded (symbol = symbol , new_path = new_path )
306318 renderer .updateCategorySymbol (index , symbol )
307319
308320 layer .setRenderer (renderer )
0 commit comments