2011-04-25 141 views
1

我正在嘗試爲GIMP編寫一個基本腳本,但它似乎並不想正確工作。在進行我的選擇後,它應該按照下面的順序:降低活動層,擴大選擇2px,填充w /前景色,提高活動層。最終產品應該是頂層圖層下的純色。但是隨着我寫的代碼,它會跳轉活動層,但是在頂層而不是下面的層填充。這裏是我的代碼有:Scriptfu沒有按正確的順序執行,爲什麼?

(define (quick-fill image drawable) 
    (gimp-undo-push-group-start image) 
    (let* ((layer (car (gimp-image-get-active-layer image)))) 
    (gimp-selection-grow image 2) 
    (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 1)) 
    (gimp-bucket-fill drawable FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0) 
    (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 0))) 
    (gimp-undo-push-group-end image) 
    (gimp-displays-flush)) 
+0

這可能是一個愚蠢的「插入其中」的評論,但是:一般的函數式語言和特別的方案並不一定保證執行順序。 – drysdam 2011-04-25 12:20:29

+2

我想知道的是,當它綁定的'layer'變量根本沒有被使用時,在那裏做什麼'let *'。 – 2011-04-25 12:23:36

+0

@drysdam:不是插入GIMP方案的情況 - 它按順序做它的東西(否則它將不再作爲圖像腳本語言) – jsbueno 2013-03-25 10:07:48

回答

2

如果你想使一個過濾器,通過使後面填寫下面的層上,使圍繞當前層上的對象的2個像素的邊框(至少這就是它看起來你想-DO),試試這個:

(define (quick-fill image) 
    (gimp-undo-push-group-start image) 
    (gimp-selection-grow image 2) 
    (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 1)) 
    (let* ((active-drawable (car (gimp-image-get-active-drawable image)))) 
    (gimp-bucket-fill active-drawable FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0) 
    (gimp-image-set-active-layer image (aref (cadr (gimp-image-get-layers image)) 0))) 
    (gimp-undo-push-group-end image) 
    (gimp-displays-flush)) 

一對夫婦的注意事項:

1)你從未使用layer變量在let*部分,所以我刪除了。

2)Gimp不會繪製或填充活動圖層或對活動圖層做任何事情......相反它適用於活動繪圖。如果你想在下面的圖層上獲得頂層的填充,那麼這意味着你要傳遞頂層的drawable,所以它會填充頂層...切換active層到下面的層不會更改傳入的drawable的值。因此,在此修改中,我在let*部分創建了一個新的active-drawable變量,該變量初始化爲當前活動的可繪製您已將活動層從頂層更改爲底層。這樣你就填充了下面圖層的drawable,而不是原來的頂層draw-drawable。事實上,你根本不需要傳入一個可繪製的參數,因爲你可以從活動層獲取新的drawable(這是修改過的)。

相關問題