投稿

11月, 2022の投稿を表示しています

[Blender3.3] 日本の地形モデルメッシュ追加アドオンの開発 (3): スケールの適用と多言語対応

イメージ
前回 、シーンの単位の倍率の設定の影響を確認しました。 今回のアドオンは、その単位の倍率の指定によらずに固定的な距離の指定を行いたいことと、距離の指定はkm単位にしたいということで、結局、プロパティ設定の画面でシステムに任せた単位の表示を諦めました。 どうしたかというと、プロパティ名のところに単位を記載しました。実際にはしたのような形で、(km)を名前のところに入れてます。 入力値の単位は固定ですが、当然、メッシュを作成するときはシーンの情報を確認して倍率に従って長さに関する値を決めないといけません。今回、実際に入力された「範囲長さ (km)」とシーンの倍率設定とを鑑みて、適切な大きさの平面メッシュを作成するように直しました。 ついでに、メニュー表示の日本語対応も入れました。 # -*- coding: utf-8 -*- bl_info = { "name": "New Terrain Model (JP)", "author": "Shiki Kuraga", "version": (1, 0), "blender": (3, 3, 0), "location": "View3D > Add > Mesh > New Terrain Model (JP)", "description": "Adds a new Terrain Model (JP) Mesh Object", "warning": "", "support": "TESTING", "doc_url": "", "category": "Add Mesh", } translation_dict = { "ja_JP": { ("*", "Latitude")

[Blender3.3] 日本の地形モデルメッシュ追加アドオンの開発 (2): スケールの確認

イメージ
前回 、ポップアップ画面でsubtypeにDISTANCEを指定したScopeの値が、スケールの設定でどう変わるか心配だと書きました。 それを試してみました。 まず、初期設定だと単位は1mになっていて、ポップアップ画面でのScopeの値は1000mと表示されています。 ここで、単位を1cmにしてみます。 すると、ポップアップ画面でのScopeの表示は10mになりました。つまり、1000cmですね。スクリプトはいじっていないので、シーン設定の単位が表示に影響していることがわかります。 (2022/11/27追記) その後に調べたところ、シーンプロパティの設定変更時点で、確かにオブジェクトのScope値が変化するのですが、このときオブジェクトのexecute()メソッドは起動されません。そして、オブジェクトのScope値を編集して戻ると、シーンの単位の倍率が1.0(変更前の値)に戻ることが確認されました。なので、オブジェクト作成中の倍率設定の変更は意識不要そうです。 ただ、そうなると、本来的にはその時点の単位の倍率に応じて、ポップアップ画面のScopeの値を変化させないといけないんですが、ポップアップ画面のScopeのプロパティ値を状況に応じて変化させられるか。何となく、初期値は適当な値にでもしておいて、invoke()のところで倍率に応じた値を入れれば良さそうな気がしますが...。今度試してみようかと思います。 【 前回(1) 】 日本の地形モデルメッシュ追加アドオンの開発(2) 【 次回(3) 】

[Blender3.3] 日本の地形モデルメッシュ追加アドオンの開発 (1): メニュー追加とポップアップ画面

イメージ
これまでは準備ばかりでしたが、そろそろアドオンの開発を進めたいと思います。 最初に作るのは、日本の地形モデルのメッシュを追加するアドオンです。まだまだアドオン開発に不慣れで、試行錯誤しながらですので、一気に完成にはなりませんことご容赦ください。 使うデータですが、過去調べていた  日本の地形図データ  から、地理院の地形図タイルを使うことにします。PLATEAUについては、そもそもBlenderでも使えるデータが入っていますしね。あと、地形図タイルを使うことの利点は、日本国内ならどこでも好きな場所のデータが手に入ることです。 今回のアドオンの仕様ですが、オブジェクトの作成時に緯度、経度、範囲、ズームの値を指定して、それに合わせて地形図タイルのデータを取得しオブジェクトを作成して表示させることを目指します。 まずは、入力のポップアップを作るところから。 Blenderのテキストエディタを開いて、「テンプレート」から「Python > Addon Add Object」を開いて、名前を付けて保存します。ここでは、最終的に地形モデルのアドオンにするつもりなので、terrain_model_jp.py として作成します。 テンプレートを若干手直しして、下記の内容にします。 bl_info = { "name": "New Object2", "author": "Shiki Kuraga", "version": (1, 0), "blender": (3, 3, 0), "location": "View3D > Add > Mesh > New Object2", "description": "Adds a new Mesh Object", "warning": "", "support": "TESTING", "doc_url": "", &qu

[Blender3.3] Pythonスクリプトの読み込みフォルダを追加したい

イメージ
 先に、 トレース出力用のオブジェクト(Trace)を作成しました が、これを都度プログラムに書き込むのも面倒です。 と言うことで、importできるようにします。 やり方は簡単で、スクリプトの置いてあるフォルダを環境変数PYTHONPATHに追加するだけです。 私は自分のDocumentsフォルダの中に3DCGフォルダを作成し、その中にMyScriptsを作成してそこにpythonのファイルを置いているので、%USERPROFILE%\Documents\3DCG\MyScript と書きました。 これを設定した後にBlenderを起動すれば良いのです。 試しに、BlenderのPythonコンソールを起動して入力すると、以下の結果となりました。 >>> import sys >>> import pprint >>> pprint.pprint(sys.path) ['C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\3.3\\scripts\\startup', 'C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\3.3\\scripts\\modules', 'C:\\Users\\user\\Documents\\3DCG\\MyScripts', 'C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\python310.zip', 'C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\3.3\\python\\DLLs', 'C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\3.3\\python\\lib', 'C:\\BlenderLauncher\\stable\\blender-3.3.0+lts.0759f671ce1f\\3

[Blender3.3] Pythonプログラムのトレース情報の出力

Pythonにはデバッガもありますが、簡単にデバッグしようとする際には、トレース出力できると便利です。 Pythonの中身の調査を兼ねて、トレース出力用のクラス(Trace)を作ってみました。 Blenderのテキストエディタで以下の内容を打ち込み、ファイル名 "trace.py" で保存します。 import inspect class Trace: activated = False def on(): Trace.activated = True def off(): Trace.activated = False def print(*argv, **kwargv): if (Trace.activated): stack = inspect.stack() traceback = inspect.getframeinfo(stack[1][0]) print('%s:%d %s: ' % (traceback.filename, traceback.lineno, traceback.function), end="") print(*argv, **kwargv) if __name__ == "__main__": import datetime now = datetime.datetime.now() print("** test start at %s **" % now) print("test 1") Trace.print("trace print, False") print("test 2") Trace.on() Trace.print("trace print, True") Trace.print("1&quo

[Blender3.3] pythonでの__name__について

イメージ
 Blenderのアドオンでは、常に以下の文を入れるようにとされています。 if __name__ == "__main__": register() 記事によっては、この2行はおまじないのように書かれていますが、そこはきちんと把握しておきたいのが人情というもの。この __name__ の値がいつどういう値になるのかを調べてみます。 まず、コンソール付きで起動したBlenderの中でテキストエディターを開き、以下の一行だけを入力します。 print("This is '" + __name__ + "'.") この状態で「テキスト>スクリプト実行」あるいはalt+pを押下すると、以下の行がコンソールに現れます。 This is '__main__'. つまり、テキストエディターの中でスクリプト実行するときには __name__ の値は __main__ になっているということが分かりました。 では、次に中身のないアドオンを一つ作ります。今回の目的からすれば、内容はなんでも構わないわけなので、一番簡単に、以下の通りのものを test_print.py として作成しました。 bl_info = { "name": "Test Print", "author": "Shiki Kuraga", "version": (1, 0), "blender": (3, 3, 0), "location": "none", "description": "Test Print in Add-on", "warning": "", "support": "TESTING", "doc_url": "", "category": "obj