Skip to content

Commit 90c1101

Browse files
committed
use CORS (prerequisite on server side: http://code.google.com/p/bimserver/issues/detail?id=380)
ajax app: show errors viewer: also load Base64 encoded model data
1 parent e85ec48 commit 90c1101

2 files changed

Lines changed: 50 additions & 33 deletions

File tree

Client/ThreeJsViewer.js

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -51,23 +51,18 @@ function ThreeJsViewer(){
5151
this.onclick = function(){};
5252
};
5353

54-
this.loadModel = function(modelUrl){
55-
var geometryLoader = new THREE.JSONLoader(true);
56-
57-
var callback = function(partId) { return function(geometry) {
58-
var material = new THREE.MeshPhongMaterial({ color: this.UNSELECTED_COLOR });
59-
var mesh = new THREE.Mesh(geometry, material);
60-
mesh.doubleSided = false;
61-
this.root.add(mesh);
62-
this.meshes[mesh.geometry.id] = partId;
63-
}.bind(this); }.bind(this);
64-
65-
var texture_path = geometryLoader.extractUrlbase(modelUrl);
66-
67-
var createModel = function(jsonObject, dummy, texturePath){ // callback will be ignored, curried on the fly
54+
this.callback = function(partId) { return function(geometry) {
55+
var material = new THREE.MeshPhongMaterial({ color: this.UNSELECTED_COLOR });
56+
var mesh = new THREE.Mesh(geometry, material);
57+
mesh.doubleSided = false;
58+
this.root.add(mesh);
59+
this.meshes[mesh.geometry.id] = partId;
60+
}.bind(this); }.bind(this);
61+
62+
this.createModel = function(jsonObject, geometryModelCreator, texture_path){ // callback will be curried on the fly
6863
$.each(jsonObject, function(index, modelPart){
69-
geometryLoader.createModel( modelPart.geometry, callback(modelPart.id), texture_path );
70-
});
64+
geometryModelCreator( modelPart.geometry, this.callback(modelPart.id), texture_path );
65+
}.bind(this));
7166
var bb = this.computeBoundingBox();
7267
var ext = {x: bb.x[1] - bb.x[0], y: bb.y[1] - bb.y[0], z: bb.z[1] - bb.z[0]};
7368
// center mesh
@@ -80,12 +75,23 @@ function ThreeJsViewer(){
8075
// TODO: adjust clipping
8176
}.bind(this);
8277

78+
this.loadSerializedModel = function(serializedModel){
79+
var geometryLoader = new THREE.JSONLoader(true);
80+
var model = JSON.parse( serializedModel );
8381
geometryLoader.onLoadStart();
84-
geometryLoader.loadAjaxJSON({createModel: createModel, onLoadComplete: geometryLoader.onLoadComplete}, modelUrl, {}, texture_path);
82+
this.createModel(model, geometryLoader.createModel.bind(geometryLoader), 'localhost');
83+
geometryLoader.onLoadComplete();
84+
}
85+
86+
this.loadModel = function(modelUrl){
87+
var geometryLoader = new THREE.JSONLoader(true);
88+
var texture_path = geometryLoader.extractUrlbase(modelUrl);
89+
geometryLoader.onLoadStart();
90+
geometryLoader.loadAjaxJSON({createModel: this.createModel, onLoadComplete: geometryLoader.onLoadComplete}, modelUrl, geometryLoader.createModel.bind(geometryLoader), texture_path);
91+
}.bind(this);
8592

86-
};
8793
this.clearModel = function(){
88-
this.scene.removeChild(this.root);
94+
this.scene.remove(this.root);
8995
this.root = new THREE.Object3D();
9096
this.scene.add(this.root);
9197
this.meshes = {};

Client/index_served.html

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@
3939
<script src="Base64.js"></script>
4040
<script>
4141
var viewer;
42+
var host = 'http://localhost';
4243
function revisionUpdate(poid) {
4344
$('#roids').empty();
44-
$.ajax({url: '/rest/getAllRevisionsOfProject', data: 'poid='+poid, dataType: 'json', success: function(data){
45+
$.ajax({url: host+'/rest/getAllRevisionsOfProject', data: 'poid='+poid, dataType: 'json',
46+
xhrFields: { withCredentials: true}, success: function(data){
4547
var select = $('#roids');
4648
$(data.sRevision).sort(function(r1,r2){
4749
return r1.id > r2.id;
@@ -53,19 +55,24 @@
5355
function projectUpdate() {
5456
$('#revision').show();
5557
$('#poids').empty();
56-
$.ajax({url: '/rest/getAllReadableProjects', dataType: 'json', success: function(data) {
57-
var select = $('#poids');
58-
$(data.sProject).filter(function(i,project){
59-
return project.state == "ACTIVE" && project.name != "INT-Store";
60-
}).sort(function(p1,p2){
61-
return p1.name > p2.name;
62-
}).each(function(i, project) {
63-
$('<option />').val(project.oid).text(project.name).appendTo(select);
58+
$.ajax({url: host+'/rest/getAllReadableProjects', dataType: 'json',
59+
xhrFields: { withCredentials: true}, success: function(data) {
60+
var select = $('#poids');
61+
$(data.sProject).filter(function(i,project){
62+
return project.state == "ACTIVE" && project.name != "INT-Store";
63+
}).sort(function(p1,p2){
64+
return p1.name > p2.name;
65+
}).each(function(i, project) {
66+
$('<option />').val(project.oid).text(project.name).appendTo(select);
67+
});
68+
revisionUpdate(select.val());
69+
}
6470
});
65-
revisionUpdate(select.val());
66-
}});
6771
}
6872
$(document).ready(function() {
73+
$('#errors').ajaxError(function(event, xhr, settings, thrown) {
74+
$(this).text( 'Ajax error: ' + thrown.message);
75+
});
6976
viewer = new ThreeJsViewer();
7077
viewer.init($('#viewerContainer'));
7178
projectUpdate();
@@ -75,8 +82,9 @@
7582
return;
7683
}
7784
$.ajax({
78-
url: '/rest/getDataObjectByGuid', dataType: 'json',
85+
url: host+'/rest/getDataObjectByGuid', dataType: 'json',
7986
data: 'roid='+$('#roids').val()+'&guid='+id,
87+
xhrFields: { withCredentials: true},
8088
success: function(data){
8189
$('#selection').html(id + ' - ' + data.sDataObject.name + ' - ' + data.sDataObject.type);
8290
}
@@ -88,14 +96,16 @@
8896
});
8997
$('#revision').submit(function(){
9098
$.ajax({
91-
url: '/rest/download',
99+
url: host+'/rest/download',
92100
data: 'roid='+$(this.roids).val()+'&serializerName=ThreeJs&sync=true&showOwn=true',
101+
xhrFields: { withCredentials: true},
93102
success: function(data) {
94103
viewer.clearModel();
95104
$.ajax({
96-
url: '/rest/getDownloadData',
105+
url: host+'/rest/getDownloadData',
97106
dataType: 'json',
98107
data: 'actionId=' + data,
108+
xhrFields: { withCredentials: true},
99109
success: function(model) {
100110
viewer.loadSerializedModel(Base64.decode(model.sCheckoutResult.file));
101111
}
@@ -117,6 +127,7 @@
117127
</form>
118128
</div>
119129
<div id="viewerContainer"></div>
130+
<p id="errors"></p>
120131
<p class="boxed">
121132
selected: <span id="selection">nothing</span></p>
122133
</body>

0 commit comments

Comments
 (0)