PixelCNC v1.66b/v1.67b - Requested Changes, hotfix, etc...
(Note: a v1.67b hotfix update went out within 24 hours of the v1.66b update's release. This was to fix the Default Configuration option being broken in the v1.66b update. The rest of this post is left as it was for v1.66b.)
This is a relatively small update to PixelCNC that includes a few new features and changes. A user has been working on using PixelCNC for more 2D/2.5D type milling projects, importing vectors and working with the paths-layers to cut out specific 2D/2.5D shapes at a usable quality. This isn't something PixelCNC is specifically designed for, per se, as it was always intended for more relief-carving type projects but does include provisions for cutting things out (via the Profile Milling operation type) and a few other tidbits.
This update is meant to facilitate using PixelCNC for less artistic endeavors and more mechanical part fabrication type projects. PixelCNC is still deeply rooted in its image-based toolpath generation, which means that even when generating toolpaths from paths-layers (which can be loaded from 2D vector file formats) the toolpath quality is limited by a project's canvas resolution. Hence, to achieve a 0.01" precision a project's canvas will need to be 100 pixels/inch, at the very least.
PixelCNC is really not suited for fabricating mechanical parts, but it can be done. I've used it on several occasions to create various mechanical parts that didn't require exacting +/-0.001" precision, obviously, just because I didn't want to fiddle with other software - and it seemed like the fastest and easiest way to do what I was trying to do.
Fit to Canvas Option
A new Fit to Canvas option is available when loading images/vectors/models via the Create Layer dialog which can be disabled in order to create the layer using either the native scaling the file was created with. PixelCNC's original behavior was to fit a layer created from media to the project's canvas dimensions. This can now be disabled as needed, though it defaults to being enabled to retain original behavior for the more artistically-minded that use PixelCNC for art, signs, engravings, etc..
There was a function added a while back that allowed scaling a model-layer according to the original geometry's native vertex coordinates. This can be accessed on the left-side of PixelCNC's interface while a model-layer is selected. It includes a parameter for applying a scaling factor as well such as to convert a model with inch coordinates to millimeters and vice-versa, or otherwise. This is a feature that has not enjoyed a similar implementation for other layer types, specifically paths-layers - which are the representation that DXF (and SVG) files can be loaded as.
There are some technical limitations involved around how paths-layers were originally implemented that are deeply ingrained into PixelCNC and prevent creating an equivalent to the model-layer's Scale By Geometry function for them. Once the vector data is loaded from a DXF/SVG it is converted into cubic spline paths and then the actual path data is normalized to its bounding rectangle so that actual path coordinates occupy a space that is only defined by the layer's dimensions themselves. This was an implementation decision that was made to make it easier to scale and manipulate paths-layers as a single entity without having to go in and actually re-calculate new path node coordinates each time a layer is scaled, moved, or rotated. This means that all original vertex coordinate data is completely lost. Model-layers, in contrast, load the raw vertex data and store a calculated XYZ normalization factor instead - leaving the original model geometry data alone - to fit the model to its layer's user-manipulatable dimensions. The data is already there to be used by the Scale By Geometry function, which ended up not being particularly difficult to include (at a user's request, no less).
The next best solution, mostly for paths-layers, has been included in this update. When loading an image, vector, or model as a raster-layer, paths-layer, or model-layer, respectively, an option is now available below those layer creation options (on the Create Layer dialog) that allows users to disable the automatic scaling of the layer to fit the canvas volume. When the Fit to Canvas option is disabled images loaded as raster-layers will automatically scale so that their pixel density matches the canvas pixel density. e.g. a 1000x1000 image loaded as a raster-layer to a project with a 100 pixels/inch resolution will result in a 10"x10" raster-layer, regardless of the canvas' dimensions.
There is a caveat, however, with loading an SVG as a raster-layer. The resolution that the vector image is rasterized at is dynamically determined and an arbitrary margin is also applied to ensure that shapes aren't touching layer edges. SVGs tend to raster somewhere around 128ppi and the result is that this is a situation where Fit to Canvas being disabled will not produce a layer that is of any size that's relative to the original SVG's scaling. In any case, users (hopefully) shouldn't really worry about loading raster-layers with Fit to Canvas disabled; it doesn't offer much benefit in most cases. Send an email to firstname.lastname@example.org to let us know if you do need SVGs to load as raster-layers at their native scaling and we will figure it out :)
As for the main reason this option was included: when loading a vector as a paths-layer, DXFs will load at their native dimensions, period. SVGs will be scaled according to the canvas resolution as their geometry coordinates are stored as ambiguous "points" that are in a somewhat arbitrary space. Most SVG files consider these points to map to inches at 96 pixels per inch, sometimes 72, but each file can be different depending on what program created it. As such, to get the original inch/millimeter size of an SVG a canvas with a 96ppi resolution will usually scale the resulting paths-layer back to its real-world measurement units.
Users who wish to load an SVG at its native scaling (bad file format to represent real-world dimensions, just an FYI!) will need to set their canvas resolution to the SVG's original pixel density, load the SVG as a paths-layer, and will then want to increase their canvas resolution up when actually generating any raster-layers or toolpaths from the SVG's paths-layer. 96ppi, or any of the common SVG pixel densities, are not particularly good for PixelCNC CAM work and can lead to poor toolpath quality.
Multi-Handle Layer Positioning
Users can now position layers via the corner/edge layer handles by holding both mouse buttons to drag them around.
The aforementioned user who wanted to be able to work with DXFs to cut out real-world shapes also shined a light on the fact that layers can only be positioned via their central origin handles. They had asked if it was possible to position a layer via the other edge/corner handles, which were meant for sizing and rotating a layer. I deemed it a very necessary addition to be able to move layers around using the corner/edge handles with them serving as the anchor point for the layer as far as snapping-to-grid and whatnot.
There was a momentary issue determining what the best user-input strategy would be to be able to move layers around accordingly, as the CTRL, SHIFT and (with non-text-layers) ALT keys were already all assigned to specific functions when manipulating a layer within the 3D view. The left-mouse button is for scaling via the corner/edge handles while the right-mouse button is for rotating and tilting layers with them. The settled-upon solution was to use *both* mouse buttons to position a layer via the corner/edge handles :D
This should make it much easier to keep a paths-layer that has geometric features coinciding with its volume's edges positioned exactly as desired, relative to other layers and the canvas as a whole.
Invert Paths-Layer Option
2D milling operations (and Medial-Axis Carving) allow for using a paths-layer as contour input for generating toolpaths, in lieu of a Z-plane "waterline" contour of the canvas composition itself. This is handy for quickly loading 2D vector geometry as a paths-layer and generating pocketing, profiling, and V-carving toolpaths from them. The catch was that paths were by default treated as pockets. Nested paths, where you have a path shape inside of another path shape, would then be treated as an island. Another path shape inside of there would then be treated as an island again. i.e. two concentric circles would produce a donut shaped pocket with the central circle path acting as an island while the outer circle path is the initial pocket.
An option has been added to the relevant operations to invert how a paths-layer is toolpathed, so that the canvas is essentially a pocket and a path shape is an island. This is useful for quickly cutting out a part that has a specific shape represented as a paths-layer. Previously, users would need to edit their paths-layer and draw a pocket around the shape they wanted to cut out. This is no longer necessary with this new option.
With the Profile Milling operation it's important to know when to use the Invert option depending on the desired outcome. If the goal is to cut the shape out (i.e. cut outside of the shape) then you'll want to enable the Invert option, and include the desired contour Offset (click the Tool Radius button on the Offset parameter to auto-set the offset for the selected cutting tool). While this can technically be achieved by using a negative offset, the cutting direction won't match, and when using a Cut Width along with tab generation the tabs will be placed at the wrong side. Using the Invert option solves these issues.
Standard Stipple Size Parameters
The Standard Stippling operation's parameters for setting stipple size ranges have been changed to follow the conventions used by the Dithered Stippling operation. Previously, the parameters were specified as percentages of the cutting tool's diameter. One parameter set the minimum stipple size while the other set the size range, ergo the largest stipple would be equal to min+range, rather than just directly setting a maximum stipple size.
The parameters have been changed to absolute min/max stipple size dimensions, and are no longer fractions of the cutting tool's diameter. Existing project files with Standard Stippling operations will automatically convert the old parameters into the new format, and should generate basically the same stipples when regenerated with current and future versions of PixelCNC.
However, there was a small change in the math that scales the stipples which will increase their overall size. Before they were scaled on an exponential curve, now they scale linearly.
Paths-Layer Toolpathing Changes
While adding in the changes mentioned above it was necessary to reconsider how paths that overlap or otherwise intersect the edges of the canvas would be handled. Basically, don't let paths overlap the edges of the canvas! If you want to invert the contouring for an operation, to cut the area outside of paths, make sure you have enough room around the paths. This can be achieved quickly and easily by using the Fit Canvas to Layers function, available on the left side of the interface under Canvas Actions (which is visible when no layers are selected).
The operations that are affected are 2D Offset Milling, 2D Trochoidal Milling, 2D Profile Milling, and Medial-Axis Carving.
Summer's nearing an end up here in the northern hemisphere. Work on PixelCNC has been a bit stagnant, along with traffic and sales, and it's been the case for quite a while now that promotion and advertising are long overdue. Learning materials are also in question (as per usual).
We're still looking for more feedback as to what users would like to see, and/or learn how to do. If you aren't sure whether PixelCNC can be used to make a specific project or do a certain thing, feel free to ask and send us an email about it at: email@example.com
We'd also love to see what people are creating with PixelCNC. Send us photos of your finished works that we can show to the world!
We're going to be working on improving support for generating toolpaths directly from paths-layers, primarily increasing the quality and speed that cutpaths are generated at, as well as the quality of raster-layers generated from paths.