Files

59 lines
2.0 KiB
Python
Raw Permalink Normal View History

2026-03-01 21:36:54 +08:00
import zipfile
import warnings
from xml.etree import ElementTree
from .base import importer
from ..parsers.svg.importer import SvgParser
from .. import objects
ns = "{%s}" % "http://www.calligra.org/DTD/krita"
def _ns(string):
return string.format(ns=ns)
def _import_layers(zf, animation, xml_parent, svg_parser, parent):
for xml_layer in xml_parent.findall(_ns("./{ns}layers/{ns}layer")):
nodetype = xml_layer.attrib["nodetype"]
if nodetype == "grouplayer":
layer = animation.add_layer(objects.NullLayer())
_import_layers(zf, animation, xml_layer, svg_parser, layer)
elif nodetype == "shapelayer":
filename = "%s/layers/%s.shapelayer/content.svg" % (animation.name, xml_layer.attrib["filename"])
with zf.open(filename) as svg_tree:
layer = svg_parser.etree_to_layer(animation, ElementTree.parse(svg_tree))
else:
warnings.warn("Unsupported krita layer %s" % nodetype)
continue
layer.name = xml_layer.attrib["name"]
if xml_layer.attrib["visible"] == 0:
layer.transform.opacity.value = 0
layer.parent = parent
@importer("Krita", ["kra"])
def import_krita(file):
with zipfile.ZipFile(file) as zf:
with zf.open("maindoc.xml") as main:
main_xml = ElementTree.parse(main)
image = main_xml.find(_ns("./{ns}IMAGE"))
fps = float(main_xml.find(_ns("./{ns}IMAGE/{ns}animation/{ns}framerate")).attrib["value"])
framerange = main_xml.find(_ns("./{ns}IMAGE/{ns}animation/{ns}range")).attrib
animation = objects.Animation(int(framerange["to"]), fps)
animation.in_point = int(framerange["from"])
animation.width = int(image.attrib["width"])
animation.height = int(image.attrib["height"])
animation.name = image.attrib["name"]
parser = SvgParser()
parser.dpi = int(image.attrib["x-res"])
_import_layers(zf, animation, image, parser, None)
return animation