# Skrip 4.3: label petak berisi ID dan volume, dengan garis tepi putih agar terbaca
from qgis.core import (QgsProject, QgsPalLayerSettings, QgsTextFormat, QgsTextBufferSettings,
                       QgsVectorLayerSimpleLabeling, QgsExpression, QgsExpressionContext,
                       QgsExpressionContextUtils)
from qgis.PyQt.QtGui import QColor, QFont

FOLDER = r"D:/KPH_Contoh"   # ganti dengan folder kerja Anda

petak = QgsProject.instance().mapLayersByName("Petak_KPH")[0]

ekspresi = ('"ID_Petak" || \'\n\' || '
            'coalesce(to_string(round("Volume_m3ha")) || \' m3/ha\', \'belum diukur\')')

pengaturan = QgsPalLayerSettings()
pengaturan.fieldName = ekspresi
pengaturan.isExpression = True

teks = QgsTextFormat()
teks.setFont(QFont("Arial"))
teks.setSize(8)
teks.setColor(QColor("#202020"))
garis = QgsTextBufferSettings()
garis.setEnabled(True)
garis.setSize(0.8)
garis.setColor(QColor("white"))
teks.setBuffer(garis)
pengaturan.setFormat(teks)

petak.setLabeling(QgsVectorLayerSimpleLabeling(pengaturan))
petak.setLabelsEnabled(True)
petak.triggerRepaint()

# periksa hasil ekspresi pada dua petak
konteks = QgsExpressionContext()
konteks.appendScopes(QgsExpressionContextUtils.globalProjectLayerScopes(petak))
for f in petak.getFeatures():
    if f["ID_Petak"] in ("A01", "G08"):
        konteks.setFeature(f)
        print(f["ID_Petak"], "->", repr(QgsExpression(ekspresi).evaluate(konteks)))
