TouchDesigner めも
これ書いた
TouchDesigner のエラーメッセージをコピーできるようにする
問題
ある op でエラーが起きてるときに、ポップアップを表示することでエラー内容を見ることはできるが、このポップアップのテキストはコピペできない。エラーメッセージをコピペできないのは検索や ChatGPT に投げるときに致命的。
解決策
Error DAT を使うと、コピペ可能なエラーメッセージを出力できるようになる。手順の概要は以下の通り:
- Error DAT を作る
- プロジェクト(
.toe
ファイル)内のエラーが Error DAT のテーブルに自動で追加される - メニューバー > Dialogs > Textport and DATs から Textport(Python の対話環境が起動する)を開く
- 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 クラスのドキュメント
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 触り始めたばかりなので、効率の良い方法があれば教えて下さい。