package org.jcae.opencascade.jni;
import static org.junit.Assert.*;
import org.junit.Test;
import java.util.HashMap;
/**
* Workshop JINA 2006, Finite tilted Grid in front of a cavity
* @author Jerome Robert and Guillaume Sylvand
*/
public class Jina2006
{
// Size of the grid
public final static int I_MAX=1;
public final static int J_MAX=10;
public final static int K_MAX=10;
/**
* Used as index of edges of the grid
*/
static class IntEdge
{
int i, j, k, i2, j2, k2;
public IntEdge(int i, int j, int k, int i2, int j2, int k2)
{
this.i=i;
this.j=j;
this.k=k;
this.i2=i2;
this.j2=j2;
this.k2=k2;
}
@Override
public boolean equals(Object obj)
{
if (!(obj instanceof IntEdge))
return false;
IntEdge other=(IntEdge)obj;
return (i==other.i)&&(j==other.j)&&(k==other.k)
&&(i2==other.i2)&&(j2==other.j2)&&(k2==other.k2);
}
@Override
public int hashCode()
{
return i+j+k+i2+j2+k2;
}
}
/** Coordinates on the grid */
static double[] coordinates(int i, int j, int k)
{
double x=-(k-5)*0.03*Math.sin(15*Math.PI/180)+(i-1)*0.01;
double y=(j-5)*0.03;
double z=(k-5)*0.03;
return new double[]{x, y, z};
}
/** Easy creation of vertices */
static TopoDS_Vertex createVertex(double x, double y, double z)
{
return (TopoDS_Vertex) new BRepBuilderAPI_MakeVertex(new double[]{x, y, z}).shape();
}
/** Easy creation of vertices */
static TopoDS_Vertex createVertex(double[] coords)
{
return (TopoDS_Vertex) new BRepBuilderAPI_MakeVertex(coords).shape();
}
/** Easy creation of edges */
static TopoDS_Edge createEdge(TopoDS_Vertex v1, TopoDS_Vertex v2)
{
return (TopoDS_Edge) new BRepBuilderAPI_MakeEdge(v1, v2).shape();
}
/** Easy creation of faces */
static TopoDS_Face createFace(TopoDS_Edge e1, TopoDS_Edge e2, TopoDS_Edge e3, TopoDS_Edge e4)
{
TopoDS_Wire wirePlate=
(TopoDS_Wire) new BRepBuilderAPI_MakeWire(e1, e2, e3, e4).shape();
return (TopoDS_Face) new BRepBuilderAPI_MakeFace(wirePlate, true).shape();
}
/** Easy creation of faces */
static TopoDS_Face createFace(TopoDS_Shape wire)
{
return (TopoDS_Face) new BRepBuilderAPI_MakeFace((TopoDS_Wire)wire, true).shape();
}
@Test public void sample()
{
HashMap int2edges=new HashMap();
TopoDS_Vertex[][][] vertices=new TopoDS_Vertex[I_MAX+2][J_MAX+2][K_MAX+2];
//The compound to return
BRep_Builder bb=new BRep_Builder();
TopoDS_Compound compound=new TopoDS_Compound();
bb.makeCompound(compound);
//Create vertices of the grid
for(int i=0; i<I_MAX+2; i++)
{
for(int j=0; j<J_MAX+2; j++)
{
for(int k=0; k<K_MAX+2; k++)
vertices[i][j][k]=createVertex(coordinates(i,j,k));
}
}
//Create edges of the grid
for(int i=0; i<I_MAX+1; i++)
{
for(int j=0; j<J_MAX+1; j++)
{
for(int k=0; k<K_MAX+1; k++)
{
TopoDS_Edge edge1=createEdge(vertices[i][j][k], vertices[i+1][j][k]);
int2edges.put(new IntEdge(i,j,k,i+1,j,k), edge1);
TopoDS_Edge edge2=createEdge(vertices[i][j][k], vertices[i][j+1][k]);
int2edges.put(new IntEdge(i,j,k,i,j+1,k), edge2);
TopoDS_Edge edge3=createEdge(vertices[i][j][k], vertices[i][j][k+1]);
int2edges.put(new IntEdge(i,j,k,i,j,k+1), edge3);
}
}
}
//Create faces of the grid
for(int i=0; i<I_MAX; i++)
for(int j=0; j<J_MAX+1; j++)
for(int k=0; k<K_MAX+1; k++)
{
{
//face1
TopoDS_Edge edge1=(TopoDS_Edge) int2edges.get(new IntEdge(i, j, k, i, j+1, k));
TopoDS_Edge edge2=(TopoDS_Edge) int2edges.get(new IntEdge(i, j+1,k, i+1, j+1, k));
TopoDS_Edge edge3=(TopoDS_Edge) int2edges.get(new IntEdge(i+1, j, k, i+1, j+1, k));
TopoDS_Edge edge4=(TopoDS_Edge) int2edges.get(new IntEdge(i, j, k, i+1, j, k));
if(edge1!=null && edge2!=null && edge3!=null && edge4!=null)
{
bb.add(compound, createFace(edge1, edge2, edge3, edge4));
}
}
{
//face2
TopoDS_Edge edge1=(TopoDS_Edge) int2edges.get(new IntEdge(i, j, k, i, j, k+1));
TopoDS_Edge edge2=(TopoDS_Edge) int2edges.get(new IntEdge(i, j,k+1, i+1, j, k+1));
TopoDS_Edge edge3=(TopoDS_Edge) int2edges.get(new IntEdge(i+1, j, k, i+1, j, k+1));
TopoDS_Edge edge4=(TopoDS_Edge) int2edges.get(new IntEdge(i, j, k, i+1, j, k));
if(edge1!=null && edge2!=null && edge3!=null && edge4!=null)
{
bb.add(compound, createFace(edge1, edge2, edge3, edge4));
}
}
}
// Face X-
TopoDS_Vertex p1=createVertex(-0.15,0.15,0.15);
TopoDS_Vertex p2=createVertex(-0.15,0.15,-0.15);
TopoDS_Vertex p3=createVertex(-0.15,-0.15,-0.15);
TopoDS_Vertex p4=createVertex(-0.15,-0.15,0.15);
TopoDS_Edge e1=createEdge(p1,p2);
TopoDS_Edge e2=createEdge(p2,p3);
TopoDS_Edge e3=createEdge(p3,p4);
TopoDS_Edge e4=createEdge(p4,p1);
bb.add(compound, createFace(e1, e2, e3, e4));
TopoDS_Edge eYpZp=createEdge(vertices[0][J_MAX][K_MAX], p1);
TopoDS_Edge eYpZm=createEdge(vertices[0][J_MAX][0], p2);
TopoDS_Edge eYmZm=createEdge(vertices[0][0][0], p3);
TopoDS_Edge eYmZp=createEdge(vertices[0][0][K_MAX], p4);
// Face Z-
BRepBuilderAPI_MakeWire mw=new BRepBuilderAPI_MakeWire();
for(int j=0; j<J_MAX ; j++)
{
TopoDS_Edge aEdge=(TopoDS_Edge) int2edges.get(new IntEdge(0, j, 0, 0, j+1, 0));
mw.add(aEdge);
} // end on 0,11,00
mw.add(eYpZm);
mw.add(e2);
mw.add((TopoDS_Edge) eYmZm.reversed());
bb.add(compound, createFace(mw.shape()));
// Face Z+
mw=new BRepBuilderAPI_MakeWire();
for(int j=0; j<J_MAX ; j++)
{
TopoDS_Edge aEdge=(TopoDS_Edge) int2edges.get(new IntEdge(0, j, K_MAX, 0, j+1, K_MAX));
mw.add(aEdge);
} //end on 0, 11, 11
mw.add(eYpZp);
mw.add((TopoDS_Edge) e4.reversed());
mw.add((TopoDS_Edge) eYmZp.reversed());
bb.add(compound, createFace(mw.shape()));
// Face Y-
mw=new BRepBuilderAPI_MakeWire();
for(int k=0; k<K_MAX ; k++)
{
TopoDS_Edge aEdge=(TopoDS_Edge) int2edges.get(new IntEdge(0, 0, k, 0, 0, k+1));
mw.add(aEdge);
} // end on 0,0,11
mw.add(eYmZp);
mw.add((TopoDS_Edge) e3.reversed());
mw.add((TopoDS_Edge) eYmZm.reversed());
bb.add(compound, createFace(mw.shape()));
// Face Y+
mw=new BRepBuilderAPI_MakeWire();
for(int k=0; k<K_MAX ; k++)
{
TopoDS_Edge aEdge=(TopoDS_Edge) int2edges.get(new IntEdge(0, J_MAX, k, 0, J_MAX, k+1));
mw.add(aEdge);
} // end on 0,11,11
mw.add(eYpZp);
mw.add(e1);
mw.add((TopoDS_Edge) eYpZm.reversed());
bb.add(compound, createFace(mw.shape()));
BRepTools.write(compound, "/tmp/JINA-2006-6.brep");
}
}