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("ダウンロードが完了しました");
}
}
};