pull/153/head
openbuilds-engineer 2020-03-06 17:59:58 +02:00
rodzic 4d52c07a14
commit a0b58bc794
20 zmienionych plików z 1130 dodań i 229 usunięć

Wyświetl plik

@ -1,4 +1,7 @@
v1.0.207: Added LEAD1010 Laser Profile, fix bug #107 (Disable CheckSize button on PC's that doesnt support WebGL), fix bug with inch-mode Check Size
v1.0.210: Focussed on close button of alarm/error dialogs to ease closing, added Driver Install button for beginners, beta probing wizards (internal testing only)
v1.0.209: Added Node-Debugger to help check not-responding issue, disabled console.log debugging in server process
v1.0.208: Removed accidental S-Word from coolant menu commands
v1.0.207: Added LEAD1010 Laser Profile, fix bug #107 (Disable CheckSize button on PCs that doesn't support WebGL), fix bug with inch-mode Check Size
v1.0.206: Fixed update check to comply with Github deprecations: https://developer.github.com/changes/2019-11-05-deprecated-passwords-and-authorizations-api/
v1.0.205: Updated version of avrgirl backend for Firmware flashing, fixes to CI
v1.0.204: Soft-Limits support in Keyboard Continuous Jogging

Wyświetl plik

@ -0,0 +1,76 @@
.probe-label:hover {
fill: #ccc;
}
.probe-label path {
pointer-events: none;
}
.areaactive {
fill: #dd0000;
}
.areaactive:hover {
fill: #ff0000;
}
.probe-label, #probe-c-text, #probe-fl-text, #probe-fr-text, #probe-rl-text, #probe-rr-text {
cursor: default;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: -moz-none;
-o-user-select: none;
user-select: none;
}
.B {
stroke-linejoin: round
}
.C {
fill: #000
}
.D {
stroke: #000
}
.E {
word-spacing: 0px
}
.F {
font-family: Arial Black
}
.G {
text-anchor: middle
}
.H {
stroke: none
}
.I {
font-size: 10.033px
}
.J {
overflow: visible
}
.K {
fill-rule: evenodd
}
.L {
stroke-width: 1pt
}
.M {
stroke-width: 1.09
}
.N {
stroke-linejoin: miter
}

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 54 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 45 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 50 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 56 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 3.6 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 80 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 45 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 18 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 4.5 KiB

Wyświetl plik

@ -13,6 +13,7 @@
<link rel="stylesheet" href="lib/iconpicker/css/fontawesome-iconpicker.min.css" />
<link rel="stylesheet" href="css/main.css" />
<link rel="stylesheet" href="css/buttons.css" />
<link rel="stylesheet" href="css/probev2.css" />
</head>
<body>
@ -128,9 +129,11 @@
<select data-prepend="&nbsp;<i class='fab fa-usb'></i>" class="success" data-role="select" data-filter="false" id="portUSB" disabled>
<option value="">Waiting for USB</option>
</select>
<button class="button success float-right" onclick="selectPort()" id="connectBtn" type="button" disabled>Connect</button>
<button class="button alert" style="display:none;" onclick="closePort()" id="disconnectBtn" type="button">Disconnect</button>
<button class="button secondary disabled" disabled style="display:none;" id="flashBtn" type="button">please wait...</button>
<button class="button small success float-right" onclick="selectPort()" id="connectBtn" type="button" style="margin: 5px;" disabled>Connect</button>
<button class="button alert" style="display:none;" onclick="closePort()" id="disconnectBtn" type="button" style="margin: 5px;">Disconnect</button>
<button class="button small secondary disabled" disabled style="display:none;" id="flashBtn" type="button" style="margin: 5px;">please wait...</button>
<button class="button small primary float-right" onclick="socket.emit('opendriverspage', true);" id="driverBtn" type="button" style="margin: 5px;">Install Drivers</button>
</form>
</div>
@ -239,8 +242,8 @@
<!-- <li class="divider"></li> -->
<li><a class="grblmode" href="#" onclick="sendGcode('M3 S1000')">Plasma On (M3 S1000)</a></li>
<li class="divider fg-lightGray"></li>
<li id="menuMisting" style="display: none;"><a class="grblmode" href="#" onclick="sendGcode('M8 S1000')">Misting On (M7)</a></li>
<li><a class="grblmode" href="#" onclick="sendGcode('M8 S1000')">Coolant On (M8)</a></li>
<li id="menuMisting" style="display: none;"><a class="grblmode" href="#" onclick="sendGcode('M7')">Misting On (M7)</a></li>
<li><a class="grblmode" href="#" onclick="sendGcode('M8')">Coolant On (M8)</a></li>
<!-- <li><a class="grblmode" href="#" onclick="sendGcode('M9 S1000')">Coolant Off (M9)</a></li> -->
</ul>
@ -260,7 +263,7 @@
<ul class="ribbon-dropdown grblmode" data-role="dropdown" data-duration="100">
<li><a class="grblmode" href="#" onclick="sendGcode('M5')">Spindle / Laser / Plasma Off (M5)</a></li>
<li class="divider fg-lightGray"></li>
<li><a class="grblmode" href="#" onclick="sendGcode('M9 S1000')">Coolant Off (M9)</a></li>
<li><a class="grblmode" href="#" onclick="sendGcode('M9')">Coolant Off (M9)</a></li>
</ul>
</div>
@ -286,6 +289,7 @@
<ul class="ribbon-dropdown grblmode" data-role="dropdown" data-duration="100">
<li><a href="#" onclick="populateSurfaceToolForm();"><i class="fas fa-exchange-alt"></i> Surfacing / Flattening Wizard</a></li>
<li><a href="#" onclick="jogWidget();"><i class="fas fa-mobile-alt"></i> Mobile Jog Widget</a></li>
<li onclick="openProbeDialog();" class="needsXYZProbe"><a href="#"><span class="fas fa-podcast fa-rotate-180 icon"></span> Probing Wizards</a></li>
<li class="divider fg-lightGray"></li>
<li class="disabled grblCalibrationMenu" onclick="xstepscalibrate();"><a href="#"><i class="fas fa-wrench fa-fw"></i> Calibrate X-Axes Steps/mm</a></li>
<li class="disabled grblCalibrationMenu" onclick="ystepscalibrate();"><a href="#"><i class="fas fa-wrench fa-fw"></i> Calibrate Y-Axes Steps/mm</a></li>
@ -354,7 +358,6 @@
<li class="divider"></li>
<li onclick="disableSerialLog =! disableSerialLog; saveDiagnostics(); location.reload();" id="disableSerialLogTick"><a href="#"><i class="fas fa-fw fa-terminal"></i> Disable Serial Log</a></li>
<li onclick="disableDROupdates = !disableDROupdates; saveDiagnostics(); location.reload();" id="disableDROupdatesTick"><a href="#"><i class="fas fa-fw fa-list-ol"></i> Disable DRO/Status Updates</a></li>
</ul>
</div>
<span class="title">Settings</span>
</div>
@ -437,6 +440,9 @@
<ul class="d-menu context drop-shadow drop-right" data-role="dropdown">
<li><a href="#" onclick="sendGcode( 'G0 X0')"><span class="fas fa-chart-line fg-red icon"></span>Goto X0 (Work Coord) (G0 X0)</a></li>
<li id="gotoXzeroMpos"><a href="#" onclick="sendGcode( 'G53 G0 X0')"><span class="fas fa-chart-line fg-red icon"></span>Goto X0 (Machine Coord) (G53 G0 X0)</a></li>
<li class="divider"></li>
<li class="needsXYZProbe"><a href="#" onclick="openProbeXDialog()"><span class="fas fa-podcast fa-rotate-180 fg-blue icon"></span>Probe X-Zero Wizard</a></li>
<li class="needsXYZProbe"><a href="#" onclick="openProbeDialog()"><span class="fas fa-podcast fa-rotate-180 fg-blue icon"></span>Probe XYZ-Zero Wizard</a></li>
</ul>
</div>
</td>
@ -469,6 +475,9 @@
<ul class="d-menu context drop-shadow drop-right" data-role="dropdown">
<li><a href="#" onclick="sendGcode( 'G0 Y0')"><span class="fas fa-chart-line fg-green icon"></span>Goto Y0 (Work Coord) (G0 Y0)</a></li>
<li id="gotoYzeroMpos"><a href="#" onclick="sendGcode( 'G53 G0 Y0')"><span class="fas fa-chart-line fg-green icon"></span>Goto Y0 (Machine Coord) (G53 G0 Y0)</a></li>
<li class="divider"></li>
<li class="needsXYZProbe"><a href="#" onclick="openProbeYDialog()"><span class="fas fa-podcast fa-rotate-180 fg-blue icon"></span>Probe Y-Zero Wizard</a></li>
<li class="needsXYZProbe"><a href="#" onclick="openProbeDialog()"><span class="fas fa-podcast fa-rotate-180 fg-blue icon"></span>Probe XYZ-Zero Wizard</a></li>
</ul>
</div>
</td>
@ -502,7 +511,9 @@
<li><a href="#" onclick="sendGcode( 'G0 Z0')"><span class="fas fa-chart-line fg-blue icon"></span>Goto Z0 (Work Coord) (G0 Z0)</a></li>
<li id="gotoZzeroMpos"><a href="#" onclick="sendGcode( 'G53 G0 Z0')"><span class="fas fa-chart-line fg-blue icon"></span>Goto Z0 (Machine Coord) (G53 G0 Z0)</a></li>
<li class="divider"></li>
<li><a href="#" onclick="z0probe()"><span class="fas fa-podcast fa-rotate-180 fg-blue icon"></span>Probe Z0 Wizard</a></li>
<!-- <li><a href="#" onclick="z0probe()()"><span class="fas fa-podcast fa-rotate-180 fg-blue icon"></span>Probe Z-Zero Wizard</a></li> -->
<li class="needsXYZProbe"><a href="#" onclick="openProbeZDialog()"><span class="fas fa-podcast fa-rotate-180 fg-blue icon"></span>Probe Z-Zero Wizard with XYZ Plate</a></li>
<li class="needsXYZProbe"><a href="#" onclick="openProbeDialog()"><span class="fas fa-podcast fa-rotate-180 fg-blue icon"></span>Probe XYZ-Zero Wizard</a></li>
</ul>
</div>
</td>
@ -1190,16 +1201,13 @@
<li>Launches the installer for the new version</li>
</ul>
<small>You may want to wait until your machine is idle before continuing</small>
<small id="changelogupdate"></small>
</div>
<div class="dialog-actions">
<button class="button js-dialog-close">Not right now please</button>
<button class="button success js-dialog-close" onclick="socket.emit('applyUpdate', true)">OK, Proceed with Update</button>
</div>
</div>
</div>
<!-- Modal Divs -->
<div style="display: none;">
<div class="dialog dark" data-overlay-click-close="true" data-role="dialog" id="jogWidgetDialog">
<div class="dialog-title"><i class="fas fa-mobile-alt"></i> Jog Widget</div>
@ -1232,18 +1240,237 @@
<button class="button js-dialog-close">Close</button>
</div>
</div>
<!-- XYZ Probe -->
<div class="dialog dark" id="xyzProbeWindow" data-role="dialog" data-overlay-click-close="true" data-to-top="true" data-width="800">
<div class="dialog-title">Probing Wizard</div>
<div class="dialog-content" style="max-height: calc(100vh - 100px);overflow-y: auto; overflow-x: hidden;">
<nav data-role="ribbonmenu">
<ul class="tabs-holder">
<li onclick="probexyztab();" class="probetabxyz" id="probexyztab"><a href="#">XYZ-Zero</a></li>
<li onclick="probextab();" class="probetabxyz" id="probextab"><a href="#">X-Zero</a></li>
<li onclick="probeytab();" class="probetabxyz" id="probeytab"><a href="#">Y-Zero</a></li>
<li onclick="probeztab();" class="probetabxyz" id="probeztab"><a href="#">Z-Zero</a></li>
<li onclick="probezplatetab();" class="probetabz" id="probezplatetab" style="display: none;"><a href="#">Z Touch Plate</a></li>
<li onclick="probeautotab();" class="probetabxyz disabled" id="probeautotab"><a href="#">Automatic</a></li>
<li onclick="probeendmilltab();" class="probetabxyz disabled" id="probeendmilltab"><a href="#">Endmill Diameter</a></li>
</ul>
</nav>
<table>
<tr>
<td>
<div>
<img src="./img/xyzprobe/auto.png" alt="probe-auto" height="350" id="img-probe-auto" class="img-probe">
<img src="./img/xyzprobe/xyz.png" alt="probe-xyz" height="350" id="img-probe-xyz" class="img-probe" style="display: none;">
<img src="./img/xyzprobe/x.png" alt="probe-x" height="350" id="img-probe-x" class="img-probe" style="display: none;">
<img src="./img/xyzprobe/y.png" alt="probe-y" height="350" id="img-probe-y" class="img-probe" style="display: none;">
<img src="./img/xyzprobe/z.png" alt="probe-z" height="350" id="img-probe-z" class="img-probe" style="display: none;">
<img src="./img/xyzprobe/zplate.png" alt="probe-zplate" height="350" id="img-probe-zplate" class="img-probe" style="display: none;">
<img src="./img/xyzprobe/endmill.png" alt="probe-endmill" height="350" id="img-probe-endmill" class="img-probe" style="display: none;">
</div>
</td>
<td style="padding: 4px; padding-left: 15px; vertical-align: top;">
<div id="probe-auto" class="probe-tab-content" style="display: none;">
<small>Automatic Probe Routine: This routine is used to find the XYZ origins, as well as automatically
determine endmill diameter. </small>
<hr>
<small>Position the endmill above the hole in the probe plate as shown to the left just above the plate, clip
on the magnetic connecting clip, then click Probe</small>
</div>
<div id="probe-xyz" class="probe-tab-content">
<small>XYZ Probe Routine: This routine is used to find the XYZ origins</small>
<hr>
<small>Position the endmill above the hole in the probe plate as shown to the left just above the plate, clip
on the magnetic connecting clip, then click Probe</small>
</div>
<div id="probe-x" class="probe-tab-content" style="display: none;">
<small>X Probe Routine: This routine is used to find the X origin</small>
<hr>
<small>Position the endmill to the left of the probe plate as shown, clip on the magnetic connecting clip,
then click Probe</small>
</div>
<div id="probe-y" class="probe-tab-content" style="display: none;">
<small>Y Probe Routine: This routine is used to find the Y origin</small>
<hr>
<small>Position the endmill in front of the probe plate as shown, clip on the magnetic connecting clip, then
click Probe</small>
</div>
<div id="probe-z" class="probe-tab-content" style="display: none;">
<small>Z Probe Routine: This routine is used to find the Z origin</small>
<hr>
<small>Position the endmill above the probe plate as shown, clip on the magnetic connecting clip, then click
Probe</small>
</div>
<div id="probe-endmill" class="probe-tab-content" style="display: none;">
<small>Endmill Probe Routine: This routine is used to find the Endmill Diameter</small>
<hr>
<small>Position the endmill above the hole in the probe plate as shown to the left just above the plate, clip
on the magnetic connecting clip, then click Probe</small>
<hr>
<small>
This operation will perform an XYZ probe to establish the plate position, then using the hole in the plate,
it will measure and calculate the Endmill Diameter and display it onscreen. <br>This operation will NOT set
any work-coordinates!
</small>
</div>
<hr>
<div id="endmilldiameterform">
<label>Endmill Diameter</label>
<input id="probediameterxyz" type="number" value="6.35" data-role="input" data-append="mm" data-prepend="<img class='fa-fw' src='https://cam.openbuilds.com/images/endmilldia.svg' width='16px' height='16px'>"
data-clear-button="false">
</div>
<hr>
<button class="button" id="toggle-probe-advanced"><i class="fas fa-fw fa-cogs"></i> Advanced</button>
<div class="pos-relative">
<div data-role="collapse" data-toggle-element="#toggle-probe-advanced" data-collapsed="true" id="toggle-probe-advanced-content">
<div id="xyzdatum" class="probe-tab-content">
<small>Where is the XY Zero Datum / Origin in your CAM setup, relevant to the front-left corner we are
probing? </small>
<br>
<svg xmlns="http://www.w3.org/2000/svg" width="300" height="180" viewBox="0 0 79.375 47.625">
<style>
</style>
<defs>
<marker id="A" orient="auto" class="J">
<path transform="matrix(.4 0 0 .4 2.96 .4)" d="m-2.5-1c0 2.76-2.24 5-5 5s-5-2.24-5-5 2.24-5 5-5 5 2.24 5 5z" class="D K L" />
</marker>
<marker id="B" orient="auto" class="J">
<path transform="matrix(.4 0 0 .4 2.96 .4)" d="m-2.5-1c0 2.76-2.24 5-5 5s-5-2.24-5-5 2.24-5 5-5 5 2.24 5 5z" class="D K L" />
</marker>
<marker id="C" orient="auto" class="J">
<path transform="matrix(.8 0 0 .8 10 0)" d="M0 0l5-5-17.5 5L5 5z" class="D K L" />
</marker>
<marker id="D" orient="auto" class="J">
<path transform="matrix(.8 0 0 .8 10 0)" d="M0 0l5-5-17.5 5L5 5z" class="D K L" />
</marker>
</defs>
<g fill="#fff" class="D">
<g stroke-width=".132" class="B">
<path d="M7.195 7.363l15.94 28.46L70.758 31.1 47.99 5.015z" fill="#999" />
<path d="M23.133 35.823l-1.257 8.313 47.7-5.284 1.172-7.752z" fill="#ececec" />
<path d="M7.195 7.363l15.94 28.46-1.257 8.313-15.722-29.89z" fill="#ccc" />
</g>
<g stroke-width=".049" class="C N">
<path d="M7.198 7.363l63.74 25.952" />
<path d="M23.322 38.1L47.993 5.093" />
</g>
<g fill="none" stroke-width=".197" class="N">
<path d="M3.942 15.993L19.16 45.07" marker-start="url(#C)" marker-end="url(#A)" />
<path d="M70.118 41.003l-47.624 5.73" marker-start="url(#D)" marker-end="url(#B)" />
</g>
<g transform="matrix(.24595 -.020313 .020313 .24595 108.29 -158.287)">
<rect class="probe-label" id="probe-c" rx="5.925" height="16.422" width="59.717" y="682.21" x="-368.93" stroke-width=".987" class="B" />
<text id="probe-c-text" xml:space="preserve" letter-spacing="0" font-size="2.229" y="694.532" x="-339.852" class="C E F G H">
<tspan y="694.532" x="-330.852" class="I">CENTER</tspan>
</text>
<rect class="probe-label areaactive" id="probe-fl" rx="6.543" height="30.532" width="43.617" y="742.64" x="-423.17" class="B M" />
<text id="probe-fl-text" xml:space="preserve" letter-spacing="0" y="755.631" x="-401.459" class="C E F G H I">
<tspan y="755.631" x="-350">FRONT</tspan>
<tspan y="768.172" x="-350">LEFT</tspan>
</text>
<rect class="probe-label" id="probe-fr" rx="6.543" height="30.532" width="43.617" y="733.68" x="-239.82" class="B M" />
<text id="probe-fr-text" xml:space="preserve" letter-spacing="0" y="746.284" x="-217.439" class="C E F G H I">
<tspan y="746.284" x="-166">FRONT</tspan>
<tspan y="758.824" x="-169">RIGHT</tspan>
</text>
<rect class="probe-label" id="probe-rr" rx="6.543" height="30.532" width="43.617" y="621.52" x="-312.72" class="B M" />
<text id="probe-rr-text" xml:space="preserve" letter-spacing="0" y="633.759" x="-290.442" class="C E F G H I">
<tspan y="633.759" x="-239.442">REAR</tspan>
<tspan y="646.3" x="-242.442">RIGHT</tspan>
</text>
<rect class="probe-label" id="probe-rl" rx="6.543" height="30.532" width="43.617" y="616.07" x="-476.33" class="B M" />
<text id="probe-rl-text" xml:space="preserve" letter-spacing="0" y="628.815" x="-455.49" class="C E F G H I">
<tspan y="628.815" x="-404">REAR</tspan>
<tspan y="641.356" x="-404">LEFT</tspan>
</text></g>
</g>
</svg>
<br>
<small>If the origin is not Front, Left (Default): Then provide stock dimensions to calculate correct
offset of X0, Y0:</small>
<br>
<label>Width</label>
<input id="stockwidth" type="number" value="200" data-role="input" data-append="mm" data-prepend="<i class='fas fa-arrows-alt-h'></i>" data-clear-button="false">
<label>Length</label>
<input id="stocklength" type="number" value="200" data-role="input" data-append="mm" data-prepend="<i class='fas fa-arrows-alt-v'></i>" data-clear-button="false">
</div>
<!-- end xyzdatum-->
</div>
</div>
</td>
</tr>
</table>
</div>
<div class="dialog-actions">
<label>Probe Type: </label>
<a class="button" id="context_toggle"><span id="probetypebtn"><span class="icon"><img src="./img/xyzprobe/xyztouch.png" /></span> Prototype OpenBuilds XYZ Probe</span></a>
<ul class="d-menu context" data-role="dropdown" data-toggle-element="#context_toggle">
<li onclick="probetype('protoxyz');"><a href="#"><span class="icon"><img src="./img/xyzprobe/xyztouch.png" /></span> Prototype OpenBuilds XYZ Probe</a></li>
<li onclick="probetype('xyz');"><a href="#"><span class="icon"><img src="./img/xyzprobe/xyztouch.png" /></span> OpenBuilds XYZ Probe</a></li>
<li onclick="probetype('z');"><a href="#"><span class="icon"><img src="./img/xyzprobe/ztouch.png" /></span>OpenBuilds Z Touch Plate</a></li>
<li class="divider"></li>
<!-- li onclick="probetype('custom');"><a href="#">Custom</a></li -->
</ul>
<span style="padding-left: 200px;"></span>
<button class="button js-dialog-close" onclick="Metro.dialog.close('#xyzProbeWindow');">Cancel</button>
<button class="button success js-dialog-close" onclick="confirmProbeInPlace();">Probe</button>
</div>
</div>
<!-- End XYZ Probe -->
<!-- XYZ Probe confirmation -->
<div class="dialog dark" id="confirmXYZprobeModal" data-role="dialog" data-overlay-click-close="true">
<div class="dialog-title"><i class='fas fa-podcast' data-fa-transform='rotate-180'></i> Confirm Probe Hardware</div>
<div class="dialog-content" id="confirmXYZprobeDiv">
</div>
<div class="dialog-actions">
<div class="float-right">
<button class="button js-dialog-close">Cancel</button>
<button onclick="runProbeNew()" class="button success js-dialog-close">Probe</button>
</div>
</div>
</div>
<!-- end XYZ Probe confirmation -->
<!-- job completion confirmation -->
<div class="dialog dark" id="completeMsgModal" data-role="dialog" data-overlay-click-close="true">
<div class="dialog-title"><i class='far fa-check-square'></i> Completed</div>
<div class="dialog-content" id="completeMsgDiv">
</div>
<div class="dialog-actions">
<div class="float-right">
<button class="button primary js-dialog-close">OK</button>
</div>
</div>
</div>
<!-- end job completion confirmation -->
</div>
</body>
<script type="x-shader/x-vertex" id="vertexShader">
varying vec3 vWorldPosition; void main() { vec4 worldPosition = modelMatrix * vec4( position, 1.0 ); vWorldPosition = worldPosition.xyz; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); }
</script>
</script>
<script type="x-shader/x-fragment" id="fragmentShader">
uniform vec3 topColor; uniform vec3 bottomColor; uniform float offset; uniform float exponent; varying vec3 vWorldPosition; void main() { float h = normalize( vWorldPosition + offset ).z; gl_FragColor = vec4( mix( bottomColor, topColor, max( pow( max(
h , 0.0), exponent ), 0.0 ) ), 1.0 ); }
h , 0.0), exponent ), 0.0 ) ), 1.0 ); }
</script>
</script>
<script type="text/javascript" src="lib/fontawesome5/js/all.min.js"></script>
@ -1303,6 +1530,7 @@
<script type="text/javascript" src="js/calibrate-servo.js"></script>
<script type="text/javascript" src="js/probe.js"></script>
<script type="text/javascript" src="js/probev2.js"></script>
<script type="text/javascript" src="wizards/surfacing.js"></script>

Wyświetl plik

@ -14,6 +14,7 @@ function saveDiagnostics() {
localStorage.setItem('disable3Dgcodepreview', disable3Dgcodepreview);
localStorage.setItem('disableSerialLog', disableSerialLog);
localStorage.setItem('disableDROupdates', disableDROupdates);
}
function initDiagnostics() {
@ -81,6 +82,7 @@ function initDiagnostics() {
} else {
disableDROupdates = false;
}
};
initDiagnostics();

Wyświetl plik

@ -17,6 +17,15 @@ function getChangelog() {
}
template2 += `</ul>`
$("#changelog").html(template2);
var template3 = `Changelog: <hr> <ul>`
for (var line = 0; line < 3; line++) {
template3 += '<li>' + lines[line] + '</li>'
}
template3 += `</ul>`
$("#changelogupdate").html(template3);
});
}

517
app/js/probev2.js 100644
Wyświetl plik

@ -0,0 +1,517 @@
var protoxyzprobeplate = {
xoffset: 6,
yoffset: 6,
zoffset: 5,
name: "Prototype OpenBuilds XYZ Touchplate",
xyzmode: true
}
var xyzprobeplate = {
xoffset: 10,
yoffset: 10,
zoffset: 9,
name: "OpenBuilds XYZ Touchplate",
xyzmode: true
}
var zprobeplate = {
xoffset: 0,
yoffset: 0,
zoffset: 20,
name: "OpenBuilds Z Touchplate",
xyzmode: false
}
var probemode = {
mode: "auto", // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
endmilldia: 0,
stock: {
x: 0,
y: 0,
position: "fl" // fl, fr, rl, rr, c
},
plate: {
traveldistance: 25,
thickness: 20,
feedrate: 500
},
probe: protoxyzprobeplate,
}
// still beta, lets hide it from users
// if (!enableBetaFeatures) {
// $(".needsXYZProbe").hide();
// }
function openProbeDialog() {
Metro.dialog.open("#xyzProbeWindow");
if (localStorage.getItem('probeType')) {
probetype(localStorage.getItem('probeType'))
if (localStorage.getItem('probeType') == "z") {
setTimeout(function() {
probezplatetab()
$(".probetabxyz").removeClass("active")
$("#probezplatetab").addClass("active")
}, 100)
} else {
setTimeout(function() {
probexyztab()
$(".probetabxyz").removeClass("active")
$("#probexyztab").addClass("active")
}, 100)
}
}
}
function openProbeXDialog() {
Metro.dialog.open("#xyzProbeWindow");
if (localStorage.getItem('probeType')) {
probetype(localStorage.getItem('probeType'))
if (localStorage.getItem('probeType') == "z") {
// setTimeout(function() {
// probezplatetab()
// $(".probetabxyz").removeClass("active")
// $("#probezplatetab").addClass("active")
// }, 100)
} else {
setTimeout(function() {
probextab()
$(".probetabxyz").removeClass("active")
$("#probextab").addClass("active")
}, 100)
}
}
}
function openProbeYDialog() {
Metro.dialog.open("#xyzProbeWindow");
if (localStorage.getItem('probeType')) {
probetype(localStorage.getItem('probeType'))
if (localStorage.getItem('probeType') == "z") {
// setTimeout(function() {
// probezplatetab()
// $(".probetabxyz").removeClass("active")
// $("#probezplatetab").addClass("active")
// }, 100)
} else {
setTimeout(function() {
probeytab()
$(".probetabxyz").removeClass("active")
$("#probeytab").addClass("active")
}, 100)
}
}
}
function openProbeZDialog() {
Metro.dialog.open("#xyzProbeWindow");
if (localStorage.getItem('probeType')) {
probetype(localStorage.getItem('probeType'))
if (localStorage.getItem('probeType') == "z") {
setTimeout(function() {
probezplatetab()
$(".probetabxyz").removeClass("active")
$("#probezplatetab").addClass("active")
}, 100)
} else {
setTimeout(function() {
probeztab()
$(".probetabxyz").removeClass("active")
$("#probeztab").addClass("active")
}, 100)
}
}
}
function probeautotab() {
probemode.mode = "auto"; // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
$(".probe-tab-content").hide();
$("#probe-auto").show();
$("#xyzdatum").show();
$(".img-probe").hide();
$("#img-probe-auto").show();
$("#toggle-probe-advanced").show();
$("#endmilldiameterform").hide();
if (probemode.stock.position == "fl") {
$("#toggle-probe-advanced-content").data('collapse').collapse()
} else {
$("#toggle-probe-advanced-content").data('collapse').expand()
}
}
function probexyztab() {
probemode.mode = "xyz"; // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
$(".probe-tab-content").hide();
$("#probe-xyz").show();
$("#xyzdatum").show();
$(".img-probe").hide();
$("#img-probe-xyz").show();
$("#toggle-probe-advanced").show();
$("#endmilldiameterform").show();
if (probemode.stock.position == "fl") {
$("#toggle-probe-advanced-content").data('collapse').collapse()
} else {
$("#toggle-probe-advanced-content").data('collapse').expand()
}
}
function probextab() {
probemode.mode = "xzero"; // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
resetOffsetFL();
$(".probe-tab-content").hide();
$("#probe-x").show();
$("#xyzdatum").hide();
$(".img-probe").hide();
$("#img-probe-x").show();
$("#toggle-probe-advanced").hide();
$("#endmilldiameterform").show();
$("#toggle-probe-advanced-content").data('collapse').collapse()
}
function probeytab() {
probemode.mode = "yzero"; // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
resetOffsetFL();
$(".probe-tab-content").hide();
$("#probe-y").show();
$("#xyzdatum").hide();
$(".img-probe").hide();
$("#img-probe-y").show();
$("#toggle-probe-advanced").hide();
$("#endmilldiameterform").show();
$("#toggle-probe-advanced-content").data('collapse').collapse()
}
function probeztab() {
probemode.mode = "zzero"; // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
resetOffsetFL();
$(".probe-tab-content").hide();
$("#probe-z").show();
$("#xyzdatum").hide();
$(".img-probe").hide();
$("#img-probe-z").show();
$("#toggle-probe-advanced").hide();
$("#endmilldiameterform").hide();
$("#toggle-probe-advanced-content").data('collapse').collapse()
}
function probezplatetab() {
probemode.mode = "zplate"; // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
resetOffsetFL();
$(".probe-tab-content").hide();
$("#probe-z").show();
$("#xyzdatum").hide();
$(".img-probe").hide();
$("#img-probe-zplate").show();
$("#toggle-probe-advanced").hide();
$("#endmilldiameterform").hide();
$("#toggle-probe-advanced-content").data('collapse').expand()
}
function probeendmilltab() {
probemode.mode = "endmilldia"; // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
resetOffsetFL();
$(".probe-tab-content").hide();
$("#probe-endmill").show();
$("#xyzdatum").hide();
$(".img-probe").hide();
$("#img-probe-endmill").show();
$("#toggle-probe-advanced").hide();
$("#endmilldiameterform").hide();
$("#toggle-probe-advanced-content").data('collapse').collapse()
}
function resetOffsetFL() {
$(".probe-label").removeClass("areaactive")
$("#probe-fl").addClass("areaactive")
probemode.stock.position = "fl" // fl, fr, rl, rr, c
}
$("#probe-fl, #probe-fl-text").on("click", function() {
resetOffsetFL();
});
$("#probe-fr, #probe-fr-text").on("click", function() {
$(".probe-label").removeClass("areaactive")
$("#probe-fr").addClass("areaactive")
probemode.stock.position = "fr" // fl, fr, rl, rr, c
});
$("#probe-rl, #probe-rl-text").on("click", function() {
$(".probe-label").removeClass("areaactive")
$("#probe-rl").addClass("areaactive")
probemode.stock.position = "rl" // fl, fr, rl, rr, c
});
$("#probe-rr, #probe-rr-text").on("click", function() {
$(".probe-label").removeClass("areaactive")
$("#probe-rr").addClass("areaactive")
probemode.stock.position = "rr" // fl, fr, rl, rr, c
});
$("#probe-c, #probe-c-text").on("click", function() {
$(".probe-label").removeClass("areaactive")
$("#probe-c").addClass("areaactive")
probemode.stock.position = "c" // fl, fr, rl, rr, c
});
function probetype(type) {
localStorage.setItem('probeType', type);
if (type == "xyz") {
probemode.probe = xyzprobeplate // protoxyzprobeplate, xyzprobeplate, zprobeplate
var template = `<span class="icon"><img src="https://i.ibb.co/QkxzYN8/xyztouch.png"/></span> OpenBuilds XYZ Probe`;
$("#probetypebtn").html(template)
$(".probetabz").hide();
$(".probetabxyz").show();
probexyztab()
} else if (type == "protoxyz") {
probemode.probe = protoxyzprobeplate // protoxyzprobeplate, xyzprobeplate, zprobeplate
var template = `<span class="icon"><img src="https://i.ibb.co/QkxzYN8/xyztouch.png"/></span> Prototype OpenBuilds XYZ Probe`;
$("#probetypebtn").html(template)
$(".probetabz").hide();
$(".probetabxyz").show();
probexyztab()
} else if (type == "z") {
probemode.probe = zprobeplate // protoxyzprobeplate, xyzprobeplate, zprobeplate
var template = `<span class="icon"><img src="https://i.ibb.co/CQ7rSW6/ztouch.png"/></span>OpenBuilds Z Touch Plate`;
$("#probetypebtn").html(template)
$(".probetabxyz").hide();
$(".probetabz").show();
probezplatetab();
}
}
function confirmProbeInPlace(operation) {
var imgurl = "./img/xyzprobe/xyz.png"
if (probemode.mode == "xyz") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/xyz.png"
} else if (probemode.mode == "xzero") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/x.png"
} else if (probemode.mode == "yzero") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/y.png"
} else if (probemode.mode == "zzero") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/z.png"
} else if (probemode.mode == "zplate") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/zplate.png"
} else if (probemode.mode == "endmilldia") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/endmill.png"
} else if (probemode.mode == "auto") { // auto, xyz, xzero, yzero, zzero, zplate, endmilldia
imgurl = "./img/xyzprobe/auto.png"
}
var confirmTemplate = `
<table>
<tr>
<td><img src="` + imgurl + `" height="350" class="img-probe"/>
</td>
<td style="padding: 4px; vertical-align: middle;">
<ul>
<li>Are you sure the probe plate was placed onto the front, left corner of the stock/workpiece?</li>
<li>Are you sure the probe clip is attached to the bit?</li>
<li>Are you sure you jogged the bit to the correct approximate position as shown, prior to initiating the probe?</li>
</ul>
</td>
</tr>
</table>
`
$("#confirmXYZprobeDiv").html(confirmTemplate);
setTimeout(function() {
Metro.dialog.open("#confirmXYZprobeModal")
}, 100);
}
function runProbeNew() {
$("#consoletab").click()
probemode.stock.x = $("#stockwidth").val();
probemode.stock.y = $("#stocklength").val();
template = `Code todo: run: \n`
template += `Mode: ` + probemode.mode + `\n`
template += `Probe: ` + probemode.probe.name + `\n`
template += `Probe: X:` + probemode.probe.xoffset + `\n`
template += `Probe: Y:` + probemode.probe.yoffset + `\n`
template += `Probe: Z:` + probemode.probe.zoffset + `\n`
if (probemode.mode == "xyz" || probemode.mode == "xzero" || probemode.mode == "yzero" || probemode.mode == "zzero") {
probemode.endmilldia = $("#probediameterxyz").val();
template += `Endmill: ` + probemode.endmilldia + `mm\n`
}
var stockoffset = {
x: 0,
y: 0
}
if (probemode.stock.position == "fl") { // fl, fr, rl, rr, c
template += `Offset: NONE\n`
}
if (probemode.stock.position == "fr") { // fl, fr, rl, rr, c
template += `Stock x:` + probemode.stock.x + `\n`;
template += `Stock y: ` + probemode.stock.y + `\n`;
template += `Offset: Front Right:\n`;
template += `Offset x:` + probemode.stock.x + `\n`;
template += `Offset y: ` + 0 + `\n`;
stockoffset.x = probemode.stock.x
}
if (probemode.stock.position == "rl") { // fl, fr, rl, rr, c
template += `Stock x:` + probemode.stock.x + `\n`;
template += `Stock y: ` + probemode.stock.y + `\n`;
template += `Offset: Rear Left:\n`;
template += `Offset x:` + 0 + `\n`;
template += `Offset y: ` + probemode.stock.y + `\n`;
stockoffset.y = probemode.stock.y
}
if (probemode.stock.position == "rr") { // fl, fr, rl, rr, c
template += `Stock x:` + probemode.stock.x + `\n`;
template += `Stock y: ` + probemode.stock.y + `\n`;
template += `Offset: Rear Right:\n`;
template += `Offset x:` + probemode.stock.x + `\n`;
template += `Offset y: ` + probemode.stock.y + `\n`;
stockoffset.x = probemode.stock.x
stockoffset.y = probemode.stock.y
}
if (probemode.stock.position == "c") { // fl, fr, rl, rr, c
template += `Stock x:` + probemode.stock.x + `\n`;
template += `Stock y: ` + probemode.stock.y + `\n`;
template += `Offset: Center:\n`;
template += `Offset x:` + probemode.stock.x / 2 + `\n`;
template += `Offset y: ` + probemode.stock.y / 2 + `\n`;
stockoffset.x = probemode.stock.y / 2
stockoffset.y = probemode.stock.y / 2
}
// alert(template)
if (probemode.mode == "xzero") {
var xoffset = (probemode.probe.xoffset + probemode.endmilldia / 2) * -1 // *-1 to make negative as we are off to the left too far from x0
var yoffset = (probemode.probe.yoffset + probemode.endmilldia / 2) * -1 // *-1 to make negative as we are off to the front too far from y0
var zoffset = probemode.probe.zoffset // not *-1 as its offset in z pos
var xmacro = `
; Header
G21 ; mm mode
G10 P1 L20 X0 ; zero out current location
; Probe X
G38.2 X25 F100 ; Probe X
G4 P0.4
G10 P1 L20 X` + xoffset + ` ; set X as offset and half endmill diameter
G0 X` + (xoffset - 2).toFixed(3) + `
`
socket.emit('runJob', {
data: xmacro,
isJob: false,
completedMsg: "Probe Complete: Remove the Probe Clip and Probe Plate before continuing... "
});
}
if (probemode.mode == "yzero") {
var xoffset = (probemode.probe.xoffset + probemode.endmilldia / 2) * -1 // *-1 to make negative as we are off to the left too far from x0
var yoffset = (probemode.probe.yoffset + probemode.endmilldia / 2) * -1 // *-1 to make negative as we are off to the front too far from y0
var zoffset = probemode.probe.zoffset // not *-1 as its offset in z pos
var ymacro = `
; Header
G21 ; mm mode
G10 P1 L20 Y0 ; zero out current location
G38.2 Y25 F100 ; probe Y
G4 P0.4
G10 P1 L20 Y` + yoffset + ` ; set Y as offset and half endmill diameter
G0 Y` + (yoffset - 2).toFixed(3) + `
`
socket.emit('runJob', {
data: ymacro,
isJob: false,
completedMsg: "Probe Complete: Remove the Probe Clip and Probe Plate before continuing... "
});
}
if (probemode.mode == "zzero") {
var xoffset = (probemode.probe.xoffset + probemode.endmilldia / 2) * -1 // *-1 to make negative as we are off to the left too far from x0
var yoffset = (probemode.probe.yoffset + probemode.endmilldia / 2) * -1 // *-1 to make negative as we are off to the front too far from y0
var zoffset = probemode.probe.zoffset // not *-1 as its offset in z pos
var zmacro = `
; Header
G21 ; mm mode
G10 P1 L20 Z0 ; zero out current location
; Probe Z
G38.2 Z-25 F100 ; Probe Z
G4 P0.4
G10 P1 L20 Z` + zoffset + ` ; Set Z6 where 6 is thickness of plate
G0 Z10 ; retract
`
socket.emit('runJob', {
data: zmacro,
isJob: false,
completedMsg: "Probe Complete: Remove the Probe Clip and Probe Plate before continuing... "
});
}
if (probemode.mode == "xyz") {
var xoffset = (probemode.probe.xoffset + probemode.endmilldia / 2) * -1 // *-1 to make negative as we are off to the left too far from x0
var yoffset = (probemode.probe.yoffset + probemode.endmilldia / 2) * -1 // *-1 to make negative as we are off to the front too far from y0
var zoffset = probemode.probe.zoffset // not *-1 as its offset in z pos
var xyzmacro = `
; Header
G21 ; mm mode
G10 P1 L20 X0 Y0 Z0 ; zero out current location
; Probe Z
G0 X22.5 Y22.5 ; position to center of logo
G38.2 Z-25 F100 ; Probe Z
G4 P0.4
G10 P1 L20 Z` + zoffset + ` ; Set Z6 where 6 is thickness of plate
G0 Z10 ; retract
G0 X0 Y0 ; return
; Probe X
G0 X-20 ; position to left side
G0 Y15 ; and move forward a little to be closer to center of edge
G0 Z0 ; drop down to be next to plate
G38.2 X25 F100 ; Probe X
G4 P0.4
G10 P1 L20 X` + xoffset + ` ; set X as offset and half endmill diameter
G0 X` + (xoffset - 2).toFixed(3) + `
G0 Z10 ; retract
G0 X0 Y0 ; return
; Probe Y
G0 Y-20 ; position to front side
G0 X15 ; and move right a little to be closer to center of edge
G0 Z0 ; drop down to be next to plate
G38.2 Y25 F100 ; probe Y
G4 P0.4
G10 P1 L20 Y` + yoffset + ` ; set Y as offset and half endmill diameter
G0 Y` + (yoffset - 2).toFixed(3) + `
G0 Z10 ; retract
G0 X0 Y0 ; return
`
if (stockoffset.x != 0 || stockoffset.y != 0) {
xyzmacro += `
G10 P1 L20 X-` + stockoffset.x + ` ; set X stock offset
G10 P1 L20 Y-` + stockoffset.y + ` ; set Y stock offset
G0 X0 Y0 ; return
`
}
socket.emit('runJob', {
data: xyzmacro,
isJob: false,
completedMsg: "Probe Complete: Remove the Probe Clip and Probe Plate before continuing... "
});
}
}

Wyświetl plik

@ -8,6 +8,7 @@ function setConnectBar(val, status) {
$("#flashBtn").hide();
$('#portUSB').parent().show();
$("#connectBtn").show();
$("#driverBtn").show();
if ($('#portUSB').val() != "") {
$("#connectBtn").attr('disabled', false);
} else {
@ -29,6 +30,7 @@ function setConnectBar(val, status) {
$('#connectStatus').html("Port: Connected");
// Connect/Disconnect Button
$("#connectBtn").hide();
$("#driverBtn").hide();
$('#portUSB').parent().hide();
$("#connectBtn").attr('disabled', false);
$("#disconnectBtn").show();
@ -45,6 +47,7 @@ function setConnectBar(val, status) {
$('#connectStatus').html("Port: Connected");
// Connect/Disconnect Button
$("#connectBtn").hide();
$("#driverBtn").hide();
$('#portUSB').parent().hide();
$("#connectBtn").attr('disabled', false);
$("#disconnectBtn").show();
@ -61,6 +64,7 @@ function setConnectBar(val, status) {
$('#connectStatus').html("Port: Connected");
// Connect/Disconnect Button
$("#connectBtn").hide();
$("#driverBtn").hide();
$('#portUSB').parent().hide();
$("#connectBtn").attr('disabled', false);
$("#disconnectBtn").show();
@ -77,6 +81,7 @@ function setConnectBar(val, status) {
$('#connectStatus').html("Port: Connected");
// Connect/Disconnect Button
$("#connectBtn").hide();
$("#driverBtn").hide();
$('#portUSB').parent().hide();
$("#connectBtn").attr('disabled', false);
$("#disconnectBtn").show();
@ -92,6 +97,7 @@ function setConnectBar(val, status) {
$('#connectStatus').html("Port: Flashing");
// Connect/Disconnect Button
$("#connectBtn").hide();
$("#driverBtn").hide();
$('#portUSB').parent().hide();
$("#connectBtn").attr('disabled', false);
$("#disconnectBtn").hide();

Wyświetl plik

@ -116,6 +116,7 @@ function initSocket() {
// 6 = Firmware Upgrade State
if (laststatus.comms.connectionStatus < 3 && !continuousJogRunning) {
$('#availVersion').html(data)
getChangelog();
Metro.dialog.open('#downloadUpdate')
}
@ -153,7 +154,17 @@ function initSocket() {
});
socket.on("jobComplete", function(data) {
console.log("Job Complete", data)
console.log("jobComplete", data)
if (data.completed) {
console.log("Job Complete", data)
}
if (data.jobCompletedMsg && data.jobCompletedMsg.length > 0) {
$("#completeMsgDiv").html(data.jobCompletedMsg);
Metro.dialog.open("#completeMsgModal");
}
});
socket.on("machinename", function(data) {
@ -231,6 +242,9 @@ function initSocket() {
}
]
});
setTimeout(function() {
$(".closeAlarmBtn").focus();
}, 200, )
//
});
@ -240,8 +254,18 @@ function initSocket() {
Metro.dialog.create({
title: "<i class='fas fa-exclamation-triangle'></i> Grbl Error:",
content: "<i class='fas fa-exclamation-triangle fg-red'></i> " + data,
clsDialog: 'dark'
clsDialog: 'dark',
actions: [{
caption: "OK",
cls: "js-dialog-close alert closeErrorBtn",
onclick: function() {
socket.emit('clearAlarm', 2)
}
}]
});
setTimeout(function() {
$(".closeErrorBtn").focus();
}, 200, )
//
});
@ -586,7 +610,10 @@ function populatePortsMenu() {
response += `<option value="` + laststatus.comms.interfaces.ports[i].comName + `">` + port.note + " " + laststatus.comms.interfaces.ports[i].comName.replace("/dev/tty.", "") + `</option>`;
};
if (!laststatus.comms.interfaces.ports.length) {
response += `<option value="">Waiting for USB</option`
response += `<option value="">Waiting for USB</option>`
$("#driverBtn").show();
} else {
$("#driverBtn").hide();
}
response += `</optgroup></select>`
var select = $("#portUSB").data("select");

448
index.js

Plik diff jest za duży Load Diff

Wyświetl plik

@ -1,6 +1,6 @@
{
"name": "OpenBuildsCONTROL",
"version": "1.0.207",
"version": "1.0.210",
"license": "AGPL-3.0",
"description": "Machine Interface Driver for OpenBuilds",
"author": "github.com/openbuilds <webmaster@openbuilds.com>",

1
rose1.svg 100644
Wyświetl plik

@ -0,0 +1 @@
<svg class="quadrantField" width="65" height="65"><path class="bkg" d="M52.8,62.9H10.5c-5.5,0-10-4.5-10-10V10.5c0-5.5,4.5-10,10-10h42.3c5.5,0,10,4.5,10,10v42.3 C62.9,58.4,58.4,62.9,52.8,62.9z"></path><g class="area tl"><circle cx="11.8" cy="11.8" r="9.8"></circle><path id="XMLID_37_" d="M12.1,9.2h-1.7v7.4H8.5V9.2H6.7V7.4h5.5V9.2z"></path><path id="XMLID_39_" d="M12.9,16.6V7.4h1.9v7.4h2.7v1.7H12.9z"></path></g><g class="area tr"><circle cx="51.5" cy="11.8" r="9.8"></circle><path id="XMLID_13_" d="M51.1,9.2h-1.7v7.4h-1.9V9.2h-1.8V7.4h5.5V9.2z"></path><path id="XMLID_15_" d="M55.5,16.6l-1.1-3.3h-0.5v3.3h-1.9V8.7l1.4-1.3h3.9v5.8h-1l1.2,3.3H55.5z M55.3,11.6V9.2h-1.5v2.4H55.3z"></path></g><g class="area c"><circle cx="31.7" cy="31.7" r="9.8"></circle><path id="XMLID_19_" d="M32.5,34.7v-1.1h1.9v1.6l-1.3,1.3H29v-7.9l1.4-1.3h4v3.5h-1.9V29h-1.5v5.7H32.5z"></path></g><g class="area bl active"><circle cx="11.8" cy="51.5" r="9.8"></circle><path id="XMLID_30_" d="M12.3,52.5v3.8H8L6.7,55v-7.9h3.9l1.3,1.2v2.5L11,51.6L12.3,52.5z M10,50.8v-1.9H8.6v1.9H10z M10.3,54.5 v-2.1H8.6v2.1H10.3z"></path><path id="XMLID_34_" d="M13.1,56.3v-9.2H15v7.4h2.7v1.7H13.1z"></path></g><g class="area br"><circle cx="51.5" cy="51.5" r="9.8"></circle><path id="XMLID_22_" d="M51.2,52.5v3.8h-4.3L45.6,55v-7.9h3.9l1.3,1.2v2.5l-0.9,0.7L51.2,52.5z M48.9,50.8v-1.9h-1.4v1.9H48.9z M49.2,54.5v-2.1h-1.7v2.1H49.2z"></path><path id="XMLID_26_" d="M55.5,56.3L54.4,53h-0.5v3.3H52v-7.9l1.4-1.3h3.9v5.8h-1l1.2,3.3H55.5z M55.4,51.2v-2.4h-1.5v2.4H55.4z"></path></g></svg>

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.5 KiB