ページの先頭行へ戻る
Interstage AR Processing Server V1.0.1 開発ガイド
FUJITSU Software

2.5.3 prework.html

2.5.3.1 onloadの処理

Webストレージに保存したデータを取得、動作モードに応じたhtml表示の変更した後、シーンリストを取得
Apl.onloadPreWork = function () {
  // ネイティブカメラを停止させます。
  AR.Camera.stopCameraView(Apl.noop, Apl.stopCameraViewError);
  //Webストレージからデータを取得します。
  Apl.getLocalStorageData();
  //動作モードに応じてhtml表示を変更します。
  Apl.showOperationMode();
  //動作モードに応じてシーンを取得します。
  if (Apl.operationMode == "serverMode") { //サーバ通信モードの場合
    //現在のシナリオIDのシーンリストを取得して、Apl.sceneListに格納します。
    Apl.getScene(Apl.scenarioId);
  } else { //スタンドアローンモードの場合
    //Apl.sceneListに保持しているシーンリストを表示します。
    Apl.showSceneList();
  }
};
シーン取得の検索クエリを生成し、AR実行サーバからデータを取得
Apl.getScene = function (_scenarioId) {
  //検索クエリオブジェクトを作成します。
  var query = new Apl.QuadQuery();
  query.type = "RECORDSANDCOUNT";
  query.limitRange = new Apl.Range(1, 10);
  query.qattributeOrderIndexRange = new Apl.Range(1, 10);
  //シーンが登録されているqtypeを指定します。
  query.qtypeNameRanges = new Apl.Range("arsen_scene");
  //シーンidの範囲を指定します。
  query.whereExpressions = new Array(new Apl.QuadQueryExpression(new Apl.Range("ar_id"), new Apl.Range(1, 4), "LONG"));
  if (typeof _scenarioId != 'undefined')
  //シナリオIDを指定します。
    query.whereExpressions.push(new Apl.QuadQueryExpression(new Apl.Range("arscn_scenarioid"), new Apl.Range(_scenarioId), "LONG"));

  //文字列に変換します。
  query = Apl.makeQuadQuery(query);

  //AR実行サーバからシーンを取得します。
  AR.Data.getArServerData(query, true, Apl.getSceneSuccess, Apl.getArServerDataError);
};
AR実行サーバからシーンの取得に成功した場合の処理
Apl.getSceneSuccess = function (_result) {
  //初期化します
  Apl.sceneList = null;
  //結果からシーンを抽出してApl.sceneListに格納します。
  Apl.extractScene(_result.getValue());
  //シーンが登録されていた場合はWebストレージに保存します。
  if (Apl.sceneList != null)
    localStorage.setItem("sceneList", JSON.stringify(Apl.sceneList));
  //シーンリストを表示します。
  Apl.showSceneList();
};
シーンの抽出
Apl.extractScene = function (_data) {
  //取得したレコード数です。
  var recordLength = _data.records.length;
  for (var recordIndex = 0; recordIndex < recordLength; recordIndex++) {
    //レコードを一つずつ調べます。
    var record = _data.records[recordIndex];
    var valueLength = record.qvalues.length;
    var value = new Object();
    var sceneId;
    //使用するqvalueの値だけ取得します。attributeNameで判断します。
    for (var valueIndex = 0; valueIndex < valueLength; valueIndex++) {
      var qvalue = record.qvalues[valueIndex];
      if (qvalue.qattributeName == "ar_name") { // シーン名
        value.name = qvalue.stringValue;
      }
      if (qvalue.qattributeName == "ar_description") { // シーンの説明
        value.description = qvalue.stringValue;
      }
      if (qvalue.qattributeName == "ar_id") { // シーンID
        sceneId = qvalue.longValue
      }
    }
    if (value.name != null) {
      //Apl.sceneListに格納します。
      if (Apl.sceneList == null) Apl.sceneList = new Array();
      Apl.sceneList[sceneId] = value;
    }
  }
};
シーンリストの表示
Apl.showSceneList = function () {
  if (Apl.sceneList != null) {
    var show = "【手順一覧】\n";
    for (scene in Apl.sceneList) {
      if (Apl.sceneList[scene] != null)
        show += "手順" + scene + " : " + Apl.sceneList[scene].name + "\n";
    }
    alert(show);
  } else {
    alert("シーンを取得できませんでした。動作モードとネットワーク状態を確認してもう一度お試しください。");
    location.href = "index.html";
  }
};

2.5.3.2 作業準備ボタン動作

ネットワーク状況の判定
Apl.resourceDownload = function(){
  if(Apl.operationMode == "serverMode"){ //サーバ通信モードの場合
    //ダウンロード通知を設定します。
    Apl.completionNotice.notice = true;
    Apl.completionNotice.count++;

    //利用者定義データを取得してApl.userDataに格納します。
    Apl.getUserData(true);

    //シーンごとにAR重畳表示定義データを取得してApl.superimposedGraphicsに格納します。
    //クエリとレスポンスがオフラインストレージに保存されます。
    for(scene in Apl.sceneList){
      Apl.completionNotice.count++;
      Apl.getSuperimposedGraphicData(true, new Apl.Range(Apl.scenarioId), new Apl.Range(parseInt(scene)),new Apl.Range(1));
    }
  } else { //スタンドアローンモードの場合
    alert("サーバ通信モードで実行してください。");
  }
}
利用者定義データ取得の検索クエリを生成し、AR実行サーバからデータを取得
Apl.getUserData = function (_isSuperReload) {
  //検索クエリオブジェクトを作成します。
  var query = new Apl.QuadQuery();
  query.type = "RECORDSANDCOUNT";
  query.limitRange = new Apl.Range(1, 1);
  query.qattributeOrderIndexRange = new Apl.Range(1, 10);
  //利用者定義データが登録されているqtypeを指定します。
  query.qtypeNameRanges = new Array(new Apl.Range("usr_sample"));
  //ar_idを指定します。
  query.whereExpressions = new Array(new Apl.QuadQueryExpression(new Apl.Range("ar_id"), new Apl.Range(1), "LONG"));
  //登録日時(ar_registrationtime)で降順にソートして最新のデータを取得します。
  //登録日時が0~9000000000000の範囲でソートします。
  query.sortOrderExpressions = new Array(new Apl.QuadQueryExpression(new Apl.Range("ar_registrationtime"), new Apl.Range(0, 9000000000000), "LONG", true));
  //文字列に変換します。
  query = Apl.makeQuadQuery(query);

  //AR実行サーバから利用者定義データを取得します。
  AR.Data.getArServerData(query, _isSuperReload, Apl.getUserDataSuccess, Apl.getArServerDataError);
};
AR実行サーバから利用者定義データの取得に成功した場合の処理
Apl.getUserDataSuccess = function(_result){
  //結果から必要なデータを抽出してApl.userDataに格納します。
  Apl.extractUserData(_result.getValue());
  //利用者定義データが登録されていた場合はWebストレージに保存します。
  if(Apl.userData != null)
    localStorage.setItem("userData", JSON.stringify(Apl.userData)); 

  //ダウンロード完了通知を判定します。
  Apl.checkCompletion();
};
JSONオブジェクトから利用者定義データを抽出
Apl.extractUserData = function (_data) {
  //取得したレコード数です
  var recordCount = _data.records.length;
  for (var recordIndex = 0; recordIndex < recordCount; recordIndex++) {
    //レコードを一つずつ調べます。
    var record = _data.records[recordIndex];
    var valueLength = record.qvalues.length;
    var value = new Object();
    //使用するqvalueの数だけ取得します。attributeNameで判断します。
    for (var valueIndex = 0; valueIndex < valueLength; valueIndex++) {
      var qvalue = record.qvalues[valueIndex];
      if (qvalue.qattributeName == "usr_name") { // ユーザー名
        value.name = qvalue.stringValue;
      }
      if (qvalue.qattributeName == "usr_temperature") { // 点検温度
        value.temperature = qvalue.longValue;
      }
      if (qvalue.qattributeName == "ar_registrationtime") { // 登録日時
        value.time = qvalue.longValue;
      }
    }
    //取得したデータの登録日時を比較して最新のデータをApl.userDataに格納します。
    if (value.name != null)
      if (Apl.userData == null || Apl.userData.time < value.time) {
        Apl.userData = value;
      }
  }
}
AR重畳表示定義取得の検索クエリを生成し、AR実行サーバからデータを取得
Apl.getSuperimposedGraphicData = function(_isSuperReload, _scenarioId, _sceneId, _markerId){
  //quad検索クエリオブジェクトを作成します。
  var query = new Apl.QuadQuery();
  query.type = "RECORDSANDCOUNT";
  query.limitRange = new Apl.Range(1,10);
  query.qattributeOrderIndexRange = new Apl.Range(1,10);
  //AR重畳表示定義データが登録されているqtypeを指定します。
  query.qtypeNameRanges = new Array(new Apl.Range("arpoiarmk_default"));
  query.whereExpressions = new Array();
  
  //シナリオIDを指定します。
  if(typeof _scenarioId != 'undefined'){
    if(typeof _scenarioId == 'number' ) _scenarioId = new Apl.Range(_scenarioId);  
    query.whereExpressions.push(new Apl.QuadQueryExpression(new Apl.Range("arscn_scenarioid"), _scenarioId, "LONG"));
  }
  //シーンIDを指定します。
  if(typeof _sceneId != 'undefined'){
    if(typeof _sceneId == 'number' ) _sceneId = new Apl.Range(_sceneId);
    query.whereExpressions.push(new Apl.QuadQueryExpression(new Apl.Range("arsen_sceneid"), _sceneId, "LONG"));
  }
  //マーカーIDを指定します。
  if(typeof _markerId != 'undefined'){
    if(typeof _markerId == 'number' ) _markerId = new Apl.Range(_markerId);
    query.whereExpressions.push(new Apl.QuadQueryExpression(new Apl.Range("armk_markerid"), _markerId, "LONG"));
  }
  //文字列に変換します。
  query = Apl.makeQuadQuery(query);
    
  //AR実行サーバから重畳データを取得します。
    AR.Data.getArServerData(query, _isSuperReload, Apl.getSuperimposedGraphicDataSuccess, Apl.getArServerDataError);
};
AR実行サーバからAR重畳表示定義データの取得に成功した場合の処理
Apl.getSuperimposedGraphicDataSuccess = function(_result){
  //結果からAR重畳表示定義データを抽出します。
  var contents = Apl.extractSuperimposedGraphic(_result.getValue());
  
  //抽出したAR重畳表示定義をシーンID、マーカーID別にApl.superimposedGraphicsに格納します。
  for(scene in contents){
    if(Apl.superimposedGraphics == null) Apl.superimposedGraphics = new Object();

    if(Apl.superimposedGraphics[scene] == null) {
      Apl.superimposedGraphics[scene] = contents[scene];
      //AR重畳表示定義データをネイティブAR表示層に設定します。
      Apl.setARContents(parseInt(scene));
    } else {
      for(marker in contents[scene]){
        Apl.superimposedGraphics[scene][marker] = contents[scene][marker];
        //AR重畳表示定義データをネイティブAR表示層に設定します。
        Apl.setARContents(parseInt(scene),parseInt(marker));
        
      }
    }
  }
  //AR重畳表示定義データが存在する場合はWebストレージに保存します。
  if(Apl.superimposedGraphics != null){
    localStorage.setItem("ARContents", JSON.stringify(Apl.superimposedGraphics));
  }
  //ダウンロード完了通知を確認します。
  Apl.checkCompletion();
};
JSONオブジェクトからAR重畳表示定義データを抽出
Apl.extractSuperimposedGraphic = function(_data){
  //取得したレコード数です。
  var recordCount = _data.records.length;
  var superimposedGraphic = new Object();
    for(var recordIndex = 0; recordIndex < recordCount; recordIndex++){
      //レコードを一つずつ調べます
      var record = _data.records[recordIndex];
      var valueLength = record.qvalues.length;
      var arName, sceneId, markerId;
      var value;
      //使用するqvalueの数だけ取得します。attributeNameで判断します。
      for(var valueIndex = 0; valueIndex < valueLength; valueIndex++){
        var qvalue = record.qvalues[valueIndex];
        if(qvalue.qattributeName == "ar_name"){ // AR重畳表示定義データ名
          arName = qvalue.stringValue;
        }
        if(qvalue.qattributeName == "arsen_sceneid"){ // シーンID
          sceneId = qvalue.longValue;
        }
        if(qvalue.qattributeName == "armk_markerid"){ // マーカーID
          markerId = qvalue.longValue;
        }
        if(qvalue.qattributeName == "arpoi_superimposedgraphic"){ // AR重畳表示定義データ
          value = AR.Renderer.parseSuperimposedGraphic(qvalue.stringValue);
        }
      }
      //AR重畳表示定義データ名、シーンID、マーカーID、AR重畳表示定義データがnullでないことを確認
      //シーンID、マーカーID、AR重畳表示定義データは重畳に必須です。
      //AR重畳表示定義データ名は利用者定義データを組み込み時に重畳を特定するためにチェックしています
      if(arName != null && sceneId!=null && markerId != null && value != null){
        //AR重畳表示定義データに利用者定義データを組み込みます。
        value = Apl.insertUserData(value, arName);
        if(superimposedGraphic[sceneId] == null) superimposedGraphic[sceneId] = new Object();
        if(superimposedGraphic[sceneId][markerId] == null) superimposedGraphic[sceneId][markerId] = new Array(value);
        else superimposedGraphic[sceneId][markerId].push(value);
      }
    }
  return superimposedGraphic;
};
AR重畳表示定義データのar_idが指定した値の場合に利用者定義データを埋め込む処理を実施
Apl.insertUserData = function (_superimposedGraphic, _arName) {
  if (_arName == "業務サンプル_点検値" && Apl.userData != null) {
    //組み込む文字列を作成します。
    var registrationDate = new Date(Apl.userData.time);
    var month = registrationDate.getMonth() + 1;
    var vDate = month + "/" + registrationDate.getDate();
    var commentStr = "【" + vDate + "  " + Apl.userData.name + "】温度は" + Apl.userData.temperature + "℃";

    //supreimposedGraphic -> SquareModelGraphic -> TextTextureのTextを編集します。
    _superimposedGraphic.getGraphic().getTexture().setText(commentStr);
  }
  return _superimposedGraphic;
};
指定したシーンID、ARマーカーIDのAR重畳表示定義データをネイティブの描画レイヤに設定
Apl.setARContents = function(_sceneId, _markerId){
  if(Apl.superimposedGraphics[_sceneId] != null){ // 指定したシーンIDのAR重畳表示定義データがある場合
    if(_markerId == null){ // マーカーIDの指定がない場合、シーン全てのAR重畳表示定義データを設定します。
      for(marker in Apl.superimposedGraphics[_sceneId]){
        //ARマーカーの座標系を作成してマーカーIDを指定
        var coordinateSystem = new AR.Renderer.FJARMarkerCoordinateSystem();
        coordinateSystem.setValue(parseInt(marker));
        //対象マーカーIDのARコンテンツを削除
        AR.Renderer.remove(coordinateSystem, Apl.noop, Apl.removeError);
        //ネイティブAR表示層にAR重畳表示定義データを設定します。
        AR.Renderer.put(coordinateSystem, Apl.superimposedGraphics[_sceneId][parseInt(marker)], Apl.noop, Apl.putError);
      }
    } else if(Apl.superimposedGraphics[_sceneId][_markerId] != null) { //指定したマーカーIDのAR重畳表示定義データがある場合
      //ARマーカーの座標系を作成してマーカーIDを指定
      var coordinateSystem = new AR.Renderer.FJARMarkerCoordinateSystem();
      coordinateSystem.setValue(_markerId);
      //対象マーカーIDのARコンテンツを削除
      AR.Renderer.remove(coordinateSystem, Apl.noop, Apl.removeError);
      //ネイティブAR表示層にAR重畳表示定義データを設定します。
      AR.Renderer.put(coordinateSystem, Apl.superimposedGraphics[_sceneId][_markerId], Apl.noop, Apl.putError);
    }
  }
};
ダウンロードが完了しているかを確認
Apl.checkCompletion = function(){
  
  if(Apl.completionNotice.notice == true){
    Apl.completionNotice.count--;
    if(Apl.completionNotice.count == 0){
      Apl.completionNotice.notice = false;
      alert("ダウンロードが完了しました");
    }
  }
};

2.5.3.3 作業開始ボタン動作

ネイティブAR表示層に登録したAR重畳表示定義データをクリアして、work.htmlに遷移
Apl.start = function(){
  //ネイティブAR表示層登録したAR重畳表示定義をクリアします。
  AR.Renderer.clear(Apl.clearSuccess,Apl.clearError);
};

//AR重畳表示定義データのクリアに成功した場合
Apl.clearSuccess = function(_result){
  //work.htmlに遷移します。
  location.href="work.html";
};