Added Gradient Saver

This commit is contained in:
Mario Voigt 2020-09-03 00:50:06 +02:00
parent 4175b377bd
commit a58db0516b
5 changed files with 1750 additions and 0 deletions

View File

@ -0,0 +1,667 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="window">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Gradient Saver</property>
<property name="resizable">False</property>
<property name="window_position">center</property>
<property name="default_width">600</property>
<property name="default_height">400</property>
<property name="icon">icon.svg</property>
<property name="gravity">north</property>
<signal name="destroy" handler="onDestroy" swapped="no"/>
<child>
<placeholder/>
</child>
<child>
<object class="GtkNotebook" id="active_page">
<property name="visible">True</property>
<property name="can_focus">True</property>
<signal name="switch-page" handler="onSwitchPage" swapped="no"/>
<child>
<object class="GtkLayout">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="width">400</property>
<property name="height">250</property>
<child>
<object class="GtkScrolledWindow">
<property name="width_request">600</property>
<property name="height_request">180</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkBox" id="save_gradients_container">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">30</property>
<property name="margin_top">10</property>
<property name="border_width">2</property>
<property name="orientation">vertical</property>
<property name="spacing">20</property>
<child>
<object class="GtkBox" id="save_gradient1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_top">10</property>
<property name="spacing">18</property>
<child>
<object class="GtkDrawingArea" id="save_gradient_draw">
<property name="width_request">150</property>
<property name="height_request">42</property>
<property name="visible">True</property>
<property name="app_paintable">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="save_gradient_name">
<property name="width_request">325</property>
<property name="height_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">25</property>
<property name="placeholder_text" translatable="yes">e.g Beautiful Color</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="y">130</property>
</packing>
</child>
<child>
<object class="GtkButtonBox">
<property name="width_request">580</property>
<property name="height_request">32</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_right">20</property>
<property name="spacing">10</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="save_btn_cancel">
<property name="label" translatable="yes">Cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="onDestroy" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="save_btn_apply">
<property name="label" translatable="yes">Save</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="onSaveGradientClicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="y">318</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="width_request">600</property>
<property name="height_request">100</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_bottom">10</property>
<property name="baseline_position">top</property>
<child>
<object class="GtkImage">
<property name="width_request">55</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">30</property>
<property name="margin_top">21</property>
<property name="stock">gtk-info</property>
<property name="icon_size">6</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="width_request">250</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_right">30</property>
<property name="margin_top">14</property>
<property name="label" translatable="yes">&lt;b&gt;Hint:&lt;/b&gt;
Select at least one object that use gradient color in order to add those gradient to your library. Selected gradient object will appear below. You can give a name for your gradients to help you recoginize it later.</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="width_request">550</property>
<property name="height_request">20</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">45</property>
<property name="margin_right">50</property>
<property name="margin_bottom">10</property>
<property name="spacing">100</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Preview&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Gradient Name&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="y">100</property>
</packing>
</child>
</object>
</child>
<child type="tab">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Add New</property>
</object>
<packing>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkLayout">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButtonBox">
<property name="width_request">580</property>
<property name="height_request">32</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_right">20</property>
<property name="spacing">6</property>
<property name="baseline_position">bottom</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="load_gradient_remove1">
<property name="label" translatable="yes">Remove</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="onRemoveGradientClicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="load_gradient_add1">
<property name="label" translatable="yes">Load</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="onLoadGradientClicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="y">318</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="width_request">600</property>
<property name="height_request">100</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_bottom">10</property>
<property name="baseline_position">top</property>
<child>
<object class="GtkImage">
<property name="width_request">55</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">30</property>
<property name="margin_top">21</property>
<property name="stock">gtk-info</property>
<property name="icon_size">6</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="width_request">250</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_right">30</property>
<property name="margin_top">14</property>
<property name="label" translatable="yes">&lt;b&gt;Hint:&lt;/b&gt;
Select at least one object that use gradient color in order to add those gradient to your library. Selected gradient object will appear below. You can give a name for your gradients to help you recoginize it later.</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="width_request">550</property>
<property name="height_request">20</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">45</property>
<property name="margin_right">50</property>
<property name="margin_bottom">10</property>
<property name="spacing">100</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Your Current Gradient&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="y">100</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="width_request">600</property>
<property name="height_request">180</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkFlowBox" id="load_gradients_container">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="valign">start</property>
<property name="margin_left">10</property>
<property name="margin_right">10</property>
<property name="column_spacing">30</property>
<property name="row_spacing">10</property>
<property name="min_children_per_line">2</property>
<property name="max_children_per_line">2</property>
<property name="selection_mode">none</property>
<property name="activate_on_single_click">False</property>
<child>
<object class="GtkFlowBoxChild" id="load_gradient1">
<property name="width_request">60</property>
<property name="height_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="halign">start</property>
<property name="valign">start</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">5</property>
<property name="baseline_position">top</property>
<child>
<object class="GtkCheckButton" id="load_gradient_select">
<property name="height_request">42</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkDrawingArea" id="load_gradient_draw">
<property name="width_request">100</property>
<property name="height_request">42</property>
<property name="visible">True</property>
<property name="app_paintable">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="load_gradient_text">
<property name="height_request">42</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">ijo trans</property>
<property name="wrap">True</property>
<property name="wrap_mode">char</property>
<property name="max_width_chars">25</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="y">130</property>
</packing>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Load or Remove</property>
</object>
<packing>
<property name="position">1</property>
<property name="tab_fill">False</property>
</packing>
</child>
<child>
<object class="GtkLayout">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="extension_version">
<property name="width_request">317</property>
<property name="height_request">300</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;span font="12"&gt;&lt;b&gt;Version $VERSION&lt;/b&gt;&lt;/span&gt;</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="x">137</property>
<property name="y">-84</property>
</packing>
</child>
<child>
<object class="GtkImage">
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixbuf">icon.svg</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">32</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;span font="12"&gt;&lt;b&gt;Gradient Saver&lt;/b&gt;&lt;/span&gt;</property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="x">69</property>
<property name="y">225</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="width_request">307</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;span&gt;Gradient Saver is an extension for Inkscape that will help you to organize your favorite gradients. This extension created with love by &lt;a href="#"&gt;Sofyan&lt;/a&gt; &amp;amp; &lt;a href="https://raniaamina.id"&gt;Rania Amina&lt;/a&gt; and fully supported by Gimpscape ID Community.
Project Repository:
&lt;a href="#"&gt;&lt;b&gt;https://github.com/artemtech/inkscape-gradient-saver&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;</property>
<property name="use_markup">True</property>
<property name="wrap">True</property>
</object>
<packing>
<property name="x">243</property>
<property name="y">82</property>
</packing>
</child>
<child>
<object class="GtkButtonBox">
<property name="width_request">580</property>
<property name="height_request">32</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_right">20</property>
<property name="spacing">10</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="about_btn_close">
<property name="label" translatable="yes">Close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="onDestroy" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="y">318</property>
</packing>
</child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child type="tab">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">About</property>
</object>
<packing>
<property name="position">2</property>
<property name="tab_fill">False</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkDialog" id="information_dialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Information</property>
<property name="icon_name">dialog-information</property>
<property name="type_hint">dialog</property>
<property name="attached_to">window</property>
<child>
<placeholder/>
</child>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="margin_left">10</property>
<property name="margin_right">10</property>
<property name="margin_top">10</property>
<property name="margin_bottom">10</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can_focus">False</property>
<property name="margin_top">10</property>
<property name="margin_bottom">10</property>
<property name="layout_style">center</property>
<child>
<object class="GtkButton" id="information_button">
<property name="label" translatable="yes">Close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="onDestroy" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage">
<property name="width_request">55</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-info</property>
<property name="icon_size">6</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="information_text">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension">
<name>Gradient Saver</name>
<id>fablabchemnitz.de.gradient_saver</id>
<effect>
<object-type>all</object-type>
<effects-menu>
<submenu name="FabLab Chemnitz">
<submenu name="Various"/>
</submenu>
</effects-menu>
</effect>
<script>
<command location="inx" interpreter="python">gradient_saver.py</command>
</script>
</inkscape-extension>

View File

@ -0,0 +1,385 @@
#! /usr/bin/env python3
# OS modules
import os
import sys
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
# inkscape extension files
import cairo
from lxml import etree
import inkex # required
from inkex.utils import NSS
from inkex.utils import errormsg as show_errormsg
from inkex.styles import Style
from inkex.colors import Color
__version__ = '1.0.0'
saved_gradient_path = "../my-gradients.svg"
def create_new_file(gradient_data):
root = etree.Element("svg", nsmap=NSS)
def_tree = etree.SubElement(root, "defs")
for i, item in enumerate(gradient_data):
gradient = etree.SubElement(def_tree, item.tag, attrib=item.attrib)
for j, gradient_stop in enumerate(item):
etree.SubElement(gradient, gradient_stop.tag, attrib=gradient_stop.attrib, id="stop%d%d" % (i, j))
with open(saved_gradient_path, "w") as f:
f.write(etree.tostring(
root, encoding="utf-8", xml_declaration=True, pretty_print=True).decode("utf-8"))
def save_to_file(data):
""" Wrapper for saving gradients to file. """
if len(data) == 0:
return 1
else:
try:
# read previous data then append it with current data
if os.path.exists(saved_gradient_path):
previous_data = load_gradients_from_file()
data = previous_data + data
create_new_file(data)
return 0
except Exception as e:
import traceback
show_errormsg(e)
show_errormsg(traceback.print_exc())
return -1
def load_gradients_from_file():
""" Load gradients from saved gradient, returned as List """
if os.path.exists(saved_gradient_path) and os.stat(saved_gradient_path).st_size != 0:
root = etree.parse(saved_gradient_path)
mygradients = root.xpath("//linearGradient", namespaces=NSS)
else:
mygradients = []
return mygradients
def read_stop_gradient(gradient):
stop_data = {
"id": gradient.attrib.get("id"),
"stops": []
}
for stop in gradient:
offset = stop.attrib.get("offset")
style = Style(Style.parse_str(stop.attrib['style']))
color = Color.parse_str(style.get("stop-color"))[1]
opacity = style.get("stop-opacity")
stop_data.get("stops").append(
tuple([float(offset)] + [x/256.0 for x in color] + [float(opacity)]))
return stop_data
class MainWindow(Gtk.Builder):
def __init__(self, gradientSaver):
Gtk.Builder.__init__(self)
self.gradientSaver = gradientSaver
self.add_from_file("GUI.glade")
self.window = self.get_object("window")
self.app_version = self.get_object("extension_version")
self.app_version.set_label(self.app_version.get_label().replace("$VERSION",__version__))
self.information_dialog = self.get_object("information_dialog")
# parsing components
# save gradient components
self.save_container = self.get_object("save_gradients_container")
save_template = self.get_object("save_gradient1")
self.save_container.remove(save_template)
for idx, item in enumerate(self.gradientSaver.doc_selected_gradients):
new_save_template = self.SaveGradientTemplate(item)
new_save_template.set_name("gradient%d" % idx)
self.save_container.add(new_save_template)
self.save_container.show_all()
# - end save gradient components
# load gradient components
self.load_container = self.get_object("load_gradients_container")
load_template = self.get_object("load_gradient1")
self.load_container.remove(load_template)
# - end load gradient components
# show the GUI
self.connect_signals(self.Handler(self))
self.window.show()
class SaveGradientTemplate(Gtk.HBox):
"""
Template for generating gradient name
and preview of selected object in the save page.
"""
def __init__(self, gradient_data):
Gtk.HBox.__init__(self)
self.gradient_data = gradient_data
self.set_spacing(20)
preview = Gtk.DrawingArea()
preview.set_size_request(150, 42)
preview.set_app_paintable(True)
preview.connect("draw", self.on_draw, gradient_data)
self.pack_start(preview, False, True, 0)
self.input_entry = Gtk.Entry()
self.input_entry.set_placeholder_text("e.g Beautiful Color")
self.input_entry.set_size_request(250, 42)
self.input_entry.set_text(gradient_data.get("id"))
self.input_entry.set_max_length(25)
self.pack_start(self.input_entry, False, True, 1)
def on_draw(self, wid, cr, data):
"""
Calllback for draw signal for rendering gradient.
params:
- wid :GtkWidget
- cr :Cairo
- data :list -> gradient data
"""
lg = cairo.LinearGradient(0.0, 20.0, 150.0, 20.0)
for stop in data["stops"]:
lg.add_color_stop_rgba(
stop[0], stop[1], stop[2], stop[3], stop[4])
cr.rectangle(10.0, 0.0, 150.0, 42.0)
cr.set_source(lg)
cr.fill()
def get_save_gradient_text(self):
return self.input_entry.get_text()
def get_compiled_gradient(self, new_id):
# compiling gradient stops
root = etree.Element("linearGradient", id=new_id)
for idx, stop in enumerate(self.gradient_data["stops"]):
stop_id = self.get_name() + str(idx)
offset = stop[0]
color = Color([stop[1], stop[2], stop[3]],"rgb")
opacity = stop[4]
tmp_stops = {
"id": stop_id,
"offset": str(offset),
"style": Style({
"stop-color": str(color),
"stop-opacity": str(opacity)
}).to_str()
}
current_stop = etree.SubElement(root, "stop", attrib=tmp_stops)
return root
class LoadGradientTemplate(Gtk.FlowBoxChild):
"""
Template for generating gradient name
and preview of saved gradient in the load page.
"""
def __init__(self, gradient_data):
Gtk.FlowBoxChild.__init__(self)
self.gradient_data = gradient_data
self.set_size_request(60,32)
self.set_halign(Gtk.Align.START)
self.set_valign(Gtk.Align.START)
container = Gtk.HBox()
container.set_spacing(5)
container.set_baseline_position(Gtk.BaselinePosition.TOP)
self.checkbox = Gtk.CheckButton()
self.checkbox.draw_indicator = True
container.pack_start(self.checkbox,False,True,0)
preview = Gtk.DrawingArea()
preview.set_size_request(100, 32)
preview.set_app_paintable(True)
preview.connect("draw", self.on_draw, gradient_data)
container.pack_start(preview,False,True,0)
self.text_gradient = Gtk.Label()
self.text_gradient.set_text(gradient_data.get("id"))
self.text_gradient.set_line_wrap(True)
self.text_gradient.set_line_wrap_mode(1)
self.text_gradient.set_max_width_chars(25)
container.pack_start(self.text_gradient,False,True,0)
self.add(container)
def on_draw(self, wid, cr, data):
"""
Calllback for draw signal for rendering gradient.
params:
- wid :GtkWidget
- cr :Cairo
- data :list -> gradient data
"""
lg = cairo.LinearGradient(0.0, 20.0, 100.0, 20.0)
for stop in data["stops"]:
lg.add_color_stop_rgba(
stop[0], stop[1], stop[2], stop[3], stop[4])
cr.rectangle(10.0, 0.0, 110.0, 32.0)
cr.set_source(lg)
cr.fill()
class Handler:
""" Signal Handler for GUI """
def __init__(self, main_window):
self.main_window = main_window
def onDestroy(self, *args):
Gtk.main_quit()
def onSwitchPage(self, notebook, page, page_num):
if page_num == 0: # save tab
pass
elif page_num == 1: # load/remove tab
self.main_window.gradients_to_load = []
for children in self.main_window.load_container.get_children():
self.main_window.load_container.remove(children)
loaded_gradients = load_gradients_from_file()
# TODO render with disabled checkbox if it already exists in current project doc
for idx,gradient in enumerate(loaded_gradients):
# parse gradient stops
stop_data = read_stop_gradient(gradient)
gradient_info = self.main_window.LoadGradientTemplate(stop_data)
gradient_info.checkbox.connect("toggled",self.onLoadGradientToggled, gradient)
gradient_info.set_name("gradient%d" % idx)
self.main_window.load_container.add(gradient_info)
self.main_window.load_container.show_all()
else:
pass
def onSaveGradientClicked(self, button):
text = ""
gradient_to_save = []
# get all gradient data in save_container
for item in self.main_window.save_container.get_children():
# get new gradient name
new_name_gradient = item.get_save_gradient_text()
# strip all special chars
if not new_name_gradient.isalnum():
new_name_gradient = ''.join(e for e in new_name_gradient if e.isalnum())
# get gradient data
gradient_data = item.get_compiled_gradient(new_name_gradient)
text += "{0}\n-----\n".format(etree.tostring(gradient_data))
gradient_to_save.append(gradient_data)
# save to file
status = save_to_file(gradient_to_save)
if status == 0:
info = "%d gradients saved successfully!" % len(gradient_to_save)
# reload current document info with saved gradients
self.main_window.gradientSaver.reload_current_gradients(gradient_to_save)
elif status == 1:
info = "Nothing to save, there is no object with gradient selected. Exiting..."
elif status == -1:
info = "Internal Error (-1)! "
# showing popup information
self.main_window.get_object("information_text").set_text(info)
self.main_window.information_dialog.set_title("Save Gradient Information")
self.main_window.information_dialog.show_all()
def onLoadGradientToggled(self, togglebutton, gradient):
# if active, queue gradient, otherwise pop it
if togglebutton.get_active():
self.main_window.gradients_to_load.append(gradient)
else:
self.main_window.gradients_to_load.remove(gradient)
def onLoadGradientClicked(self, button):
if len(self.main_window.gradients_to_load) > 0:
self.main_window.gradientSaver.insert_new_gradients_to_current_doc(self.main_window.gradients_to_load)
teks = "Successfully loading these gradients:\n"
teks += "".join(["- "+gradient.attrib["id"]+"\n" for gradient in self.main_window.gradients_to_load])
else:
teks = "No gradient(s) selected to load. Exiting..."
self.main_window.get_object("information_text").set_text(teks)
self.main_window.information_dialog.set_title("Load Gradient Information")
self.main_window.information_dialog.show_all()
def onRemoveGradientClicked(self, button):
loaded_gradients = load_gradients_from_file()
if len(self.main_window.gradients_to_load) > 0:
gradient_to_remove = [gradient.attrib["id"] for gradient in self.main_window.gradients_to_load]
new_gradient_after = [gradient for gradient in loaded_gradients if gradient.attrib["id"] not in gradient_to_remove]
create_new_file(new_gradient_after)
teks = "Successfully removing these gradients:\n"
teks += "".join(["- "+gradient+"\n" for gradient in gradient_to_remove])
else:
teks = "No gradient(s) selected to load. Exiting..."
self.main_window.get_object("information_text").set_text(teks)
self.main_window.information_dialog.set_title("Remove Gradient Information")
self.main_window.information_dialog.show_all()
class GradientSaver(inkex.Effect):
def __init__(self):
" define how the options are mapped from the inx file "
inkex.Effect.__init__(self) # initialize the super class
try:
self.tty = open("/dev/tty", 'w')
except:
self.tty = open(os.devnull, 'w')
self.doc_selected_gradients = []
def insert_new_gradients_to_current_doc(self, gradients):
defs_node = self.svg.getElement("//svg:defs")
for item in gradients:
gradient = etree.SubElement(defs_node,item.tag,attrib=item.attrib)
for stop in item:
etree.SubElement(gradient,stop.tag,attrib=stop.attrib)
def reload_current_gradients(self, new_data):
" reload gradients information in current project with stored gradient "
for idx,gradient in enumerate(self.doc_selected_gradients):
# set old gradient id to new id
real_node = self.svg.getElement("//*[@id='%s']" % gradient["id"])
# remove inkscape collect first
real_node.attrib.pop("{"+NSS["inkscape"]+"}collect", None)
real_node.attrib["id"] = new_data[idx].attrib["id"]
# set old xlink:href to new id
node_href = self.svg.getElement("//*[@xlink:href='#%s']" % gradient["id"])
node_href.attrib["{"+NSS["xlink"]+"}href"] = "#"+new_data[idx].attrib["id"]
# last set up inkscape collect again
real_node.attrib["{"+NSS["inkscape"]+"}collect"] = "always"
def get_all_doc_gradients(self):
"""TODO
retrieve all gradient sources of current project document
"""
pass
def get_selected_gradients_data(self):
selected_objects = self.svg.selected
gradient_list = []
if len(selected_objects) > 0:
for item in selected_objects:
style = Style(Style.parse_str(selected_objects.get(item).get('style')))
fill = stroke = "None"
if style.get("fill"):
fill = style.get("fill")[5:-1] if "url" in style.get("fill") else "None"
if style.get("stroke"):
stroke = style("stroke")[5:-1] if "url" in style.get("stroke") else "None"
if fill == "None" and stroke == "None":
continue
# read fill data
if "radialGradient" in fill or "linearGradient" in fill:
real_fill = self.svg.getElementById(fill).attrib["{"+NSS["xlink"]+"}href"][1:]
real_fill_node = self.svg.getElementById(real_fill)
if real_fill_node not in gradient_list:
gradient_list.append(real_fill_node)
# read stroke data
if "radialGradient" in stroke or "linearGradient" in stroke:
real_stroke = self.svg.getElementById(stroke).attrib["{"+NSS["xlink"]+"}href"][1:]
real_stroke_node = self.svg.getElementById(real_stroke)
if real_stroke_node not in gradient_list:
gradient_list.append(real_stroke_node)
data = []
# read gradients data
for gradient in gradient_list:
# parse gradient stops
stop_data = read_stop_gradient(gradient)
data.append(stop_data)
return data
# called when the extension is running.
def effect(self):
self.doc_selected_gradients = self.get_selected_gradients_data()
try:
app = MainWindow(self)
Gtk.main()
except Exception as e:
import traceback
show_errormsg(e)
show_errormsg(traceback.print_exc())
if __name__ == '__main__':
GradientSaver().run()

View File

@ -0,0 +1,678 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256"
height="256"
viewBox="0 0 67.733332 67.733335"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="icon.svg">
<title
id="title239">Gradient Saver Icon</title>
<defs
id="defs2">
<linearGradient
id="linearGradient5327"
inkscape:collect="always">
<stop
id="stop5323"
offset="0"
style="stop-color:#35f600;stop-opacity:1" />
<stop
id="stop5325"
offset="1"
style="stop-color:#f0f600;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4992">
<stop
style="stop-color:#00bfa5;stop-opacity:1"
offset="0"
id="stop4988" />
<stop
style="stop-color:#29ff8a;stop-opacity:1"
offset="1"
id="stop4990" />
</linearGradient>
<linearGradient
id="linearGradient4978"
inkscape:collect="always">
<stop
id="stop4974"
offset="0"
style="stop-color:#6200ea;stop-opacity:1" />
<stop
id="stop4976"
offset="1"
style="stop-color:#f50048;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4972">
<stop
style="stop-color:#00c853;stop-opacity:1"
offset="0"
id="stop4968" />
<stop
style="stop-color:#2196f3;stop-opacity:1"
offset="1"
id="stop4970" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4977">
<stop
style="stop-color:#fdd835;stop-opacity:1"
offset="0"
id="stop4973" />
<stop
style="stop-color:#f50057;stop-opacity:1"
offset="1"
id="stop4975" />
</linearGradient>
<linearGradient
id="linearGradient4851"
inkscape:collect="always">
<stop
id="stop4847"
offset="0"
style="stop-color:#1de9b6;stop-opacity:1" />
<stop
id="stop4849"
offset="1"
style="stop-color:#2962ff;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient4753">
<stop
style="stop-color:#d500f9;stop-opacity:1"
offset="0"
id="stop4749" />
<stop
style="stop-color:#6200ea;stop-opacity:1"
offset="1"
id="stop4751" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4753"
id="linearGradient4755"
x1="114.52679"
y1="122.37501"
x2="85.328125"
y2="153.12674"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(8.3154762)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4851"
id="linearGradient4845"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(8.3154762)"
x1="115.28274"
y1="124.26488"
x2="75.122765"
y2="157.66246" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4851"
id="linearGradient4834"
x1="-372.85895"
y1="77.110123"
x2="-317.53687"
y2="46.030495"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7490779,0,0,0.7490779,-28.486614,89.363651)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4977"
id="linearGradient4932"
x1="-81.856453"
y1="213.70543"
x2="-83.746712"
y2="278.80466"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.63636261,0,0,0.63636261,-11.36592,145.37946)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4977"
id="linearGradient4940"
x1="-101.17622"
y1="231.34521"
x2="-115.24634"
y2="199.42558"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4977"
id="linearGradient4952"
x1="-61.471992"
y1="208.40015"
x2="-50.513939"
y2="218.02187"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8245614,0,0,1,-10.503224,0)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4978"
id="linearGradient4958"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8245614,0,0,1,77.718339,5.7980475)"
x1="-61.359409"
y1="232.67445"
x2="-53.959938"
y2="206.80617" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4851"
id="linearGradient4962"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8245614,0,0,1,157.24809,-18.087736)"
x1="-61.471992"
y1="208.40015"
x2="-50.513939"
y2="218.02187" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4972"
id="linearGradient4966"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8245614,0,0,1,226.92887,-70.453899)"
x1="-61.471992"
y1="208.40015"
x2="-52.248871"
y2="224.28619" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4992"
id="linearGradient4986"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8245614,0,0,1,225.00896,-68.355136)"
x1="-47.505936"
y1="221.68723"
x2="-56.489384"
y2="202.32527" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4977"
id="linearGradient5011"
gradientUnits="userSpaceOnUse"
x1="-131.41586"
y1="199.4256"
x2="-125.32622"
y2="216.22539"
gradientTransform="matrix(0.40495803,0,0,0.40495803,146.66448,176.80023)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4851"
id="linearGradient5305"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.40495803,0,0,0.40495803,71.206797,177.92807)"
x1="-134.1552"
y1="187.01805"
x2="-125.32622"
y2="216.22539" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4978"
id="linearGradient5309"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8245614,0,0,1,77.145743,4.2945512)"
x1="-53.819473"
y1="237.63091"
x2="-52.285004"
y2="209.06267" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4851"
id="linearGradient5311"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8245614,0,0,1,156.2106,-19.317359)"
x1="-52.407578"
y1="211.81105"
x2="-56.196835"
y2="236.80499" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4851"
id="linearGradient5315"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.40495803,0,0,0.40495803,71.206797,177.92807)"
x1="-43.361553"
y1="209.01698"
x2="-84.406708"
y2="287.03156" />
<linearGradient
inkscape:collect="always"
id="linearGradient3883">
<stop
style="stop-color:#dddbd8;stop-opacity:1"
offset="0"
id="stop3879" />
<stop
style="stop-color:#f5f4f2;stop-opacity:1"
offset="1"
id="stop3881" />
</linearGradient>
<linearGradient
id="linearGradient3094"
inkscape:collect="always">
<stop
id="stop3090"
offset="0"
style="stop-color:#0b394d;stop-opacity:1;" />
<stop
id="stop3092"
offset="1"
style="stop-color:#0b394d;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient2639"
inkscape:collect="always">
<stop
id="stop2635"
offset="0"
style="stop-color:#fe6a2d;stop-opacity:1" />
<stop
id="stop2637"
offset="1"
style="stop-color:#9b0101;stop-opacity:1" />
</linearGradient>
<clipPath
id="clipPath2609"
clipPathUnits="userSpaceOnUse">
<rect
ry="10.056858"
rx="10.056858"
y="-85.398689"
x="1592.8157"
height="58.391529"
width="90.441025"
id="rect2611"
style="opacity:1;vector-effect:none;fill:#3d83cf;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" />
</clipPath>
<linearGradient
gradientUnits="userSpaceOnUse"
y2="246.60634"
x2="643.51672"
y1="257.47424"
x1="643.51672"
id="linearGradient1561-1"
xlink:href="#linearGradient3883"
inkscape:collect="always" />
<filter
height="1.1218587"
y="-0.060929373"
width="1.0463915"
x="-0.02319574"
id="filter3130-5"
style="color-interpolation-filters:sRGB"
inkscape:collect="always">
<feGaussianBlur
id="feGaussianBlur3132-3"
stdDeviation="0.45051951"
inkscape:collect="always" />
</filter>
<linearGradient
gradientTransform="matrix(1,0,-0.26717917,-0.37367534,29.058353,152.44235)"
gradientUnits="userSpaceOnUse"
y2="166.3714"
x2="1384.7688"
y1="-3.469604"
x1="1362.2035"
id="linearGradient3096-8"
xlink:href="#linearGradient3094"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="-94.958282"
x2="1617.5334"
y1="-135.36632"
x1="1615.9795"
id="linearGradient2641-1"
xlink:href="#linearGradient2639"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="-549.33533"
x2="1543.2006"
y1="-489.51007"
x1="1540.6981"
id="linearGradient2649-6"
xlink:href="#linearGradient4977"
inkscape:collect="always"
gradientTransform="matrix(0.39357722,0,0,0.39357722,-545.58139,422.10485)" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="-869.45026"
x2="1369.0061"
y1="-928.71313"
x1="1365.6919"
id="linearGradient2657-3"
xlink:href="#linearGradient4851"
inkscape:collect="always"
gradientTransform="matrix(0.39357722,0,0,0.39357722,-417.74238,548.92883)" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="-1259.3573"
x2="1095.538"
y1="-1193.1265"
x1="1094.515"
id="linearGradient2665-6"
xlink:href="#linearGradient4851"
inkscape:collect="always"
gradientTransform="matrix(0.39357722,0,0,0.39357722,-261.43492,638.34422)" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="-1459.3491"
x2="748.05066"
y1="-1503.9033"
x1="745.37823"
id="linearGradient2673-8"
xlink:href="#linearGradient5327"
inkscape:collect="always"
gradientTransform="matrix(0.39357722,0,0,0.39357722,-87.311101,684.2575)" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="-1645.3777"
x2="352.32254"
y1="-1596.4655"
x1="361.24866"
id="linearGradient2681-9"
xlink:href="#linearGradient5327"
inkscape:collect="always"
gradientTransform="matrix(0.39357722,0,0,0.39357722,92.762826,683.53977)" />
<clipPath
id="clipPath2609-4"
clipPathUnits="userSpaceOnUse">
<rect
ry="10.056858"
rx="10.056858"
y="-85.398689"
x="1592.8157"
height="58.391529"
width="90.441025"
id="rect2611-0"
style="opacity:1;vector-effect:none;fill:#3d83cf;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4977"
id="linearGradient5566"
gradientUnits="userSpaceOnUse"
x1="1615.9795"
y1="-135.36632"
x2="1617.5334"
y2="-94.958282"
gradientTransform="matrix(0.39357722,0,0,0.39357722,-636.23993,266.51512)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4851"
id="linearGradient5674"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.39357722,0,0,0.39357722,-417.74238,548.92883)"
x1="1365.6919"
y1="-928.71313"
x2="1368.8816"
y2="-878.95062" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4851"
id="linearGradient5676"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.39357722,0,0,0.39357722,-261.43492,638.34422)"
x1="1094.515"
y1="-1193.1265"
x2="1098.1172"
y2="-1263.8123" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5327"
id="linearGradient5678"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.39357722,0,0,0.39357722,92.762826,683.53977)"
x1="361.24866"
y1="-1596.4655"
x2="352.32254"
y2="-1645.3777" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4851"
id="linearGradient5694"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.39357722,0,0,0.39357722,-261.43492,638.34422)"
x1="1094.515"
y1="-1193.1265"
x2="1098.1172"
y2="-1263.8123" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.0273438"
inkscape:cx="34.014139"
inkscape:cy="85.816088"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1366"
inkscape:window-height="712"
inkscape:window-x="0"
inkscape:window-y="28"
inkscape:window-maximized="1"
inkscape:snap-global="false"
units="px" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Gradient Saver Icon</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Hadiid Pratama</dc:title>
</cc:Agent>
</dc:creator>
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-nc/4.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-nc/4.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:prohibits
rdf:resource="http://creativecommons.org/ns#CommercialUse" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-229.26665)">
<g
id="g226"
transform="translate(-4.7231367,-1.696596)">
<path
style="opacity:0.66799999;vector-effect:none;fill:none;fill-opacity:1;stroke:none;stroke-width:1.62901139;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;filter:url(#filter3130-5)"
d="m 1365.4604,94.01541 c -0.7804,0 -1.241,0.234791 -1.0325,0.526396 l 4.7725,6.674764 -3.582,0.3862 c -0.8145,0.0879 -1.363,0.36813 -1.4493,0.69362 -0.027,0.0194 -0.053,0.0388 -0.075,0.0593 -0.1454,0.13326 -0.1905,0.28935 -0.115,0.45823 0,0 2e-4,1.9e-4 2e-4,1.9e-4 0.013,0.0337 0.034,0.0681 0.06,0.10273 l 5.6074,7.84226 c 0.05,0.0694 0.1169,0.13701 0.1986,0.20238 0,0 2e-4,1.9e-4 2e-4,1.9e-4 0.1644,0.13066 0.3904,0.25203 0.6592,0.35859 0.2019,0.08 0.424,0.15162 0.6691,0.2128 0.5654,0.14275 1.2217,0.22825 1.8718,0.22825 h 35.4505 c 0.093,-10e-6 0.1828,-0.002 0.2714,-0.005 0.2636,-0.0102 0.5048,-0.0355 0.7186,-0.0734 0.071,-0.0126 0.1394,-0.0267 0.2044,-0.0421 0.065,-0.0153 0.1267,-0.0323 0.1852,-0.0502 0.117,-0.0359 0.2203,-0.077 0.3091,-0.12223 0.2664,-0.13583 0.4003,-0.31088 0.3673,-0.5069 -0.01,-0.0327 -0.016,-0.0659 -0.031,-0.0996 -0.013,-0.0338 -0.034,-0.068 -0.06,-0.10273 l -1.7115,-2.39388 -2.1839,-3.05449 -1.7117,-2.39389 c -0.025,-0.0347 -0.049,-0.0692 -0.087,-0.10292 -0.033,-0.0338 -0.071,-0.067 -0.1115,-0.0996 -0.1645,-0.13073 -0.3903,-0.25198 -0.6593,-0.35859 -0.1345,-0.0533 -0.2798,-0.10301 -0.4344,-0.1483 -0.1537,-0.0453 -0.3151,-0.0863 -0.4838,-0.12224 0,0 -5e-4,0 -5e-4,0 -0.085,-0.0179 -0.1699,-0.0346 -0.2563,-0.05 0,0 -6e-4,0 -6e-4,0 -0.087,-0.0154 -0.1754,-0.0295 -0.2642,-0.0421 0,0 -6e-4,0 -6e-4,0 -0.2676,-0.0379 -0.5445,-0.0631 -0.823,-0.0734 0,0 -5e-4,0 -5e-4,0 -0.091,-0.003 -0.1849,-0.005 -0.2776,-0.005 h -5e-4 -1.3436 l -0.4127,-0.28792 -1.2344,-0.8622 c -0.2629,-0.18344 -0.7316,-0.31729 -1.2196,-0.36786 0.1127,-0.15515 -0.014,-0.34839 -0.3868,-0.512876 l -3.3931,-1.501175 c -0.3716,-0.164436 -0.8912,-0.257825 -1.3664,-0.263004 0,-0.01412 -0.01,-0.02836 -0.011,-0.04268 8e-4,-0.0059 0,-0.01166 0,-0.01757 10e-5,-7.23e-4 10e-5,-0.0011 -0.01,-0.0019 -0.062,-0.153559 -0.3058,-0.313129 -0.7073,-0.431393 l -4.1571,-1.225809 c -0.4553,-0.13428 -0.9904,-0.180421 -1.4201,-0.139807 -0.01,-0.0087 -0.012,-0.01741 -0.018,-0.02608 -0.03,-0.0287 -0.06,-0.05691 -0.099,-0.08477 -0.01,-0.0071 -0.019,-0.01405 -0.029,-0.02104 -0.041,-0.02773 -0.086,-0.05499 -0.1391,-0.0811 -0.1806,-0.09206 -0.4333,-0.172313 -0.7282,-0.227476 l -4.6375,-0.866642 c -0.5082,-0.09498 -1.0223,-0.09104 -1.3778,-0.0073 -0.019,-0.0099 -0.031,-0.01951 -0.047,-0.02915 -0.042,-0.02496 -0.089,-0.04916 -0.1403,-0.07241 -0.012,-0.0039 -0.013,-0.0081 -0.024,-0.01196 -0.063,-0.02608 -0.1242,-0.0504 -0.1935,-0.07357 -0.052,-0.01835 -0.113,-0.03595 -0.1693,-0.05214 -3e-4,-3.74e-4 10e-5,-7.23e-4 2e-4,-0.0015 -0.1984,-0.0536 -0.4223,-0.09456 -0.6608,-0.116829 l -4.8017,-0.448769 c -0.5254,-0.04909 -0.9827,0.0045 -1.2396,0.125132 -0.01,-0.0026 -0.015,-0.0052 -0.023,-0.0079 -0.01,-0.0068 -0.037,-0.01312 -0.046,-0.01969 -0.059,-0.02074 -0.1157,-0.04038 -0.1681,-0.05871 -0.018,-0.0065 -0.046,-0.01255 -0.064,-0.01872 -0.056,-0.01555 -0.1122,-0.02975 -0.1713,-0.04306 -0.038,-0.0086 -0.076,-0.0173 -0.1133,-0.02492 -0.02,-0.0033 -0.033,-0.0065 -0.049,-0.0095 -0.07,-0.0127 -0.1414,-0.02354 -0.2141,-0.03284 -0.014,-0.0015 -0.025,-0.003 -0.036,-0.0045 -0.078,-0.0092 -0.1542,-0.01629 -0.2326,-0.02123 -3e-4,-1.83e-4 -0.012,-7.23e-4 -0.012,-7.23e-4 v 0 c 0,0 -5e-4,1.91e-4 -5e-4,1.91e-4 -0.08,-0.0048 -0.1603,-0.0079 -0.2406,-0.0079 z"
id="path140"
inkscape:connector-curvature="0"
inkscape:transform-center-y="-7.3219625"
inkscape:transform-center-x="3.5474848"
transform="matrix(-1.0159411,0,0,0.83457554,1450.0893,194.42636)" />
<g
id="g108">
<path
inkscape:connector-curvature="0"
id="path5277"
d="m 32.026687,256.94379 c 1.01979,0.89055 2.70444,2.74573 4.10309,4.082 h 11.51227 c 0.95662,0 1.72654,0.92699 1.72654,2.07834 v 20.76027 c 0,1.15134 -0.76992,2.078 -1.72654,2.078 h -29.96732 c -0.95661,0 -1.72681,-0.92666 -1.72681,-2.078 v -4.08201 -16.67826 -4.08202 c 0,-1.15134 0.7702,-2.07832 1.72681,-2.07832 z"
style="opacity:1;fill:url(#linearGradient5305);fill-opacity:1;stroke:none;stroke-width:5.29166698;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke" />
<g
id="g5672"
transform="translate(21.664226,27.145537)">
<g
id="g5692"
transform="matrix(1.0615763,0,0,1.0615763,0.14058954,-15.029605)"
style="stroke-width:0.94199538">
<rect
style="opacity:1;vector-effect:none;fill:url(#linearGradient5566);fill-opacity:1;stroke:none;stroke-width:1.41299284;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
id="rect2615-1"
width="7.575388"
height="30.240459"
x="-2.1066508"
y="212.28931"
rx="1.4310507"
ry="1.4310507" />
<path
id="rect2771-2"
d="m 4.2772194,212.31071 c -0.1958741,0.17826 -0.3454332,0.41238 -0.4193576,0.68827 l -5.9644127,22.25932 v 5.8405 c 0,0.0437 0.00255,0.0867 0.00643,0.12936 l 4.4366992,1.1889 c 0.7657856,0.2052 1.5473532,-0.24613 1.7525436,-1.01191 l 1.3796344,-5.14891 v -22.53582 c 0,-0.71093 -0.5138192,-1.29614 -1.1915118,-1.40971 z"
style="opacity:0.072;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.41299295;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:connector-curvature="0" />
<rect
ry="1.4310507"
rx="1.4310507"
y="203.67245"
x="59.982849"
height="30.240459"
width="7.575388"
id="rect2617-8"
style="opacity:1;vector-effect:none;fill:url(#linearGradient2649-6);fill-opacity:1;stroke:none;stroke-width:1.41299284;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:transform-center-y="-31.186035"
transform="rotate(15)"
inkscape:transform-center-x="-8.3563328" />
<path
id="rect2773-9"
d="m 11.572926,214.03246 c -0.393519,0.0754 -0.753243,0.31411 -0.970224,0.68993 l -11.26801895,19.51689 -1.56632555,5.84571 c -0.042118,0.15715 -0.055255,0.31455 -0.045017,0.46793 l 3.23713258,1.86888 1.68906372,0.45253 c 0.3353405,-0.10159 0.6346651,-0.32511 0.8244981,-0.65392 l 2.9198911,-5.05721 5.77771,-21.56299 c 0.164698,-0.61466 -0.09438,-1.23894 -0.59871,-1.56775 z"
style="opacity:0.072;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.41299295;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:connector-curvature="0" />
<rect
inkscape:transform-center-x="-16.143173"
transform="rotate(30)"
inkscape:transform-center-y="-27.960618"
style="opacity:1;vector-effect:none;fill:url(#linearGradient5674);fill-opacity:1;stroke:none;stroke-width:1.41299284;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
id="rect2619-3"
width="7.575388"
height="30.240459"
x="117.72649"
y="179.27925"
rx="1.4310507"
ry="1.4310507" />
<path
id="rect2775-6"
d="m 17.683283,217.71241 c -0.365801,0 -0.731626,0.14025 -1.011917,0.42055 l -15.78529029,15.78528 -2.97627451,5.15507 c -0.1559156,0.27006 -0.2130632,0.5686 -0.1848109,0.85578 l 1.63243777,1.63243 2.79905733,1.61608 c 0.1863394,-0.0697 0.3616641,-0.17828 0.5119996,-0.32862 l 4.279619,-4.27962 11.211405,-19.4188 c 0.246508,-0.42696 0.248885,-0.92538 0.05069,-1.33674 -0.169005,-0.0671 -0.347896,-0.10141 -0.52692,-0.10141 z"
style="opacity:0.072;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.41299295;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:connector-curvature="0" />
<rect
ry="1.4310507"
rx="1.4310507"
y="140.77209"
x="167.18912"
height="30.240459"
width="7.575388"
id="rect2621-8"
style="opacity:1;vector-effect:none;fill:url(#linearGradient5694);fill-opacity:1;stroke:none;stroke-width:1.41299284;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:transform-center-y="-22.829713"
transform="rotate(45)"
inkscape:transform-center-x="-22.829829" />
<path
id="rect2777-0"
d="m 22.328484,222.8054 c -0.230592,0.006 -0.463295,0.0685 -0.67785,0.19239 l -19.4190475,11.21164 -3.9232803,3.92328 c -0.3915541,0.39155 -0.5086758,0.94976 -0.3532575,1.44194 l 0.3056446,0.52906 c 0.015928,0.0176 0.030654,0.0359 0.047613,0.0528 l 3.1947359,3.19473 c 0.076472,-0.0281 0.1519974,-0.0616 0.2250726,-0.10378 l 5.1550659,-2.97628 16.1411553,-16.14115 c 0.237871,-0.23787 0.373637,-0.53753 0.409641,-0.8463 -0.283955,-0.31965 -0.691327,-0.48954 -1.105493,-0.47836 z"
style="opacity:0.072;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.41299295;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:connector-curvature="0" />
<rect
inkscape:transform-center-x="-27.960727"
transform="rotate(60)"
inkscape:transform-center-y="-16.143018"
style="opacity:1;vector-effect:none;fill:url(#linearGradient2673-8);fill-opacity:1;stroke:none;stroke-width:1.41299284;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
id="rect2623-2"
width="7.575388"
height="30.240459"
x="204.99998"
y="90.775146"
rx="1.4310507"
ry="1.4310507" />
<path
id="rect2779-1"
d="m 25.629824,228.93732 c -0.1408,-0.005 -0.28501,0.01 -0.428601,0.0483 l -22.0494031,5.90826 -4.2151809,2.43348 c -0.6865843,0.3964 -0.9200029,1.2683 -0.5236086,1.95489 l 2.35648161,4.08178 c 0.00182,0.003 0.004124,0.006 0.005944,0.009 l 5.30053709,-1.42014 20.3587019,-11.7542 c 0.18213,-0.10516 0.331531,-0.24423 0.446603,-0.40396 -0.220815,-0.50756 -0.710664,-0.83658 -1.251449,-0.85744 z"
style="opacity:0.072;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.41299295;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:connector-curvature="0" />
<rect
ry="1.4310507"
rx="1.4310507"
y="32.695652"
x="228.58229"
height="30.240459"
width="7.575388"
id="rect2625-0"
style="opacity:1;vector-effect:none;fill:url(#linearGradient5678);fill-opacity:1;stroke:none;stroke-width:1.41299284;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:transform-center-y="-8.3562031"
transform="rotate(75)"
inkscape:transform-center-x="-31.186109" />
<path
id="rect2810-5"
d="m 14.997144,233.2388 c 0,0 -1.018353,0.10729 -2.407435,0.81561 -1.013978,0.51705 -2.306717,1.63862 -3.1433504,1.86637 -3.1283181,0.85159 -9.69421033,0.79155 -9.69421033,0.79155 -0.76578557,0.20519 -1.21710747,0.98676 -1.01191707,1.75255 l 1.21993397,4.55279 c 0.20519045,0.76579 0.98677017,1.21711 1.75255573,1.01192 l 26.4455981,-7.08626 c 0.765786,-0.20519 1.217108,-0.98676 1.011917,-1.75255 l -0.591856,-2.2084 z"
style="opacity:0.07099998;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.41299295;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csscccccccc" />
</g>
</g>
<path
style="opacity:0.66799999;vector-effect:none;fill:url(#linearGradient3096-8);fill-opacity:1;stroke:none;stroke-width:1.62901139;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;filter:url(#filter3130-5)"
d="m 1365.4604,94.01541 c -0.7804,0 -1.241,0.234791 -1.0325,0.526396 l 4.7725,6.674764 -3.582,0.3862 c -0.8145,0.0879 -1.363,0.36813 -1.4493,0.69362 -0.027,0.0194 -0.053,0.0388 -0.075,0.0593 -0.1454,0.13326 -0.1905,0.28935 -0.115,0.45823 0,0 2e-4,1.9e-4 2e-4,1.9e-4 0.013,0.0337 0.034,0.0681 0.06,0.10273 l 5.6074,7.84226 c 0.05,0.0694 0.1169,0.13701 0.1986,0.20238 0,0 2e-4,1.9e-4 2e-4,1.9e-4 0.1644,0.13066 0.3904,0.25203 0.6592,0.35859 0.2019,0.08 0.424,0.15162 0.6691,0.2128 0.5654,0.14275 1.2217,0.22825 1.8718,0.22825 h 35.4505 c 0.093,-10e-6 0.1828,-0.002 0.2714,-0.005 0.2636,-0.0102 0.5048,-0.0355 0.7186,-0.0734 0.071,-0.0126 0.1394,-0.0267 0.2044,-0.0421 0.065,-0.0153 0.1267,-0.0323 0.1852,-0.0502 0.117,-0.0359 0.2203,-0.077 0.3091,-0.12223 0.2664,-0.13583 0.4003,-0.31088 0.3673,-0.5069 -0.01,-0.0327 -0.016,-0.0659 -0.031,-0.0996 -0.013,-0.0338 -0.034,-0.068 -0.06,-0.10273 l -1.7115,-2.39388 -2.1839,-3.05449 -1.7117,-2.39389 c -0.025,-0.0347 -0.049,-0.0692 -0.087,-0.10292 -0.033,-0.0338 -0.071,-0.067 -0.1115,-0.0996 -0.1645,-0.13073 -0.3903,-0.25198 -0.6593,-0.35859 -0.1345,-0.0533 -0.2798,-0.10301 -0.4344,-0.1483 -0.1537,-0.0453 -0.3151,-0.0863 -0.4838,-0.12224 0,0 -5e-4,0 -5e-4,0 -0.085,-0.0179 -0.1699,-0.0346 -0.2563,-0.05 0,0 -6e-4,0 -6e-4,0 -0.087,-0.0154 -0.1754,-0.0295 -0.2642,-0.0421 0,0 -6e-4,0 -6e-4,0 -0.2676,-0.0379 -0.5445,-0.0631 -0.823,-0.0734 0,0 -5e-4,0 -5e-4,0 -0.091,-0.003 -0.1849,-0.005 -0.2776,-0.005 h -5e-4 -1.3436 l -0.4127,-0.28792 -1.2344,-0.8622 c -0.2629,-0.18344 -0.7316,-0.31729 -1.2196,-0.36786 0.1127,-0.15515 -0.014,-0.34839 -0.3868,-0.512876 l -3.3931,-1.501175 c -0.3716,-0.164436 -0.8912,-0.257825 -1.3664,-0.263004 0,-0.01412 -0.01,-0.02836 -0.011,-0.04268 8e-4,-0.0059 0,-0.01166 0,-0.01757 10e-5,-7.23e-4 10e-5,-0.0011 -0.01,-0.0019 -0.062,-0.153559 -0.3058,-0.313129 -0.7073,-0.431393 l -4.1571,-1.225809 c -0.4553,-0.13428 -0.9904,-0.180421 -1.4201,-0.139807 -0.01,-0.0087 -0.012,-0.01741 -0.018,-0.02608 -0.03,-0.0287 -0.06,-0.05691 -0.099,-0.08477 -0.01,-0.0071 -0.019,-0.01405 -0.029,-0.02104 -0.041,-0.02773 -0.086,-0.05499 -0.1391,-0.0811 -0.1806,-0.09206 -0.4333,-0.172313 -0.7282,-0.227476 l -4.6375,-0.866642 c -0.5082,-0.09498 -1.0223,-0.09104 -1.3778,-0.0073 -0.019,-0.0099 -0.031,-0.01951 -0.047,-0.02915 -0.042,-0.02496 -0.089,-0.04916 -0.1403,-0.07241 -0.012,-0.0039 -0.013,-0.0081 -0.024,-0.01196 -0.063,-0.02608 -0.1242,-0.0504 -0.1935,-0.07357 -0.052,-0.01835 -0.113,-0.03595 -0.1693,-0.05214 -3e-4,-3.74e-4 10e-5,-7.23e-4 2e-4,-0.0015 -0.1984,-0.0536 -0.4223,-0.09456 -0.6608,-0.116829 l -4.8017,-0.448769 c -0.5254,-0.04909 -0.9827,0.0045 -1.2396,0.125132 -0.01,-0.0026 -0.015,-0.0052 -0.023,-0.0079 -0.01,-0.0068 -0.037,-0.01312 -0.046,-0.01969 -0.059,-0.02074 -0.1157,-0.04038 -0.1681,-0.05871 -0.018,-0.0065 -0.046,-0.01255 -0.064,-0.01872 -0.056,-0.01555 -0.1122,-0.02975 -0.1713,-0.04306 -0.038,-0.0086 -0.076,-0.0173 -0.1133,-0.02492 -0.02,-0.0033 -0.033,-0.0065 -0.049,-0.0095 -0.07,-0.0127 -0.1414,-0.02354 -0.2141,-0.03284 -0.014,-0.0015 -0.025,-0.003 -0.036,-0.0045 -0.078,-0.0092 -0.1542,-0.01629 -0.2326,-0.02123 -3e-4,-1.83e-4 -0.012,-7.23e-4 -0.012,-7.23e-4 v 0 c 0,0 -5e-4,1.91e-4 -5e-4,1.91e-4 -0.08,-0.0048 -0.1603,-0.0079 -0.2406,-0.0079 z"
id="rect2977-7"
inkscape:connector-curvature="0"
inkscape:transform-center-y="-7.3219625"
inkscape:transform-center-x="3.5474848"
transform="matrix(1.0159411,0,0,0.83457554,-1376.5639,194.42636)" />
<path
inkscape:connector-curvature="0"
id="path5289"
d="m 36.115727,260.49398 c -0.86895,0.59707 -1.34094,1.48038 -3.428115,2.87126 -0.380703,0.2537 -2.981025,0.21653 -3.746995,0.21176 h -10.91469 c -1.15136,0 -2.07801,0.92699 -2.07801,2.07833 v 20.76027 c 0,1.15135 0.92665,2.078 2.07801,2.078 h 36.06755 c 1.15135,0 2.07833,-0.92665 2.07833,-2.078 v -4.08201 -16.67826 -4.08201 c 0,-1.15135 -0.92698,-2.07832 -2.07833,-2.07832 H 39.945486 c -1.68704,0 -2.960809,0.40188 -3.829759,0.99898 z"
style="opacity:1;fill:url(#linearGradient5315);fill-opacity:1;stroke:none;stroke-width:5.29166698;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke"
sodipodi:nodetypes="zscssssssccsscz" />
<path
inkscape:connector-curvature="0"
id="path5275-0"
d="m 38.745599,266.74442 a 1.346382,1.346382 0 0 0 -1.32602,1.36425 v 9.59839 l -1.68724,-1.67484 a 1.346382,1.346382 0 0 0 -0.96686,-0.40462 1.346382,1.346382 0 0 0 -0.93018,2.31458 l 3.78272,3.75533 a 1.346382,1.346382 0 0 0 0.68885,0.53537 1.346382,1.346382 0 0 0 0.92087,-0.001 1.346382,1.346382 0 0 0 0.68678,-0.53537 l 3.7822,-3.75428 a 1.346382,1.346382 0 0 0 -0.96997,-2.31459 1.346382,1.346382 0 0 0 -0.92759,0.40463 l -1.68724,1.67535 v -9.5989 a 1.346382,1.346382 0 0 0 -1.36632,-1.36426 z m 9.32759,0 a 1.346382,1.346382 0 0 0 -0.43408,0.0806 1.346382,1.346382 0 0 0 -0.65009,0.4837 l -3.82612,3.79821 a 1.346405,1.346405 0 1 0 1.89704,1.911 l 1.68775,-1.67535 v 9.59786 a 1.346382,1.346382 0 1 0 2.69183,0 v -9.59786 l 1.68775,1.67535 a 1.3464068,1.3464068 0 1 0 1.89704,-1.911 l -3.82871,-3.80028 a 1.346382,1.346382 0 0 0 -0.59737,-0.46457 1.346382,1.346382 0 0 0 -0.52504,-0.0977 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.29166651;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers fill stroke;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</g>
</g>
<rect
style="opacity:0;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
id="rect4254"
width="67.733337"
height="67.733337"
x="-119.13585"
y="205.91806"
rx="1.3047903"
ry="1.3047903" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -0,0 +1,4 @@
<?xml version='1.0' encoding='utf-8'?>
<svg xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:cc="http://creativecommons.org/ns#" xmlns:ccOLD="http://web.resource.org/cc/" xmlns:svg="http://www.w3.org/2000/svg" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs/>
</svg>

After

Width:  |  Height:  |  Size: 457 B