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 :


And the very first "full wing" cut with the tandem WiHoWi + hoWiGS


And no cheat it's hoWiGS which cuts this wing !



****************************************************

WiHoWI : Wise CNC 4-Axis Hot Wire Cutter

****************************************************

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

remember :

Remember also to choose the "polylines" option (lightburn and LibreCAD) to get best result (see below why)... currently the software does support :

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:


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:

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

Here is an example

(--- Wing Cutting Project ---)
(Generated: 2026-04-14 22:00)
(Wire Length: 810 mm) (Wing Length: 500 mm)
(Root Chord: 100.00 mm) (Tip Chord: 77.54 mm)
(Backsweep: 0 mm) (Dihedral: 0 deg)
(--- Stock & Centering ---)
(Stock Size: 141.43 x 21.53 mm)
(Stock position from R/L motors: 155 mm)
(Margins in stock: right/left=20 mm, bottom=5 mm)
(-------- hotwire --------)
(Temperature: 400)
(Target Feedrate: 100 mm/min)
(Mode: G94 Constant Feedrate)
(------ SPECIAL MOVES ------)
(Stock top: G1  Y21.530 Z21.530)
(Stock bottom: G1  Y0.000 Z0.000 )
(Stock left: G1  X0.000 A0.000 )
(Stock right: G1  X141.430 A141.430 )
(Entry XY: G1 X19.331 Y8.801 A19.169 Z8.820 )
(Entry XY - margin: G1 X-0.669 Y8.801 A-0.831 Z8.820 )
(Entry X: G1 X19.331 A19.169)
(Entry X - margin: G1 X-0.669 A-0.831)
(Entry Y: G1 Y8.801 Z8.820)
(ExitXY: G1 X127.545 Y8.430 A91.425 Z8.862)
(ExitXY + margin: G1 X147.545 Y8.430 A111.425 Z8.862)
(Exit X: G1 X127.545 A91.425)
(Exit X + margin: G1 X147.545 A111.425)
(Exit Y: G1  Y8.430 Z8.862 )

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 : 

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 G1G2, 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 !


*******************************************************************

hoWiGS : hotWire Gcode Sender for FluidNC controllers

********************************************************************

hoWiGS is the companion application of WiHoWi ! 

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

3D Visualization & Workspace

 Advanced Jogging


 Thermal Management

 FeedRate Management


Specialized Cutting Modes


Usage

It can't be simpler !

  1. Connect: Select your COM port and connect to the FluidNC board.
  2. 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).
  3. 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
  4. Cut: Stream the file. Monitor the 3D view and adjust temperature and feedrate in real-time if necessary for the perfect kerf.
  5. 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 :

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 :

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 :

And hoWiGS will do the cutting job


Designed for simplicity. Built for precision.