
概要 📖 – DAT (テーブル) の変化に応じて Python を実行
DAT Execute DATは、DAT (テーブル) の内容変化を契機に Python コールバックを実行する DATです。現在のコールバック API は onTableChange(dat) 1 本に統合されています。Row / Column / Cell / Size の個別変化コールバックは Deprecated 扱いで、onTableChange 内から dat.numRows / dat.numCols 等で差分判定する方式が公式推奨です。
主な用途 🎯
- テーブル全体の変化イベントを Python コールバック (
onTableChange) で受け取る - OSC In DAT / Serial DAT / Web Client DAT の受信メッセージ (行追加) を契機にアクションを実行
- Table DAT / Text DAT の編集をトリガーに別 OP のパラメータを更新
- 外部ツールからの設定流し込み (CSV / JSON のリロード) を Python ロジックでハンドリング
- state machine の遷移を DAT 行追加・セル更新で駆動
データフロー 🔄
入力: 監視対象 DAT (DAT パラメータで指定)
↓
テーブル変化検出 (行追加 / セル更新 / サイズ変化等)
↓
Python コールバック (onTableChange(dat)) 実行
初心者の方は、以下日本語書籍も手元にあると安心です。

実際の案件事例まで踏み込んで紹介されていて、効率よくスキルアップするなら必携の二冊です!
パラメータ解説 ⚙️
DAT Execute Page 📋
監視対象 DAT と起動条件 🎯
Active .active ✅
– On 時、DAT の変化を監視してコールバックを起動
– Off 時は完全に停止 (DAT が変わってもコールバックは呼ばれない)
DAT .dat 📋
– 監視対象の DAT を指定 (パス入力 / ドラッグ&ドロップ可)
– 指定した DAT が cook して内容が変化した瞬間にコールバックがトリガーされる
Edit.. .edit ✏️
– パルスでテキストエディタを開き、DAT 内の Python スクリプト本体を編集
– コールバック関数 (onTableChange 等) の本体はこの DAT のテキストに直接書かれる
実行スコープ (Tscript レガシー) .executeloc 📍
スクリプトを実行する OP の場所を決定するメニュー (Tscript 専用、現代の Python では無視可)
| 項目 | 内部名 | 説明 |
|---|---|---|
| Current Node | .current |
現在の Node 位置からスクリプトを実行 (Tscript 専用) |
| This Node | .here |
DAT の親 OP からスクリプトを実行 (sibling を簡単に参照可能) |
| Specified Operator | .op |
From Operator パラメータで指定した OP からスクリプトを実行 |
From Operator (Tscript レガシー) .fromop 🔗
Execute from が Specified Operator のときに参照される OP パス:
- From Operator パス:
Execute fromがSpecified Operatorのときスクリプト実行元として使う OP パス (Tscript 専用、Python では使用しない)
イベント種別 (コールバック有効化) 🔔
Table Change .tablechange 📊
– On 時、テーブルが前回 cook から何らかの形で変化したときに onTableChange(dat) を呼び出す
– 行・列・セル・サイズの変化を 1 本のコールバックでまとめて受け取る統合 API (現代の Python 推奨)
Row Change .rowchange ↔️
– Deprecated。On 時、変化した各行ごとに onRowChange() を呼び出す (旧 API)
– 現在は onTableChange() 内で差分判定を行う方式に置き換え推奨
Column Change .colchange ↕️
– Deprecated。On 時、変化した各列ごとに onColChange() を呼び出す (旧 API)
– 現在は onTableChange() 経由で統一推奨
Cell Change .cellchange 🔲
– Deprecated。On 時、変化したセルごとに onCellChange() を呼び出す (旧 API)
– 現在は onTableChange() 経由で統一推奨
Size Change .sizechange 📐
– Deprecated。On 時、テーブルサイズ変化ごとに onSizeChange() を呼び出す (旧 API)
– 現在は onTableChange() 内で dat.numRows / dat.numCols 比較に置き換え推奨
実行タイミング .execute ⏱️
コールバックをフレームのどのタイミングで実行するかの選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| Start of Frame | .start |
フレーム開始時にコールバックを呼び出す。1 フレーム中に複数回変化したら都度呼ばれる (例: Multi Touch In DAT のイベント連発を全て捕捉したいとき) |
| End of Frame | .end |
フレーム終了時に最大 1 回だけコールバックを呼び出す。同一行が複数回変化しても 1 フレームにつき 1 回のみ実行 (パフォーマンス重視・冪等処理向け) |
File Page 📁
ファイル入出力 💾
File .file 📂
– ロードするファイルのパスとファイル名 (.txt / .dat 対応)
Sync to File .syncfile 🔁
– On 時、プロジェクト起動時にファイルを読み込み、以降はファイルと双方向同期
– DAT 側編集はファイルに書き戻され、ファイル変更も DAT に反映
Load on Start .loadonstart 🔄
– On 時、プロジェクト起動時に 1 回だけファイルから読み込む
Load File .loadonstartpulse ⏬
– パルスでファイルを即時再ロード
Write on Toe Save .write 💾
– On 時、.toe プロジェクト保存時に DAT の内容をファイルに書き出す
Write File .writepulse ⏫
– パルスで即時ファイルへ書き出し
Common Page 🔧
Language .language 📝
DAT が動作するスクリプト言語の決定方法
| 項目 | 内部名 | 説明 |
|---|---|---|
| Input | .input |
入力 DAT のスクリプト言語を使用 |
| Node | .node |
この DAT 自身のスクリプト言語を使用 |
Edit/View Extension .extension 📄
外部エディタに公開するファイル拡張子の選択
| 項目 | 内部名 | 説明 |
|---|---|---|
| dat | .dat |
汎用的なファイル拡張子 dat を使用 |
| From Language | .language |
DAT のスクリプト言語に応じた拡張子を自動選択 |
| Custom Extension | .custom |
Custom Extension で指定したカスタム拡張子を使用 |
Custom Extension .customext 🔤
Edit/View Extension が Custom Extension のときに適用される拡張子:
- Custom Extension 文字列:
Edit/View Extensionがcustomのときに使用される任意のファイル拡張子
Word Wrap .wordwrap 🔁
ノード表示でのワードラップ (折り返し) の有効化
| 項目 | 内部名 | 説明 |
|---|---|---|
| Input | .input |
入力 DAT の Word Wrap 設定を継承 |
| On | .on |
Word Wrap を有効化 (ノード上の長い行を折り返し表示) |
| Off | .off |
Word Wrap を無効化 (折り返さずそのまま表示) |
実践アイデア 💡
Example 1: OSC In DAT の受信メッセージから別 OP を駆動 📡
OSC In DAT → DAT Execute DAT (onTableChange) → Constant CHOP / Switch TOP
- OSC In DAT を配置し外部送信元から OSC メッセージを受信、行として蓄積
- DAT Execute DAT の DAT パラメータに OSC In DAT のパスを指定
Table Changeを On にしてonTableChange(dat)内で末尾行を読み出し、アドレスと値で分岐- コールバック内で
op('constant1').par.value0 = float(dat[-1, 2])等でパラメータに反映
Example 2: Serial DAT の受信行をパースしてセンサー値を抽出 🔌
Serial DAT (Arduino) → DAT Execute DAT (onTableChange) → Constant CHOP
- Serial DAT を Arduino 等のマイコンに接続し、行ごとにセンサー値を受信
- DAT Execute DAT で監視を有効化、
onTableChange内でdat[-1, 0].valから最新行のテキストを取得 - Python の
split(',')やjson.loadsでフィールド分解、float 化 - Constant CHOP の各 value に書き込んで CHOP ネットワークへ受け渡す
Execute = End of Frameを選んでおくと 1 フレーム複数行受信時もコスト一定
Example 3: Table DAT の編集をトリガーに UI ラベルを更新 📝
Table DAT (設定値) → DAT Execute DAT (onTableChange) → Text TOP
- 設定値を Table DAT に保持し、運用中にユーザが GUI で書き換える
- DAT Execute DAT で Table DAT を監視、編集が走った瞬間にコールバック起動
onTableChange(dat)内でfor r in range(dat.numRows): ...で全行をスキャン- 対応する Text TOP の
textパラメータに値を書き戻して UI を再描画
関連オペレータ 🔗
類似機能OP 🔍
- CHOP Execute DAT — CHOP チャンネル値の変化を監視する版
- Panel Execute DAT — UI パネルの状態変化を監視する版
- Parameter Execute DAT — 任意 OP のパラメータ変化を監視する版
- OP Execute DAT — OP の状態 (フラグ・接続・削除等) の変化を監視する版
- Execute DAT — プロジェクトのライフサイクル (start / exit / pre-frame 等) を監視する版
組み合わせ推奨OP 🔄
- OSC In DAT — OSC 受信メッセージは DAT 行イベントなので DAT Execute と組み合わせる定番
- Serial DAT — シリアル経由のマイコン受信行を監視してパース
- Web Client DAT — HTTP レスポンス受信を DAT 変化として捕捉
- Table DAT — 設定テーブルの編集をトリガーに反映処理を実行
- Script DAT — コールバック内で別の DAT を加工して結果を生成
前処理・後処理DAT 🎯
- 前処理: Text DAT、Table DAT、OSC In DAT
- 後処理: Script DAT、Text DAT、Null DAT
Info DAT情報 📊
DAT Execute DAT は Info DAT による詳細情報取得に対応しています (num_rows / num_cols / total_cooks / cook_time 等の共通 DAT Info チャンネルを参照可能)。
DAT 固有情報 📋
num_rows: DAT の行数num_cols: DAT の列数type: DAT の型 (table / text)is_table: テーブル形式の場合 1、テキスト形式の場合 0
汎用オペレータ情報 🔄
total_cooks: プロセス開始からのクック回数cook_time: 最後のクック時間 (ミリ秒)cook_frame: 最後にクックされたフレーム番号warnings: 警告数errors: エラー数
トラブルシューティング ⚠️
よくある問題と解決策 🔧
❌ Problem: DAT が変化してもコールバックが呼ばれない
✅ Solution:
Activeパラメータが On になっているか確認- DAT パラメータに監視対象の DAT パスが正しく設定されているか確認
Table Changeが On になっているか確認 (旧 Row/Column/Cell/Size 系は Deprecated、現代は Table Change を使う)- 監視対象 DAT が実際に cook して内容が変わっているか (上流が止まっていないか) を確認
❌ Problem: 1 フレームに複数回コールバックが呼ばれて重い
✅ Solution:
ExecuteパラメータをEnd of Frameに切替えるとフレーム終了時に最大 1 回だけ実行されるonTableChange内で差分判定を行い、必要なときだけ重い処理 (パース / I/O) を実行- 重い処理は Web Client DAT の async コールバックや別 thread に逃がす
❌ Problem: Python 例外で他のコールバックも止まる
✅ Solution:
- コールバック内を
try / except Exception as e:で囲んで例外を吸収 - Textport / Console でスタックトレースを確認し例外箇所を特定
- コールバック内で重い処理 (ファイル I/O など) は非同期化、UI スレッドをブロックしない設計に変更
❌ Problem: OSC In DAT 等で受信行が増え続けてメモリを圧迫する
✅ Solution:
- 前段の OSC In DAT / Serial DAT で
Max Lines/Clear Output等を設定し履歴を制限 onTableChange内で末尾行のみ参照 (dat[-1, ...]) し、過去行はクリア- 定期的に
dat.clear(keepFirstRow=True)で履歴を切り詰めるロジックを追加
参考資料 📚
その他 🔗
- TouchDesigner Wiki — DAT 概要
- TouchDesigner Wiki — Category:DATs
- TouchDesigner Wiki ホーム
- TouchDesigner 公式 Forum
- Facebook — TouchDesigner Help Group
公式リソース 📖
- TouchDesigner公式ドキュメント – DAT Execute DAT
- TouchDesigner公式ドキュメント – DatexecuteDAT Class
- TouchDesigner公式ドキュメント – Category:Python

