RhinoPython の Tips シリーズの第3回です。今回は細かな作業を減らすための工夫をプロジェクトの中で書いたプログラムから抜粋し挙げてみます。
RhinoPython の Tips シリーズの過去の記事は以下を参照してください
今回のお品書きは以下の3つです。
- 現在時刻を取得する
- フォルダパス、ファイルをエクスプローラから指定する
- 簡易的な UI を設定する
現在時刻を取得する
プロジェクトの過程でスナップショットを作成するときや、作成日時や編集日時を記録するときに今現在の時刻を取得したいということがあります。
Python の標準ライブラリを用いて以下のような形で現在時刻を取得することができます。
https://docs.python.org/ja/3/library/datetime.html#datetime.datetime.now
import datetime print(str(datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))) ### 20220113-090528 print(str(datetime.datetime.now().strftime("%Y%m%d"))) ### 20220113 print(str(datetime.datetime.now().strftime("%y%m%d"))) ### 220113
フォルダパス、ファイルをエクスプローラから指定する
あるスクリプトを複数人が使う場合や書き出し先や読み込み元を毎回指定したい場合に、パスの書き換えやコメントアウトでパスを変えるという運用をしている場合があると思います。しかしながら、この運用ではべた書き部分を編集するときに発生するミスタイプや、他の作業者の環境のパスのまま変更を忘れなどでエラーが起きる可能性があります。
### ファイルパスをべた書き # p = "C:\\Users\\Yoshioka\\Desktop\\" # p = "C:\\Users\\Yoshioka\\Desktop\\220107_Result\\" p = "C:\\Users\\Yoshioka\\Desktop\\220108_Result\\" # p = "C:\\Users\\Member_1\\Document\\220109_Result\\"
それを減らせるのがこちら。RhinoScriptSyntax にはフォルダを指定しパスを取得する関数が用意されています。
https://developer.rhino3d.com/api/RhinoScriptSyntax/#userinterface-OpenFileName
以下のプログラムを実行するとエクスプローラが立ち上がりフォルダを指定することができます。
必要に応じて書き出し先や読み込み元のフォルダを自由に指定してあげることができるので、Python コード内にファイルパスをべた書きする必要がなくなります。
import rhinoscriptsyntax as rs ### エクスプローラからフォルダを指定する p = rs.BrowseForFolder(message="好きな msg (ex : Select_Export_Folder)") print(p) ### Return >>> C:\Users\Yoshioka\Desktop\

ファイルを指定しパスを取得する場合はこちら。
https://developer.rhino3d.com/api/RhinoScriptSyntax/#collapse-OpenFileName
import rhinoscriptsyntax as rs ### エクスプローラからファイルを指定する p = rs.OpenFileName("好きな msg (ex : Select_Source_File") print(p) ### Return >>> C:\Users\Yoshioka\Desktop\hoge.3dm

簡易的な UI を設定する
前項では、スクリプトの実行時にエクスプローラからパスを指定する関数についてふれましたが、他の方法として簡易的な UI を作成するという方法を挙げてみます。
入力に関して簡易的な UI などを作成する方法について Rhino 公式で詳しく書かれたページがあるので参考にしてください。前項で挙げたエクスプローラからパスを取得する関数も載っています。
https://developer.rhino3d.com/guides/rhinopython/python-user-input/
簡易的な UI を設定している例として現在進行形のプロジェクトから一部あげてみます。
例1) 連番処理の結果の出力先のフォルダパスを生成するために、「操作しているユーザーは誰か」リストから選択する。
1つの要素を選択するリストボックスを作成する関数はこちら。
https://developer.rhino3d.com/api/RhinoScriptSyntax/#collapse-ListBox
import rhinoscriptsyntax as rs def define_path_from_user_name(user_name): return "C:\\Users\\{}\\Desktop\\Result\\".format(user_name) ### ユーザを選択する prj_members = ('yoshioka', 'member_1', 'member_2') user_name = rs.ListBox(prj_members, message="好きな msg (ex : Select User") print(user_name) ### パスを作成 user_path = define_path_from_user_name(user_name) print(user_path)

例2) 似たような例ですが、作業者を UserText に書き込みする。
(これは長いプロジェクトの中でいつだれかこの作業をしたのか確認したいというときに有効な場合があります。同様に作業日も書き込んでおくのも有効です)
import rhinoscriptsyntax as rs ### ユーザを選択する prj_members = ('yoshioka', 'member_1', 'member_2') user_name = rs.ListBox(prj_members, message="好きな msg (ex : Select User") print(user_name) ### オブジェクトに UserText を設定する rs.SetUserText(obj, "作成者", user_name) ### 現在時刻を取得する import datetime t = str(datetime.datetime.now().strftime("%y%m%d")) ### オブジェクトに UserText を設定する rs.SetUserText(obj, "作成日", t)
例3) rhinopythonで重い処理を実行する際に、Yes or No のダイアログを表示し、ユーザーに最終確認させる。
数分数十分かかるような重い処理を誤って実行すると、Rhinoを強制的に落として止めることになるので一応確認するようにしています。
(Rhino のコマンドでも似たような機能があり、例えばポリゴン数の多いメッシュに対して MeshToNURB などを実行すると、保存して実行、保存しないで実行、実行をキャンセルを選ばせるダイアログが出ます。)
ボタンの持ったダイアログを作成する関数はこちら。表示するボタンの設定や返り値などの設定が細かいので詳しくはリファレンスを確認してください。
https://developer.rhino3d.com/api/RhinoScriptSyntax/#collapse-ListBox
import rhinoscriptsyntax as rs ### Yes or No を選ぶポップアップ tf = rs.MessageBox("好きな msg (ex : ○○ を実行しますか?", buttons=4 | 32) if tf == 6: ### Yes を選択した場合の処理 elif tf == 7 ### No を選択した場合の処理 ### Returns: ### number: indicating which button was clicked: ### 6 Yes button was clicked. ### 7 No button was clicked.

まとめ
今回挙げた3点はジオメトリの操作に関係がないことですが、入力をサポートすることで日々の細かな作業を減らすことができるかと思います。
気を使って作業すれば簡単なことでも何度も繰り返したり急ぎの作業の中で作業したりしていくと、どこかでミスをしてストレスが溜まります。簡単な作業といえども減らせる部分は頑張って減らすように努力して、より本質的な業務に時間を割きたいです(毎回同じようなまとめを書いていますね)。
ヴィックでは日々の細かな作業を減らすことに喜びを感じるエンジニアを募集しています。興味を持たれた方は下記よりお問い合わせください。