CRI ADX2(AtomCraft)
ロボット編12 get_child_objects関数を使ってみよう

このチュートリアルでは、get_child_objects関数を使った複数のオブジェクトの一括取得について説明します。
キューシート直下のキューを全て取得し、命名規則に従ってカテゴリ設定を行うスクリプトを書いていきます。

本チュートリアルは、チュートリアル「find_object関数を使用してみよう」で作成したプロジェクトを使用します。
プロジェクトを開いていない場合は、プロジェクトを開くか、「find_object関数を使用してみよう」にて作成したスクリプトを実行してから、チュートリアルを進めましょう。

スクリプトファイルの準備

スクリプトメニューで「スクリプトリスト...」を選択し、スクリプトリストからのスクリプト実行ウィンドウ表示します。
スクリプトリストウィンドウの新規作成ボタンを押して、以下の名前でスクリプトファイルを作成しましょう。

スクリプトの保存先 スクリプトファイル名
tutorials [CRI] tutorial05-3_use_get_child_objects.py

スクリプトの説明

作成したスクリプトをダブルクリックして、スクリプトエディターからのスクリプト実行で開きます。
スクリプトリストからのスクリプト実行ウィンドウでスクリプトの内容が一覧できるように、スクリプトの説明を次のように記述しましょう。

# --Description:[チュートリアル]get_child_objects関数を使ってキューを取得し、命名規則を元にカテゴリを設定

モジュールのインポート

スクリプトの説明が記述できたら、スクリプトで CRI Atom Craftを操作するため、次のモジュールをインポートします。

import sys
import cri.atomcraft.debug as acdebug
import cri.atomcraft.project as acproject

プロジェクト操作のためにProjectモジュール 、ログ出力のためにDebugモジュールをインポートします。

設定するカテゴリーの準備

find_object 関数を使用してみよう」チュートリアルで、キュー名が"sfx_"で始まるキューを複数作成しました。
この "sfx" から始まるキューにカテゴリ「sfx」を設定します。
次の関数を使って、CRI Atom Craft のプロジェクトツリーから、プロジェクト作成時にデフォルト作成されるカテゴリ「Category_0」を「sfx」に変更します。

関数名 説明
get_global_folder 全体設定フォルダー直下の各オブジェクトフォルダーを取得します
find_object 再帰検索を行い一致したオブジェクト取得します
set_value 指定したオブジェクトのパラメーターを設定します

これらの関数を使って、カテゴリを取得して名前を変更する処理をスクリプトで記述すると次のようになります。

# キューに設定するカテゴリーの準備
# カテゴリフォルダーの取得
category_folder = acproject.get_global_folder("CategoryFolder")["data"]

# カテゴリーの取得
category = acproject.find_object(category_folder, "Category", "Category_0")["data"]

# カテゴリー名の変更
acproject.set_value(category, "Name", "sfx")

設定するカテゴリーの準備の解説

get_global_folder関数を使ってカテゴリーフォルダーを取得します。
次にfind_object関数でカテゴリフォルダー以下からカテゴリ「Category_0」を取得し、set_value関数でカテゴリ名を「sfx」に変更します。

カテゴリを設定するキューシート直下のキューを取得

ワークユニット、キューシートを取得し、カテゴリを設定するためにキューシート内のキューをリストで取得します。
今回キューの取得には、同一階層の同種オブジェクトをリスト取得するget_child_objects関数を使用します。

関数名 説明
get_workunit ワークユニットを取得します
find_object 再帰検索を行い一致したオブジェクト取得します
get_child_objects 親オブジェクトを指定して、複数の子オブジェクトをリスト形式で取得します

これらの関数を使って、キューシート直下のキューをリスト形式で取得する処理をスクリプトで記述すると次のようになります。

# ワークユニットを取得
workunit = acproject.get_workunit("WorkUnit_Tutorial")["data"]

# キューシートを取得
cuesheet = acproject.find_object(workunit, "CueSheet", "Tutorial")["data"]
# キューシート直下の複数キューを取得
cues = acproject.get_child_objects(cuesheet, "Cue")["data"]

get_child_objects関数による複数キュー取得の解説

get_child_objects関数を使用して、キューシート直下のキューをリスト形式で取得しています。
get_child_objects関数には、「親オブジェクト」、「取得するオブジェクトのタイプ」を指定します。
cuesheet変数、"Cue"(キューオブジェクトのタイプ)を指定して、キューシート直下のキューを全て取得して、cues変数に格納しています。

条件に一致するキューを取得

get_child_objects関数を使って取得したキューのリストから、名前が "sfx" で始まるキューのリストを作成します。
キューの名前取得には、次の関数を使用します。

関数名 説明
get_value 指定したオブジェクトのパラメーターを取得します

これらの処理をスクリプトで記述すると次のようになります。

# カテゴリーを設定するキューリスト

# 名前の先頭に「sfx」を含むキューを格納するリスト
cues_for_set_categories = []

## 対象のキューをチェックする
for cue in cues:
    # キュー名を取得
    cue_name = acproject.get_value(cue, "Name")["data"]
    # 文字列関数のstartswith を使って、先頭にsfxの文字を含むかチェック
    if cue_name.startswith('sfx') == True:  # キュー名が'sfx'で始まる
        # リストに追加
        cues_for_set_categories.append(cue)

条件に一致するキューを取得の解説

for 制御文を使って、cues変数からキューを1つずつ取り出し、get_value関数を使って、名前を取得しています。
find関数を使って、名前の先頭に "sfx" の文字があるかをチェックし、あればappend関数を使ってcues_for_set_categoriesリストにキューを追加しています。

キューにカテゴリを設定

cues_for_set_categories リストに格納した、名前が sfx で始まるキューにカテゴリを設定します。
ここでは1回の呼び出しで複数のキューにカテゴリを設定することができる次の関数を使用します。

関数名 説明
add_category_to_cues 複数のキューに対して、カテゴリを設定します

これらの処理をスクリプトで記述すると次のようになります。

# カテゴリーを設定
# カテゴリを一括適用する場合は、add_category_to_cuesを使う。
acproject.add_category_to_cues(cues_for_set_categories, category)

acdebug.log("[チュートリアル]get_child_objects関数を使ってキューを取得し、命名規則を元にカテゴリ設定 が完了しました")

キューにカテゴリを設定の解説

add_category_to_cues関数は複数のキューへの同一のカテゴリ設定に使用します。
add_category_to_cues関数には、「キューのリスト」、「カテゴリ」を指定します。

add_category_to_cues関数以外のカテゴリ設定方法として、 1つのキューに複数のカテゴリをまとめて設定するset_categories関数もあります。
用途にあわせてカテゴリ設定の関数を使いわけることで、効率よくキューにカテゴリを設定することができます。

スクリプトの保存と実行

これで本チュートリアルのスクリプト記述は終了です。
スクリプトを保存し、実行します。
スクリプトが正常に実行されると、以下のようにCategoryGroup_0以下の「Category_0」が「sfx」に変わり、名前が "sfx" で始まるキューに「sfx」カテゴリが設定されます。