Add arch cutComponent feature

This commit is contained in:
wood galaxy
2014-11-11 19:49:05 +01:00
committed by Yorik van Havre
parent 76f544a352
commit 0e1a2e5444
4 changed files with 466 additions and 34 deletions

View File

@@ -2,8 +2,8 @@
#***************************************************************************
#* *
#* Copyright (c) 2011 *
#* Yorik van Havre <yorik@uncreated.net> *
#* Copyright (c) 2011 *
#* Yorik van Havre <yorik@uncreated.net> *
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU Lesser General Public License (LGPL) *
@@ -98,7 +98,7 @@ def addComponents(objectsList,host):
host.Tool = o
elif Draft.getType(o) == "Axis":
if not o in x:
x.append(o)
x.append(o)
elif not o in a:
if hasattr(o,"Shape"):
a.append(o)
@@ -116,7 +116,7 @@ def addComponents(objectsList,host):
for o in objectsList:
if not o in c:
c.append(o)
host.Group = c
host.Group = c
def removeComponents(objectsList,host=None):
'''removeComponents(objectsList,[hostObject]): removes the given component or
@@ -224,7 +224,7 @@ def copyProperties(obj1,obj2):
if prop in obj2.ViewObject.PropertiesList:
if not prop in ["Proxy","Shape"]:
setattr(obj2.ViewObject,prop,getattr(obj1.ViewObject,prop))
def splitMesh(obj,mark=True):
'''splitMesh(object,[mark]): splits the given mesh object into separated components.
If mark is False, nothing else is done. If True (default), non-manifold components
@@ -249,7 +249,7 @@ def makeFace(wires,method=2,cleanup=False):
'''makeFace(wires): makes a face from a list of wires, finding which ones are holes'''
#print "makeFace: start:", wires
import Part
if not isinstance(wires,list):
if len(wires.Vertexes) < 3:
raise
@@ -261,7 +261,7 @@ def makeFace(wires,method=2,cleanup=False):
return Part.Face(wires[0])
wires = wires[:]
#print "makeFace: inner wires found"
ext = None
max_length = 0
@@ -352,7 +352,7 @@ def getCutVolume(cutplane,shapes):
p = cutplane.copy().Faces[0]
except Part.OCCError:
FreeCAD.Console.PrintMessage(translate("Arch","Invalid cutplane\n"))
return None,None,None
return None,None,None
ce = p.CenterOfMass
ax = p.normalAt(0,0)
u = p.Vertexes[1].Point.sub(p.Vertexes[0].Point).normalize()
@@ -393,6 +393,16 @@ def getCutVolume(cutplane,shapes):
invcutvolume = cutface.extrude(cutnormal)
return cutface,cutvolume,invcutvolume
def cutComponent(cutPlane, archObject):
"""cut object from a plan"""
cutVolume = Arch.getCutVolume(cutPlane, archObject.Object.Shape)
cutVolume = cutVolume[2]
if cutVolume:
obj = App.activeDocument().addObject("Part::Feature", "CutVolume")
obj.Shape = cutVolume
# add substraction component to Arch object
return Arch.removeComponents(obj,archObject.Object)
def getShapeFromMesh(mesh,fast=True,tolerance=0.001,flat=False,cut=True):
import Part, MeshPart, DraftGeomUtils
if mesh.isSolid() and (mesh.countComponents() == 1) and fast:
@@ -409,7 +419,7 @@ def getShapeFromMesh(mesh,fast=True,tolerance=0.001,flat=False,cut=True):
solid = solid.removeSplitter()
return solid
faces = []
faces = []
segments = mesh.getPlanarSegments(tolerance)
#print len(segments)
for i in segments:
@@ -444,7 +454,7 @@ def getShapeFromMesh(mesh,fast=True,tolerance=0.001,flat=False,cut=True):
return se
else:
return solid
def projectToVector(shape,vector):
'''projectToVector(shape,vector): projects the given shape on the given
vector'''
@@ -473,7 +483,7 @@ def meshToShape(obj,mark=True,fast=True,tol=0.001,flat=False,cut=True):
name = obj.Name
if "Mesh" in obj.PropertiesList:
faces = []
faces = []
mesh = obj.Mesh
plac = obj.Placement
solid = getShapeFromMesh(mesh,fast,tol,flat,cut)
@@ -605,7 +615,7 @@ def check(objectslist,includehidden=False):
def getHost(obj,strict=True):
"""getHost(obj,[strict]): returns the host of the current object. If strict is true (default),
the host can only be an object of a higher level than the given one, or in other words, if a wall
is contained in another wall which is part of a floor, the floor is returned instead of the parent wall"""
is contained in another wall which is part of a floor, the floor is returned instead of the parent wall"""
import Draft
t = Draft.getType(obj)
for par in obj.InList:
@@ -618,7 +628,7 @@ def getHost(obj,strict=True):
else:
return par
return None
def pruneIncluded(objectslist):
"""pruneIncluded(objectslist): removes from a list of Arch objects, those that are subcomponents of
another shape-based object, leaving only the top-level shapes."""
@@ -644,7 +654,7 @@ class _SurveyObserver:
self.cancellable = False
self.selection = []
self.labels = []
def addSelection(self,document, object, element, position):
self.cancellable = False
self.callback(True)
@@ -788,11 +798,11 @@ def toggleIfcBrepFlag(obj):
def makeCompoundFromSelected(objects=None):
"""makeCompoundFromSelected([objects]): Creates a new compound object from the given
"""makeCompoundFromSelected([objects]): Creates a new compound object from the given
subobjects (faces, edges) or from the the selection if objects is None"""
import FreeCADGui,Part
so = []
if not objects:
if not objects:
objects = FreeCADGui.Selection.getSelectionEx()
if not isinstance(objects,list):
objects = [objects]
@@ -801,10 +811,10 @@ def makeCompoundFromSelected(objects=None):
if so:
c = Part.makeCompound(so)
Part.show(c)
def cleanArchSplitter(objets=None):
"""cleanArchSplitter([objects]): removes the splitters from the base shapes
"""cleanArchSplitter([objects]): removes the splitters from the base shapes
of the given Arch objects or selected Arch objects if objects is None"""
import FreeCAD,FreeCADGui
if not objects:
@@ -854,7 +864,7 @@ def rebuildArchShape(objects=None):
solid.sewShape()
solid = Part.Solid(solid)
#print "rebuilt solid: isValid is ",solid.isValid()
if solid.isValid():
if solid.isValid():
print "Success"
obj.Base.Shape = solid
success = True
@@ -865,7 +875,6 @@ def rebuildArchShape(objects=None):
FreeCAD.ActiveDocument.recompute()
# command definitions ###############################################
class _CommandAdd:
"the Arch Add command definition"
def GetResources(self):
@@ -875,7 +884,7 @@ class _CommandAdd:
def IsActive(self):
return len(FreeCADGui.Selection.getSelection()) > 1
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
if Draft.getType(sel[-1]) == "Space":
@@ -896,8 +905,8 @@ class _CommandAdd:
FreeCADGui.doCommand("Arch.addComponents("+ss+",FreeCAD.ActiveDocument."+host.Name+")")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _CommandRemove:
"the Arch Add command definition"
def GetResources(self):
@@ -907,7 +916,7 @@ class _CommandRemove:
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
if Draft.getType(sel[-1]) == "Space":
@@ -933,6 +942,26 @@ class _CommandRemove:
FreeCAD.ActiveDocument.recompute()
class _CommandCutPlane:
"the Arch CutPlane command definition"
def GetResources(self):
return {'Pixmap' : 'Arch_CutPlane',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_CutPlane","Cut object"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_CutPlane","Cut the object with plane")}
def IsActive(self):
return len(FreeCADGui.Selection.getSelection()) > 1
def Activated(self):
face = FreeCADGui.Selection.getSelectionEx()[1].SubObjects[0]
archObject = FreeCADGui.Selection.getSelectionEx()[0]
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Cutting")))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.cutComponent(face,archObject")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _CommandSplitMesh:
"the Arch SplitMesh command definition"
def GetResources(self):
@@ -942,7 +971,7 @@ class _CommandSplitMesh:
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
if FreeCADGui.Selection.getSelection():
sel = FreeCADGui.Selection.getSelection()
@@ -957,7 +986,7 @@ class _CommandSplitMesh:
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _CommandMeshToShape:
"the Arch MeshToShape command definition"
def GetResources(self):
@@ -967,7 +996,7 @@ class _CommandMeshToShape:
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
if FreeCADGui.Selection.getSelection():
f = FreeCADGui.Selection.getSelection()[0]
@@ -1002,7 +1031,7 @@ class _CommandSelectNonSolidMeshes:
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
msel = []
if FreeCADGui.Selection.getSelection():
@@ -1030,7 +1059,7 @@ class _CommandRemoveShape:
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
sel = FreeCADGui.Selection.getSelection()
removeShape(sel)
@@ -1044,7 +1073,7 @@ class _CommandCloseHoles:
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
for o in FreeCADGui.Selection.getSelection():
s = closeHole(o.Shape)
@@ -1060,7 +1089,7 @@ class _CommandCheck:
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
result = check(FreeCADGui.Selection.getSelection())
if not result:
@@ -1095,7 +1124,7 @@ class _CommandSurvey:
def IsActive(self):
return not FreeCAD.ActiveDocument is None
def Activated(self):
FreeCADGui.addModule("Arch")
FreeCADGui.doCommandGui("Arch.survey()")
@@ -1110,7 +1139,7 @@ class _ToggleIfcBrepFlag:
def IsActive(self):
return bool(FreeCADGui.Selection.getSelection())
def Activated(self):
for o in FreeCADGui.Selection.getSelection():
toggleIfcBrepFlag(o)

View File

@@ -74,7 +74,7 @@ class ArchWorkbench(Workbench):
"Arch_Window","Arch_Roof","Arch_Axis",
"Arch_SectionPlane","Arch_Space","Arch_Stairs",
"Arch_Panel","Arch_Equipment",
"Arch_Frame","Arch_Add","Arch_Remove","Arch_Survey"]
"Arch_Frame","Arch_CutPlane","Arch_Add","Arch_Remove","Arch_Survey"]
self.utilities = ["Arch_SplitMesh","Arch_MeshToShape",
"Arch_SelectNonSolidMeshes","Arch_RemoveShape",
"Arch_CloseHoles","Arch_MergeWalls","Arch_Check",

View File

@@ -50,6 +50,7 @@
<file>icons/Arch_StructuralSystem.svg</file>
<file>icons/Arch_StructuralSystem_Tree.svg</file>
<file>icons/Arch_ToggleIfcBrepFlag.svg</file>
<file>icons/Arch_CutPlane.svg</file>
<file>ui/archprefs-base.ui</file>
<file>ui/archprefs-defaults.ui</file>
<file>ui/archprefs-import.ui</file>

View File

@@ -0,0 +1,402 @@
<?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="svg2860"
sodipodi:version="0.32"
inkscape:version="0.48.4 r9939"
sodipodi:docname="Arch_CutPlane.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1">
<defs
id="defs2862">
<linearGradient
id="linearGradient4072">
<stop
id="stop4074"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop4076"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient3864">
<stop
style="stop-color:#ff0000;stop-opacity:1;"
offset="0"
id="stop3866" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop3868" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-0.8291179 : 29.156156 : 1"
inkscape:vp_y="-86.925828 : 996.21479 : 0"
inkscape:vp_z="62.928628 : 34.719409 : 1"
inkscape:persp3d-origin="31.976964 : 21.311491 : 1"
id="perspective3052" />
<linearGradient
id="linearGradient3377">
<stop
id="stop3379"
offset="0"
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
id="stop3381"
offset="1"
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-78.066988 : 45.593954 : 1"
inkscape:vp_y="0 : 1346.2145 : 0"
inkscape:vp_z="87.007387 : 62.757339 : 1"
inkscape:persp3d-origin="41.942005 : 25.964636 : 1"
id="perspective2868" />
<inkscape:perspective
id="perspective2868-3"
inkscape:persp3d-origin="32 : 21.333333 : 1"
inkscape:vp_z="64 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 32 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient3377-7">
<stop
style="stop-color:#71b2f8;stop-opacity:1;"
offset="0"
id="stop3379-7" />
<stop
style="stop-color:#002795;stop-opacity:1;"
offset="1"
id="stop3381-9" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="linearGradient4082"
x1="2.4857161"
y1="39.259701"
x2="46.087074"
y2="39.259701"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="linearGradient4084"
gradientUnits="userSpaceOnUse"
x1="2.4857161"
y1="39.259701"
x2="46.087074"
y2="39.259701"
gradientTransform="matrix(1.3367742,0,0,1.3462145,-0.83476916,-19.403123)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="linearGradient4086"
gradientUnits="userSpaceOnUse"
x1="2.4857161"
y1="39.259701"
x2="46.087074"
y2="39.259701"
gradientTransform="matrix(1.3367742,0,0,1.3462145,-0.83476916,-19.403123)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="linearGradient4088"
gradientUnits="userSpaceOnUse"
x1="2.4857161"
y1="39.259701"
x2="46.087074"
y2="39.259701"
gradientTransform="matrix(1.3367742,0,0,1.3462145,-0.83476916,-19.403123)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="linearGradient4090"
gradientUnits="userSpaceOnUse"
x1="2.4857161"
y1="39.259701"
x2="46.087074"
y2="39.259701"
gradientTransform="matrix(1.3367742,0,0,1.3462145,-0.83476916,-19.403123)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="linearGradient4092"
gradientUnits="userSpaceOnUse"
x1="2.4857161"
y1="39.259701"
x2="46.087074"
y2="39.259701"
gradientTransform="matrix(1.3367742,0,0,1.3462145,-0.83476916,-19.403123)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="linearGradient4094"
gradientUnits="userSpaceOnUse"
x1="2.4857161"
y1="39.259701"
x2="46.087074"
y2="39.259701"
gradientTransform="matrix(1.3367742,0,0,1.3462145,-0.83476916,-19.403123)" />
<linearGradient
id="linearGradient3377-73">
<stop
id="stop3379-3"
offset="0"
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
id="stop3381-96"
offset="1"
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="-77.89941 : 45.549744 : 1"
inkscape:vp_y="0 : 1346.2145 : 0"
inkscape:vp_z="87.174967 : 62.713129 : 1"
inkscape:persp3d-origin="42.109583 : 25.920426 : 1"
id="perspective2868-0" />
<linearGradient
id="linearGradient4112">
<stop
id="stop4114"
offset="0"
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
id="stop4116"
offset="1"
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient4119">
<stop
id="stop4121"
offset="0"
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
id="stop4123"
offset="1"
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient4126">
<stop
id="stop4128"
offset="0"
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
id="stop4130"
offset="1"
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient4133">
<stop
id="stop4135"
offset="0"
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
id="stop4137"
offset="1"
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient4140">
<stop
id="stop4142"
offset="0"
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
id="stop4144"
offset="1"
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3377-73"
id="linearGradient4094-0"
gradientUnits="userSpaceOnUse"
x1="2.4857161"
y1="39.259701"
x2="46.087074"
y2="39.259701"
gradientTransform="matrix(1.3367742,0,0,1.3462145,-0.83476916,-19.403123)" />
<linearGradient
id="linearGradient4147">
<stop
id="stop4149"
offset="0"
style="stop-color:#71b2f8;stop-opacity:1;" />
<stop
id="stop4151"
offset="1"
style="stop-color:#002795;stop-opacity:1;" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="8.761495"
inkscape:cx="25.868709"
inkscape:cy="30.616566"
inkscape:current-layer="svg2860"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1056"
inkscape:window-x="0"
inkscape:window-y="24"
inkscape:window-maximized="1"
showguides="true"
inkscape:guide-bbox="true" />
<metadata
id="metadata2865">
<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:license
rdf:resource="http://creativecommons.org/licenses/by/3.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by/3.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<rect
style="fill:#ff0000;fill-opacity:0.62995594;stroke:#ff0000;stroke-width:2.16011143;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect3862"
width="40.624489"
height="37.127754"
x="20.402897"
y="5.5325351"
ry="0"
transform="matrix(0.99784527,0.06561104,0.01760731,0.99984498,0,0)" />
<g
sodipodi:type="inkscape:box3d"
style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:0.90308370999999998;stroke-dasharray:2, 2;stroke-dashoffset:0;stroke-linejoin:round"
id="g3054-5"
inkscape:perspectiveID="#perspective2868-0"
inkscape:corner0="0.10769976 : 0.017035405 : 0 : 1"
inkscape:corner7="-0.062551355 : 0.0031357113 : 0.34173353 : 1">
<path
sodipodi:type="inkscape:box3dside"
id="path3064-2"
style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:0.90308370999999998;stroke-dasharray:2, 2;stroke-dashoffset:0;stroke-linejoin:round"
inkscape:box3dsidetype="13"
d="m 30.441313,32.360143 19.675882,2.52619 9.899984,-8.976097 -16.199747,-0.876252 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3056-6"
style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:0.90308370999999998;stroke-dasharray:2, 2;stroke-dashoffset:0;stroke-linejoin:round"
inkscape:box3dsidetype="6"
d="m 30.441313,15.467506 0,16.892637 13.376119,-7.326159 0,-12.909852 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3066-4"
style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:0.90308370999999998;stroke-dasharray:2, 2;stroke-dashoffset:0;stroke-linejoin:round"
inkscape:box3dsidetype="11"
d="m 43.817432,12.124132 16.199747,-0.841968 0,14.628072 -16.199747,-0.876252 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3058-9"
style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:0.90308370999999998;stroke-dasharray:2, 2;stroke-dashoffset:0;stroke-linejoin:round"
inkscape:box3dsidetype="5"
d="m 30.441313,15.467506 19.675882,-0.5417 9.899984,-3.643642 -16.199747,0.841968 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3062-6"
style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:0.90308370999999998;stroke-dasharray:2, 2;stroke-dashoffset:0;stroke-linejoin:round"
inkscape:box3dsidetype="14"
d="m 50.117195,14.925806 0,19.960527 9.899984,-8.976097 0,-14.628072 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3060-0"
style="fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:0.90308370999999998;stroke-dasharray:2, 2;stroke-dashoffset:0;stroke-linejoin:round"
inkscape:box3dsidetype="3"
d="m 30.441313,15.467506 19.675882,-0.5417 0,19.960527 -19.675882,-2.52619 z" />
</g>
<g
sodipodi:type="inkscape:box3d"
style="fill:url(#linearGradient4082);fill-opacity:1;stroke:#080851;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.98678415;stroke-dasharray:none"
id="g3054"
inkscape:perspectiveID="#perspective2868"
inkscape:corner0="0.47751662 : 0.0093568 : 0 : 1"
inkscape:corner7="0.13117621 : -0.016353429 : 0.65977054 : 1">
<path
sodipodi:type="inkscape:box3dside"
id="path3064"
style="fill:url(#linearGradient4084);fill-opacity:1;fill-rule:evenodd;stroke:#080851;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.98678415;stroke-dasharray:none"
inkscape:box3dsidetype="13"
d="M 3.1564591,46.591544 28.02523,55.221302 49.753788,35.336 29.040848,32.592556 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3056"
style="fill:url(#linearGradient4086);fill-opacity:1;fill-rule:evenodd;stroke:#080851;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.98678415;stroke-dasharray:none"
inkscape:box3dsidetype="6"
d="m 3.1564591,23.1661 0,23.425444 25.8843889,-13.998988 0,-16.194119 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3066"
style="fill:url(#linearGradient4088);fill-opacity:1;fill-rule:evenodd;stroke:#080851;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.98678415;stroke-dasharray:none"
inkscape:box3dsidetype="11"
d="m 29.040848,16.398437 20.71294,-0.38824 0,19.325803 -20.71294,-2.743444 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3058"
style="fill:url(#linearGradient4090);fill-opacity:1;fill-rule:evenodd;stroke:#080851;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.98678415;stroke-dasharray:none"
inkscape:box3dsidetype="5"
d="m 3.1564591,23.1661 24.8687709,1.45742 21.728558,-8.613323 -20.71294,0.38824 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3062"
style="fill:url(#linearGradient4092);fill-opacity:1;fill-rule:evenodd;stroke:#080851;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.98678415;stroke-dasharray:none"
inkscape:box3dsidetype="14"
d="m 28.02523,24.62352 0,30.597782 21.728558,-19.885302 0,-19.325803 z" />
<path
sodipodi:type="inkscape:box3dside"
id="path3060"
style="fill:url(#linearGradient4094);fill-opacity:1;fill-rule:evenodd;stroke:#080851;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.98678415;stroke-dasharray:none"
inkscape:box3dsidetype="3"
d="m 3.1564591,23.1661 24.8687709,1.45742 0,30.597782 -24.8687709,-8.629758 z" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB