3 unstable releases
0.2.0 | Apr 29, 2024 |
---|---|
0.1.1 | Oct 31, 2023 |
0.1.0 | Jul 4, 2023 |
#344 in Algorithms
146 downloads per month
200KB
4.5K
SLoC
cnccoder
cnccoder is a crate for writing cutting instructions and converting them to G-code for use on 3 axis CNC machines.
Rather than generating cuts from 3D models as FreeCAD and similar software, it allows the user to precisely write the instructions for how the CNC machine should cut and which tools to use.
By providing several helper cutting functions and programs, the crate can then compile these higher level instructions down to G-code.
The crate can also generate project files for Camotics that can be used to simulate the G-code so that it can be verified before ran on an actual machine, reducing the risk of damaging the CNC machine and injury.
G-code does come in several flavors, but so far the project is only targeting CNC machines using the Grbl controller.
Usage example
Example of a simple planing program (from examples/planing.rs
):
use anyhow::Result;
use cnccoder::prelude::*;
fn main() -> Result<()> {
// Create a program with metric measurements where the tool can travel freely at 10 mm
// height, and move to 50 mm height for manual tool change.
let mut program = Program::new(Units::Metric, 10.0, 50.0);
// Create a cylindrical tool
let tool = Tool::cylindrical(
Units::Metric, // Unit for tool measurements
20.0, // Cutter length
10.0, // Cutter diameter
Direction::Clockwise, // Spindle rotation direction
10000.0, // Spindle speed (rpm)
3000.0, // Max feed rate/speed that the cutter will travel with (mm/min)
);
// Get the tool context to extend the program
let mut context = program.context(tool);
// Append the planing cuts to the cylindrical tool context
context.append_cut(Cut::plane(
// Start at the x 0 mm, y 0 mm, z 3 mm coordinates
Vector3::new(0.0, 0.0, 3.0),
// Plane a 100 x 100 mm area
Vector2::new(100.0, 100.0),
// Plane down to 0 mm height (from 3 mm)
0.0,
// Cut at the most 1 mm per pass
1.0,
));
// Write the G-code (for CNC) `planing.gcode` and Camotics project file
// `planing.camotics` (for simulation) to disk using a resolution value
// of 0.5 for the Camotics simulation.
write_project("planing", program, 0.5)?;
Ok(())
}
To run the G-code simulation in Camotics (if installed), simply run:
$ cargo run --example planing && camotics planing.camotics
The cargo run --example planing
command generates the G-code file
planing.gcode
and the Camotics project file planing.camotics
in the
current directory.
The files can then be opened in Camotics by running camotics planing.camotics
.
In this way you can easily simulate your projects.
Whishlist for new features
- Use thiserror with defined errors instead of anyhow.
- More ready to use programs for the
programs/
module, such as, boxes, reusable wood joints. - WASM build and API, the current API is incompatible as it uses enum variants with values for tools and cuts. This is not yet supported by wasm-pack so an alternative API might be needed meanwhile.
- Support for font based text v carving.
- Support for creating a negative v carving cut for inlays.
Contributing
You can help out in several ways:
- Try out the crate
- Report any issues, bugs, missing documentation or examples
- Create issues with feedback on the ergonomy of the crate APIs
- Extend the documentation or examples
- Contribute code changes
Feedback on the ergonomics of this crate or its features/ lack there of might be as valuable as code contributions.
Code contributions
That being said, code contributions are more than welcome. Create a merge request, with your new cuts, tools, programs or other improvements and create a pull request.
Ensure that any new/changed publicly facing APIs have proper documentation comments.
Once a pull request is ready for merge, also squash the commits into a single commit per feature or fix.
The commit messages in this project should comply with the Conventional Commits standard so that the semver versions can be automatically calculated and the release changelog can be automatically generated.
License
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Serde by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Dependencies
~2–28MB
~413K SLoC