Hi
From this problem (Channels to Layers - #25 by Grum999), it seems node management through API doesn’t work like before.
I was able to find commit from which node management has been changed
Building from commit (Fix initialization of image link in the pasted nodes (81f9b1aa) · Commits · Graphics / Krita · GitLab), python script doesn’t generate expected result
Building from previous commit (Allow the brush settings lists to respond to drag inputs (75abd1e9) · Commits · Graphics / Krita · GitLab), python script generate expected result
@dkazakov (as you’ve made the commit
) before creating a bug, I would like to know if it’s a normal behavior or not, especially due to your commit message I’m not sure this patch is safe enough for 5.0.x branch. ![]()
Before commit
(Krita 5.0.6)
- Create a group layer
- Create nodes inside group layer, with blending mode
- Merge node inside group layer
- Add group layer to document
= OK
Scripter example
from krita import *
from PyQt5.Qt import *
from PyQt5 import QtCore
from PyQt5.QtCore import QByteArray, QPoint
from PyQt5.QtGui import QColor, QImage, QPixmap
def buildCircleImage(w, h):
"""Generate a QImage to use for example"""
img=QImage(w, h, QImage.Format_ARGB32_Premultiplied)
img.fill(Qt.transparent)
pxmTgt = QPixmap.fromImage(img)
canvas = QPainter(pxmTgt)
canvas.setRenderHint(QPainter.Antialiasing)
canvas.setPen(QPen(QColor(255,0,0), 25))
canvas.drawEllipse(QRect(20,20,w-40, h-40));
canvas.end()
return pxmTgt.toImage()
def setLayerFromQImage(layerNode, image):
"""Set QImage as layer content"""
position = QPoint(0, 0)
ptr = image.bits()
ptr.setsize(image.byteCount())
layerNode.setPixelData(QByteArray(ptr.asstring()), position.x(), position.y(), image.width(), image.height())
dWidth=500
dHeight=500
newDocument = Krita.instance().createDocument(dWidth, dHeight, "Test", "RGBA", "U8", "", 300.0)
Krita.instance().activeWindow().addView(newDocument)
# create group layer
parentGroupLayer = newDocument.createGroupLayer(f'Group layer')
# create circle layer
newPLayer = newDocument.createNode(f"PaintLayer-Circle", 'paintlayer')
setLayerFromQImage(newPLayer, buildCircleImage(dWidth, dHeight))
parentGroupLayer.addChildNode(newPLayer, None)
# create fill layer
infoObject = InfoObject();
infoObject.setProperty("color", QColor(255,255,0))
selection = Selection()
selection.select(0, 0, dWidth, dHeight, 255)
newFLayer = newDocument.createFillLayer(f"FillColor-Color", "color", infoObject, selection)
parentGroupLayer.addChildNode(newFLayer, newPLayer)
# mandatory as when provided to createFillLayer(), infoObject is not applied
# must also be applied after node has been added to parent...
newFLayer.setGenerator("color", infoObject)
newFLayer.setBlendingMode('multiply')
newLayer = newFLayer.mergeDown()
# add group layer to document
newDocument.rootNode().addChildNode(parentGroupLayer, None)
newDocument.refreshProjection()
Result:
After commit
(Krita 5.1.0)
- Create a group layer
- Create nodes inside group layer, with blending mode
- Merge node inside group layer
- Add group layer to document
= KO
Workaround
- Create a group layer
- Add group layer to document
- Create nodes inside group layer, with blending mode
- Merge node inside group layer
= OK
Workaround scripter code example
Modified script (add group layer to document before starting to add child) produce expected result
from krita import *
from PyQt5.Qt import *
from PyQt5 import QtCore
from PyQt5.QtCore import QByteArray, QPoint
from PyQt5.QtGui import QColor, QImage, QPixmap
def buildCircleImage(w, h):
"""Generate a QImage to use for example"""
img=QImage(w, h, QImage.Format_ARGB32_Premultiplied)
img.fill(Qt.transparent)
pxmTgt = QPixmap.fromImage(img)
canvas = QPainter(pxmTgt)
canvas.setRenderHint(QPainter.Antialiasing)
canvas.setPen(QPen(QColor(255,0,0), 25))
canvas.drawEllipse(QRect(20,20,w-40, h-40));
canvas.end()
return pxmTgt.toImage()
def setLayerFromQImage(layerNode, image):
"""Set QImage as layer content"""
position = QPoint(0, 0)
ptr = image.bits()
ptr.setsize(image.byteCount())
layerNode.setPixelData(QByteArray(ptr.asstring()), position.x(), position.y(), image.width(), image.height())
dWidth=500
dHeight=500
newDocument = Krita.instance().createDocument(dWidth, dHeight, "Test", "RGBA", "U8", "", 300.0)
Krita.instance().activeWindow().addView(newDocument)
# create group layer
parentGroupLayer = newDocument.createGroupLayer(f'Group layer')
# add group layer to document
newDocument.rootNode().addChildNode(parentGroupLayer, None)
# create circle layer
newPLayer = newDocument.createNode(f"PaintLayer-Circle", 'paintlayer')
setLayerFromQImage(newPLayer, buildCircleImage(dWidth, dHeight))
parentGroupLayer.addChildNode(newPLayer, None)
# create fill layer
infoObject = InfoObject();
infoObject.setProperty("color", QColor(255,255,0))
selection = Selection()
selection.select(0, 0, dWidth, dHeight, 255)
newFLayer = newDocument.createFillLayer(f"FillColor-Color", "color", infoObject, selection)
parentGroupLayer.addChildNode(newFLayer, newPLayer)
# mandatory as when provided to createFillLayer(), infoObject is not applied
# must also be applied after node has been added to parent...
newFLayer.setGenerator("color", infoObject)
newFLayer.setBlendingMode('multiply')
newLayer = newFLayer.mergeDown()
newDocument.refreshProjection()
If plugins have to be modified, it might not be to hard…
But before modifying plugins, I’m wondering if it’s normal.
On my side, I sometimes work on temporary nodes, created on document but not added to root document because adding it to delete seems useless to me…
Grum999

