Add Draft Bezier Curve draw & edit mockup using bSpline tools.

This commit is contained in:
WandererFan 2014-01-17 12:22:46 -05:00 committed by Yorik van Havre
parent 7eb7591a58
commit 2d43d61b92
8 changed files with 55349 additions and 16 deletions

View File

@ -830,7 +830,33 @@ def makeBSpline(pointslist,closed=False,placement=None,face=True,support=None):
select(obj)
FreeCAD.ActiveDocument.recompute()
return obj
#######################################
def makeBezCurve(pointslist,placement=None,support=None):
'''makeBezCurve(pointslist,[closed],[placement]): Creates a Bezier Curve object
from the given list of vectors. Instead of a pointslist, you can also pass a Part Wire.'''
if not isinstance(pointslist,list):
nlist = []
for v in pointslist.Vertexes:
nlist.append(v.Point)
pointslist = nlist
if placement: typecheck([(placement,FreeCAD.Placement)], "makeBezCurve")
if len(pointslist) == 2: fname = "Line"
else: fname = "BezCurve"
obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython",fname)
_BezCurve(obj)
obj.Points = pointslist
# obj.Closed = closed
obj.Support = support
if placement: obj.Placement = placement
if gui:
_ViewProviderWire(obj.ViewObject)
# if not face: obj.ViewObject.DisplayMode = "Wireframe"
obj.ViewObject.DisplayMode = "Wireframe"
formatObject(obj)
select(obj)
FreeCAD.ActiveDocument.recompute()
return obj
#######################################
def makeText(stringslist,point=Vector(0,0,0),screen=False):
'''makeText(strings,[point],[screen]): Creates a Text object at the given point,
containing the strings given in the strings list, one string by line (strings
@ -3929,7 +3955,52 @@ class _BSpline(_DraftObject):
# for compatibility with older versions
_ViewProviderBSpline = _ViewProviderWire
#######################################
class _BezCurve(_DraftObject):
"The BezCurve object"
def __init__(self, obj):
_DraftObject.__init__(self,obj,"BezCurve")
obj.addProperty("App::PropertyVectorList","Points","Draft",
"The points of the Bezier curve")
# obj.addProperty("App::PropertyBool","Closed","Draft",
# "If the Bezier curve is closed or not")
obj.addProperty("App::PropertyInteger","Degree","Draft",
"The degree of the Bezier function")
obj.addProperty("App::PropertyBool","Closed","Draft",
"If the Bezier curve is closed or not(??)")
obj.Closed = False
obj.Degree = 3
def execute(self, fp):
self.createGeometry(fp)
def onChanged(self, fp, prop):
if prop in ["Points","Degree"]:
self.createGeometry(fp)
def createGeometry(self,fp):
import Part
plm = fp.Placement
if fp.Points:
# if fp.Points[0] == fp.Points[-1]:
# if not fp.Closed: fp.Closed = True
# fp.Points.pop()
# if fp.Closed and (len(fp.Points) > 2):
c = Part.BezierCurve()
c.setPoles(fp.Points)
e = Part.Edge(c)
w = Part.Wire(e)
fp.Shape = w
# else:
# spline = Part.BezCurveCurve()
# spline.interpolate(fp.Points, False)
# fp.Shape = spline.toShape()
fp.Placement = plm
# for compatibility with older versions ???????
_ViewProviderBezCurve = _ViewProviderWire
#######################################
class _Block(_DraftObject):
"The Block object"

View File

@ -1418,7 +1418,7 @@ class DraftToolBar:
"Draft_Rectangle","Draft_Arc",
"Draft_Circle","Draft_BSpline",
"Draft_Text","Draft_Dimension",
"Draft_ShapeString"]
"Draft_ShapeString","Draft_BezCurve"]
self.title = "Create objects"
def shouldShow(self):
return (FreeCAD.ActiveDocument != None) and (not FreeCADGui.Selection.getSelection())

View File

@ -665,7 +665,113 @@ class BSpline(Line):
if self.ui:
if self.ui.continueMode:
self.Activated()
#######################################
class BezCurve(Line):
"a FreeCAD command for creating a Bezier Curve"
def __init__(self):
Line.__init__(self,wiremode=True)
def GetResources(self):
return {'Pixmap' : 'Draft_BezCurve',
'Accel' : "B, Z",
'MenuText': QtCore.QT_TRANSLATE_NOOP("Draft_BezCurve", "BezCurve"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_BezCurve", "Creates a Bezier curve. CTRL to snap, SHIFT to constrain")}
def Activated(self):
Line.Activated(self,name=translate("draft","BezCurve"))
if self.doc:
self.bezcurvetrack = bezcurveTracker()
def action(self,arg):
"scene event handler"
if arg["Type"] == "SoKeyboardEvent":
if arg["Key"] == "ESCAPE":
self.finish()
elif arg["Type"] == "SoLocation2Event": #mouse movement detection
self.point,ctrlPoint,info = getPoint(self,arg,noTracker=True)
self.bezcurvetrack.update(self.node + [self.point]) #existing points + this pointer position
elif arg["Type"] == "SoMouseButtonEvent":
if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): #left click
if (arg["Position"] == self.pos): #double click?
self.finish(False,cont=True)
else:
if (not self.node) and (not self.support): #first point
self.support = getSupport(arg)
if self.point:
self.ui.redraw()
self.pos = arg["Position"]
self.node.append(self.point) #add point to "clicked list"
# sb add a control point, if mod(len(cpoints),2) == 0) then create 2 handle points?
self.drawUpdate(self.point) #???
if (not self.isWire and len(self.node) == 2):
self.finish(False,cont=True)
if (len(self.node) > 2): #does this make sense for a BCurve?
# DNC: allows to close the curve
# by placing ends close to each other
# with tol = Draft tolerance
# old code has been to insensitive
if ((self.point-self.node[0]).Length < Draft.tolerance()):
self.undolast()
self.finish(True,cont=True)
msg(translate("draft", "Bezier curve has been closed\n"))
def undolast(self):
"undoes last line segment"
### this won't work exactly the same way for Bcurve????
if (len(self.node) > 1):
self.node.pop()
self.bezcurvetrack.update(self.node)
### self.obj.Shape.Edge[0].Curve.removePole(???)
# c = Part.BezierCurve()
# c.setPoles(self.Points)
# e = Part.Edge(c)
# w = Part.Wire(e)
## spline = Part.bSplineCurve()
## spline.interpolate(self.node, False)
## self.obj.Shape = spline.toShape()
# self.obj.Shape = w
msg(translate("draft", "BezCurve sb undoing last segment\n"))
msg(translate("draft", "Last point has been removed\n"))
def drawUpdate(self,point):
msg(translate("draft", "BezCurve drawUpdate\n"))
if (len(self.node) == 1):
self.bezcurvetrack.on()
if self.planetrack:
self.planetrack.set(self.node[0])
msg(translate("draft", "Pick next point:\n"))
else:
c = Part.BezierCurve()
c.setPoles(self.node)
e = Part.Edge(c)
w = Part.Wire(e)
self.obj.Shape = w
msg(translate("draft", "Pick next point, or (F)inish or (C)lose:\n"))
def finish(self,closed=False,cont=False):
"terminates the operation and closes the poly if asked"
if self.ui:
self.bezcurvetrack.finalize()
if not Draft.getParam("UiMode",1):
FreeCADGui.Control.closeDialog()
if (len(self.node) > 1):
old = self.obj.Name
todo.delay(self.doc.removeObject,old)
try:
# building command string
rot,sup,pts,fil = self.getStrings()
self.commit(translate("draft","Create BezCurve"),
['import Draft',
'points='+pts,
'Draft.makeBezCurve(points,support='+sup+')'])
except:
print "Draft: error delaying commit"
Creator.finish(self)
if self.ui:
if self.ui.continueMode:
self.Activated()
#######################################
class FinishLine:
"a FreeCAD command to finish any running Line drawing operation"
@ -3093,7 +3199,7 @@ class Edit(Modifier):
if hasattr(self.obj.ViewObject,"Selectable"):
self.selectstate = self.obj.ViewObject.Selectable
self.obj.ViewObject.Selectable = False
if Draft.getType(self.obj) in ["Wire","BSpline"]:
if Draft.getType(self.obj) in ["Wire","BSpline","BezCurve"]:
self.ui.setEditButtons(True)
else:
self.ui.setEditButtons(False)
@ -3104,7 +3210,7 @@ class Edit(Modifier):
if "Placement" in self.obj.PropertiesList:
self.pl = self.obj.Placement
self.invpl = self.pl.inverse()
if Draft.getType(self.obj) in ["Wire","BSpline"]:
if Draft.getType(self.obj) in ["Wire","BSpline","BezCurve"]:
for p in self.obj.Points:
if self.pl: p = self.pl.multVec(p)
self.editpoints.append(p)
@ -3218,7 +3324,7 @@ class Edit(Modifier):
self.numericInput(self.trackers[self.editing].get())
def update(self,v):
if Draft.getType(self.obj) in ["Wire","BSpline"]:
if Draft.getType(self.obj) in ["Wire","BSpline","BezCurve"]:
pts = self.obj.Points
editPnt = self.invpl.multVec(v)
# DNC: allows to close the curve by placing ends close to each other
@ -3300,7 +3406,7 @@ class Edit(Modifier):
self.node = []
def addPoint(self,point):
if not (Draft.getType(self.obj) in ["Wire","BSpline"]): return
if not (Draft.getType(self.obj) in ["Wire","BSpline","BezCurve"]): return
pts = self.obj.Points
if ( Draft.getType(self.obj) == "Wire" ):
if (self.obj.Closed == True):
@ -3318,7 +3424,7 @@ class Edit(Modifier):
else:
# DNC: this version is much more reliable near sharp edges!
curve = self.obj.Shape.Wires[0].approximate(0.0001,0.0001,100,25)
elif ( Draft.getType(self.obj) == "BSpline" ):
elif ( Draft.getType(self.obj) in ["BSpline","BezCurve"]):
if (self.obj.Closed == True):
curve = self.obj.Shape.Edges[0].Curve
else:
@ -3340,7 +3446,7 @@ class Edit(Modifier):
self.resetTrackers()
def delPoint(self,point):
if not (Draft.getType(self.obj) in ["Wire","BSpline"]): return
if not (Draft.getType(self.obj) in ["Wire","BSpline","BezCurve"]): return
if len(self.obj.Points) <= 2:
msg(translate("draft", "Active object must have more than two points/nodes\n"),'warning')
else:
@ -4044,6 +4150,7 @@ FreeCADGui.addCommand('Draft_Rectangle',Rectangle())
FreeCADGui.addCommand('Draft_Dimension',Dimension())
FreeCADGui.addCommand('Draft_Polygon',Polygon())
FreeCADGui.addCommand('Draft_BSpline',BSpline())
FreeCADGui.addCommand('Draft_BezCurve',BezCurve())
FreeCADGui.addCommand('Draft_Point',Point())
FreeCADGui.addCommand('Draft_Ellipse',Ellipse())
FreeCADGui.addCommand('Draft_ShapeString',ShapeString())

View File

@ -346,7 +346,77 @@ class bsplineTracker(Tracker):
self.sep.addChild(self.bspline)
else:
FreeCAD.Console.PrintWarning("bsplineTracker.recompute() failed to read-in Inventor string\n")
#######################################
class bezcurveTracker(Tracker):
"A bezcurve tracker"
def __init__(self,dotted=False,scolor=None,swidth=None,points = []):
self.bezcurve = None
self.points = points
self.trans = coin.SoTransform()
self.sep = coin.SoSeparator()
self.recompute()
Tracker.__init__(self,dotted,scolor,swidth,[self.trans,self.sep])
def update(self, points):
self.points = points
self.recompute()
def recompute(self):
if (len(self.points) >= 2):
if self.bezcurve: self.sep.removeChild(self.bezcurve)
self.bezcurve = None
### c = Part.BSplineCurve() #!!!!!!!!!!!!!!!
c = Part.BezierCurve()
# DNC: allows to close the curve by placing ends close to each other
if ( len(self.points) >= 3 ) and ( (self.points[0] - self.points[-1]).Length < Draft.tolerance() ):
# YVH: Added a try to bypass some hazardous situations
try:
### c.interpolate(self.points[:-1], True) #!!!!!!!!!!!!
c.setPoles(self.points[:-1])
except:
pass
elif self.points:
try:
### c.interpolate(self.points, False) #!!!!!!!
c.setPoles(self.points)
except:
pass
c = c.toShape() #???? c = Part.Edge(c)?, c = Part.Wire(c)??
buf=c.writeInventor(2,0.01)
#fp=open("spline.iv","w")
#fp.write(buf)
#fp.close()
try:
ivin = coin.SoInput()
ivin.setBuffer(buf)
ivob = coin.SoDB.readAll(ivin)
except:
# workaround for pivy SoInput.setBuffer() bug
import re
buf = buf.replace("\n","")
pts = re.findall("point \[(.*?)\]",buf)[0]
pts = pts.split(",")
pc = []
for p in pts:
v = p.strip().split()
pc.append([float(v[0]),float(v[1]),float(v[2])])
coords = coin.SoCoordinate3()
coords.point.setValues(0,len(pc),pc)
line = coin.SoLineSet()
line.numVertices.setValue(-1)
self.bezcurve = coin.SoSeparator()
self.bezcurve.addChild(coords)
self.bezcurve.addChild(line)
self.sep.addChild(self.bezcurve)
else:
if ivob and ivob.getNumChildren() > 1:
self.bezcurve = ivob.getChild(1).getChild(0)
self.bezcurve.removeChild(self.bezcurve.getChild(0))
self.bezcurve.removeChild(self.bezcurve.getChild(0))
self.sep.addChild(self.bezcurve)
else:
FreeCAD.Console.PrintWarning("bezcurveTracker.recompute() failed to read-in Inventor string\n")
#######################################
class arcTracker(Tracker):
"An arc tracker"
def __init__(self,dotted=False,scolor=None,swidth=None,start=0,end=math.pi*2,normal=None):

File diff suppressed because one or more lines are too long

View File

@ -108,7 +108,7 @@ class DraftWorkbench (Workbench):
self.cmdList = ["Draft_Line","Draft_Wire","Draft_Circle","Draft_Arc","Draft_Ellipse",
"Draft_Polygon","Draft_Rectangle", "Draft_Text",
"Draft_Dimension", "Draft_BSpline","Draft_Point",
"Draft_ShapeString","Draft_Facebinder"]
"Draft_ShapeString","Draft_Facebinder","Draft_BezCurve"]
self.modList = ["Draft_Move","Draft_Rotate","Draft_Offset",
"Draft_Trimex", "Draft_Upgrade", "Draft_Downgrade", "Draft_Scale",
"Draft_Drawing","Draft_Edit","Draft_WireToBSpline","Draft_AddPoint",

View File

@ -5,6 +5,7 @@
<file>icons/Draft_Apply.svg</file>
<file>icons/Draft_Arc.svg</file>
<file>icons/Draft_BSpline.svg</file>
<file>icons/Draft_BezCurve.svg</file>
<file>icons/Draft_Circle.svg</file>
<file>icons/Draft_Construction.svg</file>
<file>icons/Draft_DelPoint.svg</file>

View File

@ -0,0 +1,363 @@
<?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="64px"
height="64px"
id="svg3612"
version="1.1"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="Draft_BezCurve.svg">
<defs
id="defs3614">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective3620" />
<inkscape:perspective
id="perspective3588"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-3"
id="radialGradient3600"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<linearGradient
id="linearGradient3144-3"
inkscape:collect="always">
<stop
id="stop3146-0"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop3148-1"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-3"
id="radialGradient3598"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<inkscape:perspective
id="perspective3692"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient3144-6">
<stop
id="stop3146-9"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3148-2"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3701">
<stop
id="stop3703"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3705"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-6"
id="radialGradient3688"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<linearGradient
id="linearGradient3708">
<stop
id="stop3710"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3712"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3144-6-6">
<stop
id="stop3146-9-1"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3148-2-7"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-6"
id="radialGradient3164"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.15378341,-0.00107304,7.3761212e-4,-0.10916121,65.069908,86.593234)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-6-6"
id="radialGradient3960"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.15378341,-0.00107304,7.3761212e-4,-0.10916121,44.086014,80.606342)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-6"
id="radialGradient3963"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.15321571,-0.01345818,0.00925118,-0.10875824,48.809063,132.88917)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-6-1"
id="radialGradient3118-3"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.15378124,0.0013561,-9.3218748e-4,-0.10915967,45.974898,112.47404)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<linearGradient
id="linearGradient3144-6-1">
<stop
id="stop3146-9-3"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3148-2-5"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
r="34.345188"
fy="672.79736"
fx="225.26402"
cy="672.79736"
cx="225.26402"
gradientTransform="matrix(-0.15378124,0.0013561,-9.3218748e-4,-0.10915967,45.974898,112.47404)"
gradientUnits="userSpaceOnUse"
id="radialGradient4001"
xlink:href="#linearGradient3144-6-1"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-6"
id="radialGradient4026"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.15378124,0.0013561,-9.3218748e-4,-0.10915967,45.974898,112.47404)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-6-4"
id="radialGradient4026-5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.15378124,0.0013561,-9.3218748e-4,-0.10915967,45.974898,112.47404)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<linearGradient
id="linearGradient3144-6-4">
<stop
id="stop3146-9-9"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3148-2-1"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-6-4"
id="radialGradient4097"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.15378124,0.0013561,-9.3218748e-4,-0.10915967,45.974898,112.47404)"
cx="286.94281"
cy="835.12842"
fx="286.94281"
fy="835.12842"
r="34.345188" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.5"
inkscape:cx="-2"
inkscape:cy="32"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1366"
inkscape:window-height="694"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:snap-page="true" />
<metadata
id="metadata3617">
<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></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
inkscape:connector-curvature="0"
d="M 15.257021,56.223041 A 5.2825044,3.7487827 5.1800622 1 1 25.781466,57.147489 5.2825044,3.7487827 5.1800622 0 1 15.257021,56.223041 z"
id="path2200-1"
style="fill:url(#radialGradient3963);fill-opacity:1;stroke:none" />
<g
id="g4117">
<path
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.5;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
id="path3714-9"
d="m 44.148624,18.721424 c -2.841469,-1.739043 -6.298803,-2.67418 -10.344041,-2.565266 -8.008916,0.215628 -13.887838,3.847597 -17.505234,9.448876 -3.617397,5.601279 -5.191351,12.969992 -5.745562,21.071982 l 4.509066,0.312271 c 0.525294,-7.679244 2.084956,-14.30953 5.017261,-18.849995 2.932304,-4.540464 7.046063,-7.193588 13.849658,-7.376762 6.722041,-0.180983 10.251581,2.422927 12.895988,7.4844 2.644402,5.061472 3.931007,12.76517 4.557999,21.724706 l 4.500909,-0.33474 C 55.241351,40.443956 54.04139,32.275803 50.817693,26.105559 49.205845,23.020437 46.990114,20.46043 44.148624,18.721424 z"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
d="M 7.7504786,43.744356 A 7.4696566,7.5905773 0 1 1 20.53589,51.597088 7.4696566,7.5905773 0 1 1 7.7504786,43.744356 z"
id="path2182-6-9-2"
style="opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.86337566;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
inkscape:connector-curvature="0"
d="M 47.425861,43.527533 A 7.4696569,7.5905776 0 0 1 60.211272,51.380265 7.4696569,7.5905776 0 1 1 47.425861,43.527533 z"
id="path2182-6-9-2-8"
style="opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.86337566;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
y="4.999999"
x="12.90909"
height="7.818182"
width="8.363636"
id="rect3190"
style="color:#000000;fill:#ffa900;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.86299998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
y="4.999999"
x="44"
height="7.818182"
width="8.363636"
id="rect3190-2"
style="color:#000000;fill:#ffa900;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.86299998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<g
id="g3166-4"
transform="translate(41.740915,4.3123332)">
<g
id="g4040">
<path
inkscape:connector-curvature="0"
d="M 43.096349,17.414338 C 40.25488,15.675295 36.797546,14.740158 32.752308,14.849072 24.743392,15.0647 18.86447,18.696669 15.247074,24.297948 11.629677,29.899227 10.055723,37.26794 9.5015123,45.36993 l 4.5090657,0.312271 c 0.525294,-7.679244 2.084956,-14.30953 5.017261,-18.849995 2.932304,-4.540464 7.046063,-7.193588 13.849658,-7.376762 6.722041,-0.180983 10.251581,2.422927 12.895988,7.4844 2.644402,5.061472 3.931007,12.76517 4.557999,21.724706 l 4.500909,-0.33474 C 54.189076,39.13687 52.989115,30.968717 49.765418,24.798473 48.15357,21.713351 45.937839,19.153344 43.096349,17.414338 z"
id="path3714"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#000000;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.50000000000000000;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
transform="translate(-41.740915,-4.3123332)" />
<g
id="g3166"
transform="translate(-40.650006,0)">
<path
style="fill:#ffa900;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.86337566;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="path2182-6"
d="M 4.411834,37.943119 A 7.4696566,7.5905773 0 1 1 17.197245,45.795851 7.4696566,7.5905773 0 1 1 4.411834,37.943119 z"
inkscape:connector-curvature="0" />
<path
style="fill:url(#radialGradient4026);fill-opacity:1;stroke:none"
id="path2184-8"
d="M 5.4246987,39.383758 A 3.7492461,5.2818517 89.478542 1 1 15.987991,39.290607 3.7492461,5.2818517 89.478542 0 1 5.4246987,39.383758 z"
inkscape:connector-curvature="0" />
</g>
<path
style="fill:#ffa900;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.86337566;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="path2182-6-9"
d="M 4.411834,37.943119 A 7.4696566,7.5905773 0 1 1 17.197245,45.795851 7.4696566,7.5905773 0 1 1 4.411834,37.943119 z"
inkscape:connector-curvature="0" />
</g>
<path
inkscape:connector-curvature="0"
d="M 5.4246987,39.383758 A 3.7492461,5.2818517 89.478542 1 1 15.987991,39.290607 3.7492461,5.2818517 89.478542 0 1 5.4246987,39.383758 z"
id="path2184-8-4"
style="fill:url(#radialGradient4001);fill-opacity:1;stroke:none" />
</g>
<path
inkscape:connector-curvature="0"
id="path4030"
d="M 12,38.181818 C 17.090909,12.545455 17.090909,12.545455 17.090909,12.545455"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path4034"
d="M 51.454545,38.363636 C 48.181818,12.909091 48.181818,12.909091 48.181818,12.909091 l 0,0"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB