Polskie Forum Użytkowników GIMP-a

Dodatki => Pluginy i Script-Fu => Wątek zaczęty przez: Ziomioslaw on 23.11.2007, 12:59:06



Tytuł: FAQ Skrypciarza GIMPowego
Wiadomość wysłana przez: Ziomioslaw on 23.11.2007, 12:59:06
Pytania filozoficzne (pytania ogólne)

Scheme? Ki diabeł?

Scheme, to dialekt LISPa, jest on nieco inny niż C, C++, Pascal itp ... (jeśli ktoś zna te języki). Ale do prostych skryptów nie powinno być problemów.

http://pl.wikipedia.org/wiki/Scheme

Scheme, dziwne to takie, czemu akurat on?!

Szczerze, to nie wiem. LISP jest dość popularny (no był w każdym razie), zwłaszcza wtedy. Jest używany jako język skryptowy w innych znanych aplikacji. Podejrzewam, że programiści GIMPa znali i lubili LISPa, a Scheme był wtedy na tyle popularny, że postanowili go w GIMPie wkompilować. Wszystkie inne języki skryptowe do GIMPa wymagają dodatkowych wtyczek, lub obecności dodatkowych programów w systemie.

Gdzie mogę poczytać o Scheme'ie?

http://www.gimpuj.info/scriptfus-plugins/liniki-do-tutoriali-na-temat-skryptowania-t3811.0.html

Czemu na forum nie ma żadnych tutków do Schema?

Bo po co przepisywać coś, co już na necie jest? (patrz wyżej)

Czy skrypty GIMPa można pisać w innych (niż Scheme) językach?

Tak, można np.: w Perlu, Pythonie - to chyba najpopularniejsze (nie licząc Scheme) - można też w C#, Tcl czy Ruby'im (dwóch ostatnich jeszcze w użyciu nie widziałem, ale wierzę w ich istnienie:P)

Ale skąd mam znać te wszystkie funkcje GIMPa?

Od tego jest "Przeglądarka procedur" - znajdziesz ją w Dodatkach (na głównym panelu programu).

Poczytałem tutoriale o Scheme'ie, chciałbym coś więcej się pouczyć.

Pobierz więc już napisane skrypty i oglądaj ich kod. Skąd je brać?:P Heh - a w jakim dziale jesteś?

Jak zainstalować Python-Fu?

W Linuksie prawdopodobnie już będzie zainstalowany razem z GIMPem - Python jest na dzień dobry w większości dystrybucji.
W Windowsie w czasie instalacji GIMPa należy wybrać opcję "Zaawansowana instalcja", a wtedy w okienku zaznaczyć opcję obsługi skryptów Python - tutaj mała uwaga - trzeba mieć zainstalowanego Pythona w odpowiedniej wersji.

A mojego pytania tutaj nie ma!

Dopisz je poniżej, a doda się je.

Wersja tego FAQ

v. 0.10 z dnia 2010.06.06

Pytania, które mogą pojawić się przy uruchamianiu swoich, jak i cudzych skryptów.

Napisałem (mam) skrypt do wersji 2.2, ale w nie działa on w wersji 2.4

Spróbuj tutaj poszukać pomocy: http://www.gimp.org/docs/script-fu-update.html

Mam GIMPa 2.6 i pojawia mi się błąd: "Error: Bad syntax of binding spec in let*:"

Jeśli składnia jest poprawna, pamiętaliśmy o dodatkowej parze nawiasów, a mimo wszystko dalej mamy problem, to został on wyjaśniony np. tu: http://gimp.org/release-notes/gimp-2.6.html
Jeżeli w skrypcie, w sekcji let* znajdują się deklaracje zmiennych, nie zainicjowanych (czyli wpisu typu: "(zmienna)"), np. jak tu:
Kod:
(let* (
      (four (+ 2 2))
      (zmienna)
      )
Należy je zainicjować jakąś wartością, np. zerem:
Kod:
(let* (
      (four (+ 2 2))
      (zmienna 0)
      )

Pytania, które pojawią się w akcie tworzenia.

Poprawiłem swój skrypt, zapisałem plik, jednak GIMP jakby tego nie zauważył.

Skrypty należy odświeżyć (Dodatki->Script-Fu->Odśwież skrypty)

Przy odświeżanie skryptów, lub ich ładowaniu dostaje komunikat: "Error: syntax error: illegal token"

Błąd składniowy, czyli gdzieś brakuje domknięcia nawiasu, lub tych domknięć jest za dużo - przydał bv się edytor, który wyszukuje nawias domykający do danego.

Chciałbym wstawiać polskie znaczki w komentarzach i tekstach ale GIMP ich nie "trawi"

Zapisz plik skryptu jako UTF8.

Pojawia mi się "Error: Invalid type for argument", a przecież dobrze wprowadziłem argument.

Wyjaśnię na przykładzie, wyświetlamy nowo utworzony obrazek, piszemy więc zgodnie z opisem funkcji z "Przeglądarki procedur"
Kod:
(gimp-display-new (gimp-image-new 100 100 RGB))
Na pierwszy rzut oka, wygląda w porządku, funkcja gimp-display-new wymaga tylko parametru ID obrazu, zwraca go właśnie funkcja gimp-image-new. Mimo wszystko mamy problem - czemu? A, bo funkcje zwracają zwykle swoje parametry jako listy ( zamiast ID, dostajemy '(ID)), nawet jeśli to listy jednoelementowe - stąd należy pobrać ten element z tej listy - funkcja car.
Kod:
(gimp-display-new (car (gimp-image-new 100 100 RGB)))

Pojawił mi się "Error: eval: unbound variable: [nazwa]"

Czyli wykorzystujemy nie znaną wcześniej zmienną - najczęściej literówka przy nazwach zmiennych lub funkcji.
Uwaga: jeśli posługujesz się starym tutorialem, edytujesz stare wersje skryptów, być może masz problem, który został opisany w pytaniu: "Napisałem (mam) skrypt do wersji 2.2, ale w nie działa on w wersji 2.4".

Gdzie mogę znaleźć opisy atrybutu SF-ADJUSTMENT oraz innych?

Zajrzyj do zewnętrznych tutorialów Script-Fu.
Poniżej podaje przykładowe linki do dokumentacji online GIMPa (język angielski) rozdział 3.4.7: http://docs.gimp.org/2.6/en/gimp-using-script-fu-tutorial-first-script.html#id2590535
Polski skrócony opis: http://ds5.agh.edu.pl/~kubek2k/papers/gimp-scheme/scheme.html#SEC7

Jak przeliczyć wymiary obrazka, jeśli chcemy skalować go proporcjonalnie, do zadanej np. szerokości?

To kwestia prostej proporcji. Proporcja wymiarów obrazka głównego to np.
szerokość / wysokość = "nowa szerokość" / "nowa wysokość"
Oczywiście można też spojrzeć nieco inaczej:
wysokość / szerokość = "nowa wysokość" / "nowa szerokość"

Wymieramy sobie który wzór nam pasuje i wyliczamy wymiar którego nie mamy. Dla przykładu, "nową szerokość":
"nowa szerokość" = (szerokość / wysokość) * "nowa wysokość"

Proste co nie? Analogicznie "nowa wysokość" wynosi:
"nowa wysokość" = wysokość / szerokość * "nowa szerokość"

W kodzie ostatni wzór wygląda następująco:
Kod:
(set! new-tmp-height (* new-tmp-width (/ (car (gimp-drawable-height drawable)) (car (gimp-drawable-width drawable)))))

Użyto tutaj funkcji gimp-drawable-height i gimp-drawable-width służących do pobierania wymiarów istniejącej warstwy.

Mam obraz (IMAGE), jak pobrać warstwę (DARWABLE) dla niego?

Można użyć funkcji spłaszczającej: gimp-image-flatten. Np.:
Kod:
(darwable (car (gimp-image-flatten image)))
Ale chyba lepiej użyć gimp-image-get-active-layer. Np.:
Kod:
(darwable (car (gimp-image-get-active-layer image)))

Jak pogrupować instrukcje skryptu w jedną w podglądzie zmian (przy cofaniu)

Należy użyć dwóch poniższych funkcji. Jako parametr przyjmują obraz (IMAGE).

Kod:
(gimp-image-undo-group-start image)
; ... instrukcje do pogrupowania ...
(gimp-image-undo-group-end image)

Obraz po ukończeniu skryptu jest nieodświeżony

To zupełnie normalne, należy obraz odświeżyć ręcznie - służy do tego funkcja gimp-displays-flush.

Kod:
(gimp-displays-flush)


Jak sprawdzić, czy listy są takie same?

Złożone obiekty porównuje się przy użyciu funkcji equal?.


Tytuł: Odp: FAQ Skrypciarza GIMPowego
Wiadomość wysłana przez: Sebastian on 19.10.2008, 12:07:16
Dopiero zaczynam pisać skrypty i natrafiłem na parę problemów, jeden już co prawda rozwiązałem, ale drugi to dalej problem.

1 -
Gdzie mogę znaleźć opisy atrybutu SF-ADJUSTMENT oraz innych?

Znalazłem to:

Cytuj
SF-ADJUSTMENT "SF-ADJUSTMENT (slider)" '( 30 1 2000 1 10 1 0)
 SF-ADJUSTMENT "SF-ADJUSTMENT"         '(400 1 2000 1 10 1 1)

Okej ale za co odpowiadają konkretnie te właściwości. W przeglądarce tego nie ma a w sieci też znajduje tylko pytania podobne do mojego.
Co prawda mogę po trochu sam to rozpracować ale gdybyś był tak miły i opisał mi te atrybuty to byłbym bardzo wdzięczny :).

2 -
Cytuj
Pojawił mi się "Error: eval: unbound variable: [nazwa]"

Czyli wykorzystujemy nie znaną wcześniej zmienną - najczęściej literówka przy nazwach zmiennych lub funkcji.

Wydaje mi się że nie tylko dlatego może wywalać taki błąd:

Cytuj
By far, the most common problem that can be expected if using an older script is that it might assign a value to a variable without first declaring the variable. SIOD-based Script-fu would permit a statement such as (set! x 4) even if 'x' had not been declared -- 'x' would be defined automatically to be a global variable. The new Script-fu protects against this situation and the programmer must declare the variable first. The offending script would result in an error message stating, "Error: set!: unbound variable: x".

The use of global variables is generally discouraged because another function (written by a different author) may have chosen to use the same name and the two functions would interfere with each other. For this reason, the correct method of declaring 'x' in the preceding example is to use the let or let* statement:

(let* ( (x 4) )
  ...
  ...
  ...
  )

Mi wywalało taki błąd i to mnie poratowało, można by to dopisać do FAQ.


Tytuł: Odp: FAQ Skrypciarza GIMPowego
Wiadomość wysłana przez: Ziomioslaw on 19.10.2008, 14:18:57
Ad. 1
W tutorialach do Schema -> linki w wątku obok.

Ad. 2
Tak, wiem, ale to występuje tylko przy starych skryptach i w zasadzie sprawdza się do używania nieznanej zmiennej.


Tytuł: Odp: FAQ Skrypciarza GIMPowego
Wiadomość wysłana przez: krzysiek1311 on 06.11.2009, 22:31:54
w jaki sposób można dodać pluginy do Gimpa.


Tytuł: Odp: FAQ Skrypciarza GIMPowego
Wiadomość wysłana przez: Ziomioslaw on 06.11.2009, 22:35:42
w jaki sposób można dodać pluginy do Gimpa.

1. Ten wątek dotyczy Script-Fu
2. Ten wątek bardziej pisania skryptów niż podstaw (od nich jest FAQ)
3. Odpowiedź znajdziesz w wielu miejscach, m.in. w swoim katalogu GIMPa - folder o wdzięcznej nazwie "plug-ins", albo w forumowym FAQ.



Tytuł: przykłady z oficjalnego tutoriala
Wiadomość wysłana przez: ciepły on 12.09.2013, 17:14:23
chciałem napisać jak się zdaje prosty skrypt, który zrobi pasek postępu na obrazku
(przkład: http://i1328.photobucket.com/albums/w538/cieply/Blade_progress__palace_back_zps718197e3.jpg (http://i1328.photobucket.com/albums/w538/cieply/Blade_progress__palace_back_zps718197e3.jpg))
tyle, że takich pasków trzeba 50 sztuk bo to będzie wrzucone do bmp2avi więc ręczna robótka odpada i zacząłem czytać podstawy Scheme i przepisywać oficjalne tutoriale
żeby nie było przepisałem je z oficjalnego tutoriala i...
cóż, jakoś nie działają i nie bardzo wiadomo o co chodzi

# @ http://www.gimp.org/tutorials/Basic_Scheme2/index.html
> (set! a 5)
Error: (<unknown> : 21524835) set!: unbound variable: a

> (set! b '(1 2 3))
Error: (<unknown> : 21530020) set!: unbound variable: b

gdzie w tym samym tutku jest napisane, że set! jest odpowiednikiem przypisania - a co ja niby robię - przypisuję: a := 5 ( w bardziej ogólnej notacji)

to samo z let:
# let
> (let* c 2)
Error: (<unknown> : 21505965) Bad syntax of binding spec in let* : c

> (let* c (2))
Error: (<unknown> : 21508499) Bad syntax of binding spec in let* : c

> (let* c '(2) )
Error: (<unknown> : 21515263) Bad syntax of binding spec in let* : c


# może coś bardziej życiowego...
# znowu przykład z http://www.gimp.org/tutorials/Basic_Scheme2/index.html
>  (set! image (car (gimp-image-new 320 240 RGB)))
Error: (<unknown> : 21507235) set!: unbound variable: image

nawet tak prosta rzecz jak:
> (set! x 20)
Error: (<unknown> : 21504945) set!: unbound variable: x
# na www.gimp.org/tutorials jest link do http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-7.html gdzie też tak jest napisane i to nie działa

kopanie w internecie nie bardzo mi pomogło, znalazłem tylko to:
http://www.gimptalk.com/index.php?/topic/32537-help-with-an-error-on-my-script-fu-script/ (http://www.gimptalk.com/index.php?/topic/32537-help-with-an-error-on-my-script-fu-script/)
oni też nie wiedzą co z tym zrobić



Tytuł: Odp: FAQ Skrypciarza GIMPowego
Wiadomość wysłana przez: Ziomioslaw on 12.09.2013, 20:59:48
składania let* to

Kod:
(let* (
        (zmienna1 wartość)
        (zmienna2 wartość)
        (zmienna3 wartość)
    )

    (instrukcja korzystająca z zdeklarowanych zmiennych)
    (instrukcja korzystająca z zdeklarowanych zmiennych)
    (instrukcja korzystająca z zdeklarowanych zmiennych)
)

Generalnie najłatwiej to chyba jednak pisać w pliku.


Tytuł: let, set, bla, bla
Wiadomość wysłana przez: ciepły on 13.09.2013, 12:02:14
> Generalnie najłatwiej to chyba jednak pisać w pliku.

pewnie tak, tylko co ja tam zobaczę, a tak wiem co się dzieje
nie umiem się inaczej uczyć, pewnie dlatego wciąż używam borlanda 3.1 - tam jest najlepszy debugger/inspect

jest jeszcze python, nie wiem na ile skomplikowany ale może byłby łatwiejszy


Tytuł: Odp: FAQ Skrypciarza GIMPowego
Wiadomość wysłana przez: Ziomioslaw on 13.09.2013, 17:17:43
Dużo łatwiejszy, zwłaszcza dla początkujących.