TonCut is intended for cutting optimization of flat (2D) and long (1D) materials, such as: glass, wood, stone, metal, aluminum, plexiglass, cardboard, tubes, bars, etc.
TonCut for Automation is used for cutting optimization of 1D and 2D materials. However, it does not feature a user interface. Data for optimization is delivered to it in JSON format. The results are also generated in this format.
The program can be used in batch mode or as a Websocket server. Thanks to the simple and clear data format, it can be easily integrated with other systems. In server mode, a very simple API expands integration possibilities.
TonCut for Automation can be run as a Windows service. In this case, you can connect to it via Websocket (ws) or Websocket Secure (wss) protocol.
The program can also be launched from the command line as a batch tool. In this case, input data is provided to the program via files or standard input. The results can be written to standard output or to a file.
{ "version": 1, "defaultUnits": { "time": "s", "percent": "%", "length": "mm", "field": "sqmm", "angle": "deg" }, "devices": [ { "id": 1, "title": "2D device", "materialKind": "2d", "canCrossCuts": false, "fullCutsOnly": true, "stripCuts": true, "minCutWidth": 0, "edgingCuts": "optimal", "originEdgingCuts": "default", "firstCutDirection": "any" } ], "materials": [ { "id": 1, "deviceId": 1, "title": "2D material", "kind": "2d", "thickness": 18, "canHaveStructure": true, "surplus": 0, "surplusEditable": true, "margin": 0, "marginEditable": true, "defaultEdging": 0, "cuttingDimensions": "net", "canBeVeneered": true, "kerf": 3, "allowEdgeCuts": true, "reuseWaste": { "minShorterLength": 200, "minLongerLength": 200 } } ], "pieces": [ { "id": 1, "materialId": 1, "length": 922, "width": 688, "quantity": 10, "structure": ["byLength", "byWidth", "none"], "priority": "normal", "description": "", "surplus": 0, "margin": 0 }, { "id": 2, "materialId": 1, "length": 1220, "width": 740, "quantity": 20, "structure": ["byLength", "byWidth", "none"], "priority": "normal", "description": "", "surplus": 0, "margin": 0 } ], "stock": [ { "id": 1, "materialId": 1, "length": 3210, "width": 2245, "quantity": 1, "structure": "none", "priority": "normal", "description": "", "edging": { "left": 20, "right": 20, "top": 20, "bottom": 20 } } ] }
{ "version": 2, "units": { "length": "mm", "field": "sqm", "angle": "rad" }, "statistics": { "2d": { "field": 7.20645, "usedField": 6.514416, "wasteField": 0.692034, "unusedField": 0, "cutCount": 20, "cutsLength": 21335 }, "1d": { "length": 0, "usedLength": 0, "wasteLength": 0, "unusedLength": 0, "cutCount": 0, "cutsLength": 0 } }, "cuttings": [ { "stockItemId": 1, "quantity": 1, "statistics": { "2d": { "field": 7.20645, "usedField": 6.514416, "wasteField": 0.692034, "unusedField": 0, "cutCount": 20, "cutsLength": 21335 } }, "pieces": [ { "pieceId": 1, "x": 23, "y": 23, "rotated": false }, { "pieceId": 1, "x": 23, "y": 714, "rotated": false }, { "pieceId": 1, "x": 23, "y": 1405, "rotated": false }, { "pieceId": 2, "x": 948, "y": 23, "rotated": true }, { "pieceId": 2, "x": 1691, "y": 23, "rotated": true }, { "pieceId": 2, "x": 2434, "y": 23, "rotated": true }, { "pieceId": 1, "x": 948, "y": 1246, "rotated": true }, { "pieceId": 1, "x": 1639, "y": 1246, "rotated": true }, { "pieceId": 1, "x": 2330, "y": 1246, "rotated": true } ], "rest": [ { "x": 0, "y": 2096, "length": 945, "width": 149, "identifier": "", "usable": false }, { "x": 3177, "y": 0, "length": 33, "width": 1243, "identifier": "", "usable": false }, { "x": 948, "y": 2171, "length": 1379, "width": 74, "identifier": "", "usable": false }, { "x": 2330, "y": 2171, "length": 688, "width": 74, "identifier": "", "usable": false }, { "x": 3021, "y": 1246, "length": 189, "width": 999, "identifier": "", "usable": false }, { "x": 0, "y": 0, "length": 945, "width": 20, "identifier": "", "usable": false }, { "x": 948, "y": 0, "length": 740, "width": 20, "identifier": "", "usable": false }, { "x": 1691, "y": 0, "length": 740, "width": 20, "identifier": "", "usable": false }, { "x": 2434, "y": 0, "length": 740, "width": 20, "identifier": "", "usable": false }, { "x": 0, "y": 23, "length": 20, "width": 688, "identifier": "", "usable": false }, { "x": 0, "y": 714, "length": 20, "width": 688, "identifier": "", "usable": false }, { "x": 0, "y": 1405, "length": 20, "width": 688, "identifier": "", "usable": false } ], "cuts": [ { "startX": 948, "startY": 0, "endX": 948, "endY": 2245 }, { "startX": 0, "startY": 23, "endX": 948, "endY": 23 }, { "startX": 0, "startY": 714, "endX": 948, "endY": 714 }, { "startX": 23, "startY": 23, "endX": 23, "endY": 714 }, { "startX": 0, "startY": 1405, "endX": 948, "endY": 1405 }, { "startX": 23, "startY": 714, "endX": 23, "endY": 1405 }, { "startX": 0, "startY": 2096, "endX": 948, "endY": 2096 }, { "startX": 23, "startY": 1405, "endX": 23, "endY": 2096 }, { "startX": 948, "startY": 1246, "endX": 3210, "endY": 1246 }, { "startX": 1691, "startY": 0, "endX": 1691, "endY": 1246 }, { "startX": 948, "startY": 23, "endX": 1691, "endY": 23 }, { "startX": 2434, "startY": 0, "endX": 2434, "endY": 1246 }, { "startX": 1691, "startY": 23, "endX": 2434, "endY": 23 }, { "startX": 3177, "startY": 0, "endX": 3177, "endY": 1246 }, { "startX": 2434, "startY": 23, "endX": 3177, "endY": 23 }, { "startX": 2330, "startY": 1246, "endX": 2330, "endY": 2245 }, { "startX": 948, "startY": 2171, "endX": 2330, "endY": 2171 }, { "startX": 1639, "startY": 1246, "endX": 1639, "endY": 2171 }, { "startX": 3021, "startY": 1246, "endX": 3021, "endY": 2245 }, { "startX": 2330, "startY": 2171, "endX": 3021, "endY": 2171 } ] } ] }
The server version allows for communication using a simple and easy to use API based on the Websocket protocol.
All messages exchanged between the server and the client are saved in JSON format.
Sample command:{ "cmd":"cmdListJobs","id":9222}Sample response:
{ "id":9222,"jobs":[{ "id":1,"state":"sDone","progress":100,"combinationCount":1042885,"createDate":"2023-04-18T12:31:43.133+02:00","startDate":"2023-04-18T12:31:43.166+02:00","endDate":"2023-04-18T12:31:44.739+02:00"}],"success":true}Sample event:
{ "event":"JobProgress","jobId":1,"progress":74,"combinationCount":668878}
Commands are sent to the server. Sample commands include "add job", "get list of jobs", "get status", "get job data", etc.
The server sends responses to the client. Depending on the type of command, the response may have a different format.
The server also sends various events by itself, e.g. "job added", "optimization progress", "optimization completed", etc.
The program can perform only one optimization at a time. During this time, it can accept new jobs for optimization, but they will be queued and executed in the order in which they were added.
A job is a single optimization order. Jobs are independent from each other - they contain a full set of input data, i.e. pieces, stock, material groups, veneers and cutting devices.
The results include all cuttings. Each cutting includes the arrangement of pieces and waste, as well as the list of cuts.
To update the program, just install the new version. Do not uninstall the old version of the program before upgrading!