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」を設定します。
次の関数を使って、プロジェクト作成時にデフォルト作成されるカテゴリ「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'): # キュー名が'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」カテゴリが設定されます。

criatom_tools_atomcraft_api_tutorial_search_and_edit_category.png