はじめに
第14回ではプラグインの作り方とショートカットの設定を、第15回ではドッキングパネルとUIパーツについて解説するので、今回がプログラミングの総仕上げになります。今回は、ダイアログUIに貼り付けたスピンボックスUIとプッシュボタンUIを使ってちょっとしたアプリ風のスクリプティングをします。このプログラムで自由にベジェ曲線を操作して変形して、オリジナルの幾何学模様が描けます(図1)。おまけで幾何学模様が変化するアニメーションも作ります。
図1:例えばこういうオリジナルの幾何学模様が作れる
ダイアログUIと直線を表示する
まず、ダイアログUIを表示するだけします。それから直線を1本だけ描きます。ダイアログUIにはベジェ曲線のコントロールポイントを移動するスピンボックスUIと、幾何学模様を描画するプッシュボタンUIを配置します。ちょっとだけUIパーツを駆使した作りになります。
ダイアログUIを作成する
何もないダイアログUIを表示だけします(図2)。説明が遅れましたが、ダイアログUIはダイアログUIの終了ボタンを押さないと元のKrita本体の操作ができません。Krita本体の操作に戻る際は必ず、プログラムから表示したダイアログUIを閉じてください。
図2:ダイアログUIを作成する
・サンプルスクリプト「dlg_bezier1.py」
03 | from PyQt5.QtWidgets import QDialog |
08 | def create_doc(self,width,height): |
09 | self.doc = Krita.instance().createDocument(width, height, "Line", "RGBA", "U8", "", 300.0) |
10 | Krita.instance().activeWindow().addView(self.doc) |
13 | self.create_doc(800,800) |
17 | dlg.setWindowTitle("Line Art Dialog") |
【サンプルスクリプトの解説】
PyQt5とkritaのモジュールを読み込みます。
「Dialog」クラスの「create_doc」メソッドはいつも通りドキュメントの作成です。
「create」メソッドで最初のメインの処理をします。
Dialogクラスのインスタンスを生成してダイアログUIを構築し、「dlg」変数に代入します。
直線を描画する
サンプルスクリプト「dlg_bezier1.py」に追加して、次のスクリプトを追記します。ベジェ曲線自体は画像の左上端に描画しますが、「translate」メソッドで画面中央に平行移動して表示します。「rotate」メソッドも実行していますが、ここではまだ0度なので全く回転していません(図3)。
図3:1本の直線を描く
・サンプルスクリプト「dlg_bezier2.py」
03 | from PyQt5.QtWidgets import QDialog, QHBoxLayout |
09 | def draw_bezier(self,num): |
10 | pixmap = QPixmap(self.doc.bounds().size()) |
11 | pixmap.fill(QColor(255,255,255)) |
13 | pen = QPen(QColor(0,0,0,255)) |
16 | painter.setRenderHint(QPainter.Antialiasing,True) |
17 | cx = int(self.doc.width()/2) |
18 | cy = int(self.doc.height()/2) |
19 | for i in range(0,num,5): |
21 | painter.translate(cx,cy) |
26 | return pixmap.toImage() |
28 | def bezier(self,painter): |
30 | path.cubicTo(0,0,200,0,200,0) |
31 | painter.drawPath(path) |
32 | # スピンボックスが押されたら1本のベジェ曲線の描画 |
34 | self.img = self.draw_bezier(1) |
36 | self.doc.refreshProjection() |
39 | root = self.doc.rootNode() |
40 | layer = root.childNodes()[0] |
41 | if self.img.sizeInBytes() == 4 * layer.channels()[0].channelSize() * self.doc.width() * self.doc.height(): |
43 | ptr.setsize(self.img.byteCount()) |
44 | layer.setPixelData(QByteArray(ptr.asstring()), 0, 0, self.doc.width(), self.doc.height()) |
49 | self.create_doc(800,800) |
【サンプルスクリプトの解説】
PyQt5モジュールのレイアウトウィジェットを読み込みます。
「draw_bezier」メソッドでベジェ曲線を配置します。真っ白に背景を塗り潰し、線を黒色にセットしてアンチエイリアスをかけ、painter画像を中央に移動してnum引数の数だけ回転しながら描画します。
「bezier」メソッドでベジェ曲線を描きますが、コントロールポイントが頂点と同じ座標なので、まだ直線です。0度からまだ回転せず1個だけ描画します。
「click_sb」メソッドで1本だけベジェ曲線を描かせて表示します。
「set_layer」メソッドはいつも通り画像の表示です。