2024-04-09:FUNCTION
の項の解説が少なかったため詳細を追記
前回はコピペでとりあえずComfyUIにオリジナルノードを認識させるところと、ノード名の付け方について解説した。
第一回を読んでいない方は次のリンクから
【ComfyUI ノードを作ろう #1】とりあえず動くノードを作る!ノード名の付け方 | 謎の技術研究部
今回は前回と同じプログラムを使って実際の処理の部分に迫っていきたい。
まずは前回のプログラムからクラスの中身を理解する。
class aaaaa:
@classmethod
def INPUT_TYPES(s):
return {"required": {"myINT": ("INT", {"forceInput": True})}}
RETURN_TYPES = ("INT",)
FUNCTION = "go"
CATEGORY = "test"
def go(self, myINT):
return (myINT,)
NODE_CLASS_MAPPINGS = {
"bbbbb": aaaaa,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"bbbbb": "My Node",
}
※前回解説している__init__.py
は省略する。同一階層に置いてあればOK
ここはPython基礎なのでさらっと。
これをつけているとクラスをインスタンス化しなくてもメソッドが使えるようになるおまじない。
def INPUT_TYPES(s):
return {"required": {"myINT": ("INT", {"forceInput": True})}}
こちらの部分。
その名の通り入力ピンに相当するデータ形式を記述する。
辞書型をreturnすることで実現する。
頭のrequired
の箇所は
の3種類。
ここはソケットの表示名。
このキーの値には"()"で表される「タプル」が入ることを注意する。
わからない人はPython基礎で学習すべし。
その中に各ピンの型を入れている。
公式の解説には
"MODEL", "VAE", "CLIP", "CONDITIONING", "LATENT", "IMAGE", "INT", "STRING", "FLOAT"
が例として上げられているが、これ以外なんでもよさそう。
適当に"MONEY"にして実行してみたがエラーにならず、恐らく自分で定義した型も使えそう。
ちょっと難しいが、実際にはbboxやsegmなんていう特殊な型はよく見かける。
現時点で型の定義などをする必要はないと思うが(要調査)同じ型のソケット同士しか繋げないはず
ここは
がある。
forceInput
をfalse
にするとノードに入力欄が現れ、true
にするとピンになる。
sliderのサンプルは次。ドラッグで前後にスライダを動かせる
RETURN_TYPES = ("INT", )
FUNCTION = "go"
CATEGORY = "test"
これだけ省略不可能な変数。必ず入れる。
RETURN_TYPESは出力される型を入れる。
タプルの最後の値は省略する書き方が一般的のようなので従っておく。
このタプルを("INT", "STRING", )
のようにしてやればアウトプットのピンは2個になる
アウトプット無しの終端ノードにしたい場合はRETUREN_TYPES = ()
にする。
def go(self, myINT):
return (myINT,)
ここは上で書いてあるFUNCTION = "go"
に従ってgo
という関数にする。名称は自由に変更する。
この関数がこのノードのメイン処理となる。
この関数の引数の最初はself
,それ以降の引数はINPUT_TYPES
で設定したものと同じ名称を入れることでここで入力ピンを受け取れる。
ここではmyINT
最後のreturn (myINT,)
だが、必ず最後にカンマを打って終わることを注意する。
これがないと例えば文字列をreturnした時に最初の1文字しかリターンされないという不具合が起きる。
このリターンに入った変数がアウトプットのピンから出力される。
右クリックでノードを出すときのカテゴリ分け。
ここをスラッシュで区切ると階層になる。
例えばCATEGORY = "test/a1/b2/b1"
とすると
このようになる。
末尾であるb1
の後にスラッシュを入れてはいけない。
空のカテゴリがこの後に追加されるので表示がおかしくなる。
以降は上に記述していないその他のクラス変数を紹介する。
RETURN_TYPES
で指定したピンの型に表示名をつけるだけ。このクラス変数は省略可能
RETURN_TYPES = ("INT","STRING" , "MONAY")
RETURN_NAMES = ("お金","を", "ください")
例えば上のようにすると
かなりお金を欲するノードになる。
OUTPUT_NODE = True
のように記述する。
これがTrue
の場合はこのノードが出力ノードとして扱われ、これに接続されている入力側のノードが全部実行されてからこれが実行されるようになる。
といったような記述(実は私もよく分かっていない)
すなわちノードの終端として扱われるようだが、この後に出力ピンをつけている実装例も複数ある。
SaveImageノードのような書き出し系のノードに使うらしい。
またわざわざこれをFalse
にしなくても、そもそもOUTPUT_NODE
のクラス変数はなくても良い。
今回は長くなったが以上だ。
極端な話あとは関数の中に処理を記述してやればなんでもできる。