Skip to content
Snippets Groups Projects
draw.js 7.79 KiB
Newer Older
Amira Abdel-Rahman's avatar
Amira Abdel-Rahman committed
// Amira Abdel-Rahman
// (c) Massachusetts Institute of Technology 2020

///////////call from node app.js code///////////////
// wait for the rhino3dm web assembly to load asynchronously
// rhino3dm().then(function(m) {// todo change call to app.js
// 	_rhino3dm = m; // global
// 	initRhino3dm(1,10,createVoxel,true,true);
// 	saveJSON();
// });
/////////////////////////////////////

var three; //todo change location
var three1; //todo change location
var setup=JSON.parse(JSON.stringify(setupEmpty));
var setup1=JSON.parse(JSON.stringify(setupEmpty));
var globalSetup={
    exaggeration:0.5,
    speed:3.0,
    updateStress:false

};
// var ex=gui.add(globalSetup, 'exaggeration', 0, 10e4).listen();
// var sp=gui.add(globalSetup, 'speed', 0, 5).listen();
// var sp=gui.add(globalSetup, 'updateStress').listen();

var static=true;

var latticeSize=15;
var voxelSize=5.0;

// ex.onChange(updateExSpeed);
// sp.onChange();


rhino3dm().then(async m => {
    console.log('Loaded rhino3dm.');

    // document.getElementById("footer2").innerHTML = "Loaded rhino3dm.";
    _rhino3dm = m; // global

    var material={
		area:2.38*2.38,
		density:0.028,
		stiffness:4000
    };
    
    var material2={
		area:1.0,
		density:0.028,
		stiffness:2000
	};

    setup.hierarchical=false;
    setup.voxelSize=voxelSize;

    const position=new THREE.Vector3(0,0,0);
    const position2=new THREE.Vector3(voxelSize*2,0,0);

    ///
    //try bounding box conditions
    var support=new _rhino3dm.BoundingBox([-voxelSize/2+position.x,-voxelSize/2+position.y,-voxelSize/2+position.z], [voxelSize/2+position.x,voxelSize/2+position.y,voxelSize/2+position.z]);
    
    var temp=voxelSize*5-voxelSize;
    
    // var load=new _rhino3dm.BoundingBox([-voxelSize/2+position.x,-voxelSize/2+position.y,temp-voxelSize/2+position.z], [voxelSize/2+position.x,voxelSize/2+position.y,temp+voxelSize/2+position.z]);

    var load=new _rhino3dm.BoundingBox([-voxelSize/2+position.x,
        -voxelSize/2+position.y+voxelSize/4,
        temp+position.z+voxelSize/4], 
        [voxelSize/2+position.x-voxelSize/4,
            voxelSize/2+position.y-voxelSize/4,
            temp+voxelSize/2+position.z]);

    var load1=new _rhino3dm.BoundingBox([voxelSize/2+position.x,
                -voxelSize/2+position.y+voxelSize/4,
                temp+position.z+voxelSize/4], 
                [voxelSize/2+position.x+voxelSize/4,
                    voxelSize/2+position.y-voxelSize/4,
                    temp+voxelSize/2+position.z]);

    // var temp1=voxelSize*10-voxelSize;
    // var load1=new _rhino3dm.BoundingBox([voxelSize/2+position.x,
    //     -voxelSize/2+position.y+voxelSize/4,
    //     temp1+position.z+voxelSize/4], 
    //     [voxelSize/2+position.x+voxelSize/4,
    //         voxelSize/2+position.y-voxelSize/4,
    //         temp1+voxelSize/2+position.z]);

    // var load1_1=new _rhino3dm.BoundingBox([-voxelSize/2+position.x,
    //         -voxelSize/2+position.y+voxelSize/4,
    //         temp1+position.z+voxelSize/4], 
    //         [voxelSize/2+position.x-voxelSize/4,
    //             voxelSize/2+position.y-voxelSize/4,
    //             temp1+voxelSize/2+position.z]);

    // var temp2=voxelSize*latticeSize-voxelSize;
    // var load2=new _rhino3dm.BoundingBox([-voxelSize/2+position.x,
    //     -voxelSize/2+position.y+voxelSize/4,
    //     temp2+position.z+voxelSize/4], 
    //     [voxelSize/2+position.x-voxelSize/4,
    //         voxelSize/2+position.y-voxelSize/4,
    //         temp2+voxelSize/2+position.z]);

    // var load2_1=new _rhino3dm.BoundingBox([voxelSize/2+position.x,
    //         -voxelSize/2+position.y+voxelSize/4,
    //         temp2+position.z+voxelSize/4], 
    //         [voxelSize/2+position.x+voxelSize/4,
    //             voxelSize/2+position.y-voxelSize/4,
    //             temp2+voxelSize/2+position.z]);
        

    var dof=[true,true,true,true,true,true];
    var supports=[[support,dof]];
    var loads=[[load,{x:0.0,y:0,z:-0.1}],[load1,{x:0.0,y:0,z:-0.1}]];
    // var loads=[[load,{x:0.0,y:0,z:-1.0}],[load1,{x:0.0,y:0,z:-1.0}],[load2,{x:0.0,y:0,z:-1.0}],[load_1,{x:0.0,y:0,z:-2.0}],[load1_1,{x:0.0,y:0,z:-2.0}],[load2_1,{x:0.0,y:0,z:-2.0}]];
    // var loads=[[load,{x:0.0,y:0,z:-1.0}],[load_1,{x:0.0,y:0,z:-2.0}]];
    // var diffMaterialBox=[[matB,material2]];

    ///
    

    lateralLoadSetup(setup,position,latticeSize,voxelSize,createVoxel,supports,loads,material);
    // changeMaterialFromBox(setup,diffMaterialBox);


    // setup.viz.colorMaps=[YlGnBu,coolwarm, winter ,jet];
    setup.viz.minStress=10e6;
    setup.viz.maxStress=-10e6;
    setup.viz.exaggeration=0.5;

    // setup.viz.exaggeration=globalSetup.exaggeration;
    // setup.solve=solveParallel;
    // setup.numTimeSteps=100;
    // setup.supports=supports;
    // setup.loads=loads;

   
    // three= new threejs(setup,"webgl1","graph",static);
    // three.init();
    // three.drawConstraintBoundingBoxes([support],[load]);
   

    ////////////////////////////////////

    setup1.hierarchical=true;
    setup1.voxelSize=voxelSize;

    

    lateralLoadSetup(setup1,position,latticeSize,voxelSize,createHieraricalVoxel,supports,loads,material);
    // changeMaterialFromBox(setup1,diffMaterialBox);




    setup1.viz.colorMaps=[YlGnBu,coolwarm, winter ,jet];
    setup1.viz.minStress=10e6;
    setup1.viz.maxStress=-10e6;

    // setup1.viz.exaggeration=globalSetup.exaggeration;
    setup1.solve=solveParallel;
    setup1.supports=supports;
    setup1.loads=loads;

    

    setup.supports=[
        [{
            min:[
                support.min[0],
                support.min[1],
                support.min[2]
            ],
            max:[
                support.max[0],
                support.max[1],
                support.max[2]
            ]
        }]
    ];
    setup.loads=[
        [{
            min:[
                load.min[0],
                load.min[1],
                load.min[2]
            ],
            max:[
                load.max[0],
                load.max[1],
                load.max[2]
            ]
        }],
        [{
            min:[
                load1.min[0],
                load1.min[1],
                load1.min[2]
            ],
            max:[
                load1.max[0],
                load1.max[1],
                load1.max[2]
            ]
        }]
    ];
    

    saveJSON()

    // three1= new threejs(setup1,"webgl","threejs",static);
    // three1.init();

    // gui.add(three.setup,"numTimeSteps", 0, 500).listen();
    // gui.add(three.setup,"solve");
    
    
    
    // document.getElementById("footer2").innerHTML = "Press solve for structure simulation.";

    // more stuff
});

function solveParallel(){
    document.getElementById("footer2").innerHTML = "Running...";
    var numTimeSteps=250;
    /////////////////////////////////////////////////////
    

    var dt=0.0251646; //?? todo change to recommended step
    var dt=0.01; //?? todo change to recommended step
    

    setTimeout(function() { 
        simulateParallel( setup,three.setup.numTimeSteps,dt,static,2); 
        simulateParallel(setup1,three.setup.numTimeSteps,dt,static,2);
    }, 1);

    // var dt=0.0251646; //?? todo change to recommended step
    // simulateParallel(setup1,numTimeSteps,dt);

    ///////////////////////////////////////
    // updateColors();
    // three.animate();
    // three1.animate();
    
    /////////////////////
    

}

function updateExSpeed(){
    three.setup.animation.exaggeration=globalSetup.exaggeration;
    three1.setup.animation.exaggeration=globalSetup.exaggeration;
    three.setup.animation.speed=globalSetup.speed;
    three1.setup.animation.speed=globalSetup.speed;

}

function getForce(x,t){
    var a0=10000.0;
    var l=1.0 ;
    var f=2.0;
    var amp=0.1;
    var x=parseInt(x/voxelSize)/10.0;
    var t=t/100.0;
    var ax=1-0.825*(x-1)+1.0625*(x*x-1);
    return a0* ax *Math.sin(2*Math.PI*(x/l-f*t+amp));

}