Delayed Z-hop script for Cura

Programy do przygotowywania modeli do druku – cięcia
Awatar użytkownika
roman
Postów w temacie: 8
Posty: 506
Rejestracja: 02 wrz 2022, 00:27
Lokalizacja: Dokładnej lokalizacji skippera nie zna nawet The President Of The Ju-Es-Ej
x 344

Delayed Z-hop script for Cura

Post autor: roman »

Delayed Z-hop script for Cura

Zrobiłem skrypt dla "opóźnionego z-hopa". Z eksperymentów wyszło mi, że może to dać zadowalające efekty w walce z nitkowaniem i tworzeniem się tzw. "side trees" podczas druku z trudnymi materiałami.

Celem skryptu jest wykonywanie takiego rchu podczas podróży z jednego fragmentu druku do następnego (na tej samej warstwie) poprzez pustą przestrzeń:
delauedZHop.png

Efekt działania:
1. Dysza, opuszczając pierwszy fragment druku wykonuje ruch poziomy, tak aby "wyczyścić" resztki filamentu, które nie uległ retrakcji o zewnętrzną warstwę obrysu pierwszego parametru. W testach miałem włączony tryb Combing Mode, który powoduje, że po zakończeniu kładzenia zewnętrznej ściany dysza niejako cofa się w stronę środka wieży by wykonać retrakcję. Taki sposób ruchu dość dobrze zapobiega nitkowaniu z tego miejsca (o ile przekraczane warstwy miały szanse się schłodzić, ale o tym dalej)
2. W pustej przestrzeni następuje z-hop. Ma to na celu wjazd nad drugi fragment druku z odpowiednią odległością w osi Z. Jeśli ta odległość nie jest zapewniona (np. przy wyłączonym z-hop wynosi tylko wysokość warstwy) mogą pojawić się "side tree" bo resztki filamentu mają okazje zahaczyć o zewnętrzny obrys elementu. Opuszczenie dyszy następuje bezpośrednio nad miejsce w któym prace rozpoczyna extruder.


Wynik:
Wszystkie wydruki przy tych samych ustawieniach (poza hop-em)
20220925_194153.jpg

Przy druku z włączoną opcją "delayed z-hop" nadal widać nitkowanie zaraz przy krawędzi prawej wieży, ale to wynika z tego, że dysza podróżuje po części druku, który przed chwilą kładła, a ja mam fatalne chłodzenie. Sądzę, że z lepszym chłodzeniem ten efekt by nie występował w ogóle.


Algorytm:
Co najważniejsze, algorytm działa w sposób inteligentny, czyli, że będzie nadawał się do drukowania dowolnych elementów. Zasada działania algorytmu jest taka, że dla każdej warstwy tworzy mapę zadrukowanej części. Gdy następuje podróż, to na podstawie mapy próbuje znaleźć odpowiednie miejsce dla podniesienia dyszy (puste oraz w odpowiedniej, zadanej minimalnej odległości od zadrukowanego elementu).

Czy ktoś się orientuje gdzie znajdują się logi cury? Próbuje ten skrypt użyć w curze, ale go nie widzi i nie wiem co jest przyczyną.

Na razie skrypt w wersji beta, ale jeśli ktoś chętny na testy, może mi wysłać g-code i go skryptem przerobie.

PS: Czy na forum jest możliwość edycji pierwszego postu w wątku przez autora. Chętnie wrzucałbym tu skrypt, ale chciałbym mieć możliwość jego aktualizowania (bo inaczej to będzie z tysiąc wersji pliku i się będzie można pogubić)
Abys, bartoszeqqq
Awatar użytkownika
roman
Postów w temacie: 8
Posty: 506
Rejestracja: 02 wrz 2022, 00:27
Lokalizacja: Dokładnej lokalizacji skippera nie zna nawet The President Of The Ju-Es-Ej
x 344

Re: Delayed Z-hop script for Cura

Post autor: roman »

Dla zinteresowanych - skrypt: DelayedZHop.py

Tesowałem dla cura 5.1. Z moich obserwacji wynika, że skrypt jest przydatny i zdaje egzamin podczas druków na małej warstwie, z pozdkręconą temperaturą lub z koniecznością długich travel move z retrakcją, przy trudnych materiałach. Wówczas najczęściej dochodzi do powstawania tzw "side trees", gdy dysza wykonując travel dojeżdża do zadrukowanego elementu z małą resztką filamentu na czubku. Zanim dysza wjedzie nad zadrukowany element reszta filamentu zahacza o zewnętrzną ściane wydruku i tam go zostawia. Jeśli ruch jest powtarzalny dla każdej kolejnej wartwy, to resztki filimantu będą się odkładały na tych pozostałościach z poprzedniej wartwy budując tzw. "side trees". I ten efekt skrypt eliminuje.

Aby zainstalować należy umieścić plik w "...\Ultimaker Cura 5.1.0\share\cura\plugins\PostProcessingPlugin\scripts\" i tyle. Po uruchomieniu Cury, skrypt powinien znaleźć się na liście skryptów w postprocessingu jako "Delayed Z Hop". Aby użyć poprawinie skryptu należy włączyć opcję "Z Hop When Rectracted" i ustawić odpowiednio "Z Hop Height" (w podstawowych parametrach). W ten sposób niejako generujemy wsad dla skryptu, bo skrypt działania na zasadzie wyszukania istniejących z-hop i ich "przerobienia".

Z moich obserwacji wynika, że (w Cura) włączjąc Z-Hop nie uruchamiamy z-hop dla każdej retrakcji, ale tylko dla takich po których następuje ruch dyszy poza zewnętrzną ścianę wydruku, czyli to dobrze, bo wewnątrz obiektu z-hop jest niepotrzebny. Co do wysokości skoku to zależy od skali problemu z jakim mamy do czynienia. Czasami wystarczy 0.6, a dla świętego spokoju można ustawić 1.0. Parametr offset domyśłnie jest dla dyszy 0.4 i wynosi 0.8, dla innej dyszy należy dać [średnica dyszy + 0.4], eksperymentować można dowolnie, ale dla wartości tego parametru poniżej średnicy dyszy algorytm traci sens, tzn działać będzie, ale te skoki nie będą miały sensu. Offset powinien być tak ustawiony, aby dysza miała okazję wyjechać poziomo z nad drukowanego elementu nie ciągnąc za sobą nitek. Sam z-hop jest tak przerobiony aby zoptymalizować ten ruch pod wzlgędem czasu stosując się jednocześnie do zadanych prędkości (XY oraz Z). Po osi Z prędkość jest zwykle wielokrotnie mniejsza aniżeli po XY, więc skok jest wykonywany na ukos jeśli to możliwe (czyli, że jednocześnie XY i Z w zadanych prękościach). W ten sposób nie tracimy czasu podczas podnoszenia, opuszczenie dyszy jest już pionowe (tylko w osi Z).

Skrypty postprocessingu są uruchamiane podczas zapisywania gcode na dysk. Algorytm działa w taki sposób, że dla każdej wartwy buduje w pamięci matryce wydruku tak aby w sposób efektywny wyznaczyć miejsce do podniesienia dyszy. Niestety to trwa. Dla średniej wielkości modeli czas exekucji skryptu wynosi np 20 sekund, dla dużych obiektów może zająć nawet 2 minuty. Można zwiększać parametr 'resolution' by skrypt działał szybciej, ale w ten sposób nie wszystkie z-hopy mogą się załapać na "opóźnienie" i zostaną zamienione na prostą linie, co niekoniecznie jest błędem czy stratą na jakości, bo jeśli to krótki ruch to nieporządany efekt i tak nie występuje.
Dołożyłem trochę optymalizacji, ale nie ma się co oszukiwać - z ważywszy, że skrypt działa na wynikowym gcodzie, a nie bezpośrednio jako moduł algorytmu cura to zawsze będzie obciążone brakiem istotnych informacji o budowie obiektów. Można jedynie bazować na informacji o tym jak "szła" dysza, gdzie położoła filament, gdzie był zhop, itp. To trochę taki reverse-engineering. Choć w ten sposób ma to taką zaletę, że można go łatwo przerobić i użyć jako standalone skrypt do dowolnego gcode (bez znaczenia czym generowany jest gcode).

Działanie algorytmu jest takie, że zamienia tradycyjne z-hopy na takie z "opóźnieniem". Jeśli "opóźniony z-hop" nie jest możliwy (bo np nie ma wystarczająco wolnej przestrzeni) z-hop jest zastępowany prostym ruchem, czyli, że sumarycznie pozbywamy się wszystkich tradycyjnych z-hopów. Nie chcemy ich, bo będzie nitkowanie, czyli że byśmy wpadli z deszczu pod rynne.

Skrypt jest w wersji v0.1, czyli takiej, co do której należy zachować ostożność ;) Przed wrzuceniem na drukarę warto obejrzeć gcode w jakimś viewerze (np SS G-code Viewer, albo samą cura), aby sprawdzić czy zadziałał prawidłowo, czy model wydruku jest poprawny (... na oko, czyli czy np nie brakuje warstw, czy warstwy nie drukują się na tej samej wysokości itp). W SS Viewer włączając opcję "show travel" powinniśmy również zobaczyć efekt, czyli coś takiego:
example.png
Wszelkie sugestie, komentarze, pytania - mile widziane.
Załączniki
DelayedZHop.zip
(5.11 KiB) Pobrany 65 razy
bartoszeqqq, Abys, aaannnd
Awatar użytkownika
roman
Postów w temacie: 8
Posty: 506
Rejestracja: 02 wrz 2022, 00:27
Lokalizacja: Dokładnej lokalizacji skippera nie zna nawet The President Of The Ju-Es-Ej
x 344

Re: Delayed Z-hop script for Cura

Post autor: roman »

Kolejny test - tym razem retrakcja już bardziej prawidłowo ustawiona, trochę podkręcona temp i warstwa 0.1mm, odległość wieżyczek - 4cm, te same ustawienia dla obu.

bez z-hop:
20220927_155822.jpg
delayed z-hop na 0.6mm:
20220927_163721.jpg
dziobu, bartoszeqqq, Andrzej_W, Grzesinski, Abys, aaannnd
Grzesinski
Postów w temacie: 2
Posty: 252
Rejestracja: 23 lis 2020, 12:18
x 53

Re: Delayed Z-hop script for Cura

Post autor: Grzesinski »

W PrusaSlicerteż zadziała ?
pma_
Postów w temacie: 1
Posty: 148
Rejestracja: 15 wrz 2021, 22:00
x 27

Re: Delayed Z-hop script for Cura

Post autor: pma_ »

Nie ma szans, prusa slicer nie obsługuje plugins
Grzesinski
Postów w temacie: 2
Posty: 252
Rejestracja: 23 lis 2020, 12:18
x 53

Re: Delayed Z-hop script for Cura

Post autor: Grzesinski »

Ale obsługuje Post-processing scripts....
Awatar użytkownika
roman
Postów w temacie: 8
Posty: 506
Rejestracja: 02 wrz 2022, 00:27
Lokalizacja: Dokładnej lokalizacji skippera nie zna nawet The President Of The Ju-Es-Ej
x 344

Re: Delayed Z-hop script for Cura

Post autor: roman »

Da się, zrobiłem wersje dla SuperSlicer, właśnie się z nim zapoznaje i chyba mi się ten slicer podoba

Nowa wersja, v0.2:
- poprawiłem nieznacznie "ifologie", mniej z-hopów za to z sensem
- dodana opcja "minimum z-hop distance", wcześniej była, ale zabita na stałe 1.0mm, ale na tak małych ruchach to nie ma absolutnie sensu by głowica podbijała. teraz jest opcja do ustawienia, default jest 5.0, a to chyba i tak za mało. (oczywiście, jak travel length < minDistance to zamienia na linie prostą)
- wersja dla SS (,PS i slic3r - ...tak sądze)
- dwa pliki:
DelayedZHop.py - jako script dla Cury
DelayedZHop-ss.py - jako script dla SS (dla innych nie testowałem, ale sądze, że też odpali)

Wersja nadal testowa, trochę siermiężna (w końcu doba ma tylko 24h;)), brak logowania, itp.

Dla SS:
1. Instalujemy python (https://www.python.org/downloads/)
2. Umieszczamy scrypt w dogodnym miejscu, np w c:\SuperSlicer_2.4.58.4_win64_220811\
3. w SS ustawiamy w printer setting, lift Z przy retrakcji np na 1.0
4. w print settings w post-processing scripts dajemy(*):
c:\Users\[username]\AppData\Local\Programs\Python\Python39\python.exe c:\SuperSlicer_2.4.58.4_win64_220811\DelayedZHop-ss.py --offset=0.8 --resolution=0.2 --minDistance=5.0
5. testujemy, script odlala się przy "export g-code"
(*) - ścieżki są przykładowe w zależności, gdzie leży python i script, parametry są opcjonalne, bo jak ich nie ma to polecą z defaultu, ale warto je mieć, zdaje się, żę dało by się zastąpić "--offset=0.8" czymś w rodzaju "--offset={nozzle_diameter+0.4}", ale nie sprawdziłem

Dla linuxów kroki są odpowiednio podobne ;)

Pliki wrzucam w tym wątku, na razie na gihuba nie daje, bo nie ma sensu (to skrypt raczej dla mnie samego i pewnie paru osób z forum)
Załączniki
DelayedZHop.zip
(10.83 KiB) Pobrany 51 razy
Grzesinski, Abys
Awatar użytkownika
roman
Postów w temacie: 8
Posty: 506
Rejestracja: 02 wrz 2022, 00:27
Lokalizacja: Dokładnej lokalizacji skippera nie zna nawet The President Of The Ju-Es-Ej
x 344

Re: Delayed Z-hop script for Cura

Post autor: roman »

v0.2.1:
- poprawiony błąd z obsługą względych ruchów na osi E (istotne dla SS)
Załączniki
DelayedZHop-v0.2.1.zip
(11 KiB) Pobrany 64 razy
Abys
Awatar użytkownika
roman
Postów w temacie: 8
Posty: 506
Rejestracja: 02 wrz 2022, 00:27
Lokalizacja: Dokładnej lokalizacji skippera nie zna nawet The President Of The Ju-Es-Ej
x 344

Re: Delayed Z-hop script for Cura

Post autor: roman »

v0.3 dla SuperSlicer (i podobnych).

Zmiany dotyczą przede wszystkim obsługi trybu 'avoid crossing perimeters' w slicerze. Ten tryb jest podobieństwem 'combing mode' w cura, ale działa trochę inaczej, tzn. nawet przy włączonym z-hopie slicer stara się wyznaczyć taką ściężkę, która nie przecina zewnętrznego obrysu (trochę smięsznie to wygląda w viewerze, jak z podniesioną dyszą travel jest połamany na kilka odcinków).

Nowy parametr 'detourOffset'. Służy do rozpoznawania czy avoid crossing został włączony. Należy ustawić na 2.0. Jest to odległość stanowiąca odchylenie trasy przejazdu dyszy podczas podróży od najkrótszej ścieżki po linii prostej. Jeśli slicer wyznaczył taki przejazd, że trasa nie jest najkrótsza oznacza to, że mamy do czynienia z włączonym trybem avoid crosiing perimeters i należy go uszanować, czyli wyłączyć z-hop i pozostawić scieżkę podróży jaka jest wyznaczona. Jeśli nie korzystamy z tej opcji w slicerze możemy ustawić --detourOffset=0.0, wówczas wyłączamy sprawadzanie tego - zaoszczędzamy czas.

I pare przemyśleń na koniec:

Skrypt jest niejako uzupełnieniem do rozwiązania problemu opisanego w powyższych postach, tzn. używać można go zawsze i zawsze mieć włączony w ustawieniach druku jakiś z-hop oraz ustawiony skrypt w postscriptach, ale efekt działania skryptu będzie widoczny jedynie w określonych, zdefiniowanych warunkach. W ten sposób skrypt będzie działał jedynie wtedy kiedy chcemy i potrzebujemy.

Parametryzacja. Należy sprawdzić przy jakich odległościach problem występuje i dostosować według potrzeb - tu niestety nie ma złotego środka. Wysokość drukowanej warstwy ma tu duże znaczenie. Ja aktualnie używam takich parametrów (dla warstwy 0.2 i z-hop=1.0):

python.exe c:\SuperSlicer_2.4.58.4_win64_220811\DelayedZHop-ss.py --offset=1 --resolution=0.2 --minDistance=15 --detourOffset=2.0;

Wysokość z-hopa. To zależy od skali problemu. Za mały - to wiszący filament na czubku dyszy będzie zahaczał o obrys wydruku (czyli, że niczego nie rozwiążemy). Za duży - to czas wykonania ruchu delayed z-hop będzie długi (patrz niżej). Czasami wystarczy 0.6 a czasami potrzeba 1.0. Drukowałem też przy 1.5, ale u mnie aż tyle nie było potrzeby. Trzeba doświadczalnie próbować.

Negatywnym skutkiem działania skryptu jest wydłużenie czasu podróży głowicy. Nie chodzi o czas druku, bo ten wydłuży się być może tylko nieznacznie, ale o czas w którym głowica spędza "w powietrzu". Ze względu na to, że z-hop składa się z czterech posunięć (ruch poziomy(wipe), ruch po ukosie do góry, ruch poziomy, ruch w dół) czas wykonania całego ruchu jest znacznie większy aniżeli jednego prostego posuwu z A do B. W wyniku tego, filament ma więcej czasu na wypłynięcie z dyszy co w efekcie będzie skutkowało większym "glutem" na czubku dyszy gdy głowica dotrze do celu. A to z kolei może skutkować tym, że ten filament zrobi się zbyt zimny aby go ładnie rozsmarować na docelowej powierzchni, a w ekstremalnych sytuacjach może nawet zepsuć wydruk. Nie trzeba się tego bać, bo to raczej dotyczy specyficznych warunków, ale trzeba mieć tego świadomość, np jeśli mamy drukowaną bardzo wysoką i b. chudą wieże, która możę się chybotać w czasie druku oraz drukujemy na niskiej temperaturze.

Tyle ;)
Załączniki
DelayedZHop-ss-v0.3.zip
(5.89 KiB) Pobrany 62 razy
mcxmcx
Drukarz
Postów w temacie: 2
Posty: 2464
Rejestracja: 09 kwie 2017, 21:32
x 309

Re: Delayed Z-hop script for Cura

Post autor: mcxmcx »

Czolem.

A bylbys w stanie zrobic skrypt wylaczajacy chlodzenie w okreslonych warstwach?

Mam cr30, jedyny dzialajacy w miare jest kiri moto, ale...
potrzebuje w warstwie dotykajacej tasmy i warstwe wyzej wylaczych chlodzenie.

Niezaleznie od tego co generuje slicer.

Szczerze mowiac, jak bys chcial kase to tez za to zaplace ;)

Drukarka chodzi z klipper lem, czyli jezeli skrypt w klipperze bylby latwiejszy to tez.
;))
Jeżeli przypadkiem podam ceny w GBP to sobie kolego, koleżanko, pomnóż razy pięć.
ODPOWIEDZ

Wróć do „Slicery”