1 package org.simantics.opencascade;
\r
3 /*******************************************************************************
\r
4 * Copyright (c) 2007- VTT Technical Research Centre of Finland.
\r
5 * All rights reserved. This program and the accompanying materials
\r
6 * are made available under the terms of the Eclipse Public License v1.0
\r
7 * which accompanies this distribution, and is available at
\r
8 * http://www.eclipse.org/legal/epl-v10.html
\r
11 * VTT Technical Research Centre of Finland - initial API and implementation
\r
12 *******************************************************************************/
\r
14 import javax.vecmath.Vector2d;
\r
16 import org.jcae.opencascade.jni.BRepBuilderAPI_MakeEdge;
\r
17 import org.jcae.opencascade.jni.BRepBuilderAPI_MakeFace;
\r
18 import org.jcae.opencascade.jni.BRepBuilderAPI_MakeWire;
\r
19 import org.jcae.opencascade.jni.BRepBuilderAPI_Transform;
\r
20 import org.jcae.opencascade.jni.BRepPrimAPI_MakePrism;
\r
21 import org.jcae.opencascade.jni.BRepPrimAPI_MakeTorus;
\r
22 import org.jcae.opencascade.jni.BRep_Builder;
\r
23 import org.jcae.opencascade.jni.GP_Elips;
\r
24 import org.jcae.opencascade.jni.GP_Trsf;
\r
25 import org.jcae.opencascade.jni.TopoDS_Edge;
\r
26 import org.jcae.opencascade.jni.TopoDS_Face;
\r
27 import org.jcae.opencascade.jni.TopoDS_Shape;
\r
28 import org.jcae.opencascade.jni.TopoDS_Wire;
\r
31 public class OccTriangulator {
\r
34 public static final double MIN_VALUE = 0.001;
\r
36 public OccTriangulator() {
\r
41 public static TopoDS_Shape getShapeFromFile(String filename) {
\r
42 assert (filename != null);
\r
43 String lowerFileName = filename.toLowerCase();
\r
44 if (lowerFileName.endsWith(".stp") || lowerFileName.endsWith(".step")) {
\r
45 TopoDS_Shape shape = importSTEP(filename);
\r
47 } else if (lowerFileName.endsWith(".iges")) {
\r
48 TopoDS_Shape shape = importIGES(filename);
\r
50 } else if (lowerFileName.endsWith(".brep")) {
\r
51 TopoDS_Shape shape = importBREP(filename);
\r
54 throw new UnsupportedOperationException("Unsupported format " + filename);
\r
58 public static TopoDS_Shape importBREP(String filename) {
\r
59 return importBREP(filename,1.0); // convert to meters.
\r
61 public static TopoDS_Shape importBREP(String filename, double scale) {
\r
62 org.jcae.opencascade.jni.BRep_Builder aBuilder = new org.jcae.opencascade.jni.BRep_Builder();
\r
63 org.jcae.opencascade.jni.TopoDS_Shape myShape = org.jcae.opencascade.jni.BRepTools.read(filename, aBuilder);
\r
65 if (Math.abs(scale-1.0) < 0.001)
\r
67 TopoDS_Shape scaled = makeScale(myShape, scale);
\r
72 public static TopoDS_Shape importIGES(String filename) {
\r
73 org.jcae.opencascade.jni.IGESControl_Reader aReader = new org.jcae.opencascade.jni.IGESControl_Reader();
\r
74 aReader.setReadUnitM();
\r
75 aReader.readFile(filename.getBytes());
\r
76 aReader.clearShapes();
\r
77 aReader.transferRoots();
\r
78 TopoDS_Shape result = aReader.oneShape();
\r
83 public static TopoDS_Shape importSTEP(String filename) {
\r
84 org.jcae.opencascade.jni.STEPControl_Reader aReader = new org.jcae.opencascade.jni.STEPControl_Reader();
\r
85 aReader.setReadUnitM();
\r
86 aReader.readFile(filename.getBytes());
\r
87 aReader.clearShapes();
\r
88 aReader.transferRoots();
\r
89 TopoDS_Shape result = aReader.oneShape();
\r
96 public static TopoDS_Shape makeTranslation(TopoDS_Shape aShape, double x, double y, double z) {
\r
97 GP_Trsf theTransformation = new GP_Trsf();
\r
98 theTransformation.setTranslation(new double[] { x, y, z });
\r
99 BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);
\r
101 TopoDS_Shape shape = bt.shape();
\r
103 theTransformation.delete();
\r
107 public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2) {
\r
108 double[] axe = new double[6];
\r
109 System.arraycopy(pointStruct, 0, axe, 0, 3);
\r
110 System.arraycopy(dirStruct, 0, axe, 3, 3);
\r
111 BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2);
\r
112 org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape();
\r
117 public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2, double angle1, double angle2, double angle) {
\r
118 double[] axe = new double[6];
\r
119 System.arraycopy(pointStruct, 0, axe, 0, 3);
\r
120 System.arraycopy(dirStruct, 0, axe, 3, 3);
\r
121 BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2,angle1,angle2,angle);
\r
122 org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape();
\r
127 public static TopoDS_Shape makeSphere(double x, double y, double z, double radius) {
\r
128 double[] c = new double[] { x, y, z };
\r
129 org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere sphere = new org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere(c, radius);
\r
130 org.jcae.opencascade.jni.TopoDS_Shape tds = sphere.shape();
\r
136 public static TopoDS_Shape makeRotation(TopoDS_Shape aShape, double[] axisStruct, double angle) {
\r
138 GP_Trsf theTransformation = new GP_Trsf();
\r
139 theTransformation.setRotation(axisStruct, angle);
\r
140 BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);
\r
141 TopoDS_Shape shape = bt.shape();
\r
143 theTransformation.delete();
\r
147 public static TopoDS_Shape makeScale(TopoDS_Shape aShape, double s) {
\r
149 GP_Trsf theTransformation = new GP_Trsf();
\r
150 theTransformation.setValues(s, 0, 0, 0,
\r
153 BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);
\r
154 TopoDS_Shape shape = bt.shape();
\r
156 theTransformation.delete();
\r
161 public static TopoDS_Shape makeCylinder(double[] pointStruct, double[] dirStruct, double radius, double height) {
\r
162 double[] axe = new double[6];
\r
163 System.arraycopy(pointStruct, 0, axe, 0, 3);
\r
164 System.arraycopy(dirStruct, 0, axe, 3, 3);
\r
165 org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder cyl = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder(axe, radius, height, 2 * Math.PI);
\r
166 org.jcae.opencascade.jni.TopoDS_Shape tds = cyl.shape();
\r
171 public static TopoDS_Shape makeCopy(TopoDS_Shape topoDS_Shape) {
\r
172 throw new UnsupportedOperationException();
\r
175 public static TopoDS_Shape makeCone(double[] pointStruct, double[] dirStruct, double radius1, double radius2, double height) {
\r
176 double[] axe = new double[6];
\r
177 System.arraycopy(pointStruct, 0, axe, 0, 3);
\r
178 System.arraycopy(dirStruct, 0, axe, 3, 3);
\r
179 org.jcae.opencascade.jni.BRepPrimAPI_MakeCone cone = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCone(axe, radius1, radius2, height, 2 * Math.PI);
\r
180 org.jcae.opencascade.jni.TopoDS_Shape tds = cone.shape();
\r
185 public static TopoDS_Shape makeCompound(TopoDS_Shape[] shapes) {
\r
186 BRep_Builder builder = new BRep_Builder();
\r
187 org.jcae.opencascade.jni.TopoDS_Compound comp = new org.jcae.opencascade.jni.TopoDS_Compound();
\r
188 builder.makeCompound(comp);
\r
189 for (int i = 0; i < shapes.length; i++) {
\r
191 builder.add(comp, shapes[i]);
\r
198 public static TopoDS_Shape makeBox(double x1, double y1, double z1, double x2, double y2, double z2) {
\r
199 double[] p1 = new double[] { x1, y1, z1 };
\r
200 double[] p2 = new double[] { x2, y2, z2 };
\r
201 org.jcae.opencascade.jni.BRepPrimAPI_MakeBox box = new org.jcae.opencascade.jni.BRepPrimAPI_MakeBox(p1, p2);
\r
202 org.jcae.opencascade.jni.TopoDS_Shape tds = box.shape();
\r
207 public static TopoDS_Shape makeCut(TopoDS_Shape shape1, TopoDS_Shape shape2) {
\r
208 org.jcae.opencascade.jni.BRepAlgoAPI_Cut cut = new org.jcae.opencascade.jni.BRepAlgoAPI_Cut(shape1, shape2);
\r
209 org.jcae.opencascade.jni.TopoDS_Shape s = cut.shape();
\r
214 public static TopoDS_Shape makeCommon(TopoDS_Shape shape1, TopoDS_Shape shape2) {
\r
215 org.jcae.opencascade.jni.BRepAlgoAPI_Common common = new org.jcae.opencascade.jni.BRepAlgoAPI_Common(shape1, shape2);
\r
216 org.jcae.opencascade.jni.TopoDS_Shape s = common.shape();
\r
221 public static TopoDS_Shape makeFuse(TopoDS_Shape shape1, TopoDS_Shape shape2) {
\r
222 org.jcae.opencascade.jni.BRepAlgoAPI_Fuse fuse = new org.jcae.opencascade.jni.BRepAlgoAPI_Fuse(shape1, shape2);
\r
223 org.jcae.opencascade.jni.TopoDS_Shape s = fuse.shape();
\r
229 public static TopoDS_Shape makeWedge(double[] pointStruct, double[] dirStruct,double dx, double dy, double dz, double xmin, double zmin, double xmax, double zmax) {
\r
230 double[] axe = new double[6];
\r
231 System.arraycopy(pointStruct, 0, axe, 0, 3);
\r
232 System.arraycopy(dirStruct, 0, axe, 3, 3);
\r
234 org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge wedge = new org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge(axe, dx, dy, dz, xmin, zmin, xmax, zmax);
\r
235 org.jcae.opencascade.jni.TopoDS_Shape s = wedge.shape();
\r
240 public static TopoDS_Shape makeEllipticCylinder(double h, double r1, double r2) {
\r
243 // FIXME : ellipse should be rotated, but current JNI won't allow it since Ax2 is not separate object
\r
244 ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r2,r1);
\r
246 ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r1,r2);
\r
248 BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(ellipse);
\r
249 TopoDS_Edge ed = (TopoDS_Edge) edge.shape();
\r
250 BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire(ed);
\r
251 TopoDS_Wire w = (TopoDS_Wire) wire.shape();
\r
252 BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w);
\r
253 TopoDS_Face F = (TopoDS_Face) face.shape();
\r
254 BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 });
\r
255 TopoDS_Shape shape = prism.shape();
\r
267 public static TopoDS_Shape makeReqularPrism(double h, double r, int n) {
\r
270 Vector2d vertices[] = new Vector2d[n];
\r
271 for (int i = 0; i < n; i++) {
\r
272 vertices[i] = new Vector2d(Math.sin(Math.PI * 2.0 * i / n)*r,Math.cos(Math.PI * 2.0 * i / n)*r);
\r
274 BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire();
\r
275 for (int i = 0; i < n; i++) {
\r
276 Vector2d v1 = vertices[i];
\r
277 Vector2d v2 = vertices[(i+1)%n];
\r
278 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
279 wire.add((TopoDS_Edge)edge.shape());
\r
282 TopoDS_Wire w = (TopoDS_Wire)wire.shape();
\r
284 BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w);
\r
285 TopoDS_Face F = (TopoDS_Face) face.shape();
\r
288 BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 });
\r
289 TopoDS_Shape shape = prism.shape();
\r
299 public static void exportBREP(TopoDS_Shape shape, String filename) {
\r
300 org.jcae.opencascade.jni.BRepTools.write(shape, filename);
\r