Accessibility for a blind on MeerK40t

I am a blind programmer, and I discovered that I can create drawings by writing SVG code. I have a laser cutter at home and I used it to make toys.

Since I cannot see, I write every line and curve where I want the cut to occur. I can’t see the design, so the computer reads aloud all the code I write. Then, I cut a piece and check what corrections are needed.

This has worked for years, but I am having trouble with different scaling for the X and Y axes. My machine’s original software (CorelLaser) cannot scale X and Y differently, so I am looking for another solution.

I managed to install and connect MeerK40t on an Ubuntu Linux laptop, and I can get through the middle of the process—importing the file, selecting elements, assigning them to an operation, and setting the cutting speed. However, I cannot transfer the operation to the cuter.

My designs are simple, and I can define colors and lines via code. I often need to group paths to move them across the bed or rotate them to fit the available space correctly. In some cases, I need to scale a part so I don’t have to rewrite every coordinate.

I just want to set the speed and send the design directly to the cutter.

The MeerK40t interface was designed for mouse operation, but I need to use the keyboard. I need the screen reader to announce the names of the controls, but many of them are images without descriptions.

I tried adding buttons to the interface by editing the program’s source files, but I only ended up generating a multitude of errors.

It is possible to navigate the menus and even operate some buttons and controls, but most are “invisible” to the screen reader. When I try to send commands to the console, the focus gets stuck inside the command box, and I cannot read the output.
.
When I press the “home” button, the head moves to the starting position, so the machine is correctly connected to the software. So I tried using meerk40t --console with these commands:

element* select
classify
operation0 speed 15
spool
start

But nothing gets sent to the spooler.

In gnome-terminal, sending commands returns a bunch of timestamps—which are annoying when you want to read a dozen lines and the screen reader insists on announcing the time before reading each line. So, I wrote a small server in Go to access the terminal via the browser, allowing me to filter out those unwanted elements. This way, I can clear elements and operations, load the file, select and sort the elements, and view the operation to assign the cutting speed. It works up to this point.

With the help of a sighted person, we managed to send a job to the cutter, and it worked correctly. So, we know it works. It’s just a lack of software accessibility or something in the SVG file I need to change.

I’ve noticed that when I save the project, information such as the cutting speed remains written in the file. However, a set of coordinates is included alongside the drawing, so I can’t simply swap one drawing for another within the project because of these codes that I can’t reproduce.

My dream would be to do something like:

meerk40t cut "draw.svg" speed=15

I tried K40 Whisperer, but my screen reader can’t read absolutely anything in it—it doesn’t even announce the window title. However, I know it installed correctly because some keyboard shortcuts—like returning the laser to the home position—actually work!

Here is an example of a flat-pattern box design:

<svg width="60cm" height="40cm" viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg" version="1.1">
<g stroke="#ff0000" stroke-width="1" fill="none">

<!-- planified box 151x181 -->
<g transform="translate(13, 3)">
<path d="M 30.5 30.5 v -20 l 0.5 -0.5 v -10 h 89 v 10 l 0.5 0.5 v 20 h 0.5 v -30 h 19.5 v 30 l 0.5 0.5 h 10 v 119 h -10 l -0.5 0.5 v 30 h -19.5 v -30 h -0.5 v 20 l -0.5 0.5 v 10 h -89 v -10 l -0.5 -0.5 v -20 h -0.5 v 30 h -19.5 v -30 l -0.5 -0.5 h -10 v -119 h 10 l 0.5 -0.5 v -30 h 19.5 v 30 h 0.5 z" />
</g>

</g>
</svg>

Thank you for your attention and effort.

Ângelo Beck

I moved this from Community to Lasers > Meerk40t so that the Meerk40t developers see it more easily.

You might want to try the Meerk40t discord server, or the github repo.

Accessibility isn’t exactly obvious. I understand. Back when I could see, I created a few pages. Later, I went blind and couldn’t navigate them myself! I posted in the wrong thread because the screen reader announced “new topic” right alongside the messages from MeerK40t… I thought it was related. And I’m posting here because I couldn’t find the right place on GitHub. Look, I have a GitHub account: angelobeck (Angelo Beck) · GitHub … You have no idea how hard it is to navigate there amidst the huge number of links. If you’d be willing to repost it there, I’d be very grateful.

MeerK40t is designed in such a way that most of the buttons and menus actually just trigger console commands directly. They get displayed in the “console” pane when you click on the button.

Most of that isn’t really documented in a screen-reader friendly kind of way, I will admit.

To start a burn use this console command:
planz clear copy preprocess validate blob preopt optimize spool

All of that from planz to spool is one command on a single line.
It’s long-winded, but each of those represents one of the steps required to go from design to something the laser device understands.

You specifically mentioned wishing to scale items, which Meerk40t can do. Here is an example that keeps x-axis scaled at 1, and y-axis scaled 2 times larger:
element* select
scale 1 2

As another option for running files in Meerk40t:
You may find the hyphen hyphen auto command-line switch useful, it is meant for the purpose of loading a file, classifying the operations according to color, and immediately burning it.

I don’t know how well screen-readers work, and I’m not sure how well the translators work, since I have discovered you are from brazil. So I will put that start laser command in quotes here a few different ways, hopefully that will prevent it from being mangled by a translator.

planz clear copy preprocess validate blob preopt optimize spool
“planz clear copy preprocess validate blob preopt optimize spool”
planz clear copy preprocess validate blob preopt optimize spool

Sorry for the delay in replying.

It looks like we’re making some progress with the command you sent. However, the software freezes within the first few seconds of starting the cut.

I wasn’t able to reinstall the software in time to provide a more precise diagnosis.

All the documentation I’ve found focuses on windows, panels, menus, and buttons.

Using the find and help commands in the console allows me to discover some keywords, but there is very little explanation on how to use them. It doesn’t explain how to combine the words. Where can I find documentation that explains the line you sent me? The individual words don’t work on their own. It’s all very mysterious to me!

I am immensely grateful for all your help, and—if it’s not too much to ask—could you help me find more in-depth documentation on the console commands?

I certainly want to dedicate myself to developing anything that makes my life easier, and if my contributions could be useful to the community, I am happy to share my work.

It might not make sense to make the software accessible, given that I don’t know any other crazy blind people who like to draw using code and own laser cutters at home! However, if there is anything I can contribute regarding translation into Portuguese or MeerK40t’s accessibility, I would love to stay in touch with someone who can provide guidance.

Best regards,

Ângelo Beck

Unfortunately, there isn’t really more in-depth documentation on the console commands. Most commands can be chained together to form longer expressions. You can see what type of argument each command takes using the help command. Help shows you various example usages of a command, and the input and output parameters. These are structured in the help as parentheses containing the input type, then hyphen greater-than sign that denotes an arrow, then the command name, then another arrow, then another set of parentheses with the output type.

Many commands that specify some type of object in Meerk40t can be filtered or indexed with a suffix attached to the command name. You’ve already discovered this with commands like element* select
With that command you ask for a list of elements (individually) and filter them by the asterisk, which means wildcard (or in other words – all the elements), and then you chain the result of element* to the select command. Which has the effect of selecting all the elements.
But you could just as similarly had set element0,3,4 select to select the 0th, the 3rd, and the 4th element.

So for the example that I provided:
planz clear copy preprocess validate blob preopt optimize spool

if you check each of those words with help command:
help plan shows plan<?> : issue a command to modify the plan which means that planz will chain the plan with the name z, which is the default plan name when you initiate actions in the UI.

Then you read help clearto discover that clear takes a (plan) and returns a (plan) – that’s good, you gave it planz and what that does is to clear out the previous plan because you don’t want to burn the previous one, you would like to create a new one.

Then you use help copy and you see that it can input a (plan) and output a (plan) The help command isn’t helpful telling you what the copy command does with the plan, but you might guess that it copies data from your design into the plan ready for the next step of the process.

help preprocess tells you it prepares the plan for execution, which isn’t very informative but it is a necessary step towards burning a plan.

And so on, for each of the commands that I chained together to create a “burn”.

“The software freezes within the first few seconds of starting the cut.”
There may be a bug with the program causing this. If you can share the svg file and an exact set of steps you are using to prepare/burn the file, we might be able to reproduce the issue and get it fixed.

I don’t know if Discord is navigable to you or not, (if not, that’s ok, we are watching this forum) but the Meerk40t Discord server is the best place to communicate with the majority of testers/developers/translators. It is not very busy at the moment, reflecting the fact that Meerk40t development itself is not very busy at the moment, but we will try to help. MeerK40t