package org.jcae.opencascade.jni; import static org.junit.Assert.*; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; // Packages for 3D display /*import java.awt.Container; import java.awt.GridLayout; import java.awt.Window; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.media.j3d.Transform3D; import javax.swing.JFrame; import javax.swing.WindowConstants; import javax.vecmath.Matrix4d; import org.jcae.viewer3d.PositionListener; import org.jcae.viewer3d.View; import org.jcae.viewer3d.ViewBehavior; import org.jcae.viewer3d.cad.ViewableCAD; import org.jcae.viewer3d.cad.occ.OCCProvider;*/ /** * A dirty static class to show what are holes, chamfer and fillet * @author Jerome Robert */ public class HoleFilletChamfer { /** Return the list of face owning the given edge */ private static TopoDS_Face[] getFace(TopoDS_Shape shape, TopoDS_Edge edge) { ArrayList toReturn=new ArrayList(); TopExp_Explorer exp=new TopExp_Explorer(shape, TopAbs_ShapeEnum.FACE); while(exp.more()) { TopoDS_Face face=(TopoDS_Face) exp.current(); HashSet edges = new HashSet(Arrays.asList(getEdges(face))); if(edges.contains(edge)) toReturn.add(face); exp.next(); } return (TopoDS_Face[]) toReturn.toArray(new TopoDS_Face[toReturn.size()]); } private static TopoDS_Edge[] getEdges(TopoDS_Shape face) { HashSet toReturn=new HashSet(); TopExp_Explorer exp=new TopExp_Explorer(face, TopAbs_ShapeEnum.EDGE); while(exp.more()) { toReturn.add(exp.current()); exp.next(); } return (TopoDS_Edge[]) toReturn.toArray(new TopoDS_Edge[toReturn.size()]); } private static TopoDS_Shape createCuttedBox() { TopoDS_Shape box1 = new BRepPrimAPI_MakeBox( new double[3], new double[]{4, 3, 2}).shape(); TopoDS_Shape box2 = new BRepPrimAPI_MakeBox( new double[]{-1,-1,-1}, new double[]{3, 2, 1}).shape(); return new BRepAlgoAPI_Cut(box1, box2).shape(); } private static TopoDS_Shape createVerticalCylinder(double radius, double x, double y, double height) { BRepPrimAPI_MakeCylinder cyl1=new BRepPrimAPI_MakeCylinder( new double[]{x,y,2,0,0,-1}, radius, height, Math.PI*2); return cyl1.shape(); } private static TopoDS_Shape makeHole(TopoDS_Shape shape) { TopoDS_Shape h1 = createVerticalCylinder(0.05, 0.4, 0.5, 2); TopoDS_Shape h2 = createVerticalCylinder(0.1, 0.7, 0.5, 0.5); TopoDS_Shape h3 = createVerticalCylinder(0.07, 3.5, 0.5, 1.9); TopoDS_Shape toReturn = new BRepAlgoAPI_Cut(shape, h1).shape(); toReturn = new BRepAlgoAPI_Cut(toReturn, h2).shape(); toReturn = new BRepAlgoAPI_Cut(toReturn, h3).shape(); return toReturn; } @Test public void sample() { TopoDS_Shape cuttedBox=createCuttedBox(); BRepFilletAPI_MakeFillet fillet = new BRepFilletAPI_MakeFillet(cuttedBox); TopoDS_Edge[] edges = getEdges(cuttedBox); for(int i=0; i<edges.length; i++) { fillet.add(0.1, edges[i]); } BRepFilletAPI_MakeChamfer chamfer = new BRepFilletAPI_MakeChamfer(cuttedBox); for(int i=0; i<edges.length; i++) { chamfer.add(0.1, edges[i], getFace(cuttedBox, edges[i])[0]); } TopoDS_Shape holled=makeHole(cuttedBox); //displayAll(cuttedBox, fillet.shape(), chamfer.shape(), holled); //try the new Opencascade 6.2 tool to remove the hole ShapeUpgrade_RemoveInternalWires sr=new ShapeUpgrade_RemoveInternalWires(holled); sr.setMinArea(1); sr.setRemoveFaceMode(true); sr.perform(); BRepTools.write(sr.getResult(), "/tmp/toto.brep"); } // 3D display /*private static View view1, view2, view3, view4; private static View createView(TopoDS_Shape shape, Window w) { final View cadView=new View(w); ViewableCAD fcad=new ViewableCAD(new OCCProvider(shape)); cadView.add(fcad); cadView.fitAll(); cadView.addPositionListener(new PositionListener(){ public void positionChanged() { System.out.println(cadView.where()); view1.move(cadView.where()); view2.move(cadView.where()); view3.move(cadView.where()); view4.move(cadView.where()); }}); return cadView; } private static void displayAll(TopoDS_Shape s1, TopoDS_Shape s2, TopoDS_Shape s3, TopoDS_Shape s4) { JFrame cadFrame=new JFrame(); cadFrame.setSize(800,600); cadFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); Container p = cadFrame.getContentPane(); p.setLayout(new GridLayout(2,2)); view1=createView(s1, cadFrame); view2=createView(s2, cadFrame); view3=createView(s3, cadFrame); view4=createView(s4, cadFrame); p.add(view1); p.add(view2); p.add(view3); p.add(view4); //view4.setMouseMode(ViewBehavior.CLIP_RECTANGLE_MODE); view4.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if(e.getKeyCode()!=KeyEvent.VK_SPACE) return; view4.setMouseMode(ViewBehavior.DEFAULT_MODE); Transform3D t3d=new Transform3D(); t3d.set(new Matrix4d(0.807441418753272, -0.12841821107377785, -0.5758012837310318, -9.570716029950235, -0.5857562663771008, -0.2906520518814561, -0.7565784699137629, -13.674618670515233, -0.07019937094913933, 0.948172003278784, -0.30990627698811507, -5.144127106635848, 0.0, 0.0, 0.0, 1.0)); view1.move(t3d); view2.move(t3d); view3.move(t3d); view4.move(t3d); } }); cadFrame.setVisible(true); }*/ }