Program TonCut służy do optymalizacji rozkroju materiałów płaskich (2D) i podłużnych (1D), np.: szyb, drewna, płyt, kamienia, blachy, aluminium, plexi, kartonu, rur, belek, itp.
TonCut for Automation służy do optymalizacji rozkroju materiałów 1D i 2D. Nie posiada on jednak interfejsu użytkownika. Dane do optymalizacji dostarcza się do niego w formacie JSON. Wyniki generowane są również w tym formacie.
Program może być używany wsadowo lub jako serwer Websocket. Dzięki prostemu i czytelnemu formatowi danych można go łatwo integrować z innymi systemami. W trybie serwerowym, bardzo proste API dodatkowo zwiększa możliwości integracyjne.
TonCut for Automation może być uruchomiony jako usługa Windows. Wtedy można się z nim połączyć za pomocą protokołu Websocket (ws) lub Websocket Secure (wss).
Program może być również używany z linii komend jako narzędzie wsadowe. Wtedy dane wejściowe dostarcza się do programu za pomocą plików lub standardowego wejścia. Wyniki mogą być wypisane na standardowe wyjście lub do pliku.
{ "version": 1, "defaultUnits": { "time": "s", "percent": "%", "length": "mm", "field": "sqmm", "angle": "deg" }, "devices": [ { "id": 1, "title": "Urządzenie 2D", "materialKind": "2d", "canCrossCuts": false, "fullCutsOnly": true, "stripCuts": true, "minCutWidth": 0, "edgingCuts": "optimal", "originEdgingCuts": "default", "firstCutDirection": "any" } ], "materials": [ { "id": 1, "deviceId": 1, "title": "Materiał 2D", "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 } ] } ] }
Wersja serwerowa pozwala na komunikację za pomocą prostego i łatwego API działającego w oparciu o protokół Websocket.
Wszystkie wiadomości wymieniane między serwerem a klientem są zapisane w formacie JSON.
Przykładowa komenda:{ "cmd":"cmdListJobs","id":9222}Przykładowa odpowiedź:
{ "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}Przykładowe zdarzenie:
{ "event":"JobProgress","jobId":1,"progress":74,"combinationCount":668878}
Komendy wysyłane są do serwera. Przykładowe komendy to np. "dodaj zadanie", "pobierz listę zadań", "pobierz status", "pobierz dane zadania", itp.
Serwer przysyła odpowiedzi do klienta. W zależności od rodzaju komendy, odpowiedź może mieć różny format.
Serwer wysyła też, sam z siebie, różne zdarzenia, np. "dodanie zadania", "postęp optymalizacji", "zakończenie optymalizacji", itp.
Program wykonuje tylko jedną optymalizację w danej chwili. W tym czasie może przyjmować nowe zadania do optymalizacji, ale będą one kolejkowane i wykonywane w kolejności, w jakiej zostały dodane.
Zadanie, to pojedyncze zlecenie optymalizacyjne. Zadania są niezależne od siebie - zawierają pełen zestaw danych wejściowych, tj. elementy, zasoby, grupy materiałowe, okleiny i urządzenia tnące.
Wyniki zawierają wszystkie rozkroje. Każdy rozkrój zawiera ułożenie elementów i odpadu, oraz listę cięć.
W celu aktualizacji programu wystarczy zainstalować nową wersję. Nie należy odinstalowywać starej wersji programu przed aktualizacją!