CRI ADX2(AtomCraft)
ロボット編16 CSVを使った未登録キューのチェック

CSVを使ったキューシートの作成」チュートリアルでは、CSVの情報から波形の登録、キューシート、キューの作成を行いました。
このチュートリアルでは、「CSVを使ったキューシートの作成」チュートリアルで使用したCSVファイルを使って、CRI Atom Craft上に作成されたキューシートにCSVファイルに記述されているキュー名と一致するキューが含まれているかチェックをするスクリプトを作成します。

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

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

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

スクリプトの保存先 スクリプトファイル名
tutorials [CRI] tutorial07-2_check_cuesheet_from_csv.py

スクリプトの説明

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

# --Description:[チュートリアル]CSV を使った未登録キューのチェック

モジュールのインポート

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

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

CSVを使ったキューシートの作成」チュートリアルと同じように、CSVファイルを使用するため、Pythonの標準ライブラリのcsvモジュールをインポートします。
プロジェクト操作のために Projectモジュール 、ログ出力のためにDebugモジュールをインポートします。

CSVファイルのパスの設定

チェックに使用するCSVファイルのパス変数を設定します。
CSVファイルのパス変数の設定をスクリプトで記述すると次のようになります。

# チェックする CSV ファイルのパス
csv_path = os.path.dirname(os.path.dirname(__file__)) + '/tutorial_data/tutorial_data03/tutorial_data3.csv'

# CSV ファイルが存在するかチェック
if os.path.isfile(csv_path) == False:
    acdebug.warning("CSV ファイルが見つかりません: " + csv_path)
    sys.exit()

ファイルが存在しない場合、スクリプトを中断できるように、os.path.isfile関数でファイルが存在するかの確認をしています。

チェックするキューリストとキュー名の列挙

次の関数を使って、CSV ファイルを読み込み、チェックに使用する情報を取得します。

関数名 説明
get_workunit ワークユニットを取得します
get_cuesheet_rootfolder ワークユニットのキューシート ルートフォルダーを取得します
get_child_object 親オブジェクトを指定して、子オブジェクトを取得します
find_objects 再帰検索を行い一致したオブジェクトをリスト形式で取得します
get_value 指定したオブジェクトのパラメーターを取得します

一致するキュー名があるかのチェックを行うため、キューシートに登録されているキューリストを取得し、キュー名情報を取得します。
これらの処理をスクリプトで記述すると次のようになります。

# ----- 登録キュー名を列挙する -----
registered_cue_name_list = []
# ワークユニットを取得
workunit = acproject.get_workunit("WorkUnit_Tutorial")["data"]
# キューシートルートフォルダを取得
cuesheet_rootfolder = acproject.get_cuesheet_rootfolder(workunit)["data"]
# 拡張子を除いた CSV ファイル名からキューシート名を取得して、キューシートを取得
cuesheet_name = os.path.splitext(os.path.basename(csv_path))[0]
cuesheet = acproject.get_child_object(cuesheet_rootfolder, "CueSheet", cuesheet_name)["data"]
# キューシートに登録されたキューリストを取得
cues = acproject.find_objects(cuesheet, "Cue")["data"]
# ----- 登録キュー名リストを作る -----
acdebug.log("tutorial_data3.csv からキュー情報を収集しています...")
for cue in cues:
    # キュー名を取得します
    cue_name = acproject.get_value(cue, "Name")["data"]
    # キュー名を登録キュー名リストに追加します
    registered_cue_name_list.append(cue_name)

キューシート内のキュー名とCSVのキュー名を比較

CSV からチェックに使用する「キュー名」情報を取得します。
「チェックするキューリストとキュー名の列挙」で作成したキュー名リストに CSV から取得したキュー名情報が含まれているかを確認します。
キューシートに作成されていないキューがあれば、キュー名をスクリプトログに表示します。

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

# CSVを開いてキューシートのキューをチェック
acdebug.log("tutorial_data3.csv を使ってキューのチェックを行います...")
unregistered_cue_name_list = []

with open(csv_path) as f:
    reader = csv.reader(f)

    for row in reader:
        # CSVのキュー名列を取得
        cue_name = row[1]

        # 登録キューリストに CSV 側のキュー名が存在するかチェックする
        is_find = False
        for registered_cue_name in registered_cue_name_list:
            if registered_cue_name == cue_name:
                # キューが見つかった
                is_find = True

        if is_find == False:
            unregistered_cue_name_list.append(cue_name)

# チェック
if len(unregistered_cue_name_list) > 0:
    acdebug.warning(cuesheet_name + "に未登録キューがあります")
    for cue_name in unregistered_cue_name_list:
        acdebug.warning("Cue " + cue_name + "がみつかりません。")
else:
    acdebug.log("チェックシートと違いはありません。")

acdebug.log("[チュートリアル]CSV を使った未登録キューのチェック が完了しました。")

スクリプトの保存と実行

これで本チュートリアルのスクリプト記述は終了です。
スクリプトを保存し、実行しましょう。
スクリプトが正常に実行されると、CSV情報に含まれていないキュー名が見つかった場合、ログに存在しないキュー名一覧を出力します。
CRI Atom Craftを直接操作して、キューの追加、削除やキューの名前を変更したりすると、一致しないキューのログ内容が変わります。