こんにちは、開発Gの杉原です。
突然新卒教育をやることとなり、のほほんブログ書いている時間がまたなくなってしまいました。
しかし、今までこうして書いてきたブログがあるので、急な教育担当にも対応できて助かりましたね。
いやぁ、自分が書いた記事を最も読んでいるのは自分なんじゃないかなって思います。
(とか思いながら、更新日前日に記事書いていたんですが、当日公開設定にするのをうっかり忘れてました)
さて、そういうこともあって、今回は予定を変更して「Transferのキャンセルその2」としてお送りします。
前回Trasnferのキャンセルについてご説明しました。
ただ、その時は検証ができなくて断言できなかった、とても重要な話があります。
Demo3Dのイベント一覧からOnTransferCacelledを探したとき、下図のようにTransfer:Txのグループの中にあるかと思います。
ということは、です。
もしかして、OnTransferCancelledイベントはTx、つまり搬送元でしか発生しないのではないのかという疑念が生まれるわけです。
早速試してみます。
下図のように、いつも通りコンベアからフォークリフトがワークを受け取る単純なモデルを作ってみます。
そして、コンベアとフォークリフトの両方に、OnTransferCancelledイベントの処理を実装します。
コンベアには次のような処理
function SR1_OnTransferCancelled( sender : Demo3D.Visuals.StraightRollerConveyor, transfer : Demo3D.Visuals.Transfer ) { print("Cancel:Conveyor"); }
// 元がJScriptなので省略
フォークリフトには次のような処理
function Forklift1_OnTransferCreated( sender : Demo3D.Visuals.BoxVisual, transfer : Demo3D.Visuals.Transfer ) { print("Cancel:Forklift"); }
// 元がJScriptなので省略
次に、搬送をキャンセルする処理を実装します。
まずはフォークリフトのOnRxBeforeTransferでキャンセルしてみます。
もともとフォークリフトのMoveToPickupメソッドを呼び出す処理が定義されているので、これをコメントアウトしてTransferをキャンセルするようにします。
[Optimize(false)] function C_OnRxBeforeTransfer( sender: Visual , transfer : Transfer ) { transfer.Cancel(); // 既存の処理はコメントアウト /* SetVehicleStatus( sender, "Receiving" ); MatrixStackForQuickLogic.Set( sender, doc.Scene ); SetTransfer( sender, transfer ); XRunProgram( sender, "MoveToPickup" ); SetTransfer( sender, null ); */ }
// 元がJScriptなので省略
これを実行すると、以下のようなログが出力されました。
見ての通り、コンベア側の処理しか実行されていません。
コンベアはここでは搬送元になるので、やはり予想通り搬送元でしかキャンセルイベントが発生しないということになります。
つまり、搬送先からはキャンセルされたことを知ることができないというわけです。
これでは困ってしまうのは確かだとは思いますが、搬送が失敗したとき、搬送元都合であればワークは搬送元にあればそれが送られてこないだけですし、搬送先都合であれば自分のことなのでどうとでもなるわけです。
なので、困らないっちゃ困らないんですが、もしキャンセル処理を実装しようと考えている場合は、この点を気を付けてもらえればと思います。
次回の【How to Demo3D Scripting】は、ちょっといつもと違うことをやろうと思ってます。
内容は決めてますが、タイトルは「未定」ということで。
更新は6/14(木)です。お楽しみに。
コメントをお書きください