3D nyomtatás: RepRap Industrial

Simon és Jonas Kühling két tesó, mechantronikai mérnöknek tanultak. 2012-ben gondolták úgy, hogy építenek egy nagy precízitású, akár ipari eszközként is használható RepRap 3D printert - ez lett a RepRap Industrial, ami azóta már az 1.1.0 változatban rendelhető tőlük, nem kevesebb, mint 6533.10 EUR-ért, melyben a majd 50 kg-os printer szállítási költsége még nincs benne.

Mivel a srácok a nyílt forrású RepRap printereket vették alapul és így készítettek kereskedelmi terméket, így az azokra vonatkozó GNU GPL licenc értelmében nyilvánosan elérhetően dokumentálniuk kell az egészet. Ennek messzemenőleg eleget is tesznek:

  • A github-ról bárki leszedheti a printer megépítéséhez szükséges összes file-t, a 3D nyomtatható STL komponensektől kezdve az azokat leíró OpenSCAD scripteken át a nyomtató házának és a tárgyasztal szilikon fűtőelemének kivágósablonját definiáló DXF file-okig.
  • Mivel a modellek GCODE-dá konvertálásához a szintén nyílt forrású Slic3r-t használják, így szintén a github-on publikálták a printerükkel kompatibilis Slic3r profilokat is.
  • Ezen felül a saját website-jukon tették letölthetővé a nyomtató üzemeltetéséhez írt minden egyéb dokumentációt.

Egyetlen dolog van, amire nem tudok magyarázatot, az pedig az, hogy vajon miért használnak T5 vezérműszíjat az ezzel szemben kifejezetten kétirányú lineáris mozgatásra tervezett GT2-es bordás szíjjal szemben. Számos helyen olvastam már arról, hogy a T5-ös szíjhajtásnál előfordulhat backlash, bár az is igaz, hogy míg a RepRap világ szinte kivétel nélkül 20 fogas GT2 alumínium csigákat használ a szíjak hajtására, addig a Kühling fiúk maguk gyártják ABS-ből a csigáikat.
A csigákat definiáló OpenSCAD file headerében ez a comment szerepel:

Derivative of:
	Parametric Pulley with multiple belt profiles
	by droftarts January 2012

http://www.thingiverse.com/thing:16627

	Based on pulleys by:
		http://www.thingiverse.com/thing:11256 by droftarts
		https://github.com/prusajr/PrusaMendel by Josef Prusa
		http://www.thingiverse.com/thing:3104 by GilesBathgate
		http://www.thingiverse.com/thing:2079 by nophead

	dxf tooth data from http://oem.cadregister.com/asp/PPOW_Entry.asp?company=915217&elementID=07807803/METRIC/URETH/WV0025/F
	pulley diameter checked and modelled from data at http://www.sdp-si.com/D265/HTML/D265T016.html

Summa summarum, a forrásba beleolvasva az embernek tátva marad a szája a német precízitás láttán és elhiszi a két fiatal mérnöknek, hogy pontosan tudják, mit csinálnak.

Mielőtt a TLDR effekt miatt elhúznál innen, gyorsan beágyazok egy videót a poszt tárgyát képező printerről működés közben, hogy az meghozza a továbbolvasási kedved:

Mindezek után nézzünk meg még néhány tulajdonságot, ami ezt a monstrumot igazán kiemeli a ma már óriási 3D printer mezőnyből:

  • A "H" alakú XY mozgatás szerintem a legstrapabíróbb és egyben a legprecízebb. A brutális tengelyek jól terhelhetőek, simán elbírják a két direkt extrudert (és bőven elbírnának egy proximity szenzort is).
  • Mindhárom irány végállásának detektálásához mágneses hall effect sensort használnak mechanikus endstop helyett, ami sokkal megbízhatóbb (=nem kopik el soha az életben).
  • Egy mechanikus mikrokapcsolóval detektálják az elfogyó nyersanyagot, a szoftver automatán paused módba állítja a nyomtatást és filament csere után megy tovább az egész.
  • Direct feed van, ami ismét nagy piros pont, ráadásul két hotendből, ami akár ugyanolyan anyaggal, de különböző átmérőjű fejekkel dolgozhat (=egy kis átmérő a külső héjnak, egy nagyobb térfogatáramú gyors az infillnek), vagy akár különbözőkkel is, ha esetleg több színnel kellene nyomtatni, vagy mondjuk vízoldható PVA-ból építtetnénk a supportot.
  • A félautomata print bed leveling megoldás fantasztikus: csináltattak egy custom alakú szilikon fűtőelemet, amin 3 lyuk van ott, ahol a print bedet alátámasztják (BTW a 3 pontos alátámasztásuk a build volume _belsejében_ van). A 3 rugós támasztékot csak lenyomatják a hotenddel, majd rögzítik 3 csavarral és máris abszolút pontosan van szintbe kalibrálva a tárgyasztal (persze ehhez a vezérlő szoftver tudja, hogy a print 0.1 mm-ről indul, de ez a legkisebb probléma). Ez egyszerűen annyira állat, hogy meg is kell néznünk:

  • Teljesen egyedi az övfeszítő mechanika is, amit eszköz nélkül lehet hangolni. A brutális németjei még azt is specifikálják a doksijukban, hogy 220 Hz-es hangot ad az optimálisra feszített bordás szíj és javasolják, hogy gitárhangoló hardverrel vagy esetleg erre írt mobil szoftverrel ellenőrizd :) Ez is zseniális:

  • Hűteni és fűteni is tudják a kamrát, ráadásul a 70 fokos állandóan keringtetett levegővel elérik, hogy egyrészt semennyi warping nem lesz, másrészt nem kell nekik a hotend mellé ventillátor, mert a belső jelentős légáram megoldja ezt a feladatot (hogy én mennyire utálom a fej melletti kis rohadék 40 mm-es sikító ventillátorokat!).
  • Tárgyasztalnak karbonszál erősítésű polieterimid (PEI) lapot használnak, ami 170 ℃-ig garantáltan hőálló (=216 ℃ a glass transition temp., ebből építik a repülők falát is) és valamennyire rugalmas is, így print után lehűlve egy picit meghajlítva azonnal leugrik róla a modell - tapasztalatból mondom, ez önmagában hihetetlen nagy dolog! Mikor elkezdesz 3D nyomtatni, akkor sokáig azzal küzdesz, hogy az ABS nem tapad rendesen - amikor meg eléred, hogy tapadjon, akkor azzal fogsz szenvedni, hogy egy darabban műtsd le a tárgyasztalról.
  • Az egész tárgyasztal egy roppant érdekes szendvics: egy fogalmam nincs miből készült fekete hőszigetelőhab után jön az alu szendvicslap (valami kompozit műanyag lehet ebben), azon megint a fekete hőszigetelő hab, arra a szilikon fűtőelem (gondolom 24 V-os, hogy kellően gyors legyen), azon egy üveglap és minderre a PEI plate. Az összes hő felfele megy az üveglap felé. Gondolom az üveg csak a sík felület miatt kell és azért, mert sem a szilikon, sem a PEI plate nem elég egyenletesen sima és merev.
  • Baromi tágas, jól belátható és legfőképp kényelmesen szerelhető az egész. Minden kábel csatornákban a helyén, az utolsó szegletéig minden szuperprecíz. A 10 collos touch screen, az ARM architektúra már csak mind-mind hab a tortán - a két német srác nagyon nagyon magasra tette a lécet.

Temperált nyomtatótérrel forgalomba hozni a printert meglehetősen bátor dolog volt. A Stratasys nevű gyártóóriás birtokolja a 3D nyomtatás hőkamra szabadalmát 2020-ig - ha egyszer ezek a srácok az útjukba kerülnek, csúnya jogi következménye lehet a dolognak. Drukkolok nekik, hogy ez sose következzen be.

Live wire

Az előbb hallgattam az AC/DC: Live wire című számát és annyira berágta magát a fejembe, hogy eszembe jutott róla egy fene tudja mikor készült búvározós klip. Jó régi video ez, körbenéztem, hátha megvan nagyobban vagy esetleg felraktam már ide a blogra, de sajna egyik sem. Szóval itt van 480x270-es bélyegméretben, have fun:

Light in the night from Gabor Penoff on Vimeo.

3D nyomtatás: slicerek

Van egy téma, amiről idáig még nem meséltem, pedig legalább annyira fontos 3d print témában, mint maga a vas: ez pedig a szoftver, ami az STL modellünkből előállítja a nyomtató firmware-e által értelmezhető GCODE-ot. Most, amíg egy döglött printer porosodik mellettem az asztalon, ezt fogjuk pótolni.

Szóval megvan az STL formátumú modellünk. Az STL még csak a felület geometriáját definiálja, nem mondja meg, hogy a fizikai ojjektumunk hogy nézzen ki belül. Ezt a konverziót valósítják meg a "slicer" néven emlegetett alkalmazások. A "szeletelő" (=slicer) név elég találó: a programunk felszeleteli a nyomtatónk által kezelni képes rétegekre az STL modellt, kitalálja, hogy az adott réteg belül hogy nézzen ki, majd GCODE parancsokat generál, amik leírják a printernek, hogy melyik léptetőmotor milyen irányba mennyit mozduljon. Nem is olyan misztikus, ugye? Ha belegondolsz, ezzel meg is volnánk, hiszen a 4 motor (X, Y, Z, extruder) 2 irányba történő mozdításával már meg is rajzoltuk a modellünket.

Valóban ilyen egyszerű a dolog, illetve mégsem. A "szeletelőgépünknek" az alábbi paramétereket mindenképpen figyelembe kell vennie ahhoz, hogy az általunk kigondolt modellünket gyártassa le:

  • a modell külső felületének vastagsága
  • a tömör test belső kitöltöttségének mértéke és amennyiben nem teljesen tömör, akkor a kitöltés mintázata
  • a hotendből kilépő műanyagszál anyagvastagsága
  • a függőleges rétegek vastagsága
  • a nyersanyagfajtától függő hűlés során fellépő zsugorodás mértéke

Magyarul mondva egyáltalán nem mindegy, hogy egy vastagfalú vázát, egy minél könnyebb, zárt testet, vagy esetleg egy teljesen tömör alkatrészt akarsz készíteni ugyanabból a modellből.
Ezeket a paramétereket te konfigurálod a slicer algoritmus számára. Nem kell megijedni, a slicerek okosak, nem kell neked mindig mindent tuningolni, hacsak nem gerjedsz az ilyesmire :).

Általában 3 paramétert kell kézzel konfigurálnod, a többit a slicer kitalálja neked: anyagfajta, rétegvastagság, infill (=belső kitöltöttség %-ban). Vannak azonban helyzetek, amikor ezeken finomítanál, illetve vannak hozzám hasonló soha nem elégedett bolondok, akik folyton tuningolnának a "soha nem elég jó" outputon - na nekik a Nirvánát jelenti egy végtelenségig konfigurálható slicer alkalmazás.

A slicerek többsége összecsomagoltan érkezik a printert kontrolláló interfésszel (egy dolog a GCODE előállítása, meg egy teljesen másik dolog a GCODE kiküldése a printer buszára). Sok ingyenes slicer létezik: Pronterface/Printrun, Skeinforge,
Slic3r, az alapfunkcióit tekintve ingyenes KISSlicer, az Ultimakerekhez csomagolt ingyenes Cura, vagy épp a fizetős Simplify3D.

Én most csak eggyel fogok bővebben foglalkozni, aki még tegnap éjjel bekapcsolta bennem a posztíró gépet - ez pedig a Simplify3D.

A Simplify3D nem olcsó: 140 USD egy darab licenc, mégis átszoktam rá az ingyenes alternatívákról, mivel annyi hasznos plusz szolgáltatást nyújt, hogy csak pislogsz!

Kedvcsinálónak beszéljünk át pár tulajdonságot, amiben a Simplify3D kiemelkedik a slicer mezőnyből:

Régiókra szabható komplett slicer konfiguráció

A modelledet régiókra bonthatod és régiónként teljesen eltérő slicer konfigurációkat definiálhatsz. Így lehet pl. elérni, hogy egy modell talpa sűrűbb infillel készüljön.

Végletekig kifinomult támaszték (=support) struktúra generálás

Te állíthatod be a support kitöltöttségét, szabályozhatod, hogy a támaszték milyen távolságra készüljön a modelltől, definiálhatod, hogy +/- mekkora függőleges szögváltozás váltson ki support generálást. Ha több nyomtatófejed van, külön definiálhatod, hogy melyik fej készítse a supportot (a vízoldható polivinil-acetát (=PVA) azonnal értelmet nyer). Ha pedig mindez nem elég, kézzel szerkesztheted a slicer által generált támasztékot, eltüntetve az apró túllógások alá feleslegesen generált alátámasztásokat, amiket a printered még lekezel.

Raft, skirt, brim kezelése

A szoknya (=skirt) arra való, hogy a modell nyomtatásának indulásakor a nyomtatófej biztosan teljesen fel legyen töltve olvadt nyersanyaggal - ezért a modell rajzolása előtt "körberajzoljuk" azt.
A skirt tesója a karima (=brim), ami ugyanilyen körvonal, csak épp hozzáér a modellünkhöz. Ez akkor hasznos, amikor a testünknek apró részeinek kell a tárgyasztalhoz tapadni - a karima ezt a tapadást segít fokozni.
Végül a tutaj (=raft) a tárgyunk alá készülő, a tárgy alapjánál nagyobb talapzat. Ennek az az értelme, hogy egy elválasztó réteget képezve csökkentse az alsó rétegek hűlése során fellépő zsugorodás (=warping) mértékét. Természetesen a raftnak is megvan a maga tapadást segítő szerepe.

Mindhárom segédelemnek választhatunk itt is dedikált extrudert és számos offset definiálásával tudjuk egészen finomra hangolni a méretüket, kitöltöttségüket, illetve céltárgyhoz kapcsolódásukat.

Bed leveling wizard

Ha minden jól megy, nemsokára automatikus tárgyasztal kalibrálást kap a tetszhalott printerem, de ettől még nagyon fontos a Simplify3D jól átgondolt szintező algoritmusa: egyrészt képes arra, hogy az aktuális printelendő modell adatai alapján szintezzen, másrészt akár te is definiálhatsz neki tetszőleges számú szintezőpontot, amit ő sorra végigméret veled.
Ettől pedig semmi nem fontosabb: az első rétegnek tökéletesnek kell lennie.

A tegnap megjelent 2.2-es update a fentiekhez további elképesztően hasznos új paramétereket tett hozzá - ebből mutatok most hármat:

Falvastagítás

Ha csak ez az egy feature létezne a standard slicer funkciók mellett, már ezért megvettem volna az alkalmazást!

A vékony falú modellek általános problémája, hogy a slicerek csak pár párhuzamos vonallal rajzoltatják meg azokat. Ha a printer nem hajszálpontos, van egy minimális légáram print közben, a nyersanyagáram nem tökéletesen egyenletes vagy épp elfelejtettél print előtt fekete kakast áldozni teliholdkor, akkor ennek az lesz az eredménye, hogy az egymás mellé rajzolt csíkok nem tapadnak össze, hanem a print végén gusztustalanul szétválva röhögnek ki, emlékeztetve arra, hogy megint kidobtál egy csomó nyersanyagot a szemétbe.
Ha idáig eljutottál az olvasásban, akkor igazán megérdemelsz minderről egy fotót, amely a TepiDuzzog stáb jelenleg még csak elfuserált állapotában létező kameraállványáról készült:

thin-wall-slicer-problem

Erősebb infill

Gyatra anyagáramnál igazán hasznos tulajdonság a szimpla 1 vonalnyi vastagságnál vastagabbra rajzolt belső kitöltőminta.
A gyatra anyagáram simán jöhet abból, hogy:

  • koszos a hotend belül (mert mondjuk port hordott bele a műanyagszál, vagy mert túlhevítettél benne valamilyen nyersanyagot)
  • nem elég meleg a fej az adott nyersanyaghoz (mert mondjuk noname kínai szart vettél fele pénzért, ami egyenletlen minőségű)
  • nem egyelenes a nyersanyag átmérője (mert mondjuk noname kínai szart vettél fele pénzért, aminek az átmérője 0.05 mm-nél többet ingadozik)
  • a nyersanyag a tárolás során vizet szívott magába a levegőből (ezért kell vákumzártan csomagolt nyersanyagot venni, vagy egy jól záródó dobozban tartani a nyersanyagot egy vödör noname rizs társaságában, ami elvon minden párát a tárolótér levegőjéből)
  • túl gyorsan nyomtatsz és a hotend/extruder nem képes a nyomtatás tempójában megfelelő mennyiségű olvadt nyersanyagot biztosítani
  • nem áldoztál fekete kakast előző teliholdkor

Ilyen, amikor rendben van az infill:

infill-OK

És ilyen, amikor nincs rendben:

flow-problem

BTW az már régóta megy a Simplify3D-nek, hogy akár minden n. réteget tömörre nyomtasson, ezáltal is fokozva a belső struktúra merevségét.
Persze azért hacsak nem az van, hogy gyorsabban akarsz nyomtatni, akkor a fenti problémákat nem árt kiküszöbölni.

Változó sűrűségű támaszték

A support ot a slicerek általában konstans sűrűségűre generálják, ám annak igazán a talpán és a támasztott rész közelében a tetején kellene megfelelően sűrűnek lennie, a közbenső rész maradhatna ritkásabb, anyagot spórolva ezzel az endusernek. A Simplify3D-nél kódoló srácok pont ezt valósították meg most. Az alábbi ablakon látszik, amiről beszélek: ahogy közeledik a barnás színű support a támasztandó zöld területhez, úgy változik a struktúrája és válik egyre sűrűbbé:

Simplify3D-v2_2-variable-support-density

Nota bene a modell végén az a kékülés azt jelzi, hogy a slicer ott csökkenti a nyomtatási sebességet, mivel apró részletről van szó és finomra kell csinálni azt a darabot is :) Mindezt nem én definiálom, ők találják ki - ez aztán az attention to details!

Sok más apró finomítás érkezett még, a rengeteg új printer támogatásától kezdve a változtatható anyagáram mértékegységen keresztül a preview tárgyasztalra rajzolt grid vonalsűrűségének definiálásáig. A szoftver köré aktív közösség épült, a fejlesztő srácok nagyon figyelnek a felhasználók igényeire, a support pedig egyszerűen elképesztő - bármikor írok nekik, perceken belül jön a válasz. Így kell ezt csinálni!

3D nyomtatás: NaEzMi #5?

Rég volt már 3d print poszt, ennek az az oka, hogy mostanában nem vagyunk jóban én meg a printer, ami a nyomtató részéről abban nyilvánul meg, hogy nem működik normálisan. Ennek azért megvan az a nagy előnye, hogy sok tapasztalatot gyűjtök (amiből majd lesznek tanulságos posztok), de lassan ott tartok, hogy inkább csak nyomtatnék, nem gyűjteném már a sok tapasztalat. Nade!

Morgás helyett játsszunk egyet: itt egy modell, Krakkóban igazira váltható virtuális sörért indulhat commentekben a találgatás, hogy ez vajon mihez készül:

3dprint-naezmi5

Annyit segítek, hogy ha tudnám, az egészet egyetlen darabból nyomtatnám, de a modell jelen formájában ezt FFF printerrel elég macera megtenni, ezért _két_ darabból lesz majd egyszer összerakva.

Adóhivatal, Magyarország, 2014 december

Preface: ez a kálvária nem ma kezdődött, de csak idén novemberben álltam neki dokumentálni itt.

Újabb szerelmetes levél jött a NAV-tól - ahogy a múltkor Greg megjósolta, nem értik, hogy miért küldtem pénzt:

NAV-valasz-20141202

Egyszerűen az agyam eldobom: a hivatalnok nem tudja megmondani, hogy mire vetették ki az adót, mégis negyed/fél/egész/whatever évente közlik, hogy tartozom. Amikor megunom és elutalom az összeget, akkor meg közlik, hogy ez nem egyenlíti ki a tartozást, mert nem tudják, mivel tartozom.

Mac workflow: klikkmentes to do

Régen nagy örömmel használtam OS X alatt a Things alkalmazást. Ez egész odáig tartott, míg a fejlesztő srácok el nem kezdték ígérgetni a cloud sync támogatást, ami csak nem akart megérkezni - én pedig továbbléptem, előbb a The Hit List-re, aztán az OS X / iOS gyári Reminders alkalmazására, majd a német Wunderlist appra. Mindegyikkel volt valami bajom, aztán nemrég szembejött egy review, amiben újra nyakig dícsérték a Things-et, ezért úgy gondoltam, visszanézek - és nem bántam meg :)

Amivel már jó ideje kísérletezek az az, hogy a munka közben eszembe jutó teendőket minél kevesebb erőfeszítéssel rögzíthessem. Erre optimális lenne, ha a feladatkezelő alkalmazás korrektül scriptelhető lenne, én meg egy Alfred workflow-val beletolhatnám a mondandómat - ezt fogjuk most megcsinálni a Things mellé.

A Things-hez létezik már többféle Alfred workflow, én viszont egyikkel sem voltam elégedett. Olyat szerettem volna, amihez egy sorban kitölthetem a taskhoz tartozó összes paramétert mindenféle egerezés nélkül. Ehhez még hozzáálmodtam azt is, hogy felszedhetné az aktív Safari ablak URL-jét és az oldal címét, hátha csak épp azt akarom elmenteni. Tudom, van Reading list Safariban, amit viszont nem tudok taggelni és főleg fejlesztői doksiknál sokszor élem át azt, hogy emiatt nem találok meg egy korábban látott oldalt.

Szóval legyen benne task description meg task note kitaláló, de gyorsan állíthassak határidőt, feladatcsoportot és tageket is. Kitaláltam ehhez a következő szintaxist:

things-workflow-sample

Az eleje a feladat leírása, a @ után álló "3d print" a feladatcsoport (a Things nyelvén "project vagy area of responsibility"), a # utáni "Ultimaker" a feladatra akasztott címke, a > karaktert követő 1 érték pedig azt mondja a workflownak, hogy ez a munka holnap határidős. Mindezt látod is on-the-fly, ahogy gépeled be a feladatot. Csak elsőre hangzik bonyolultan, 5 task kézzel és már ott is van az izommemóriában :)

Ez pedig a Safari autofill - így néz ki, amikor felszedi az aktív Safari ablak címét és URL-jét:

things-workflow-safari-autofill-sample

A > karakter utáni dátummal tud minimálisat matekozni. Megadhatsz neki 8 (=YYYYMMDD), 6 (=YYMMDD), 4 (=MMDD), vagy 2 (=DD) jegyű dátumot - ha nem teljes a dátum, akkor a hiányzó darabokat az aktuális napi dátumból kiegészíti. Magyarul a >1201 ma 2014 december elsejét jelenti a workflownak.
Ezen túlmenően tud hozzáadni illetve elvenni napokat az aktuális dátumból: az első karakter az előjel, azt követi egy szám, majd az utolsó karakter opcionálisan jelölhet nap helyett hetet (w), hónapot (m) vagy évet (y). Egy példán keresztül: a mai napon gyártott to do-n a >+3w dátummatek 2014 december 17-ét állítja be due date-nek, mivel az van 3 hét múlva.

Ha tetszik és kipróbálnád, a workflow-t szedheted tőlem vagy a packal.org-ról is.

Update: kicsit szellősebbre vettem a parser által kitalált to do elemeket, illetve most már felismeri a @today és @someday targeteket is és a megfelelő Things listákba pakolja az így címzett to do itemeket:

things-alfred-workflow-v1_1

Mac workflow: iTunes playlist tagger

A probléma

Elég régóta használok tageket OS X alatt - a gyári óperenciás rendszerben még nem léteztek, már gyártottam őket valami toollal, ami openmeta kompatibilis volt. Amióta a Finderrel is lehet taggelni, azóta nem értem, hogy az iTunes médiaszörnyeteg miért nincs ugyanerre felkészítve. Számtalan alkalommal került már elő, hogy mondjuk hangulat alapján hallgatnék zenét, vagy mondjuk csak egy szál vékony női énekhangot akarok hallani - ilyesfajta keresésre pedig semmi nem képes.

Léteznek mindenféle toolok, amik ezt próbálják segíteni valahogyan: a Tangerine pl. ütemet próbál számolni, a Moody pedig egy 4x4 osztású 2D sebesség vs. hangulat mátrixba soroltatná veled a trackeket.

A megoldás

Mindkét fent említett játékos a trackekbe irkálna valami custom metaadatot, én viszont kitaláltam valami sokkal ügyesebbet! Egy track tetszőleges számú playlistben szerepelhet - legyen hát a playlist neve a tag, amit a trackre akasztunk! Már csak egy olyan eszköz kell, ami az aktuálisan játszott tracket gyorsan bedobálja ezekbe a "tag" playlistekbe anélkül, hogy ehhez egerezni kellene meló közben.
Szerencsére a platformon létezik Alfred, a csodás productivity tool, ami szénné scriptelhető, az iTunes meg nagy haverja az AppleScriptnek, úgyhogy már csak össze kell engedni őket.

Azt találtam ki, hogy ezek a speciális, tag-ként funkcionáló playlistek egy közös, "Tags" nevű playlist folderben fognak lakni és a nevük @ prefixxel kezdődik majd, így különböztetve meg őket a többi listától. Az Alfred workflow-nak pedig a következőket kell szolgáltatnia:

  • mondja meg, hogy épp mi szól
  • lássam egy listában az éppen lejátszott trackra összes releváns és irreleváns taget
  • egyszerre akárhány taget rápakolhassak az aktuális trackre

Nos, ilyen lett:

iTunes playlist tagger

Keyword vagy shortcut indítja. A listában zöld + ikonnal szerepelnek az aktuális trackre még nem ráakasztott, de egyébként létező tag-ek, piros - ikonnal pedig azok, amelyek már hozzá vannak rendelve. Értelemszerűen a pirosak törlik az adott tag-et, a zöldek hozzáadják.

Ez azonban a rendes power usernek még kevés lenne, mert mi van, ha több új tag-re van szükségünk? Ilyenkor jön az, hogy a "plst " kulcsszó után space-szel elválasztva irkálhatjuk a tageket. Ha a tag neve - prefixszel kezdődik, akkor az a tag törlődni fog, ha + karakterrel (a + nem kötelező, a nem mínusz első karakter automatikusan +-at jelent), akkor pedig hozzácsapjuk az adott tracket. Így akármennyi taget írhatunk egymás után, a tagger script szép sorban feldolgozza őket egyesével.

Na de nem lennék rendes kocka, ha nem néznénk meg a forrást. Itt van a script filter rész, ami felépíti a kiválasztó listát:

on run argv
	set q to argv as text
 
(*
	if not (itunes_is_running()) then 
		set xml to xml & linefeed & "<item uid=\"itunes_not_running\" arg=\"itunes_not_running\" valid=\"no\">" & linefeed
		set xml to xml & "<title>iTunes is not running</title>" & linefeed
		set xml to xml & "<subtitle>Start iTunes and retry</subtitle>" & linefeed
		set xml to xml & "<icon>now_paused.png</icon>" & linefeed
		set xml to xml & "</item>" & linefeed
 
		return xml & "</items>" & linefeed
	end if
*)
 
	-- pick up info from iTunes
	tell application "iTunes"
		set dbid to the database ID of the current track
		set artist_name to (get artist of the current track)
		set track_name to the name of the current track
		set pls to (get name of user playlists)
	end tell
 
	-- xml header
	set xml to "<?xml version=\"1.0\"?>" & linefeed
	set xml to xml & "<items>" & linefeed
 
	-- track info list item
	set xml to xml & linefeed & "<item uid=\"trackinfo\" arg=\"trackinfo\" valid=\"yes\">" & linefeed
	set xml to xml & "<title>" & track_name & "</title>" & linefeed
	set xml to xml & "<subtitle>" & artist_name & "</subtitle>" & linefeed
	set xml to xml & "<icon>now_playing.png</icon>" & linefeed
	set xml to xml & "</item>" & linefeed
 
	-- add new tag list item
	set xml to xml & linefeed & "<item uid=\"newtag\" arg=\"" & dbid & "|" & q & "\" valid=\"yes\">" & linefeed
	set xml to xml & "<title>New Playlist Tag</title>" & linefeed
	if q is equal to "" then 
		set xml to xml & "<subtitle>To remove tags use - prefix, e.g: slow -fast</subtitle>" & linefeed
	else
		set xml to xml & "<subtitle>" & q & "</subtitle>" & linefeed
	end if
	set xml to xml & "<icon>playlist_new.png</icon>" & linefeed
	set xml to xml & "</item>" & linefeed
 
	return xml & getTags(dbid) & "</items>"
end run
 
on getTags(dbid)
	-- assemble tag list
 
	set tags to ""
	tell application "iTunes"
		set artist_name to (get artist of the current track)
		set track_name to the name of the current track
		set pls to (get name of user playlists)
	end tell
 
	set tagsToRemove to {}
	set tagsToAdd to {}
 
	-- collect used/unused tags into lists
	repeat with pl in pls
		if pl starts with "@" then
			tell application "iTunes"
				set results to (every file track of user playlist pl whose database id is dbid)
			end tell
 
			if (count of results) > 0 then
				set end of tagsToRemove to pl
			else
				set end of tagsToAdd to pl
			end if
		end if
	end repeat
 
	repeat with pl in tagsToRemove
		set tags to tags & getItem("-", pl, dbid)
	end repeat
 
	repeat with pl in tagsToAdd
		set tags to tags & getItem("+", pl, dbid)
	end repeat
 
	return tags
 
end getTags
 
on getItem(prefix, myID, dbid)
	-- create tag list item
 
	set myIcon to ""
	tell application "iTunes"
		set track_name to the name of the current track
		set results to (every file track of playlist myID whose database id is dbid)
	end tell
	if (count of results) > 0 then
		set icon to "playlist_remove.png"
	else
		set icon to "playlist_add.png"
	end if
 
	set AppleScript's text item delimiters to "@"
	set myID to (text item 2 of myID)
 
	set myItem to ""
	set myItem to myItem & linefeed & "<item uid=\"" & myID & "\" arg=\"" & dbid & "|" & prefix & myID & "\" valid=\"YES\" autocomplete=\"" & myID & "\" type=\"default\">" & linefeed
	set myItem to myItem & "<title>" & myID & "</title>" & linefeed
	if prefix is equal to "+" then 
		set myItem to myItem & "<subtitle>Add this tag</subtitle>" & linefeed
	else
		set myItem to myItem & "<subtitle>Remove this tag</subtitle>" & linefeed
	end if
	set myItem to myItem & "<icon>" & icon & "</icon>" & linefeed
	set myItem to myItem & "</item>" & linefeed
 
	return myItem
 
end getItem
 
on itunes_is_running()
	-- iTunes detect - too slow to use
	tell application "System Events" to return (exists process "iTunes")
end itunes_is_running

Ez pedig a tagger, ami a playlist managementet csinálja:

on run argv
	set q to argv as text
 
	-- create folder playlist for tags
	tell application "iTunes"
		if not (exists folder playlist "Tags") then make folder playlist with properties {name:"Tags"}
	end tell
 
	set tid to AppleScript's text item delimiters
 
	-- separate dbid and tags
	set AppleScript's text item delimiters to "|"
	set dbid to (item 1 of (text items of q))
	set tags to (item 2 of (text items of q))
	set AppleScript's text item delimiters to tid
 
	-- get list of tags
	set AppleScript's text item delimiters to " "
	set qList to text items of tags -- not text of, text items of
	set AppleScript's text item delimiters to tid
 
	-- collect add/remove tags
	set addTags to {}
	set removeTags to {}
 
	repeat with qItem in qList
		set prefix to (character 1 of qItem)
		if (prefix is not equal to "+") and (prefix is not equal to "-") then
			set qItem to "+" & qItem
		end if
 
		if character 1 of qItem is equal to "-" then
			set end of removeTags to getToken(qItem)
		else
			set end of addTags to getToken(qItem)
		end if
 
	end repeat
 
	-- add tags
	repeat with addTag in addTags
		tell application "iTunes"
			set tagFolder to folder playlist "Tags"
			if (exists playlist addTag) then
				set newTag to (playlist addTag)
			else
				set newTag to (make playlist at tagFolder with properties {name:addTag})
			end if
 
 
			set results to (every file track of playlist addTag whose database ID is dbid)
			if (count of results) = 0 then
				duplicate (current track) to newTag
			end if
		end tell
	end repeat
 
	-- remove tags
	repeat with removeTag in removeTags
		tell application "iTunes"
			set tagFolder to folder playlist "Tags"
			if not (exists playlist removeTag) then exit repeat
 
			set results to (every file track of playlist removeTag whose database ID is dbid)
			if (count of results) > 0 then
				delete (some track of playlist (removeTag as text) whose database ID is dbid)
			end if
		end tell
	end repeat
end run
 
on getToken(the_string)
	return "@" & text 2 thru length of the_string
end getToken

Ha idáig eljutsz, be kell írjak egy pirosat, annyira száraz az egész. Azonban ha hozzám hasonlóan dolgozol és neked is hiányzik az iTunes-ből a tagging funkcionalitás, akkor szeretnéd a toolt! Ha tetszik és használnád, innen vagy a packal.org-ról vihető a komplett workflow.