geojson.js 3.58 KB
arcs_module(function (ARCS,three) {
        var PipeNetwork = ARCS.Component.create(
            function ( jsonData ) {
                console.log("instanciating pipe network");
                var pipeNetwork = new THREE.Object3D();
                

                var X_OFFSET = 0; // 2.428592;
                var Y_OFFSET = 0; // 48.613426;
                
                const mmtoDeg = 0.00000001;
                
                
                var createTube = function(coords, p, color, idx) {
                    var i, j, k;
                    // the father of it all
                    var root = new THREE.Object3D();

                    // computing the internal diameter of the conduct
                    var diametre = (p.DIAMETRE*mmtoDeg) || (100*mmtoDeg) ;
                    
                    for (j=0; j < coords.length ; j++) {
                                
                        if (coords[j].length >= 2) {
                            var path = new THREE.CurvePath();
                            
                            for (k=0; k < coords[j].length-1 ; k++) {
                                path.add(
                                    new THREE.LineCurve3( 
                                        new THREE.Vector3( coords[j][k][0] - X_OFFSET, coords[j][k][1] - Y_OFFSET,0),
                                        new THREE.Vector3( coords[j][k+1][0] - X_OFFSET , coords[j][k+1][1] - Y_OFFSET, 0)
                                    )
                                );
                            }
                            
                            var geometry = new THREE.TubeGeometry(path, 10, diametre,10);
                            var bufferedGeometry = new THREE.BufferGeometry();
                            bufferedGeometry.fromGeometry(geometry);
                                                
                            root = new THREE.Mesh( bufferedGeometry, new THREE.MeshBasicMaterial({
                                color: color,
                            })); //new THREE.MeshBasicMaterial({color : color}) );
                            root.userData = idx;
                        }
                    }
                    
                    return root;                        
                };
                
                
                var prepareNetwork = function ( gjObject, color ) {
                    if (gjObject.type === "FeatureCollection") {   
                        if (gjObject.features === undefined) { return ; }
                        var i, j, k;
                        
                        for (i=0; i < gjObject.features.length; i++) {
                            var feature = gjObject.features[i];
                            if (feature.geometry === undefined || feature.properties === undefined) {
                                return ;
                            }

                            var geometry = feature.geometry;
                        
                            if (geometry.type === "MultiLineString") {
                                pipeNetwork.add(createTube(geometry.coordinates, feature.properties , color, i));
                            }
                        }
                    }
                };
                
                prepareNetwork(jsonData, 0x0000ff);

                this.init = function() {
                    this.emit('sendSceneGraph', pipeNetwork);
                };


                
            },
            ['init'],
            ['sendSceneGraph']
        );
    
        return { PipeNetwork : PipeNetwork };    
    }, 
    ['deps/three.js/index']
);