Помогите со скриптом

Главная Форумы Разработка Разработка сценариев Помогите со скриптом

В этой теме 4 ответа, 2 участника, последнее обновление  Black_Ru 5 года/лет, 5 мес. назад.

Просмотр 5 сообщений - с 1 по 5 (из 5 всего)
  • Автор
    Сообщения
  • #910

    Black_Ru
    Участник

    Ребята, помогите. Нужно для nn-го числа слоев, загруженных в gimp, выполнить три действия.
    С переменными разобрался — x в данном случае — номер слоя. Нужно сделать цикл, увеличивая значение x при каждом проходе, например до 30, при отсутствии номера слоя — продолжить до конца.

    (let*
    ((x 1)
    (set! (plug-in-edge 1 1 x 2.0 2 0))))
    (let*
    ((x 2)
    (set! (gimp-invert x))))
    (let*
    ((x 2)
    (set! (gimp-desaturate x))))
    #1691

    spoilt_exile
    Участник

    Такой код, как вы показали, работать не будет. Хотя бы банально из-за ошибок синтаксиса. Если вам нужно сделать цикл по слоям, то лучше всего воспользоваться процедурой gimp-image-get-layers, которая возвратит список слоев и их количество.
    Далее так примерно:


    (define counter 1)
    (define layers_list (car (gimp-image-get-layers Image)))
    (define layers_count (car (layers_list)))
    (define layers_arr (caar (layers_list)))
    (while (< counter layers_count)
    (define current_layer (vector-ref layers_arr (- counter 1)))
    %дальнейшие_операции_над_слоями%
    )
    #1692

    Black_Ru
    Участник

    Спасибо, я осуществил задуманное с помощью рекурсивного вызова, а именно

    (let countup ((i 5))
    (plug-in-edge 1 0 i 2.0 3 5) (countup (+ i 3)))

    (let countup ((i 5))
    (gimp-invert i) (countup (+ i 3)))

    (let countup ((i 5))
    (gimp-desaturate i) (countup (+ i 3)))

    ballpoint pen Effect
    (let countup ((i 5))
    (gimp-color-balance i 1 1 -17 -4 95) (countup (+ i 3)))

    Вероятно, не очень правильно, но задачу выполняет.

    Можно пару вопросов по установке переменных?!
    http://www.opennet.ru/docs/RUS/gimp_scriptfu/
    — в этой статье сказано: «В выражениях можно использовать переменные. Имя переменной представляет собой цепочку символов. Функция set! связывает переменную с ее значением возвращая при этом значение переменной:

    (set! Radius 25)»

    Не работает у меня в консоле указанный пример назначения переменной, работает только чере let*
    Почему так?

    В другой статье по script-fu встречал указание на то, что нет в Scheme циклов вовсе, а есть только рекурсия.
    Вы же вроде бы приводите вариант с циклом. Или я ошибаюсь?

    #1693

    spoilt_exile
    Участник

    (set! Radius 25)»

    Не работает у меня в консоле указанный пример назначения переменной, работает только чере let*
    Почему так?

    Скорее всего потому, что переменная Radius не была заранее объявлена. В Scheme переменная сначала объявляется (с помощью операторов let или define). Примерно такой код должен работать:


    (define Radius 25)
    (set! Radius 15)

    В итоге выйдет 15.
    Примечания: заранее стоит обозначить круг применения let и define. Первый объявляет список переменных со строгой областью видимости (переменные видны только внутри скобок let). Второй служит для объявления одной переменной в текущей области видимости. Если объявление идет вне какой-либо функции, то переменная будет глобальной. Если в функции, то будет видна только в функции. Если в цикле… ну дальше и так понятно.

    В другой статье по script-fu встречал указание на то, что нет в Scheme циклов вовсе, а есть только рекурсия.
    Вы же вроде бы приводите вариант с циклом. Или я ошибаюсь?

    Есть там циклы. Даже два: оператор while (я приводил с ним пример) и do (еще не вкурил как его использовать).

    #1694

    Black_Ru
    Участник

    Спасибо. Не зря я сюда зашел, догадывался, что та статья, в которой говорится об отсутствии циклов, либо старая, либо писалась торопливым автором, который не очень вникал в аспекты Scheme (и Lisp).

    Постараюсь переписать по-человечески без рекурсии свой скрипт на днях.

Просмотр 5 сообщений - с 1 по 5 (из 5 всего)

Для ответа в этой теме необходимо авторизоваться.