aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2014-12-26 14:58:11 +0100
committerJakob Odersky <jodersky@gmail.com>2014-12-26 14:58:11 +0100
commit4238db415450ddddfe4c3ebd80fb7f641dd671ec (patch)
tree7c0e5cbee9539cc469cb9bf0d719a28f2600f3ce
parent12ee4250ab270cfd7c48ffa7488a2245ac914f06 (diff)
downloadmavigator-4238db415450ddddfe4c3ebd80fb7f641dd671ec.tar.gz
mavigator-4238db415450ddddfe4c3ebd80fb7f641dd671ec.tar.bz2
mavigator-4238db415450ddddfe4c3ebd80fb7f641dd671ec.zip
refactor ui
-rw-r--r--vfd-backend/app/controllers/Application.scala8
-rw-r--r--vfd-backend/app/plugins/UavClientConnection.scala4
-rw-r--r--vfd-backend/app/plugins/UavPlugin.scala12
-rw-r--r--vfd-backend/app/views/main.scala.html2
-rw-r--r--vfd-backend/app/views/uav.scala.html15
-rw-r--r--vfd-backend/conf/application.conf6
-rw-r--r--vfd-backend/conf/routes8
-rw-r--r--vfd-backend/public/images/instruments/balance.svg169
-rw-r--r--vfd-backend/public/images/instruments/bar.svg63
-rw-r--r--vfd-backend/public/images/instruments/basic.svg314
-rw-r--r--vfd-backend/public/images/instruments/generic.svg1217
-rw-r--r--vfd-backend/public/images/instruments/generic2.svg1063
-rw-r--r--vfd-backend/public/stylesheets/main.css43
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/Environment.scala (renamed from vfd-frontend/src/main/scala/vfd/frontend/util/Environment.scala)2
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/Launcher.scala4
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/Main.scala69
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/MavlinkSocket.scala23
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/ui/Components.scala105
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/ui/Layout.scala57
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/ui/components/SvgInstrument.scala55
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/ui/components/instruments.scala124
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/ui/panels/Communication.scala128
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/ui/panels/Primary.scala49
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/util/Framework.scala70
-rw-r--r--vfd-frontend/src/main/scala/vfd/frontend/util/package.scala15
25 files changed, 1902 insertions, 1723 deletions
diff --git a/vfd-backend/app/controllers/Application.scala b/vfd-backend/app/controllers/Application.scala
index 09e0e0d..827950e 100644
--- a/vfd-backend/app/controllers/Application.scala
+++ b/vfd-backend/app/controllers/Application.scala
@@ -11,18 +11,18 @@ import plugins.UavPlugin
object Application extends Controller {
- private def uav = current.plugin[UavPlugin].getOrElse(throw new RuntimeException("UAV plugin is not available"))
+ private def plugin = current.plugin[UavPlugin].getOrElse(throw new RuntimeException("UAV plugin is not available"))
def index = Action { implicit request =>
Redirect(routes.Application.uav(0))
}
- def uav(sysId: Int) = Action { implicit request =>
- Ok(views.html.uav(routes.Application.mavlink.webSocketURL(), sysId))
+ def uav(remoteSystemId: Int) = Action { implicit request =>
+ Ok(views.html.uav(routes.Application.mavlink.webSocketURL(), remoteSystemId.toByte, plugin.systemId, 0.toByte))
}
def mavlink = WebSocket.acceptWithActor[Array[Byte], Array[Byte]] { implicit request =>
- out => uav.register(out)
+ out => plugin.register(out)
}
} \ No newline at end of file
diff --git a/vfd-backend/app/plugins/UavClientConnection.scala b/vfd-backend/app/plugins/UavClientConnection.scala
index b479aa5..76975e1 100644
--- a/vfd-backend/app/plugins/UavClientConnection.scala
+++ b/vfd-backend/app/plugins/UavClientConnection.scala
@@ -5,6 +5,7 @@ import akka.actor.ActorLogging
import akka.actor.ActorRef
import akka.actor.actorRef2Scala
import vfd.uav.Connection
+import akka.util.ByteString
/**
* Interfaces traffic from a websocket with a connection to a UAV.
@@ -23,6 +24,9 @@ class UavClientConnection(websocket: ActorRef, uav: ActorRef) extends Actor with
case Connection.Closed(msg) =>
log.warning(msg)
context stop self
+
+ case fromClient: Array[Byte] =>
+ uav ! Connection.Send(ByteString(fromClient))
}
diff --git a/vfd-backend/app/plugins/UavPlugin.scala b/vfd-backend/app/plugins/UavPlugin.scala
index 43e015c..9b45627 100644
--- a/vfd-backend/app/plugins/UavPlugin.scala
+++ b/vfd-backend/app/plugins/UavPlugin.scala
@@ -12,29 +12,31 @@ class UavPlugin(app: Application) extends Plugin {
private lazy val config = app.configuration.getConfig("uav")
- lazy val systemId = config.flatMap(_.getInt("system_id")).getOrElse(1)
+ lazy val systemId = config.flatMap(_.getInt("system_id")).getOrElse(1).toByte
private lazy val connection = {
val conn = config.flatMap(_.getConfig("connection"))
val tpe = conn.flatMap(_.getString("type")).getOrElse("mock")
val heartbeat = conn.flatMap(_.getInt("heartbeat")).getOrElse(2000)
- val id = conn.flatMap(_.getInt("component_id")).getOrElse(99).toByte
+ val compId = conn.flatMap(_.getInt("component_id")).getOrElse(1).toByte
val props = tpe match {
case "mock" =>
- MockConnection.apply
+ val remote = config.flatMap(_.getInt("mock.remote_system_id")).getOrElse(42).toByte
+ MockConnection(systemId, compId, remote)
case "serial" =>
val serial = config.flatMap(_.getConfig("serial"))
SerialConnection(
- id,
+ systemId,
+ compId,
heartbeat,
serial.flatMap(_.getString("port")).getOrElse("/dev/ttyUSB0"),
serial.flatMap(_.getInt("baud")).getOrElse(115200),
serial.flatMap(_.getBoolean("two_stop_bits")).getOrElse(false),
serial.flatMap(_.getInt("parity")).getOrElse(0))
- case unknown => throw new RuntimeException("Unsupported connection type '" + unknown + "'")
+ case unknown => throw new IllegalArgumentException("Unsupported connection type '" + unknown + "'")
}
Akka.system(app).actorOf(props, name = "uav-connection")
diff --git a/vfd-backend/app/views/main.scala.html b/vfd-backend/app/views/main.scala.html
index 8537db6..1be335b 100644
--- a/vfd-backend/app/views/main.scala.html
+++ b/vfd-backend/app/views/main.scala.html
@@ -28,7 +28,7 @@
</button>
<a class="navbar-brand" href="@routes.Application.index">
<!-- <img style="max-height: 100%;" src="@routes.Assets.at("images/logo-invert.svg")" alt="logo"> -->
- Virtual Flight Deck
+ Flight Control Panel
</a>
</div>
diff --git a/vfd-backend/app/views/uav.scala.html b/vfd-backend/app/views/uav.scala.html
index 410e3c0..0ce7927 100644
--- a/vfd-backend/app/views/uav.scala.html
+++ b/vfd-backend/app/views/uav.scala.html
@@ -1,4 +1,4 @@
-@(socket: String, remoteSystemId: Int)
+@(socket: String, remoteSystemId: Byte, systemId: Byte, componentId: Byte)
@main("Main", "Remote System " + remoteSystemId){
@@ -10,8 +10,15 @@
</p>
</div>
- <div id="app" data-socketUrl="@socket" data-remoteSystemId="@remoteSystemId.toString">
- Loading...
+ <div
+ id="app"
+ data-socketUrl="@socket"
+ data-remoteSystemId="@remoteSystemId.toString"
+ data-systemId="@systemId.toString"
+ data-componentId="@componentId.toString">
+ <div class="loader">
+ <i class="fa fa-spinner fa-spin"></i>
+ </div>
</div>
<script type="text/javascript">
@@ -22,7 +29,7 @@
} catch(err) {
document.getElementById("scalajsError").style.display = "block";
document.getElementById("scalajsErrorMessage").innerHTML = err;
- console.log(err)
+ console.error(err)
}
}
</script>
diff --git a/vfd-backend/conf/application.conf b/vfd-backend/conf/application.conf
index e069b23..c2026a3 100644
--- a/vfd-backend/conf/application.conf
+++ b/vfd-backend/conf/application.conf
@@ -68,12 +68,12 @@ logger.application=DEBUG
uav.system_id=1
# Type of connection to use
-# 'mock' for a sample connection
-uav.connection.type=serial
+# 'mock' or 'serial'
+uav.connection.type=mock
# Mavlink component id used by this connection (not the web frontend),
# in case it needs to inject messages
-uav.connection.component_id=99
+uav.connection.component_id=1
# Delay in milliseconds between heartbeat messages injected by
# the connection
diff --git a/vfd-backend/conf/routes b/vfd-backend/conf/routes
index eea8d8e..3d38889 100644
--- a/vfd-backend/conf/routes
+++ b/vfd-backend/conf/routes
@@ -3,9 +3,9 @@
# ~~~~
# Home page
-GET / controllers.Application.index
-GET /uav/:sysId controllers.Application.uav(sysId: Int)
-GET /mavlink controllers.Application.mavlink
+GET / controllers.Application.index
+GET /uav/:remoteSystemId controllers.Application.uav(remoteSystemId: Int)
+GET /mavlink controllers.Application.mavlink
# Map static resources from the /public folder to the /assets URL path
-GET /assets/*file controllers.Assets.at(path="/public", file)
+GET /assets/*file controllers.Assets.at(path="/public", file)
diff --git a/vfd-backend/public/images/instruments/balance.svg b/vfd-backend/public/images/instruments/balance.svg
new file mode 100644
index 0000000..57511e9
--- /dev/null
+++ b/vfd-backend/public/images/instruments/balance.svg
@@ -0,0 +1,169 @@
+<?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="100"
+ height="100"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ viewBox="-50 -50 100 100"
+ sodipodi:docname="balance.svg">
+ <defs
+ id="defs4">
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath3098">
+ <path
+ sodipodi:type="arc"
+ style="fill:#00ffff;fill-opacity:1;stroke:none"
+ id="path3100"
+ sodipodi:cx="50"
+ sodipodi:cy="50"
+ sodipodi:rx="50"
+ sodipodi:ry="50"
+ d="M 100,50 A 50,50 0 1 1 0,50 50,50 0 1 1 100,50 z"
+ transform="translate(-50,-50)" />
+ </clipPath>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8.45"
+ inkscape:cx="103.63625"
+ inkscape:cy="35.905276"
+ inkscape:document-units="px"
+ inkscape:current-layer="svg2"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1029"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2985"
+ units="px"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="1px"
+ spacingy="1px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <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 />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="zones">
+ <path
+ transform="translate(-50,-50)"
+ d="m 60,50 a 10,10 0 1 1 -20,0 10,10 0 1 1 20,0 z"
+ sodipodi:ry="10"
+ sodipodi:rx="10"
+ sodipodi:cy="50"
+ sodipodi:cx="50"
+ id="balanced"
+ style="fill:#c6e9af;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ </g>
+ <g
+ id="fixed">
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path2996"
+ d="m 23.467106,7.0710678 c 1.387622,-4.611486 1.387622,-9.5306496 0,-14.1421356 m -46.934212,0 c -1.387622,4.611486 -1.387622,9.5306496 0,14.1421356"
+ style="fill:none;stroke:#1a1a1a;stroke-width:1;stroke-opacity:1" />
+ <path
+ sodipodi:type="arc"
+ style="fill:none;stroke:#1a1a1a;stroke-width:0.15228426;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="path3772"
+ sodipodi:cx="50"
+ sodipodi:cy="50"
+ sodipodi:rx="5"
+ sodipodi:ry="5"
+ d="m 55,50 a 5,5 0 1 1 -10,0 5,5 0 1 1 10,0 z"
+ transform="matrix(9.85,0,0,9.85,-492.5,-492.5)" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3774"
+ d="m 36.327611,7.0710678 c 0.903087,-4.6644242 0.903087,-9.4777114 0,-14.1421356 m -72.655222,0 c -0.903087,4.6644242 -0.903087,9.4777114 0,14.1421356"
+ style="fill:none;stroke:#1a1a1a;stroke-width:1.00000012;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3776"
+ d="m -9.6785241,-7.0710678 c -3.0692919,4.1991084 -3.0692919,9.9430272 0,14.1421356 m 19.3570482,0 c 3.0692919,-4.1991084 3.0692919,-9.9430272 0,-14.1421356"
+ style="fill:none;stroke:#1a1a1a;stroke-width:1;stroke-opacity:1" />
+ <path
+ style="fill:none;stroke:#1a1a1a;stroke-width:1;stroke-opacity:1"
+ d="m 7.0710678,-23.467106 c -4.611486,-1.387622 -9.5306496,-1.387622 -14.1421356,0 m 0,46.934212 c 4.611486,1.387622 9.5306496,1.387622 14.1421356,0"
+ id="path3809"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#1a1a1a;stroke-width:1.00000012;stroke-opacity:1"
+ d="m 7.0710678,-36.327611 c -4.6644242,-0.903087 -9.4777114,-0.903087 -14.1421356,0 m 0,72.655222 c 4.6644242,0.903087 9.4777114,0.903087 14.1421356,0"
+ id="path3811"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#1a1a1a;stroke-width:1;stroke-opacity:1"
+ d="m -7.0710678,9.6785241 c 4.1991084,3.0692919 9.9430272,3.0692919 14.1421356,0 m 0,-19.3570482 c -4.1991084,-3.0692919 -9.9430272,-3.0692919 -14.1421356,0"
+ id="path3813"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ transform="translate(-50,-50)"
+ inkscape:connector-curvature="0"
+ id="path3819"
+ d="M 15,15 85,85"
+ style="fill:none;stroke:#1a1a1a;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <path
+ transform="translate(-50,-50)"
+ inkscape:connector-curvature="0"
+ id="path3821"
+ d="M 15,85 85,15"
+ style="fill:none;stroke:#1a1a1a;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <g
+ id="position"
+ clip-path="url(#clipPath3098)">
+ <rect
+ y="-7.5"
+ x="-0.5"
+ height="15"
+ width="1"
+ id="rect2997"
+ style="fill:#ff6600;fill-opacity:1;stroke:none" />
+ <rect
+ y="-0.5"
+ x="-7.5"
+ height="1"
+ width="14"
+ id="rect2999"
+ style="fill:#ff6600;fill-opacity:1;stroke:none" />
+ </g>
+</svg>
diff --git a/vfd-backend/public/images/instruments/bar.svg b/vfd-backend/public/images/instruments/bar.svg
index 03d311a..50ecebf 100644
--- a/vfd-backend/public/images/instruments/bar.svg
+++ b/vfd-backend/public/images/instruments/bar.svg
@@ -9,33 +9,26 @@
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="100"
+ width="32"
height="100"
id="svg4387"
version="1.1"
inkscape:version="0.48.5 r10040"
- viewBox="-50 -50 100 100"
- sodipodi:docname="voltage.svg">
+ viewBox="0 0 32 100"
+ sodipodi:docname="bar.svg">
<defs
id="defs4389">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 50 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="100 : 50 : 1"
- inkscape:persp3d-origin="50 : 33.333333 : 1"
- id="perspective5114" />
<clipPath
clipPathUnits="userSpaceOnUse"
- id="clipPath3111">
+ id="clipPath2997">
<rect
- y="-48.5"
- x="-3.5"
+ clip-path="none"
+ y="1.5"
+ x="1.5"
height="97"
width="29"
- id="rect3113"
- style="fill:#00ffff;fill-opacity:1;stroke:none"
- ry="3.5" />
+ id="rect2999"
+ style="fill:#00ffff;fill-opacity:1;stroke:none" />
</clipPath>
</defs>
<sodipodi:namedview
@@ -46,8 +39,8 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6568542"
- inkscape:cx="86.541936"
- inkscape:cy="51.30932"
+ inkscape:cx="97.092685"
+ inkscape:cy="49.623219"
inkscape:document-units="px"
inkscape:current-layer="svg4387"
showgrid="true"
@@ -82,41 +75,17 @@
</cc:Work>
</rdf:RDF>
</metadata>
- <g
- id="labels">
- <text
- sodipodi:linespacing="125%"
- id="text5104"
- y="0.71679688"
- x="-29.029297"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#1a1a1a;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- xml:space="preserve"><tspan
- y="0.71679688"
- x="-29.029297"
- id="value"
- sodipodi:role="line">0</tspan></text>
- <text
- sodipodi:linespacing="125%"
- id="text5106"
- y="12.33289"
- x="-29.03418"
- style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- xml:space="preserve"><tspan
- y="12.33289"
- x="-29.03418"
- id="unit"
- sodipodi:role="line">%</tspan></text>
- </g>
<rect
style="fill:#00ff00;fill-opacity:1;stroke:none"
id="level"
width="29"
height="97"
- x="-3.5"
- y="-48.5"
- clip-path="url(#clipPath3111)" />
+ x="1.5"
+ y="1.5"
+ clip-path="url(#clipPath2997)" />
<g
- id="fixed">
+ id="fixed"
+ transform="translate(5,50)">
<path
id="rect3022"
transform="translate(-50,-50)"
diff --git a/vfd-backend/public/images/instruments/basic.svg b/vfd-backend/public/images/instruments/basic.svg
deleted file mode 100644
index ac04b60..0000000
--- a/vfd-backend/public/images/instruments/basic.svg
+++ /dev/null
@@ -1,314 +0,0 @@
-<?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="100"
- height="100"
- id="svg4387"
- version="1.1"
- inkscape:version="0.48.5 r10040"
- viewBox="-50 -50 100 100"
- sodipodi:docname="basic.svg">
- <defs
- id="defs4389">
- <inkscape:perspective
- sodipodi:type="inkscape:persp3d"
- inkscape:vp_x="0 : 50 : 1"
- inkscape:vp_y="0 : 1000 : 0"
- inkscape:vp_z="100 : 50 : 1"
- inkscape:persp3d-origin="50 : 33.333333 : 1"
- id="perspective5114" />
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="5.6568542"
- inkscape:cx="65.204933"
- inkscape:cy="31.918663"
- inkscape:document-units="px"
- inkscape:current-layer="svg4387"
- showgrid="true"
- showguides="false"
- inkscape:snap-bbox="true"
- inkscape:window-width="1920"
- inkscape:window-height="1029"
- inkscape:window-x="0"
- inkscape:window-y="27"
- inkscape:window-maximized="1"
- inkscape:snap-grids="false">
- <inkscape:grid
- type="xygrid"
- id="grid4395"
- units="px"
- empspacing="5"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true"
- spacingx="1px"
- spacingy="1px" />
- </sodipodi:namedview>
- <metadata
- id="metadata4392">
- <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 />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- id="lower">
- <path
- inkscape:transform-center-y="44.418149"
- inkscape:transform-center-x="11.044759"
- inkscape:connector-curvature="0"
- id="path5010"
- d="m -0.52403983,48.510133 0.0154511,-3.487667 C -7.2448512,44.942356 -13.911142,43.340039 -19.989534,40.326163 l -1.591395,3.126201 c 6.563792,3.254436 13.7823459,4.974145 21.05688917,5.057769 z"
- style="fill:#00d400;fill-opacity:1;stroke:none" />
- <path
- inkscape:transform-center-y="-24.174304"
- inkscape:transform-center-x="39.074649"
- inkscape:connector-curvature="0"
- id="path5002"
- d="m -45.973942,-15.488849 3.312195,1.092444 c 2.157808,-6.381812 5.741699,-12.226687 10.486391,-17.076243 l -2.481425,-2.479556 c -5.123476,5.236862 -8.989672,11.570695 -11.317161,18.463355 z"
- style="fill:#00d400;fill-opacity:1;stroke:none" />
- <path
- style="fill:#00d400;fill-opacity:1;stroke:none"
- d="m -47.994872,7.0710673 3.447146,-0.5303303 c -0.974661,-6.66586045 -0.434908,-13.5007347 1.590991,-19.975766 l -3.336661,-1.082757 c -2.187565,6.9920876 -2.756871,14.39079041 -1.701476,21.5888533 z"
- id="path5004"
- inkscape:connector-curvature="0"
- inkscape:transform-center-x="45.733006"
- inkscape:transform-center-y="-3.7233588" />
- <path
- inkscape:transform-center-y="17.810418"
- inkscape:transform-center-x="42.280768"
- inkscape:connector-curvature="0"
- id="path5006"
- d="m -39.553546,28.089583 2.830664,-2.037499 c -3.894666,-5.496838 -6.516711,-11.831799 -7.651224,-18.5208328 l -3.464548,0.5500689 c 1.225206,7.2231289 4.076892,14.0738809 8.285108,20.0082629 z"
- style="fill:#00d400;fill-opacity:1;stroke:none" />
- <path
- style="fill:#00d400;fill-opacity:1;stroke:none"
- d="m -22.490063,42.984936 1.597135,-3.10052 c -5.965685,-3.129577 -11.177957,-7.583685 -15.225573,-13.0286 l -2.837209,2.062987 c 4.370899,5.879623 10.021946,10.68905 16.465647,14.066133 z"
- id="path5008"
- inkscape:connector-curvature="0"
- inkscape:transform-center-x="29.924319"
- inkscape:transform-center-y="34.920377" />
- </g>
- <g
- id="upper">
- <path
- inkscape:transform-center-y="-11.026553"
- inkscape:transform-center-x="-44.430044"
- inkscape:connector-curvature="0"
- id="path4979"
- d="m 43.460756,-21.556216 -3.114549,1.5696 c 2.986821,6.038424 4.585579,12.7055669 4.65973,19.48972598 l 3.507943,-0.001321 C 48.433702,-7.8240776 46.68882,-15.036587 43.460756,-21.556216 z"
- style="fill:#ff0000;fill-opacity:1;stroke:none" />
- <path
- style="fill:#ff0000;fill-opacity:1;stroke:none"
- d="m 28.9375,-38.9375 -2.0625,2.8125 c 5.402664,4.024287 9.853987,9.238934 13,15.25 L 43,-22.46875 C 39.602688,-28.959745 34.773576,-34.593978 28.9375,-38.9375 z"
- id="path5000"
- inkscape:connector-curvature="0"
- inkscape:transform-center-x="-34.9375"
- inkscape:transform-center-y="-29.90625" />
- </g>
- <g
- id="dial">
- <path
- transform="translate(-50,-50)"
- id="path4401"
- d="M 50,0 C 22.385763,0 0,22.385763 0,50 c 0,27.614237 22.385763,50 50,50 l 0,-1.5 C 23.21419,98.5 1.5,76.78581 1.5,50 1.5,23.21419 23.21419,1.5 50,1.5 76.78581,1.5 98.5,23.21419 98.5,50 l 1.5,0 C 100,22.385763 77.614237,0 50,0 z"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- inkscape:connector-curvature="0" />
- <rect
- inkscape:transform-center-y="51.283333"
- y="41.5"
- x="-1"
- height="8.5"
- width="2"
- id="rect4409"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
- <rect
- inkscape:transform-center-x="31.996582"
- transform="matrix(-0.70710678,0.70710678,-0.70710678,-0.70710678,0,0)"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- id="rect4411"
- width="2"
- height="7.5"
- x="-1"
- y="41.5"
- inkscape:transform-center-y="-31.996582" />
- <rect
- y="41.5"
- x="-1.0000002"
- height="8.5"
- width="2"
- id="rect4413"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- transform="matrix(0,-1,1,0,0,0)"
- inkscape:transform-center-x="-51.283333" />
- <rect
- inkscape:transform-center-x="21.110558"
- transform="matrix(0.89100652,0.4539905,-0.4539905,0.89100652,0,0)"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- id="rect4961"
- width="1"
- height="5"
- x="-0.5"
- y="44"
- inkscape:transform-center-y="41.431803" />
- <rect
- inkscape:transform-center-y="27.332014"
- y="44"
- x="-0.49999985"
- height="5"
- width="1"
- id="rect4963"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- transform="matrix(0.58778525,0.809017,-0.809017,0.58778525,0,0)"
- inkscape:transform-center-x="37.61929" />
- <rect
- inkscape:transform-center-x="45.927507"
- transform="matrix(0.15643446,0.98768834,-0.98768834,0.15643446,0,0)"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- id="rect4965"
- width="1"
- height="5"
- x="-0.49999964"
- y="44"
- inkscape:transform-center-y="7.2742025" />
- <rect
- inkscape:transform-center-y="-14.36929"
- y="44"
- x="-0.49999928"
- height="5"
- width="1"
- id="rect4967"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- transform="matrix(-0.309017,0.95105651,-0.95105651,-0.309017,0,0)"
- inkscape:transform-center-x="44.224127" />
- <rect
- inkscape:transform-center-x="14.36929"
- transform="matrix(-0.95105652,0.30901699,-0.30901699,-0.95105652,0,0)"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- id="rect4969"
- width="1"
- height="5"
- x="-0.49999872"
- y="44"
- inkscape:transform-center-y="-44.224128" />
- <rect
- inkscape:transform-center-y="-45.927508"
- y="44"
- x="-0.49999878"
- height="5"
- width="1"
- id="rect4971"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- transform="matrix(-0.98768834,-0.15643447,0.15643447,-0.98768834,0,0)"
- inkscape:transform-center-x="-7.2742029" />
- <rect
- inkscape:transform-center-x="-27.332015"
- transform="matrix(-0.80901699,-0.58778526,0.58778526,-0.80901699,0,0)"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- id="rect4973"
- width="1"
- height="5"
- x="-0.49999899"
- y="44"
- inkscape:transform-center-y="-37.619291" />
- <rect
- inkscape:transform-center-y="-21.110559"
- y="44"
- x="-0.49999952"
- height="5"
- width="1"
- id="rect4975"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- transform="matrix(-0.45399049,-0.89100653,0.89100653,-0.45399049,0,0)"
- inkscape:transform-center-x="-41.431805" />
- </g>
- <g
- id="labels">
- <text
- xml:space="preserve"
- style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
- x="40.52644"
- y="3.5468256"
- id="text5100"
- sodipodi:linespacing="125%"><tspan
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Sans;-inkscape-font-specification:Sans"
- sodipodi:role="line"
- id="max"
- x="40.52644"
- y="3.5468256">100</tspan></text>
- <text
- sodipodi:linespacing="125%"
- id="text5102"
- y="39.272289"
- x="0.0016270902"
- style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- xml:space="preserve"><tspan
- y="39.272289"
- x="0.0016270902"
- id="min"
- sodipodi:role="line">0</tspan></text>
- <text
- sodipodi:linespacing="125%"
- id="text5104"
- y="27.28607"
- x="25.962608"
- style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#1a1a1a;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- xml:space="preserve"><tspan
- y="27.28607"
- x="25.962608"
- id="value"
- sodipodi:role="line">0</tspan></text>
- <text
- sodipodi:linespacing="125%"
- id="text5106"
- y="38.902164"
- x="25.957726"
- style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
- xml:space="preserve"><tspan
- y="38.902164"
- x="25.957726"
- id="unit"
- sodipodi:role="line">%</tspan></text>
- <text
- sodipodi:linespacing="125%"
- id="text5108"
- y="-20.848358"
- x="-28.750261"
- style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
- xml:space="preserve"><tspan
- y="-20.848358"
- x="-28.750261"
- id="med"
- sodipodi:role="line"
- style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">50</tspan></text>
- </g>
- <g
- id="hand">
- <path
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- d="m 48,50 c 0,13.34999 2,42 2,42 0,0 2,-28.65001 2,-42 0,-3 -4,-3 -4,0 z"
- id="path5012"
- inkscape:connector-curvature="0"
- transform="translate(-50,-50)"
- sodipodi:nodetypes="scss" />
- </g>
-</svg>
diff --git a/vfd-backend/public/images/instruments/generic.svg b/vfd-backend/public/images/instruments/generic.svg
index 02e4caa..ac04b60 100644
--- a/vfd-backend/public/images/instruments/generic.svg
+++ b/vfd-backend/public/images/instruments/generic.svg
@@ -9,43 +9,47 @@
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="110"
- height="110"
- id="svg2987"
+ width="100"
+ height="100"
+ id="svg4387"
version="1.1"
inkscape:version="0.48.5 r10040"
- sodipodi:docname="generic.svg"
- viewBox="-55 -55 110 110">
+ viewBox="-50 -50 100 100"
+ sodipodi:docname="basic.svg">
<defs
- id="defs2989" />
+ id="defs4389">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 50 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="100 : 50 : 1"
+ inkscape:persp3d-origin="50 : 33.333333 : 1"
+ id="perspective5114" />
+ </defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
- bordercolor="#ffffff"
- borderopacity="0.0"
+ bordercolor="#666666"
+ borderopacity="1.0"
inkscape:pageopacity="0.0"
- inkscape:pageshadow="0"
- inkscape:zoom="2"
- inkscape:cx="-32.598708"
- inkscape:cy="85.113475"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="65.204933"
+ inkscape:cy="31.918663"
inkscape:document-units="px"
- inkscape:current-layer="layer1"
+ inkscape:current-layer="svg4387"
showgrid="true"
+ showguides="false"
+ inkscape:snap-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1029"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
- inkscape:snap-grids="true"
- inkscape:snap-object-midpoints="true"
- showguides="true"
- inkscape:guide-bbox="true"
- inkscape:snap-global="true"
- inkscape:snap-nodes="false"
- inkscape:snap-bbox="true">
+ inkscape:snap-grids="false">
<inkscape:grid
type="xygrid"
- id="grid2997"
+ id="grid4395"
units="px"
empspacing="5"
visible="true"
@@ -55,7 +59,7 @@
spacingy="1px" />
</sodipodi:namedview>
<metadata
- id="metadata2992">
+ id="metadata4392">
<rdf:RDF>
<cc:Work
rdf:about="">
@@ -67,997 +71,244 @@
</rdf:RDF>
</metadata>
<g
- inkscape:label="Layer 1"
- inkscape:groupmode="layer"
- id="layer1">
+ id="lower">
<path
- transform="matrix(0.14473684,0,0,0.14473684,-95.526315,-85.73663)"
- d="m 1040,592.36218 a 380,380 0 1 1 -760,0 380,380 0 1 1 760,0 z"
- sodipodi:ry="380"
- sodipodi:rx="380"
- sodipodi:cy="592.36218"
- sodipodi:cx="660"
- id="path2999"
- style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- sodipodi:type="arc" />
+ inkscape:transform-center-y="44.418149"
+ inkscape:transform-center-x="11.044759"
+ inkscape:connector-curvature="0"
+ id="path5010"
+ d="m -0.52403983,48.510133 0.0154511,-3.487667 C -7.2448512,44.942356 -13.911142,43.340039 -19.989534,40.326163 l -1.591395,3.126201 c 6.563792,3.254436 13.7823459,4.974145 21.05688917,5.057769 z"
+ style="fill:#00d400;fill-opacity:1;stroke:none" />
<path
- transform="matrix(0.13157895,0,0,0.13157895,-86.842106,-77.942392)"
- d="m 1040,592.36218 a 380,380 0 1 1 -760,0 380,380 0 1 1 760,0 z"
- sodipodi:ry="380"
- sodipodi:rx="380"
- sodipodi:cy="592.36218"
- sodipodi:cx="660"
- id="path3016"
- style="fill:#333333;fill-opacity:1;stroke:none"
- sodipodi:type="arc" />
+ inkscape:transform-center-y="-24.174304"
+ inkscape:transform-center-x="39.074649"
+ inkscape:connector-curvature="0"
+ id="path5002"
+ d="m -45.973942,-15.488849 3.312195,1.092444 c 2.157808,-6.381812 5.741699,-12.226687 10.486391,-17.076243 l -2.481425,-2.479556 c -5.123476,5.236862 -8.989672,11.570695 -11.317161,18.463355 z"
+ style="fill:#00d400;fill-opacity:1;stroke:none" />
<path
- inkscape:transform-center-y="-42.359375"
- inkscape:transform-center-x="-14.765616"
+ style="fill:#00d400;fill-opacity:1;stroke:none"
+ d="m -47.994872,7.0710673 3.447146,-0.5303303 c -0.974661,-6.66586045 -0.434908,-13.5007347 1.590991,-19.975766 l -3.336661,-1.082757 c -2.187565,6.9920876 -2.756871,14.39079041 -1.701476,21.5888533 z"
+ id="path5004"
inkscape:connector-curvature="0"
- id="path3372"
- d="m -8.4662647e-7,-50 7.8029586e-7,7.062499 C 9.4425578,-42.937502 18.162476,-39.882027 25.249998,-34.718749 l 4.156251,-5.718747 C 21.15285,-46.450357 10.993025,-49.999997 -1.6970551e-5,-49.999953 z"
- style="fill:#000080;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.10000000000000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ inkscape:transform-center-x="45.733006"
+ inkscape:transform-center-y="-3.7233588" />
<path
- style="fill:#d40000;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m -29.502325,40.414115 4.151232,-5.713683 c -7.63919,-5.550196 -12.89779,-13.147566 -15.596816,-21.490688 l -6.723873,2.183583 c 3.142869,9.715733 9.275914,18.559246 18.169498,25.020758 z"
- id="path3347"
+ inkscape:transform-center-y="17.810418"
+ inkscape:transform-center-x="42.280768"
inkscape:connector-curvature="0"
- inkscape:transform-center-x="36.448938"
- inkscape:transform-center-y="26.811929" />
+ id="path5006"
+ d="m -39.553546,28.089583 2.830664,-2.037499 c -3.894666,-5.496838 -6.516711,-11.831799 -7.651224,-18.5208328 l -3.464548,0.5500689 c 1.225206,7.2231289 4.076892,14.0738809 8.285108,20.0082629 z"
+ style="fill:#00d400;fill-opacity:1;stroke:none" />
<path
- transform="matrix(0.09210526,0,0,0.09210526,-60.789473,-54.559673)"
- d="m 1040,592.36218 a 380,380 0 1 1 -760,0 380,380 0 1 1 760,0 z"
- sodipodi:ry="380"
- sodipodi:rx="380"
- sodipodi:cy="592.36218"
- sodipodi:cx="660"
- id="path3018"
- style="fill:#4d4d4d;fill-opacity:1;stroke:none"
- sodipodi:type="arc" />
+ style="fill:#00d400;fill-opacity:1;stroke:none"
+ d="m -22.490063,42.984936 1.597135,-3.10052 c -5.965685,-3.129577 -11.177957,-7.583685 -15.225573,-13.0286 l -2.837209,2.062987 c 4.370899,5.879623 10.021946,10.68905 16.465647,14.066133 z"
+ id="path5008"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="29.924319"
+ inkscape:transform-center-y="34.920377" />
+ </g>
+ <g
+ id="upper">
+ <path
+ inkscape:transform-center-y="-11.026553"
+ inkscape:transform-center-x="-44.430044"
+ inkscape:connector-curvature="0"
+ id="path4979"
+ d="m 43.460756,-21.556216 -3.114549,1.5696 c 2.986821,6.038424 4.585579,12.7055669 4.65973,19.48972598 l 3.507943,-0.001321 C 48.433702,-7.8240776 46.68882,-15.036587 43.460756,-21.556216 z"
+ style="fill:#ff0000;fill-opacity:1;stroke:none" />
<path
+ style="fill:#ff0000;fill-opacity:1;stroke:none"
+ d="m 28.9375,-38.9375 -2.0625,2.8125 c 5.402664,4.024287 9.853987,9.238934 13,15.25 L 43,-22.46875 C 39.602688,-28.959745 34.773576,-34.593978 28.9375,-38.9375 z"
+ id="path5000"
inkscape:connector-curvature="0"
+ inkscape:transform-center-x="-34.9375"
+ inkscape:transform-center-y="-29.90625" />
+ </g>
+ <g
+ id="dial">
+ <path
+ transform="translate(-50,-50)"
+ id="path4401"
+ d="M 50,0 C 22.385763,0 0,22.385763 0,50 c 0,27.614237 22.385763,50 50,50 l 0,-1.5 C 23.21419,98.5 1.5,76.78581 1.5,50 1.5,23.21419 23.21419,1.5 50,1.5 76.78581,1.5 98.5,23.21419 98.5,50 l 1.5,0 C 100,22.385763 77.614237,0 50,0 z"
style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- d="m 0,-55 c -30.375661,0 -55,24.624339 -55,55 0,30.375661 24.624339,55 55,55 C 30.375661,55 55,30.375661 55,0 55,-30.375661 30.375661,-55 0,-55 z m 0,5 c 27.614238,0 50,22.385762 50,50 0,27.614238 -22.385762,50 -50,50 -27.614238,0 -50,-22.385762 -50,-50 0,-27.614238 22.385762,-50 50,-50 z"
- id="path3741" />
- <rect
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3190"
- width="0.5"
- height="7"
- x="-0.25"
- y="-50"
- inkscape:transform-center-y="-46.5" />
- <rect
- inkscape:transform-center-y="-37.61929"
- y="-50"
- x="-0.25"
- height="7"
- width="0.5"
- id="rect3192"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.80901699,-0.58778525,0.58778525,0.80901699,0,0)"
- inkscape:transform-center-x="27.332014" />
- <rect
- inkscape:transform-center-x="44.224128"
- transform="matrix(0.30901699,-0.95105652,0.95105652,0.30901699,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3194"
- width="0.5"
- height="7"
- x="-0.24999993"
- y="-50"
- inkscape:transform-center-y="-14.36929" />
- <rect
- inkscape:transform-center-y="14.36929"
- y="-50"
- x="-0.24999984"
- height="7"
- width="0.5"
- id="rect3196"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.309017,-0.95105651,0.95105651,-0.309017,0,0)"
- inkscape:transform-center-x="44.224128" />
- <rect
- inkscape:transform-center-x="27.332015"
- transform="matrix(-0.809017,-0.58778525,0.58778525,-0.809017,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3198"
- width="0.5"
- height="7"
- x="-0.24999982"
- y="-50"
- inkscape:transform-center-y="37.61929" />
+ inkscape:connector-curvature="0" />
+ <rect
+ inkscape:transform-center-y="51.283333"
+ y="41.5"
+ x="-1"
+ height="8.5"
+ width="2"
+ id="rect4409"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none" />
+ <rect
+ inkscape:transform-center-x="31.996582"
+ transform="matrix(-0.70710678,0.70710678,-0.70710678,-0.70710678,0,0)"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ id="rect4411"
+ width="2"
+ height="7.5"
+ x="-1"
+ y="41.5"
+ inkscape:transform-center-y="-31.996582" />
+ <rect
+ y="41.5"
+ x="-1.0000002"
+ height="8.5"
+ width="2"
+ id="rect4413"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:transform-center-x="-51.283333" />
<rect
- transform="matrix(-0.80901699,0.58778525,-0.58778525,-0.80901699,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3202"
- width="0.5"
- height="7"
- x="-0.24999978"
- y="-50"
- inkscape:transform-center-y="37.61929"
- inkscape:transform-center-x="-27.332014" />
+ inkscape:transform-center-x="21.110558"
+ transform="matrix(0.89100652,0.4539905,-0.4539905,0.89100652,0,0)"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ id="rect4961"
+ width="1"
+ height="5"
+ x="-0.5"
+ y="44"
+ inkscape:transform-center-y="41.431803" />
+ <rect
+ inkscape:transform-center-y="27.332014"
+ y="44"
+ x="-0.49999985"
+ height="5"
+ width="1"
+ id="rect4963"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ transform="matrix(0.58778525,0.809017,-0.809017,0.58778525,0,0)"
+ inkscape:transform-center-x="37.61929" />
<rect
- inkscape:transform-center-x="-44.224128"
- inkscape:transform-center-y="14.36929"
- y="-50"
- x="-0.24999975"
- height="7"
- width="0.5"
- id="rect3204"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.30901699,0.95105652,-0.95105652,-0.30901699,0,0)" />
+ inkscape:transform-center-x="45.927507"
+ transform="matrix(0.15643446,0.98768834,-0.98768834,0.15643446,0,0)"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ id="rect4965"
+ width="1"
+ height="5"
+ x="-0.49999964"
+ y="44"
+ inkscape:transform-center-y="7.2742025" />
<rect
- transform="matrix(0.309017,0.95105651,-0.95105651,0.309017,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3206"
- width="0.5"
- height="7"
- x="-0.24999969"
- y="-50"
inkscape:transform-center-y="-14.36929"
- inkscape:transform-center-x="-44.224128" />
- <rect
- inkscape:transform-center-x="-27.332015"
- inkscape:transform-center-y="-37.61929"
- y="-50"
- x="-0.2499997"
- height="7"
- width="0.5"
- id="rect3208"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.809017,0.58778525,-0.58778525,0.809017,0,0)" />
- <rect
- inkscape:transform-center-y="-47.905283"
- y="-50"
- x="-0.25"
- height="4"
- width="0.5"
- id="rect3243"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.99802673,-0.06279052,0.06279052,0.99802673,0,0)"
- inkscape:transform-center-x="3.013945" />
- <rect
- inkscape:transform-center-x="6.0159953"
- transform="matrix(0.9921147,-0.12533323,0.12533323,0.9921147,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3245"
- width="0.5"
- height="4"
- x="-0.25"
- y="-50"
- inkscape:transform-center-y="-47.621506" />
- <rect
- inkscape:transform-center-y="-47.149788"
- y="-50"
- x="-0.25000003"
- height="4"
- width="0.5"
- id="rect3247"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.98228725,-0.18738131,0.18738131,0.98228725,0,0)"
- inkscape:transform-center-x="8.9943032" />
- <rect
- inkscape:transform-center-x="11.937115"
- transform="matrix(0.96858316,-0.24868988,0.24868988,0.96858316,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3249"
- width="0.5"
- height="4"
- x="-0.25000003"
- y="-50"
- inkscape:transform-center-y="-46.491992" />
- <rect
- inkscape:transform-center-y="-45.650713"
- y="-50"
- x="-0.25000006"
- height="4"
- width="0.5"
- id="rect3251"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.95105652,-0.30901699,0.30901699,0.95105652,0,0)"
- inkscape:transform-center-x="14.832816" />
- <rect
- inkscape:transform-center-x="17.669979"
- transform="matrix(0.92977649,-0.36812455,0.36812455,0.92977649,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3253"
- width="0.5"
- height="4"
- x="-0.25000006"
- y="-50"
- inkscape:transform-center-y="-44.629272" />
- <rect
- inkscape:transform-center-y="-43.431699"
- y="-50"
- x="-0.25000009"
- height="4"
- width="0.5"
- id="rect3255"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.90482705,-0.42577929,0.42577929,0.90482705,0,0)"
- inkscape:transform-center-x="20.437407" />
- <rect
- inkscape:transform-center-x="23.124177"
- transform="matrix(0.87630668,-0.48175367,0.48175367,0.87630668,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3257"
- width="0.5"
- height="4"
- x="-0.25000015"
- y="-50"
- inkscape:transform-center-y="-42.062721" />
- <rect
- inkscape:transform-center-y="-40.527741"
- y="-50"
- x="-0.25000021"
- height="4"
- width="0.5"
- id="rect3259"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.84432793,-0.53582679,0.53582679,0.84432793,0,0)"
- inkscape:transform-center-x="25.719687" />
- <rect
- inkscape:transform-center-x="30.596353"
- transform="matrix(0.77051325,-0.63742399,0.63742399,0.77051325,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3261"
- width="0.5"
- height="4"
- x="-0.2500003"
- y="-50"
- inkscape:transform-center-y="-36.984636" />
- <rect
- inkscape:transform-center-y="-34.990494"
- y="-50"
- x="-0.25000036"
- height="4"
- width="0.5"
- id="rect3263"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.72896863,-0.6845471,0.6845471,0.72896863,0,0)"
- inkscape:transform-center-x="32.858262" />
- <rect
- inkscape:transform-center-x="34.990495"
- transform="matrix(0.68454711,-0.72896862,0.72896862,0.68454711,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3265"
- width="0.5"
- height="4"
- x="-0.25000039"
- y="-50"
- inkscape:transform-center-y="-32.858261" />
- <rect
- inkscape:transform-center-y="-30.596352"
- y="-50"
- x="-0.25000045"
- height="4"
- width="0.5"
- id="rect3267"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.637424,-0.77051324,0.77051324,0.637424,0,0)"
- inkscape:transform-center-x="36.984637" />
- <rect
- inkscape:transform-center-x="38.832817"
- transform="matrix(0.58778526,-0.80901699,0.80901699,0.58778526,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3269"
- width="0.5"
- height="4"
- x="-0.25000051"
- y="-50"
- inkscape:transform-center-y="-28.213692" />
- <rect
- inkscape:transform-center-y="-25.719686"
- y="-50"
- x="-0.25000057"
- height="4"
- width="0.5"
- id="rect3271"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.5358268,-0.84432792,0.84432792,0.5358268,0,0)"
- inkscape:transform-center-x="40.527742" />
- <rect
- inkscape:transform-center-x="42.062722"
- transform="matrix(0.48175368,-0.87630668,0.87630668,0.48175368,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3273"
- width="0.5"
- height="4"
- x="-0.25000066"
- y="-50"
- inkscape:transform-center-y="-23.124176" />
- <rect
- inkscape:transform-center-y="-20.437406"
- y="-50"
- x="-0.25000072"
- height="4"
- width="0.5"
- id="rect3275"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.4257793,-0.90482705,0.90482705,0.4257793,0,0)"
- inkscape:transform-center-x="43.4317" />
- <rect
- inkscape:transform-center-x="44.629273"
- transform="matrix(0.36812456,-0.92977648,0.92977648,0.36812456,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3277"
- width="0.5"
- height="4"
- x="-0.2500008"
- y="-50"
- inkscape:transform-center-y="-17.669978" />
- <rect
- inkscape:transform-center-y="-11.937114"
- y="-50"
- x="-0.25000095"
- height="4"
- width="0.5"
- id="rect3279"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.24868989,-0.96858316,0.96858316,0.24868989,0,0)"
- inkscape:transform-center-x="46.491993" />
- <rect
- inkscape:transform-center-x="47.149789"
- transform="matrix(0.18738132,-0.98228725,0.98228725,0.18738132,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3281"
- width="0.5"
- height="4"
- x="-0.25000101"
- y="-50"
- inkscape:transform-center-y="-8.9943026" />
- <rect
- inkscape:transform-center-y="-6.0159947"
- y="-50"
- x="-0.25000107"
- height="4"
- width="0.5"
- id="rect3283"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.12533324,-0.9921147,0.9921147,0.12533324,0,0)"
- inkscape:transform-center-x="47.621507" />
- <rect
- inkscape:transform-center-x="47.905284"
- transform="matrix(0.06279053,-0.99802673,0.99802673,0.06279053,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3285"
- width="0.5"
- height="4"
- x="-0.25000116"
- y="-50"
- inkscape:transform-center-y="-3.0139445" />
- <rect
- y="-50"
- x="-0.25000122"
- height="4"
- width="0.5"
- id="rect3287"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(1.0351335e-8,-1,1,1.0351335e-8,0,0)"
- inkscape:transform-center-x="48.000001" />
- <rect
- inkscape:transform-center-x="47.905284"
- transform="matrix(-0.06279051,-0.99802673,0.99802673,-0.06279051,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3289"
- width="0.5"
- height="4"
- x="-0.25000128"
- y="-50"
- inkscape:transform-center-y="3.013945" />
- <rect
- inkscape:transform-center-y="6.0159951"
- y="-50"
- x="-0.25000134"
- height="4"
- width="0.5"
- id="rect3291"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.12533322,-0.9921147,0.9921147,-0.12533322,0,0)"
- inkscape:transform-center-x="47.621506" />
- <rect
- inkscape:transform-center-x="47.149788"
- transform="matrix(-0.1873813,-0.98228725,0.98228725,-0.1873813,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3293"
- width="0.5"
- height="4"
- x="-0.25000137"
- y="-50"
- inkscape:transform-center-y="8.994303" />
- <rect
- inkscape:transform-center-y="17.669978"
- y="-50"
- x="-0.2500014"
- height="4"
- width="0.5"
- id="rect3295"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.36812454,-0.92977649,0.92977649,-0.36812454,0,0)"
- inkscape:transform-center-x="44.629271" />
- <rect
- inkscape:transform-center-x="43.431698"
- transform="matrix(-0.42577928,-0.90482706,0.90482706,-0.42577928,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3297"
- width="0.5"
- height="4"
- x="-0.25000137"
- y="-50"
- inkscape:transform-center-y="20.437405" />
- <rect
- inkscape:transform-center-y="23.124175"
- y="-50"
- x="-0.25000131"
- height="4"
- width="0.5"
- id="rect3299"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.48175366,-0.87630669,0.87630669,-0.48175366,0,0)"
- inkscape:transform-center-x="42.06272" />
- <rect
- inkscape:transform-center-x="40.527739"
- transform="matrix(-0.53582678,-0.84432793,0.84432793,-0.53582678,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3301"
- width="0.5"
- height="4"
- x="-0.25000122"
- y="-50"
- inkscape:transform-center-y="25.719685" />
- <rect
- inkscape:transform-center-y="28.213691"
- y="-50"
- x="-0.25000113"
- height="4"
- width="0.5"
- id="rect3303"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.58778524,-0.809017,0.809017,-0.58778524,0,0)"
- inkscape:transform-center-x="38.832814" />
- <rect
- inkscape:transform-center-x="36.984634"
- transform="matrix(-0.63742398,-0.77051325,0.77051325,-0.63742398,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3305"
- width="0.5"
- height="4"
- x="-0.25000101"
- y="-50"
- inkscape:transform-center-y="30.59635" />
- <rect
- inkscape:transform-center-y="32.85826"
- y="-50"
- x="-0.25000086"
- height="4"
- width="0.5"
- id="rect3307"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.6845471,-0.72896864,0.72896864,-0.6845471,0,0)"
- inkscape:transform-center-x="34.990493" />
- <rect
- inkscape:transform-center-x="32.85826"
- transform="matrix(-0.72896862,-0.68454712,0.68454712,-0.72896862,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3309"
- width="0.5"
- height="4"
- x="-0.25000075"
- y="-50"
- inkscape:transform-center-y="34.990493" />
- <rect
- inkscape:transform-center-y="36.984634"
- y="-50"
- x="-0.25000063"
- height="4"
- width="0.5"
- id="rect3311"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.77051323,-0.637424,0.637424,-0.77051323,0,0)"
- inkscape:transform-center-x="30.59635" />
- <rect
- inkscape:transform-center-x="-30.596352"
- transform="matrix(-0.77051326,0.63742397,-0.63742397,-0.77051326,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3349"
- width="0.5"
- height="4"
- x="-0.24999872"
- y="-50"
- inkscape:transform-center-y="36.984635" />
- <rect
- inkscape:transform-center-y="34.990494"
- y="-50"
- x="-0.24999872"
- height="4"
- width="0.5"
- id="rect3351"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.72896865,0.68454709,-0.68454709,-0.72896865,0,0)"
- inkscape:transform-center-x="-32.858262" />
- <rect
- inkscape:transform-center-x="-34.990495"
- transform="matrix(-0.68454713,0.72896861,-0.72896861,-0.68454713,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3353"
- width="0.5"
- height="4"
- x="-0.24999875"
- y="-50"
- inkscape:transform-center-y="32.858261" />
- <rect
- inkscape:transform-center-y="30.596351"
- y="-50"
- x="-0.24999878"
- height="4"
- width="0.5"
- id="rect3355"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.63742401,0.77051322,-0.77051322,-0.63742401,0,0)"
- inkscape:transform-center-x="-36.984636" />
- <rect
- inkscape:transform-center-x="-38.832817"
- transform="matrix(-0.58778528,0.80901698,-0.80901698,-0.58778528,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3357"
- width="0.5"
- height="4"
- x="-0.24999879"
- y="-50"
- inkscape:transform-center-y="28.213692" />
- <rect
- inkscape:transform-center-y="25.719686"
- y="-50"
- x="-0.24999885"
- height="4"
- width="0.5"
- id="rect3359"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.53582682,0.84432791,-0.84432791,-0.53582682,0,0)"
- inkscape:transform-center-x="-40.527742" />
- <rect
- inkscape:transform-center-x="-42.062723"
- transform="matrix(-0.4817537,0.87630667,-0.87630667,-0.4817537,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3361"
- width="0.5"
- height="4"
- x="-0.24999894"
- y="-50"
- inkscape:transform-center-y="23.124176" />
- <rect
- inkscape:transform-center-y="20.437406"
- y="-50"
- x="-0.24999906"
- height="4"
- width="0.5"
- id="rect3363"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.42577932,0.90482704,-0.90482704,-0.42577932,0,0)"
- inkscape:transform-center-x="-43.431701" />
- <rect
- inkscape:transform-center-x="-44.629274"
- transform="matrix(-0.36812458,0.92977647,-0.92977647,-0.36812458,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3365"
- width="0.5"
- height="4"
- x="-0.24999921"
- y="-50"
- inkscape:transform-center-y="17.669978" />
- <rect
- inkscape:transform-center-y="11.937114"
- y="-50"
- x="-0.24999955"
- height="4"
- width="0.5"
- id="rect3367"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.24868991,0.96858315,-0.96858315,-0.24868991,0,0)"
- inkscape:transform-center-x="-46.491995" />
- <rect
- inkscape:transform-center-x="-47.149792"
- transform="matrix(-0.18738134,0.98228725,-0.98228725,-0.18738134,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3369"
- width="0.5"
- height="4"
- x="-0.24999976"
- y="-50"
- inkscape:transform-center-y="8.9943024" />
- <rect
- inkscape:transform-center-y="6.0159943"
- y="-50"
- x="-0.24999999"
- height="4"
- width="0.5"
- id="rect3371"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.12533326,0.9921147,-0.9921147,-0.12533326,0,0)"
- inkscape:transform-center-x="-47.62151" />
- <rect
- inkscape:transform-center-x="-47.905287"
- transform="matrix(-0.06279055,0.99802673,-0.99802673,-0.06279055,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3373"
- width="0.5"
- height="4"
- x="-0.25000024"
- y="-50"
- inkscape:transform-center-y="3.013944" />
- <rect
- y="-50"
- x="-0.25000048"
- height="4"
- width="0.5"
- id="rect3375"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-3.031187e-8,1,-1,-3.031187e-8,0,0)"
- inkscape:transform-center-x="-48.000004" />
- <rect
- inkscape:transform-center-x="-47.905287"
- transform="matrix(0.06279049,0.99802673,-0.99802673,0.06279049,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3377"
- width="0.5"
- height="4"
- x="-0.25000072"
- y="-50"
- inkscape:transform-center-y="-3.0139452" />
- <rect
- inkscape:transform-center-y="-6.0159955"
- y="-50"
- x="-0.25000098"
- height="4"
- width="0.5"
- id="rect3379"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.1253332,0.99211471,-0.99211471,0.1253332,0,0)"
- inkscape:transform-center-x="-47.62151" />
- <rect
- inkscape:transform-center-x="-47.149792"
- transform="matrix(0.18738128,0.98228726,-0.98228726,0.18738128,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3381"
- width="0.5"
- height="4"
- x="-0.25000125"
- y="-50"
- inkscape:transform-center-y="-8.9943036" />
- <rect
- inkscape:transform-center-y="-11.937115"
- y="-50"
- x="-0.25000149"
- height="4"
- width="0.5"
- id="rect3383"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.24868985,0.96858317,-0.96858317,0.24868985,0,0)"
- inkscape:transform-center-x="-46.491996" />
- <rect
- inkscape:transform-center-x="-44.629275"
- transform="matrix(0.36812452,0.9297765,-0.9297765,0.36812452,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3385"
- width="0.5"
- height="4"
- x="-0.25000203"
- y="-50"
- inkscape:transform-center-y="-17.66998" />
- <rect
- inkscape:transform-center-y="-20.437408"
- y="-50"
- x="-0.25000226"
- height="4"
- width="0.5"
- id="rect3387"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.42577926,0.90482707,-0.90482707,0.42577926,0,0)"
- inkscape:transform-center-x="-43.431702" />
- <rect
- inkscape:transform-center-x="-42.062724"
- transform="matrix(0.48175364,0.8763067,-0.8763067,0.48175364,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3389"
- width="0.5"
- height="4"
- x="-0.2500025"
- y="-50"
- inkscape:transform-center-y="-23.124178" />
- <rect
- inkscape:transform-center-y="-25.719688"
- y="-50"
- x="-0.25000274"
- height="4"
- width="0.5"
- id="rect3391"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.53582676,0.84432795,-0.84432795,0.53582676,0,0)"
- inkscape:transform-center-x="-40.527744" />
- <rect
- inkscape:transform-center-x="-38.832819"
- transform="matrix(0.58778522,0.80901702,-0.80901702,0.58778522,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3393"
- width="0.5"
- height="4"
- x="-0.25000298"
- y="-50"
- inkscape:transform-center-y="-28.213694" />
- <rect
- inkscape:transform-center-y="-30.596354"
- y="-50"
- x="-0.25000322"
- height="4"
- width="0.5"
- id="rect3395"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.63742396,0.77051327,-0.77051327,0.63742396,0,0)"
- inkscape:transform-center-x="-36.984639" />
- <rect
- inkscape:transform-center-x="-34.990497"
- transform="matrix(0.68454708,0.72896865,-0.72896865,0.68454708,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3397"
- width="0.5"
- height="4"
- x="-0.25000346"
- y="-50"
- inkscape:transform-center-y="-32.858264" />
- <rect
- inkscape:transform-center-y="-34.990497"
- y="-50"
- x="-0.25000373"
- height="4"
- width="0.5"
- id="rect3399"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.7289686,0.68454713,-0.68454713,0.7289686,0,0)"
- inkscape:transform-center-x="-32.858264" />
- <rect
- inkscape:transform-center-x="-30.596354"
- transform="matrix(0.77051322,0.63742402,-0.63742402,0.77051322,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3401"
- width="0.5"
- height="4"
- x="-0.25000399"
- y="-50"
- inkscape:transform-center-y="-36.984639" />
- <rect
- inkscape:transform-center-y="-40.527744"
- y="-50"
- x="-0.25000447"
- height="4"
- width="0.5"
- id="rect3403"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.84432791,0.53582683,-0.53582683,0.84432791,0,0)"
- inkscape:transform-center-x="-25.719688" />
- <rect
- inkscape:transform-center-x="-23.124178"
- transform="matrix(0.87630666,0.48175371,-0.48175371,0.87630666,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3405"
- width="0.5"
- height="4"
- x="-0.25000471"
- y="-50"
- inkscape:transform-center-y="-42.062724" />
- <rect
- inkscape:transform-center-y="-43.431702"
- y="-50"
- x="-0.25000495"
- height="4"
- width="0.5"
- id="rect3407"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.90482703,0.42577933,-0.42577933,0.90482703,0,0)"
- inkscape:transform-center-x="-20.437407" />
- <rect
- inkscape:transform-center-x="-17.669979"
- transform="matrix(0.92977647,0.36812459,-0.36812459,0.92977647,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3409"
- width="0.5"
- height="4"
- x="-0.25000519"
- y="-50"
- inkscape:transform-center-y="-44.629275" />
- <rect
- inkscape:transform-center-y="-45.650716"
- y="-50"
- x="-0.25000542"
- height="4"
- width="0.5"
- id="rect3411"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.9510565,0.30901703,-0.30901703,0.9510565,0,0)"
- inkscape:transform-center-x="-14.832816" />
- <rect
- inkscape:transform-center-x="-11.937114"
- transform="matrix(0.96858315,0.24868992,-0.24868992,0.96858315,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3413"
- width="0.5"
- height="4"
- x="-0.25000563"
- y="-50"
- inkscape:transform-center-y="-46.491995" />
- <rect
- inkscape:transform-center-y="-47.149791"
- y="-50"
- x="-0.25000581"
- height="4"
- width="0.5"
- id="rect3415"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.98228724,0.18738135,-0.18738135,0.98228724,0,0)"
- inkscape:transform-center-x="-8.9943024" />
- <rect
- inkscape:transform-center-x="-6.0159943"
- transform="matrix(0.9921147,0.12533327,-0.12533327,0.9921147,0,0)"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3417"
- width="0.5"
- height="4"
- x="-0.25000599"
- y="-50"
- inkscape:transform-center-y="-47.621509" />
- <rect
- inkscape:transform-center-y="-47.905286"
- y="-50"
- x="-0.25000617"
- height="4"
- width="0.5"
- id="rect3419"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(0.99802673,0.06279056,-0.06279056,0.99802673,0,0)"
- inkscape:transform-center-x="-3.013944" />
+ y="44"
+ x="-0.49999928"
+ height="5"
+ width="1"
+ id="rect4967"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ transform="matrix(-0.309017,0.95105651,-0.95105651,-0.309017,0,0)"
+ inkscape:transform-center-x="44.224127" />
<rect
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3421"
- width="0.5"
- height="4"
- x="-0.25000635"
- y="-50"
- inkscape:transform-center-y="-48.000003" />
+ inkscape:transform-center-x="14.36929"
+ transform="matrix(-0.95105652,0.30901699,-0.30901699,-0.95105652,0,0)"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ id="rect4969"
+ width="1"
+ height="5"
+ x="-0.49999872"
+ y="44"
+ inkscape:transform-center-y="-44.224128" />
+ <rect
+ inkscape:transform-center-y="-45.927508"
+ y="44"
+ x="-0.49999878"
+ height="5"
+ width="1"
+ id="rect4971"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ transform="matrix(-0.98768834,-0.15643447,0.15643447,-0.98768834,0,0)"
+ inkscape:transform-center-x="-7.2742029" />
<rect
- inkscape:transform-center-y="11.937114"
- y="-50"
- x="-0.25000137"
- height="4"
- width="0.5"
- id="rect3423"
- style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- transform="matrix(-0.24868987,-0.96858317,0.96858317,-0.24868987,0,0)"
- inkscape:transform-center-x="46.491992" />
- <text
- xml:space="preserve"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
- x="0.026167108"
- y="-36.1035"
- id="text3733"
- sodipodi:linespacing="125%"
- inkscape:transform-center-y="-38.934307"
- inkscape:transform-center-x="0.42929375"><tspan
- sodipodi:role="line"
- id="tspan3735"
- x="0.026167108"
- y="-36.1035">4</tspan></text>
- <text
- inkscape:transform-center-y="-38.934307"
- xml:space="preserve"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
- x="22.653584"
- y="-28.502102"
- id="text3856"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan3858"
- x="22.653584"
- y="-28.502102">5</tspan></text>
- <text
- sodipodi:linespacing="125%"
- id="text3860"
- y="-8.8798885"
- x="37.149273"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
- xml:space="preserve"
- inkscape:transform-center-y="-38.934307"><tspan
- y="-8.8798885"
- x="37.149273"
- id="tspan3862"
- sodipodi:role="line">6</tspan></text>
+ inkscape:transform-center-x="-27.332015"
+ transform="matrix(-0.80901699,-0.58778526,0.58778526,-0.80901699,0,0)"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ id="rect4973"
+ width="1"
+ height="5"
+ x="-0.49999899"
+ y="44"
+ inkscape:transform-center-y="-37.619291" />
+ <rect
+ inkscape:transform-center-y="-21.110559"
+ y="44"
+ x="-0.49999952"
+ height="5"
+ width="1"
+ id="rect4975"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ transform="matrix(-0.45399049,-0.89100653,0.89100653,-0.45399049,0,0)"
+ inkscape:transform-center-x="-41.431805" />
+ </g>
+ <g
+ id="labels">
<text
- inkscape:transform-center-y="-38.934307"
xml:space="preserve"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
- x="37.149273"
- y="15.515295"
- id="text3864"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:end;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="40.52644"
+ y="3.5468256"
+ id="text5100"
sodipodi:linespacing="125%"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Sans;-inkscape-font-specification:Sans"
sodipodi:role="line"
- id="tspan3866"
- x="37.149273"
- y="15.515295">7</tspan></text>
+ id="max"
+ x="40.52644"
+ y="3.5468256">100</tspan></text>
<text
sodipodi:linespacing="125%"
- id="text3868"
- y="34.430401"
- x="23.007137"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
- xml:space="preserve"
- inkscape:transform-center-y="-38.934307"><tspan
- y="34.430401"
- x="23.007137"
- id="tspan3870"
- sodipodi:role="line">8</tspan></text>
+ id="text5102"
+ y="39.272289"
+ x="0.0016270902"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ xml:space="preserve"><tspan
+ y="39.272289"
+ x="0.0016270902"
+ id="min"
+ sodipodi:role="line">0</tspan></text>
<text
sodipodi:linespacing="125%"
- id="text3876"
- y="34.253624"
- x="-23.838688"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
- xml:space="preserve"
- inkscape:transform-center-y="-38.934307"><tspan
- y="34.253624"
- x="-23.838688"
- id="tspan3878"
+ id="text5104"
+ y="27.28607"
+ x="25.962608"
+ style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#1a1a1a;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ xml:space="preserve"><tspan
+ y="27.28607"
+ x="25.962608"
+ id="value"
sodipodi:role="line">0</tspan></text>
<text
- inkscape:transform-center-y="-38.934307"
- xml:space="preserve"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
- x="-36.920162"
- y="15.515294"
- id="text3880"
- sodipodi:linespacing="125%"><tspan
- sodipodi:role="line"
- id="tspan3882"
- x="-36.920162"
- y="15.515294">1</tspan></text>
- <text
sodipodi:linespacing="125%"
- id="text3884"
- y="-9.586997"
- x="-37.273716"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
- xml:space="preserve"
- inkscape:transform-center-y="-38.934307"><tspan
- y="-9.586997"
- x="-37.273716"
- id="tspan3886"
- sodipodi:role="line">2</tspan></text>
+ id="text5106"
+ y="38.902164"
+ x="25.957726"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ xml:space="preserve"><tspan
+ y="38.902164"
+ x="25.957726"
+ id="unit"
+ sodipodi:role="line">%</tspan></text>
<text
- inkscape:transform-center-y="-38.934307"
- xml:space="preserve"
- style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
- x="-22.247698"
- y="-29.385986"
- id="text3888"
- sodipodi:linespacing="125%"><tspan
+ sodipodi:linespacing="125%"
+ id="text5108"
+ y="-20.848358"
+ x="-28.750261"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#4d4d4d;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"><tspan
+ y="-20.848358"
+ x="-28.750261"
+ id="med"
sodipodi:role="line"
- id="tspan3890"
- x="-22.247698"
- y="-29.385986">3</tspan></text>
- <path
- style="fill:#f2f2f2;stroke:#1a1a1a;stroke-width:0.10141722;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="M -0.05195261,0.40925929 0.53642344,0.83673951 -22.150899,33.300471 l -6.995676,7.154101 4.642171,-8.864022 23.8640754,-31.60877087 z"
- id="path4682"
- inkscape:connector-curvature="0"
- inkscape:transform-center-y="19.880424"
- inkscape:transform-center-x="14.305076" />
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;text-anchor:start;font-family:Sans;-inkscape-font-specification:Sans">50</tspan></text>
+ </g>
+ <g
+ id="hand">
<path
- sodipodi:type="arc"
style="fill:#1a1a1a;fill-opacity:1;stroke:none"
- id="path3900"
- sodipodi:cx="55"
- sodipodi:cy="55.000004"
- sodipodi:rx="3.3363085"
- sodipodi:ry="3.3363085"
- d="m 58.336308,55.000004 a 3.3363085,3.3363085 0 1 1 -6.672616,0 3.3363085,3.3363085 0 1 1 6.672616,0 z"
- transform="matrix(1.0490637,0,0,1.0490637,-57.698499,-57.6985)" />
+ d="m 48,50 c 0,13.34999 2,42 2,42 0,0 2,-28.65001 2,-42 0,-3 -4,-3 -4,0 z"
+ id="path5012"
+ inkscape:connector-curvature="0"
+ transform="translate(-50,-50)"
+ sodipodi:nodetypes="scss" />
</g>
</svg>
diff --git a/vfd-backend/public/images/instruments/generic2.svg b/vfd-backend/public/images/instruments/generic2.svg
new file mode 100644
index 0000000..02e4caa
--- /dev/null
+++ b/vfd-backend/public/images/instruments/generic2.svg
@@ -0,0 +1,1063 @@
+<?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="110"
+ height="110"
+ id="svg2987"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="generic.svg"
+ viewBox="-55 -55 110 110">
+ <defs
+ id="defs2989" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#ffffff"
+ borderopacity="0.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="0"
+ inkscape:zoom="2"
+ inkscape:cx="-32.598708"
+ inkscape:cy="85.113475"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1920"
+ inkscape:window-height="1029"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:snap-grids="true"
+ inkscape:snap-object-midpoints="true"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ inkscape:snap-global="true"
+ inkscape:snap-nodes="false"
+ inkscape:snap-bbox="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid2997"
+ units="px"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ spacingx="1px"
+ spacingy="1px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata2992">
+ <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 />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ transform="matrix(0.14473684,0,0,0.14473684,-95.526315,-85.73663)"
+ d="m 1040,592.36218 a 380,380 0 1 1 -760,0 380,380 0 1 1 760,0 z"
+ sodipodi:ry="380"
+ sodipodi:rx="380"
+ sodipodi:cy="592.36218"
+ sodipodi:cx="660"
+ id="path2999"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.13157895,0,0,0.13157895,-86.842106,-77.942392)"
+ d="m 1040,592.36218 a 380,380 0 1 1 -760,0 380,380 0 1 1 760,0 z"
+ sodipodi:ry="380"
+ sodipodi:rx="380"
+ sodipodi:cy="592.36218"
+ sodipodi:cx="660"
+ id="path3016"
+ style="fill:#333333;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ inkscape:transform-center-y="-42.359375"
+ inkscape:transform-center-x="-14.765616"
+ inkscape:connector-curvature="0"
+ id="path3372"
+ d="m -8.4662647e-7,-50 7.8029586e-7,7.062499 C 9.4425578,-42.937502 18.162476,-39.882027 25.249998,-34.718749 l 4.156251,-5.718747 C 21.15285,-46.450357 10.993025,-49.999997 -1.6970551e-5,-49.999953 z"
+ style="fill:#000080;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.10000000000000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:#d40000;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m -29.502325,40.414115 4.151232,-5.713683 c -7.63919,-5.550196 -12.89779,-13.147566 -15.596816,-21.490688 l -6.723873,2.183583 c 3.142869,9.715733 9.275914,18.559246 18.169498,25.020758 z"
+ id="path3347"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-x="36.448938"
+ inkscape:transform-center-y="26.811929" />
+ <path
+ transform="matrix(0.09210526,0,0,0.09210526,-60.789473,-54.559673)"
+ d="m 1040,592.36218 a 380,380 0 1 1 -760,0 380,380 0 1 1 760,0 z"
+ sodipodi:ry="380"
+ sodipodi:rx="380"
+ sodipodi:cy="592.36218"
+ sodipodi:cx="660"
+ id="path3018"
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-curvature="0"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ d="m 0,-55 c -30.375661,0 -55,24.624339 -55,55 0,30.375661 24.624339,55 55,55 C 30.375661,55 55,30.375661 55,0 55,-30.375661 30.375661,-55 0,-55 z m 0,5 c 27.614238,0 50,22.385762 50,50 0,27.614238 -22.385762,50 -50,50 -27.614238,0 -50,-22.385762 -50,-50 0,-27.614238 22.385762,-50 50,-50 z"
+ id="path3741" />
+ <rect
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3190"
+ width="0.5"
+ height="7"
+ x="-0.25"
+ y="-50"
+ inkscape:transform-center-y="-46.5" />
+ <rect
+ inkscape:transform-center-y="-37.61929"
+ y="-50"
+ x="-0.25"
+ height="7"
+ width="0.5"
+ id="rect3192"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.80901699,-0.58778525,0.58778525,0.80901699,0,0)"
+ inkscape:transform-center-x="27.332014" />
+ <rect
+ inkscape:transform-center-x="44.224128"
+ transform="matrix(0.30901699,-0.95105652,0.95105652,0.30901699,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3194"
+ width="0.5"
+ height="7"
+ x="-0.24999993"
+ y="-50"
+ inkscape:transform-center-y="-14.36929" />
+ <rect
+ inkscape:transform-center-y="14.36929"
+ y="-50"
+ x="-0.24999984"
+ height="7"
+ width="0.5"
+ id="rect3196"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.309017,-0.95105651,0.95105651,-0.309017,0,0)"
+ inkscape:transform-center-x="44.224128" />
+ <rect
+ inkscape:transform-center-x="27.332015"
+ transform="matrix(-0.809017,-0.58778525,0.58778525,-0.809017,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3198"
+ width="0.5"
+ height="7"
+ x="-0.24999982"
+ y="-50"
+ inkscape:transform-center-y="37.61929" />
+ <rect
+ transform="matrix(-0.80901699,0.58778525,-0.58778525,-0.80901699,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3202"
+ width="0.5"
+ height="7"
+ x="-0.24999978"
+ y="-50"
+ inkscape:transform-center-y="37.61929"
+ inkscape:transform-center-x="-27.332014" />
+ <rect
+ inkscape:transform-center-x="-44.224128"
+ inkscape:transform-center-y="14.36929"
+ y="-50"
+ x="-0.24999975"
+ height="7"
+ width="0.5"
+ id="rect3204"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.30901699,0.95105652,-0.95105652,-0.30901699,0,0)" />
+ <rect
+ transform="matrix(0.309017,0.95105651,-0.95105651,0.309017,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3206"
+ width="0.5"
+ height="7"
+ x="-0.24999969"
+ y="-50"
+ inkscape:transform-center-y="-14.36929"
+ inkscape:transform-center-x="-44.224128" />
+ <rect
+ inkscape:transform-center-x="-27.332015"
+ inkscape:transform-center-y="-37.61929"
+ y="-50"
+ x="-0.2499997"
+ height="7"
+ width="0.5"
+ id="rect3208"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.809017,0.58778525,-0.58778525,0.809017,0,0)" />
+ <rect
+ inkscape:transform-center-y="-47.905283"
+ y="-50"
+ x="-0.25"
+ height="4"
+ width="0.5"
+ id="rect3243"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.99802673,-0.06279052,0.06279052,0.99802673,0,0)"
+ inkscape:transform-center-x="3.013945" />
+ <rect
+ inkscape:transform-center-x="6.0159953"
+ transform="matrix(0.9921147,-0.12533323,0.12533323,0.9921147,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3245"
+ width="0.5"
+ height="4"
+ x="-0.25"
+ y="-50"
+ inkscape:transform-center-y="-47.621506" />
+ <rect
+ inkscape:transform-center-y="-47.149788"
+ y="-50"
+ x="-0.25000003"
+ height="4"
+ width="0.5"
+ id="rect3247"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.98228725,-0.18738131,0.18738131,0.98228725,0,0)"
+ inkscape:transform-center-x="8.9943032" />
+ <rect
+ inkscape:transform-center-x="11.937115"
+ transform="matrix(0.96858316,-0.24868988,0.24868988,0.96858316,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3249"
+ width="0.5"
+ height="4"
+ x="-0.25000003"
+ y="-50"
+ inkscape:transform-center-y="-46.491992" />
+ <rect
+ inkscape:transform-center-y="-45.650713"
+ y="-50"
+ x="-0.25000006"
+ height="4"
+ width="0.5"
+ id="rect3251"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.95105652,-0.30901699,0.30901699,0.95105652,0,0)"
+ inkscape:transform-center-x="14.832816" />
+ <rect
+ inkscape:transform-center-x="17.669979"
+ transform="matrix(0.92977649,-0.36812455,0.36812455,0.92977649,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3253"
+ width="0.5"
+ height="4"
+ x="-0.25000006"
+ y="-50"
+ inkscape:transform-center-y="-44.629272" />
+ <rect
+ inkscape:transform-center-y="-43.431699"
+ y="-50"
+ x="-0.25000009"
+ height="4"
+ width="0.5"
+ id="rect3255"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.90482705,-0.42577929,0.42577929,0.90482705,0,0)"
+ inkscape:transform-center-x="20.437407" />
+ <rect
+ inkscape:transform-center-x="23.124177"
+ transform="matrix(0.87630668,-0.48175367,0.48175367,0.87630668,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3257"
+ width="0.5"
+ height="4"
+ x="-0.25000015"
+ y="-50"
+ inkscape:transform-center-y="-42.062721" />
+ <rect
+ inkscape:transform-center-y="-40.527741"
+ y="-50"
+ x="-0.25000021"
+ height="4"
+ width="0.5"
+ id="rect3259"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.84432793,-0.53582679,0.53582679,0.84432793,0,0)"
+ inkscape:transform-center-x="25.719687" />
+ <rect
+ inkscape:transform-center-x="30.596353"
+ transform="matrix(0.77051325,-0.63742399,0.63742399,0.77051325,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3261"
+ width="0.5"
+ height="4"
+ x="-0.2500003"
+ y="-50"
+ inkscape:transform-center-y="-36.984636" />
+ <rect
+ inkscape:transform-center-y="-34.990494"
+ y="-50"
+ x="-0.25000036"
+ height="4"
+ width="0.5"
+ id="rect3263"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.72896863,-0.6845471,0.6845471,0.72896863,0,0)"
+ inkscape:transform-center-x="32.858262" />
+ <rect
+ inkscape:transform-center-x="34.990495"
+ transform="matrix(0.68454711,-0.72896862,0.72896862,0.68454711,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3265"
+ width="0.5"
+ height="4"
+ x="-0.25000039"
+ y="-50"
+ inkscape:transform-center-y="-32.858261" />
+ <rect
+ inkscape:transform-center-y="-30.596352"
+ y="-50"
+ x="-0.25000045"
+ height="4"
+ width="0.5"
+ id="rect3267"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.637424,-0.77051324,0.77051324,0.637424,0,0)"
+ inkscape:transform-center-x="36.984637" />
+ <rect
+ inkscape:transform-center-x="38.832817"
+ transform="matrix(0.58778526,-0.80901699,0.80901699,0.58778526,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3269"
+ width="0.5"
+ height="4"
+ x="-0.25000051"
+ y="-50"
+ inkscape:transform-center-y="-28.213692" />
+ <rect
+ inkscape:transform-center-y="-25.719686"
+ y="-50"
+ x="-0.25000057"
+ height="4"
+ width="0.5"
+ id="rect3271"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.5358268,-0.84432792,0.84432792,0.5358268,0,0)"
+ inkscape:transform-center-x="40.527742" />
+ <rect
+ inkscape:transform-center-x="42.062722"
+ transform="matrix(0.48175368,-0.87630668,0.87630668,0.48175368,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3273"
+ width="0.5"
+ height="4"
+ x="-0.25000066"
+ y="-50"
+ inkscape:transform-center-y="-23.124176" />
+ <rect
+ inkscape:transform-center-y="-20.437406"
+ y="-50"
+ x="-0.25000072"
+ height="4"
+ width="0.5"
+ id="rect3275"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.4257793,-0.90482705,0.90482705,0.4257793,0,0)"
+ inkscape:transform-center-x="43.4317" />
+ <rect
+ inkscape:transform-center-x="44.629273"
+ transform="matrix(0.36812456,-0.92977648,0.92977648,0.36812456,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3277"
+ width="0.5"
+ height="4"
+ x="-0.2500008"
+ y="-50"
+ inkscape:transform-center-y="-17.669978" />
+ <rect
+ inkscape:transform-center-y="-11.937114"
+ y="-50"
+ x="-0.25000095"
+ height="4"
+ width="0.5"
+ id="rect3279"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.24868989,-0.96858316,0.96858316,0.24868989,0,0)"
+ inkscape:transform-center-x="46.491993" />
+ <rect
+ inkscape:transform-center-x="47.149789"
+ transform="matrix(0.18738132,-0.98228725,0.98228725,0.18738132,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3281"
+ width="0.5"
+ height="4"
+ x="-0.25000101"
+ y="-50"
+ inkscape:transform-center-y="-8.9943026" />
+ <rect
+ inkscape:transform-center-y="-6.0159947"
+ y="-50"
+ x="-0.25000107"
+ height="4"
+ width="0.5"
+ id="rect3283"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.12533324,-0.9921147,0.9921147,0.12533324,0,0)"
+ inkscape:transform-center-x="47.621507" />
+ <rect
+ inkscape:transform-center-x="47.905284"
+ transform="matrix(0.06279053,-0.99802673,0.99802673,0.06279053,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3285"
+ width="0.5"
+ height="4"
+ x="-0.25000116"
+ y="-50"
+ inkscape:transform-center-y="-3.0139445" />
+ <rect
+ y="-50"
+ x="-0.25000122"
+ height="4"
+ width="0.5"
+ id="rect3287"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(1.0351335e-8,-1,1,1.0351335e-8,0,0)"
+ inkscape:transform-center-x="48.000001" />
+ <rect
+ inkscape:transform-center-x="47.905284"
+ transform="matrix(-0.06279051,-0.99802673,0.99802673,-0.06279051,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3289"
+ width="0.5"
+ height="4"
+ x="-0.25000128"
+ y="-50"
+ inkscape:transform-center-y="3.013945" />
+ <rect
+ inkscape:transform-center-y="6.0159951"
+ y="-50"
+ x="-0.25000134"
+ height="4"
+ width="0.5"
+ id="rect3291"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.12533322,-0.9921147,0.9921147,-0.12533322,0,0)"
+ inkscape:transform-center-x="47.621506" />
+ <rect
+ inkscape:transform-center-x="47.149788"
+ transform="matrix(-0.1873813,-0.98228725,0.98228725,-0.1873813,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3293"
+ width="0.5"
+ height="4"
+ x="-0.25000137"
+ y="-50"
+ inkscape:transform-center-y="8.994303" />
+ <rect
+ inkscape:transform-center-y="17.669978"
+ y="-50"
+ x="-0.2500014"
+ height="4"
+ width="0.5"
+ id="rect3295"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.36812454,-0.92977649,0.92977649,-0.36812454,0,0)"
+ inkscape:transform-center-x="44.629271" />
+ <rect
+ inkscape:transform-center-x="43.431698"
+ transform="matrix(-0.42577928,-0.90482706,0.90482706,-0.42577928,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3297"
+ width="0.5"
+ height="4"
+ x="-0.25000137"
+ y="-50"
+ inkscape:transform-center-y="20.437405" />
+ <rect
+ inkscape:transform-center-y="23.124175"
+ y="-50"
+ x="-0.25000131"
+ height="4"
+ width="0.5"
+ id="rect3299"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.48175366,-0.87630669,0.87630669,-0.48175366,0,0)"
+ inkscape:transform-center-x="42.06272" />
+ <rect
+ inkscape:transform-center-x="40.527739"
+ transform="matrix(-0.53582678,-0.84432793,0.84432793,-0.53582678,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3301"
+ width="0.5"
+ height="4"
+ x="-0.25000122"
+ y="-50"
+ inkscape:transform-center-y="25.719685" />
+ <rect
+ inkscape:transform-center-y="28.213691"
+ y="-50"
+ x="-0.25000113"
+ height="4"
+ width="0.5"
+ id="rect3303"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.58778524,-0.809017,0.809017,-0.58778524,0,0)"
+ inkscape:transform-center-x="38.832814" />
+ <rect
+ inkscape:transform-center-x="36.984634"
+ transform="matrix(-0.63742398,-0.77051325,0.77051325,-0.63742398,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3305"
+ width="0.5"
+ height="4"
+ x="-0.25000101"
+ y="-50"
+ inkscape:transform-center-y="30.59635" />
+ <rect
+ inkscape:transform-center-y="32.85826"
+ y="-50"
+ x="-0.25000086"
+ height="4"
+ width="0.5"
+ id="rect3307"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.6845471,-0.72896864,0.72896864,-0.6845471,0,0)"
+ inkscape:transform-center-x="34.990493" />
+ <rect
+ inkscape:transform-center-x="32.85826"
+ transform="matrix(-0.72896862,-0.68454712,0.68454712,-0.72896862,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3309"
+ width="0.5"
+ height="4"
+ x="-0.25000075"
+ y="-50"
+ inkscape:transform-center-y="34.990493" />
+ <rect
+ inkscape:transform-center-y="36.984634"
+ y="-50"
+ x="-0.25000063"
+ height="4"
+ width="0.5"
+ id="rect3311"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.77051323,-0.637424,0.637424,-0.77051323,0,0)"
+ inkscape:transform-center-x="30.59635" />
+ <rect
+ inkscape:transform-center-x="-30.596352"
+ transform="matrix(-0.77051326,0.63742397,-0.63742397,-0.77051326,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3349"
+ width="0.5"
+ height="4"
+ x="-0.24999872"
+ y="-50"
+ inkscape:transform-center-y="36.984635" />
+ <rect
+ inkscape:transform-center-y="34.990494"
+ y="-50"
+ x="-0.24999872"
+ height="4"
+ width="0.5"
+ id="rect3351"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.72896865,0.68454709,-0.68454709,-0.72896865,0,0)"
+ inkscape:transform-center-x="-32.858262" />
+ <rect
+ inkscape:transform-center-x="-34.990495"
+ transform="matrix(-0.68454713,0.72896861,-0.72896861,-0.68454713,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3353"
+ width="0.5"
+ height="4"
+ x="-0.24999875"
+ y="-50"
+ inkscape:transform-center-y="32.858261" />
+ <rect
+ inkscape:transform-center-y="30.596351"
+ y="-50"
+ x="-0.24999878"
+ height="4"
+ width="0.5"
+ id="rect3355"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.63742401,0.77051322,-0.77051322,-0.63742401,0,0)"
+ inkscape:transform-center-x="-36.984636" />
+ <rect
+ inkscape:transform-center-x="-38.832817"
+ transform="matrix(-0.58778528,0.80901698,-0.80901698,-0.58778528,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3357"
+ width="0.5"
+ height="4"
+ x="-0.24999879"
+ y="-50"
+ inkscape:transform-center-y="28.213692" />
+ <rect
+ inkscape:transform-center-y="25.719686"
+ y="-50"
+ x="-0.24999885"
+ height="4"
+ width="0.5"
+ id="rect3359"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.53582682,0.84432791,-0.84432791,-0.53582682,0,0)"
+ inkscape:transform-center-x="-40.527742" />
+ <rect
+ inkscape:transform-center-x="-42.062723"
+ transform="matrix(-0.4817537,0.87630667,-0.87630667,-0.4817537,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3361"
+ width="0.5"
+ height="4"
+ x="-0.24999894"
+ y="-50"
+ inkscape:transform-center-y="23.124176" />
+ <rect
+ inkscape:transform-center-y="20.437406"
+ y="-50"
+ x="-0.24999906"
+ height="4"
+ width="0.5"
+ id="rect3363"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.42577932,0.90482704,-0.90482704,-0.42577932,0,0)"
+ inkscape:transform-center-x="-43.431701" />
+ <rect
+ inkscape:transform-center-x="-44.629274"
+ transform="matrix(-0.36812458,0.92977647,-0.92977647,-0.36812458,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3365"
+ width="0.5"
+ height="4"
+ x="-0.24999921"
+ y="-50"
+ inkscape:transform-center-y="17.669978" />
+ <rect
+ inkscape:transform-center-y="11.937114"
+ y="-50"
+ x="-0.24999955"
+ height="4"
+ width="0.5"
+ id="rect3367"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.24868991,0.96858315,-0.96858315,-0.24868991,0,0)"
+ inkscape:transform-center-x="-46.491995" />
+ <rect
+ inkscape:transform-center-x="-47.149792"
+ transform="matrix(-0.18738134,0.98228725,-0.98228725,-0.18738134,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3369"
+ width="0.5"
+ height="4"
+ x="-0.24999976"
+ y="-50"
+ inkscape:transform-center-y="8.9943024" />
+ <rect
+ inkscape:transform-center-y="6.0159943"
+ y="-50"
+ x="-0.24999999"
+ height="4"
+ width="0.5"
+ id="rect3371"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.12533326,0.9921147,-0.9921147,-0.12533326,0,0)"
+ inkscape:transform-center-x="-47.62151" />
+ <rect
+ inkscape:transform-center-x="-47.905287"
+ transform="matrix(-0.06279055,0.99802673,-0.99802673,-0.06279055,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3373"
+ width="0.5"
+ height="4"
+ x="-0.25000024"
+ y="-50"
+ inkscape:transform-center-y="3.013944" />
+ <rect
+ y="-50"
+ x="-0.25000048"
+ height="4"
+ width="0.5"
+ id="rect3375"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-3.031187e-8,1,-1,-3.031187e-8,0,0)"
+ inkscape:transform-center-x="-48.000004" />
+ <rect
+ inkscape:transform-center-x="-47.905287"
+ transform="matrix(0.06279049,0.99802673,-0.99802673,0.06279049,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3377"
+ width="0.5"
+ height="4"
+ x="-0.25000072"
+ y="-50"
+ inkscape:transform-center-y="-3.0139452" />
+ <rect
+ inkscape:transform-center-y="-6.0159955"
+ y="-50"
+ x="-0.25000098"
+ height="4"
+ width="0.5"
+ id="rect3379"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.1253332,0.99211471,-0.99211471,0.1253332,0,0)"
+ inkscape:transform-center-x="-47.62151" />
+ <rect
+ inkscape:transform-center-x="-47.149792"
+ transform="matrix(0.18738128,0.98228726,-0.98228726,0.18738128,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3381"
+ width="0.5"
+ height="4"
+ x="-0.25000125"
+ y="-50"
+ inkscape:transform-center-y="-8.9943036" />
+ <rect
+ inkscape:transform-center-y="-11.937115"
+ y="-50"
+ x="-0.25000149"
+ height="4"
+ width="0.5"
+ id="rect3383"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.24868985,0.96858317,-0.96858317,0.24868985,0,0)"
+ inkscape:transform-center-x="-46.491996" />
+ <rect
+ inkscape:transform-center-x="-44.629275"
+ transform="matrix(0.36812452,0.9297765,-0.9297765,0.36812452,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3385"
+ width="0.5"
+ height="4"
+ x="-0.25000203"
+ y="-50"
+ inkscape:transform-center-y="-17.66998" />
+ <rect
+ inkscape:transform-center-y="-20.437408"
+ y="-50"
+ x="-0.25000226"
+ height="4"
+ width="0.5"
+ id="rect3387"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.42577926,0.90482707,-0.90482707,0.42577926,0,0)"
+ inkscape:transform-center-x="-43.431702" />
+ <rect
+ inkscape:transform-center-x="-42.062724"
+ transform="matrix(0.48175364,0.8763067,-0.8763067,0.48175364,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3389"
+ width="0.5"
+ height="4"
+ x="-0.2500025"
+ y="-50"
+ inkscape:transform-center-y="-23.124178" />
+ <rect
+ inkscape:transform-center-y="-25.719688"
+ y="-50"
+ x="-0.25000274"
+ height="4"
+ width="0.5"
+ id="rect3391"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.53582676,0.84432795,-0.84432795,0.53582676,0,0)"
+ inkscape:transform-center-x="-40.527744" />
+ <rect
+ inkscape:transform-center-x="-38.832819"
+ transform="matrix(0.58778522,0.80901702,-0.80901702,0.58778522,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3393"
+ width="0.5"
+ height="4"
+ x="-0.25000298"
+ y="-50"
+ inkscape:transform-center-y="-28.213694" />
+ <rect
+ inkscape:transform-center-y="-30.596354"
+ y="-50"
+ x="-0.25000322"
+ height="4"
+ width="0.5"
+ id="rect3395"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.63742396,0.77051327,-0.77051327,0.63742396,0,0)"
+ inkscape:transform-center-x="-36.984639" />
+ <rect
+ inkscape:transform-center-x="-34.990497"
+ transform="matrix(0.68454708,0.72896865,-0.72896865,0.68454708,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3397"
+ width="0.5"
+ height="4"
+ x="-0.25000346"
+ y="-50"
+ inkscape:transform-center-y="-32.858264" />
+ <rect
+ inkscape:transform-center-y="-34.990497"
+ y="-50"
+ x="-0.25000373"
+ height="4"
+ width="0.5"
+ id="rect3399"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.7289686,0.68454713,-0.68454713,0.7289686,0,0)"
+ inkscape:transform-center-x="-32.858264" />
+ <rect
+ inkscape:transform-center-x="-30.596354"
+ transform="matrix(0.77051322,0.63742402,-0.63742402,0.77051322,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3401"
+ width="0.5"
+ height="4"
+ x="-0.25000399"
+ y="-50"
+ inkscape:transform-center-y="-36.984639" />
+ <rect
+ inkscape:transform-center-y="-40.527744"
+ y="-50"
+ x="-0.25000447"
+ height="4"
+ width="0.5"
+ id="rect3403"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.84432791,0.53582683,-0.53582683,0.84432791,0,0)"
+ inkscape:transform-center-x="-25.719688" />
+ <rect
+ inkscape:transform-center-x="-23.124178"
+ transform="matrix(0.87630666,0.48175371,-0.48175371,0.87630666,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3405"
+ width="0.5"
+ height="4"
+ x="-0.25000471"
+ y="-50"
+ inkscape:transform-center-y="-42.062724" />
+ <rect
+ inkscape:transform-center-y="-43.431702"
+ y="-50"
+ x="-0.25000495"
+ height="4"
+ width="0.5"
+ id="rect3407"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.90482703,0.42577933,-0.42577933,0.90482703,0,0)"
+ inkscape:transform-center-x="-20.437407" />
+ <rect
+ inkscape:transform-center-x="-17.669979"
+ transform="matrix(0.92977647,0.36812459,-0.36812459,0.92977647,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3409"
+ width="0.5"
+ height="4"
+ x="-0.25000519"
+ y="-50"
+ inkscape:transform-center-y="-44.629275" />
+ <rect
+ inkscape:transform-center-y="-45.650716"
+ y="-50"
+ x="-0.25000542"
+ height="4"
+ width="0.5"
+ id="rect3411"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.9510565,0.30901703,-0.30901703,0.9510565,0,0)"
+ inkscape:transform-center-x="-14.832816" />
+ <rect
+ inkscape:transform-center-x="-11.937114"
+ transform="matrix(0.96858315,0.24868992,-0.24868992,0.96858315,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3413"
+ width="0.5"
+ height="4"
+ x="-0.25000563"
+ y="-50"
+ inkscape:transform-center-y="-46.491995" />
+ <rect
+ inkscape:transform-center-y="-47.149791"
+ y="-50"
+ x="-0.25000581"
+ height="4"
+ width="0.5"
+ id="rect3415"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.98228724,0.18738135,-0.18738135,0.98228724,0,0)"
+ inkscape:transform-center-x="-8.9943024" />
+ <rect
+ inkscape:transform-center-x="-6.0159943"
+ transform="matrix(0.9921147,0.12533327,-0.12533327,0.9921147,0,0)"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3417"
+ width="0.5"
+ height="4"
+ x="-0.25000599"
+ y="-50"
+ inkscape:transform-center-y="-47.621509" />
+ <rect
+ inkscape:transform-center-y="-47.905286"
+ y="-50"
+ x="-0.25000617"
+ height="4"
+ width="0.5"
+ id="rect3419"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.99802673,0.06279056,-0.06279056,0.99802673,0,0)"
+ inkscape:transform-center-x="-3.013944" />
+ <rect
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3421"
+ width="0.5"
+ height="4"
+ x="-0.25000635"
+ y="-50"
+ inkscape:transform-center-y="-48.000003" />
+ <rect
+ inkscape:transform-center-y="11.937114"
+ y="-50"
+ x="-0.25000137"
+ height="4"
+ width="0.5"
+ id="rect3423"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:#e6e6e6;stroke-width:0.1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.24868987,-0.96858317,0.96858317,-0.24868987,0,0)"
+ inkscape:transform-center-x="46.491992" />
+ <text
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="0.026167108"
+ y="-36.1035"
+ id="text3733"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-y="-38.934307"
+ inkscape:transform-center-x="0.42929375"><tspan
+ sodipodi:role="line"
+ id="tspan3735"
+ x="0.026167108"
+ y="-36.1035">4</tspan></text>
+ <text
+ inkscape:transform-center-y="-38.934307"
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="22.653584"
+ y="-28.502102"
+ id="text3856"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3858"
+ x="22.653584"
+ y="-28.502102">5</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3860"
+ y="-8.8798885"
+ x="37.149273"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"
+ inkscape:transform-center-y="-38.934307"><tspan
+ y="-8.8798885"
+ x="37.149273"
+ id="tspan3862"
+ sodipodi:role="line">6</tspan></text>
+ <text
+ inkscape:transform-center-y="-38.934307"
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="37.149273"
+ y="15.515295"
+ id="text3864"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3866"
+ x="37.149273"
+ y="15.515295">7</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3868"
+ y="34.430401"
+ x="23.007137"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"
+ inkscape:transform-center-y="-38.934307"><tspan
+ y="34.430401"
+ x="23.007137"
+ id="tspan3870"
+ sodipodi:role="line">8</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3876"
+ y="34.253624"
+ x="-23.838688"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"
+ inkscape:transform-center-y="-38.934307"><tspan
+ y="34.253624"
+ x="-23.838688"
+ id="tspan3878"
+ sodipodi:role="line">0</tspan></text>
+ <text
+ inkscape:transform-center-y="-38.934307"
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="-36.920162"
+ y="15.515294"
+ id="text3880"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3882"
+ x="-36.920162"
+ y="15.515294">1</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3884"
+ y="-9.586997"
+ x="-37.273716"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ xml:space="preserve"
+ inkscape:transform-center-y="-38.934307"><tspan
+ y="-9.586997"
+ x="-37.273716"
+ id="tspan3886"
+ sodipodi:role="line">2</tspan></text>
+ <text
+ inkscape:transform-center-y="-38.934307"
+ xml:space="preserve"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#f9f9f9;fill-opacity:1;stroke:none;font-family:Arial;-inkscape-font-specification:Arial"
+ x="-22.247698"
+ y="-29.385986"
+ id="text3888"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3890"
+ x="-22.247698"
+ y="-29.385986">3</tspan></text>
+ <path
+ style="fill:#f2f2f2;stroke:#1a1a1a;stroke-width:0.10141722;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M -0.05195261,0.40925929 0.53642344,0.83673951 -22.150899,33.300471 l -6.995676,7.154101 4.642171,-8.864022 23.8640754,-31.60877087 z"
+ id="path4682"
+ inkscape:connector-curvature="0"
+ inkscape:transform-center-y="19.880424"
+ inkscape:transform-center-x="14.305076" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#1a1a1a;fill-opacity:1;stroke:none"
+ id="path3900"
+ sodipodi:cx="55"
+ sodipodi:cy="55.000004"
+ sodipodi:rx="3.3363085"
+ sodipodi:ry="3.3363085"
+ d="m 58.336308,55.000004 a 3.3363085,3.3363085 0 1 1 -6.672616,0 3.3363085,3.3363085 0 1 1 6.672616,0 z"
+ transform="matrix(1.0490637,0,0,1.0490637,-57.698499,-57.6985)" />
+ </g>
+</svg>
diff --git a/vfd-backend/public/stylesheets/main.css b/vfd-backend/public/stylesheets/main.css
index 295bc03..e92cd24 100644
--- a/vfd-backend/public/stylesheets/main.css
+++ b/vfd-backend/public/stylesheets/main.css
@@ -8,59 +8,48 @@ html {
}
body {
- min-height: 100%;
+ height: 100%;
}
body {
background-color: #e6e6e6;
}
-nav.side {
- position: absolute;
- left: 0;
- width: 15%;
- height: 100%;
- background: #FFFFCC;
- border: 1px solid #969696;
- box-sizing: border-box;
- -moz-box-sizing:border-box;
+.loader {
+ width: 100%;
+ font-size: 50px;
+ text-align: center;
}
-.control-table {
- border-collapse: collapse;
- background: #e5e5e5;
- border: 1px solid #969696;
- margin-right: 10px;
+.table-instrument {
+ table-layout: fixed;
+ width: 100%;
}
-.control-table td {
- padding: 10px;
+.table-instrument td {
+ width: 100%;
}
-.heartbeat{
+.heartbeat {
color: rgba(165, 25, 25, 1);
- animation: heartbeat 1s linear;
- opacity: 0;
+ animation: heartbeat 2s linear infinite;
}
@keyframes heartbeat {
0% {
transform: scale(1);
- opacity: 1;
}
- 25% {
+ 7% {
transform: scale(1.3);
}
- 50% {
+ 14% {
transform: scale(1);
}
- 75% {
+ 21% {
transform: scale(1.3);
- opacity: 1;
}
- 100% {
+ 28% {
transform: scale(1);
- opacity: 0;
}
}
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/util/Environment.scala b/vfd-frontend/src/main/scala/vfd/frontend/Environment.scala
index fdd908a..53571f8 100644
--- a/vfd-frontend/src/main/scala/vfd/frontend/util/Environment.scala
+++ b/vfd-frontend/src/main/scala/vfd/frontend/Environment.scala
@@ -1,4 +1,4 @@
-package vfd.frontend.util
+package vfd.frontend
import org.scalajs.dom.HTMLElement
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/Launcher.scala b/vfd-frontend/src/main/scala/vfd/frontend/Launcher.scala
index e1715d7..cf7ce94 100644
--- a/vfd-frontend/src/main/scala/vfd/frontend/Launcher.scala
+++ b/vfd-frontend/src/main/scala/vfd/frontend/Launcher.scala
@@ -4,9 +4,7 @@ import scala.scalajs.js.annotation.JSExport
import org.scalajs.dom
-import vfd.frontend.util.Environment
-
-@JSExport
+@JSExport("Launcher")
class Launcher(rootId: String, assetsBase: String) {
lazy val env = new Environment {
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/Main.scala b/vfd-frontend/src/main/scala/vfd/frontend/Main.scala
index 7b7990e..f4ef84d 100644
--- a/vfd-frontend/src/main/scala/vfd/frontend/Main.scala
+++ b/vfd-frontend/src/main/scala/vfd/frontend/Main.scala
@@ -1,74 +1,13 @@
package vfd.frontend
-import org.mavlink.messages.Message
-import rx.ops.RxOps
-import scalatags.JsDom.all.ExtendedString
-import scalatags.JsDom.all.button
-import scalatags.JsDom.all.`class`
-import scalatags.JsDom.all.div
-import scalatags.JsDom.all.height
-import scalatags.JsDom.all.iframe
-import scalatags.JsDom.all.img
-import scalatags.JsDom.all.src
-import scalatags.JsDom.all.stringAttr
-import scalatags.JsDom.all.stringFrag
-import scalatags.JsDom.all.stringStyle
-import scalatags.JsDom.all.width
-import vfd.frontend.ui.panels
-import vfd.frontend.util.Environment
-import rx.core.Obs
+import vfd.frontend.ui.Layout
object Main {
def main(args: Map[String, String])(implicit env: Environment) = {
- val socketUrl = args("socketurl")
- val remoteSystemId = args("remotesystemid").toInt
+ val socket = new MavlinkSocket(args("socketurl"), args("remotesystemid").toInt)
+ val layout = new Layout(socket)
- val socket = new MavlinkSocket(socketUrl, remoteSystemId)
-
- val message = socket.packet.map { p =>
- Message.unpack(socket.packet().messageId, socket.packet().payload)
- }
-
- Obs(message) {
- println(message().toString())
- }
-
- val element = div(`class` := "container-fluid")(
- div(`class` := "row")(
- div(`class` := "col-xs-12")(
- div(`class` := "panel panel-default")(
- div(`class` := "panel-body")(
- button(`class` := "btn")("LOCKED"),
- button(`class` := "btn")("MANUAL"),
- button(`class` := "btn")("GUIDED"),
- button(`class` := "btn")("AUTO"))))),
- div(`class` := "row")(
- div(`class` := "col-xs-4")(
- div(`class` := "panel panel-default")(
- div(`class` := "panel-body")(
- iframe(
- width := "100%",
- height := "350px",
- "frameborder".attr := "0",
- "scrolling".attr := "no",
- "marginheight".attr := "0",
- "marginwidth".attr := "0",
- src := "http://www.openstreetmap.org/export/embed.html?bbox=6.5611016750335684%2C46.51718501017836%2C6.570038795471191%2C46.520577350893525&amp;layer=mapnik")))),
- div(`class` := "col-xs-5")(
- div(`class` := "panel panel-default")(
- div(`class` := "panel-body")(
- panels.Primary(message)))),
- div(`class` := "col-xs-3")(
- div(`class` := "panel panel-default")(
- div(`class` := "panel-body")(
- panels.Communication(
- socket.stats.packets,
- socket.stats.crcErrors,
- socket.stats.overflows,
- socket.stats.wrongIds,
- message))))))
-
- env.root.appendChild(element.render)
+ env.root.appendChild(layout.element)
}
} \ No newline at end of file
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/MavlinkSocket.scala b/vfd-frontend/src/main/scala/vfd/frontend/MavlinkSocket.scala
index 6dcc5fd..903020f 100644
--- a/vfd-frontend/src/main/scala/vfd/frontend/MavlinkSocket.scala
+++ b/vfd-frontend/src/main/scala/vfd/frontend/MavlinkSocket.scala
@@ -5,19 +5,26 @@ import scala.scalajs.js.Any.fromFunction1
import org.mavlink.Packet
import org.mavlink.Parser
+import org.mavlink.messages.Message
import org.scalajs.dom
+import rx.core.Rx
import rx.core.Var
+import rx.ops.RxOps
class MavlinkSocket(url: String, remoteSystemId: Int) {
- val packet: Var[Packet] = Var(Packet.Empty)
+ lazy val packet: Var[Packet] = Var(Packet.Empty)
+ lazy val message: Rx[Message] = packet.map{p =>
+ Message.unpack(p.messageId, p.payload)
+ }
object stats {
val crcErrors = Var(0)
val overflows = Var(0)
val wrongIds = Var(0)
val packets = Var(0)
+ val open = Var(false)
}
private val parser = new Parser(
@@ -26,7 +33,8 @@ class MavlinkSocket(url: String, remoteSystemId: Int) {
case Packet(seq, `remoteSystemId`, compId, msgId, payload) =>
packet() = pckt
stats.packets() += 1
- case _ => stats.wrongIds() += 1
+ case _ =>
+ stats.wrongIds() += 1
}
},
err => {
@@ -39,16 +47,19 @@ class MavlinkSocket(url: String, remoteSystemId: Int) {
private val connection = new dom.WebSocket(url)
connection.binaryType = "arraybuffer";
+ connection.onopen = (e: dom.Event) => {
+ stats.open() = true
+ }
connection.onmessage = (e: dom.MessageEvent) => {
val buffer = e.data.asInstanceOf[js.typedarray.ArrayBuffer]
- val dv = new js.typedarray.DataView(buffer)
+ val view = new js.typedarray.DataView(buffer)
- for (i <- 0 until dv.byteLength) {
- parser.push(dv.getInt8(i))
+ for (i <- 0 until view.byteLength) {
+ parser.push(view.getInt8(i))
}
}
connection.onclose = (e: dom.CloseEvent) => {
- dom.alert("closed")
+ stats.open() = false
}
} \ No newline at end of file
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/ui/Components.scala b/vfd-frontend/src/main/scala/vfd/frontend/ui/Components.scala
deleted file mode 100644
index f911865..0000000
--- a/vfd-frontend/src/main/scala/vfd/frontend/ui/Components.scala
+++ /dev/null
@@ -1,105 +0,0 @@
-package vfd.frontend.ui
-
-import org.scalajs.dom.HTMLElement
-import rx.Obs
-import rx.Rx
-import rx.Rx
-import scalatags.JsDom.all.ExtendedString
-import scalatags.JsDom.all.bindNode
-import scalatags.JsDom.all.div
-import scalatags.JsDom.all.`object`
-import scalatags.JsDom.all.stringAttr
-import scalatags.JsDom.all.stringFrag
-import scalatags.JsDom.all.stringStyle
-import scalatags.JsDom.all.style
-import scalatags.JsDom.all.`type`
-import scalatags.JsDom.all.width
-import vfd.frontend.util.Environment
-
-object Components {
-
- private def instrument(name: String)(implicit app: Environment) = {
- val path = app.asset("images/instruments/" + name + ".svg")
- `object`(`type` := "image/svg+xml", "data".attr := path, width := "100%")(
- "Error loading image " + name).render
- }
-
- private def frame(elem: HTMLElement, size: String) = {
- div(style := s"width: $size; height: $size; display: inline-block;")(
- elem)
- }
-
- def led(color: Rx[String], size: String)(implicit app: Environment) = {
- val elem = `object`(`type` := "image/svg+xml", "data".attr := app.asset("leds/led.svg"), width := size)(
- "Error loading image.").render
-
- Obs(color, skipInitial = true) {
- val svg = elem.contentDocument
- svg.getElementById("light").setAttribute("fill", color())
- }
- elem
- }
-
- def horizon(pitchRoll: Rx[(Double, Double)], size: String)(implicit app: Environment) = {
- val inst = instrument("horizon")
- Obs(pitchRoll, skipInitial = true) {
- val svg = inst.contentDocument
- val pitch = svg.getElementById("pitch")
- val roll = svg.getElementById("roll")
- pitch.style.transition = "transform 250ms ease-out"
- roll.style.transition = "transform 250ms ease-out"
- pitch.style.transform = "translate(0px, " + pitchRoll()._1 + "px)"
- roll.style.transform = "rotate(" + pitchRoll()._2 + "deg)"
- }
- frame(inst, size)
- }
-
- def altimeter(value: Rx[Double], size: String)(implicit app: Environment) = {
- val inst = instrument("altimeter")
- Obs(value, skipInitial = true) {
- val svg = inst.contentDocument
- // 36deg === 1m
- svg.getElementById("hand").setAttribute("transform", "rotate(" + value() * 36 + ")");
- }
- frame(inst, size)
- }
-
- def compass(value: Rx[Double], size: String)(implicit app: Environment) = {
- val inst = instrument("compass")
- Obs(value, skipInitial = true) {
- val svg = inst.contentDocument
- val heading = svg.getElementById("heading")
- heading.style.transition = "transform 250ms ease-out"
- heading.style.transform = "rotate(" + value() + "deg)"
- }
- frame(inst, size)
- }
-
- def basic(value: Rx[Double], size: String)(implicit app: Environment) = {
- val inst = instrument("basic")
- Obs(value, skipInitial = true) {
- val svg = inst.contentDocument
- val hand = svg.getElementById("hand")
- hand.style.transform = "rotate(" + value() * 270 / 100 + "deg)";
- hand.style.transition = "transform 250ms ease-out"
- svg.getElementById("unit").textContent = "%"
- svg.getElementById("value").textContent = value().toString
- }
- frame(inst, size)
- }
-
- def bar(value: Rx[Double], size: String)(implicit app: Environment) = {
- val inst = instrument("bar")
- Obs(value, skipInitial = true) {
- val svg = inst.contentDocument
- val level = svg.getElementById("level")
- level.style.transform = "translate(0px, " + 97 * (1 - value() / 100) + "px)";
- level.style.transition = "transform 250ms ease-out"
- svg.getElementById("unit").textContent = "%"
- svg.getElementById("value").textContent = value().toString
- }
- frame(inst, size)
- }
-
-}
-
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/ui/Layout.scala b/vfd-frontend/src/main/scala/vfd/frontend/ui/Layout.scala
new file mode 100644
index 0000000..5892402
--- /dev/null
+++ b/vfd-frontend/src/main/scala/vfd/frontend/ui/Layout.scala
@@ -0,0 +1,57 @@
+package vfd.frontend.ui
+
+import org.scalajs.dom.HTMLElement
+
+import scalatags.JsDom.all.ExtendedString
+import scalatags.JsDom.all.bindNode
+import scalatags.JsDom.all.`class`
+import scalatags.JsDom.all.div
+import scalatags.JsDom.all.height
+import scalatags.JsDom.all.iframe
+import scalatags.JsDom.all.p
+import scalatags.JsDom.all.src
+import scalatags.JsDom.all.stringAttr
+import scalatags.JsDom.all.stringFrag
+import scalatags.JsDom.all.stringStyle
+import scalatags.JsDom.all.style
+import scalatags.JsDom.all.width
+import vfd.frontend.Environment
+import vfd.frontend.MavlinkSocket
+import vfd.frontend.ui.panels.Communication
+import vfd.frontend.ui.panels.Primary
+
+class Layout(socket: MavlinkSocket) {
+
+ val map = iframe(
+ width := "100%",
+ height := "350px",
+ "frameborder".attr := "0",
+ "scrolling".attr := "no",
+ "marginheight".attr := "0",
+ "marginwidth".attr := "0",
+ src := "http://www.openstreetmap.org/export/embed.html?bbox=6.5611016750335684%2C46.51718501017836%2C6.570038795471191%2C46.520577350893525&amp;layer=mapnik")
+
+ val feed = div(style := "width: 100%; height: 460px; color: #ffffff; background-color: #c2c2c2; text-align: center;")(
+ p(style := "padding-top: 220px")("video feed"))
+
+ def element(implicit env: Environment): HTMLElement = div(`class` := "container-fluid")(
+ div(`class` := "row")(
+ div(`class` := "col-xs-12")(
+ div(`class` := "panel panel-default")(
+ div(`class` := "panel-body")()))),
+ div(`class` := "row")(
+ div(`class` := "col-xs-4")(
+ div(`class` := "panel panel-default")(
+ div(`class` := "panel-body")(
+ map))),
+ div(`class` := "col-xs-5")(
+ div(`class` := "panel panel-default")(
+ div(`class` := "panel-body")(
+ feed)),
+ div(`class` := "panel panel-default")(
+ div(`class` := "panel-body")(Primary(socket)))),
+ div(`class` := "col-xs-3")(
+ div(`class` := "panel panel-default")(
+ div(`class` := "panel-body")(Communication(socket)))))).render
+
+} \ No newline at end of file
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/ui/components/SvgInstrument.scala b/vfd-frontend/src/main/scala/vfd/frontend/ui/components/SvgInstrument.scala
new file mode 100644
index 0000000..c22daa0
--- /dev/null
+++ b/vfd-frontend/src/main/scala/vfd/frontend/ui/components/SvgInstrument.scala
@@ -0,0 +1,55 @@
+package vfd.frontend.ui.components
+
+import scala.scalajs.js.Any.fromFunction1
+
+import org.scalajs.dom
+
+import scalatags.JsDom.all.ExtendedString
+import scalatags.JsDom.all.`object`
+import scalatags.JsDom.all.stringAttr
+import scalatags.JsDom.all.stringFrag
+import scalatags.JsDom.all.stringStyle
+import scalatags.JsDom.all.`type`
+import scalatags.JsDom.all.width
+import vfd.frontend.Environment
+
+trait SvgInstrument[A] {
+
+ /** SVG object element that contains the rendered instrument */
+ def element: dom.HTMLObjectElement
+
+ /** Actual svg document */
+ protected def content: dom.Document = element.contentDocument
+
+ /** Moveable parts of the instrument */
+ protected def moveable: Seq[dom.HTMLElement]
+
+ /** Updates the instrument to show a new value */
+ def update(value: A): Unit
+
+ protected def load(event: dom.Event): Unit = {
+ for (part <- moveable) {
+ part.style.transition = "transform 250ms ease-out"
+ }
+ }
+
+ element.addEventListener("load", (e: dom.Event) => load(e))
+}
+
+object SvgInstrument {
+
+ def svg(name: String)(implicit app: Environment): dom.HTMLObjectElement = {
+ val path = app.asset("images/instruments/" + name + ".svg")
+ `object`(`type` := "image/svg+xml", "data".attr := path, width := "100%")(
+ "Error loading instrument " + name).render
+ }
+
+ def translate(elem: dom.HTMLElement, x: Int, y: Int): Unit = {
+ elem.style.transform = "translate(" + x + "px, " + y + "px)";
+ }
+
+ def rotate(elem: dom.HTMLElement, deg: Int): Unit = {
+ elem.style.transform = "rotateZ(" + deg + "deg)";
+ }
+
+} \ No newline at end of file
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/ui/components/instruments.scala b/vfd-frontend/src/main/scala/vfd/frontend/ui/components/instruments.scala
new file mode 100644
index 0000000..08e164a
--- /dev/null
+++ b/vfd-frontend/src/main/scala/vfd/frontend/ui/components/instruments.scala
@@ -0,0 +1,124 @@
+package vfd.frontend.ui.components
+
+import org.scalajs.dom
+
+import scalatags.JsDom.all.ExtendedString
+import scalatags.JsDom.all.`object`
+import scalatags.JsDom.all.stringAttr
+import scalatags.JsDom.all.stringFrag
+import scalatags.JsDom.all.stringStyle
+import scalatags.JsDom.all.`type`
+import scalatags.JsDom.all.width
+import vfd.frontend.Environment
+
+class Led(implicit env: Environment) extends SvgInstrument[String] {
+ lazy val element = `object`(`type` := "image/svg+xml", "data".attr := env.asset("images/leds/led.svg"), width := "100%")(
+ "Error loading led.").render
+
+ def update(color: String) = {
+ content.getElementById("light").setAttribute("fill", color)
+ }
+
+ protected def moveable = Seq()
+
+}
+
+class Horizon(implicit env: Environment) extends SvgInstrument[(Double, Double)] {
+ lazy val element = SvgInstrument.svg("horizon")
+
+ def pitch = content.getElementById("pitch")
+ def roll = content.getElementById("roll")
+ protected def moveable = Seq(pitch, roll)
+
+ def update(pitchRoll: (Double, Double)) = {
+ SvgInstrument.translate(pitch, 0, pitchRoll._1.toInt)
+ SvgInstrument.rotate(roll, pitchRoll._2.toInt)
+ }
+}
+
+class Altimeter(implicit env: Environment) extends SvgInstrument[Double] {
+ lazy val element = SvgInstrument.svg("altimeter")
+
+ def hand = content.getElementById("hand")
+ protected def moveable = Seq(hand)
+
+ // 36deg === 1m
+ def update(altitude: Double) = {
+ SvgInstrument.rotate(hand, (altitude * 36).toInt)
+ }
+}
+
+class Compass(implicit env: Environment) extends SvgInstrument[Double] {
+ lazy val element = SvgInstrument.svg("compass")
+
+ def plate = content.getElementById("heading")
+ protected def moveable = Seq(plate)
+
+ def update(heading: Double) = {
+ SvgInstrument.rotate(plate, heading.toInt)
+ }
+}
+
+class Generic(
+ min: Double,
+ med: Double,
+ max: Double,
+ unit: String)(implicit env: Environment) extends SvgInstrument[Double] {
+
+ lazy val element = SvgInstrument.svg("generic")
+
+ def handElement = content.getElementById("hand")
+ def unitElement = content.getElementById("unit")
+ def valueElement = content.getElementById("value")
+ def minElement = content.getElementById("min")
+ def medElement = content.getElementById("med")
+ def maxElement = content.getElementById("max")
+ protected def moveable = Seq(handElement)
+
+ override protected def load(e: dom.Event) = {
+ unitElement.textContent = unit
+ minElement.textContent = min.toString
+ medElement.textContent = med.toString
+ maxElement.textContent = max.toString
+ update(min)
+ super.load(e)
+ }
+
+ def update(value: Double) = {
+ SvgInstrument.rotate(handElement, (value * 270 / (max - min)).toInt)
+ valueElement.textContent = value.toString
+ }
+}
+
+class Bar(implicit env: Environment) extends SvgInstrument[Double] {
+
+ lazy val element = SvgInstrument.svg("bar")
+
+ def level = content.getElementById("level")
+ protected def moveable = Seq(level)
+
+ def update(value: Double) = {
+ SvgInstrument.translate(level, 0, (97 * (1 - value / 100)).toInt)
+ }
+
+}
+
+class Balance(implicit env: Environment) extends SvgInstrument[(Double, Double, Double, Double)] {
+ lazy val element = SvgInstrument.svg("balance")
+
+ def position = content.getElementById("position")
+ protected def moveable = Seq(position)
+
+ def update(value: (Double, Double, Double, Double)) = {
+ val m0 = value._1
+ val m1 = value._2
+ val m2 = value._3
+ val m3 = value._4
+ val s = m0 + m1 + m2 + m3
+ val i = (m0 - m2) / s
+ val j = (m1 - m3) / s
+ val x = 0.5 * (i - j)
+ val y = 0.5 * (-i - j)
+ SvgInstrument.translate(position, (x * 50).toInt, (y * 50).toInt)
+ }
+} \ No newline at end of file
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/ui/panels/Communication.scala b/vfd-frontend/src/main/scala/vfd/frontend/ui/panels/Communication.scala
index 813b695..7fec52a 100644
--- a/vfd-frontend/src/main/scala/vfd/frontend/ui/panels/Communication.scala
+++ b/vfd-frontend/src/main/scala/vfd/frontend/ui/panels/Communication.scala
@@ -1,74 +1,106 @@
package vfd.frontend.ui.panels
-import rx.Rx
-import rx.Rx
+import org.mavlink.messages.Heartbeat
+import org.mavlink.messages.Motor
+import org.mavlink.messages.Power
+import org.scalajs.dom.HTMLElement
+import rx.core.Obs
+import scalatags.JsDom.all.bindNode
import scalatags.JsDom.all.`class`
import scalatags.JsDom.all.div
-import scalatags.JsDom.all.i
-import scalatags.JsDom.all.intFrag
import scalatags.JsDom.all.stringAttr
-import scalatags.JsDom.all.stringFrag
-import scalatags.JsDom.all.style
import scalatags.JsDom.all.table
import scalatags.JsDom.all.tbody
import scalatags.JsDom.all.td
-import scalatags.JsDom.all.tr
-import vfd.frontend.util.Environment
-import vfd.frontend.util.Framework.RxStr
-import vfd.frontend.ui.Components
-import rx.core.Var
-import rx.core.Obs
-import org.mavlink.messages._
+import scalatags.JsDom.all._
+import vfd.frontend.Environment
+import vfd.frontend.MavlinkSocket
+import vfd.frontend.ui.components.Generic
+import vfd.frontend.ui.components.Balance
+import vfd.frontend.ui.components.Bar
+import vfd.frontend.ui.components.Led
object Communication {
- def apply(packets: Rx[Int], crcs: Rx[Int], overflows: Rx[Int], wrongIds: Rx[Int], message: Rx[Message])(implicit app: Environment) = {
-
- val m0 = Var(0.0)
- val m1 = Var(0.0)
- val m2 = Var(0.0)
- val m3 = Var(0.0)
- val battery = Var(0.0)
+ def apply(socket: MavlinkSocket)(implicit app: Environment): HTMLElement = {
+
+ val hb = i(`class` := "fa fa-heart heartbeat").render
- Obs(message) {
- message() match {
- case Motor(_m0, _m1, _m2, _m3) =>
- m0() = _m0
- m1() = _m1
- m2() = _m2
- m3() = _m3
- case Power(mV) => battery() = mV / 120
- case _ => ()
+ def foo() = {
+ hb.textContent = ""
+ }
+
+ val motor0 = new Generic(0, 50, 100, "%")
+ val motor1 = new Generic(0, 50, 100, "%")
+ val motor2 = new Generic(0, 50, 100, "%")
+ val motor3 = new Generic(0, 50, 100, "%")
+ val powerDistribution = new Balance()
+ val batteryLevel = new Bar()
+
+ Obs(socket.message, skipInitial = true) {
+ socket.message() match {
+ case Motor(m0, m1, m2, m3) =>
+ motor0.update(m0)
+ motor1.update(m1)
+ motor2.update(m2)
+ motor3.update(m3)
+ powerDistribution.update(m0, m1, m2, m3)
+
+ case Power(mV) =>
+ batteryLevel.update(100 * (mV - 9600) / 12600)
+ case Heartbeat(_) => {
+ hb.style.visibility = "hidden"
+ hb.style.visibility = "visible"
+ //hb.classList.remove("heartbeat")
+ //hb.offsetHeight
+ //hb.classList.add("heartbeat")
+ }
+ case _ =>
}
}
-
+
div(
- "Link Status",
- table(`class` := "table table-condensed")(
+ table(`class` := "table")(
+ thead("Communication"),
tbody(
tr(
- td("Uplink"),
- td("-20 dBm"),
+ td("Conn"),
+ div(width := "20px")(td((new Led()).element)),
td("Server"),
td("5 ms")),
tr(
+ td("Uplink"),
+ td("-20 dBm"),
td("Heartbeat"),
- td(i(`class` := "fa fa-heart", style := "color: #ff0000;"))))),
- "Packet Statistics",
- table(`class` := "table table-condensed")(
+ td(hb)))),
+ table(`class` := "table-instrument", style := "height: 100px")(
tbody(
tr(
- td("OK"),
- td(packets),
- td(`class` := "danger")("CRC"),
- td(crcs),
- td("OFLW"),
- td(overflows),
- td("BID"),
- td(wrongIds)))),
- div(Components.bar(battery, "25%")),
- div(
- Components.basic(m0, "25%"),Components.basic(m1, "25%"),Components.basic(m2, "25%"),Components.basic(m3, "25%")))
+ td(),
+ td(),
+ td(),
+ td(),
+ td(),
+ td(),
+ td(),
+ td(),
+ td(),
+ td(batteryLevel.element)))),
+ table (`class` := "table-instrument")(
+ thead("Motors"),
+ tbody(
+ tr(
+ td(motor0.element),
+ td(),
+ td(motor1.element)),
+ tr(
+ td(),
+ td(powerDistribution.element),
+ td()),
+ tr(
+ td(motor2.element),
+ td(),
+ td(motor3.element))))).render
}
} \ No newline at end of file
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/ui/panels/Primary.scala b/vfd-frontend/src/main/scala/vfd/frontend/ui/panels/Primary.scala
index 4517ea0..f5f260c 100644
--- a/vfd-frontend/src/main/scala/vfd/frontend/ui/panels/Primary.scala
+++ b/vfd-frontend/src/main/scala/vfd/frontend/ui/panels/Primary.scala
@@ -1,33 +1,46 @@
package vfd.frontend.ui.panels
-import org.mavlink.messages._
+import org.mavlink.messages.Attitude
+import org.scalajs.dom.HTMLElement
+
import rx.core.Obs
-import rx.core.Rx
-import rx.core.Var
-import scalatags.JsDom.all.div
-import vfd.frontend.ui.Components
-import vfd.frontend.util.Environment
+import scalatags.JsDom.all.bindNode
+import scalatags.JsDom.all.`class`
+import scalatags.JsDom.all.stringAttr
+import scalatags.JsDom.all.table
+import scalatags.JsDom.all.tbody
+import scalatags.JsDom.all.td
+import scalatags.JsDom.all.tr
+import vfd.frontend.Environment
+import vfd.frontend.MavlinkSocket
+import vfd.frontend.ui.components.Altimeter
+import vfd.frontend.ui.components.Compass
+import vfd.frontend.ui.components.Horizon
object Primary {
- def apply(message: Rx[Message])(implicit env: Environment) = {
- val pitchRoll = Var((0.0, 0.0)) // Rx{(attitude().pitch.toDouble, attitude().roll.toDouble)}
- val heading = Var(0.0) //Rx{attitude().heading.toDouble}
- val altitude = Var(0.0) //Rx{pressure().pressure.toDouble}
+ def apply(socket: MavlinkSocket)(implicit env: Environment): HTMLElement = {
+
+ val compass = new Compass
+ val horizon = new Horizon
+ val altimeter = new Altimeter
- Obs(message) {
- message() match {
+ Obs(socket.message, skipInitial = true) {
+ socket.message() match {
case Attitude(roll, pitch, yaw) =>
- pitchRoll() = (roll, pitch)
- heading() = yaw
+ horizon.update(pitch, roll)
+ compass.update(yaw)
case _ => ()
}
}
- div(
- Components.compass(heading, "33%"),
- Components.horizon(pitchRoll, "33%"),
- Components.altimeter(altitude, "33%"))
+ table(`class` := "table-instrument")(
+ tbody(
+ tr(
+ td(compass.element),
+ td(horizon.element),
+ td(altimeter.element)))).render
+
}
} \ No newline at end of file
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/util/Framework.scala b/vfd-frontend/src/main/scala/vfd/frontend/util/Framework.scala
deleted file mode 100644
index 066478e..0000000
--- a/vfd-frontend/src/main/scala/vfd/frontend/util/Framework.scala
+++ /dev/null
@@ -1,70 +0,0 @@
-package vfd.frontend.util
-
-import scala.language.implicitConversions
-import scala.util.Failure
-import scala.util.Success
-
-import org.scalajs.dom
-import org.scalajs.dom.Element
-
-import rx.Rx
-import rx.Rx
-import rx.core.Obs
-import scalatags.JsDom.all.Attr
-import scalatags.JsDom.all.AttrValue
-import scalatags.JsDom.all.Frag
-import scalatags.JsDom.all.HtmlTag
-import scalatags.JsDom.all.Style
-import scalatags.JsDom.all.backgroundColor
-import scalatags.JsDom.all.bindNode
-import scalatags.JsDom.all.span
-import scalatags.JsDom.all.stringFrag
-import scalatags.JsDom.all.stringStyle
-import scalatags.JsDom.all.StyleValue
-
-/**
- * A minimal binding between Scala.Rx and Scalatags and Scala-Js-Dom
- * taken from https://github.com/lihaoyi/workbench-example-app/blob/todomvc/src/main/scala/example/Framework.scala, by Li Haoyi
- */
-object Framework {
-
- /**
- * Wraps reactive strings in spans, so they can be referenced/replaced
- * when the Rx changes.
- */
- implicit def RxStr[T](r: Rx[T])(implicit f: T => Frag): Frag = {
- rxMod(Rx(span(r())))
- }
-
- /**
- * Sticks some Rx into a Scalatags fragment, which means hooking up an Obs
- * to propagate changes into the DOM via the element's ID. Monkey-patches
- * the Obs onto the element itself so we have a reference to kill it when
- * the element leaves the DOM (e.g. it gets deleted).
- */
- implicit def rxMod[T <: dom.HTMLElement](r: Rx[HtmlTag]): Frag = {
- def rSafe = r.toTry match {
- case Success(v) => v.render
- case Failure(e) => span(e.toString, backgroundColor := "red").render
- }
- var last = rSafe
- Obs(r, skipInitial = true) {
- val newLast = rSafe
- last.parentElement.replaceChild(newLast, last)
- last = newLast
- }
- bindNode(last)
- }
-
- implicit def RxAttrValue[T: AttrValue] = new AttrValue[Rx[T]] {
- def apply(t: Element, a: Attr, r: Rx[T]): Unit = {
- Obs(r) { implicitly[AttrValue[T]].apply(t, a, r()) }
- }
- }
-
- implicit def RxStyleValue[T: StyleValue] = new StyleValue[Rx[T]] {
- def apply(t: Element, s: Style, r: Rx[T]): Unit = {
- Obs(r) { implicitly[StyleValue[T]].apply(t, s, r()) }
- }
- }
-}
diff --git a/vfd-frontend/src/main/scala/vfd/frontend/util/package.scala b/vfd-frontend/src/main/scala/vfd/frontend/util/package.scala
deleted file mode 100644
index 2d98e2f..0000000
--- a/vfd-frontend/src/main/scala/vfd/frontend/util/package.scala
+++ /dev/null
@@ -1,15 +0,0 @@
-package vfd.frontend
-
-import scala.reflect.ClassTag
-
-import rx.Rx
-import rx.Rx
-import rx.ops.RxOps
-
-package object util {
-
- implicit class richRx[A](val input: Rx[A]) extends AnyVal {
- def only[B <: A](implicit ct: ClassTag[B]): Rx[B] = input filter (_.isInstanceOf[B]) map (_.asInstanceOf[B])
- }
-
-} \ No newline at end of file