mightyscape-1.2/extensions/fablabchemnitz/layer_clip/clip.py

74 lines
2.8 KiB
Python

# Copyright (c) 2012 Stuart Pernsteiner
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import sys
import inkex
import gettext
from lxml import etree
_ = gettext.gettext
class ClipEffect(inkex.EffectExtension):
def __init__(self, dirmark):
inkex.Effect.__init__(self)
self.dirmark = dirmark
def effect(self):
defs = self.svg.getElement('//svg:defs')
if len(self.svg.selected) != 1:
die(_("Error: You must select exactly one path"))
# Create the svg:clipPath inside of svg:defs
pathId = list(self.svg.selected.values())[0].get('id')
#inkex.utils.debug(pathId)
clippath = etree.SubElement(defs, 'clipPath',
{'clipPathUnits': 'userSpaceOnUse'
,'id': self.svg.get_unique_id("clipPath")})
use = etree.SubElement(clippath, 'use',
{inkex.addNS('href','xlink'): '#' + pathId
,'id': self.svg.get_unique_id("use")})
# Find the target layer and set its clip-path attribute
layer = self.svg.selected[pathId].getparent()
target = self.find_target(pathId)
target.set('clip-path', 'url(#%s)' % clippath.get('id'))
# Update layer names
label_attr = inkex.addNS('label', 'inkscape')
layer_label = layer.get(label_attr)
layer.set(label_attr, layer_label + ' (c%s)' % self.dirmark)
target_label = target.get(label_attr)
target.set(label_attr, target_label + ' (C)')
def layername(layer):
return layer.get(inkex.addNS('label','inkscape'))
def die(msg):
inkex.errormsg(msg)
sys.exit(1)