1 package org.simantics.opencascade;
3 /*******************************************************************************
4 * Copyright (c) 2007, 2013- VTT Technical Research Centre of Finland.
5 * All rights reserved. This program and the accompanying materials
6 * are made available under the terms of the Eclipse Public License v1.0
7 * which accompanies this distribution, and is available at
8 * http://www.eclipse.org/legal/epl-v10.html
11 * VTT Technical Research Centre of Finland - initial API and implementation
12 *******************************************************************************/
14 import javax.vecmath.Vector2d;
16 import org.jcae.opencascade.jni.BRepBuilderAPI_MakeEdge;
17 import org.jcae.opencascade.jni.BRepBuilderAPI_MakeFace;
18 import org.jcae.opencascade.jni.BRepBuilderAPI_MakeWire;
19 import org.jcae.opencascade.jni.BRepBuilderAPI_Transform;
20 import org.jcae.opencascade.jni.BRepFilletAPI_MakeChamfer;
21 import org.jcae.opencascade.jni.BRepFilletAPI_MakeFillet;
22 import org.jcae.opencascade.jni.BRepPrimAPI_MakePrism;
23 import org.jcae.opencascade.jni.BRepPrimAPI_MakeTorus;
24 import org.jcae.opencascade.jni.BRep_Builder;
25 import org.jcae.opencascade.jni.GP_Elips;
26 import org.jcae.opencascade.jni.GP_Trsf;
27 import org.jcae.opencascade.jni.TopAbs_ShapeEnum;
28 import org.jcae.opencascade.jni.TopExp_Explorer;
29 import org.jcae.opencascade.jni.TopoDS_Edge;
30 import org.jcae.opencascade.jni.TopoDS_Face;
31 import org.jcae.opencascade.jni.TopoDS_Shape;
32 import org.jcae.opencascade.jni.TopoDS_Wire;
35 public class OccTriangulator {
38 public static final double MIN_VALUE = 0.001;
40 public OccTriangulator() {
45 public static TopoDS_Shape getShapeFromFile(String filename) {
46 assert (filename != null);
47 String lowerFileName = filename.toLowerCase();
48 if (lowerFileName.endsWith(".stp") || lowerFileName.endsWith(".step")) {
49 TopoDS_Shape shape = importSTEP(filename);
51 } else if (lowerFileName.endsWith(".iges")) {
52 TopoDS_Shape shape = importIGES(filename);
54 } else if (lowerFileName.endsWith(".brep")) {
55 TopoDS_Shape shape = importBREP(filename);
58 throw new UnsupportedOperationException("Unsupported format " + filename);
62 public static TopoDS_Shape importBREP(String filename) {
63 return importBREP(filename,1.0); // convert to meters.
65 public static TopoDS_Shape importBREP(String filename, double scale) {
66 org.jcae.opencascade.jni.BRep_Builder aBuilder = new org.jcae.opencascade.jni.BRep_Builder();
67 org.jcae.opencascade.jni.TopoDS_Shape myShape = org.jcae.opencascade.jni.BRepTools.read(filename, aBuilder);
69 if (Math.abs(scale-1.0) < 0.001)
71 TopoDS_Shape scaled = makeScale(myShape, scale);
76 public static TopoDS_Shape importIGES(String filename) {
77 org.jcae.opencascade.jni.IGESControl_Reader aReader = new org.jcae.opencascade.jni.IGESControl_Reader();
78 aReader.setReadUnitM();
79 aReader.readFile(filename.getBytes());
80 aReader.clearShapes();
81 aReader.transferRoots();
82 TopoDS_Shape result = aReader.oneShape();
87 public static TopoDS_Shape importSTEP(String filename) {
88 org.jcae.opencascade.jni.STEPControl_Reader aReader = new org.jcae.opencascade.jni.STEPControl_Reader();
89 aReader.setReadUnitM();
90 aReader.readFile(filename.getBytes());
91 aReader.clearShapes();
92 aReader.transferRoots();
93 TopoDS_Shape result = aReader.oneShape();
100 public static TopoDS_Shape makeTranslation(TopoDS_Shape aShape, double x, double y, double z) {
101 GP_Trsf theTransformation = new GP_Trsf();
102 theTransformation.setTranslation(new double[] { x, y, z });
103 BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);
105 TopoDS_Shape shape = bt.shape();
107 theTransformation.delete();
111 public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2) {
112 double[] axe = new double[6];
113 System.arraycopy(pointStruct, 0, axe, 0, 3);
114 System.arraycopy(dirStruct, 0, axe, 3, 3);
115 BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2);
116 org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape();
122 public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double[] dirStruct2, double r1, double r2) {
123 double[] axe = new double[9];
124 System.arraycopy(pointStruct, 0, axe, 0, 3);
125 System.arraycopy(dirStruct, 0, axe, 3, 3);
126 System.arraycopy(dirStruct2, 0, axe, 6, 3);
127 BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2);
128 org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape();
133 public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2, double angle1, double angle2, double angle) {
134 double[] axe = new double[6];
135 System.arraycopy(pointStruct, 0, axe, 0, 3);
136 System.arraycopy(dirStruct, 0, axe, 3, 3);
137 BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2,angle1,angle2,angle);
138 org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape();
143 public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double[] dirStruct2, double r1, double r2, double angle1, double angle2, double angle) {
144 double[] axe = new double[9];
145 System.arraycopy(pointStruct, 0, axe, 0, 3);
146 System.arraycopy(dirStruct, 0, axe, 3, 3);
147 System.arraycopy(dirStruct2, 0, axe, 6, 3);
148 BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2,angle1,angle2,angle);
149 org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape();
154 public static TopoDS_Shape makeSphere(double x, double y, double z, double radius) {
155 double[] c = new double[] { x, y, z };
156 org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere sphere = new org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere(c, radius);
157 org.jcae.opencascade.jni.TopoDS_Shape tds = sphere.shape();
163 public static TopoDS_Shape makeRotation(TopoDS_Shape aShape, double[] axisStruct, double angle) {
165 GP_Trsf theTransformation = new GP_Trsf();
166 theTransformation.setRotation(axisStruct, angle);
167 BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);
168 TopoDS_Shape shape = bt.shape();
170 theTransformation.delete();
174 public static TopoDS_Shape makeScale(TopoDS_Shape aShape, double s) {
176 GP_Trsf theTransformation = new GP_Trsf();
177 theTransformation.setValues(s, 0, 0, 0,
180 BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);
181 TopoDS_Shape shape = bt.shape();
183 theTransformation.delete();
188 public static TopoDS_Shape makeCylinder(double[] pointStruct, double[] dirStruct, double radius, double height) {
189 double[] axe = new double[6];
190 System.arraycopy(pointStruct, 0, axe, 0, 3);
191 System.arraycopy(dirStruct, 0, axe, 3, 3);
192 org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder cyl = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder(axe, radius, height, 2 * Math.PI);
193 org.jcae.opencascade.jni.TopoDS_Shape tds = cyl.shape();
198 public static TopoDS_Shape makeCopy(TopoDS_Shape topoDS_Shape) {
199 throw new UnsupportedOperationException();
202 public static TopoDS_Shape makeCone(double[] pointStruct, double[] dirStruct, double radius1, double radius2, double height) {
203 double[] axe = new double[6];
204 System.arraycopy(pointStruct, 0, axe, 0, 3);
205 System.arraycopy(dirStruct, 0, axe, 3, 3);
206 org.jcae.opencascade.jni.BRepPrimAPI_MakeCone cone = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCone(axe, radius1, radius2, height, 2 * Math.PI);
207 org.jcae.opencascade.jni.TopoDS_Shape tds = cone.shape();
212 public static TopoDS_Shape makeCompound(TopoDS_Shape[] shapes) {
213 BRep_Builder builder = new BRep_Builder();
214 org.jcae.opencascade.jni.TopoDS_Compound comp = new org.jcae.opencascade.jni.TopoDS_Compound();
215 builder.makeCompound(comp);
216 for (int i = 0; i < shapes.length; i++) {
218 builder.add(comp, shapes[i]);
225 public static TopoDS_Shape makeBox(double x1, double y1, double z1, double x2, double y2, double z2) {
226 double[] p1 = new double[] { x1, y1, z1 };
227 double[] p2 = new double[] { x2, y2, z2 };
228 org.jcae.opencascade.jni.BRepPrimAPI_MakeBox box = new org.jcae.opencascade.jni.BRepPrimAPI_MakeBox(p1, p2);
229 org.jcae.opencascade.jni.TopoDS_Shape tds = box.shape();
234 public static TopoDS_Shape makeCut(TopoDS_Shape shape1, TopoDS_Shape shape2) {
235 org.jcae.opencascade.jni.BRepAlgoAPI_Cut cut = new org.jcae.opencascade.jni.BRepAlgoAPI_Cut(shape1, shape2);
236 org.jcae.opencascade.jni.TopoDS_Shape s = cut.shape();
241 public static TopoDS_Shape makeCommon(TopoDS_Shape shape1, TopoDS_Shape shape2) {
242 org.jcae.opencascade.jni.BRepAlgoAPI_Common common = new org.jcae.opencascade.jni.BRepAlgoAPI_Common(shape1, shape2);
243 org.jcae.opencascade.jni.TopoDS_Shape s = common.shape();
248 public static TopoDS_Shape makeFuse(TopoDS_Shape shape1, TopoDS_Shape shape2) {
249 org.jcae.opencascade.jni.BRepAlgoAPI_Fuse fuse = new org.jcae.opencascade.jni.BRepAlgoAPI_Fuse(shape1, shape2);
250 org.jcae.opencascade.jni.TopoDS_Shape s = fuse.shape();
256 public static TopoDS_Shape makeWedge(double[] pointStruct, double[] dirStruct,double dx, double dy, double dz, double xmin, double zmin, double xmax, double zmax) {
257 double[] axe = new double[6];
258 System.arraycopy(pointStruct, 0, axe, 0, 3);
259 System.arraycopy(dirStruct, 0, axe, 3, 3);
261 org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge wedge = new org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge(axe, dx, dy, dz, xmin, zmin, xmax, zmax);
262 org.jcae.opencascade.jni.TopoDS_Shape s = wedge.shape();
267 public static TopoDS_Shape makeEllipticCylinder(double h, double r1, double r2) {
270 // FIXME : ellipse should be rotated, but current JNI won't allow it since Ax2 is not separate object
271 ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r2,r1);
273 ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r1,r2);
275 BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(ellipse);
276 TopoDS_Edge ed = (TopoDS_Edge) edge.shape();
277 BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire(ed);
278 TopoDS_Wire w = (TopoDS_Wire) wire.shape();
279 BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w);
280 TopoDS_Face F = (TopoDS_Face) face.shape();
281 BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 });
282 TopoDS_Shape shape = prism.shape();
294 public static TopoDS_Shape makeReqularPrism(double h, double r, int n) {
297 Vector2d vertices[] = new Vector2d[n];
298 for (int i = 0; i < n; i++) {
299 vertices[i] = new Vector2d(Math.sin(Math.PI * 2.0 * i / n)*r,Math.cos(Math.PI * 2.0 * i / n)*r);
301 BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire();
302 for (int i = 0; i < n; i++) {
303 Vector2d v1 = vertices[i];
304 Vector2d v2 = vertices[(i+1)%n];
305 BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(new double[]{v1.x,-h*0.5,v1.y},new double[]{v2.x,-h*0.5,v2.y});
306 wire.add((TopoDS_Edge)edge.shape());
309 TopoDS_Wire w = (TopoDS_Wire)wire.shape();
311 BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w);
312 TopoDS_Face F = (TopoDS_Face) face.shape();
315 BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 });
316 TopoDS_Shape shape = prism.shape();
325 public static TopoDS_Shape makeFillet(TopoDS_Shape shape, double r) {
326 BRepFilletAPI_MakeFillet fillet = new BRepFilletAPI_MakeFillet(shape);
328 TopExp_Explorer exp = new TopExp_Explorer(shape, TopAbs_ShapeEnum.EDGE);
330 TopoDS_Edge e = (TopoDS_Edge) exp.current();
335 TopoDS_Shape result = fillet.shape();
343 public static TopoDS_Shape makeChamfer(TopoDS_Shape shape, double d) {
344 BRepFilletAPI_MakeChamfer fillet = new BRepFilletAPI_MakeChamfer(shape);
346 TopExp_Explorer exp = new TopExp_Explorer(shape, TopAbs_ShapeEnum.FACE);
348 TopoDS_Face f = (TopoDS_Face) exp.current();
349 TopExp_Explorer exp2 = new TopExp_Explorer(f, TopAbs_ShapeEnum.EDGE);
350 while (exp2.more()) {
351 TopoDS_Edge e = (TopoDS_Edge) exp2.current();
360 TopoDS_Shape result = fillet.shape();
369 public static void exportBREP(TopoDS_Shape shape, String filename) {
370 org.jcae.opencascade.jni.BRepTools.write(shape, filename);