v1.50a - Smooth/Smudge Brushes, Model-Layer Scaling, Remove Layer Bottom, Metric Feedrates, Expression Evaluation, etc...

This update includes several features and a number of bug-fixes. This update lumps together feature requests made by users and includes some features that have been planned for PixelCNC since the very beginning of development!

Here's the changes.txt for v1.50a:

  • added support@deftware.org for sending questions/comments/concerns/bugs
  • added smooth mode to raster-layer manual brush editor
  • added smudge mode to raster-layer manual brush editor
  • added math expression evaluation to numeric parameters
  • added Scale By Geometry function to scale model-layers by their geometry's native size
  • added Remove Bottom option to raster/text layer types
  • added metric feed rates when working with metric projects
  • added margin parameter to Fit Canvas To Layers function
  • added ignore-tool-lengths option to operations allowing cut depths greater than tool dimensions
  • added extra decimal place to inch/millimeter parameters and readouts
  • added visual scaling and fading of raster-editing's manual brush to reflect size and value decays
  • added potential fix for images failing to load from paths with unusual characters
  • added total length of operation rapids to simulation mode
  • added estimated operation run time to simulation mode
  • added a Horizontal Milling max depth restriction when a leave stock amount is used
  • added Boost Layer Contrast view setting to improve visibility of raster/text layer contents
  • added min/max constraints when applying a brush stroke to a raster-layer's contents
  • improved 3d view mousewheel zooming input behavior
  • improved Verdana font visibility
  • improved overall layer compositing behavior to reduce miscellaneous artifacting
  • changed console view toggle from tilde to F1
  • changed Fit Canvas to Layers function into a dialog accessible from left UI pane
  • changed raster-layer manual brush editing fade rate into two separate size/value rates
  • changed raster-layer tilt angle limits to +/- 45 degrees
  • changed machine origin percentage knobs to have one-tenth of a percent granularity
  • changed raster-layer editing mode to include layer's boundaries in 3d view
  • changed calculation of layer smoothing, may require adjustment of existing project's layers
  • changed rendering of canvas to exclude raster-layer's heightmap while applying manual brush strokes
  • changed default UI font from Fixedsys to Verdana to improve overall default UI appearance
  • changed values displayed in UI to always use a unispace font (Fixedsys for now)
  • changed 3d view to always render canvas volume's bounding rectangles regardless of project mode
  • changed free trial's G-code export limit from 4000 moves per operation to 8000
  • changed free trial's session time limit from 20 minutes to 30
  • changed default undo memory from 150 to 256 megabytes
  • changed raster/text along-paths function to require paths-layer to be next in layers list
  • changed behavior when running in background to conserve system resource usage
  • changed text-layer editing mode to use more of the window height for font selection
  • changed sweep paths profile position along rail from a percentage to a fractional value
  • removed Tool Length Limits Max Depth from CNC/CAM Settings dialog
  • fixed Horizontal/Pocket Milling not contouring bottom plane of canvas
  • fixed Horizontal Milling cut-ordering bugs caused by large metric projects
  • fixed overzealous cut linking with tessellate operation
  • fixed program not shutting down properly due to memory deallocation issue
  • fixed extreme layer Z-size when merging down an inverted raster-layer
  • fixed cropping not being applied to some generative and editing functions
  • fixed undo/redo not updating parameters for canvas and layer properties
  • fixed inconsistencies when manual brush editing a tilted raster-layer
  • fixed potential freezes and crashes caused by multiple concurrent canvas refreshes
  • fixed expand/contract raster-editing function inadvertently cropping contracted result
  • fixed canvas not updating after a layer is merged down
  • fixed raster-layer manual brush editor not applying single-clicks to layer
  • fixed raster-layer circular tiling function labeling radius parameter as diameter
  • fixed rest-machining prematurely terminating cuts when entering areas of removed material
  • fixed orthogonal path-layer node movement (hold shift key) when layer is rotated
  • fixed Z-scale issue when creating a raster-layer from a model-layer
  • fixed recovered text-layers having zero size during undo/redo

Smooth and Smudge Brushes

Two new raster-layer manual brush modes that have been collecting cobwebs in the todo list since the inception of the canvas system have finally been added in. I'm happy with the smoothing brush mode but the smudging mode could still use a bit more optimization and refinement. They both are affected by the brush shape and value parameters, which dictate the "profile" of the brush as seen in the top-right of the animation above.

Also, the old brush fade parameter that controlled a rate at which the size and value of the brush decreased has now been split into two separate parameters: Size Decay and Value Decay. The greater these values are set the more quickly the brush size and value decrease over a given length brush stroke. Some changes have also been made to the rendering of the brush within the canvas, as well as the effect of the decay parameters animating the size and appearance of the brush too.

Scale by Geometry

In most cases 3D models represent their vertices' XYZ coordinates using an arbitrary scaling that's unrelated to any real-world measurements, which is why PixelCNC defaults to fitting a model-layer within the canvas' dimensions. This is not very helpful for users who do actually use models that are scaled in a specific units of measure and who wish for them to be that scale in their project's canvas.

When a model-layer is selected a new function is accessible via the Layer Actions pane: "Scale by Geometry", to automatically scale the model-layer according to the source model file's geometric dimensions. This opens up a dialog where the user can manually enter a scaling factor or use a pre-calculated one to convert from one of several measurement units to the project's units. The function takes into account any geometry axis swaps that are in place when calculating new layer dimensions.

Horizontal Milling Canvas Bottom

One of the overlooked issues with the contouring algorithm used throughout PixelCNC prevents contouring the bottom plane of the canvas, such as when generating cutpaths. This is simply due to a quirk in the math which works out to where the bottom plane of the canvas is always solid, resulting in no contours being generated.

This causes problems say when a canvas has a pocket that reaches the bottom plane and a horizontal milling operation is created to hog the pocket out. The toolpath calculation algorithm will contour the canvas at Cut Depth increments and if the contouring Z reaches below the operation's Max Depth parameter then it will back up to that depth and generate some contours one more time.

This image shows the behavior with a simple canvas and horizontal milling operation. The canvas is 1.0" thick and our horizontal milling operation has a 0.6" depth of cut with the maximum cutting depth at 1.0". PixelCNC first contours at 0.6" below the top of the canvas to generate cuts and when incrementing to the next layer of cuts another 0.6" deeper it sees that it's gone farther than the max depth, so it backs up to the max depth of 1.0" deep and attempts to contour again. The math "quirk" has always prevented it from actually generating any contours at the bottom plane of the canvas, and as you can see that's now fixed in v1.50a with a layer of cuts at 0.6" deep and 1.0" at the bottom plane of the canvas volume.

The use of a Leave Stock amount would also interfere with a Max Depth that's set to the bottom of the canvas, preventing any contours from being generated as well. To solve the issue the Max Depth parameter of an operation is now restricted to a Leave Stock height above the bottom of the canvas. This ensures that at least one final cut pass is performed at that depth.

Remove Layer Bottom

Both raster and text layer types now have a new option among their properties named "Remove Layer Bottom". This option will ignore the bottom of a raster-layer as well as the bounding rectangle of a text-layer, compositing the layer with the canvas by replacing those areas with the layer's Z-Fill height instead. Any raster-layer whose contents reach the bottom plane of the layer's volume are subject to being omitted when the layer is composited with the canvas while this option is enabled.

This is intended to make it easier to work with images or text that are meant to be standalone shapes as opposed to a cumbersome and unwieldy rectangle that must carefully be hand-tuned in its vertical position, thickness, blending mode, and Z-fill in order to hide the fact that it's a rectangular object. This option makes it much easier to get the desired results for certain projects and designs.

Expression Evaluation

Most of the numeric value editbox parameters can now accept mathematic expressions as input. The expression is evaluated upon hitting Enter or when otherwise de-selecting the editbox (i.e. clicking on or tabbing to something else). While the actual needs of such a feature are usually simple arithmetic type expressions I went ahead and just used an existing 3rd-party library (TinyExpr / codeplea.com) which supports pretty much everything you can do on a scientific calculator: exponents, trigonometry/calculus functions, etc.. which I'm sure the majority of will never get used but it's interesting to have that capability in there. I was tempted to add in the ability to reference other parameters' values as variables so that when entering say a Cut Stepover you could reference the cutter's diameter directly with something like: 0.2*tool_diameter. On top of that, it would be really interesting if it showed the calculated value until you clicked the editbox where it would then let you edit the original equation text that's stored in the background. It wouldn't be too hard to make all this a thing it just takes time, and PixelCNC still has more pressing work to be done with the time there is to work on it.

Estimated Operation Run Time

To the Project Simulation mode has been added an estimated cut time readout, along with the total rapiding distance to the existing feed distance readout. This should be regarded as a best possible case time estimation, rather than a worst-case time estimate. Going off of the operation's feed rate, and a conservatively assumed rapid travel feed rate, PixelCNC calculates the minimum possible time that the operation could complete within. Depending on the total length of the toolpath, the total number of rapid moves, and the percentage of the toolpath spent cutting vs rapiding, and the actual machine that will be tasked with executing the generated G-code, the estimated time can differ from the actual cut time by a varying margin. The estimated time is to be heeded as though it's the minimum possible time the operation could complete cutting within - regarded as a conservative rough estimate.

Boost Layer Contrast

This is a new little option that just applies a Laplacian filter (i.e. find-edges) to a layer's contents when drawing its bottom plane to the 3D view, to help cut through the visual noise when many layers are composited together and it becomes hard to tell which one is contributing what to the canvas. The filter applied requires a little computation which may impact performance on slower systems. This is apparent when selecting a layer and its bottom plane takes a bit of time before appearing.

...What's Next?

+ There's always going to be stuff to add or change and right now I just want to finish the last few features that have been planned since the beginning. PixelCNC is just about to a point now where I'm confident standing behind it as a product, and comfortable being compensated for all of the hard work I've invested into it over these last four years (as of this month). It can do a lot of useful and cool things now, and most certainly can pay for itself several times over for those who invest in it as a tool for their CNCing pursuits.

However, I'm not 100% confident in its stability. While I always make sure that everything functions as designed and is stable when used as intended, across five different systems, there have been a few mentions of recurring crashes from a tiny few number of users when doing basic things that shouldn't be problematic. I fear that those who happen to experience crashes very early on with the free trial are never making their experience known. It concerns me to think that a potentially large percentage of the people who try using the free trial may have been experiencing crashes and have all been turned off to PixelCNC as a whole because of what could be just one little bug that I'm not seeing in my testing but that could be fixed if I were aware of it. Ultimately, this is just a reality of software development and an unavoidable aspect of being in the alpha phase. At least we can nip it in the bud before the big marketing push for beta later this year.

I've added a support email for users to send their bug reports and logfiles to, something I should've done from the very beginning but I 'd always assumed people would post to the forum if they were having any problems. I finally realize that posting to the forum, requiring an account and using pastebin to share logfiles, is something users shouldn't have to do - it should be easier to report issues. I do think it's fair (for now) to ask that users email their logs if they're having problems. Everyone has the ability to send email, right? Eventually I will figure out a way to automatically generate and send bug reports without such a system being vulnerable to hackers.

+ The next toolpath feature that's been on the list forever is adaptive/trochoidal horizontal milling. I was thinking about making this a simple option for the Horizontal Milling operation but it should really have its own operation icon for users to see. I also need to categorize or otherwise group together the different operation types in the op type selection dialog because the way operations work varies wildly. They don't all just drape some cuts over the canvas heightmap (some do) and I think that it's paramount that this is readily delineated to users when they first look at the operation type selection.

+ The ability to copy and paste when editing raster-layers and paths-layers is also an important feature to have. This would entail being able to select an area of the layer with selection tools such as square/rectangular, circular/elliptical, and a polygonal/freehand lasso. It would be great if it worked like a stamp where while holding CTRL-V to paste the cursor becomes the handle of a stamp where a "ghost" of the copied-to-clipboard content is rendered to the 3D view. Then the user can move it around and click to apply a paste to the layer, able to quickly click around the canvas to stamp many more copies to the layer being edited.

Right now the way to copy/paste paths while editing a paths-layer is by selecting the paths to copy, clicking "Selection to New Layer", then moving/scaling/rotating the new layer and finally merging it down with the original layer. It almost seems redundant adding in a whole entire clipboard system when the layer system is already in place for managing parts of the canvas as individual entities. I might end up just going down the route of allowing users to select portions of a raster-layer (also for confining where to applying editing functions to) and duplicate them to new layers as well, which can then be positioned/scaled/rotated and merged down just as with paths-layers. I do like the stamping idea though. I'll have to think about it a bit more but I think being able to stamp new layers into existence from copied raster/paths-layers is something worth looking at - but the requisite merging-down involved might feel too clunky in situations where a simple stamp function would be much less cumbersome.

+ A prefab shapes library of some kind would be extremely valuable too. Users should have access to simple shapes like circles, stars, arrows, etc... and these could all be parts of an image/vector library that's included with PixelCNC. An idea I've been playing around with in my head is making an online public library where users can add to and use from anything that the library contains - a communal database of content, so to speak. I really really like this idea but it's another situation where it would have to be designed to prevent hackers from spamming the system with garbage and flooding it into oblivion. The simplest security measure is requiring that users create accounts for adding content to the library, and then restricting the amount of content that can be shared from an IP address or account in a given amount of time. Having all kinds of content right there for users to incorporate into their projects would be invaluable. There's no guarantee on this feature, but it's something I really think would do PixelCNC a lot of good, and while I am not tremendously excited about pursuing its implementation I am hugely passionate about it being a reality.

+ Launching the new storefront and getting off of itch.io has been a priority for a long time. I know I've been saying it for at least a year, but it's just gotta happen. Itch.io is for indie game developers to share their little hobby projects and make a few bucks - and sure, I come from a game development background, but it's time to be a big boy and move on to greener pastures. I have very little control over what the PixelCNC store page can actually look like on here, how content like images and text are organized, etc... I get to have a single video and a handful of images, and then any-and-all information I feel should be readily accessible must all be a wall of text. I could move the text across several pages on my own web host and slim down the store page on here, but itch.io also takes on average about 10% of every sale, which is fine for someone with a little project they're selling for a few dollars. PixelCNC deserves better. The storefront platform I've decided to go with is Volusion. They seem best situated for creating a custom storefront that sells software - many platforms go on and on about how they support "digital downloads" but what they're focused on are products like digital image/model/document files as opposed to software executables.

+ Tutorial videos!!!!!!! I know, I know. I have been talking about this forever and so far have created a single tutorial video. I'm great with video editing, I don't mind it at all, and I have plenty of ideas all listed out as to what I should create tutorials for, but I just tremendously loathe recording myself. I am self-conscious and overthink my words, what I'm doing, what I'm thinking, just everything when in a situation where I'm putting myself out into the world. I'm the most knowledgeable PixelCNC user on the planet, the only one who knows about everything it's capable of and what it's limitations and quirks are. All of that expertise and know-how is trapped in my own head! I'm curious though what other people want to know how to do. I recognize that it's hard to have any idea when you're not completely aware of what PixelCNC is even capable of but anybody who has any suggestions whatsoever please let me know! Send a message to the new email address: support@deftware.org and talk my ear off, by all means. PixelCNC needs more experts and people actually telling me what they want to know about is a great prompt and motivator for me.

So anyway, that's what is going on. I'll record another few videos any day now and then edit and upload them. I think I just need to make a short list of what topics to cover, because my original plan was to make a lot of little tutorial videos that are just a few minutes each, and while that first tutorial video (PixelCNC Tutorial #01: Basic Relief Carving) was fun to knock out in about 2 days it is just difficult for me to stay present when recording myself not knowing how deep to go into anything I'm explaining. It's really easy to just ramble on about everything and turn what was supposed to be a few minutes into an hour.



PixelCNC v1.50a (64-bit).zip 3 MB
Jul 28, 2021
PixelCNC v1.50a (32-bit).zip 3 MB
Jul 28, 2021
PixelCNC v1.50a Trial (64-bit).zip 3 MB
Jul 28, 2021
PixelCNC v1.50a Trial (32-bit).zip 3 MB
Jul 28, 2021

Leave a comment

Log in with itch.io to leave a comment.