HDS#02 搬送先の選択(後篇)

こんにちは、開発Gの杉原です。

 

年度末ということもあって忙しいですね。

師走より師走してる気がします。

 

さて【How to Demo3D Scripting】第二回、「搬送先の選択(後篇)」をお送りします。

 

さて、軽く前回のおさらいをしますと、下図のようなモデルにて、流れてくる荷物の連番をもとに

・連番が3の倍数ならNo.1

・連番が5の倍数ならNo.2

・連番が3の倍数かつ5の倍数ならNo.3

・それ以外ならNo.4

へと搬送するような動作を定義します。

前回はPropertyAssignerで連番を付与した後、RobotProgramのOnDispatchOutイベントに処理を追加するところまでを行いました。

しかしこのままではロボットが荷物を掴んだまま動きません。

 

ということで今回、この搬送ルールのスクリプトを作成していきます。

搬送を開始するにはTransferを作成する必要があります。

OnDispatchOutイベントの役割はこのTransferを作成することにあります。

 

Transferを作成するためには、TransferクラスのCreateメソッドを使用します。

Createメソッドはたとえば次のように使用します。

function RobotProgram1_OnDispatchOut1( visual : Demo3D.Visuals.Visual )
{
    var txConnector = visual.FindConnector("End");
    var rxConnector = txConnector.ConnectedTo;
    var load = visual.TransferState.Processed[0];
        
    Transfer.Create(txConnector, rxConnector, load);
}

これは

搬送元:visual(ここでは処理を行うRobotProgram)の「End」コネクタ

搬送先:上記コネクタの接続先

搬送対象:visualのProcessed(※)にある最初のワーク

としてTransferを作成するという処理になります。

(※Processedについては近いうちに紹介しますが、今は気にしなくていいです)

 

これを実行してみると、ロボットはNo.4のコンベアにだけ搬送するようになりました。

なぜNo.4かというと、RobotProgramのEndコネクタに対して最初に接続した相手がNo.4のコネクタだからです。

 

ではこれを要件通りに搬送先を選択するためにはどうするかというと、先のプログラムにある変数「rxConnector」の値を条件に応じて変更していけばいいわけです。

搬送先を決めるための基準になるのが、荷物に対して付与されたプロパティ「SerialNo」の値です。

この値を取得して、値が3の倍数、5の倍数、その両方であるか、をチェックします。

 

まずは条件が正しいかを確認したいので、3の倍数の時「Buzz」、5の倍数のとき「Fizz」、両方を満たす時「Buzz Fizz」、どれでもないとき「----」をメッセージ出力してみます。

function RobotProgram1_OnDispatchOut1( visual : Demo3D.Visuals.Visual )
{
    var txConnector = visual.FindConnector("End");
    var rxConnector = txConnector.ConnectedTo;
    var load = visual.TransferState.Processed[0];
        
    var serialNo = load.SerialNo;
    if (serialNo % 3 == 0 && serialNo % 5 == 0) {
        print(serialNo + ":Buzz Fizz");
    } else if (serialNo % 3 == 0) {
        print(serialNo + ":Buzz");
    } else if (serialNo % 5 == 0) {
        print(serialNo + ":Fizz");
    } else {
        print(serialNo + ":----");
    }

    Transfer.Create(txConnector, rxConnector, load);
}

実行すると、次のようにメッセージ出力されました。

 

大丈夫そうなので、メッセージ出力を「rxConnector」の設定に置き換えます。

 

今回特に搬送先となるコンベアを識別する仕掛けがないので、悪手かとは思いますがコンベアのNameプロパティで識別したいと思います。

各コンベアのNameは次の通りです。

No.1:C20

No.2:C15

No.3:C6

No.4:C11

 

名前から特定のVisualを取得するには、doc.FindVisualメソッドを使用します。

そして取得したVisualのStartコネクタを搬送先として「rxConnector」に設定します。

function RobotProgram1_OnDispatchOut1( visual : Demo3D.Visuals.Visual )
{
    var txConnector = visual.FindConnector("End");
    var rxConnector = txConnector.ConnectedTo;
    var load = visual.TransferState.Processed[0];

    var serialNo = load.SerialNo;
    if (serialNo % 3 == 0 && serialNo % 5 == 0) {
        rxConnector = doc.FindVisual("C6").FindConnector("Start");
    } else if (serialNo % 3 == 0) {
        rxConnector = doc.FindVisual("C20").FindConnector("Start");
    } else if (serialNo % 5 == 0) {
        rxConnector = doc.FindVisual("C15").FindConnector("Start");
    } else {
        rxConnector = doc.FindVisual("C11").FindConnector("Start");
    }

    Transfer.Create(txConnector, rxConnector, load);
}

 

この状態でモデルを実行してみると、次のような結果となりました。

なんか雑に作ったのですごく見づらいですが、要件は満たしているのがわかるかと思います。

 

搬送先の選択方法の基本はこんな感じです。

あとは実装したい要件に応じて「rxConnector」に値を設定する条件文を書くだけです。

 

じゃあ、逆に取得する荷物を選択するには? というのはまたの機会に。


 

次回の【How to Demo3D Scripting】は「Vector3型の演算その1:基本の演算」です。

更新は3/8(木)、ご期待ください。