mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-04 00:04:25 -05:00 
			
		
		
		
	fix duplicate layer
This commit is contained in:
		
							parent
							
								
									a1b2eac2d7
								
							
						
					
					
						commit
						f8c1c16ec7
					
				@ -803,7 +803,7 @@ Returns the units used for the offset of the shapeburst fill.
 | 
			
		||||
    QgsShapeburstFillSymbolLayer( const QgsShapeburstFillSymbolLayer &other );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class QgsImageFillSymbolLayer: QgsFillSymbolLayer
 | 
			
		||||
class QgsImageFillSymbolLayer: QgsFillSymbolLayer /Abstract/
 | 
			
		||||
{
 | 
			
		||||
%Docstring(signature="appended")
 | 
			
		||||
Base class for polygon renderers generating texture images
 | 
			
		||||
@ -2818,8 +2818,6 @@ Sets whether point markers should be ``clipped`` to the current part boundary on
 | 
			
		||||
    QgsCentroidFillSymbolLayer( const QgsCentroidFillSymbolLayer &other );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/************************************************************************
 | 
			
		||||
 * This file has been generated automatically from                      *
 | 
			
		||||
 *                                                                      *
 | 
			
		||||
 | 
			
		||||
@ -1049,6 +1049,27 @@ to new ones.
 | 
			
		||||
%Docstring
 | 
			
		||||
Remove recursively unique id from all ``symbol`` symbol layers and set an empty string instead
 | 
			
		||||
 | 
			
		||||
.. versionadded:: 3.30
 | 
			
		||||
%End
 | 
			
		||||
 | 
			
		||||
    static void clearSymbolLayerIds( QgsSymbolLayer *symbolLayer );
 | 
			
		||||
%Docstring
 | 
			
		||||
Remove recursively unique id from ``symbolLayer`` and its children and set an empty string instead
 | 
			
		||||
 | 
			
		||||
.. versionadded:: 3.30
 | 
			
		||||
%End
 | 
			
		||||
 | 
			
		||||
    static void resetSymbolLayerIds( QgsSymbol *symbol );
 | 
			
		||||
%Docstring
 | 
			
		||||
Regenerate recursively unique id from all ``symbol`` symbol layers
 | 
			
		||||
 | 
			
		||||
.. versionadded:: 3.30
 | 
			
		||||
%End
 | 
			
		||||
 | 
			
		||||
    static void resetSymbolLayerIds( QgsSymbolLayer *symbolLayer );
 | 
			
		||||
%Docstring
 | 
			
		||||
Regenerate recursively unique id from ``symbolLayer`` and its children
 | 
			
		||||
 | 
			
		||||
.. versionadded:: 3.30
 | 
			
		||||
%End
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -776,7 +776,7 @@ class CORE_EXPORT QgsShapeburstFillSymbolLayer : public QgsFillSymbolLayer
 | 
			
		||||
 * \ingroup core
 | 
			
		||||
 * \brief Base class for polygon renderers generating texture images
 | 
			
		||||
*/
 | 
			
		||||
class CORE_EXPORT QgsImageFillSymbolLayer: public QgsFillSymbolLayer
 | 
			
		||||
class CORE_EXPORT QgsImageFillSymbolLayer: public QgsFillSymbolLayer SIP_ABSTRACT
 | 
			
		||||
{
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
@ -2550,5 +2550,3 @@ class CORE_EXPORT QgsCentroidFillSymbolLayer : public QgsFillSymbolLayer
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5446,20 +5446,43 @@ void QgsSymbolLayerUtils::fixOldSymbolLayerReferences( const QMap<QString, QgsMa
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QgsSymbolLayerUtils::clearSymbolLayerIds( QgsSymbol *symbol )
 | 
			
		||||
template <typename Functor>
 | 
			
		||||
void changeSymbolLayerIds( QgsSymbolLayer *sl, Functor &&generateId )
 | 
			
		||||
{
 | 
			
		||||
  sl->setId( generateId() );
 | 
			
		||||
 | 
			
		||||
  // recurse over sub symbols
 | 
			
		||||
  QgsSymbol *subSymbol = sl->subSymbol();
 | 
			
		||||
  if ( subSymbol )
 | 
			
		||||
    changeSymbolLayerIds( subSymbol, generateId );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename Functor>
 | 
			
		||||
void changeSymbolLayerIds( QgsSymbol *symbol, Functor &&generateId )
 | 
			
		||||
{
 | 
			
		||||
  if ( !symbol )
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  for ( int idx = 0; idx < symbol->symbolLayerCount(); idx++ )
 | 
			
		||||
  {
 | 
			
		||||
    QgsSymbolLayer *sl = symbol->symbolLayer( idx );
 | 
			
		||||
 | 
			
		||||
    sl->setId( QString() );
 | 
			
		||||
 | 
			
		||||
    // recurse over sub symbols
 | 
			
		||||
    QgsSymbol *subSymbol = const_cast<QgsSymbolLayer *>( sl )->subSymbol();
 | 
			
		||||
    if ( subSymbol )
 | 
			
		||||
      clearSymbolLayerIds( subSymbol );
 | 
			
		||||
  }
 | 
			
		||||
    changeSymbolLayerIds( symbol->symbolLayer( idx ), generateId );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QgsSymbolLayerUtils::clearSymbolLayerIds( QgsSymbol *symbol )
 | 
			
		||||
{
 | 
			
		||||
  changeSymbolLayerIds( symbol, []() { return QString(); } );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QgsSymbolLayerUtils::clearSymbolLayerIds( QgsSymbolLayer *symbolLayer )
 | 
			
		||||
{
 | 
			
		||||
  changeSymbolLayerIds( symbolLayer, []() { return QString(); } );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QgsSymbolLayerUtils::resetSymbolLayerIds( QgsSymbolLayer *symbolLayer )
 | 
			
		||||
{
 | 
			
		||||
  changeSymbolLayerIds( symbolLayer, []() { return QUuid::createUuid().toString(); } );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QgsSymbolLayerUtils::resetSymbolLayerIds( QgsSymbol *symbol )
 | 
			
		||||
{
 | 
			
		||||
  changeSymbolLayerIds( symbol, []() { return QUuid::createUuid().toString(); } );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -943,6 +943,24 @@ class CORE_EXPORT QgsSymbolLayerUtils
 | 
			
		||||
     */
 | 
			
		||||
    static void clearSymbolLayerIds( QgsSymbol *symbol );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Remove recursively unique id from \a symbolLayer and its children and set an empty string instead
 | 
			
		||||
     * \since QGIS 3.30
 | 
			
		||||
     */
 | 
			
		||||
    static void clearSymbolLayerIds( QgsSymbolLayer *symbolLayer );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Regenerate recursively unique id from all \a symbol symbol layers
 | 
			
		||||
     * \since QGIS 3.30
 | 
			
		||||
     */
 | 
			
		||||
    static void resetSymbolLayerIds( QgsSymbol *symbol );
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Regenerate recursively unique id from \a symbolLayer and its children
 | 
			
		||||
     * \since QGIS 3.30
 | 
			
		||||
     */
 | 
			
		||||
    static void resetSymbolLayerIds( QgsSymbolLayer *symbolLayer );
 | 
			
		||||
 | 
			
		||||
    ///@cond PRIVATE
 | 
			
		||||
#ifndef SIP_RUN
 | 
			
		||||
    static QgsProperty rotateWholeSymbol( double additionalRotation, const QgsProperty &property )
 | 
			
		||||
 | 
			
		||||
@ -721,6 +721,7 @@ void QgsSymbolSelectorWidget::duplicateLayer()
 | 
			
		||||
  QgsSymbol *parentSymbol = item->symbol();
 | 
			
		||||
 | 
			
		||||
  QgsSymbolLayer *newLayer = source->clone();
 | 
			
		||||
  QgsSymbolLayerUtils::resetSymbolLayerIds( newLayer );
 | 
			
		||||
  if ( insertIdx == -1 )
 | 
			
		||||
    parentSymbol->appendSymbolLayer( newLayer );
 | 
			
		||||
  else
 | 
			
		||||
 | 
			
		||||
@ -736,6 +736,40 @@ class PyQgsSymbolLayerUtils(unittest.TestCase):
 | 
			
		||||
            self.assertEqual(res_size.width(), int(exp_width))
 | 
			
		||||
            self.assertAlmostEqual(res_angle, exp_angle)
 | 
			
		||||
 | 
			
		||||
    def test_clear_symbollayer_ids(self):
 | 
			
		||||
        """
 | 
			
		||||
        Test we manage to clear all symbol layer ids on a symbol
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        source = QgsVectorLayer("Polygon?crs=EPSG:4326", 'layer', "memory")
 | 
			
		||||
        self.assertTrue(source.isValid())
 | 
			
		||||
 | 
			
		||||
        layer = QgsLinePatternFillSymbolLayer()
 | 
			
		||||
        fill_symbol = QgsFillSymbol([layer])
 | 
			
		||||
 | 
			
		||||
        sub_renderer = QgsSingleSymbolRenderer(fill_symbol)
 | 
			
		||||
        source.setRenderer(sub_renderer)
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(len(fill_symbol.symbolLayers()), 1)
 | 
			
		||||
 | 
			
		||||
        subsymbol = fill_symbol.symbolLayers()[0].subSymbol()
 | 
			
		||||
        self.assertTrue(subsymbol)
 | 
			
		||||
        self.assertEqual(len(subsymbol.symbolLayers()), 1)
 | 
			
		||||
 | 
			
		||||
        child_sl = subsymbol.symbolLayers()[0]
 | 
			
		||||
        self.assertTrue(child_sl)
 | 
			
		||||
 | 
			
		||||
        old_id = child_sl.id()
 | 
			
		||||
        self.assertTrue(child_sl.id())
 | 
			
		||||
 | 
			
		||||
        QgsSymbolLayerUtils.resetSymbolLayerIds(fill_symbol)
 | 
			
		||||
 | 
			
		||||
        self.assertTrue(child_sl.id())
 | 
			
		||||
        self.assertTrue(child_sl.id() != old_id)
 | 
			
		||||
 | 
			
		||||
        QgsSymbolLayerUtils.clearSymbolLayerIds(fill_symbol)
 | 
			
		||||
        self.assertFalse(child_sl.id())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    unittest.main()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user