python-fuメモ

python-fuを弄っていると

プラグインがクラッシュしました。

という何やら致命的なメッセージに遭遇するが、
これはpythonの文法エラーレベルの問題のようだ。


こんな感じでコマンドラインpythonに食わせてチェックする。

$ python layers.py 
  File "layers.py", line 8
    def each(layers, func, filter=lambda layer: True)
                                                    ^
SyntaxError: invalid syntax

ありがちなことに関数定義の":"を忘れています。
(1時間に3回のペース)


なおすと

$ python layers.py 
Traceback (most recent call last):
  File "layers.py", line 6, in <module>
    import gimpfu
ImportError: No module named gimpfu

となりgimpfuが無いよと言われる。
これが正常な状態。


今回作ったスクリプト

#!/usr/bin/python
# coding: utf8
"""
レイヤー操作いろいろ
"""
import gimpfu

def each(layers, func, filter):
  """
  順にfuncを適用する
  """
  for layer in layers:
    if filter(layer):
      func(layer)

def each_layer(img, func, filter=lambda layer: True):
  """
  上のレイヤから順にfuncを適用する
  """
  img.undo_group_start()
  each(img.layers, func, filter)
  img.undo_group_end()

def reversed_each_layer(img, func, filter=lambda layer: True):
  """
  下のレイヤから順にfuncを適用する
  """
  img.undo_group_start()
  each(reversed(img.layers), func, filter)
  img.undo_group_end()


################################################################################
def python_visible_all(img, drawable):
  """
  全レイヤーを表示する
  """
  each_layer(img, 
      lambda layer: gimpfu.pdb.gimp_drawable_set_visible(layer, 1))

gimpfu.register(
        "python-fu-visible-all",
        "visible all layer",
        "visilbe all layer",
        "ousttrue <youcharmanums._{at}_.gmail.com>",
        "ousttrue",
        "2009",
        "<Image>/Layer/すべて表示",
        "*",
        [],
        [],
        python_visible_all
        )

################################################################################
def python_invisible_all(img, drawable):
  """
  全レイヤーを非表示にする
  """
  each_layer(img, 
      lambda layer: gimpfu.pdb.gimp_drawable_set_visible(layer, 0))

gimpfu.register(
        "python-fu-invisible-all",
        "invisible all layer",
        "invisilbe all layer",
        "ousttrue <youcharmanums._{at}_.gmail.com>",
        "ousttrue",
        "2009",
        "<Image>/Layer/すべて非表示",
        "*",
        [],
        [],
        python_invisible_all)

################################################################################
def python_create_from_visible_layers(img, drawable):
  """
  表示中のレイヤーから新画像を作成する
  """
  # create
  new_img=gimpfu.pdb.gimp_image_new(img.width, img.height, img.base_type)
  new_img.disable_undo()
  # copy
  reversed_each_layer(img, 
      lambda layer: gimpfu.pdb.gimp_image_add_layer(new_img, 
        gimpfu.pdb.gimp_layer_new_from_drawable(layer, new_img), 
        0),
      lambda layer: layer.visible)
  new_img.enable_undo()
  # display
  gimpfu.pdb.gimp_display_new(new_img)
  gimpfu.pdb.gimp_displays_flush()

gimpfu.register(
        "python-fu-create-from-visible-layers",
        "create from visible layers",
        "create from visible layers",
        "ousttrue <youcharmanums._{at}_.gmail.com>",
        "ousttrue",
        "2009",
        "<Image>/Layer/表示中のレイヤーから新画像を作成",
        "*",
        [],
        [],
        python_create_from_visible_layers)

################################################################################
gimpfu.main()

gimpにもlayerグループ的なサムシングが欲しいな。