Kolejna porcja ARexxa. Tym razem przykładowa wymiana danych między programami. Temat obejmie konwersję zdjęcia za pomocą programu graficznego, wykorzystanie ARexxowych bibliotek i w końcu utworzenie - zupełnie automagicznie - wiadomości e-mail do wysłania z załączonym zdjęciem.
Jak pamiętamy, zaletą ARexxa jest łatwa wymiana danych między programami. Celem tej komunikacji międzyprogramowej jest wykonanie pewnych operacji na danym pliku za pomocą różnych, niezależnych od siebie programów. Poniżej postaram się to zaprezentować na przykładzie programu ArtEffect i YAM. Dlaczego akurat te dwa programy? Gdyż do celów poniższego artykułu posłuży mi cyfrowe zdjęcie wysokiej rozdzielczości. Moim zadaniem jest przeskalowanie tego zdjęcia, zrobienie jakiegoś efektu, dodanie napisu i następnie wysłanie takiej zmodyfikowanej fotografii za pomocą programu YAM pod wskazany adres e-mail. Co więcej, planuję wykorzystać dwie zewnętrzne biblioteki. Jedną, aby dodać domyślne narzędzie (Default Tool) do ikonki zdjęcia i drugą, aby obejść brakujące polecenie ARexxa w programie ArtEffect. Całość oczywiście w sposób całkowicie "automagiczny", bez żadnej interakcji z użytkownikiem. Dla wygody podzieliłem tekst na cztery części. Skrypt z założenia ma być wykorzystany w OpusMagellanie, podpięty pod kontekstowe menu fotografii cyfrowej (rozpoznanie po nagłówku EXIF).
Zapraszam do lektury.
Część 1. ArtEffect4
Jak ARexx to oczywiście skrypt. Można zadać pytanie skąd wiadomo, jakie polecenia czy komendy można wykorzystać w skrypcie? Każdy program ma przecież inny, swój własny zestaw dostępnych poleceń ARexxowych. Celem poznania dostępnych poleceń należy po prostu zerknąć do dokumentacji dostarczanej wraz z programem, z reguły w formacie Amigaguide. Znajdziemy tam opis programu jako takiego, ale i opis portu ARexxa z dokładnym opisem jego poleceń. Podobnie jest z ArtEffectem.
Piszemy więc skrypt, a może raczej jego zarys:
/* Skrypt AE-YAM.rexx; innymi słowy tytuł skryptu. */ OPTIONS RESULTS /* aktywacja zmiennych */ PARSE ARG sciezka /* przekazanie zmiennej w postaci ścieżki do zdjęcia do skryptu */ IF ~SHOW('Ports','ArtEffect') THEN ADDRESS COMMAND 'Run >NIL: Dh1:ArtEffect4/ArtEffect' /* uruchomienie ArtEffect */ ENDIF ADDRESS COMMAND 'waitforport ArtEffect' /* oczekiwanie aż ArtEffect się uruchomi */ ADDRESS "ArtEffect" /* otwarcie jego portu ARexxa */ LOCKGUI /* blokada GUI ArtEffecta */ LOADPIC sciezka /* otwarcie fotografii cyfrowej oryginału */ SCALEPIC 25 25 PERCENT /* redukcja jej rozmiaru do 25% */ TEXT 50 50 FONT BOOKMANDEMI.FONT SIZE 24 PLAIN MODE SHARPEN2 TEXT Power of ARexx! /* umieszczenie tekstu */ DOMETHOD EDGEFIND /* wykonanie efektu graficznego */ SAVEPIC 'Ram:fotka.jpg' PLUGIN 'JFIF-JPEG' QUALITY 90 /* zapisanie do RAM pliku wynikowego */ CLOSEPIC FORCE /* zamknięcie okna z obrobionym zdjęciem */ UNLOCKGUI /* odblokowanie GUI ArtEffecta */
Część 2: Biblioteka RexxTricks.library
Mam więc już zmodyfikowaną fotografię, którą zapisałem do pliku fotka.jpg w pamięci RAM. W ustawieniach programu ArtEffect mam zaznaczone - w przypadku zapisu obrazka - tworzenie jego ikonki. Okazuje się, że ikonka to miniatura obrazka, ale bez przypisanego narzędzia do jego otwarcia. Postanawiam dopisać "automagicznie" jakąś domyślną aplikację, powiedzmy Multiview. Ale że tak Arexx, jak i ArtEffect nie ma takiego polecenia, więc będzie mi potrzebna zewnętrzna biblioteka zawierająca wymaganą funkcję. Wymaganą bibliotekę znajduję na Aminecie. Jest to rexxtricks.library. Spośród jej wielu funkcji, czy wbudowanych poleceń, znajduję SETDEFAULTTOOL, która właśnie pozwala na modyfikację przypisań w ikonce. Opis wszystkich dostępnych funkcji tej biblioteki znajduje się oczywiście w pliku rexxtricks.guide w pakiecie razem z biblioteką. Instaluję więc bibliotekę rexxtricks.library w systemie, po czym dopisuję do skryptu:
CALL ADDLIB('rexxtricks.library',0,-30,0) /* standardowy sposób otwarcia danej biblioteki */ CALL SETDEFAULTTOOL('RAM:fotka.jpg','MultiView') /* wymogi i składnia tego polecenia za rexxtricks.guide */
I Multiview jako domyślne narzędzie (Default Tool) w ikonce mam dopisane.
Część 3: YAM
IF ~SHOW('Ports','YAM') THEN ADDRESS COMMAND 'Run >NIL: YAM:YAM NOCHECK' /* sprawdzam czy YAM jest otwarty, jeśli nie to go uruchamiam */ ENDIF adres = email@to.pl /* zmienna zawierająca docelowy adres e-mail */ temat = Zdjęcie cyfrowe /* zmienna zawierająca temat wiadomości */ ADDRESS "YAM" /* uruchamiam port ARexxa YAM-a */ SHOW /* otwieram główne okno YAM-a */ MAILWRITE /* otwarcie okna edycji wiadomości */ WRITETO adres /* umieszczenie adresu e-mail */ WRITESUBJECT temat /* umieszczenie tematu */ WRITEATTACH 'Ram:fotka.jpg' /* załączam plik fotka.jpg do wiadomości */ WRITEATTACH 'RAM:fotka.jpg.info' /* załączam ikonkę do wiadomości */ WRITEQUEUE /* wiadomość z załączonym obrazkiem gotowa do wysyłki */ HIDE /* redukuję YAM-a do ikonki */ ADDRESS COMMAND 'Delete RAM:fotka?#' /* usuwam pliki robocze z RAM: */
Część 4: Znowu ArtEffect i zewnętrzna biblioteka.
Jak zdążyłem zauważyć, w programie ArtEffect brakuje polecenia ARexxa zamykającego program. Co więcej, program nie pozwala się również zamknąć za pomocą poleceń AmigaDOS typu Break czy Kill. A zamykanie z menu programu ArtEffect to raczej niezbyt "automagiczne". Na szczęście program ArtEffect można zamknąć tradycyjnym skrótem klawiaturowym Amiga-Q. Wystarczy więc zasymulować użycie tych klawiszy i ArtEffect zakończy swą obecność na blacie. Przydatna znowu okazuje się zewnętrzna ARexxowa biblioteka, tym razem rx3h.library, która to w duecie z poleceniem AmigaDOS RawInsert wykona za mnie niewdzięczną pracę. Tak biblioteka, jak i RawInsert dostępne są oczywiście na Aminecie. Instaluję więc rx3h.library w systemie, po czym dopisuję do skryptu:
CALL ADDLIB ('rx3h.library', 0, -30, 0) /* otwieram bibliotekę rx3h.library / CALL SCREENTOFRONT('ArtEffect') /* uaktywniam okno programu ArtEffect za pomocą funkcji SCREENTOFRONT */ ADDRESS COMMAND 'C:RawInsert' "descr=<ramiga q>" /* zamykam program ArtEffect poprzez symulację wciśnięcie klawiszy RAmiga-Q */
W zasadzie skrypt gotowy. Dobrze by jeszcze było pozamykać wykorzystane biblioteki:
REMLIB('rexxtricks.library') REMLIB('rx3h.library') EXIT /* koniec skryptu */
Podsumowanie
Skrypt wykonuje "automagicznie" następujące zadania:
Skrypt mam podpięty w Magellanie pod menu kontekstowe zdjęcia cyfrowego (nagłówek EXIF). Szybkość wykonania funkcji zawartych w skrypcie zależy od konfiguracji Amigi. Niektóre rzeczy można zrealizować na pewno w nieco inny, krótszy sposób, ale dla celów edukacyjnych zostawiam to w takiej postaci, jak przedstawiłem. Program ArtEffect wybrałem przypadkowo, można wykorzystać dowolny inny spełniający nasze wymagania. W skrypcie można go już zamknąć wcześniej, po zapisaniu zmodyfikowanej fotografii do pamięci RAM. Zamiast ArtEffecta można użyć innego programu do konwersji rozmiaru bez otwierania jakiegokolwiek GUI, co przyspieszy działanie skryptu i dopiero zmniejszone zdjęcie otworzyć programem ArtEffect. Można dodać sampel dźwiękowy informujący o zakończeniu działania skryptu itd.
W skrypcie należy zmodyfikować ścieżkę dostępu do programu ArtEffect. Podobnie zmienne adres i temat wiadomości e-mail. Efekt graficzny jest przypadkowo dobrany. Do nałożenia napisu wykorzystałem czcionkę Bookmandemi.font. Można wykorzystać dowolny inny, ale nie wszystkie fonty są rozpoznawalne przez program ArtEffect. Polecam eksperymenty w tym zakresie.
W załączniku gotowy skrypt.