Newer
Older
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<!-- <link type="text/css" rel="stylesheet" href="main.css"> -->
<style>
body {
background-color: #020227;
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
color: #444;
}
a {
color: #08f;
}
.label {
color: #FFF;
font-family: sans-serif;
padding: 2px;
background: rgba( 0, 0, 0, .6 );
}
</style>
</head>
<body>
<div id="3d-graph"></div>
<script src="//unpkg.com/three"></script>
<script src="../lib/TransformControls.js"></script>
<script src="../lib/STLLoader.js"></script>
<script src="../lib/js-colormaps.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<!-- <script src="//unpkg.com/3d-force-graph"></script> -->
<script src="../lib/3d-force-graph.js"></script>
<script src="//unpkg.com/three-spritetext"></script>
<script src="../lib/dat.gui.js"></script>
<script src="../visualization/utils.js"></script>
<script src="../visualization/geometry.js"></script>
<script src="../visualization/boundaryUtils.js"></script>
<!-- <script src="../visualization/boundary.js"></script> -->
<script>
var color1= 0xffffff; /*white*/
var color2= '#020227'; /*kohly*/
var color3= 0x1c5c61; /*teal*/
var color4= "#fa6e70"; //red/orange
var color5="#380152"; //purple
var color6="#696767"; //grey
var color7="#03dbfc"; //blue
var setup,Graph,gData,scene,camera,renderer,orbit,gui,guiSupport,guiLoad;
var scale=10.0;
var setupEmpty={//empty
nodes: [
],
edges: [
],
//material properties - AISI 1095 Carbon Steel (Spring Steel)
ndofs : 3*6,
animation : {
showDisplacement : true,
exaggeration : 20e2,
speed:3.0
},
viz : {
minStress:10e6,
maxStress: -10e6,
colorMaps:[coolwarm,YlGnBu, winter ,jet],
colorMap:0,
},
};
setup=setupEmpty;
var supportCount=0;
var supportBoxes=[];
var supportControls=[];
var guiSupports=[];
var loadCount=0;
var loadBoxes=[];
var loadControls=[];
var guiLoads=[];
var guiCMODS,gui_STL_particles,gui_particles_bonds,gui_bonds_stress_strain,gui_strain_GL
//////////////init///////////////////////
// $.getJSON("../json/"+fileName+".json", function(json) {
[scene,camera,renderer,orbit]=loadGraph(setup,scale);
setup.supports=[];
setup.loads=[];
var scaleFit=1;
var loader = new THREE.STLLoader();
var group;
var translationVector;
STL_particles:{
nlattice:"100",
stlName:'test',
},
particles_bonds:{
grid:"1024",
block:"1024",
},
bonds_stress_strain:{
grid:"512",
block: "512",
spring: "30000000",
mass: "1",
dissipation: "100",
dt: "0.0001",
nloop: "1000",
load:{
type:"zlimit",
percent:"5",
// type:"ycylinder",
lmin:{
x: "0",
y: "0",
z: "0",
},
lmax:{
x: "0",
y: "0",
z: "0",
},
smin:{
x: "0",
y: "0",
z: "0",
},
smax:{
x: "0",
y: "0",
z: "0",
},
step: "-0.0002",
bond:"15"
},
strain_GL:{
size:"1.5",
scale:"200",
rx:"1.55",
ry:"0.0",
rz:"0.0",
sxyz:"0.25",
perspective:"0.05"
}
}
function initialGui(){
gui.add(setup.cmods,'stlFileName').listen();
gui_STL_particles=guiCMODS.addFolder('STL_particles');
gui_STL_particles.add(setup.cmods.STL_particles,'nlattice').listen();
gui_STL_particles.add(setup.cmods.STL_particles,'stlName').listen();
gui_particles_bonds=guiCMODS.addFolder('particles_bonds');
gui_particles_bonds.add(setup.cmods.particles_bonds,'grid').listen();
gui_particles_bonds.add(setup.cmods.particles_bonds,'block').listen();
gui_bonds_stress_strain=guiCMODS.addFolder('bonds_stress_strain');
gui_bonds_stress_strain.add(setup.cmods.bonds_stress_strain,'grid').listen();
gui_bonds_stress_strain.add(setup.cmods.bonds_stress_strain,'block').listen();
gui_bonds_stress_strain.add(setup.cmods.bonds_stress_strain,'spring').listen();
gui_bonds_stress_strain.add(setup.cmods.bonds_stress_strain,'mass').listen();
gui_bonds_stress_strain.add(setup.cmods.bonds_stress_strain,'dissipation').listen();
gui_bonds_stress_strain.add(setup.cmods.bonds_stress_strain,'dt').listen();
gui_bonds_stress_strain.add(setup.cmods.bonds_stress_strain,'nloop').listen();
gui_bonds_stress_strain.add(setup.cmods.bonds_stress_strain.load,'type').listen();
gui_bonds_stress_strain.add(setup.cmods.bonds_stress_strain.load,'percent').listen();
gui_bonds_stress_strain.add(setup.cmods.bonds_stress_strain,'step').listen();
gui_bonds_stress_strain.add(setup.cmods.bonds_stress_strain,'bond').listen();
gui_strain_GL=guiCMODS.addFolder('strain_GL');
gui_strain_GL.add(setup.cmods.strain_GL,'size').listen();
gui_strain_GL.add(setup.cmods.strain_GL,'scale').listen();
gui_strain_GL.add(setup.cmods.strain_GL,'rx').listen();
gui_strain_GL.add(setup.cmods.strain_GL,'ry').listen();
gui_strain_GL.add(setup.cmods.strain_GL,'rz').listen();
gui_strain_GL.add(setup.cmods.strain_GL,'sxyz').listen();
gui_strain_GL.add(setup.cmods.strain_GL,'perspective').listen();
function loadSTL(name){
loader.load( "../CAD/"+name+".stl", function ( geometry ) {
var material = new THREE.MeshPhongMaterial(
{
vertexColors: THREE.VertexColors
});
// material.vertexColors = THREE.VertexColors;
var count=geometry.attributes.position.count*3;
var colors=[]
for(var i=0;i<count/3.0;i++){
colors.push(28.0/255.0);
colors.push(92.0/255.0);
colors.push(97.0/255.0); //teal
}
geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));
group = new THREE.Mesh( geometry, material );
// console.log(geometry.attributes.position.array);
// group.geometry.colorsNeedUpdate = true;
group.geometry.attributes.color.needsUpdate = true;
// group.position.set( 0, -5.0*scale, 0.0 );
// group.rotation.set( - Math.PI / 2, 0, 0 );
// group.scale.set( scale, scale, scale );
group.name=name;
group.geometry.computeBoundingBox();
box1.copy( group.geometry.boundingBox ).applyMatrix4( group.matrixWorld );
scaleFit=1.0/box1.max.z;
translationVector=box1.getCenter().clone();
group.position.set( -translationVector.x, -translationVector.y, -translationVector.z );
var box = new THREE.Box3();
// group.updateMatrix();
group.geometry.computeBoundingBox();
box.copy( group.geometry.boundingBox ).applyMatrix4( group.matrixWorld );
var helper = scene.getObjectByName( "gridHelper" );
helper.position.y=box.getCenter().y-box.max.y;
// console.log(box.center())
// console.log(box.max)
// helper.position.y=box.center().y/2;
function updateNodeColors(){
var count=group.geometry.attributes.position.count*3;
var colors=[]
for(var i=0;i<count/3.0;i++){
colors.push(92.0/255.0);
colors.push(97.0/255.0); //teal
var box1 = new THREE.Box3();
loadBoxes[j].geometry.computeBoundingBox();
box1.copy( loadBoxes[j].geometry.boundingBox ).applyMatrix4( loadBoxes[j].matrixWorld );
setup.loads[j][0].min.x=box1.min.x;
setup.loads[j][0].min.y=box1.min.y;
setup.loads[j][0].min.z=box1.min.z;
setup.loads[j][0].max.x=box1.max.x;
setup.loads[j][0].max.y=box1.max.y;
setup.loads[j][0].max.z=box1.max.z;
group.geometry.attributes.position.array[i*3]-translationVector.x,
group.geometry.attributes.position.array[i*3+1]-translationVector.y,
group.geometry.attributes.position.array[i*3+2]-translationVector.z);
var inside=false;
if(setup.loads[j][2].type=="cylinder"){
if(box1.containsPoint(point)){
inside=pointInMesh(point,loadBoxes[j]);
}
}else{
inside=box1.containsPoint(point);
}
if(inside){
colors[i*3]=(3.0/255.0);
colors[i*3+1]=(219.0/255.0);
colors[i*3+2]=(252.0/255.0); //blue
//check if support
for(var j=0;j<supportCount;j++){
var box = new THREE.Box3();
supportBoxes[j].geometry.computeBoundingBox();
box.copy( supportBoxes[j].geometry.boundingBox ).applyMatrix4( supportBoxes[j].matrixWorld );
setup.supports[j][0].min.x=box.min.x;
setup.supports[j][0].min.y=box.min.y;
setup.supports[j][0].min.z=box.min.z;
setup.supports[j][0].max.x=box.max.x;
setup.supports[j][0].max.y=box.max.y;
setup.supports[j][0].max.z=box.max.z;
group.geometry.attributes.position.array[i*3]-translationVector.x,
group.geometry.attributes.position.array[i*3+1]-translationVector.y,
group.geometry.attributes.position.array[i*3+2]-translationVector.z);
var inside=false;
if(setup.supports[j][2].type=="cylinder"){
if(box.containsPoint(point)){
inside=pointInMesh(point,supportBoxes[j])
}
}else{
inside=box.containsPoint(point);
}
if(inside){
colors[i*3]=(255.0/255.0);
colors[i*3+1]=(92.0/255.0);
colors[i*3+2]=(97.0/255.0); //orange
var colors = new Float32Array( colors );
group.geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));
// console.log(group.geometry.attributes.position.array);
// group.geometry.colorsNeedUpdate = true;
group.geometry.attributes.color.needsUpdate = true;
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
function pointInMesh(point,mesh){
const direction = new THREE.Vector3(1, 1, 1);
const geometry = new THREE.BoxGeometry(5, 5, 5)
// const material = new THREE.MeshBasicMaterial({ color: 0xffff00, side: THREE.DoubleSide });
// const mesh = new THREE.Mesh(geometry, material)
const raycaster = new THREE.Raycaster()
raycaster.set(point, direction);
const intersects = raycaster.intersectObject(mesh);
// if (intersects.length && direction.dot(intersects[0].face.normal) > 0) {
// return true;
// // console.log(`Point is in object`);
// } else {
// return false;
// // console.log(`Point is out of object`);
// }
if( intersects.length %2 === 1) { // Points is in objet
// console.log(`Point is in object`)
return true;
}else{
return false;
}
//check if load
for(var j=0;j<loadCount;j++){
var box1 = new THREE.Box3();
loadBoxes[j].geometry.computeBoundingBox();
box1.copy( loadBoxes[j].geometry.boundingBox ).applyMatrix4( loadBoxes[j].matrixWorld );
setup.loads[j][0].min.x=box1.min.x;
setup.loads[j][0].min.y=box1.min.y;
setup.loads[j][0].min.z=box1.min.z;
setup.loads[j][0].max.x=box1.max.x;
setup.loads[j][0].max.y=box1.max.y;
setup.loads[j][0].max.z=box1.max.z;
}
//check if support
for(var j=0;j<supportCount;j++){
var box = new THREE.Box3();
supportBoxes[j].geometry.computeBoundingBox();
box.copy( supportBoxes[j].geometry.boundingBox ).applyMatrix4( supportBoxes[j].matrixWorld );
setup.supports[j][0].min.x=box.min.x;
setup.supports[j][0].min.y=box.min.y;
setup.supports[j][0].min.z=box.min.z;
setup.supports[j][0].max.x=box.max.x;
setup.supports[j][0].max.y=box.max.y;
setup.supports[j][0].max.z=box.max.z;
}
if(supportCount>0&&loadCount>0){
setup.cmods.bonds_stress_strain.load.lmin.x=(setup.loads[0][0].min.x+translationVector.x);
setup.cmods.bonds_stress_strain.load.lmin.y=(setup.loads[0][0].min.z+translationVector.z);
setup.cmods.bonds_stress_strain.load.lmin.z=-(setup.loads[0][0].max.y+translationVector.y);
setup.cmods.bonds_stress_strain.load.lmax.x=(setup.loads[0][0].max.x+translationVector.x);
setup.cmods.bonds_stress_strain.load.lmax.y=(setup.loads[0][0].max.z+translationVector.z);
setup.cmods.bonds_stress_strain.load.lmax.z=-(setup.loads[0][0].min.y+translationVector.y);
setup.cmods.bonds_stress_strain.load.smin.x=(setup.supports[0][0].min.x+translationVector.x);
setup.cmods.bonds_stress_strain.load.smin.y=(setup.supports[0][0].min.z+translationVector.z);
setup.cmods.bonds_stress_strain.load.smin.z=-(setup.supports[0][0].max.y+translationVector.y);
setup.cmods.bonds_stress_strain.load.smax.x=(setup.supports[0][0].max.x+translationVector.x);
setup.cmods.bonds_stress_strain.load.smax.y=(setup.supports[0][0].max.z+translationVector.z);
setup.cmods.bonds_stress_strain.load.smax.z=-(setup.supports[0][0].min.y+translationVector.y);
console.log(setup.cmods.bonds_stress_strain.load.lmin)
console.log(setup.cmods.bonds_stress_strain.load.lmax)
console.log(setup.cmods.bonds_stress_strain.load.smin)
console.log(setup.cmods.bonds_stress_strain.load.smax)
$.post("/", { data : { foo : JSON.stringify(setup) } }, function(temp) {
// temp === "I am done";
});
}
$.post("/", { data : { foo : JSON.stringify(setup) } }, function(temp) {
// temp === "I am done";
});