kreso-t / cncjs-kt-ext Goto Github PK
View Code? Open in Web Editor NEWAuto-leveling extension for CNCjs
Auto-leveling extension for CNCjs
I'm not sure if this is really an issue with the auto-level program but when I run it the drill (connected to the probe) lowers until it hits the pcb and then the probe alarm goes off and it stops.
Is there any other setting I need to set in the CNC for the probing to continue probing the pcb?
I have a Sainsmart 3018.
Below is the console log:
feeder> (#autolevel P1 X30 Y30)
feeder> (AL: no gcode loaded)
feeder> (AL: auto-leveling started)
feeder> (AL: probing initial point)
ok
feeder> G21
ok
feeder> G90
ok
feeder> G0 Z2
ok
feeder> G0 X2.500 Y2.500 Z2
ok
feeder> G38.2 Z-3 F25
ok
feeder> G10 L20 P1 Z0
ok
feeder> G0 Z2
ok
feeder> (AL: probing point 2)
ALARM:1 (Hard limit)
[MSG:Reset to continue]
Leveling proceeds fine, but at the very end this has happened to me several times already and it seems random:
probed 363/364> 124.558 65.748 -0.020
probed 364/364> 129.748 65.748 -0.035
apply leveling
**Leveling applied
zlib.js:623
var newReq = self._handle.write(flushFlag,
^
TypeError: Cannot read property 'write' of null
at Zlib.callback (zlib.js:623:32)**
I was trying to use the auto level and my CNCjs yesterday. I am new to this field and tools. So, I was playing a lot with Flatcam + CNCjs + your plugin.
As I could understand, I can't run the auto level twice. It will make things deeper than expected (I guess).
So, my question is, what happens when we use the auto leveler twice? It will use the originally uploaded gcode, or the previews altered gcode?
Also, if it uses the previews altered gcode, it will mess the final product or it will keep it fine?
If this is some kind of bug, is it possible to always use the original file for the auto leveler as the input of this plugin instead of using the already altered file?
Right now, I am using the terminal output to see cncjs-kt-ext
progress. I dont't like this, because I have to ssh to my RPi. So, do you know if there is a way to see its output somewhere embedded in the CNCJs page?
The currently latest version of cncjs (1.9.20) running on raspbian buster puts double quotes around the secret string within the ~/.cncrc file, so the autolevel script fails with:
Connection error. { message: 'invalid signature',
code: 'invalid_token',
type: 'UnauthorizedError' }
The quotes and extra spaces should be stripped. I did it using
export CNCJS_SECRET=$(grep secret ~/.cncrc | sed "s/[ \t]+//g" | tr ',' ' ' |cut -d':' -f2 | sed 's/"//g' | sed 's/ //g')
Then it worked:
pi@marvin:~/cncjs-kt-ext $ node . --port /dev/ttyUSB0
Connected to ws://localhost:8000?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1ODQyOTE1NzMsImV4cCI6MTU4Njg4MzU3M30.Cx8GRr6STsfxvJZA73OSEem2aOsLBnkwXdYzct1rJxE
Connected to port "/dev/ttyUSB0" (Baud rate: 115200)
By the way, this extension works great and is a must for anyone using cncjs to make PCBs. Thank you very much for providing it.
The autolevel plugin ignores G20/G21 commands, assuming that the input GCode is in mm. I ran output from FlatCAM in inches and caused a machine crash because the offsets were applied assuming mm but machine movement ended up being 25.4x (causing the engraving bit I was using to explode in spectacular fashion).
AL probes the first row fine, but then every time "skips" the rest. X and Y move to each subsequent pos, but Z doesn't lower at all. As if would register a false triggering of probe. Probe works fine and does not have interference.
When it's doing this skipping, if I manually trigger the probe AL again continues probing fine at least for few points. It seems more like an issue of AL not understanding g2core edge triggered probe signals / some probe limit state getting stuck or such. Maybe the 'PROBE OFF' signal comes so fast that AL doesn't register it.
This is on Windows 10, so communication delays might be different?
Not sure if I'm doing some order of operations incorrectly, I had 1 decent run and since then cannot replicate. Steps I follow:
Using machine 3018 cnc with Woodpecker 3.4 control board
Using this test gcode:
test-cnc-flatcam.txt
Get the following error message when starting.
I have set the port option to the correct serial port as well.
Connected to ws://localhost:8000?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IiIsIm5hbWUiOiJjbmNqcy1hdXRvbGV2ZWwiLCJpYXQiOjE1NjQzMjQ3NzcsImV4cCI6MTU2NjkxNjc3N30.ed3RVJ13fwN-h3MHlWYYl8_IfgZN82m68-UuQtAx7YQ
/home/pi/src/cncjs-kt-ext/autolevel.js:21
socket.on('gcode:load', (file, gc) => {
^
TypeError: Cannot read property 'on' of undefined
at new Autolevel (/home/pi/src/cncjs-kt-ext/autolevel.js:21:11)
at callback (/home/pi/src/cncjs-kt-ext/index.js:99:19)
at Socket.<anonymous> (/home/pi/src/cncjs-kt-ext/index.js:94:3)
at Socket.Emitter.emit (/home/pi/src/cncjs-kt-ext/node_modules/component-emitter/index.js:133:20)
at Socket.onevent (/home/pi/src/cncjs-kt-ext/node_modules/socket.io-client/lib/socket.js:278:10)
at Socket.onpacket (/home/pi/src/cncjs-kt-ext/node_modules/socket.io-client/lib/socket.js:236:12)
at Manager.<anonymous> (/home/pi/src/cncjs-kt-ext/node_modules/component-bind/index.js:21:15)
at Manager.Emitter.emit (/home/pi/src/cncjs-kt-ext/node_modules/component-emitter/index.js:133:20)
at Manager.ondecoded (/home/pi/src/cncjs-kt-ext/node_modules/socket.io-client/lib/manager.js:345:8)
at Decoder.<anonymous> (/home/pi/src/cncjs-kt-ext/node_modules/component-bind/index.js:21:15)
Hi guys this get me to broke two tools after probe failed, in other probes it usually return to zero.
I will take a look on how it can be done and do a PR.
Any toughs on that ?
Issue: Some combinations of input parameters can result in NaN
for X/Y travel coordinates during probing
Root Cause: Division-by-Zero may occur in this code segment:
let dx = (xmax - xmin) / parseInt((xmax - xmin) / this.delta)
let dy = (ymax - ymin) / parseInt((ymax - ymin) / this.delta)
Test: (#autolevel P1 X14 Y56)
Background:
(xmax-xmin)
evaluates to X
- 5mm. If X
< 15mm parseInt((xmax - xmin) / this.delta)
evaluates to 0 and dx will evaluate to NaN. Same for dy for Y
values < 15mmProposed fix: Ensure parseInt(..)
-denominator is evaluating to >= 1, e.g.
let dx = (xmax - xmin) / max(parseInt((xmax - xmin) / this.delta), 1)
let dy = (ymax - ymin) / max(parseInt((ymax - ymin) / this.delta), 1)
Note: I have not checked for potential side-effects of the proposed fix!
Thanks for this great plugin!
Hi. Thanks for your work on this. This is not an issue, but rather a question.
Have you set your environment up to auto start this application when the host starts?
If so, how did you do it. I've looked at using /etc/rc.local with a delay start to give CNC.js time to start up but not sure if this is the best way.
When I run the autlevel with the attached gcode,
I get the following terminal output and my x/y axis is (of course) not moving.
CNCjs 1.9.23 [Grbl]
Connected to /dev/ttyUSB0 with a baud rate of 115200
feeder> (#autolevel)
ok
feeder> (AL: Opened probe file __last_Z_probe.txt)
feeder> (AL: auto-leveling started)
feeder> (AL: probing initial point)
ok
feeder> G21
ok
feeder> G90
ok
feeder> G0 Z2
ok
feeder> G0 X1.273 Y1.273 Z2
ok
feeder> G38.2 Z-3 F25
ok
feeder> G10 L20 P1 Z0
ok
feeder> G0 Z2
[PRB:3.273,-86.728,-34.544:1]
ok
feeder> (AL: probing point 2)
ok
feeder> G90 G0 X1.273 YNaN Z2
ok
feeder> G38.2 Z-3 F50
ok
feeder> G0 Z2
error:2 (Bad number format)
feeder> (AL: probing point 3)
[PRB:3.273,-86.728,-34.541:1]
ok
feeder> G90 G0 X11.468 YNaN Z2
ok
feeder> G38.2 Z-3 F50
ok
feeder> G0 Z2
error:2 (Bad number format)
feeder> (AL: probing point 4)
[PRB:3.273,-86.728,-34.541:1]
ok
feeder> G90 G0 X21.664 YNaN Z2
ok
feeder> G38.2 Z-3 F50
ok
feeder> G0 Z2
error:2 (Bad number format)
feeder> (AL: probing point 5)
[PRB:3.273,-86.728,-34.541:1]
ok
feeder> G90 G0 X31.859 YNaN Z2
ok
feeder> G38.2 Z-3 F50
ok
feeder> G0 Z2
error:2 (Bad number format)
feeder> (AL: probing point 6)
[PRB:3.273,-86.728,-34.540:1]
ok
feeder> G90 G0 X42.055 YNaN Z2
ok
feeder> G38.2 Z-3 F50
ok
feeder> G0 Z2
error:2 (Bad number format)
feeder> (AL: probing point 7)
[PRB:3.273,-86.728,-34.541:1]
ok
feeder> G90 G0 X52.250 YNaN Z2
ok
feeder> G38.2 Z-3 F50
ok
feeder> G0 Z2
error:2 (Bad number format)
feeder> (AL: probing point 8)
[PRB:3.273,-86.728,-34.540:1]
ok
feeder> G90 G0 X62.446 YNaN Z2
ok
feeder> G38.2 Z-3 F50
ok
feeder> G0 Z2
error:2 (Bad number format)
feeder> (AL: probing point 9)
[PRB:3.273,-86.728,-34.541:1]
ok
feeder> G90 G0 X72.641 YNaN Z2
ok
feeder> G38.2 Z-3 F50
ok
feeder> G0 Z2
error:2 (Bad number format)
[PRB:3.273,-86.728,-34.540:1]
ok
ok
feeder> (AL: dz_min=0.022, dz_max=0.025, dz_avg=0.023)
feeder> (AL: applying compensation ...)
feeder> (AL: loading new gcode #AL:lukas-eid - cutout.ngc ...)
ok
feeder> (AL: finished)
ok
ok
ok
>
pi@raspberrypi:~/cncjs-kt-ext $ npm install
npm WARN [email protected] No repository field.
added 226 packages in 11.663s
pi@raspberrypi:~/cncjs-kt-ext $ node . --port /dev/ttyACM0
Connected to ws://localhost:8000?token=XXXXX
/home/pi/cncjs-kt-ext/autolevel.js:21
socket.on('gcode:load', (file, gc) => {
^
TypeError: Cannot read property 'on' of undefined
at new Autolevel (/home/pi/cncjs-kt-ext/autolevel.js:21:12)
at callback (/home/pi/cncjs-kt-ext/index.js:147:19)
at Socket. (/home/pi/cncjs-kt-ext/index.js:142:3)
at Socket.Emitter.emit (/home/pi/cncjs-kt-ext/node_modules/component-emitter/index.js:133:20)
at Socket.onevent (/home/pi/cncjs-kt-ext/node_modules/socket.io-client/lib/socket.js:278:10)
at Socket.onpacket (/home/pi/cncjs-kt-ext/node_modules/socket.io-client/lib/socket.js:236:12)
at Manager. (/home/pi/cncjs-kt-ext/node_modules/component-bind/index.js:21:15)
at Manager.Emitter.emit (/home/pi/cncjs-kt-ext/node_modules/component-emitter/index.js:133:20)
at Manager.ondecoded (/home/pi/cncjs-kt-ext/node_modules/socket.io-client/lib/manager.js:345:8)
at Decoder. (/home/pi/cncjs-kt-ext/node_modules/component-bind/index.js:21:15)
pi@raspberrypi:~/cncjs-kt-ext $ node -v
v8.11.1
Any ideas? cncjs is up and running
If I run the standard Probe command in CNCjs, everything works as expected.
But when I run (#autolevel), the z axis just drives straight into the PCB at full speed causing havoc.
what could be the issue?
Hi!
I'm trying to use the current repo version with cncjs 1.9.22, but I cannot get it to work.
When kt-ext connects to the serial port it spits out:
/dev/ttyUSB0: line 1: $'\r': command not found
/dev/ttyUSB0: line 2: Grbl: command not found
/dev/ttyUSB0: line 3: [MSG:$H: command not found
/dev/ttyUSB0: line 3: $X: command not found
...
As if its trying to interpret or run the output from the serial port, when this happens, the cncjs UI locks up as if it does not have contact with grbl anymore.
Hi!
Sorry my english, and the bothering...
The documentation is a bit incomprehensible. The probeopen needs to run before autolevel, or after autolevel? What happened if i use probeopen and the file is exists? The exists file is applied to gcode, or the exists file overtwritten by the new autolevel datas?
In my opinion this needs to clear. Maybe need a probesave command, or a overwrite parameter to the probeopen command.
What if the gcode has an applied autolevel. the new autolevel owervrites that or modify the previous autolevel datas?
How to stop the autoleveling?
The autoleveler can work in:
(probeopen)
(#autolevel)
(probeclose)
the autolevel reapply working from previously saved file? How? need a probeopen before?
I'm doing a pocket clear for a PCB I'm milling. When I do the autolevel script the gcode gets changed to add these very large loops in the cutting path. It seems like it might be associated with file size. If I do just a trace to isolate the paths and then do the autolevel, it seems to work just fine.
Hey thanks for making this! Looking forward to trying it out. I was trying to use it last night by typing (#autolevel) into the console and the autolevel kept crashing. After poking around the code I noticed that context was undefined in the start function. It looks to me like when you send the command from the console context is not set but if you send the command from a macro then it is set. Any idea why this is? Is that a bug in CNCjs?
Duplicate issue.
I found that somehow the first point start measuring from 1mm above the 0, while the others from 1mm above the previous position (or absolute, not sure).
So if you are not manually probing in the same spot as the first auto level point you can have an undesired offset.
I found it by manually positioning the bit very close to the pcb and then zero the Z axis, after that I ran auto level as usual. Doing that I had always a pretty deep point in the area around the first autoprobe point, breaking few bits while trying to figure it out.
Hi!
Sorry about this new bothering. I'm created a copper removal GRBL. The file (because the 8.99 flatcam is buggy, and only one thin tool is used) is a little big (33mb). Unfortunately, i'm deleted after unsuccessful auto leveling. The autoleveler, is got the file and the logs shows the working on it. 0-to ~150000 lines. Then Printed in the log the reloading message, but the modified file is not loaded to cncjs. It is not a big problem, the file is big because the flatcam is do something wrong. i'm cant reproduce this big file.
Now created a smaller multi tool GRBL on this, the work is done. But looks like something not ok. See the attached picture. The isolation routing dreamy nice and precise, but the copper cleaning is odd. I'm attached the original grbl if you testing it. Im attached the height map, but i'm can't known where is the uploaded or modified GRBL in cncjs,
And another problem, when the program is modify the GRBL why delete the notes? When comes a toolchange routine, i not see what tool is need, because the tool dia message is vanished.
"
M6
(MSG, Change to Tool Dia = 1.9600)
M0
"
in a two tool GRBL is not a big problem, but in a 10 tool GRBL is mutch bigger.
Thank you for work!
How do I discard current values to perform the auto-level again?
I am running this as a service, and I do' want to restart the revise every time, so but it happens that it is not running 2 times in a row. I am not sure if I am doing something wrong, or if this is something that can be improved.
For instance, a command to discard current values would be a good idea if it doesn't have such a thing.
What do you think @kreso-t
Hi!
I'm bothering again. I known i'm boring.
I'm stingy. In my country the current PCB size is mostly 160X100mm If i mill a PCB and the pcb is smaller than size i'm reuse the pcb. Now i try to mill two pcb and i created two draw next to each other, and mill one after another. Less toolchange, less configuration. The first is no problem, the leveling is good, but the second's start and end point is X110Y0 to X145Y-45 If i start the autolevel, the autoleveling process not start the X110Y-45 but X0Y-45. But that area is milled, so, the AL is failed. Any idea? I know that create one cncjob with two project. But thets is not always possibly.
After making the auto-leveling, I see these diagonal lines appearing.
This is the original board loaded in CNCjs
Here is the end result in FlatCam.
I am making only the isolation routing.
I believe these lines are just the travel movement, but they are being drawn in my PCB as you can see below.
Do you have any idea why this happens?
Hi, I am loading many gcodes to make one board, and after some time I cannot use the autolevel command again on the same board since there will be areas without copper.
My question is when I load a new gcode, does the cncjs-kt-ext apply the previously generated configs in Z-axis in this new file?
If not, is it possible to create a new command to update the be gcode with the later configuration? For example, it could be called something like "reapply_last_autolevel_config"
Would it be possible to explicitly define (xmin, ymin)? My current gcode starts at (15,3). I would expect that autoleveling starts at these coordinates, what is encouraged by your README. However, when starting autoleveling it starts at (0,0) instead of (15,3). This is troublesome because (0,0) is right at the edge of my work piece and might not necessarily provide probe contact. What am I missing?
Hi, I have a question about this line
code.push(G38.2 Z-${this.height + 1} F${this.feed / 2}
)
This pushes the Z-probe Z-3 before the probe fails and even worse if you increase the height the probe will even get worse until the probe fails. For safety I would like to create the test height map for about max. 0.3 mm. So what is the intended idea about this line?
Best Regards,
Manuel
After installing cncjs with the PM2 method listed on their site, And the PM2 install for this extension I can't get the macro's to do anything.
, After setting the work space to 0,0,0 I send the macro to the serial console and the serial console responds with OK.
pm2 list shows that it was active along side of cncjs. It may have been working at this point but the issue was with me somehow.
I reinstalled using the raspberry pi script found on cncjs github and that method seems to use NPM to install. So I used that method to install this extension but it fails because the .cncrc file is missing from the home directory. Looking around I believe I found it in /cncjs/cncrc.cfg, I made a copy of it and moved it to /home/pi/.cncrc, but after running the "node . --port /dev/ttyACM0" command but it seems to hang and I have to ctrl+c to get out.
Also I tried to manually input the data in the string with the correct --id, --name, --secret, --port, --baudrate, --socket-address, --socket-port as I found in another issue report and got this.
`pi@cnccontroller:~ $ node . --id '40000205-fa31-4a6f-b692-e9830da19e5e' --name 'Bob' --secret '$2a$10$pfq4X0aZhxXnAN8Y1dWKOu' --port '/dev/ttyAMA0' --baudrate 115200 --socket-address 'localhost' --socket-port 80
internal/modules/cjs/loader.js:638
throw err;
^
Error: Cannot find module '/home/pi'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
at Function.Module._load (internal/modules/cjs/loader.js:562:25)
at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
pi@cnccontroller:~ $
`
The install script is a way better option in my opinion to get up and running fast and much easier for most people. Is there a way to get this extension running when installed that way?
I also tried older versions of cncjs just in case the .cncrc file was moved in the newest version but it's the same.
Hi everyone, i try to get the autolevel running but without sucess.
i follow the pm2 install from the main readme of the repo:
this is how it looks.
but if i load a gcode an run the macro i just recive an "ok" without the cnc maschin is doing anything
what am i doing wrong? how can i get error messages?
thanks in advanced
kind regards
matze
Hi,
after autolevel a lot of circle are added to gcode.
Thanks
Issue running CNC.
@kreso-t I was not able to make a good PCB, yet.
Can you assist me with that?
I am using Kicad to create a simple/single-layer board.
Then I am exporting Gerbers in millimeters.
After, I am importing the B.Cu
layer in Flatcam
And exporting the Gcode with the following settings:
G21
saying units are millimeters. And the Z travel distance is -0.05 mm too.Then, running CNCJs and CNCJs-Kt-Ext, I am:
(# autorun)
macro. With probes. This process works perfectly. The .gcode is updated and the text #AL
is added on the .gcode name at the bottom of the page.What I am doing wrong? Do you have any idea?
I don't know if step #3 is correct.
Can this be installed and used with the Windows versions of CNCjs?
If so, please provide install instructions.
When I use the Autoleveling function, he changes the gcode so that he mows deep into the board. I have already installed a 100 nf CAP.
Gcode before autoleveling
Axis Min Max dimension
X 0.000 mm 91.486 mm 91.486 mm
Y 0.000 mm 65.814 mm 65.814 mm
Z -0,100 mm 20,700 mm 20,800 mm
after carlevel
Axis Min Max dimension
X 0.000 mm 91.486 mm 91.486 mm
Y 0.000 mm 65.814 mm 65.814 mm
Z -1,345 mm 20,700 mm 22,045 mm
Output Commandline
STEP: 25 mm HEIGHT: 0.7 mm FEED: 100
WCO: {x: -1.8136, y: -1.2275, z: -0.014300000000000007}
probed 1/12> 0.000 0.000 0.000
probed 2/12> 1.201 0.000 0.006
probed 3/12> 2.401 0.000 0.006
probed 4/12> 3.602 0.000 -0.003
probed 5/12> 0.000 1.296 0.005
probed 6/12> 1.201 1.296 0.010
probed 7/12> 2.401 1.296 0.009
probed 8/12> 3.602 1.296 -0.005
probed 9/12> 0.000 2,591 0.005
probed 10/12> 1.201 2.591 0.012
probed 11/12> 2.401 2.591 0.008
probed 12/12> 3.602 2.591 -0.007
apply leveling
Leveling applied
Can someone help me what is not going right here I use as a unit mm (G21)
Generally compensation is working, but seeing some incorrect conversions:
Codes without explicit X, Y converted to XNaN, YNaN
Source: G00 Z15.0000 --> Compensated: G00 XNaN YNaN Z15.003 ; Z15.000
Negative X,Y coordinates being mapped to positive equivalents
Source: G01 X-0.0743 Y20.3199 --> Compensated: G00 X0.0743 Y20.3199 Z15.003 ; Z15.000
Hey,
how do you start the service?
I think it is a bit complicated to do this everytime in the shell?
I tried it via the commands from cncjs but this did not work.
Can i make it to auomatically start when starting my Rapsberry?
Installed yesterday through cloning.
Pasted the command into a macro and run it when my tool has been zeroed to 0,0,0
This is all I get
feeder> (#autolevel)
ok
I have an account set up on cncjs and that didn't make a difference.
I have cncjs installed on a Raspberry Pi. Cncjs is running on port 8000. I am unable to connect to it from this extension. The command that I am using is node . -i "3577d143-82a2-4ad9-8f37-17d3e783d735" -n "justin" -s "REDACTED"
. I copied the value of the -s
argument from the secret
property of the ~/.cncrc
file that is on the Pi.
The error that I get is :
Connection error. {
message: 'invalid signature',
code: 'invalid_token',
type: 'UnauthorizedError'
}
I have tried replacing the -s
value with the password that I use to log in to the cncjs UI. I have also tried using the hash value for users.password
from ~/.cncrc
. I've tried passing these values with and without quotes, but the error message is the same.
I'd really appreciate it if one of you could explain what I am doing wrong.
Hi,
I'm trying to use your extension, but when I run the macro from the app, nothing happens.
Do I miss something ?
Running cncjs app 1.9.20 and the master branch of your repo
Regards
in the linux console i can verify that the extension is connected to the serial port as well as the websocket (at least the logs say so).
but when i send "(#autolevel)" through the ui console OR through a macro, nothing happens and i also do not get any further logs...
Issue: Killed my CNC probe tip when starting the plug-In. While totally my own fault I suggest to add some level of protection to the code since it works with absolute G0 coordinate moves.
What happed: I zero'd out WCO of my machine to the vice surface. Then I added a piece of wood to the vice and forgot to redo Z-offset... Started the plug-in. The absolut move to Z2
by the plug-in - which was now 30 mm below the wood's surface - rammed the 3D probe tip into the material and broke it.
How to prevent: During start of plug-in add a test current position if Z-height from context is <= 2mm
and stop execution with Error
if current position is above.
Reasoning: Upward moves are typically safe while absolute downwards moves with G0-speed can lead to disasters ;-) So instead of unconditionally doing a G0 move the user should safely bring their probe's tip to a safe Z-starting point before auto-levelling starts. This way all G90 G0 moves are only upwards while all downward moves are protected due to usage of G38.2.
If implemented an additional usage note should be added. Something like "Note: This plug-in can only be started if the machine has already been moved to a safe starting Z-Position of 0..2mm before activation."
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.