As an RC planes enthusiast, I already designed several planes using foam cutting technics.
To do this you will need a foam cutter machine and a "board" to pilot it. Regarding the board, I already published a cheap FluidNC 4 axis controller.
This controller has already proven to work very well. But it needs "software" to produce the Gcode and to control the board. This is exactly what this project is dealing with !
Although several solutions does already exist, none of them were (IMHO) simple and powerful enough for my needs...
So I wrote two applications :
WiHoWI (Wing hot Wire) devoted to design the Gcode file of the wings (or anything else !)
hoWiGs (hot Wire Gcode Sender) devoted to drive the FluidNC controller
And the very first "full wing" cut with the tandem WiHoWi + hoWiGS
WiHoWI is a specialized CAD/CAM utility designed for 4-axis CNC foam cutting. At the beginning of this story, WiHoWI was "Wing Hot Wire" ... Now it is more "Wise Hot Wire" as it appeared to be generic enough to cut what you want to cut ... (almost) !
This software synchronizes two independant 2D profiles (Root and Tip) to generate precise G-Code for tapered wings, including complex internal cutouts and automatic stock material management.
Let's start by a quick introduction video showing the main features of the software
Key Features and usage
Dual Profile Synchronization: Import Profiles: Use the `File > Open` menu to open existing projects (.whw) or use dedicated buttons to load .dat or DXF files for the Root and Tip. You can also import a .stl file containing the whole wing "at once".
You can use any CAD software able to produce "polylines" dxf. Currently tested with
Solidworks (commercial / free licence for makers). Does not support layers natively during export but can save .dxf of a face (profile and cutouts in the layer 0) or .stl of the full wing
OpenScad (free and open source) . Does not support layers during export but can save .dxf (profile and cutouts in the layer 0)
remember :
layer 0 : contains the profile (and may contain all the cutouts)
layer 1 : contains the cut outs attached to the intados (optionnal)
layer 2 : contains the cut outs attached to the extrados (optionnal)
layer 3 : contains the synchro points on the profile (optionnal)
Remember also to choose the "polylines" option (lightburn and LibreCAD) to get best result (see below why)... currently the software does support :
lines
ellipses
circles
arcs
bulges
polylines, lwPolylines
Splines (if with fitpoints)
also, but depending on CAD software who produced the file, the precision may be degraded (I do use ixMilia dxf library to read dxf. A warning will be pop up if "unsupported entities" are found during import) ...
For simple wings WiHoWi can import or convert .dat file format into .dxf Polylines (High Density)
This is by far the best way to to get high resolution profiles and get the best result from your foam cutter. Your profile will be "faceless" and so will be your wing...
to be compared with the red dashed profile below (.dat to Polyline) :
When importing a .dat file, the default/only option is "High Density polylines" as explained above. This means that even poorly defined profiles will be "splined" before being converted to polylines.
When importing a .stl file, the wing is imported "all at once", the full geometry is preserved. So that wing length, wash out angle, dihedral, chords are directly read from the .stl. They can of course be modified if needed.
When exporting stl with your CAD software, choose the right "balance" between number of triangles into the mesh and the accuracy you want (don't go too high or the import may fail...). Remember that stl will never be as accurate as dxf (dxf has the true geometry, stl only meshes...)
changing cutout entry side
You can click on any cutout in the 2d view. Left click will select the cutout (color changes to white) and right click will change its entry side (from top to bottom and vice versa). Synchro root/tip is preserved.
Define Geometry:
Enter the Wing Length.
Adjust Back Sweep and Dihedral
Note that Root/Tip chords are automatically computed from the DXF/STL and cannot be changed manually. Software automatically identifies the Leading Edge (LE) to serve as the pivot point (0,0) for sweep , washout and dihedral calculations.
wash out angle can be changed "on the fly"
Note also that you can change chords and washout angle when importing a .dat file (do it before clicking on import button or leave the field empty and you will be requested to enter values.)
Dynamic Stock Visualization: Automatically calculates required block dimensions based on chords, dihedral, sweep, washout and safety margins.
Flipping: Integrated X and Y mirroring to adapt profiles for left/right wing panels without re-designing the CAD file.
Advanced Kerf Compensation: Supports asymmetric kerf values for the left and right towers to account for heat dissipation differences. Remember that the kerf is the diameter of the wire plus "molten foam" around it
As the speed of the towers are not the same (for tapered wings) you will have to measure it at the root and the tip sides of the wing. WiHoWi has a devoted menu tool to produce a Gcode for a "rectangular pseudo wing" with a heigth of 10mm and a length of 50mm at the root and proportionnal to wing chords for the tip.
So you'll just have to cut these small rectangles into scrap foam and measure the height with a calipper. the kerf (in mm) will be "10 - current height". Don't forget to do it for both sides.
Now into the Gcode file, the biggest kerf will be applied to shortest chord path.
But the speed itself will be computed on each segment into the Gcode file. This will garanty that the longest segment will be cut at the requested Feedrate (the smallest will be cut with the same time (but not the same speed)).
And as the speed is specified at the foam side (not the machine side) so it will be recomputed (for the motors plan) to take into account the projection ratio of tapered wings.
4-Axis G-Code Generation:
Produces synchronized X/Y and A/Z movements with controlled transition speeds (G1) to maintain wire tension and accuracy.
you can choose:
Feedrate: Default cutting speed (expressed in mm/min). This will be the target feedrate for the longest profile (usually root). This value will automatically change into the Gcode file to take into account the projection of the paths on the motors planes.
Temperature: PWM control (0 to 1000) to match material density.
So when temperature and feedrate are tuned for a clean cutting (for a given foam material), you can reuse these values for any tapered wing. WiHoWi will produce a Gcode where the wing root will be cut at these exact values.
Synchronization: Ensures that both the Root (X/Y) and Tip (A/Z) towers reach their respective destinations at the exact same moment. This is critical for tapered wings where the path lengths differ between the two towers.
Remember that CNC Origin is located on the left edge at the bottom of the foam stock.
When ready you have several options to produce the paths
Top Only: will cut only the top skin (from left to right and exit on right stock side)
Bottom Only : will cut only the bottom skin (from left to right and exit on right stock side)
Top + Bottom : will enter left of stock, then cut top skin then cut the bottom skin (from left to right then right to left and exit on left stock side) (note that I also flipped the profiles to enter cut by the trailing edge
CutOuts
They can be cut in a single path with the core of the wing or in multi paths.
When cut in a single path, the software will garanty that the wire enters and exits at a synchronized point into the foam. Note that intrados and extrados cutouts are attached as expected/described into the dxf.
On the following picture, I pressed on the "Play" button which simulated the cut process. You can see that, although not at the same position into the root and the tip, the cut out is perfectly synchronized.
This behavior has however some limitations... if the cut out is absolutely not aligned with the natural "sweep" of the wing, then the interpolation process will still mathematically work but the wing may be "flattened" by the wire. So be careful to place your cutout in a similar position into the root and the tip !
If you however, want to have "non homothetic" cut outs, then you can use the two paths option ! First path will cut the core (top or bottom skin) while second path will only cut the curouts from the top of the foam
Entry and exit
When fiber glassing the wing it can be useful to have chamfer at the leading and trailing edges into the foam shell. This helps a lot to "shape" the fiberglass at the right angle when molding the wing in two parts : intrados fiberglassing first then trim the edges then extrados fiberglassing.
WiHoWi has " > entry exit < " panel
by default entry and exit angles are set to zero, thus the entry and exit into the foam will be a straight motion
But if you choose another angle value then the entry/exit will take the shape of a triangle
Be aware that the entry and exit lengths are relative the left/right sides of the wing. So if you choose a too long value (compared to the right/left margins of the stock), then the wire may start cut "into the air" but will finish to enter the foam at the right angle and will always preserve the wing core !
These were some possibilities offered by the software; You can play with "flip" buttons and Gcode export options to explore more !
Gcode header lines
When generated with WiHoWI the Gcode file will contain several usefull "comment" lines
First lines (down to SPECIAL MOVES) are useful for the Gcode streamer (hoWiGS) to draw the stock and know the overall geometry of your machine. (they are not "mandatory" and any other software producing Gcode without these lines will still work with hoWiGS !)
And "SPECIAL MOVES" lines contain Gcode ready to be used in hoWiGS. When imported into hoWiGS they will poulate the "special Moves" menu. (explaination below !)
Project Saving (.whw)
The software saves a proprietary structured text format containing: Original DXF point cloud (prevents degradation from repeated transformations). All interface parameters (Feedrate, Wire Length, Kerf, Margins). Current flip states and layout offsets. You can reopen a saved project to recover all your settings !
Configuration (.ini file)
If you prefer, you also have access to the "config.ini" file to change the default parameters of the application. This file is located into the application folder.
[Settings]
Language=EN
FeedRateMode=G94
GcodeSampling=0.15
[Cutting]
Temperature=400
FeedRate=400
Right Kerf=0
Left Kerf=0
[Geometry]
Stock Right Left Margins=10
Stock Bottom Margin=10
Wire Length=810
safety offset from stock=5
[Entries]
Wire entry Length=10
Wire exit Length=10
Wire entry Angle=0
Wire exit Angle=0
Most of these parameters are accessible from the main screen/menu. However there are a few only accessible in the .ini file :
GcodeSampling = 0.15 mm (the value at which the profiles are sampled to produce segments of 0.15mm. Beware this value is tricky... Too small and FluidNC will suffer... Too big and your wing will become faceted
FeedRateMode = G93, G94
To set the active feed rate mode to inverse time, program: G93
Inverse time is used to program simultaneous coordinated linear motion. In inverse time feed rate mode, an F word means the move should be completed in [1/F number] minutes.
example – If the F number is 2.0, the move should be completed in half a minute.
When the inverse time feed rate mode is active, an F word must appear on every line which has a G1, G2, or G3 motion.
To set the active feed rate mode to mm per minute mode, program: G94
In units per minute feed rate mode, an F word is interpreted to mean the controlled point should move at a certain number of millimeters per minute, so it is a "speed"
You have the choice! WiHoWi handles both modes.
Some would say that G93 is better for foam cutting CNC... but this is wrong at least with WiHoWi ! Motion is computed so that every segment is so small that the motion controller of FluidNC can keep the (almost) same speed and thus doesn't need to apply acceleration/decceleration from one segment to the other.
So you won't notice any change in quality between G93 and G94.
Furthermore with G94, as the speed is fixed in the very first lines of the Gcode, you will be allowed to change it "on the fly" during cutting. This won't work with G93 as the "speed" changes every line of Gcode...
These are the reasons why G94 is the default value that uses WiHoWi. But if you really prefer G93, just change it in the .ini file !
Installation
There is no real installation ! Simply download the zip file, unzip it (keeping the folders) and run the .exe. You might be asked to install .net windows components. Just do it it's safe !
it is "simply" a Minimalist CNC Foam Cutting Gcode Streamer designed for 4 axis CNC running with FluidNC
hoWiGS is a lightweight, high-performance G-code streamer. It balances a simplified user interface with advanced features required for precision wing manufacturing.
Key Features
Connectivity & Control
FluidNC Integration: Optimized for 4-axis (XY AZ) control over USB (scan and connect choosen port at predefined default baud rate 115200).
Real-time Interaction: Input and send custom G-code commands directly to the board via a dedicated console.
Emergency Management: Reset the machine after alarms, pause/resume ongoing cuts, or "Kill" a cut instantly with a safety long-click on the Stop button.
3D Visualization & Workspace
Dual-Plane Preview: Real-time 3D display showing profiles mapped both on the physical foam stock and on the motor projection planes.
Smart Parameter Loading: Automatically extracts cutting parameters (wire length, wing length, etc.) from G-code files generated by WiHoWi, or allows for manual entry.
Origin Management: Easily define your Work Origin and return to it with a single click.
Advanced Jogging
Precision Jogging: Move axes by fixed, user-defined increments at a chosen feedrate.
Continuous Jogging: Dynamic movement that lasts as long as the mouse button is pressed, providing a natural feel for wire positioning.
Thermal Management
Integrated Heater Control: Toggle the wire heater and adjust temperature/power levels.
Real-time Tuning: Modify temperature settings on the fly even while the G-code is currently streaming.
FeedRate Management
Integrated FeedRate Control: adjust feedrate for jogging
Real-time Tuning: Modify FeedRate settings on the fly even while the G-code is currently streaming (works only in G94 mode).
Specialized Cutting Modes
Guillotine Mode: Quickly trim stock faces without complex G-code.
position your wire
set heather on at choosen temperature
continuous jog (or predefined distance value) to cut a face
Automatic Dihedral Guillotine: Specialized mode to cut the root or tip faces at the correct angle to account for wing dihedral.
set the angle value
set heater on at choosen temperature
position your wire
continuous jog (or predefined distance value) to cut a vertical dihedral angle
special Moves menu
this menu is automatically populated when importing a Gcode file produced by WiHoWi
when you select one line into the menu the corresponding Gcode will be entered into the command line
in this example I selected the "Goto Entry XY - margin" line, then clicked on "send" and the wire moved to the entry position with the left margin applied.
you can combine several menu lines (select as many you like). They will be appended into the command line waiting for your final "click on send". This allows to cut the shells in a very simple way. For instance:
move to the bottom of the stock
choose the right motion speed for cutting (enter it into the jog panel)
click on "Goto stock top" + "Goto exit X + margin" + "Goto stock bottom"
now start heater
now click on the "send" button and you will cut a nice shell around your wing core !
Usage
It can't be simpler !
Connect: Select your COM port and connect to the FluidNC board.
Configure: Load your G-code using the menu. hoWiGS will attempt to auto-fill your wing geometry parameters. (You can swap XY and AZ planes during import to cut right and left wing from the exact same file).
Prepare: Use the Jogging tools to position the wire at your origin point and set your Work Origin. Remember, if using WiHoWi, that origin is on the front face of the stock and on the machine plate
Cut: Stream the file. Monitor the 3D view and adjust temperature and feedrate in real-time if necessary for the perfect kerf.
During cut you can pause the cut, resume it (single click on the pause/stop button). A long click will serve as a "kill switch" and immediately stop the cut. FluidNC may enter into Alarm mode... Another single click will clear the alarm !
Installation
There is no real installation ! Simply download the zip file, unzip it (keeping the folders) and run the .exe. You might be asked to instal .net windows components. Just do it it's safe !
*****************************************
Advanced usage for foam cutting
*****************************************
Into the WiHoWi folder I have added a few .dxf files a little "special"
As you can see I have added "star" and "big" cutouts as well as this strange "V shape" one
The big one can be used to cut an "hollow" wing, while the V shape can be used for aileron hinge (although poorly positioned on my example :-))
However this means that you can insert into your dxf :
CIRCLES (real ones with this name into the dxf file)
Polylines : any shape provided that root and tip have the exact same number of shapes
Here is the tip of the wing dxf : (note the big hollow cut : not same shape !)
As you can see some of the cutouts are "outside" the profile and we will have a look now specifically on the V shape one and see how the gcode is generated !
All the shapes are connected to the right side of the wing. Entries are perpendicular the profile.
The V cut will follow segment 1 to 8.
Interestingly it will start by cutting the profile (top skin) to the middle of the V (1), then perform motion (burning) the shell (2, 3, 4) before plunging to the core for the "V" (5, 6), then finishing the cut again at the midlle of V (7) before going again on the profile (8).
This complex motion has the major advantage to preserve the edges of the V on the profile. The wire doesn't have to "bend" and will follow straight lines (which is much easier). It will of course damage a little the shell but who cares ?
Here is the result, on the tip side, as sent by FluidNC board to hoWiGS. So it's not a "simulation" it's the Gcode orders interpreted and acknowledged by FluidNC and sent back to my program !
Of course if you prefer to cut the V into a second pass, it is totally feasible and should give the same result.
Playing with WiHoWi Lettering
For testing purpose I have tried to use "text" as a wing profile.
As you can see all the letters have been "merged" by boolean intersection. Only the inner O is considered as a "cutout".
Tip profile is the same but 50% scaled down.
I have then run WiHoWi and hoWiGS :
Result is perfect, the text is properly cut, both profiles remain synchronized and the inner O is inserted at the right position !
Another lettering cut for my daughter's 30 years birthday ! (design WiHoWI, cut hoWiGS )
Complex profiles... and synchronisation
Suppose that you want to cut a wing with this strange shape :
A bump on the extrados ! (just to break aerodynamics !). This would be impossible unless you tell the wire to "sweep" from synchro point to synchro point to preserve the sharp edges of the bump...
So why not adding these synchro points into the layer 3 of your profile ?
Two options:
Lightburn: little lines touching the sync points (see little green lines above)
LibreCAD : directly add "Points" on the sync points (my prefered option)
There is no specific order to position the sync points (they will be automatically detected and sorted by WiHoWi). BUT you must have the same number on root and on tip profiles.
And now open WiHoWi and the magic happens :
If everything is ok, then the sync points will be displayed into the 2d view of WiHoWi (small yellow circles).
Note: Leading and trailing edges are also considered automatically as "synchro points" :
Open the Gcode with hoWiGs and verify that the edges of the "bump" are sharp !
Finally you may want to add cutouts AND synchro points ?
It's feasible but it will induce deformations to the path as the wire could be not parallel to the natural sweep on the wing. Complex to explain but have a look to the picture below. It shows a real path where is highlighted the synchro between the "bump" on the extrados and the first cutout. The wire will try to smoothly go from one synchro point to the other.
And this has a double bad effect :
wire will somehow "flatten" the curve during sweep (even if the wire follows the two profiles)
due to timing, one part of the segment will be fast (normal feedrate) while the other will be "slow" and even slower than the difference between tip and root which are "balanced" by kerfs values... So temperature may eat the foam and kerf compensation can be inacurate.
So to get "perfect" result rather use the two passes option below !
Here interpolation is only applied to the skin (as we need synchro points) but not for the cutouts
However this powerful feature is available into the stable version of WiHoWi starting at v1.05 and above. If your wing is not too "weird" it will work smoothly.
Hollow wings
It can be interesting to cut an hollow wing. You can do this simply.
Draw your profile and srink it to create the shell, for instance like this.
Don't forget to attach the holes to the layer1 (cut from intrados). Save dxf (do the same for the tip side !). Note that, (if you are lazy !) you can leave the cutouts into the layer 0. A warning, during import, will recall you that some cutouts have been found on layer 0 !
then generate the Gcode (no need for synchro points in this case, entry points are automatically detected)
WiHoWi will create the full path including "inner skins"
now open hoWiGS and cut it
Currently I cannot guarantee that the inner cuts will be cut totally properly if their shapes are not homothetic. But in normal conditions the cut will be more than clean enough...
So you can already design quite complex wings such as :