🐞

GhPythonのコードをデバッグする

2020/12/31に公開

はじめに

Grasshopperで自作コンポーネントをつくる時はPythonかC#でコードを書く方が多いと思います。
PythonはC#に比べて簡単にコードが書ける反面、Visual Studioを使った強力なデバッグ環境がないのがデメリットです。
調べてみたところ、Rhino7からGhPythonとVisual Studioを使ってデバッグできるようになっていたようで、ひっそりと公式にやり方が書いてありました。
今回はその記事を書いてある通りやりつつ、少し補足を加えながらご紹介します。
Debugging GhPython components Visual Studio

環境構築

Pythonistaには馴染みのないVisual Studioを使っていきます。

  • Rhino7
  • Visual Stuidio 2019
  • Python Tools for Visual Studio (PTVSD)

PTVSDのインストール

こちらを参考に、Pythonサポートをインストールしていきます。
Windows に Visual Studio の Python サポートをインストールする方法

  1. 「新しいプロジェクトの作成」を選択
  2. 下までスクロールして「さらにツールと機能をインストールする」を選択
  3. Visual Studio Installerで「Python開発」をインストール

Visual Studioの設定

  1. 「新しいプロジェクトの作成」から「IronPythonアプリケーション」を選択し、プロジェクト名や保存先を入力して「作成」
  2. 「デバッグ」→「オプション」→「Python」→「デバッグ」から「レガシデバッガーを使用」にチェックをいれる
  3. 作成された.pyファイルを書き換える
    デフォルトでhello worldが入っていると思うので、下記のコードに変更してください。
    locはバージョンやインストール場所によって書き換えてください。
    import sys
    
    # This is the path where the Visual Studio Python modules are locate. 
    # Change to your own: 
    loc = r'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\Microsoft\Python\Core'
    
    if loc not in sys.path:
        sys.path.append(loc)
    
    import ptvsd
    
    if not ptvsd.is_attached():
        #set up secret, address and port for ptvsd
        ptvsd.enable_attach(secret = 'dev', address = ('localhost', 2019))
        ptvsd.wait_for_attach() #in order for GH to wait for the process to be attached
    
  4. コードを記述する
    3.の下に実行したいコードを記述していきます。
    今回は例としてシンプルなfor文のコードを書きます。
    import Rhino.Geometry as rg
    
    points = []
    circles = []
    for i in range(count):
        point = rg.Point3d(x*i*10, y*10,0)
        points.append(point)
        circle = rg.Circle(point,radius)
        circles.append(circle)
    
  5. ブレイクポイントを指定する
    デバッグ時に一時停止させて変数の中身を確認する箇所を指定します。
    一時停止したい行の左の余白をクリックすると赤い●が現れ、コードがこの行で止まるようになります。

Rhino7の設定

  1. GrasshopperでPythonコンポーネントをだす
  2. "Python"の部分を右クリックしてShow "code" input parameterをクリック
    インプットにcodeが現れます。
  3. 再度"Python"を右クリックしてInput is pathをクリック
  4. File Pathコンポーネントをcodeにつなぐ
  5. インプットのパラメータを下記のように設定する
x: float
y: float
radius: float
count: int


6. File Pathコンポーネントを右クリックしてSelect one existing fileを選び、先ほど作成した.pyファイルを選択する
※これをやるとGHがフリーズしますが、それで問題ありません。

デバッグしてみる

設定が完了したので、デバッグしていきます。

  1. Visual Studioでメニューバーから「デバッグ」→「プロセスにアタッチ」を選択
  2. 「接続の種類」を「Pythonリモート(ptvsd)」、「接続先」をtcp://dev@localhost:2019/とする
  3. 「更新」を押すとプロセスが表示されるので、選択して「アタッチ」
  4. するとデバッグが開始され、先ほど指定したブレイクポイントでコードが止まり、変数の内容が表示されます。
  5. 「ステップイン」「ステップオーバー」「ステップアウト」をクリックするとコードが進みます。
  6. for文が進んでいくと、リストに追加されていき、オブジェクトの中身を見ることができます。

デバッグの中止と再デバッグ

デバッグの中止

Visual Studioで■「デバッグの中止」をクリックします。

再度デバッグを開始する

  1. Visual Studioで「デバッグ」→「プロセスに再アタッチする」をクリック
  2. GHで下記のいずれかをするとデバッグが開始します
    • マウスホイールクリック→「Recompute」
    • スライダーをつなぎなおす
    • スライダーを動かす

さいごに

オブジェクトの中身を見れるのは便利ですね。
コードが複雑になってくるとエラーが出ていてもその行ではなく別のどこかで不具合がでていて原因を特定しにくいことが往々にしてあるし、特にPythonの場合型が自由な分ミスに気付きにくいので、この方法はおすすめです。

参考

Debugging GhPython components Visual Studio
Windows に Visual Studio の Python サポートをインストールする方法

Discussion