Add Draft Bezier Curve draw & edit mockup using bSpline tools.
This commit is contained in:
parent
7eb7591a58
commit
2d43d61b92
|
@ -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"
|
||||
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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
|
@ -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",
|
||||
|
|
|
@ -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>
|
||||
|
|
363
src/Mod/Draft/Resources/icons/Draft_BezCurve.svg
Normal file
363
src/Mod/Draft/Resources/icons/Draft_BezCurve.svg
Normal 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 |
Loading…
Reference in New Issue
Block a user