OpenSCAD Module: bugfixes and improvements

if more than 14 digits are given don round in general,
but test for <eps only.
refine before extrusion
support polyhedron faces which replaces polyhedron faces
importCSG round rotations
don't call Draft.makecircle and makeprism as they trigger a recompute
use group placholder for objects with no children
move removesubtree to OpenSCADUtils
add resize and offset keywords
add OpenSCAD_ExplodeGroup command
add OpenSCAD_IncreaseToleranceFeature
change refine shape logo
This commit is contained in:
Sebastian Hoogen 2014-02-21 16:24:14 +01:00
parent 040c19b1c1
commit b58d1caea7
13 changed files with 1288 additions and 522 deletions

View File

@ -95,10 +95,12 @@ static char * openscadlogo_xpm[] = {
def Initialize(self): def Initialize(self):
import OpenSCAD_rc,OpenSCADCommands import OpenSCAD_rc,OpenSCADCommands
commands=['OpenSCAD_ReplaceObject','OpenSCAD_RemoveSubtree',\ commands=['OpenSCAD_ReplaceObject','OpenSCAD_RemoveSubtree',\
'OpenSCAD_RefineShapeFeature',"OpenSCAD_Edgestofaces",\ 'OpenSCAD_RefineShapeFeature',\
'OpenSCAD_ExpandPlacements'] 'OpenSCAD_IncreaseToleranceFeature', 'OpenSCAD_Edgestofaces', \
'OpenSCAD_ExpandPlacements','OpenSCAD_ExplodeGroup']
toolbarcommands=['OpenSCAD_ReplaceObject','OpenSCAD_RemoveSubtree',\ toolbarcommands=['OpenSCAD_ReplaceObject','OpenSCAD_RemoveSubtree',\
'OpenSCAD_RefineShapeFeature'] 'OpenSCAD_ExplodeGroup','OpenSCAD_RefineShapeFeature']
#'OpenSCAD_IncreaseToleranceFeature' #icon still missing
import PartGui import PartGui
parttoolbarcommands = ['Part_CheckGeometry',"Part_Primitives",\ parttoolbarcommands = ['Part_CheckGeometry',"Part_Primitives",\
"Part_Builder",'Part_Cut','Part_Fuse','Part_Common',\ "Part_Builder",'Part_Cut','Part_Fuse','Part_Common',\

View File

@ -37,6 +37,50 @@ def translate(context,text):
def utf8(unio): def utf8(unio):
return unicode(unio).encode('UTF8') return unicode(unio).encode('UTF8')
class ExplodeGroup:
"Ungroup Objects"
def IsActive(self):
return FreeCADGui.Selection.countObjectsOfType('Part::Feature') > 0
def Activated(self):
def isgrey(shapecolor):
defaultcolor=(float.fromhex('0x1.99999ap-1'),float.fromhex('0x1.99999ap-1'),\
float.fromhex('0x1.99999ap-1'),0.0)
return all(facecolor == defaultcolor for facecolor in shapecolor)
def randomcolor(transp=0.0):
import random
return (random.random(),random.random(),random.random(),transp)
def explode(obj,color=True):
if obj.isDerivedFrom('Part::Fuse') or obj.isDerivedFrom('Part::MultiFuse'):
plm = obj.Placement
outlist = obj.OutList[:]
if plm.isNull() or all(len(oo.InList)==1 for oo in obj.OutList):
obj.Document.removeObject(obj.Name)
for oo in outlist:
if not plm.isNull():
oo.Placement=plm.multiply(oo.Placement)
if FreeCAD.GuiUp:
import FreeCADGui
oo.ViewObject.show()
if color and isgrey(oo.ViewObject.DiffuseColor):
if color == True:
oo.ViewObject.DiffuseColor=randomcolor()
else:
oo.ViewObject.DiffuseColor=color
for obj in FreeCADGui.Selection.getSelection():
if len(obj.InList) == 0: # allowed only for for top level objects
explode(obj)
def GetResources(self):
return {'Pixmap' : 'OpenSCAD_Explode_Group', 'MenuText': \
QtCore.QT_TRANSLATE_NOOP('OpenSCAD_ExplodeGroup',\
'Explode Group'), 'ToolTip': \
QtCore.QT_TRANSLATE_NOOP('OpenSCAD_ExplodeGroup',\
'remove fusion, apply placement to children and color randomly')}
class ColorCodeShape: class ColorCodeShape:
"Change the Color of selected or all Shapes based on their validity" "Change the Color of selected or all Shapes based on their validity"
def Activated(self): def Activated(self):
@ -57,7 +101,7 @@ class ColorCodeShape:
class Edgestofaces: class Edgestofaces:
def IsActive(self): def IsActive(self):
return bool(FreeCADGui.Selection.getSelectionEx()) return FreeCADGui.Selection.countObjectsOfType('Part::Feature') > 0
def Activated(self): def Activated(self):
from OpenSCAD2Dgeom import edgestofaces,Overlappingfaces from OpenSCAD2Dgeom import edgestofaces,Overlappingfaces
@ -78,13 +122,12 @@ class Edgestofaces:
class RefineShapeFeature: class RefineShapeFeature:
def IsActive(self): def IsActive(self):
return bool(FreeCADGui.Selection.getSelectionEx()) return FreeCADGui.Selection.countObjectsOfType('Part::Feature') > 0
def Activated(self): def Activated(self):
import Part,OpenSCADFeatures import Part,OpenSCADFeatures
selection=FreeCADGui.Selection.getSelectionEx() selection=FreeCADGui.Selection.getSelectionEx()
for selobj in selection: for selobj in selection:
#newobj=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",'refine')
newobj=selobj.Document.addObject("Part::FeaturePython",'refine') newobj=selobj.Document.addObject("Part::FeaturePython",'refine')
OpenSCADFeatures.RefineShape(newobj,selobj.Object) OpenSCADFeatures.RefineShape(newobj,selobj.Object)
OpenSCADFeatures.ViewProviderTree(newobj.ViewObject) OpenSCADFeatures.ViewProviderTree(newobj.ViewObject)
@ -98,13 +141,34 @@ class RefineShapeFeature:
QtCore.QT_TRANSLATE_NOOP('OpenSCAD_RefineShapeFeature',\ QtCore.QT_TRANSLATE_NOOP('OpenSCAD_RefineShapeFeature',\
'Create Refine Shape Feature')} 'Create Refine Shape Feature')}
class IncreaseToleranceFeature:
def IsActive(self):
return FreeCADGui.Selection.countObjectsOfType('Part::Feature') > 0
def Activated(self):
import Part,OpenSCADFeatures
selection=FreeCADGui.Selection.getSelectionEx()
for selobj in selection:
newobj=selobj.Document.addObject("Part::FeaturePython",'tolerance')
OpenSCADFeatures.IncreaseTolerance(newobj,selobj.Object)
OpenSCADFeatures.ViewProviderTree(newobj.ViewObject)
newobj.Label='tolerance_%s' % selobj.Object.Label
selobj.Object.ViewObject.hide()
FreeCAD.ActiveDocument.recompute()
def GetResources(self):
return {'Pixmap' : 'OpenSCAD_IncreaseToleranceFeature', 'MenuText': \
QtCore.QT_TRANSLATE_NOOP('OpenSCAD_IncreaseToleranceFeature',\
'Increase Tolerance Feature'), 'ToolTip': \
QtCore.QT_TRANSLATE_NOOP('OpenSCAD_IncreaseToleranceFeature',\
'Create Feature that allows to increase the tolerance')}
class ExpandPlacements: class ExpandPlacements:
'''This should aid interactive repair in the future '''This should aid interactive repair in the future
but currently it breaks extrusions, as axis, base and so on have to be but currently it breaks extrusions, as axis, base and so on have to be
recalculated''' recalculated'''
def IsActive(self): def IsActive(self):
return bool(FreeCADGui.Selection.getSelectionEx()) return FreeCADGui.Selection.countObjectsOfType('Part::Feature') > 0
def Activated(self): def Activated(self):
import expandplacements import expandplacements
@ -119,7 +183,7 @@ class ExpandPlacements:
class ReplaceObject: class ReplaceObject:
def IsActive(self): def IsActive(self):
return len(FreeCADGui.Selection.getSelection()) == 3 return FreeCADGui.Selection.countObjectsOfType('Part::Feature') == 3
def Activated(self): def Activated(self):
import replaceobj import replaceobj
#objs=[selobj.Object for selobj in FreeCADGui.Selection.getSelectionEx()] #objs=[selobj.Object for selobj in FreeCADGui.Selection.getSelectionEx()]
@ -139,28 +203,11 @@ class ReplaceObject:
class RemoveSubtree: class RemoveSubtree:
def IsActive(self): def IsActive(self):
return bool(FreeCADGui.Selection.getSelectionEx()) return FreeCADGui.Selection.countObjectsOfType('Part::Feature') > 0
def Activated(self): def Activated(self):
def addsubobjs(obj,toremoveset): import OpenSCADUtils,FreeCADGui
toremove.add(obj) OpenSCADUtils.removesubtree(FreeCADGui.Selection.getSelection())
for subobj in obj.OutList:
addsubobjs(subobj,toremoveset)
import FreeCAD,FreeCADGui
objs=FreeCADGui.Selection.getSelection()
toremove=set()
for obj in objs:
addsubobjs(obj,toremove)
checkinlistcomplete =False
while not checkinlistcomplete:
for obj in toremove:
if (obj not in objs) and (frozenset(obj.InList) - toremove):
toremove.remove(obj)
break
else:
checkinlistcomplete = True
for obj in toremove:
obj.Document.removeObject(obj.Name)
def GetResources(self): def GetResources(self):
return {'Pixmap' : 'OpenSCAD_RemoveSubtree', 'MenuText': \ return {'Pixmap' : 'OpenSCAD_RemoveSubtree', 'MenuText': \
QtCore.QT_TRANSLATE_NOOP('OpenSCAD_RemoveSubtree',\ QtCore.QT_TRANSLATE_NOOP('OpenSCAD_RemoveSubtree',\
@ -368,8 +415,10 @@ class Minkowski:
'Perform Minkowski')} 'Perform Minkowski')}
FreeCADGui.addCommand('OpenSCAD_ColorCodeShape',ColorCodeShape()) FreeCADGui.addCommand('OpenSCAD_ColorCodeShape',ColorCodeShape())
FreeCADGui.addCommand('OpenSCAD_ExplodeGroup',ExplodeGroup())
FreeCADGui.addCommand('OpenSCAD_Edgestofaces',Edgestofaces()) FreeCADGui.addCommand('OpenSCAD_Edgestofaces',Edgestofaces())
FreeCADGui.addCommand('OpenSCAD_RefineShapeFeature',RefineShapeFeature()) FreeCADGui.addCommand('OpenSCAD_RefineShapeFeature',RefineShapeFeature())
FreeCADGui.addCommand('OpenSCAD_IncreaseToleranceFeature',IncreaseToleranceFeature())
FreeCADGui.addCommand('OpenSCAD_ExpandPlacements',ExpandPlacements()) FreeCADGui.addCommand('OpenSCAD_ExpandPlacements',ExpandPlacements())
FreeCADGui.addCommand('OpenSCAD_ReplaceObject',ReplaceObject()) FreeCADGui.addCommand('OpenSCAD_ReplaceObject',ReplaceObject())
FreeCADGui.addCommand('OpenSCAD_RemoveSubtree',RemoveSubtree()) FreeCADGui.addCommand('OpenSCAD_RemoveSubtree',RemoveSubtree())

View File

@ -292,6 +292,31 @@ class RefineShape:
sh=fp.Base.Shape.removeSplitter() sh=fp.Base.Shape.removeSplitter()
fp.Shape=sh fp.Shape=sh
class IncreaseTolerance:
'''increase the tolerance of every vertex
in the current implementation its' placement is linked'''
def __init__(self,obj,child,tolerance=0):
obj.addProperty("App::PropertyLink","Base","Base",
"The base object that wire must be extracted")
obj.addProperty("App::PropertyDistance","Tolerance","Base","Tolerance")
obj.Base = child
obj.Tolerance = tolerance
obj.Proxy = self
def onChanged(self, fp, prop):
if prop in ["Tolerance"]:
self.createGeometry(fp)
def execute(self, fp):
self.createGeometry(fp)
def createGeometry(self,fp):
if fp.Base:
sh=fp.Base.Shape.copy()
for vertex in sh.Vertexes:
vertex.Tolerance = max(vertex.Tolerance,fp.Tolerance.Value)
fp.Shape = sh
fp.Placement = sh.Placement
class GetWire: class GetWire:
'''return the first wire from a given shape''' '''return the first wire from a given shape'''
def __init__(self, obj,child=None): def __init__(self, obj,child=None):

View File

@ -109,7 +109,7 @@ def callopenscad(inputfilename,outputfilename=None,outputext='csg',keepname=Fals
p=subprocess.Popen(*args,**kwargs) p=subprocess.Popen(*args,**kwargs)
stdoutd,stderrd = p.communicate() stdoutd,stderrd = p.communicate()
if p.returncode != 0: if p.returncode != 0:
raise OpenSCADError('%s %s\n' % (stdoutd.strip(),stderr.strip())) raise OpenSCADError('%s %s\n' % (stdoutd.strip(),stderrd.strip()))
#raise Exception,'stdout %s\n stderr%s' %(stdoutd,stderrd) #raise Exception,'stdout %s\n stderr%s' %(stdoutd,stderrd)
if stderrd.strip(): if stderrd.strip():
FreeCAD.Console.PrintWarning(stderrd+u'\n') FreeCAD.Console.PrintWarning(stderrd+u'\n')
@ -188,12 +188,14 @@ def multiplymat(l,r):
def isorthogonal(submatrix,precision=4): def isorthogonal(submatrix,precision=4):
"""checking if 3x3 Matrix is ortogonal (M*Transp(M)==I)""" """checking if 3x3 Matrix is ortogonal (M*Transp(M)==I)"""
prod=multiplymat(submatrix,zip(*submatrix)) prod=multiplymat(submatrix,zip(*submatrix))
return [[round(f,precision) for f in line] for line in prod]==[[1,0,0],[0,1,0],[0,0,1]] return [[round(f,precision) for f in line] \
for line in prod]==[[1,0,0],[0,1,0],[0,0,1]]
def detsubmatrix(s): def detsubmatrix(s):
"""get the determinant of a 3x3 Matrix given as list of row vectors""" """get the determinant of a 3x3 Matrix given as list of row vectors"""
return s[0][0]*s[1][1]*s[2][2]+s[0][1]*s[1][2]*s[2][0]+s[0][2]*s[1][0]*s[2][1]\ return s[0][0]*s[1][1]*s[2][2]+s[0][1]*s[1][2]*s[2][0]+\
-s[2][0]*s[1][1]*s[0][2]-s[2][1]*s[1][2]*s[0][0]-s[2][2]*s[1][0]*s[0][1] s[0][2]*s[1][0]*s[2][1]-s[2][0]*s[1][1]*s[0][2]-\
s[2][1]*s[1][2]*s[0][0]-s[2][2]*s[1][0]*s[0][1]
def isspecialorthogonalpython(submat,precision=4): def isspecialorthogonalpython(submat,precision=4):
return isorthogonal(submat,precision) and round(detsubmatrix(submat),precision)==1 return isorthogonal(submat,precision) and round(detsubmatrix(submat),precision)==1
@ -202,7 +204,8 @@ def isrotoinversionpython(submat,precision=4):
return isorthogonal(submat,precision) and round(detsubmatrix(submat),precision)==-1 return isorthogonal(submat,precision) and round(detsubmatrix(submat),precision)==-1
def isspecialorthogonal(mat,precision=4): def isspecialorthogonal(mat,precision=4):
return abs(mat.submatrix(3).isOrthogonal(10**(-precision))-1.0) < 10**(-precision) and \ return abs(mat.submatrix(3).isOrthogonal(10**(-precision))-1.0) < \
10**(-precision) and \
abs(mat.submatrix(3).determinant()-1.0) < 10**(-precision) abs(mat.submatrix(3).determinant()-1.0) < 10**(-precision)
def decomposerotoinversion(m,precision=4): def decomposerotoinversion(m,precision=4):
@ -241,6 +244,123 @@ def vec2householder(nv):
nv.z*nv.x*l,nv.z*nv.y*l,nv.z*nv.z*l,0,0,0,0,0) nv.z*nv.x*l,nv.z*nv.y*l,nv.z*nv.z*l,0,0,0,0,0)
return FreeCAD.Matrix()-hh return FreeCAD.Matrix()-hh
def angneg(d):
return d if (d <= 180.0) else (d-360)
def shorthexfloat(f):
s=f.hex()
mantisse, exponent = f.hex().split('p',1)
return '%sp%s' % (mantisse.rstrip('0'),exponent)
def comparerotations(r1,r2):
import FreeCAD
'''compares two rotations
a value of zero means that they are identical'''
r2c=FreeCAD.Rotation(r2)
r2c.invert()
return r1.multiply(r2c).Angle
def findbestmatchingrotation(r1):
import FreeCAD
vangl = \
(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 11.25, 12.0, 13.0,
14.0, 15.0, 16.0, (180.0/11.0), 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 22.5,
23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, (360.0/11.0),
33.0, 33.75, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0,
44.0, 45.0, 46.0, 47.0, 48.0, 49.0,(540.0/11.0), 50.0, 51.0, (360.0/7.0),
52.0, 53.0, 54.0, 55.0, 56.0, 56.25, 57.0, 58.0, 59.0, 60.0, 61.0, 62.0,
63.0, 64.0, 65.0,(720.0/11.0), 66.0, 67.0, 67.5, 68.0, 69.0, 70.0, 71.0,
72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 78.75, 79.0, 80.0, 81.0,(900.0/11.0),
82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0, 90.0, 91.0, 92.0, 93.0, 94.0,
95.0, 96.0, 97.0, 98.0,(1080.0/11.0), 99.0, 100.0, 101.0, 101.25, 102.0,
(720.0/7.0), 103.0, 104.0, 105.0, 106.0, 107.0, 108.0, 109.0, 110.0, 111.0,
112.0, 112.5, 113.0, 114.0, (1260.0/11), 115.0, 116.0, 117.0, 118.0, 119.0,
120.0, 121.0, 122.0, 123.0, 123.75, 124.0, 125.0, 126.0, 127.0, 128.0,
129.0, 130.0,(1440.0/11.0), 131.0, 132.0, 133.0, 134.0, 135.0, 136.0,
137.0, 138.0, 139.0, 140.0, 141.0, 142.0, 143.0, 144.0, 145.0, 146.0, 146.25,
147.0, (1620.0/11.0), 148.0, 149.0, 150.0, 151.0, 152.0, 153.0, 154.0,
(1080.0/7.0), 155.0, 156.0, 157.0, 157.5, 158.0, 159.0, 160.0, 161.0, 162.0,
163.0, (1800.0/11.0), 164.0, 165.0, 166.0, 167.0, 168.0, 168.75, 169.0, 170.0,
171.0, 172.0, 173.0, 174.0, 175.0, 176.0, 177.0,178.0, 179.0,180.0,
-179.0, -178.0, -177.0, -176.0, -175.0, -174.0, -173.0, -172.0, -171.0, -170.0,
-169.0, -168.75, -168.0, -167.0, -166.0, -165.0, -164.0, (-1800.0/11.0),
-163.0, -162.0, -161.0, -160.0, -159.0, -158.0, -157.5, -157.0, -156.0,
-155.0, (-1080.0/7.0), -154.0, -153.0, -152.0, -151.0, -150.0, -149.0, -148.0,
(-1620.0/11.0), -147.0, -146.25, -146.0, -145.0, -144.0, -143.0, -142.0,
-141.0, -140.0, -139.0,-138.0, -137.0, -136.0, -135.0, -134.0, -133.0, -132.0,
-131.0, (-1440/11.0), -130.0, -129.0, -128.0,-127.0, -126.0, -125.0, -124.0,
-123.75, -123.0, -122.0, -121.0, -120.0, -119.0, -118.0, -117.0, -116.0,
-115.0,(-1260.0/11.0), -114.0, -113.0, -112.5, -112.0, -111.0, -110.0, -109.0,
-108.0, -107.0, -106.0, -105.0,-104.0, -103.0,(-720.0/7.0), -102.0, -101.25,
-101.0, -100.0, -99.0, (-1080.0/11.0), -98.0, -97.0, -96.0, -95.0, -94.0,
-93.0, -92.0, -91.0, -90.0, -89.0, -88.0, -87.0, -86.0, -85.0, -84.0, -83.0,
-82.0,(-900.0/11.0), -81.0, -80.0, -79.0, -78.75, -78.0, -77.0, -76.0, -75.0,
-74.0, -73.0, -72.0, -71.0, -70.0, -69.0, -68.0, -67.5, -67.0, -66.0,
(-720.0/11.0), -65.0, -64.0, -63.0, -62.0, -61.0, -60.0, -59.0, -58.0, -57.0,
-56.25, -56.0, -55.0, -54.0, -53.0, -52.0,(-360.0/7.0), -51.0, -50.0,
(-540.0/11.0), -49.0, -48.0, -47.0, -46.0, -45.0, -44.0, -43.0, -42.0, -41.0,
-40.0, -39.0, -38.0, -37.0, -36.0, -35.0, -34.0, -33.75, -33.0,(-360.0/11.0),
-32.0, -31.0, -30.0, -29.0, -28.0, -27.0, -26.0, -25.0, -24.0, -23.0, -22.5,
-22.0, -21.0, -20.0, -19.0, -18.0, -17.0,(-180.0/11.0), -16.0, -15.0, -14.0,
-13.0, -12.0, -11.25, -11.0, -10.0, -9.0, -8.0, -7.0, -6.0, -5.0, -4.0, -3.0,
-2.0, -1.0)
def tup2nvect(tup):
"""convert a tuple to a normalized vector"""
v=FreeCAD.Vector(*tup)
v.normalize()
return v
def wkaxes():
"""well known axes for rotations"""
vtupl=((1,0,0),(0,1,0),(0,0,1),
(1,1,0),(1,0,1),(0,1,1),(-1,1,0),(-1,0,1),(0,1,-1),
(1,1,1),(1,1,-1),(1,-1,1),(-1,1,1))
return tuple(tup2nvect(tup) for tup in vtupl)
bestrot=FreeCAD.Rotation()
dangle = comparerotations(r1,bestrot)
for axis in wkaxes():
for angle in vangl:
for axissign in (1.0,-1.0):
r2=FreeCAD.Rotation(axis*axissign,angle)
dangletest = comparerotations(r1,r2)
if dangletest < dangle:
bestrot = r2
dangle = dangletest
return (bestrot,dangle)
def roundrotation(rot,maxangulardistance=1e-5):
'''guess the rotation axis and angle for a rotation
recreated from rounded floating point values
(from a quaterion or transformation matrix)'''
def teststandardrot(r1,maxangulardistance=1e-5):
'''test a few common rotations beforehand'''
import FreeCAD,itertools
eulers = []
for angle in (90,-90,180,45,-45,135,-135):
for euler in itertools.permutations((0,0,angle)):
eulers.append(euler)
for euler in itertools.product((0,45,90,135,180,-45,-90,-135),repeat=3):
eulers.append(euler)
for euler in eulers:
r2 = FreeCAD.Rotation(*euler)
if comparerotations(r1,r2) < maxangulardistance:
return r2
if rot.isNull():
return rot
firstguess = teststandardrot(rot,maxangulardistance)
if firstguess is not None:
return firstguess
#brute force
bestguess,angulardistance = findbestmatchingrotation(rot)
if angulardistance < maxangulardistance: #use guess
return bestguess
else: #use original
return rot
def callopenscadmeshstring(scadstr): def callopenscadmeshstring(scadstr):
"""Call OpenSCAD and return the result as a Mesh""" """Call OpenSCAD and return the result as a Mesh"""
import Mesh,os import Mesh,os
@ -414,3 +534,24 @@ def process_ObjectsViaOpenSCAD(doc,children,name):
import FreeCAD import FreeCAD
FreeCAD.Console.PrintError( unicode(translate('OpenSCAD',\ FreeCAD.Console.PrintError( unicode(translate('OpenSCAD',\
"Error all shapes must be either 2D or both must be 3D"))+u'\n') "Error all shapes must be either 2D or both must be 3D"))+u'\n')
def removesubtree(objs):
def addsubobjs(obj,toremoveset):
toremove.add(obj)
for subobj in obj.OutList:
addsubobjs(subobj,toremoveset)
import FreeCAD
toremove=set()
for obj in objs:
addsubobjs(obj,toremove)
checkinlistcomplete =False
while not checkinlistcomplete:
for obj in toremove:
if (obj not in objs) and (frozenset(obj.InList) - toremove):
toremove.remove(obj)
break
else:
checkinlistcomplete = True
for obj in toremove:
obj.Document.removeObject(obj.Name)

File diff suppressed because one or more lines are too long

View File

@ -6,6 +6,7 @@
<file>icons/OpenSCAD_RefineShapeFeature.svg</file> <file>icons/OpenSCAD_RefineShapeFeature.svg</file>
<file>icons/OpenSCAD_ReplaceObject.svg</file> <file>icons/OpenSCAD_ReplaceObject.svg</file>
<file>icons/OpenSCAD_RemoveSubtree.svg</file> <file>icons/OpenSCAD_RemoveSubtree.svg</file>
<file>icons/OpenSCAD_Explode_Group.svg</file>
<file>icons/OpenSCAD_MeshBooleans.svg</file> <file>icons/OpenSCAD_MeshBooleans.svg</file>
<file>icons/OpenSCAD_Hull.svg</file> <file>icons/OpenSCAD_Hull.svg</file>
<file>icons/OpenSCAD_Minkowski.svg</file> <file>icons/OpenSCAD_Minkowski.svg</file>

View File

@ -0,0 +1,588 @@
<?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="svg2980"
sodipodi:version="0.32"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="OpenSCAD_Explode_Group_9.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1"
inkscape:export-filename="/home/user/Downloads/cad/mystuff/icons/OpenSCAD_workbench/OpenSCAD_Explode_Group_9_32px.png"
inkscape:export-xdpi="45"
inkscape:export-ydpi="45">
<defs
id="defs2982">
<linearGradient
id="linearGradient4287">
<stop
id="stop4289"
offset="0"
style="stop-color:#f87c71;stop-opacity:1;" />
<stop
id="stop4291"
offset="1"
style="stop-color:#ff0000;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient3864">
<stop
id="stop3866"
offset="0"
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
id="stop3868"
offset="1"
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="radialGradient3850"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.6028459,1.0471639,-1.9794021,1.1395295,127.9588,-74.456907)"
cx="51.328892"
cy="31.074146"
fx="51.328892"
fy="31.074146"
r="19.571428" />
<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="perspective2988" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377-6"
id="radialGradient3699"
gradientUnits="userSpaceOnUse"
cx="76.383331"
cy="94.369568"
fx="76.383331"
fy="94.369568"
r="19.467436"
gradientTransform="matrix(0.9818943,0.1894295,-0.4109427,2.1300924,40.163453,-121.11559)" />
<linearGradient
id="linearGradient3377">
<stop
id="stop3379"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3381"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3701"
gradientUnits="userSpaceOnUse"
cx="84.883324"
cy="77.042847"
fx="84.883324"
fy="77.042847"
r="19.467436"
gradientTransform="matrix(2.8492421,1.2585119,-0.4040415,0.9147407,-125.84131,-100.25805)" />
<linearGradient
id="linearGradient3007">
<stop
id="stop3009"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3011"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<radialGradient
r="19.467436"
fy="77.042847"
fx="84.883324"
cy="77.042847"
cx="84.883324"
gradientTransform="matrix(2.8492421,1.2585119,-0.4040415,0.9147407,-125.84131,-100.25805)"
gradientUnits="userSpaceOnUse"
id="radialGradient3017"
xlink:href="#linearGradient3377-6"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377-6"
id="radialGradient3699-2"
gradientUnits="userSpaceOnUse"
cx="76.383331"
cy="94.369568"
fx="76.383331"
fy="94.369568"
r="19.467436"
gradientTransform="matrix(0.9818943,0.1894295,-0.4109427,2.1300924,40.163453,-121.11559)" />
<linearGradient
id="linearGradient3377-6">
<stop
id="stop3379-2"
offset="0"
style="stop-color:#00afff;stop-opacity:1;" />
<stop
id="stop3381-4"
offset="1"
style="stop-color:#0034ff;stop-opacity:1;" />
</linearGradient>
<radialGradient
r="19.467436"
fy="77.042847"
fx="84.883324"
cy="77.042847"
cx="84.883324"
gradientTransform="matrix(2.8492421,1.2585119,-0.4040415,0.9147407,-125.84131,-100.25805)"
gradientUnits="userSpaceOnUse"
id="radialGradient3017-8"
xlink:href="#linearGradient3377-6"
inkscape:collect="always" />
<linearGradient
id="linearGradient3835">
<stop
id="stop3837"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3839"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<radialGradient
r="19.467436"
fy="77.042847"
fx="84.883324"
cy="77.042847"
cx="84.883324"
gradientTransform="matrix(2.8492421,1.2585119,-0.4040415,0.9147407,-125.84131,-100.25805)"
gradientUnits="userSpaceOnUse"
id="radialGradient3844"
xlink:href="#linearGradient3377-6"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377-6"
id="radialGradient3699-7"
gradientUnits="userSpaceOnUse"
cx="76.383331"
cy="94.369568"
fx="76.383331"
fy="94.369568"
r="19.467436"
gradientTransform="matrix(0.9818943,0.1894295,-0.4109427,2.1300924,40.163453,-121.11559)" />
<linearGradient
id="linearGradient3377-2">
<stop
id="stop3379-7"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3381-8"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<radialGradient
r="19.467436"
fy="77.042847"
fx="84.883324"
cy="77.042847"
cx="84.883324"
gradientTransform="matrix(2.8492421,1.2585119,-0.4040415,0.9147407,-125.84131,-100.25805)"
gradientUnits="userSpaceOnUse"
id="radialGradient3017-6"
xlink:href="#linearGradient3377-2"
inkscape:collect="always" />
<linearGradient
id="linearGradient3835-1">
<stop
id="stop3837-0"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3839-9"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<radialGradient
r="19.467436"
fy="77.042847"
fx="84.883324"
cy="77.042847"
cx="84.883324"
gradientTransform="matrix(2.8492421,1.2585119,-0.4040415,0.9147407,-125.84131,-100.25805)"
gradientUnits="userSpaceOnUse"
id="radialGradient3844-7"
xlink:href="#linearGradient3377-6"
inkscape:collect="always" />
<linearGradient
id="linearGradient4032">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop4034" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop4036" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4032"
id="radialGradient4114"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.19036833,-0.61386357,1.99853,-0.19092801,-47.133199,165.45559)"
cx="113.50187"
cy="65.849281"
fx="113.50187"
fy="65.849281"
r="19.467436" />
<linearGradient
id="linearGradient3171">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop3173" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop3175" />
</linearGradient>
<linearGradient
id="linearGradient4032-7">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop4034-3" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop4036-6" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4032-7"
id="radialGradient4114-3"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.19036833,-0.61386357,1.99853,-0.19092801,-47.133199,165.45559)"
cx="113.50187"
cy="65.849281"
fx="113.50187"
fy="65.849281"
r="19.467436" />
<linearGradient
id="linearGradient3171-9">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop3173-7" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop3175-5" />
</linearGradient>
<linearGradient
id="linearGradient4032-8">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop4034-4" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop4036-3" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4032-8"
id="radialGradient4114-9"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.19036833,-0.61386357,1.99853,-0.19092801,-47.133199,165.45559)"
cx="113.50187"
cy="65.849281"
fx="113.50187"
fy="65.849281"
r="19.467436" />
<linearGradient
id="linearGradient3171-1">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop3173-0" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop3175-3" />
</linearGradient>
<linearGradient
id="linearGradient4032-0">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop4034-37" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop4036-1" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4032-0"
id="radialGradient3703"
gradientUnits="userSpaceOnUse"
cx="132.70454"
cy="90.193245"
fx="132.70454"
fy="90.193245"
r="19.467436"
gradientTransform="matrix(-0.08162339,1.3949072,-1.1572569,-0.26963374,245.22773,-105.44363)" />
<linearGradient
id="linearGradient3284">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop3286" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop3288" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3593"
id="radialGradient3599"
gradientUnits="userSpaceOnUse"
cx="51.637894"
cy="24.962704"
fx="51.637894"
fy="24.962704"
r="19.571428" />
<linearGradient
id="linearGradient3593">
<stop
style="stop-color:#c8e0f9;stop-opacity:1;"
offset="0"
id="stop3595" />
<stop
style="stop-color:#637dca;stop-opacity:1;"
offset="1"
id="stop3597" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-9"
id="radialGradient3552"
gradientUnits="userSpaceOnUse"
cx="48.645836"
cy="25.149042"
fx="48.645836"
fy="25.149042"
r="19.571428" />
<linearGradient
id="linearGradient3864-9">
<stop
id="stop3866-3"
offset="0"
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
id="stop3868-3"
offset="1"
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<radialGradient
r="19.571428"
fy="25.149042"
fx="48.645836"
cy="25.149042"
cx="48.645836"
gradientUnits="userSpaceOnUse"
id="radialGradient3304"
xlink:href="#linearGradient3864-9"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4287"
id="radialGradient4285"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.54355955,-0.69959567,1.0924249,-0.61410558,95.667642,203.16161)"
cx="112.7718"
cy="66.255531"
fx="112.7718"
fy="66.255531"
r="19.467436" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4287"
id="linearGradient4293"
x1="25.559771"
y1="48.403759"
x2="31.477535"
y2="52.710686"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="12.390625"
inkscape:cx="31.919294"
inkscape:cy="32"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1280"
inkscape:window-height="1004"
inkscape:window-x="1278"
inkscape:window-y="-3"
inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata
id="metadata2985">
<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">
<g
id="g3560"
transform="matrix(0.91273618,0,0,0.90349515,7.8537384,-1.1996367)">
<path
transform="matrix(0.9153551,0,0,0.3021994,-4.6085053,28.76682)"
d="m 71.785715,34.571426 c 0,10.256717 -8.314712,18.571429 -18.571428,18.571429 -10.256717,0 -18.571428,-8.314712 -18.571428,-18.571429 0,-10.256716 8.314711,-18.571428 18.571428,-18.571428 10.256716,0 18.571428,8.314712 18.571428,18.571428 z"
sodipodi:ry="18.571428"
sodipodi:rx="18.571428"
sodipodi:cy="34.571426"
sodipodi:cx="53.214287"
id="path3558"
style="opacity:0.66523605;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
sodipodi:type="arc" />
<path
transform="matrix(1.0092422,0,0,1.0092422,-12.598958,-12.283801)"
d="m 71.785715,34.571426 c 0,10.256717 -8.314712,18.571429 -18.571428,18.571429 -10.256717,0 -18.571428,-8.314712 -18.571428,-18.571429 0,-10.256716 8.314711,-18.571428 18.571428,-18.571428 10.256716,0 18.571428,8.314712 18.571428,18.571428 z"
sodipodi:ry="18.571428"
sodipodi:rx="18.571428"
sodipodi:cy="34.571426"
sodipodi:cx="53.214287"
id="path2768"
style="fill:url(#radialGradient3599);fill-opacity:1;fill-rule:evenodd;stroke:#4b4dba;stroke-width:2.17985344;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"
sodipodi:type="arc" />
<path
transform="matrix(1.1483533,0,0,0.3791225,-28.823086,42.536051)"
d="m 71.785715,34.571426 c 0,10.256717 -8.314712,18.571429 -18.571428,18.571429 -10.256717,0 -18.571428,-8.314712 -18.571428,-18.571429 0,-10.256716 8.314711,-18.571428 18.571428,-18.571428 10.256716,0 18.571428,8.314712 18.571428,18.571428 z"
sodipodi:ry="18.571428"
sodipodi:rx="18.571428"
sodipodi:cy="34.571426"
sodipodi:cx="53.214287"
id="path3554"
style="opacity:0.66523605;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
sodipodi:type="arc" />
<path
transform="matrix(1.12939,0,0,1.12939,-36.028256,1.4553754)"
d="m 71.785715,34.571426 c 0,10.256717 -8.314712,18.571429 -18.571428,18.571429 -10.256717,0 -18.571428,-8.314712 -18.571428,-18.571429 0,-10.256716 8.314711,-18.571428 18.571428,-18.571428 10.256716,0 18.571428,8.314712 18.571428,18.571428 z"
sodipodi:ry="18.571428"
sodipodi:rx="18.571428"
sodipodi:cy="34.571426"
sodipodi:cx="53.214287"
id="path3550"
style="fill:url(#radialGradient3304);fill-opacity:1;fill-rule:evenodd;stroke:#000137;stroke-width:1.94795418;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"
sodipodi:type="arc" />
</g>
<g
id="g3760-8"
transform="matrix(0.4215621,-0.05553169,-0.07935438,0.54086525,28.000485,-15.81317)" />
<g
id="g3080"
transform="matrix(0.84096804,-0.46792735,0.48377141,0.79640302,-35.221278,20.515799)">
<path
sodipodi:nodetypes="ccccc"
id="path3727-0"
d="M 32.018051,65.595741 C 36.744064,58.001751 42.050792,48.459568 47.711504,38.38254 L 29.593262,29.441251 15.069181,54.973283 c -1.037712,5.511601 6.035212,12.3496 16.94887,10.622458 z"
style="fill:url(#linearGradient4293);fill-opacity:1;fill-rule:evenodd;stroke:#170b0b;stroke-width:3.09920310999999993;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:connector-curvature="0" />
<path
inkscape:transform-center-y="7.1498714"
inkscape:transform-center-x="-3.804363"
transform="matrix(-0.37252959,-0.2637647,0.95315141,-0.45225642,-5.3109174,97.4746)"
d="m 118.01777,83.5 a 21.589199,5.3571429 0 1 1 -43.178395,0 21.589199,5.3571429 0 1 1 43.178395,0 z"
sodipodi:ry="5.3571429"
sodipodi:rx="21.589199"
sodipodi:cy="83.5"
sodipodi:cx="96.428574"
id="path3725-5"
style="fill:url(#radialGradient4285);fill-opacity:1;fill-rule:evenodd;stroke:#120a0a;stroke-width:4.22300577000000033;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
sodipodi:type="arc" />
</g>
<path
style="fill:none;stroke:#ff0000;stroke-width:2.78663731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 13.064488,29.714001 C 13.807605,23.213426 7.0460579,17.714565 14.178417,11.130255"
id="path3908"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<g
id="g3457"
transform="translate(-5.9389499,0.85958486)">
<path
style="fill:none;stroke:#ff0000;stroke-width:1.40416193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 8.1193963,12.314307 14.372272,11.461474"
id="path3086"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3856"
d="M 19.736155,5.6372344 19.467228,0.63586316"
style="fill:none;stroke:#ff0000;stroke-width:1.40416193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3856-0"
d="M 24.79896,9.8372572 32.712828,8.6932319"
style="fill:none;stroke:#ff0000;stroke-width:1.40416193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3856-4"
d="M 23.649368,6.3602312 28.463769,0.96777073"
style="fill:none;stroke:#ff0000;stroke-width:1.40416193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
style="fill:none;stroke:#ff0000;stroke-width:1.40416193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 15.472346,6.7195999 9.6977995,2.8114355"
id="path3894"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ff0000;stroke-width:1.40416193;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 25.398229,16.704601 22.971518,12.441529"
id="path3896"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -2,7 +2,6 @@
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg <svg
xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@ -13,14 +12,236 @@
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64px" width="64px"
height="64px" height="64px"
id="svg2980" id="svg3052"
sodipodi:version="0.32" sodipodi:version="0.32"
inkscape:version="0.48.3.1 r9886" inkscape:version="0.48.3.1 r9886"
sodipodi:docname="Tree_Part.svg" sodipodi:docname="Part_Refine_Shape_Parametric.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape" inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1"> version="1.1"
inkscape:export-filename="/home/user/Downloads/cad/mystuff/icons/Part and general/Part_Refine_Shape/Part_Refine_Shape_Parametric_16px.png"
inkscape:export-xdpi="22.5"
inkscape:export-ydpi="22.5">
<defs <defs
id="defs2982"> id="defs3054">
<linearGradient
id="linearGradient4032">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop4034" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop4036" />
</linearGradient>
<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="perspective3060" />
<linearGradient
id="linearGradient3377">
<stop
id="stop3379"
offset="0"
style="stop-color:#4bff54;stop-opacity:1;" />
<stop
id="stop3381"
offset="1"
style="stop-color:#00b800;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient3199">
<stop
id="stop3201"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3203"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3692"
cx="45.883327"
cy="28.869568"
fx="45.883327"
fy="28.869568"
r="19.467436"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3206">
<stop
id="stop3208"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3210"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4032-5"
id="radialGradient3703-5"
gradientUnits="userSpaceOnUse"
cx="133.69075"
cy="92.823502"
fx="133.69075"
fy="92.823502"
r="19.467436"
gradientTransform="matrix(-0.08150155,0.8812939,-1.1555294,-0.17035295,253.69838,-14.119161)" />
<linearGradient
id="linearGradient4032-5">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop4034-3" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop4036-6" />
</linearGradient>
<linearGradient
id="linearGradient3377-9">
<stop
id="stop3379-3"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3381-7"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377-9"
id="radialGradient3144"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.9818943,0.1894295,-0.4109427,2.1300924,-24.621424,-189.11511)"
cx="76.383331"
cy="94.369568"
fx="76.383331"
fy="94.369568"
r="19.467436" />
<linearGradient
id="linearGradient3162">
<stop
id="stop3164"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3166"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377-9"
id="radialGradient4047"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.26138713,0.54129082,-1.0901609,-0.48453763,158.43617,23.491203)"
cx="86.836884"
cy="90.601151"
fx="86.836884"
fy="90.601151"
r="19.467436" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377-9-9"
id="radialGradient4049"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.8492421,1.2585119,-0.4040415,0.9147407,-125.84131,-100.25805)"
cx="84.883324"
cy="77.042847"
fx="84.883324"
fy="77.042847"
r="19.467436" />
<linearGradient
id="linearGradient3377-9-9">
<stop
id="stop3379-3-2"
offset="0"
style="stop-color:#faff2b;stop-opacity:1;" />
<stop
id="stop3381-7-3"
offset="1"
style="stop-color:#ffaa00;stop-opacity:1;" />
</linearGradient>
<radialGradient
r="19.467436"
fy="77.042847"
fx="84.883324"
cy="77.042847"
cx="84.883324"
gradientTransform="matrix(0.05484005,0.20633765,-1.3480108,0.19469672,184.08291,44.528235)"
gradientUnits="userSpaceOnUse"
id="radialGradient4066"
xlink:href="#linearGradient3377-9-9"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4032"
id="linearGradient3957"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.96628924,0,0,0.97142924,3.6966536,2.8994362)"
x1="133.93095"
y1="36.432716"
x2="184.15427"
y2="87.916885" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4032"
id="linearGradient3959"
gradientUnits="userSpaceOnUse"
x1="94.056625"
y1="82.853188"
x2="89.819969"
y2="72.796349" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4032"
id="linearGradient3961"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.96628924,0,0,0.97142924,3.6966536,2.8994362)"
x1="133.93095"
y1="36.432716"
x2="184.15427"
y2="87.916885" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4032"
id="linearGradient3963"
gradientUnits="userSpaceOnUse"
x1="94.056625"
y1="82.853188"
x2="89.819969"
y2="72.796349" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4032"
id="linearGradient3974"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.96628924,0,0,0.97142924,3.6966536,2.8994362)"
x1="159.48199"
y1="58.87999"
x2="183.4729"
y2="104.34172" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="radialGradient2401"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.959337,0.05179994,0,0.7352325,-29.610908,-1.231413)"
cx="51.105499"
cy="23.807407"
fx="51.105499"
fy="23.807407"
r="19.571428" />
<linearGradient <linearGradient
id="linearGradient3864"> id="linearGradient3864">
<stop <stop
@ -32,24 +253,6 @@
offset="1" offset="1"
style="stop-color:#002795;stop-opacity:1;" /> style="stop-color:#002795;stop-opacity:1;" />
</linearGradient> </linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3864"
id="radialGradient3850"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.6028459,1.0471639,-1.9794021,1.1395295,127.9588,-74.456907)"
cx="51.328892"
cy="31.074146"
fx="51.328892"
fy="31.074146"
r="19.571428" />
<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="perspective2988" />
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
@ -58,20 +261,21 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="1.6160967" inkscape:zoom="4.4691358"
inkscape:cx="16.57935" inkscape:cx="68.95789"
inkscape:cy="-46.748843" inkscape:cy="-0.1278371"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
showgrid="true" showgrid="true"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:grid-bbox="true" inkscape:grid-bbox="true"
inkscape:window-width="911" inkscape:window-width="1280"
inkscape:window-height="684" inkscape:window-height="964"
inkscape:window-x="177" inkscape:window-x="-2"
inkscape:window-y="19" inkscape:window-y="-3"
inkscape:window-maximized="0" /> inkscape:window-maximized="1"
inkscape:snap-global="false" />
<metadata <metadata
id="metadata2985"> id="metadata3057">
<rdf:RDF> <rdf:RDF>
<cc:Work <cc:Work
rdf:about=""> rdf:about="">
@ -87,316 +291,107 @@
inkscape:label="Layer 1" inkscape:label="Layer 1"
inkscape:groupmode="layer"> inkscape:groupmode="layer">
<g <g
id="g3845" id="g3947"
transform="matrix(0.49611692,0,0,0.49611692,-6.2336536,-40.712112)"> transform="matrix(0.49076004,0.51305093,-0.52342121,0.48103687,-17.3633,17.650448)"
<path inkscape:transform-center-x="0.1100357"
style="fill:#0034ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" inkscape:transform-center-y="-0.79451631">
d="m 96.18444,141.44968 -19.81441,7.17921 29.4349,3.97209 -0.72357,36.12665 17.25881,-10.94388 0.57587,-34.38485 -26.7316,-1.94922 z" <g
id="path3823" id="g3817" />
sodipodi:nodetypes="ccccccc"
inkscape:connector-curvature="0" />
<path
style="fill:#0034ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 75.57941,148.6589 30.70884,3.36562 0,36.47719 -31.12383,-5.06479 0.41499,-34.77802 z"
id="path3825"
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0" />
<path
style="fill:url(#radialGradient3850);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;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"
d="m 106.05435,152.06948 16.72598,-8.4088"
id="path3827"
inkscape:connector-curvature="0" />
</g> </g>
<g <g
style="stroke:#000000;stroke-width:1.97789347;stroke-miterlimit:10;stroke-dasharray:none;overflow:visible" id="g3943"
id="g3981" transform="translate(-0.39555006,1.0284302)">
transform="matrix(0.34530072,-0.0459555,0.0459555,0.34530072,-43.228956,-7.238134)">
<g <g
id="Layer_1" style="stroke-width:1.56434965;stroke-miterlimit:4;stroke-dasharray:none"
i:rgbTrio="#4F008000FFFF" transform="matrix(0.27251135,0,0,0.33392666,-30.604145,33.869703)"
i:layer="yes" id="g3618">
i:dimmedPercent="50" <path
style="stroke:#000000;stroke-width:1.97789347;stroke-miterlimit:10;stroke-dasharray:none"> inkscape:connector-curvature="0"
<g style="fill:url(#linearGradient3957);fill-opacity:1;fill-rule:evenodd;stroke:#000060;stroke-width:6.84451723;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="g3891" d="m 126.0389,18.665118 -0.11508,59.270698 c 26.40125,0.174551 37.62436,0.295763 69.10383,0.533278 l 0.13669,-59.339478 c -34.19797,1.8e-5 -30.50071,-0.183056 -69.12544,-0.464498 z"
transform="matrix(-0.32435514,0.13754467,-0.13754467,-0.32435514,270.902,139.40876)" id="path4028"
style="stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none"> sodipodi:nodetypes="ccccc" />
<path
id="path3893"
stroke-miterlimit="10"
i:knockout="Off"
d="m 348.426,49.113 c 15.516,-4.14 30.348,-8.028 45.469,-11.664 15.084,-3.852 34.055,-8.46 44.135,-10.332 9.938,-1.872 10.621,-1.116 15.084,-0.36 4.32,0.648 8.244,3.492 10.801,4.932 2.34,1.296 3.527,0.648 3.564,3.744 -0.18,3.096 -1.477,11.34 -3.889,15.156 -2.447,3.708 -6.553,5.364 -10.367,7.488 -3.889,2.088 -7.668,3.132 -12.602,5.076 -5.039,1.872 -4.248,0.72 -17.207,5.976 -13.213,5.148 -44.461,18.072 -60.264,24.876 -15.732,6.66 -22.932,9.36 -33.553,15.192 -10.764,5.795 -21.889,15.588 -30.313,19.26 -8.459,3.492 -13.859,1.477 -19.943,2.16 -6.084,0.611 -8.711,-0.145 -16.775,1.764 -8.316,1.871 -22.248,5.939 -32.221,9.432 -10.116,3.492 -20.988,8.172 -27.216,10.98 -6.192,2.629 -9.432,4.213 -9.72,4.896 -0.18,3.131 -2.016,6.119 -5.508,9.107 -3.6,2.988 -6.516,4.176 -15.552,8.713 -9.216,4.428 -26.964,12.096 -38.952,17.855 -12.168,5.725 -23.544,11.557 -32.76,16.127 -9.144,4.43 -16.236,7.957 -21.816,10.584 -5.688,2.592 -7.596,4.43 -11.952,4.969 -4.392,0.359 -8.1,0.324 -14.616,-2.629 -6.732,-3.131 -17.388,-10.367 -25.02,-15.443 -7.704,-5.111 -16.2,-10.512 -20.484,-14.832 -4.248,-4.32 -3.852,-6.588 -4.932,-11.088 -1.224,-4.68 -2.52,-11.988 -1.8,-16.236 0.612,-4.355 2.556,-6.984 5.976,-9.395 3.492,-2.412 8.064,-4.141 14.4,-5.041 0.432,-9.791 0.18,-19.477 -0.612,-29.34 -0.972,-9.972 -3.24,-21.636 -4.428,-29.736 -1.152,-8.172 -2.052,-14.184 -2.556,-18.576 1.8,-4.104 4.068,-6.804 6.804,-8.532 2.664,-1.764 6.336,-1.656 9.36,-1.62 2.916,-0.072 5.724,0.468 8.28,1.476 1.8,-4.788 4.608,-7.56 8.568,-8.316 3.852,-0.756 8.856,0.396 14.868,3.6 1.836,-3.96 4.5,-6.084 7.992,-6.516 3.492,-0.432 7.704,0.828 12.78,3.924 1.548,-3.024 3.708,-4.788 6.624,-5.148 2.88,-0.396 6.48,0.468 10.8,2.736 1.908,-2.952 4.428,-4.536 7.56,-4.896 3.132,-0.432 6.732,0.504 11.088,2.664 0.18,-1.44 1.224,-2.412 3.672,-2.52 2.268,-0.216 7.128,0.612 10.296,1.368 3.096,0.612 4.644,1.368 8.388,2.664 3.6,1.26 9.252,3.096 13.5,4.932 4.248,1.728 9.288,2.556 11.628,5.4 2.196,2.772 1.764,4.788 1.764,11.34 -0.036,6.588 -1.8,20.268 -1.836,27.576 -0.18,7.236 0.18,12.204 0.936,15.444 13.068,-4.32 25.056,-8.748 36.504,-13.824 11.412,-5.148 23.688,-11.556 31.536,-16.308 7.596,-4.896 9.035,-9.432 14.473,-12.348 5.398,-2.916 10.295,-3.24 17.748,-5.148 7.379,-2.052 16.416,-4.212 26.279,-6.768 9.684,-2.772 22.393,-6.372 31.859,-8.856 9.398,-2.483 17.318,-4.463 24.158,-5.939 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3895"
stroke-miterlimit="10"
i:knockout="Off"
d="m 259.326,74.709 c 13.104,-2.7 26.855,-5.94 42.084,-10.008 15.191,-4.212 31.68,-9.684 48.348,-14.184 16.633,-4.536 34.92,-8.712 50.4,-12.384 15.264,-3.816 31.463,-8.496 40.824,-9.72 9.18,-1.26 10.764,0.936 14.471,2.412 3.637,1.368 9.721,3.996 7.416,6.084 -2.447,1.944 -9.684,3.096 -21.852,6.372 -12.348,3.24 -34.523,8.856 -51.119,13.536 -16.705,4.68 -31.393,9.108 -47.953,14.4 -16.631,5.22 -38.195,11.988 -50.939,16.812 -12.744,4.752 -12.707,6.084 -25.164,11.772 -12.707,5.58 -35.82,15.768 -49.752,21.816 -13.932,6.047 -25.38,12.24 -32.832,14.004 -7.488,1.477 -8.928,-2.305 -11.664,-4.393 -2.916,-2.123 -4.536,-4.68 -5.256,-7.955 11.484,-4.141 22.572,-8.605 33.66,-13.537 11.052,-5.004 24.3,-10.944 32.364,-15.876 7.884,-5.04 10.621,-10.404 15.156,-13.608 4.5,-3.203 8.388,-5.003 11.808,-5.543 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#0034ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3897"
i:knockout="Off"
d="m 170.154,126.621 c 15.156,-6.553 27.72,-12.133 38.376,-17.028 10.548,-4.824 18.432,-8.46 24.768,-12.024 6.155,-3.816 8.243,-9.036 12.384,-9.972 4.141,-0.9 9.9,2.916 12.023,4.644 1.98,1.62 2.305,3.708 0,5.292 -2.52,1.332 -7.848,1.584 -14.328,3.528 -6.551,2.052 -16.307,5.616 -24.263,8.604 -7.992,2.772 -15.336,5.292 -23.292,8.677 -8.1,3.42 -16.092,7.199 -24.516,11.627 -0.36,-1.115 -0.756,-2.233 -1.152,-3.348 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#0034ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3899"
stroke-miterlimit="10"
i:knockout="Off"
d="m 463.158,40.797 c 0.828,3.924 -0.396,7.236 -4.068,10.224 -3.744,2.844 -10.332,4.356 -17.676,7.308 -7.488,2.916 -16.057,6.048 -26.244,10.08 -10.332,3.888 -24.191,9.072 -34.633,13.464 -10.439,4.32 -17.711,7.524 -27.646,12.384 -10.152,4.716 -24.084,10.836 -32.365,15.876 -8.279,4.896 -11.736,10.908 -17.172,13.465 -5.652,2.412 -9.287,0.863 -15.768,1.584 -6.553,0.684 -12.527,0.252 -22.787,2.592 -10.514,2.268 -28.945,7.523 -38.917,10.908 -9.972,3.311 -13.824,6.119 -20.16,8.818 -6.336,2.594 -12.024,4.896 -17.46,6.912 0.756,4.141 -0.216,7.668 -3.312,10.729 -3.096,2.953 -8.1,3.996 -15.012,7.309 -7.128,3.203 -16.416,7.236 -27.036,12.24 -10.764,4.967 -25.92,12.492 -36.576,17.568 -10.764,5.074 -19.692,9.287 -27.072,12.348 -7.416,2.879 -9.756,6.443 -16.884,5.146 -7.236,-1.367 -17.568,-8.1 -25.992,-13.104 -8.676,-5.111 -19.296,-10.332 -24.624,-17.027 -5.22,-6.805 -8.604,-20.34 -6.66,-23.111 1.908,-2.773 10.512,2.916 17.748,6.516 7.056,3.42 17.496,11.592 24.66,14.4 7.056,2.844 10.548,3.6 17.712,2.268 7.056,-1.549 13.788,-6.336 24.66,-11.016 10.944,-4.789 27.108,-11.412 40.032,-17.102 12.816,-5.76 26.748,-13.428 36.108,-16.775 9.216,-3.313 15.336,-4.248 18.756,-2.951 4.068,-3.133 12.384,-7.561 25.092,-13.428 12.744,-6.086 36.792,-15.408 50.759,-21.709 13.896,-6.264 19.477,-10.728 32.148,-15.48 12.529,-4.896 24.625,-7.632 42.949,-13.212 18.359,-5.688 44.818,-14.004 66.311,-20.232 21.385,-6.336 41.438,-11.772 61.129,-16.992 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#0034ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3901"
i:knockout="Off"
d="m 52.758,212.877 c -4.104,-0.973 -20.844,-10.656 -27.432,-15.049 -6.624,-4.391 -9,-6.912 -11.7,-11.303 -2.844,-4.609 -6.228,-13.861 -4.464,-15.408 1.908,-1.404 11.52,2.592 15.516,6.732 3.888,4.066 3.348,12.887 7.56,17.279 4.068,4.176 13.284,5.111 16.812,8.1 3.384,3.024 7.632,10.405 3.708,9.649 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#0034ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3903"
i:knockout="Off"
d="m 263.395,124.82 c -8.137,1.477 -17.354,4.105 -28.08,7.885 -10.765,3.816 -27.792,11.195 -35.964,14.795 -8.28,3.422 -12.456,5.365 -13.068,5.832 1.08,2.484 0.684,4.752 -1.188,7.236 -1.944,2.34 -3.708,3.961 -10.152,7.092 -6.696,3.168 -27.36,12.709 -28.8,11.701 -1.296,-1.332 16.992,-14.076 20.844,-18.648 3.636,-4.535 -0.756,-6.48 1.26,-8.207 1.872,-1.729 8.712,-0.9 10.368,-2.232 1.62,-1.477 1.44,-3.385 -0.54,-6.121 1.08,-0.143 2.16,-0.072 3.672,0.072 1.404,0.145 2.952,0.359 4.788,0.793 1.908,-2.844 6.048,-5.904 12.564,-9.324 6.552,-3.457 17.64,-7.525 26.316,-11.088 8.568,-3.637 20.916,-10.477 24.84,-10.404 3.779,0.035 -4.32,8.496 -2.088,10.404 2.231,1.726 7.163,1.798 15.228,0.214 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#0034ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3905"
i:knockout="Off"
d="m 461.43,42.777 c 2.447,-0.288 -0.576,3.636 -2.268,5.508 -1.801,1.692 -1.656,2.52 -7.74,4.86 -6.229,2.268 -20.557,5.76 -28.549,8.676 -7.955,2.772 -8.891,4.032 -18.756,8.244 -10.043,4.176 -34.02,15.156 -40.391,16.848 -6.264,1.476 -3.564,-3.744 2.807,-7.308 6.373,-3.672 25.453,-10.224 34.885,-13.824 9.145,-3.6 13.535,-5.148 20.557,-7.704 7.02,-2.736 15.156,-5.4 21.779,-7.992 6.623,-2.628 15.012,-7.056 17.676,-7.308 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#0034ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3907"
i:knockout="Off"
d="m 442.781,39.465 c 6.625,-1.368 7.525,-0.756 9.109,-1.908 1.512,-1.296 2.916,-4.536 0.035,-5.292 -3.096,-0.792 -6.912,-1.368 -17.965,0.756 -11.268,2.088 -44.314,9.684 -48.311,11.556 -3.744,1.62 20.447,-1.332 25.092,-1.224 4.428,0.072 -3.961,2.52 1.477,1.944 5.471,-0.792 23.761,-4.5 30.563,-5.832 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#0034ff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3909"
stroke-miterlimit="10"
i:knockout="Off"
d="m 77.454,83.061 c 0.36,1.512 -7.776,3.168 -10.656,3.312 -2.988,0.144 -6.228,-0.756 -6.66,-2.304 -0.432,-1.656 0.936,-7.38 3.96,-7.452 2.916,-0.18 12.78,4.752 13.356,6.444 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3911"
stroke-miterlimit="10"
i:knockout="Off"
d="m 38.43,67.185 c -0.108,2.016 -6.588,9.072 -10.152,9.648 -3.564,0.432 -10.476,-4.788 -10.584,-6.768 -0.144,-2.16 6.48,-4.572 10.008,-5.148 3.456,-0.504 10.548,0.252 10.728,2.268 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3913"
stroke-miterlimit="10"
i:knockout="Off"
d="m 57.33,75.429 c 0.432,2.304 -3.132,9.036 -6.372,9.108 -3.42,0 -12.708,-6.696 -13.284,-8.964 -0.504,-2.448 6.588,-5.184 10.008,-5.148 3.348,-0.036 8.964,2.556 9.648,5.004 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3915"
stroke-miterlimit="10"
i:knockout="Off"
d="m 58.122,61.281 c 0.972,1.944 -0.756,7.2 -3.384,7.992 -2.736,0.612 -11.772,-2.088 -12.672,-3.924 -1.044,-1.944 4.104,-6.768 6.84,-7.38 2.664,-0.648 8.136,1.332 9.216,3.312 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3917"
stroke-miterlimit="10"
i:knockout="Off"
d="m 93.654,79.605 c 0.828,1.476 -2.664,3.24 -4.932,3.348 -2.448,-0.036 -7.992,-1.692 -8.856,-3.168 -0.864,-1.512 1.224,-5.796 3.636,-5.76 2.34,0.072 9.108,3.924 10.152,5.58 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3919"
stroke-miterlimit="10"
i:knockout="Off"
d="m 110.43,75.681 c 0.072,1.548 -5.4,4.752 -7.812,4.752 -2.7,-0.288 -6.804,-4.176 -7.02,-5.688 -0.144,-1.548 3.888,-3.528 6.408,-3.312 2.412,0.144 8.28,2.664 8.424,4.248 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3921"
stroke-miterlimit="10"
i:knockout="Off"
d="m 125.91,73.809 c 0,1.116 -4.716,3.852 -6.948,3.888 -2.376,-0.108 -6.66,-2.628 -6.732,-3.816 -0.108,-1.26 4.104,-3.276 6.408,-3.276 2.304,0.072 7.092,1.836 7.272,3.204 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3923"
stroke-miterlimit="10"
i:knockout="Off"
d="m 142.434,70.317 c -0.036,1.26 -4.14,4.824 -6.48,5.004 -2.448,0.036 -7.092,-3.096 -7.272,-4.392 -0.18,-1.404 4.104,-3.204 6.444,-3.312 2.304,-0.108 7.056,1.296 7.308,2.7 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3925"
stroke-miterlimit="10"
i:knockout="Off"
d="m 162.918,67.689 c 0.18,1.476 -4.716,3.6 -7.452,3.888 -2.844,0.108 -8.424,-1.26 -8.82,-2.736 -0.36,-1.584 4.032,-6.084 6.804,-6.264 2.808,-0.144 8.928,3.456 9.468,5.112 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3927"
stroke-miterlimit="10"
i:knockout="Off"
d="m 164.538,70.389 c -3.744,2.304 -6.948,3.492 -10.008,3.708 -3.024,0.144 -5.796,-0.684 -8.172,-2.628 0.18,9.504 0.468,19.44 0.72,30.636 0.252,11.088 0.54,22.825 0.864,35.639 3.816,1.908 6.912,2.377 9.684,1.549 2.7,-0.863 4.788,-3.168 6.408,-6.768 -0.828,-11.736 -1.188,-22.428 -1.08,-32.904 0.036,-10.512 0.612,-19.98 1.584,-29.232 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3929"
stroke-miterlimit="10"
i:knockout="Off"
d="m 144.09,72.801 c -1.98,2.376 -4.248,3.816 -6.66,4.32 -2.448,0.468 -5.184,0 -8.064,-1.404 -1.044,9.36 -1.62,19.368 -1.728,30.456 -0.18,11.052 0.108,22.788 0.864,35.604 3.816,1.871 6.912,2.447 9.684,1.584 2.7,-0.936 4.788,-3.061 6.408,-6.768 0.432,-9.721 0.612,-19.656 0.54,-30.349 -0.144,-10.799 -0.396,-21.671 -1.044,-33.443 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3931"
stroke-miterlimit="10"
i:knockout="Off"
d="m 126.306,77.013 c -1.44,1.512 -3.132,2.448 -5.076,2.664 -2.016,0.216 -4.176,-0.252 -6.624,-1.404 -1.584,11.664 -2.772,23.076 -3.42,35.064 -0.72,11.952 -0.972,23.651 -0.756,35.929 3.744,1.979 6.984,2.375 9.72,1.584 2.7,-0.9 4.788,-3.168 6.408,-6.805 -0.648,-10.871 -1.152,-21.6 -1.116,-32.868 -0.072,-11.304 0.216,-22.464 0.864,-34.164 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3933"
stroke-miterlimit="10"
i:knockout="Off"
d="m 111.834,79.461 c -2.268,1.692 -4.536,2.556 -6.948,2.988 -2.448,0.36 -4.968,0.036 -7.56,-0.828 -1.8,14.076 -2.772,27.288 -3.06,40.176 -0.36,12.889 0.108,24.805 1.26,36.432 2.592,1.08 4.86,1.008 7.236,-0.072 2.268,-1.15 4.356,-3.455 6.408,-6.768 -1.188,-10.008 -1.548,-20.879 -1.08,-32.904 0.468,-12.096 1.62,-24.912 3.744,-39.024 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3935"
stroke-miterlimit="10"
i:knockout="Off"
d="m 95.13,81.441 c -0.648,2.34 -2.124,3.528 -4.428,3.96 -2.376,0.36 -5.508,-0.288 -9.54,-1.8 -0.684,11.016 -1.188,22.896 -1.512,36.215 -0.36,13.357 -0.54,27.469 -0.54,43.164 2.988,1.908 5.76,2.449 8.172,1.764 2.376,-0.756 4.536,-2.879 6.336,-6.227 -0.828,-10.117 -1.044,-21.42 -0.792,-34.309 0.252,-13.031 0.972,-26.963 2.304,-42.767 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3937"
stroke-miterlimit="10"
i:knockout="Off"
d="m 78.714,86.193 c -3.96,1.908 -7.488,2.7 -11.016,2.52 -3.528,-0.216 -6.768,-1.44 -9.864,-3.672 0.468,18.792 0.792,34.848 1.116,48.996 0.324,14.111 0.504,25.488 0.684,34.955 4.32,2.773 7.848,3.744 10.728,3.205 2.88,-0.648 4.968,-2.809 6.408,-6.768 -1.08,-8.893 -1.44,-19.584 -1.08,-32.904 0.288,-13.32 1.296,-28.584 3.024,-46.332 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3939"
stroke-miterlimit="10"
i:knockout="Off"
d="m 53.082,87.633 c -3.852,0.468 -7.092,0.252 -9.864,-0.792 -2.808,-1.152 -5.004,-2.844 -6.732,-5.508 1.404,17.64 2.484,32.761 3.096,46.188 0.612,13.355 0.9,24.336 0.72,33.516 2.412,4.031 4.86,6.408 7.488,7.127 2.628,0.648 5.184,-0.215 8.064,-2.879 C 55.458,152.9 55.026,140.59 54.558,127.521 54.09,114.488 53.55,101.385 53.082,87.633 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3941"
stroke-miterlimit="10"
i:knockout="Off"
d="m 32.202,79.857 c -2.844,1.8 -5.472,2.304 -8.172,1.116 -2.736,-1.188 -5.256,-3.78 -7.848,-7.92 2.808,18.576 4.536,34.272 5.724,48.061 1.08,13.68 1.26,24.66 0.684,33.516 2.412,3.961 4.86,6.191 7.488,7.129 2.556,0.826 5.148,0.07 7.92,-2.125 C 37.602,148.222 36.81,136.054 35.91,122.698 34.974,109.269 33.642,95.265 32.202,79.857 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3943"
stroke-miterlimit="10"
i:knockout="Off"
d="m 80.01,59.841 c 0.72,1.332 -2.124,3.78 -4.788,4.572 -2.844,0.72 -10.44,0.684 -11.268,-0.504 -0.648,-1.404 3.996,-6.732 6.84,-7.38 2.736,-0.684 8.352,1.908 9.216,3.312 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3945"
stroke-miterlimit="10"
i:knockout="Off"
d="m 98.082,56.097 c 0.612,1.584 -2.232,5.472 -4.932,6.228 -2.808,0.612 -10.404,-0.612 -11.124,-2.16 -0.648,-1.656 3.996,-6.696 6.84,-7.344 2.736,-0.72 8.352,1.62 9.216,3.276 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3947"
stroke-miterlimit="10"
i:knockout="Off"
d="m 116.298,55.053 c 0.396,1.656 -4.104,5.472 -6.696,6.3 -2.808,0.648 -8.892,-0.648 -9.36,-2.232 -0.396,-1.728 3.96,-6.732 6.804,-7.38 2.7,-0.684 8.748,1.584 9.252,3.312 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3949"
stroke-miterlimit="10"
i:knockout="Off"
d="m 135.126,54.369 c 0.54,1.224 -2.628,4.104 -5.472,4.752 -2.844,0.36 -10.8,-0.54 -11.376,-1.728 -0.54,-1.332 4.644,-4.896 7.632,-5.436 2.772,-0.576 8.568,1.152 9.216,2.412 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3951"
stroke-miterlimit="10"
i:knockout="Off"
d="m 77.742,70.353 c 1.008,1.728 -3.564,5.76 -5.94,6.264 -2.484,0.288 -7.884,-2.232 -8.856,-3.96 -1.044,-1.836 0,-6.156 2.556,-6.552 2.448,-0.324 11.16,2.34 12.24,4.248 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3953"
stroke-miterlimit="10"
i:knockout="Off"
d="m 95.85,67.401 c 1.008,1.548 -2.052,5.256 -4.32,5.724 -2.304,0.252 -7.848,-2.232 -9,-3.708 -1.116,-1.512 -0.288,-5.04 2.088,-5.328 2.196,-0.36 10.008,1.764 11.232,3.312 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3955"
stroke-miterlimit="10"
i:knockout="Off"
d="m 113.13,66.933 c 0.972,1.404 -3.096,3.492 -5.4,3.636 -2.448,0.036 -7.344,-1.692 -8.46,-3.096 -1.116,-1.476 -0.288,-5.256 2.088,-5.364 2.232,-0.18 10.692,3.42 11.772,4.824 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3957"
stroke-miterlimit="10"
i:knockout="Off"
d="m 128.286,63.729 c 0.792,1.476 -2.808,4.716 -4.824,5.148 -2.16,0.252 -6.336,-1.8 -7.272,-3.24 -0.936,-1.548 0.036,-5.004 2.088,-5.364 1.98,-0.324 9.072,1.944 10.008,3.456 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3959"
stroke-miterlimit="10"
i:knockout="Off"
d="m 148.338,60.057 c 0.864,1.476 -2.916,4.716 -4.824,5.148 -2.16,0.252 -6.372,-1.8 -7.236,-3.24 -0.828,-1.548 -0.036,-5.004 2.088,-5.364 2.016,-0.324 9,1.944 9.972,3.456 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#edecf1;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
<path
id="path3961"
i:knockout="Off"
d="m 168.282,133.102 c -1.116,3.455 -3.312,5.76 -6.876,7.055 -3.564,1.225 -8.352,1.441 -14.364,0.504 -2.664,2.197 -5.4,3.744 -8.208,4.5 -2.844,0.756 -5.76,0.865 -8.748,0.182 -0.396,3.059 -2.124,5.184 -5.184,6.658 -3.168,1.441 -7.416,1.945 -13.176,1.801 -1.296,2.916 -3.024,5.111 -5.724,6.588 -2.628,1.369 -6.048,2.016 -10.116,1.943 -1.728,3.602 -3.924,5.725 -6.588,6.66 -2.7,0.9 -5.868,0.324 -9.504,-1.439 -4.392,5.148 -8.532,7.848 -12.276,8.389 -3.888,0.432 -7.236,-1.297 -10.476,-5.473 -4.86,1.297 -8.64,1.439 -11.88,0.576 -3.204,-0.936 -5.616,-3.023 -7.236,-6.119 -5.22,1.402 -9.396,1.295 -12.672,-0.469 -3.312,-1.764 -5.616,-5.076 -6.912,-9.936 -3.132,-0.252 -5.364,0.072 -6.696,1.115 -1.44,0.936 -3.744,2.771 -1.512,4.824 2.268,1.871 7.38,3.24 14.652,7.164 7.092,3.959 18.216,14.615 27.828,16.271 9.396,1.439 15.984,-2.303 28.944,-6.912 13.068,-4.643 35.676,-15.084 48.384,-20.484 12.384,-5.398 18.432,-9.252 26.064,-12.131 7.56,-3.096 13.968,-4.896 19.368,-5.832 -2.268,-0.793 -3.924,-1.584 -5.112,-2.52 -1.224,-0.937 -1.836,-1.908 -1.98,-2.915 z"
clip-rule="evenodd"
inkscape:connector-curvature="0"
style="fill:#000080;fill-rule:evenodd;stroke:#000000;stroke-width:5.61401606;stroke-miterlimit:10;stroke-dasharray:none" />
</g>
</g> </g>
<g
transform="matrix(-0.12130224,-0.46495637,0.4178683,-0.13497136,-19.618462,61.222329)"
id="g4108">
<path
sodipodi:type="arc"
style="fill:url(#linearGradient3959);fill-opacity:1;fill-rule:evenodd;stroke:#000060;stroke-width:1.95917153;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="path3725"
sodipodi:cx="96.428574"
sodipodi:cy="83.5"
sodipodi:rx="21.428572"
sodipodi:ry="5.3571429"
d="m 117.85715,83.5 c 0,2.958668 -9.5939,5.357143 -21.428576,5.357143 -11.834674,0 -21.428572,-2.398475 -21.428572,-5.357143 0,-2.958668 9.593898,-5.357143 21.428572,-5.357143 11.834676,0 21.428576,2.398475 21.428576,5.357143 z"
transform="matrix(0.34539846,-1.2399248,4.1735828,1.2786045,-372.03004,112.4907)"
inkscape:transform-center-x="-17.828291"
inkscape:transform-center-y="27.732851" />
</g>
<path
sodipodi:nodetypes="ccc"
inkscape:connector-curvature="0"
id="path3836"
d="m 9.1906267,40.236636 13.3229763,0.0881 0.0052,14.558841"
style="fill:none;stroke:#000060;stroke-width:2.06471777;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g> </g>
<g
id="g3884"
transform="matrix(0.63023368,0,0,0.62944884,-1.1547433,23.658183)"
style="stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none" />
<g
id="g3888"
transform="matrix(0.63023368,0,0,0.62944884,-2.9496241,20.620646)" />
<g
style="stroke-width:1.56434965;stroke-miterlimit:4;stroke-dasharray:none"
transform="matrix(0.27251135,0,0,0.33392666,-2.2036508,4.7572183)"
id="g3915">
<path
inkscape:connector-curvature="0"
style="fill:url(#linearGradient3961);fill-opacity:1;fill-rule:evenodd;stroke:#000060;stroke-width:6.84451723;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m 129.2322,18.42821 -0.40538,58.559972 c 26.40125,0.174551 34.72136,-0.178053 66.20083,0.05946 l 0.13669,-57.918028 C 164.15967,19.36654 157.40614,18.70965 129.2322,18.428208 z"
id="path3917"
sodipodi:nodetypes="ccccc" />
</g>
<g
transform="matrix(-0.12130224,-0.46495637,0.4178683,-0.13497136,8.7820322,32.109844)"
id="g3919">
<path
sodipodi:type="arc"
style="fill:url(#linearGradient3963);fill-opacity:1;fill-rule:evenodd;stroke:#000060;stroke-width:1.95917153;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="path3921"
sodipodi:cx="96.428574"
sodipodi:cy="83.5"
sodipodi:rx="21.428572"
sodipodi:ry="5.3571429"
d="m 117.85715,83.5 c 0,2.958668 -9.5939,5.357143 -21.428576,5.357143 -11.834674,0 -21.428572,-2.398475 -21.428572,-5.357143 0,-2.958668 9.593898,-5.357143 21.428572,-5.357143 11.834676,0 21.428576,2.398475 21.428576,5.357143 z"
transform="matrix(0.34539846,-1.2399248,4.1735828,1.2786045,-372.03004,112.4907)"
inkscape:transform-center-x="-17.828291"
inkscape:transform-center-y="27.732851" />
</g>
<g
style="stroke-width:4;stroke-miterlimit:4;stroke-dasharray:none"
transform="matrix(0.63023368,0,0,0.62944884,24.872451,0.6371694)"
id="g3935" />
<g
transform="matrix(0.63023368,0,0,0.62944884,23.07757,-2.4003676)"
id="g3937" />
<g
id="g3970"
transform="matrix(0.24031283,0,0,0.29748873,3.051923,6.457134)"
style="stroke:none">
<path
sodipodi:nodetypes="ccccc"
id="path3972"
d="m 129.2322,18.42821 -0.40538,58.559972 c 26.40125,0.174551 34.72136,-0.178053 66.20083,0.05946 l 0.13669,-57.918028 C 164.15967,19.36654 157.40614,18.70965 129.2322,18.428208 z"
style="fill:url(#linearGradient3974);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:6.84451723000000012;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:connector-curvature="0" />
</g>
<path
id="rect3638"
d="M 22.751257,3.1894325 5.8653816,7.216625 11.120802,12.73341 2.3217255,21.733624 7.37624,26.819616 l 8.351563,-9.895243 6.20693,5.152143 z"
style="fill:#ff0900;fill-opacity:1;fill-rule:evenodd;stroke:#ff0900;stroke-width:2.20000004999999987;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"
sodipodi:nodetypes="cccccccc"
inkscape:connector-curvature="0" />
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -25,7 +25,7 @@
#* and some code. * #* and some code. *
#* * #* *
#*************************************************************************** #***************************************************************************
__title__="FreeCAD OpenSCAD Workbench - CSG exporter Version 0.01c" __title__="FreeCAD OpenSCAD Workbench - CSG exporter Version"
__author__ = "Keith Sloan <keith@sloan-home.co.uk>" __author__ = "Keith Sloan <keith@sloan-home.co.uk>"
__url__ = ["http://www.sloan-home.co.uk/Export/Export.html"] __url__ = ["http://www.sloan-home.co.uk/Export/Export.html"]
@ -231,7 +231,7 @@ def process_object(csg,ob):
process_object(csg,subobj) process_object(csg,subobj)
csg.write("}\n") csg.write("}\n")
elif ob.TypeId == "Part::Common" : elif ob.TypeId == "Part::MultiCommon" :
print "Multi Common / intersection" print "Multi Common / intersection"
csg.write("intersection() {\n") csg.write("intersection() {\n")
for subobj in ob.Shapes: for subobj in ob.Shapes:

View File

@ -1,18 +0,0 @@
Version History
===============
0.01a - First Version
0.01b - Added support for polyhedron ( Thanks shoogen )
Some support for Torus
Some support for extruded regular polygon
0.01c - Support for extruded polygon, square, circle
bug fix for polyhydron floating point - Thanks shoogen
Thanks to shoogen and Peter Li for their advice, code, support and expertise.
Keith Sloan
keith@sloan-home.co.uk

View File

@ -27,7 +27,7 @@
#* * #* *
#* * #* *
#*************************************************************************** #***************************************************************************
__title__="FreeCAD OpenSCAD Workbench - CSG importer Version 0.06a" __title__="FreeCAD OpenSCAD Workbench - CSG importer"
__author__ = "Keith Sloan <keith@sloan-home.co.uk>" __author__ = "Keith Sloan <keith@sloan-home.co.uk>"
__url__ = ["http://www.sloan-home.co.uk/ImportCSG"] __url__ = ["http://www.sloan-home.co.uk/ImportCSG"]
@ -47,9 +47,7 @@ import ply.yacc as yacc
import Part import Part
from OpenSCADFeatures import * from OpenSCADFeatures import *
#from OpenSCAD2Dgeom import *
from OpenSCADUtils import * from OpenSCADUtils import *
isspecialorthogonaldeterminant = isspecialorthogonalpython
if open.__module__ == '__builtin__': if open.__module__ == '__builtin__':
pythonopen = open # to distinguish python built-in open function from the one declared here pythonopen = open # to distinguish python built-in open function from the one declared here
@ -370,6 +368,25 @@ def CGALFeatureObj(name,children,arguments=[]):
myobj.ViewObject.Proxy = 0 myobj.ViewObject.Proxy = 0
return myobj return myobj
#def p_offset_action(p):
# 'offset_action : offset LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE'
# if len(p[5]) == 0:
# mycut = placeholder('group',[],'{}')
# elif (len(p[5]) == 1 ): #single object
# subobj = p[5]
# else:
# subobj = fuse(p[6],"Offset Union")
# newobj=doc.addObject("Part::FeaturePython",'offset')
# OffsetShape(newobj,subobj,p[3]['delta'])
# if gui:
# if FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD").\
# GetBool('useViewProviderTree'):
# from OpenSCADFeatures import ViewProviderTree
# ViewProviderTree(newobj.ViewObject)
# else:
# newobj.ViewObject.Proxy = 0
# return [newobj]
def p_hull_action(p): def p_hull_action(p):
'hull_action : hull LPAREN RPAREN OBRACE block_list EBRACE' 'hull_action : hull LPAREN RPAREN OBRACE block_list EBRACE'
p[0] = [ CGALFeatureObj(p[1],p[5]) ] p[0] = [ CGALFeatureObj(p[1],p[5]) ]
@ -382,6 +399,8 @@ def p_minkowski_action(p):
def p_not_supported(p): def p_not_supported(p):
''' '''
not_supported : glide LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE not_supported : glide LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE
| offset LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE
| resize LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE
''' '''
if gui and not FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD").\ if gui and not FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD").\
GetBool('usePlaceholderForUnsupported'): GetBool('usePlaceholderForUnsupported'):
@ -439,8 +458,7 @@ def fuse(lst,name):
if printverbose: print "Fuse" if printverbose: print "Fuse"
if printverbose: print lst if printverbose: print lst
if len(lst) == 0: if len(lst) == 0:
myfuse = doc.addObject("Part::Feature","emptyfuse") myfuse = placeholder('group',[],'{}')
myfuse.Shape = Part.Compound([])
elif len(lst) == 1: elif len(lst) == 1:
return lst[0] return lst[0]
# Is this Multi Fuse # Is this Multi Fuse
@ -476,8 +494,7 @@ def p_difference_action(p):
if printverbose: print len(p[5]) if printverbose: print len(p[5])
if printverbose: print p[5] if printverbose: print p[5]
if (len(p[5]) == 0 ): #nochild if (len(p[5]) == 0 ): #nochild
mycut = doc.addObject("Part::Feature","emptycut") mycut = placeholder('group',[],'{}')
mycut.Shape = Part.Compound([])
elif (len(p[5]) == 1 ): #single object elif (len(p[5]) == 1 ): #single object
p[0] = p[5] p[0] = p[5]
else: else:
@ -520,22 +537,13 @@ def p_intersection_action(p):
elif (len(p[5]) == 1): elif (len(p[5]) == 1):
mycommon = p[5][0] mycommon = p[5][0]
else : # 1 child else : # 1 child
mycommon = doc.addObject("Part::Feature","emptyintersection") mycommon = placeholder('group',[],'{}')
mycommon.Shape = Part.Compound([])
p[0] = [mycommon] p[0] = [mycommon]
if printverbose: print "End Intersection" if printverbose: print "End Intersection"
def process_rotate_extrude(obj): def process_rotate_extrude(obj):
myrev = doc.addObject("Part::Revolution","RotateExtrude")
myrev.Source = obj
myrev.Axis = (0.00,1.00,0.00)
myrev.Base = (0.00,0.00,0.00)
myrev.Angle = 360.00
myrev.Placement=FreeCAD.Placement(FreeCAD.Vector(),FreeCAD.Rotation(0,0,90))
if gui:
obj.ViewObject.hide()
newobj=doc.addObject("Part::FeaturePython",'RefineRotateExtrude') newobj=doc.addObject("Part::FeaturePython",'RefineRotateExtrude')
RefineShape(newobj,myrev) RefineShape(newobj,obj)
if gui: if gui:
if FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD").\ if FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD").\
GetBool('useViewProviderTree'): GetBool('useViewProviderTree'):
@ -543,8 +551,16 @@ def process_rotate_extrude(obj):
ViewProviderTree(newobj.ViewObject) ViewProviderTree(newobj.ViewObject)
else: else:
newobj.ViewObject.Proxy = 0 newobj.ViewObject.Proxy = 0
myrev.ViewObject.hide() obj.ViewObject.hide()
return(newobj) myrev = doc.addObject("Part::Revolution","RotateExtrude")
myrev.Source = newobj
myrev.Axis = (0.00,1.00,0.00)
myrev.Base = (0.00,0.00,0.00)
myrev.Angle = 360.00
myrev.Placement=FreeCAD.Placement(FreeCAD.Vector(),FreeCAD.Rotation(0,0,90))
if gui:
newobj.ViewObject.hide()
return(myrev)
def p_rotate_extrude_action(p): def p_rotate_extrude_action(p):
'rotate_extrude_action : rotate_extrude LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE' 'rotate_extrude_action : rotate_extrude LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE'
@ -565,18 +581,9 @@ def p_rotate_extrude_file(p):
if printverbose: print "End Rotate Extrude File" if printverbose: print "End Rotate Extrude File"
def process_linear_extrude(obj,h) : def process_linear_extrude(obj,h) :
mylinear = doc.addObject("Part::Extrusion","LinearExtrude") #if gui:
mylinear.Base = obj
mylinear.Dir = (0,0,h)
mylinear.Placement=FreeCAD.Placement()
try:
mylinear.Solid = True
except:
a = 1 # Any old null statement
if gui:
obj.ViewObject.hide()
newobj=doc.addObject("Part::FeaturePython",'RefineLinearExtrude') newobj=doc.addObject("Part::FeaturePython",'RefineLinearExtrude')
RefineShape(newobj,mylinear) RefineShape(newobj,obj)#mylinear)
if gui: if gui:
if FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD").\ if FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD").\
GetBool('useViewProviderTree'): GetBool('useViewProviderTree'):
@ -584,8 +591,19 @@ def process_linear_extrude(obj,h) :
ViewProviderTree(newobj.ViewObject) ViewProviderTree(newobj.ViewObject)
else: else:
newobj.ViewObject.Proxy = 0 newobj.ViewObject.Proxy = 0
mylinear.ViewObject.hide() obj.ViewObject.hide()
return(newobj) #mylinear.ViewObject.hide()
mylinear = doc.addObject("Part::Extrusion","LinearExtrude")
mylinear.Base = newobj #obj
mylinear.Dir = (0,0,h)
mylinear.Placement=FreeCAD.Placement()
try:
mylinear.Solid = True
except:
pass
if gui:
newobj.ViewObject.hide()
return(mylinear)
def process_linear_extrude_with_twist(base,height,twist) : def process_linear_extrude_with_twist(base,height,twist) :
newobj=doc.addObject("Part::FeaturePython",'twist_extrude') newobj=doc.addObject("Part::FeaturePython",'twist_extrude')
@ -715,38 +733,50 @@ def p_multmatrix_action(p):
transform_matrix = FreeCAD.Matrix() transform_matrix = FreeCAD.Matrix()
if printverbose: print "Multmatrix" if printverbose: print "Multmatrix"
if printverbose: print p[3] if printverbose: print p[3]
transform_matrix.A11 = round(float(p[3][0][0]),12) m1l=sum(p[3],[])
transform_matrix.A12 = round(float(p[3][0][1]),12) if any('x' in me for me in m1l): #hexfloats
transform_matrix.A13 = round(float(p[3][0][2]),12) m1l=[float.fromhex(me) for me in m1l]
transform_matrix.A14 = round(float(p[3][0][3]),12) matrixisrounded=False
transform_matrix.A21 = round(float(p[3][1][0]),12) elif max((len(me) for me in m1l)) >= 14: #might have double precision
transform_matrix.A22 = round(float(p[3][1][1]),12) m1l=[float(me) for me in m1l] # assume precise output
transform_matrix.A23 = round(float(p[3][1][2]),12) m1l=[(0 if (abs(me) < 1e-15) else me) for me in m1l]
transform_matrix.A24 = round(float(p[3][1][3]),12) matrixisrounded=False
transform_matrix.A31 = round(float(p[3][2][0]),12) else: #trucanted numbers
transform_matrix.A32 = round(float(p[3][2][1]),12) m1l=[round(float(me),12) for me in m1l] #round
transform_matrix.A33 = round(float(p[3][2][2]),12) matrixisrounded=True
transform_matrix.A34 = round(float(p[3][2][3]),12) transform_matrix = FreeCAD.Matrix(*tuple(m1l))
if printverbose: print transform_matrix if printverbose: print transform_matrix
if printverbose: print "Apply Multmatrix" if printverbose: print "Apply Multmatrix"
# If more than one object on the stack for multmatrix fuse first # If more than one object on the stack for multmatrix fuse first
if (len(p[6]) > 1) : if (len(p[6]) == 0) :
part = placeholder('group',[],'{}')
elif (len(p[6]) > 1) :
part = fuse(p[6],"Matrix Union") part = fuse(p[6],"Matrix Union")
else : else :
part = p[6][0] part = p[6][0]
# part = new_part.transformGeometry(transform_matrix) if (isspecialorthogonalpython(fcsubmatrix(transform_matrix))) :
# part = new_part.copy() if printverbose: print "special orthogonal"
# part.transformShape(transform_matrix) if matrixisrounded:
if (isspecialorthogonaldeterminant(fcsubmatrix(transform_matrix))) : if printverbose: print "rotation rounded"
if printverbose: print "Orthogonal" plm=FreeCAD.Placement(transform_matrix)
part.Placement=FreeCAD.Placement(transform_matrix).multiply(part.Placement) plm=FreeCAD.Placement(plm.Base,roundrotation(plm.Rotation))
new_part = part part.Placement=plm.multiply(part.Placement)
else:
part.Placement=FreeCAD.Placement(transform_matrix).multiply(\
part.Placement)
new_part = part
elif isrotoinversionpython(fcsubmatrix(transform_matrix)): elif isrotoinversionpython(fcsubmatrix(transform_matrix)):
if printverbose: print "orthogonal and inversion"
cmat,axisvec = decomposerotoinversion(transform_matrix) cmat,axisvec = decomposerotoinversion(transform_matrix)
new_part=doc.addObject("Part::Mirroring",'mirr_%s'%part.Name) new_part=doc.addObject("Part::Mirroring",'mirr_%s'%part.Name)
new_part.Source=part new_part.Source=part
new_part.Normal=axisvec new_part.Normal=axisvec
new_part.Placement=FreeCAD.Placement(cmat) if matrixisrounded:
if printverbose: print "rotation rounded"
plm=FreeCAD.Placement(cmat)
new_part.Placement=FreeCAD.Placement(plm.Base,roundrotation(plm.Rotation))
else:
new_part.Placement=FreeCAD.Placement(cmat)
new_part.Label="mirrored %s" % part.Label new_part.Label="mirrored %s" % part.Label
if gui: if gui:
part.ViewObject.hide() part.ViewObject.hide()
@ -922,12 +952,12 @@ def p_cube_action(p):
l,w,h = [float(str1) for str1 in p[3]['size']] l,w,h = [float(str1) for str1 in p[3]['size']]
if (l > 0 and w > 0 and h >0): if (l > 0 and w > 0 and h >0):
if printverbose: print "cube : ",p[3] if printverbose: print "cube : ",p[3]
mycube=doc.addObject('Part::Box',p[1]) mycube=doc.addObject('Part::Box',p[1])
mycube.Length=l mycube.Length=l
mycube.Width=w mycube.Width=w
mycube.Height=h mycube.Height=h
else: else:
FreeCAD.Console.PrintWarning('cube with radius zero\n') FreeCAD.Console.PrintWarning('cube with radius zero\n')
mycube=doc.addObject("Part::Feature","emptycube") mycube=doc.addObject("Part::Feature","emptycube")
mycube.Shape = Part.Compound([]) mycube.Shape = Part.Compound([])
if p[3]['center']=='true' : if p[3]['center']=='true' :
@ -947,11 +977,21 @@ def p_circle_action(p) :
# in the modules preferences # in the modules preferences
import Draft import Draft
if n == 0 or fnmax != 0 and n >= fnmax: if n == 0 or fnmax != 0 and n >= fnmax:
mycircle = Draft.makeCircle(r) mycircle = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython",'circle')
#mycircle = doc.addObject('Part::Circle',p[1]) Draft._Circle(mycircle)
#mycircle.Radius = r mycircle.Radius = r
#mycircle = Draft.makeCircle(r) # would call doc.recompute
#mycircle = doc.addObject('Part::Circle',p[1]) #would not create a face
#mycircle.Radius = r
else : else :
mycircle = Draft.makePolygon(n,r) #mycircle = Draft.makePolygon(n,r) # would call doc.recompute
mycircle = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython",'polygon')
Draft._Polygon(mycricle)
mycircle.FacesNumber = n
mycircle.Radius = r
mycircle.DrawMode = "inscribed"
if gui:
Draft._ViewProviderDraft(mycircle.ViewObject)
if printverbose: print "Push Circle" if printverbose: print "Push Circle"
p[0] = [mycircle] p[0] = [mycircle]
@ -1021,7 +1061,8 @@ def make_face(v1,v2,v3):
return face return face
def p_polyhedron_action(p) : def p_polyhedron_action(p) :
'polyhedron_action : polyhedron LPAREN points EQ OSQUARE points_list_3d ESQUARE COMMA triangles EQ OSQUARE points_list_3d ESQUARE COMMA keywordargument_list RPAREN SEMICOL' '''polyhedron_action : polyhedron LPAREN points EQ OSQUARE points_list_3d ESQUARE COMMA faces EQ OSQUARE points_list_3d ESQUARE COMMA keywordargument_list RPAREN SEMICOL
| polyhedron LPAREN points EQ OSQUARE points_list_3d ESQUARE COMMA triangles EQ OSQUARE points_list_3d ESQUARE COMMA keywordargument_list RPAREN SEMICOL'''
if printverbose: print "Polyhedron Points" if printverbose: print "Polyhedron Points"
v = [] v = []
for i in p[6] : for i in p[6] :

View File

@ -1,61 +0,0 @@
Version History
===============
0.01a - First Version
0.01b - Fixed
Reset Global Variables
Fix Multmatrix use of Shape
Added import Function (Untested)
0.02b - Rewrite to use Bojects rather than shapes.
Objects now editible in FreeCad
0.02c - disable debug output on Yacc to avoid permissions problem with Linux
0.03a - Added support for
Linear Extrusion
Rotational Extrusion
circle
square
polygon
polyhedron
0.04a - Change to use parser stack rather than own stack
to fix a parsing problem
makes code cleaner and less global variables
parsers out SCAD comments ( Not sure if the are allowed in CSG file anyway
other minor fixes
0.04b - Fixes where Multmatrix has more than one object neeed to fuse first
Correct import function call
0.04c - Support for cylinders made with regular polygon ( Needs FreeCAD with fixes to Draft )
Attempt at transformGeometry for non orthoganal Multmatrix
0.04d - Fix to multmatrix transformGeometry to avoid crash
0.04e - If problems with Draft or Draft's makePolygon because not on latest FreeCAD falls back
to non editable polygon
0.04f - Fix bug with multiple intersections
0.05a - Attempt to add shogens's import dxf function code.
0.05b - Fix introduced bug with centre=true/false, ViewObject Proxy
0.05c - Fix for polygon with path - Changes to Polygon and polyhdron - parse projection
0.05d - Fix for implicit fuse for groups
global max_polygon parameter to control cylinder or prism
There appear to be problems with some files and these maybe as a result of bugs in FreeCAD that corrupt
the model. If you find problem files please email them to keith@sloan-home.co.uk
Thanks to shoogen and Peter Li for their advice, support and expertise.
Keith Sloan
keith@sloan-home.co.uk

View File

@ -47,6 +47,7 @@ reserved = (
'undef', 'undef',
'polyhedron', 'polyhedron',
'triangles', 'triangles',
'faces',
'render', 'render',
'surface', 'surface',
'subdiv', 'subdiv',
@ -59,6 +60,8 @@ reserved = (
'import', 'import',
'color', 'color',
'cut', 'cut',
'offset',
'resize',
) )
# List of token names. This is always required # List of token names. This is always required