First groundwork on Arch Schedule tool

This commit is contained in:
Yorik van Havre 2015-04-26 13:57:36 -03:00
parent baf0dc0524
commit 02f938ebdf
8 changed files with 765 additions and 7 deletions

View File

@ -49,3 +49,4 @@ from ArchEquipment import *
from ArchCutPlane import *
from ArchServer import *
from ArchMaterial import *
from ArchSchedule import *

View File

@ -120,8 +120,8 @@ class _ArchMaterial:
def execute(self,obj):
if obj.Material and FreeCAD.GuiUp:
if "Color" in obj.Material:
c = tuple([float(f) for f in obj.Material['Color'].strip("()").split(",")])
if "DiffuseColor" in obj.Material:
c = tuple([float(f) for f in obj.Material['DiffuseColor'].strip("()").split(",")])
for p in obj.InList:
if hasattr(p,"BaseMaterial"):
if p.BaseMaterial.Name == obj.Name:
@ -191,9 +191,9 @@ class _ArchMaterialTaskPanel:
self.form.FieldName.setText(self.obj.Label)
if 'Description' in self.material:
self.form.FieldDescription.setText(self.material['Description'])
if 'Color' in self.material:
if "(" in self.material['Color']:
c = tuple([float(f) for f in self.material['Color'].strip("()").split(",")])
if 'DiffuseColor' in self.material:
if "(" in self.material['DiffuseColor']:
c = tuple([float(f) for f in self.material['DiffuseColor'].strip("()").split(",")])
self.color = QtGui.QColor()
self.color.setRgbF(c[0],c[1],c[2])
colorPix = QtGui.QPixmap(16,16)
@ -208,7 +208,7 @@ class _ArchMaterialTaskPanel:
"sets self.material from the contents of the task box"
self.material['Name'] = self.form.FieldName.text()
self.material['Description'] = self.form.FieldDescription.text()
self.material['Color'] = str(self.color.getRgbF()[:3])
self.material['DiffuseColor'] = str(self.color.getRgbF()[:3])
self.material['StandardCode'] = self.form.FieldCode.text()
self.material['ProductURL'] = self.form.FieldUrl.text()

View File

@ -0,0 +1,247 @@
# -*- coding: utf8 -*-
#***************************************************************************
#* *
#* Copyright (c) 2015 - 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) *
#* as published by the Free Software Foundation; either version 2 of *
#* the License, or (at your option) any later version. *
#* for detail see the LICENCE text file. *
#* *
#* This program is distributed in the hope that it will be useful, *
#* but WITHOUT ANY WARRANTY; without even the implied warranty of *
#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
#* GNU Library General Public License for more details. *
#* *
#* You should have received a copy of the GNU Library General Public *
#* License along with this program; if not, write to the Free Software *
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
#* USA *
#* *
#***************************************************************************
import FreeCAD, time
if FreeCAD.GuiUp:
import FreeCADGui, Arch_rc, os
from PySide import QtCore, QtGui
from DraftTools import translate
__title__ = "Arch Schedule Managment"
__author__ = "Yorik van Havre"
__url__ = "http://www.freecadweb.org"
class _CommandArchSchedule:
"the Arch Schedule command definition"
def GetResources(self):
return {'Pixmap': 'Arch_Schedule',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_Schedule","Create schedule..."),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_Schedule","Creates a materials or areas schedule.")}
def Activated(self):
taskd = _ArchScheduleTaskPanel()
FreeCADGui.Control.showDialog(taskd)
def IsActive(self):
if FreeCAD.ActiveDocument:
return True
else:
return False
class _ArchScheduleTaskPanel:
'''The editmode TaskPanel for MechanicalMaterial objects'''
def __init__(self):
self.form = FreeCADGui.PySideUic.loadUi(os.path.splitext(__file__)[0]+".ui")
QtCore.QObject.connect(self.form.ComboType, QtCore.SIGNAL("currentIndexChanged(int)"), self.changeType)
def changeType(self,idx):
"changes the type of schedule"
if idx == 0:
# quantities
self.form.GroupQuantities.maximumHeight = 1677215
elif idx == 1:
# spaces
self.form.GroupQuantities.maximumHeight = 17
elif idx == 2:
# windows
self.form.GroupQuantities.maximumHeight = 17
def accept(self):
sp = FreeCAD.ActiveDocument.addObject('Spreadsheet::Sheet','Schedule')
if self.form.ComboType.currentIndex() == 0:
self.fillMaterialsSchedule(sp)
elif self.form.ComboType.currentIndex() == 1:
self.fillSpacesSchedule(sp)
FreeCADGui.Control.closeDialog()
def getRoles(self,roles):
"gets all objects of the given roles in the document"
objs = []
for obj in FreeCAD.ActiveDocument.Objects:
if obj.ViewObject.isVisible():
if hasattr(obj,"Role"):
for r in roles:
if obj.Role == r:
objs.append(obj)
break
return objs
def getMaterials(self,objs):
"classify the given objects by material"
res = {}
for obj in objs:
if hasattr(obj,"BaseMaterial"):
if obj.BaseMaterial:
res.setdefault(obj.BaseMaterial.Name,[]).append(obj)
return res
def getEntry(self,mat,entry):
"returns the given entry from a given material name"
res = ""
m = FreeCAD.ActiveDocument.getObject(mat)
if m:
if m.Material:
if entry in m.Material.keys():
res = m.Material[entry].encode('utf8')
return res
def fillMaterialsSchedule(self,sp):
"creates a materials schedule in the given spreadsheet"
# table title
col = self.form.FieldStartCell.text()[0]
row = int(self.form.FieldStartCell.text()[1:])
global volunit,curunit
volunit = self.form.FieldVolumeUnit.text().encode("utf8")
curunit = self.form.FieldCurrencyUnit.text().encode("utf8")
sec = 1
sp.set(col+str(row), translate("Arch","Quantities schedule"))
row += 1
sp.set(col+str(row), translate("Arch","Project") + ": " + FreeCAD.ActiveDocument.Label)
row += 1
sp.set(col+str(row), translate("Arch","Date") + ": " + time.asctime())
row += 2
# column headers
end = 1
sp.set(chr(ord(col)+end)+str(row), translate("Arch","Material"))
end += 1
if self.form.CheckDescription.isChecked():
sp.set(chr(ord(col)+end)+str(row),translate("Arch","Description"))
end += 1
if self.form.CheckColor.isChecked():
sp.set(chr(ord(col)+end)+str(row),translate("Arch","Color"))
end += 1
if self.form.CheckFinish.isChecked():
sp.set(chr(ord(col)+end)+str(row),translate("Arch","Finish"))
end += 1
if self.form.CheckUrl.isChecked():
sp.set(chr(ord(col)+end)+str(row),translate("Arch","URL"))
end += 1
sp.set(chr(ord(col)+end)+str(row),translate("Arch","Item"))
end += 1
sp.set(chr(ord(col)+end)+str(row),translate("Arch","Volume")+" ("+volunit+")")
end += 1
if self.form.CheckPrice.isChecked():
sp.set(chr(ord(col)+end)+str(row),translate("Arch","Unit price")+" ("+curunit+"/"+volunit+")")
end += 1
sp.set(chr(ord(col)+end)+str(row),translate("Arch","Total price")+" ("+curunit+")")
row += 2
# volume-based row data
if self.form.CheckStructures.isChecked():
row,col,sec = self.printVolume(sp,"Column",translate("Arch","Columns"),row,col,sec)
row,col,sec = self.printVolume(sp,"Beam",translate("Arch","Beams"),row,col,sec)
row,col,sec = self.printVolume(sp,"Slab",translate("Arch","Slabs"),row,col,sec)
row,col,sec = self.printVolume(sp,"Foundation",translate("Arch","Foundations"),row,col,sec)
row,col,sec = self.printVolume(sp,"Pile",None,row,col,sec)
if self.form.CheckStairs.isChecked():
row,col,sec = self.printVolume(sp,"Stair",translate("Arch","Stairs"),row,col,sec)
row,col,sec = self.printVolume(sp,"Stair Flight",None,row,col,sec)
row,col,sec = self.printVolume(sp,"Ramp",None,row,col,sec)
row,col,sec = self.printVolume(sp,"Ramp Flight",None,row,col,sec)
if self.form.CheckWalls.isChecked():
row,col,sec = self.printVolume(sp,"Wall",translate("Arch","Walls"),row,col,sec)
row,col,sec = self.printVolume(sp,"Wall Layer",None,row,col,sec)
row,col,sec = self.printVolume(sp,"Curtain Wall",None,row,col,sec)
if self.form.CheckOthers.isChecked():
sp.set(col+str(row), str(sec) + ". " + translate("Arch","Miscellaneous"))
sec += 1
row += 2
row,col,sec = self.printVolume(sp,"Chimney",None,row,col,sec)
row,col,sec = self.printVolume(sp,"Covering",None,row,col,sec)
row,col,sec = self.printVolume(sp,"Shading Device",None,row,col,sec)
row,col,sec = self.printVolume(sp,"Member",None,row,col,sec)
row,col,sec = self.printVolume(sp,"Railing",None,row,col,sec)
row,col,sec = self.printVolume(sp,"Tendon",None,row,col,sec)
row,col,sec = self.printVolume(sp,"Undefined",None,row,col,sec)
# TODO area: Covering Door Plate Rebar Roof Window
# TODO count: Furniture Hydro Equipment Electric Equipment
def printVolume(self,sp,role,title,row,col,sec):
"print object type quantities to the spreadsheet"
objs = self.getRoles([role])
totprice = 0
if objs:
if title:
sp.set(col+str(row), str(sec) + ". " + title)
sec += 1
row += 2
mats = self.getMaterials(objs)
for mat,mobjs in mats.items():
end = 1
sp.set(chr(ord(col)+end)+str(row),self.getEntry(mat,"Name"))
end += 1
if self.form.CheckDescription.isChecked():
sp.set(chr(ord(col)+end)+str(row),self.getEntry(mat,"Description"))
end += 1
if self.form.CheckColor.isChecked():
if self.getEntry(mat,"DiffuseColor"):
sp.setBackground(chr(ord(col)+end)+str(row),tuple([float(f) for f in self.getEntry(mat,"DiffuseColor").strip("()").split(",")]))
end += 1
if self.form.CheckFinish.isChecked():
sp.set(chr(ord(col)+end)+str(row),self.getEntry(mat,"Finish"))
end += 1
if self.form.CheckUrl.isChecked():
sp.set(chr(ord(col)+end)+str(row),self.getEntry(mat,"ProductURL"))
end += 1
total = 0
for mobj in mobjs:
if not self.form.CheckOnlyShowTotals.isChecked():
v = FreeCAD.Units.Quantity(mobj.Shape.Volume,FreeCAD.Units.Volume).getValueAs(volunit.replace("³","^3")).Value
sp.set(chr(ord(col)+end)+str(row),mobj.Label)
sp.set(chr(ord(col)+end+1)+str(row),str(v))
total += v
if self.form.CheckPrice.isChecked():
sp.set(chr(ord(col)+end+2)+str(row),self.getEntry(mat,"SpecificPrice"))
sp.set(chr(ord(col)+end+3)+str(row),"="+chr(ord(col)+end+1)+str(row)+"*"+chr(ord(col)+end+2)+str(row))
row += 1
sp.set(chr(ord(col)+end)+str(row),translate("Arch","Total"))
sp.set(chr(ord(col)+end+1)+str(row),str(total))
if self.form.CheckPrice.isChecked():
sp.set(chr(ord(col)+end+2)+str(row),self.getEntry(mat,"SpecificPrice"))
sp.set(chr(ord(col)+end+3)+str(row),"="+chr(ord(col)+end+1)+str(row)+"*"+chr(ord(col)+end+2)+str(row))
try:
totprice += total * float(self.getEntry(mat,"SpecificPrice"))
except:
print "Arch.Schedule: Unable to add price"
row += 2
if self.form.CheckPrice.isChecked():
if totprice:
sp.set(chr(ord(col)+end)+str(row),translate("Arch","Total")+" "+title)
sp.set(chr(ord(col)+end+3)+str(row),str(totprice))
row += 2
return row,col,sec
if FreeCAD.GuiUp:
FreeCADGui.addCommand('Arch_Schedule',_CommandArchSchedule())

View File

@ -0,0 +1,343 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>211</width>
<height>734</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>General</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QComboBox" name="ComboType">
<item>
<property name="text">
<string>Quantities</string>
</property>
</item>
<item>
<property name="text">
<string>Spaces</string>
</property>
</item>
<item>
<property name="text">
<string>Doors and windows</string>
</property>
</item>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Start cell</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="FieldStartCell">
<property name="text">
<string>A1</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Area unit</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="FieldAreaUnit">
<property name="text">
<string>m²</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Volume unit</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="FieldVolumeUnit">
<property name="text">
<string>m³</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Currency unit</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton">
<property name="toolTip">
<string>This must match what is stored in the project materials. No conversion will be done.</string>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="messagebox_warning">
<normaloff/>
</iconset>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="FieldCurrencyUnit">
<property name="text">
<string>€</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="GroupQuantities">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>1677215</height>
</size>
</property>
<property name="title">
<string>Quantities</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QCheckBox" name="CheckOnlyShowTotals">
<property name="text">
<string>Only show totals</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckDescription">
<property name="text">
<string>Add material description</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckColor">
<property name="text">
<string>Add material color</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckFinish">
<property name="text">
<string>Add material finish</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckUrl">
<property name="text">
<string>Add material URL</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckPrice">
<property name="text">
<string>Add price calculation</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckStructures">
<property name="text">
<string>Add structures</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckStairs">
<property name="text">
<string>Add stairs</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckWalls">
<property name="text">
<string>Add walls</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckOthers">
<property name="text">
<string>Add all other roles</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckFloors">
<property name="text">
<string>Add floors</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckCeilings">
<property name="text">
<string>Add ceilings</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckRoofs">
<property name="text">
<string>Add roofs</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckWindows">
<property name="text">
<string>Add windows and doors</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckPanels">
<property name="text">
<string>Add panels</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckEquipments">
<property name="text">
<string>Add equipments</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CheckFurniture">
<property name="text">
<string>Add furniture</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -125,6 +125,8 @@ class _Stairs(ArchComponent.Component):
obj.setEditorMode("RiserHeight",1)
obj.setEditorMode("BlondelRatio",1)
self.Type = "Stairs"
self.Role = ["Stair","Stair Flight"]
self.Role = "Stair"
def execute(self,obj):

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_Material","Arch_CutPlane",
"Arch_Frame","Arch_Material","Arch_Schedule","Arch_CutPlane",
"Arch_Add","Arch_Remove","Arch_Survey"]
self.utilities = ["Arch_Component","Arch_SplitMesh","Arch_MeshToShape",
"Arch_SelectNonSolidMeshes","Arch_RemoveShape",

View File

@ -56,6 +56,7 @@
<file>icons/Arch_Component.svg</file>
<file>icons/Arch_Material.svg</file>
<file>icons/Arch_Material_Group.svg</file>
<file>icons/Arch_Schedule.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,164 @@
<?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.5 r10040"
sodipodi:docname="Spreadsheet.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1">
<defs
id="defs2862">
<linearGradient
id="linearGradient3763">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3765" />
<stop
style="stop-color:#ffa600;stop-opacity:1;"
offset="1"
id="stop3767" />
</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" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="radialGradient3703"
gradientUnits="userSpaceOnUse"
cx="135.38333"
cy="97.369568"
fx="135.38333"
fy="97.369568"
r="19.467436"
gradientTransform="matrix(0.97435,0.2250379,-0.4623105,2.0016728,48.487554,-127.99883)" />
<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="radialGradient3705"
gradientUnits="userSpaceOnUse"
cx="148.88333"
cy="81.869568"
fx="148.88333"
fy="81.869568"
r="19.467436"
gradientTransform="matrix(1.3852588,-0.05136783,0.03705629,0.9993132,-60.392403,7.7040438)" />
<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="perspective2868" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3763"
id="linearGradient3769"
x1="29.272728"
y1="9.2727289"
x2="29.09091"
y2="56.909092"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.7781746"
inkscape:cx="23.7211"
inkscape:cy="29.391527"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1053"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<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:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<rect
style="color:#000000;fill:url(#linearGradient3769);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;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="rect3002"
width="56.18182"
height="46.545456"
x="4"
y="9.272728" />
<rect
style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;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="rect3002-9"
width="56.18182"
height="46.545456"
x="4"
y="9.272728" />
<path
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 4,20.545455 55.636364,0"
id="path3790"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="M 20.909091,9.6363636 20.909091,56"
id="path3792"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 4,32.429811 55.090909,0"
id="path3794"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="m 4,44.483064 55.636364,0"
id="path3796"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB