making progress
This commit is contained in:
commit
a21f9d909c
8 changed files with 1700 additions and 0 deletions
4
plugin/__init__.py
Normal file
4
plugin/__init__.py
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
from .mesh_plugin import MeshPlugin
|
||||
|
||||
plugin = MeshPlugin()
|
||||
plugin.register()
|
||||
13
plugin/debug_install.sh
Normal file
13
plugin/debug_install.sh
Normal 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
1148
plugin/main_dialog.fbp
Normal file
File diff suppressed because it is too large
Load diff
101
plugin/mesh_dialog.py
Normal file
101
plugin/mesh_dialog.py
Normal 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
17
plugin/mesh_plugin.py
Normal 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())
|
||||
149
plugin/mesh_plugin_dialog.py
Normal file
149
plugin/mesh_plugin_dialog.py
Normal 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
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
268
plugin/mesh_plugin_icon.svg
Normal 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 |
Loading…
Add table
Add a link
Reference in a new issue