02021-01-20 stream
This commit is contained in:
commit
13d0f27d7d
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
__pycache__
|
184
GIMPCommand.py
Normal file
184
GIMPCommand.py
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
import FreeCAD
|
||||||
|
import FreeCADGui as Gui
|
||||||
|
import subprocess
|
||||||
|
import PySide
|
||||||
|
import re
|
||||||
|
from PySide import QtGui
|
||||||
|
from PySide import QtCore
|
||||||
|
|
||||||
|
class Tool():
|
||||||
|
def __init__(self, name, *, start_command_and_args, xwininfo_filter_re, extra_xprop_filter):
|
||||||
|
self.name = name
|
||||||
|
self.start_command_and_args = start_command_and_args
|
||||||
|
self.xwininfo_filter_re = re.compile(xwininfo_filter_re)
|
||||||
|
self.extra_xprop_filter = extra_xprop_filter
|
||||||
|
|
||||||
|
class Tools():
|
||||||
|
def __init__(self, *tools):
|
||||||
|
self.__dict__ = {tool.name: tool for tool in tools}
|
||||||
|
def __getitem__(self, k): return self.__dict__[k]
|
||||||
|
|
||||||
|
# tool-specific infos:
|
||||||
|
tools = Tools(
|
||||||
|
Tool('Mousepad',
|
||||||
|
start_command_and_args = ['mousepad', '--disable-server'],
|
||||||
|
xwininfo_filter_re = r'mousepad',
|
||||||
|
extra_xprop_filter = lambda processId, windowId, i: True),
|
||||||
|
Tool('Inkscape',
|
||||||
|
start_command_and_args = ['inkscape'],
|
||||||
|
xwininfo_filter_re = r'inkscape',
|
||||||
|
extra_xprop_filter = lambda processId, windowId, i: x11prop(windowId, 'WM_STATE', 'WM_STATE') is not None),
|
||||||
|
Tool('GIMP',
|
||||||
|
start_command_and_args = ['env', '-i', 'DISPLAY=:0', '/home/suzanne/perso/dotfiles/nix/result/bin/gimp', '--new-instance'],
|
||||||
|
xwininfo_filter_re = r'gimp',
|
||||||
|
extra_xprop_filter = lambda processId, windowId, i: x11prop(windowId, 'WM_STATE', 'WM_STATE') is not None))
|
||||||
|
|
||||||
|
class EmbeddedWindow(QtCore.QObject):
|
||||||
|
def __init__(self, tool, externalAppInstance, processId, windowId):
|
||||||
|
super(EmbeddedWindow, self).__init__()
|
||||||
|
self.tool = tool
|
||||||
|
self.externalAppInstance = externalAppInstance
|
||||||
|
self.processId = processId
|
||||||
|
self.windowId = windowId
|
||||||
|
self.mdi = Gui.getMainWindow().findChild(QtGui.QMdiArea)
|
||||||
|
self.xw = QtGui.QWindow.fromWinId(self.windowId)
|
||||||
|
self.xw.setFlags(QtGui.Qt.FramelessWindowHint)
|
||||||
|
self.xwd = QtGui.QWidget.createWindowContainer(self.xw)
|
||||||
|
self.mwx = QtGui.QMainWindow()
|
||||||
|
self.mwx.layout().addWidget(self.xwd)
|
||||||
|
self.mdiSub = self.mdi.addSubWindow(self.xwd)
|
||||||
|
self.xwd.setBaseSize(640,480)
|
||||||
|
self.mwx.setBaseSize(640,480)
|
||||||
|
self.mdiSub.setBaseSize(640,480)
|
||||||
|
self.mdiSub.setWindowTitle(tool.name)
|
||||||
|
self.mdiSub.show()
|
||||||
|
#self.xw.installEventFilter(self)
|
||||||
|
def eventFilter(self, obj, event):
|
||||||
|
# This doesn't seem to work, some events occur but no the close one.
|
||||||
|
if event.type() == QtCore.QEvent.Close:
|
||||||
|
mdiSub.close()
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
# <optional spaces> <digits (captured in group 1)> <optional spaces> "<quoted string>" <optional spaces> : <anything>
|
||||||
|
xwininfo_re = re.compile(r'^\s*([0-9]+)\s*"[^"]*"\s*:.*$')
|
||||||
|
|
||||||
|
def x11stillAlive(windowId):
|
||||||
|
try:
|
||||||
|
subprocess.check_output(['xprop', '-id', str(windowId), '_NET_WM_PID'])
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def x11prop(windowId, prop, type):
|
||||||
|
try:
|
||||||
|
output = subprocess.check_output(['xprop', '-id', str(windowId), prop]).decode('utf-8', 'ignore').split('\n')
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
output = []
|
||||||
|
xprop_re = re.compile(r'^' + re.escape(prop) + r'\(' + re.escape(type) + r'\)((:)| =(.*))$')
|
||||||
|
for line in output:
|
||||||
|
trymatch = xprop_re.match(line)
|
||||||
|
if trymatch:
|
||||||
|
return trymatch.group(2) or trymatch.group(3)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def try_pipe_lines(commandAndArguments):
|
||||||
|
try:
|
||||||
|
return subprocess.check_output(commandAndArguments).decode('utf-8', 'ignore').split('\n')
|
||||||
|
except:
|
||||||
|
return []
|
||||||
|
|
||||||
|
class ExternalApps():
|
||||||
|
def __init__(self):
|
||||||
|
setattr(FreeCAD, 'ExternalApps', self)
|
||||||
|
|
||||||
|
def deleted(widget):
|
||||||
|
"""Detect RuntimeError: Internal C++ object (PySide2.QtGui.QWindow) already deleted."""
|
||||||
|
try:
|
||||||
|
str(widget) # str fails on already-deleted Qt wrappers.
|
||||||
|
return False
|
||||||
|
except:
|
||||||
|
return True
|
||||||
|
|
||||||
|
class ExternalAppInstance(QtCore.QObject):
|
||||||
|
def __init__(self, toolName):
|
||||||
|
super(ExternalAppInstance, self).__init__()
|
||||||
|
self.tool = tools[toolName]
|
||||||
|
# Start the application
|
||||||
|
# TODO: popen_process shouldn't be exposed to in-document scripts, it would allow them to redirect output etc.
|
||||||
|
print('Starting ' + ' '.join(self.tool.start_command_and_args))
|
||||||
|
self.popen_process = subprocess.Popen(self.tool.start_command_and_args)
|
||||||
|
self.toolProcessIds = [self.popen_process.pid]
|
||||||
|
self.initWaitForWindow()
|
||||||
|
self.foundWindows = dict()
|
||||||
|
setattr(FreeCAD.ExternalApps, self.tool.name, self)
|
||||||
|
|
||||||
|
def initWaitForWindow(self):
|
||||||
|
self.TimeoutHasOccurred = False # for other scritps to know the status
|
||||||
|
self.startupTimeout = 10000
|
||||||
|
self.elapsed = QtCore.QElapsedTimer()
|
||||||
|
self.elapsed.start()
|
||||||
|
self.timer = QtCore.QTimer(self)
|
||||||
|
self.timer.timeout.connect(self.attemptToFindWindow)
|
||||||
|
|
||||||
|
def waitForWindow(self):
|
||||||
|
self.timer.start(50)
|
||||||
|
|
||||||
|
@QtCore.Slot()
|
||||||
|
def attemptToFindWindow(self):
|
||||||
|
try:
|
||||||
|
self.attemptToFindWindowWrapped()
|
||||||
|
except:
|
||||||
|
self.timer.stop()
|
||||||
|
raise
|
||||||
|
|
||||||
|
def attemptToFindWindowWrapped(self):
|
||||||
|
# use decode('utf-8', 'ignore') to use strings instead of byte strings and discard ill-formed unicode in case these tool doesn't sanitize their output
|
||||||
|
for line in try_pipe_lines(['xwininfo', '-root', '-tree', '-int']):
|
||||||
|
if self.tool.xwininfo_filter_re.search(line):
|
||||||
|
windowId = int(xwininfo_re.match(line).group(1))
|
||||||
|
# use decode('utf-8', 'ignore') to use strings instead of byte strings and discard ill-formed unicode in case this tool doesn't sanitize their output
|
||||||
|
xprop_try_process_id = x11prop(windowId, '_NET_WM_PID', 'CARDINAL')
|
||||||
|
if xprop_try_process_id:
|
||||||
|
processId = int(xprop_try_process_id) # TODO try parse int and catch failure
|
||||||
|
if processId in self.toolProcessIds:
|
||||||
|
if self.tool.extra_xprop_filter(processId, windowId, len(self.foundWindows)):
|
||||||
|
self.foundWindow(processId, windowId)
|
||||||
|
|
||||||
|
if self.elapsed.elapsed() > self.startupTimeout:
|
||||||
|
self.timer.stop()
|
||||||
|
self.TimeoutHasOccurred = True
|
||||||
|
|
||||||
|
def foundWindow(self, processId, windowId):
|
||||||
|
if windowId not in self.foundWindows.keys():
|
||||||
|
self.foundWindows[windowId] = EmbeddedWindow(self.tool, self, processId, windowId)
|
||||||
|
# TODO: find an event instead of polling
|
||||||
|
for w in self.foundWindows.values():
|
||||||
|
#if not deleted(xw) and not xw.isActive():
|
||||||
|
if not x11stillAlive(w.windowId):
|
||||||
|
w.mdiSub.close()
|
||||||
|
|
||||||
|
# prevent_garbage_collect by binding to a variable???
|
||||||
|
#p = ExternalAppInstance('Mousepad')
|
||||||
|
#p = ExternalAppInstance('Inkscape')
|
||||||
|
ExternalApps()
|
||||||
|
|
||||||
|
class GIMPCommand():
|
||||||
|
def GetResources(self):
|
||||||
|
return {
|
||||||
|
'Pixmap': ':/icons/GIMP.svg',
|
||||||
|
'Accel': "Shit+G",
|
||||||
|
'MenuText': "Menu text",
|
||||||
|
'ToolTip': "Tooltip",
|
||||||
|
}
|
||||||
|
|
||||||
|
def Activated(self):
|
||||||
|
print("Command activated")
|
||||||
|
p = ExternalAppInstance('GIMP')
|
||||||
|
p.waitForWindow()
|
||||||
|
|
||||||
|
def IsActive(self):
|
||||||
|
# return false to grey out the command in the menus, toolbars etc.
|
||||||
|
return True
|
||||||
|
|
||||||
|
Gui.addCommand('GIMPCommand', GIMPCommand())
|
72
InitGui.py
Normal file
72
InitGui.py
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
import sys
|
||||||
|
|
||||||
|
class XternalAppsWorkbench(Workbench):
|
||||||
|
MenuText = "XternalApps"
|
||||||
|
ToolTip = "Embeds external Applications in FreeCAD"
|
||||||
|
Icon = """
|
||||||
|
/* XPM */
|
||||||
|
static char * icon_xpm[] = {
|
||||||
|
"16 16 15 1",
|
||||||
|
" c None",
|
||||||
|
". c #FFFFFF",
|
||||||
|
"+ c #E8E5E5",
|
||||||
|
"@ c #897578",
|
||||||
|
"# c #9B8B8D",
|
||||||
|
"$ c #75575C",
|
||||||
|
"% c #C9C3C4",
|
||||||
|
"& c #FF89DA",
|
||||||
|
"* c #FF96DA",
|
||||||
|
"= c #FFA2DA",
|
||||||
|
"- c #FFACDA",
|
||||||
|
"; c #FFB2DA",
|
||||||
|
"> c #FFEAF3",
|
||||||
|
", c #FFB9DA",
|
||||||
|
"' c #FF9DDA",
|
||||||
|
"................",
|
||||||
|
"..........+@....",
|
||||||
|
".........#$%....",
|
||||||
|
"........$$$.....",
|
||||||
|
".......%$$%.....",
|
||||||
|
".......&%.......",
|
||||||
|
"......*&........",
|
||||||
|
".....=&.........",
|
||||||
|
"....-&.....&....",
|
||||||
|
"...;&>....&&....",
|
||||||
|
"..,'&.....&&....",
|
||||||
|
"..&&.....&..&...",
|
||||||
|
".........&&&&...",
|
||||||
|
"........&...&...",
|
||||||
|
".......&.....&..",
|
||||||
|
"................"};
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(self.__class__, self).__init__()
|
||||||
|
|
||||||
|
def Initialize(self):
|
||||||
|
print('Initialize')
|
||||||
|
if sys.version_info[0] == 2:
|
||||||
|
import Resources2
|
||||||
|
else:
|
||||||
|
import Resources3
|
||||||
|
import GIMPCommand
|
||||||
|
# import commands
|
||||||
|
self.list = ['GIMPCommand']
|
||||||
|
self.appendMenu("ExternalApplications", self.list)
|
||||||
|
self.appendToolbar("ExternalApplications", self.list)
|
||||||
|
|
||||||
|
def Activated(self):
|
||||||
|
print('Activated')
|
||||||
|
pass
|
||||||
|
|
||||||
|
def Deactivated(self):
|
||||||
|
print('Deactivated')
|
||||||
|
pass
|
||||||
|
|
||||||
|
def ContextMenu(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def GetClassName(self):
|
||||||
|
return "Gui::PythonWorkbench"
|
||||||
|
|
||||||
|
Gui.addWorkbench(XternalAppsWorkbench())
|
1
LICENSE
Normal file
1
LICENSE
Normal file
|
@ -0,0 +1 @@
|
||||||
|
The contents of this repository are released under the CC0, with the exception of the GIMP logo which comes from the GIMP project and is therefore under the GPL license.
|
1406
Resources2.py
Normal file
1406
Resources2.py
Normal file
File diff suppressed because it is too large
Load Diff
1406
Resources3.py
Normal file
1406
Resources3.py
Normal file
File diff suppressed because it is too large
Load Diff
384
icons/GIMP.svg
Normal file
384
icons/GIMP.svg
Normal file
|
@ -0,0 +1,384 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
version="1.0"
|
||||||
|
width="48"
|
||||||
|
height="48"
|
||||||
|
id="svg11300">
|
||||||
|
<defs
|
||||||
|
id="defs3">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient8542">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5b676b;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop8544" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#141718;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop8546" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient8534">
|
||||||
|
<stop
|
||||||
|
style="stop-color:black;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop8536" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:black;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
id="stop8538" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient8524">
|
||||||
|
<stop
|
||||||
|
style="stop-color:white;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop8526" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:white;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
id="stop8528" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient2446">
|
||||||
|
<stop
|
||||||
|
style="stop-color:white;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop2448" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:white;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
id="stop2450" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
x1="13.236155"
|
||||||
|
y1="37.752247"
|
||||||
|
x2="7.7521091"
|
||||||
|
y2="42.282146"
|
||||||
|
id="linearGradient2452"
|
||||||
|
xlink:href="#linearGradient2446"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.755165,0.395143,-0.395143,0.755165,-25.91245,6.532586)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6963">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#696969;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop6965" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:black;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop6967" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
cx="15.415101"
|
||||||
|
cy="35.356506"
|
||||||
|
r="7.5791559"
|
||||||
|
fx="15.415101"
|
||||||
|
fy="35.356506"
|
||||||
|
id="radialGradient6969"
|
||||||
|
xlink:href="#linearGradient6963"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.572694,5.424952e-17,1.037922e-12,1.532639,-55.36682,-21.35823)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6939">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#bdbdbd;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop6941" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#e2e2e2;stop-opacity:1"
|
||||||
|
offset="0.33333334"
|
||||||
|
id="stop6947" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#a3a3a3;stop-opacity:1"
|
||||||
|
offset="0.66666669"
|
||||||
|
id="stop6949" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ddd;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop6943" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
x1="19.394735"
|
||||||
|
y1="30.001331"
|
||||||
|
x2="23.109331"
|
||||||
|
y2="33.438831"
|
||||||
|
id="linearGradient6945"
|
||||||
|
xlink:href="#linearGradient6939"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(-46.40695,-1.802856)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6951">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#6e3d09;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop6953" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ea8113;stop-opacity:1"
|
||||||
|
offset="0.24242425"
|
||||||
|
id="stop6959" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5c3307;stop-opacity:1"
|
||||||
|
offset="0.62121212"
|
||||||
|
id="stop6961" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#e07c12;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop6955" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
x1="37.017639"
|
||||||
|
y1="19.239889"
|
||||||
|
x2="27.753893"
|
||||||
|
y2="11.182488"
|
||||||
|
id="linearGradient6957"
|
||||||
|
xlink:href="#linearGradient6951"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(-49.30496,1.877723)" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6500">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#857c63;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop6502" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#221f19;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop6504" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6492">
|
||||||
|
<stop
|
||||||
|
style="stop-color:black;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop6494" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:black;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
id="stop6496" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6482">
|
||||||
|
<stop
|
||||||
|
style="stop-color:black;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop6484" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:black;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
id="stop6486" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6468">
|
||||||
|
<stop
|
||||||
|
style="stop-color:white;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop6470" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#b9b9b0;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop6472" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient6452">
|
||||||
|
<stop
|
||||||
|
style="stop-color:white;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop6454" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:white;stop-opacity:0"
|
||||||
|
offset="1"
|
||||||
|
id="stop6456" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
x1="6.3051529"
|
||||||
|
y1="23.362427"
|
||||||
|
x2="5.9846287"
|
||||||
|
y2="31.57"
|
||||||
|
id="linearGradient6458"
|
||||||
|
xlink:href="#linearGradient6452"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<radialGradient
|
||||||
|
cx="69.473244"
|
||||||
|
cy="19.597878"
|
||||||
|
r="3.5153139"
|
||||||
|
fx="69.473244"
|
||||||
|
fy="19.597878"
|
||||||
|
id="radialGradient6474"
|
||||||
|
xlink:href="#linearGradient6468"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.318488,1.207574e-15,-1.207574e-15,1.318488,-22.1264,-6.241691)" />
|
||||||
|
<radialGradient
|
||||||
|
cx="23"
|
||||||
|
cy="33.9375"
|
||||||
|
r="18.25"
|
||||||
|
fx="23"
|
||||||
|
fy="33.9375"
|
||||||
|
id="radialGradient6498"
|
||||||
|
xlink:href="#linearGradient6492"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,0,0,0.284247,0,24.29088)" />
|
||||||
|
<linearGradient
|
||||||
|
x1="14.96875"
|
||||||
|
y1="19.110678"
|
||||||
|
x2="39.524544"
|
||||||
|
y2="46.98568"
|
||||||
|
id="linearGradient8530"
|
||||||
|
xlink:href="#linearGradient8524"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<radialGradient
|
||||||
|
cx="6.0242186"
|
||||||
|
cy="25.271027"
|
||||||
|
r="4.8310289"
|
||||||
|
fx="6.0242186"
|
||||||
|
fy="25.271027"
|
||||||
|
id="radialGradient8548"
|
||||||
|
xlink:href="#linearGradient8542"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.916159,9.318684e-2,-0.108765,1.069309,3.253668,-3.029272)" />
|
||||||
|
<linearGradient
|
||||||
|
x1="26.162951"
|
||||||
|
y1="30.543303"
|
||||||
|
x2="24.328892"
|
||||||
|
y2="30.985245"
|
||||||
|
id="linearGradient4330"
|
||||||
|
xlink:href="#linearGradient8534"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
x1="32.350136"
|
||||||
|
y1="28.083355"
|
||||||
|
x2="21.213203"
|
||||||
|
y2="30.293064"
|
||||||
|
id="linearGradient4351"
|
||||||
|
xlink:href="#linearGradient6482"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(-3.836549,0.345971)" />
|
||||||
|
<radialGradient
|
||||||
|
cx="18.557627"
|
||||||
|
cy="22.300018"
|
||||||
|
r="19.2292"
|
||||||
|
fx="18.557627"
|
||||||
|
fy="22.300018"
|
||||||
|
id="radialGradient4354"
|
||||||
|
xlink:href="#linearGradient6500"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.77275,-1.847562e-16,1.351402e-16,1.29668,-16.3404,-6.615959)" />
|
||||||
|
<radialGradient
|
||||||
|
cx="69.473244"
|
||||||
|
cy="19.597878"
|
||||||
|
r="3.5153139"
|
||||||
|
fx="69.473244"
|
||||||
|
fy="19.597878"
|
||||||
|
id="radialGradient4363"
|
||||||
|
xlink:href="#linearGradient6468"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.318488,1.207574e-15,-1.207574e-15,1.318488,-22.1264,-6.241691)" />
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="layer1">
|
||||||
|
<path
|
||||||
|
d="M 41.25 33.9375 A 18.25 5.1875 0 1 1 4.75,33.9375 A 18.25 5.1875 0 1 1 41.25 33.9375 z"
|
||||||
|
transform="matrix(1,0,0,1.53012,0.125,-19.99096)"
|
||||||
|
style="color:black;fill:url(#radialGradient6498);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6490" />
|
||||||
|
<path
|
||||||
|
d="M 10.374369,12.467884 C 10.374369,12.467884 13.248878,18.395518 19.973611,18.228291 C 34.066126,17.874738 36.53732,10.523341 36.890873,9.4626804 C 37.244427,8.4020202 37.785407,8.5626825 37.91048,9.542947 C 42.506674,51.262247 6.0135488,33.362123 4.7175144,26.256467 C 11.965359,24.135147 10.197592,20.069282 10.197592,20.069282 L 10.374369,12.467884 z "
|
||||||
|
style="color:black;fill:url(#radialGradient4354);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path4323" />
|
||||||
|
<path
|
||||||
|
d="M 15.73779,30.066049 C 22.47669,31.413886 25.908481,30.164142 27.916965,28.613273 C 27.386635,27.928263 26.480655,27.176962 26.480655,27.176962 C 26.480655,27.176962 28.833972,27.830904 29.662635,28.900535 C 30.488925,29.967103 29.969443,30.624242 29.753196,31.988905 C 29.271785,30.790306 28.373215,30.340813 28.251562,29.864573 C 26.445294,32.3615 21.94512,32.257773 15.73779,30.066049 z "
|
||||||
|
style="color:black;fill:url(#linearGradient4351);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6480" />
|
||||||
|
<path
|
||||||
|
d="M 36.96875,11.84375 C 36.406772,12.770645 35.562258,13.876916 34.28125,14.9375 C 31.649332,17.116542 27.230687,19.099847 20,19.28125 C 15.775627,19.386299 13.047259,17.347101 11.375,15.53125 L 11.25,20 C 11.386107,20.418802 11.665455,21.390498 11.1875,22.71875 C 10.673186,24.148046 9.032986,25.610113 6.21875,26.71875 C 6.4690804,27.240783 6.7142345,27.76237 7.46875,28.5 C 8.4967003,29.504945 9.9257833,30.588049 11.625,31.5625 C 15.023433,33.511402 19.426583,35.055712 23.53125,35.125 C 27.635917,35.194288 31.388376,33.89045 33.96875,30.125 C 36.347494,26.653782 37.651223,20.777057 36.96875,11.84375 z "
|
||||||
|
style="opacity:0.18539327;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8530);stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path8520" />
|
||||||
|
<path
|
||||||
|
d="M 72.655224 21.837049 A 3.1819806 3.1819806 0 1 1 66.291263,21.837049 A 3.1819806 3.1819806 0 1 1 72.655224 21.837049 z"
|
||||||
|
transform="matrix(1.277778,0,0,1.277778,-75.12661,-6.507784)"
|
||||||
|
style="color:black;fill:url(#radialGradient4363);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.78260845;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path4357" />
|
||||||
|
<path
|
||||||
|
d="M 10.429825 27.228739 A 4.3310289 6.0987959 0 1 1 1.767767,27.228739 A 4.3310289 6.0987959 0 1 1 10.429825 27.228739 z"
|
||||||
|
transform="matrix(0.810984,-0.585069,0.585069,0.810984,-14.77791,6.947121)"
|
||||||
|
style="color:black;fill:url(#radialGradient8548);fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path5198" />
|
||||||
|
<path
|
||||||
|
d="M 24.041631 21.837049 A 2.2980971 2.2980971 0 1 1 19.445437,21.837049 A 2.2980971 2.2980971 0 1 1 24.041631 21.837049 z"
|
||||||
|
transform="matrix(0.851852,0,0,0.851852,-3.926759,3.395528)"
|
||||||
|
style="color:black;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:1.17391276;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path4359" />
|
||||||
|
<path
|
||||||
|
d="M 6.09375,22.15625 C 5.2955008,22.15625 4.5406196,22.602421 3.90625,23.5 C 3.2718804,24.397579 2.8125,25.734204 2.8125,27.21875 C 2.8125,28.703296 3.2718804,30.039921 3.90625,30.9375 C 4.5406196,31.835079 5.2955011,32.28125 6.09375,32.28125 C 6.8919992,32.28125 7.6710339,31.804861 8.3125,30.90625 C 8.9539661,30.007639 9.40625,28.700064 9.40625,27.21875 C 9.40625,25.737436 8.9539662,24.429861 8.3125,23.53125 C 7.6710338,22.632639 6.8919989,22.15625 6.09375,22.15625 z "
|
||||||
|
transform="matrix(0.800389,-0.599481,0.599481,0.800389,-15.2744,7.32784)"
|
||||||
|
style="opacity:0.28089887;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient6458);stroke-width:1.00000012;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6450" />
|
||||||
|
<path
|
||||||
|
d="M 5.833631 23.251263 A 1.767767 2.1213202 0 1 1 2.2980971,23.251263 A 1.767767 2.1213202 0 1 1 5.833631 23.251263 z"
|
||||||
|
style="color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6446" />
|
||||||
|
<path
|
||||||
|
d="M 23.157747 20.953165 A 1.767767 1.767767 0 1 1 19.622213,20.953165 A 1.767767 1.767767 0 1 1 23.157747 20.953165 z"
|
||||||
|
transform="matrix(0.766666,0,0,0.766666,-2.556414,5.029841)"
|
||||||
|
style="color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path4361" />
|
||||||
|
<path
|
||||||
|
d="M 72.655224 21.837049 A 3.1819806 3.1819806 0 1 1 66.291263,21.837049 A 3.1819806 3.1819806 0 1 1 72.655224 21.837049 z"
|
||||||
|
transform="matrix(1.5,0,0,1.5,-82.16821,-10.91852)"
|
||||||
|
style="color:black;fill:url(#radialGradient6474);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:0.66666645;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6462" />
|
||||||
|
<path
|
||||||
|
d="M 24.041631 21.837049 A 2.2980971 2.2980971 0 1 1 19.445437,21.837049 A 2.2980971 2.2980971 0 1 1 24.041631 21.837049 z"
|
||||||
|
transform="translate(1.414216,0.707108)"
|
||||||
|
style="color:black;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:black;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6464" />
|
||||||
|
<path
|
||||||
|
d="M 23.157747 20.953165 A 1.767767 1.767767 0 1 1 19.622213,20.953165 A 1.767767 1.767767 0 1 1 23.157747 20.953165 z"
|
||||||
|
transform="matrix(0.9,0,0,0.9,3.022883,2.625648)"
|
||||||
|
style="color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6466" />
|
||||||
|
<g
|
||||||
|
transform="matrix(-0.114852,-0.389864,0.389864,-0.114852,24.71507,29.68942)"
|
||||||
|
id="g8463">
|
||||||
|
<path
|
||||||
|
d="M -23.364209,23.568336 L -19.654111,27.037511 C -11.307128,20.656664 -2.5600338,6.9381374 -2.5600338,6.9381374 C -0.58371893,4.6957251 -2.6769537,3.1876548 -4.7249404,4.5402186 C -4.7249404,4.5402186 -17.695303,14.655085 -23.364209,23.568336 z "
|
||||||
|
style="opacity:1;color:black;fill:url(#linearGradient6957);fill-opacity:1;fill-rule:nonzero;stroke:#673907;stroke-width:2.46045303;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6937" />
|
||||||
|
<path
|
||||||
|
d="M -30.449715,32.813894 L -28.203395,34.747714 L -19.710629,27.380683 L -19.435568,26.674855 L -18.341163,26.65704 C -18.778663,25.09454 -21.282677,22.273585 -23.157677,22.273585 L -23.075658,23.36366 L -23.745649,23.743687 L -30.449715,32.813894 z "
|
||||||
|
style="opacity:1;color:black;fill:url(#linearGradient6945);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:2.46045303;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6935" />
|
||||||
|
<path
|
||||||
|
d="M -23.801371,28.376767 L -28.166304,33.643238"
|
||||||
|
style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:white;stroke-width:2.46045327;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6985" />
|
||||||
|
<path
|
||||||
|
d="M -45.341208,42.769835 C -34.89725,42.769835 -26.971169,44.013565 -25.470603,36.415097 C -24.261354,30.291783 -32.681137,27.357729 -36.853473,32.824236 C -40.87275,38.090207 -45.341208,42.769835 -45.341208,42.769835 z "
|
||||||
|
style="opacity:1;color:black;fill:url(#radialGradient6969);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6933" />
|
||||||
|
<path
|
||||||
|
d="M 8.8749989 37.75 A 1.2499999 1.2499999 0 1 1 6.3749992,37.75 A 1.2499999 1.2499999 0 1 1 8.8749989 37.75 z"
|
||||||
|
transform="matrix(2.069903,-2.005828e-15,-1.697698e-15,2.069903,-44.75012,-41.50978)"
|
||||||
|
style="opacity:0.52777782;color:black;fill:white;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6971" />
|
||||||
|
<path
|
||||||
|
d="M 8.8749989 37.75 A 1.2499999 1.2499999 0 1 1 6.3749992,37.75 A 1.2499999 1.2499999 0 1 1 8.8749989 37.75 z"
|
||||||
|
transform="matrix(1.396669,6.090506e-16,8.67172e-16,1.396669,-32.05526,-25.87664)"
|
||||||
|
style="opacity:1;color:black;fill:white;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path6983" />
|
||||||
|
<path
|
||||||
|
d="M -38.543723,40.909242 C -38.543723,40.909242 -34.822203,41.003542 -32.427185,39.497247 C -31.579834,38.964324 -30.911411,40.147232 -31.933366,40.584614 C -34.14076,41.529346 -38.543723,40.909242 -38.543723,40.909242 z "
|
||||||
|
style="opacity:0.42777776;color:black;fill:url(#linearGradient2452);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path1571" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
d="M 23.003067,31.736544 C 24.500439,31.879636 25.852696,31.464331 26.41496,31.262497 C 26.513185,30.707111 26.951512,29.64124 28.461048,29.571029 L 27.930718,28.642952 C 27.930718,28.642952 25.964077,29.990873 23.864854,30.388621 L 23.003067,31.736544 z "
|
||||||
|
style="color:black;fill:url(#linearGradient4330);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.9999997;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||||
|
id="path8532" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 21 KiB |
Loading…
Reference in New Issue
Block a user