Witam,
Ostatnio zmagam się z problemem włączenia maski pod poziomicami w sposób programistyczny, tak aby przysłoniła ona linie na wysokości Etykiet, by lepiej widoczna była wartość danej poziomicy.
Stylizacja jest zapisana w dwóch plikach .qml. Pierwszy zawiera same etykiety odnośnie poziomic, druga zaś stylizację poziomic. Stylizacja maski jest zapisana w znaczniku:
<text-mask maskSizeUnits="MM" maskType="0" maskSizeMapUnitScale="3x:0,0,0,0,0,0" maskedSymbolLayers="" maskEnabled="1" maskSize="1.5" maskJoinStyle="128" maskOpacity="1" maskSize2="1.5"/>
Mam problem z włączeniem w sposób automatyczny podczas uruchamiania wtyczki checkboxów odpowiedzialnych za symbolizację tj. Dwóch Paneli w zakładce Maska we właściwościach. Górny jest podpisany jako “Maski Symboli warstwy”, który w gmlu z kategoriami stylizacji poziomic zawiera całą litanię rodzajów, zaś w qmlu z samymi etykietami jest on pusty. Dolny zaś to “Maskowanie Symboli Warstwy”, który jak sądzę w obu musi zostać włączony, aby symbolizacja zadziałała.
Próbowałem rozwiązać we współpracy z SI, ale chatGPT proponuje nie istniejące biblioteki zaś odpowiedź z Gemini jest dla mnie nie jasna.
Początek kodu jest taki:
if os.path.exists(path+przestrzen_nazw+'__OT_RTLW_L.'+formatPliku):
copyfile(qmlPath/Path("OT_RTLW_L [5-6] 0.qml"), path+przestrzen_nazw+'__OT_RTLW_L [5-6] 0.qml')
OT_RTLW_L = QgsVectorLayer(path+przestrzen_nazw+"__OT_RTLW_L."+formatPliku, przestrzen_nazw+"__OT_RTLW_L (poziom 5 i 6)","ogr")
if OT_RTLW_L.featureCount()>0:
if formatPliku=="xml" and OT_RTLW_L.fields().indexFromName("koniecWersjiObiektu")!=-1:
OT_RTLW_L.setSubsetString("koniecWersjiObiektu is null")
QgsProject.instance().addMapLayer(OT_RTLW_L, False)
group.addLayer(OT_RTLW_L)
OT_RTLW_L.loadNamedStyle(path+przestrzen_nazw+'__OT_RTLW_L [5-6] 0.qml')
renderer = OT_RTLW_L.renderer()
if isinstance(OT_RTLW_L.renderer(), QgsCategorizedSymbolRenderer):
for category in renderer.categories():
print (f'kategoria: {category}')
symbol = category.symbol()
print ('przed pętlą', symbol)
for i, symbol_layer in enumerate(symbol.symbolLayers()):
print (isinstance(symbol_layer, QgsLineSymbolLayer))
print (symbol_layer.width())
print (symbol_layer.color().name())
print (isinstance(symbol_layer, QgsSymbolLayer))
poniżej jest kilka wersji testowych, które nie działają, z czego najbliższa mi to:
Najbliższa mi wersja to:
renderer = poziomica.renderer()
layer_mask_list = [] #górny panel
for symbol_index, symbol in enumerate(renderer.symbols(QgsRenderContext())):
for layer_index, symbol_layer in enumerate(symbol.symbolLayers()):
symbol_layer_id = QgsSymbolLayerId(str(symbol_index), layer_index)
# Tworzymy referencję do maskowania symbolu z tej samej warstwy 'poziomica'
masked_layer_ref = QgsMaskedSymbolLayer(poziomica.id(), symbol_layer_id)
layer_mask_list.append(masked_layer_ref)
if renderer: # dolny panel
for symbol_index, symbol in enumerate(renderer.symbols(QgsRenderContext())):
for layer_index, symbol_layer in enumerate(symbol.symbolLayers()):
symbol_layer_id = QgsSymbolLayerId(str(symbol_index), layer_index)
refr = QgsMaskedSymbolLayer(poziomica.id(), symbol_layer_id)
masked_symbol_layers.append(ref)
Czy dobrze idę?
Z Góry dziękuje za każdą pomoc!