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("サーバ通信モードで実行してください。"); } }
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); };
Apl.getUserDataSuccess = function(_result){ //結果から必要なデータを抽出してApl.userDataに格納します。 Apl.extractUserData(_result.getValue()); //利用者定義データが登録されていた場合はWebストレージに保存します。 if(Apl.userData != null) localStorage.setItem("userData", JSON.stringify(Apl.userData)); //ダウンロード完了通知を判定します。 Apl.checkCompletion(); };
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; } } }
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); };
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(); };
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; };
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; };
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("ダウンロードが完了しました"); } } };