皆様こんにちは。
AMDlabの齋藤です。
今回は以前投稿したGrasshopper Python 上級編より、「コンポーネント実行後に実行させる」の詳細についてリクエストがあったのでお答えしていこうかと思います。
以前投稿したGrasshopper Python 上級編は以下よりご確認ください。
それでは始めましょう。
今回のデータはこちらに挙げております。
https://github.com/AMDlab/TechBlog-GrasshopperPython-SDK-mode
コンポーネント実行後に実行させる(おさらい)
前回の記事ではコンポーネント実行後に実行させるプログラムを利用してNumber Sliderを動かしても1に戻るようにしました。
しかし、これ以外にも実行後に実行させる方法があります。
それが今回扱うSDK-modeのAfterRunになります。
まずはSDK-modeに関してさっとどういうものかを見て、それからAfterRunでの実装を試してみましょう!
SDK-mode
Grasshopper PythonにはSDK-modeがGH_Pythonの時からあります。
SDK-modeはGrasshopperコンポーネントの開発で利用できるBeforeSolveInstance、AfterSolveInstance等の関数を上書きしてコンポーネントの処理に組み込むようなことができます。
ただし、GH_Python時代のSDK-modeはあまり利用しない関数が使えるようになるだけで、SDK-modeからもとに戻すと改行にタブが残ってしまう等、少々クセがあるため、私自身もあまり使わないことが多いです。
ですので、ここでは公式の紹介の内容を模倣して、どういうことができるか見ていきたいと思います。
SDK-modeについて詳しく知りたい方は、以下の公式の紹介をご覧ください。
https://developer.rhino3d.com/guides/scripting/scripting-gh-python/#sdk-mode
SDK-modeにする
まずはSDK-modeにします。
Python ScriptのGrasshopperタブにある「Convert To GH_ScriptInstance (GH_Component SDK Mode)」をクリックするか、右側のプログラムが書かれているようなアイコンをクリックします。
すると以下のようにプログラムが変わります。
これでSDK-modeとなりましたが、使いたい関数がまだ出ていません。
そこで右側の目のアイコンとプログラムに矢印が書かれているようなアイコンをクリックします。
これで5つの関数が表示されました。次はこの関数を動かしてみます。
Preview overrides
Preview OverridesはRhinoのビューポートに描画するような関数群になります。
この描画はGrasshopperの処理の外で実行され、Rhinoビューポートを操作するたびに発生するため、この関数内であまり重い処理を入れない方が良いようです。
パラメーターClippingBoxをPythonの関数に直したget_ClippingBoxやDrawViewportWires、DrawViewportMeshes関数に実装できます。
ここではDrawViewportWiresにビューポートDisplayに長方形を描画させてみました。
これら関数群の詳細な説明はまたの機会で紹介できればと思いますが、DrawViewportWiresは線、DrawViewportMeshesはメッシュを描画させる、get_ClippingBoxはそれらの表示範囲を調節するようになっています。
Solve overrides
Solve overridesはコンポーネント実行処理に関する関数群です。
コンポーネントの実行前、実行後にBeforeRunScript、AfterRunScriptで処理を行えます。
ここではRunScriptが複数回処理されるようにあえて、List AccessでなくItem Accessとしてx、yを入れて処理をさせてみました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
"""Grasshopper Script Instance""" import System import Rhino import Grasshopper from Grasshopper.Kernel import IGH_PreviewArgs import rhinoscriptsyntax as rs class MyComponent(Grasshopper.Kernel.GH_ScriptInstance): def RunScript(self, x, y): print(f'Solve #{self.Iteration} x:{x} y:{y}') return # Solve overrides def BeforeRunScript(self): print('Before Solve') def AfterRunScript(self): print('After Solve') |
outパラメーターに表示されているように3回処理が行われ、その最初と最後にBeforeRunScriptとAfterRunScriptのprint文が表示されています。
ちなみに前回の記事の内容をAfterRunScriptで実行させてもbreakpointエラーとなります。
AfterRunScriptではGrasshopperの処理が終わった(期限が切れた)後の処理でないため、このようになります。
Item AccessでList、Treeがインプットに入る場合の処理を考えると、AfterRunScript内に前回の記事のプログラムを入れるとよいかもしれません。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
"""Grasshopper Script Instance""" import System import Rhino import Grasshopper from Grasshopper.Kernel import IGH_PreviewArgs from System import Decimal import rhinoscriptsyntax as rs class MyComponent(Grasshopper.Kernel.GH_ScriptInstance): def RunScript(self, x: float, y: float): self.x = x print(f'Solve #{self.Iteration} x:{x} y:{y}') return # Solve overrides def BeforeRunScript(self): print('Before Solve') self.doc = ghenv.Component.OnPingDocument() self.i0s0 = ghenv.Component.Params.Input[0].Sources[0] self.k = 1 def AfterRunScript(self): print('After Solve') if self.x != self.k: self.doc.ScheduleSolution(5, self.callback) def callback(self, doc): t = Decimal(self.k) self.i0s0.SetSliderValue(t) self.i0s0.ExpireSolution(False) |
IronPython 2 Script, C# Scriptでの実装
ここまでの内容はScriptコンポーネント自体に実装されているため、IronPythonやC#でも行うことができます。
方法もPythonは変わらずで、C#はSDK-modeが既になっている状態であるので、アイコンを押すだけです。
終わりに
今回は前回の記事で紹介した「記事の実行後に実行する方法」の他の実装方法について、リクエストがあったためお答えしました。
これでもっとGrasshopper Pythonをより効率的に扱うことができるのではないかと思います。
皆さんもぜひ試してみてください。
AMDlabでは、開発に力を貸していただけるエンジニアさんを大募集しております。少しでもご興味をお持ちいただけましたら、カジュアルにお話するだけでも大丈夫ですのでお気軽にご連絡ください!
中途求人ページ: https://www.amd-lab.com/recruit-list/mid-career
カジュアル面談がエントリーフォームからできるようになりました。
採用種別を「カジュアル面談(オンライン)」にして必要事項を記載の上送信してください!
エントリーフォーム: https://www.amd-lab.com/entry
AMDlabのSNSアカウントです!ぜひフォローお願いします✨
■ X(旧Twitter):https://x.com/amdlabinc
■ Instagram:https://www.instagram.com/amdlabinc/
■ Facebook:https://www.facebook.com/amdlab.lnc/


















COMMENTS