making progress

This commit is contained in:
jaseg 2020-08-13 12:41:45 +02:00
commit a21f9d909c
8 changed files with 1700 additions and 0 deletions

4
plugin/__init__.py Normal file
View file

@ -0,0 +1,4 @@
from .mesh_plugin import MeshPlugin
plugin = MeshPlugin()
plugin.register()

13
plugin/debug_install.sh Normal file
View file

@ -0,0 +1,13 @@
#!/bin/sh
PLUGIN_NAME=security_mesh
XDG_CONFIG_HOME="${XDG_CONFIG_HOME-$HOME/.config}"
KICAD_BASE="${1-$XDG_CONFIG_HOME/kicad}"
PLUGIN_DIR="$KICAD_BASE/scripting/plugins/$PLUGIN_NAME"
rm -rf "$PLUGIN_DIR"
mkdir -p "$PLUGIN_DIR"
cp -r * $PLUGIN_DIR/

1148
plugin/main_dialog.fbp Normal file

File diff suppressed because it is too large Load diff

101
plugin/mesh_dialog.py Normal file
View file

@ -0,0 +1,101 @@
import wx
import mesh_plugin_dialog
import pcbnew
from collections import defaultdict
# Implementing MainDialog
class MeshPluginMainDialog(mesh_plugin_dialog.MainDialog):
def __init__(self, board):
mesh_plugin_dialog.MainDialog.__init__(self, None)
self.board = board
self.m_cancelButton.Bind(wx.EVT_BUTTON, self.quit)
self.m_removeButton.Bind(wx.EVT_BUTTON, self.tearup_mesh)
self.m_generateButton.Bind(wx.EVT_BUTTON, self.generate_mesh)
self.m_net_prefix.Bind(wx.EVT_TEXT, self.update_net_label)
self.tearup_confirm_dialog = wx.MessageDialog(self, "", style=wx.YES_NO | wx.NO_DEFAULT)
self.nets = { str(wxs) for wxs, netinfo in board.GetNetsByName().items() }
self.update_net_label(None)
self.SetMinSize(self.GetSize())
def get_matching_nets(self):
prefix = self.m_net_prefix.Value
return { net for net in self.nets if net.startswith(prefix) }
def tearup_mesh(self, evt):
matching = self.get_matching_nets()
if not str(self.m_net_prefix.Value):
message = "You have set an empty net prefix. This will match ALL {} nets on the board. Do you really want to tear up all autorouted tracks? This cannot be undone!"
else:
message = "Do you really want to tear up all autorouted traces of the {} matching nets on this board? This step cannot be undone!"
message = message.format(len(matching)) + "\n\nMatching nets:\n" + ", ".join(
'""' if not netname else (netname[:16] + '...' if len(netname) > 16 else netname)
for netname in (sorted(matching)[:5] + ['...'] if len(matching) > 5 else [])
)
self.tearup_confirm_dialog.SetMessage(message)
self.tearup_confirm_dialog.SetYesNoLabels("Tear up {} nets".format(len(matching)), "Close")
if self.tearup_confirm_dialog.ShowModal() == wx.ID_YES:
for track in self.board.GetTracks():
if not (track.GetStatus() & pcbnew.TRACK_AR):
continue
if not track.GetNet().GetNetname() in matching:
continue
board.Remove(track)
def generate_mesh(self, evt):
nets = self.get_matching_nets()
pads = defaultdict(lambda: [])
for module in self.board.GetModules():
for pad in module.Pads():
net = pad.GetNetname()
if net in nets:
pads[net].append(pad)
for net in nets:
if net not in pads:
return wx.MessageDialog(self, "Error: No connection pads found for net {}.".format(net)).ShowModal()
if len(pads[net]) == 1:
return wx.MessageDialog(self, "Error: Only one of two connection pads found for net {}.".format(net)).ShowModal()
if len(pads[net]) > 2:
return wx.MessageDialog(self, "Error: More than two connection pads found for net {}.".format(net)).ShowModal()
eco1_id = self.board.GetLayerID('Eco1.User')
mesh_zones = {}
for drawing in self.board.GetDrawings():
if drawing.GetLayer() == eco1_id:
mesh_zones[drawing] = []
if len(mesh_zones) == 0:
return wx.MessageDialog(self, "Error: Could not find any mesh zones on the Eco1.User layer.").ShowModal()
for zone in mesh_zones:
for module in self.board.GetModules():
for foo in module.GraphicalItems():
if not isinstance(foo, pcbnew.TEXTE_MODULE):
continue
if foo.GetText() == "
# find mesh area on eco1, check connection pads are within target area
def update_net_label(self, evt):
self.m_netLabel.SetLabel('{} matching nets'.format(len(self.get_matching_nets())))
def quit(self, evt):
self.Destroy()
def show_dialog(board):
dialog = MeshPluginMainDialog(board)
dialog.ShowModal()
return dialog

17
plugin/mesh_plugin.py Normal file
View file

@ -0,0 +1,17 @@
import os.path
import pcbnew
from .mesh_dialog import show_dialog
class MeshPlugin(pcbnew.ActionPlugin):
def defaults(self):
self.name = 'Mesh generator'
self.category = 'Modify PCB'
self.description = 'Creates security mesh traces on a PCB'
self.icon_file_name = os.path.join(os.path.dirname(__file__), 'mesh_plugin_icon.png')
self.show_toolbar_button = True
def Run(self):
import pcbnew
show_dialog(pcbnew.GetBoard())

View file

@ -0,0 +1,149 @@
# -*- coding: utf-8 -*-
###########################################################################
## Python code generated with wxFormBuilder (version Oct 26 2018)
## http://www.wxformbuilder.org/
##
## PLEASE DO *NOT* EDIT THIS FILE!
###########################################################################
import wx
import wx.xrc
###########################################################################
## Class MainDialog
###########################################################################
class MainDialog ( wx.Dialog ):
def __init__( self, parent ):
wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Security Mesh Generator Plugin", pos = wx.DefaultPosition, size = wx.Size( 455,283 ), style = wx.DEFAULT_DIALOG_STYLE )
self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
bSizer1 = wx.BoxSizer( wx.VERTICAL )
fgSizer1 = wx.FlexGridSizer( 3, 2, 0, 0 )
fgSizer1.AddGrowableCol( 1 )
fgSizer1.AddGrowableRow( 0 )
fgSizer1.AddGrowableRow( 4 )
fgSizer1.SetFlexibleDirection( wx.VERTICAL )
fgSizer1.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )
fgSizer1.Add( ( 0, 0), 1, wx.EXPAND, 5 )
fgSizer1.Add( ( 0, 0), 1, wx.EXPAND, 5 )
self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"Mesh net name prefix", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText1.Wrap( -1 )
fgSizer1.Add( self.m_staticText1, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT|wx.ALL, 5 )
bSizer3 = wx.BoxSizer( wx.VERTICAL )
self.m_net_prefix = wx.TextCtrl( self, wx.ID_ANY, u"mesh-", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer3.Add( self.m_net_prefix, 2, wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.EXPAND, 5 )
self.m_netLabel = wx.StaticText( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_netLabel.Wrap( -1 )
bSizer3.Add( self.m_netLabel, 0, wx.ALL, 5 )
fgSizer1.Add( bSizer3, 1, wx.EXPAND, 5 )
self.m_staticText3 = wx.StaticText( self, wx.ID_ANY, u"Mesh angle", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText3.Wrap( -1 )
fgSizer1.Add( self.m_staticText3, 0, wx.ALIGN_RIGHT|wx.ALL, 5 )
bSizer4 = wx.BoxSizer( wx.HORIZONTAL )
self.m_angleSpin = wx.SpinCtrlDouble( self, wx.ID_ANY, u"deg", wx.DefaultPosition, wx.DefaultSize, wx.SP_ARROW_KEYS|wx.SP_WRAP, 0, 360, 0.000000, 1 )
self.m_angleSpin.SetDigits( 2 )
bSizer4.Add( self.m_angleSpin, 0, wx.ALL, 5 )
self.m_staticText5 = wx.StaticText( self, wx.ID_ANY, u"° (deg)", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText5.Wrap( -1 )
bSizer4.Add( self.m_staticText5, 0, wx.ALL, 5 )
fgSizer1.Add( bSizer4, 1, wx.EXPAND, 5 )
self.m_staticText4 = wx.StaticText( self, wx.ID_ANY, u"Trace width", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText4.Wrap( -1 )
fgSizer1.Add( self.m_staticText4, 0, wx.ALIGN_RIGHT|wx.ALL, 5 )
bSizer5 = wx.BoxSizer( wx.HORIZONTAL )
self.m_traceSpin = wx.SpinCtrlDouble( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.SP_ARROW_KEYS, 0, 100, 0.127, 1 )
self.m_traceSpin.SetDigits( 3 )
bSizer5.Add( self.m_traceSpin, 0, wx.ALL, 5 )
self.m_staticText6 = wx.StaticText( self, wx.ID_ANY, u"mm", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText6.Wrap( -1 )
bSizer5.Add( self.m_staticText6, 0, wx.ALL, 5 )
fgSizer1.Add( bSizer5, 1, wx.EXPAND, 5 )
self.m_staticText7 = wx.StaticText( self, wx.ID_ANY, u"Space width", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText7.Wrap( -1 )
fgSizer1.Add( self.m_staticText7, 0, wx.ALIGN_RIGHT|wx.ALL, 5 )
bSizer6 = wx.BoxSizer( wx.HORIZONTAL )
self.m_spaceSpin = wx.SpinCtrlDouble( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.SP_ARROW_KEYS, 0, 10000, 0.127, 1 )
self.m_spaceSpin.SetDigits( 3 )
bSizer6.Add( self.m_spaceSpin, 0, wx.ALL, 5 )
self.m_staticText8 = wx.StaticText( self, wx.ID_ANY, u"mm", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText8.Wrap( -1 )
bSizer6.Add( self.m_staticText8, 0, wx.ALL, 5 )
fgSizer1.Add( bSizer6, 1, wx.EXPAND, 5 )
fgSizer1.Add( ( 0, 0), 1, wx.EXPAND, 5 )
fgSizer1.Add( ( 0, 0), 1, wx.EXPAND, 5 )
bSizer1.Add( fgSizer1, 1, wx.ALL|wx.EXPAND, 15 )
wSizer1 = wx.WrapSizer( wx.HORIZONTAL, wx.WRAPSIZER_DEFAULT_FLAGS )
self.m_cancelButton = wx.Button( self, wx.ID_ANY, u"Cancel", wx.DefaultPosition, wx.DefaultSize, 0 )
wSizer1.Add( self.m_cancelButton, 0, wx.ALL, 5 )
wSizer1.Add( ( 0, 0), 1, wx.EXPAND, 5 )
self.m_removeButton = wx.Button( self, wx.ID_ANY, u"Remove Mesh Traces", wx.DefaultPosition, wx.DefaultSize, 0 )
wSizer1.Add( self.m_removeButton, 0, wx.ALL, 5 )
self.m_generateButton = wx.Button( self, wx.ID_ANY, u"Generate", wx.DefaultPosition, wx.DefaultSize, 0 )
wSizer1.Add( self.m_generateButton, 0, wx.ALL, 5 )
bSizer1.Add( wSizer1, 0, wx.ALL|wx.EXPAND, 3 )
self.SetSizer( bSizer1 )
self.Layout()
self.Centre( wx.BOTH )
def __del__( self ):
pass

BIN
plugin/mesh_plugin_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

268
plugin/mesh_plugin_icon.svg Normal file
View file

@ -0,0 +1,268 @@
<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="32"
height="32"
viewBox="0 0 8.4666665 8.4666669"
version="1.1"
id="svg8"
enable-background="new"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="mesh_plugin_icon.svg"
inkscape:export-filename="C:\Users\jaseg\shared\kicad_mesh_plugin\plugin\mesh_plugin_icon.png"
inkscape:export-xdpi="1536.0001"
inkscape:export-ydpi="1536.0001">
<defs
id="defs2">
<filter
inkscape:collect="always"
style="color-interpolation-filters:sRGB"
id="filter1047">
<feBlend
inkscape:collect="always"
mode="multiply"
in2="BackgroundImage"
id="feBlend1049" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.2"
inkscape:cx="4.5605578"
inkscape:cy="17.187514"
inkscape:document-units="px"
inkscape:current-layer="layer2"
showgrid="false"
units="px"
inkscape:window-width="2010"
inkscape:window-height="1449"
inkscape:window-x="927"
inkscape:window-y="325"
inkscape:window-maximized="0" />
<metadata
id="metadata5">
<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
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-288.53332)">
<g
transform="matrix(0.66885692,0.38616473,-0.38616473,0.66885692,89.655935,114.02395)"
id="g936-3"
style="stroke:#ff0000;stroke-width:1.29478419">
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect817-9"
d="M -1.3442177,297.94332 V 287.6712 h 2.27493886 v 10.27212"
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect817-4-4"
d="m 3.2056598,286.9028 v 10.27212 H 0.93072098 V 286.9028"
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect817-4-5-1"
d="M 3.2056596,297.94332 V 287.6712 h 2.2749388 v 10.27212"
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect817-4-50-2"
d="m 7.7555368,286.9028 v 10.27212 H 5.480598 V 286.9028"
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect817-4-50-1-2"
d="M 7.7555361,297.94332 V 287.6712 h 2.2749389 v 10.27212"
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
transform="scale(1,-1)"
y="-301.13742"
x="-2.0629873"
height="3.4333436"
width="12.812233"
id="rect817-6-7-2"
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
transform="scale(1,-1)"
y="-287.14203"
x="-2.0629873"
height="3.4333436"
width="12.812233"
id="rect817-6-6"
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
<rect
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff0066;stroke-width:1.0583334;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1162"
width="11.641666"
height="2.1166666"
x="-301.76248"
y="2.6458335"
transform="rotate(-90)" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2"
style="filter:url(#filter1047)">
<g
transform="matrix(-0.38616472,0.66885693,-0.66885693,-0.38616472,176.90374,132.77551)"
id="g936-3-2"
style="stroke:#0000ff;stroke-width:1.29478419">
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect817-9-7"
d="M -1.3442177,297.94332 V 287.6712 h 2.27493886 v 10.27212"
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect817-4-4-1"
d="m 3.2056598,286.9028 v 10.27212 H 0.93072098 V 286.9028"
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect817-4-5-1-9"
d="M 3.2056596,297.94332 V 287.6712 h 2.2749388 v 10.27212"
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect817-4-50-2-7"
d="m 7.7555368,286.9028 v 10.27212 H 5.480598 V 286.9028"
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect817-4-50-1-2-1"
d="M 7.7555361,297.94332 V 287.6712 h 2.2749389 v 10.27212"
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#0000ff;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
transform="scale(1,-1)"
y="-301.13742"
x="-2.0629873"
height="3.4333436"
width="12.812233"
id="rect817-6-7-2-2"
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<rect
transform="scale(1,-1)"
y="-287.14203"
x="-2.0629873"
height="3.4333436"
width="12.812233"
id="rect817-6-6-4"
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.37031341;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
</g>
<g
id="g1143"
transform="translate(29.175038)">
<g
style="stroke-width:1.53783906"
transform="matrix(0.60104301,0,0,0.70351388,1.682609,-201.37744)"
id="g936">
<path
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:1.22065973;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M -1.3442177,300.60656 V 287.6712 h 2.27493886 v 12.93536"
id="rect817"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:1.22065973;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 3.2056598,286.9028 v 10.27212 H 0.93072098 V 286.9028"
id="rect817-4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:1.22065973;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 3.2056596,297.94332 V 287.6712 h 2.2749388 v 10.27212"
id="rect817-4-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:1.22065973;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 7.7555368,286.9028 v 10.27212 H 5.480598 V 286.9028"
id="rect817-4-50"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ff0000;stroke-width:1.22065973;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 7.7555361,300.00694 v -12.33573 h 2.2749389 v 12.33573"
id="rect817-4-50-1"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<rect
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.62754631;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect817-6-7"
width="29.202082"
height="3.4333436"
x="-12.085557"
y="-301.13742"
transform="scale(1,-1)" />
<rect
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.62754631;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect817-6"
width="21.105419"
height="3.4333436"
x="-5.1680188"
y="-287.14203"
transform="scale(1,-1)" />
</g>
<path
inkscape:connector-curvature="0"
id="path1095"
d="M -2.1497396,8.2776784 11.393603,4.6487508"
style="fill:none;stroke:#0000ff;stroke-width:0.79374999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.26458333,0,0,0.26458333,-2.5814409,2.7705534)"
inkscape:connector-curvature="0"
id="path1095-0"
d="M 0.12940951,14.198595 51.316845,0.48296288"
style="fill:none;stroke:#0000ff;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter1047)" />
<path
transform="matrix(0.26458333,0,0,0.26458333,-2.9789023,1.0201405)"
inkscape:connector-curvature="0"
id="path1095-7"
d="M 0.12940951,14.198595 51.316845,0.48296288"
style="fill:none;stroke:#0000ff;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter1047)" />
</g>
<rect
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#0000aa;stroke-width:1.0583334;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect1145"
width="14.816667"
height="2.1166666"
x="-7.9375"
y="3.7041669" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB