Open2

TouchDesigner めも

nukopynukopy

これ書いた

https://zenn.dev/pyteyon/articles/touchdesigner-error-message


TouchDesigner のエラーメッセージをコピーできるようにする

問題

ある op でエラーが起きてるときに、ポップアップを表示することでエラー内容を見ることはできるが、このポップアップのテキストはコピペできない。エラーメッセージをコピペできないのは検索や ChatGPT に投げるときに致命的。

解決策

Error DAT を使うと、コピペ可能なエラーメッセージを出力できるようになる。手順の概要は以下の通り:

  1. Error DAT を作る
  2. プロジェクト(.toe ファイル)内のエラーが Error DAT のテーブルに自動で追加される
  3. メニューバー > Dialogs > Textport and DATs から Textport(Python の対話環境が起動する)を開く
  4. Error DAT のテーブルからコピーしたいエラーメッセージを見つけ、Textport でその内容を出力する

Error DAT を作る

OP Create Dialog から Error DAT を作る。

Error DAT は各 op のエラーを拾って、テーブル形式のデータを作ってくれる。(ちなみに Error DAT を作ると、同時にエラーが起きたときのコールバック用の Text DAT(Python スクリプトを書けるやつ)を勝手に作って紐づけてくれる。)

  • Error DAT のテーブルにプロジェクト内のエラーが自動で追加されている

このコールバック用の Text DAT を使ってログを吐き出すのも良いのだけど、一番楽なやり方は、Textport から Error DAT の op を取得して、テーブルの内容を出力するやり方。

Textport は、メニューバー > Dialogs > Textport and DATs から開くことができる。Textport を開くと、Python の対話環境が起動され、そこから Python を実行して op 関数を使ってプロジェクト内の op にアクセスできるようになる。

  • メニューで Textport and DATs を選択

  • Textport を開いた様子

Textport を開いたら、TouchDesigner の組み込み関数である op 関数を使って Error DAT の参照を取得し、その参照を使って Error DAT のテーブルから目的のエラーメッセージを出力する。

例えば、以下の Error DAT のテーブルから 3 行目の TypeError... というエラーメッセージを取得したい場合、以下のようにコードを実行するとよい。

これでコピペ可能なエラーメッセージが出力できるようになった

  • Error DAT のテーブルデータ

  • 目的のエラーメッセージ(テーブル 3 行目、1 列)のエラーメッセージを取得するコマンド
# Error DAT の参照を取得
error1 = op("/project1/error1")

# テーブルの3 行目、1 列のデータを取得
error1[3, 1]
  • エラーを出力した Textport の様子(マウス操作で選択できてる!)

op のテーブル操作は、Error DAT クラスの公式ドキュメントの ACCESSING TABLE CONTENT を参照。

  • op のフルパスを取得するには、パラメータウィンドウの i ボタンを押して op の情報を表示するとよい

めも

Error DAT クラスのドキュメント

https://derivative.ca/UserGuide/ErrorDAT_Class

Error DAT で使えるメソッドリスト

python >>> error1.__dir__()
['__init__', '__new__', '__doc__', 'type', 'label', 'icon', 'family', 'OPType', 'opType', 'isFilter', 'isCustom', 'subType', 'minInputs', 'maxInputs', 'isMultiInputs', 'visibleLevel', 'supported', 'licenseType', '__getitem__', '__setitem__', '__delitem__', 'run', 'write', 'flush', 'isatty', 'setSize', 'clear', 'copy', 'row', 'col', 'rows', 'cols', 'appendRow', 'appendRows', 'appendCol', 'appendCols', 'insertRow', 'insertCol', 'replaceRow', 'replaceCol', 'deleteRow', 'deleteRows', 'deleteCol', 'deleteCols', 'cell', 'cells', 'save', 'findCell', 'findCells', 'scroll', 'detectLanguage', 'export', 'text', 'jsonObject', 'module', 'numRows', 'numCols', 'locals', 'isTable', 'isText', 'isEditable', 'editingFile', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__add__', '__radd__', '__mul__', '__rmul__', '__bool__', 'copyParameters', 'ops', 'setInputs', 'pars', 'evalExpression', 'fetch', 'fetchOwner', 'store', 'unstore', 'storeStartupValue', 'unstoreStartupValue', 'cook', 'changeType', 'destroy', 'relativePath', 'shortcutPath', 'resetNodeSize', 'openViewer', 'closeViewer', 'resetViewer', 'openParameters', 'openMenu', 'var', 'warnings', 'errors', 'scriptErrors', 'addScriptError', 'addError', 'addWarning', 'clearScriptErrors', 'dependenciesTo', 'childrenCPUMemory', 'childrenGPUMemory', '__getstate__', '__setstate__', 'id', 'passive', 'op', 'parent', 'iop', 'ipar', 'valid', 'curPar', 'currentPage', 'name', 'path', 'digits', 'base', 'children', 'numChildren', 'recursiveChildren', 'numChildrenRecursive', 'time', 'color', 'storage', 'par', 'parGroup', 'pages', 'builtinPars', 'customPars', 'customPages', 'customTuplets', 'customParGroups', 'comment', 'tags', 'mod', 'warning', 'error', 'inputs', 'outputs', 'inputConnectors', 'outputConnectors', 'ext', 'replicator', 'nodeX', 'nodeY', 'nodeWidth', 'nodeHeight', 'nodeCenterX', 'nodeCenterY', 'dock', 'docked', 'display', 'render', 'viewer', 'activeViewer', 'lock', 'selected', 'python', 'current', 'bypass', 'expose', 'cloneImmune', 'showDocked', 'showCustomOnly', 'allowCooking', 'isCOMP', 'isBase', 'isObject', 'isPanel', 'isTOP', 'isCHOP', 'isSOP', 'isMAT', 'isDAT', 'totalCooks', 'cookFrame', 'cpuCookTime', 'gpuCookTime', 'cookAbsFrame', 'cookStartTime', 'cookEndTime', 'cookedThisFrame', 'cookedPreviousFrame', 'cpuMemory', 'gpuMemory', 'childrenCPUCookTime', 'childrenCPUCookAbsFrame', 'childrenGPUCookTime', 'childrenGPUCookAbsFrame', 'childrenCookTime', 'childrenCookAbsFrame', 'cookTime', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']

終わりに

エラーメッセージがコピペできないのは致命的だったので方法を探ってみた。如何せん TouchDesigner 触り始めたばかりなので、効率の良い方法があれば教えて下さい。

参考