--- /dev/null
+package org.simantics.opencascade;\r
+\r
+/*******************************************************************************\r
+ * Copyright (c) 2007- VTT Technical Research Centre of Finland.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+\r
+import javax.vecmath.Vector2d;\r
+\r
+import org.jcae.opencascade.jni.BRepBuilderAPI_MakeEdge;\r
+import org.jcae.opencascade.jni.BRepBuilderAPI_MakeFace;\r
+import org.jcae.opencascade.jni.BRepBuilderAPI_MakeWire;\r
+import org.jcae.opencascade.jni.BRepBuilderAPI_Transform;\r
+import org.jcae.opencascade.jni.BRepPrimAPI_MakePrism;\r
+import org.jcae.opencascade.jni.BRepPrimAPI_MakeTorus;\r
+import org.jcae.opencascade.jni.BRep_Builder;\r
+import org.jcae.opencascade.jni.GP_Elips;\r
+import org.jcae.opencascade.jni.GP_Trsf;\r
+import org.jcae.opencascade.jni.TopoDS_Edge;\r
+import org.jcae.opencascade.jni.TopoDS_Face;\r
+import org.jcae.opencascade.jni.TopoDS_Shape;\r
+import org.jcae.opencascade.jni.TopoDS_Wire;\r
+\r
+\r
+public class OccTriangulator {\r
+\r
+ \r
+ public static final double MIN_VALUE = 0.001;\r
+ \r
+ public OccTriangulator() {\r
+ \r
+ }\r
+\r
+\r
+ public static TopoDS_Shape getShapeFromFile(String filename) {\r
+ assert (filename != null);\r
+ String lowerFileName = filename.toLowerCase(); \r
+ if (lowerFileName.endsWith(".stp") || lowerFileName.endsWith(".step")) {\r
+ TopoDS_Shape shape = importSTEP(filename);\r
+ return shape;\r
+ } else if (lowerFileName.endsWith(".iges")) {\r
+ TopoDS_Shape shape = importIGES(filename);\r
+ return shape;\r
+ } else if (lowerFileName.endsWith(".brep")) {\r
+ TopoDS_Shape shape = importBREP(filename);\r
+ return shape;\r
+ } else {\r
+ throw new UnsupportedOperationException("Unsupported format " + filename);\r
+ }\r
+ }\r
+\r
+ public static TopoDS_Shape importBREP(String filename) {\r
+ return importBREP(filename,1.0); // convert to meters.\r
+ }\r
+ public static TopoDS_Shape importBREP(String filename, double scale) {\r
+ org.jcae.opencascade.jni.BRep_Builder aBuilder = new org.jcae.opencascade.jni.BRep_Builder();\r
+ org.jcae.opencascade.jni.TopoDS_Shape myShape = org.jcae.opencascade.jni.BRepTools.read(filename, aBuilder);\r
+ aBuilder.delete();\r
+ if (Math.abs(scale-1.0) < 0.001)\r
+ return myShape;\r
+ TopoDS_Shape scaled = makeScale(myShape, scale);\r
+ myShape.delete();\r
+ return scaled;\r
+ }\r
+\r
+ public static TopoDS_Shape importIGES(String filename) {\r
+ org.jcae.opencascade.jni.IGESControl_Reader aReader = new org.jcae.opencascade.jni.IGESControl_Reader();\r
+ aReader.setReadUnitM();\r
+ aReader.readFile(filename.getBytes());\r
+ aReader.clearShapes();\r
+ aReader.transferRoots();\r
+ TopoDS_Shape result = aReader.oneShape();\r
+ aReader.delete();\r
+ return result;\r
+ }\r
+ \r
+ public static TopoDS_Shape importSTEP(String filename) {\r
+ org.jcae.opencascade.jni.STEPControl_Reader aReader = new org.jcae.opencascade.jni.STEPControl_Reader();\r
+ aReader.setReadUnitM();\r
+ aReader.readFile(filename.getBytes());\r
+ aReader.clearShapes();\r
+ aReader.transferRoots();\r
+ TopoDS_Shape result = aReader.oneShape();\r
+ aReader.delete();\r
+ return result;\r
+ }\r
+\r
+\r
+\r
+ public static TopoDS_Shape makeTranslation(TopoDS_Shape aShape, double x, double y, double z) {\r
+ GP_Trsf theTransformation = new GP_Trsf();\r
+ theTransformation.setTranslation(new double[] { x, y, z });\r
+ BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);\r
+\r
+ TopoDS_Shape shape = bt.shape();\r
+ bt.delete();\r
+ theTransformation.delete();\r
+ return shape;\r
+ }\r
+\r
+ public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2) {\r
+ double[] axe = new double[6];\r
+ System.arraycopy(pointStruct, 0, axe, 0, 3);\r
+ System.arraycopy(dirStruct, 0, axe, 3, 3);\r
+ BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2);\r
+ org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape();\r
+ torus.delete();\r
+ return tds;\r
+ }\r
+ \r
+ public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2, double angle1, double angle2, double angle) {\r
+ double[] axe = new double[6];\r
+ System.arraycopy(pointStruct, 0, axe, 0, 3);\r
+ System.arraycopy(dirStruct, 0, axe, 3, 3);\r
+ BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2,angle1,angle2,angle);\r
+ org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape();\r
+ torus.delete();\r
+ return tds;\r
+ }\r
+\r
+ public static TopoDS_Shape makeSphere(double x, double y, double z, double radius) {\r
+ double[] c = new double[] { x, y, z };\r
+ org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere sphere = new org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere(c, radius);\r
+ org.jcae.opencascade.jni.TopoDS_Shape tds = sphere.shape();\r
+ sphere.delete();\r
+ return tds;\r
+ }\r
+\r
+\r
+ public static TopoDS_Shape makeRotation(TopoDS_Shape aShape, double[] axisStruct, double angle) {\r
+\r
+ GP_Trsf theTransformation = new GP_Trsf();\r
+ theTransformation.setRotation(axisStruct, angle);\r
+ BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);\r
+ TopoDS_Shape shape = bt.shape();\r
+ bt.delete();\r
+ theTransformation.delete();\r
+ return shape;\r
+ }\r
+\r
+ public static TopoDS_Shape makeScale(TopoDS_Shape aShape, double s) {\r
+\r
+ GP_Trsf theTransformation = new GP_Trsf();\r
+ theTransformation.setValues(s, 0, 0, 0,\r
+ 0, s, 0, 0, \r
+ 0, 0, s, 0, 1, 1);\r
+ BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);\r
+ TopoDS_Shape shape = bt.shape();\r
+ bt.delete();\r
+ theTransformation.delete();\r
+ return shape;\r
+ }\r
+\r
+\r
+ public static TopoDS_Shape makeCylinder(double[] pointStruct, double[] dirStruct, double radius, double height) {\r
+ double[] axe = new double[6];\r
+ System.arraycopy(pointStruct, 0, axe, 0, 3);\r
+ System.arraycopy(dirStruct, 0, axe, 3, 3);\r
+ org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder cyl = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder(axe, radius, height, 2 * Math.PI);\r
+ org.jcae.opencascade.jni.TopoDS_Shape tds = cyl.shape();\r
+ cyl.delete();\r
+ return tds;\r
+ }\r
+\r
+ public static TopoDS_Shape makeCopy(TopoDS_Shape topoDS_Shape) {\r
+ throw new UnsupportedOperationException();\r
+ }\r
+\r
+ public static TopoDS_Shape makeCone(double[] pointStruct, double[] dirStruct, double radius1, double radius2, double height) {\r
+ double[] axe = new double[6];\r
+ System.arraycopy(pointStruct, 0, axe, 0, 3);\r
+ System.arraycopy(dirStruct, 0, axe, 3, 3);\r
+ org.jcae.opencascade.jni.BRepPrimAPI_MakeCone cone = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCone(axe, radius1, radius2, height, 2 * Math.PI);\r
+ org.jcae.opencascade.jni.TopoDS_Shape tds = cone.shape();\r
+ cone.delete();\r
+ return tds;\r
+ }\r
+\r
+ public static TopoDS_Shape makeCompound(TopoDS_Shape[] shapes) {\r
+ BRep_Builder builder = new BRep_Builder();\r
+ org.jcae.opencascade.jni.TopoDS_Compound comp = new org.jcae.opencascade.jni.TopoDS_Compound();\r
+ builder.makeCompound(comp);\r
+ for (int i = 0; i < shapes.length; i++) {\r
+\r
+ builder.add(comp, shapes[i]);\r
+ }\r
+ builder.delete();\r
+ return comp;\r
+ }\r
+\r
+\r
+ public static TopoDS_Shape makeBox(double x1, double y1, double z1, double x2, double y2, double z2) {\r
+ double[] p1 = new double[] { x1, y1, z1 };\r
+ double[] p2 = new double[] { x2, y2, z2 };\r
+ org.jcae.opencascade.jni.BRepPrimAPI_MakeBox box = new org.jcae.opencascade.jni.BRepPrimAPI_MakeBox(p1, p2); \r
+ org.jcae.opencascade.jni.TopoDS_Shape tds = box.shape();\r
+ box.delete();\r
+ return tds;\r
+ }\r
+\r
+ public static TopoDS_Shape makeCut(TopoDS_Shape shape1, TopoDS_Shape shape2) {\r
+ org.jcae.opencascade.jni.BRepAlgoAPI_Cut cut = new org.jcae.opencascade.jni.BRepAlgoAPI_Cut(shape1, shape2);\r
+ org.jcae.opencascade.jni.TopoDS_Shape s = cut.shape();\r
+ cut.delete();\r
+ return s;\r
+ }\r
+ \r
+ public static TopoDS_Shape makeCommon(TopoDS_Shape shape1, TopoDS_Shape shape2) {\r
+ org.jcae.opencascade.jni.BRepAlgoAPI_Common common = new org.jcae.opencascade.jni.BRepAlgoAPI_Common(shape1, shape2); \r
+ org.jcae.opencascade.jni.TopoDS_Shape s = common.shape();\r
+ common.delete();\r
+ return s;\r
+ }\r
+ \r
+ public static TopoDS_Shape makeFuse(TopoDS_Shape shape1, TopoDS_Shape shape2) {\r
+ org.jcae.opencascade.jni.BRepAlgoAPI_Fuse fuse = new org.jcae.opencascade.jni.BRepAlgoAPI_Fuse(shape1, shape2);\r
+ org.jcae.opencascade.jni.TopoDS_Shape s = fuse.shape();\r
+ fuse.delete();\r
+ return s;\r
+ }\r
+\r
+ \r
+ public static TopoDS_Shape makeWedge(double[] pointStruct, double[] dirStruct,double dx, double dy, double dz, double xmin, double zmin, double xmax, double zmax) {\r
+ double[] axe = new double[6];\r
+ System.arraycopy(pointStruct, 0, axe, 0, 3);\r
+ System.arraycopy(dirStruct, 0, axe, 3, 3);\r
+ \r
+ org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge wedge = new org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge(axe, dx, dy, dz, xmin, zmin, xmax, zmax); \r
+ org.jcae.opencascade.jni.TopoDS_Shape s = wedge.shape();\r
+ wedge.delete();\r
+ return s;\r
+ }\r
+ \r
+ public static TopoDS_Shape makeEllipticCylinder(double h, double r1, double r2) {\r
+ GP_Elips ellipse;\r
+ if (r1 < r2) {\r
+ // FIXME : ellipse should be rotated, but current JNI won't allow it since Ax2 is not separate object\r
+ ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r2,r1);\r
+ } else {\r
+ ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r1,r2);\r
+ }\r
+ BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(ellipse);\r
+ TopoDS_Edge ed = (TopoDS_Edge) edge.shape();\r
+ BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire(ed);\r
+ TopoDS_Wire w = (TopoDS_Wire) wire.shape();\r
+ BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w); \r
+ TopoDS_Face F = (TopoDS_Face) face.shape();\r
+ BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 }); \r
+ TopoDS_Shape shape = prism.shape();\r
+ ellipse.delete();\r
+ edge.delete();\r
+ wire.delete();\r
+ face.delete();\r
+ ed.delete();\r
+ w.delete();\r
+ F.delete();\r
+ prism.delete();\r
+ return shape;\r
+ }\r
+\r
+ public static TopoDS_Shape makeReqularPrism(double h, double r, int n) {\r
+ if (n < 3)\r
+ n = 3;\r
+ Vector2d vertices[] = new Vector2d[n];\r
+ for (int i = 0; i < n; i++) {\r
+ vertices[i] = new Vector2d(Math.sin(Math.PI * 2.0 * i / n)*r,Math.cos(Math.PI * 2.0 * i / n)*r);\r
+ }\r
+ BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire();\r
+ for (int i = 0; i < n; i++) {\r
+ Vector2d v1 = vertices[i];\r
+ Vector2d v2 = vertices[(i+1)%n];\r
+ BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(new double[]{v1.x,-h*0.5,v1.y},new double[]{v2.x,-h*0.5,v2.y}); \r
+ wire.add((TopoDS_Edge)edge.shape());\r
+ edge.delete();\r
+ }\r
+ TopoDS_Wire w = (TopoDS_Wire)wire.shape();\r
+ \r
+ BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w);\r
+ TopoDS_Face F = (TopoDS_Face) face.shape();\r
+ face.delete();\r
+ \r
+ BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 }); \r
+ TopoDS_Shape shape = prism.shape(); \r
+ prism.delete();\r
+ \r
+ wire.delete();\r
+ w.delete();\r
+ F.delete();\r
+ return shape;\r
+ }\r
+ \r
+\r
+ public static void exportBREP(TopoDS_Shape shape, String filename) {\r
+ org.jcae.opencascade.jni.BRepTools.write(shape, filename);\r
+ }\r
+ \r
+}\r