]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.opencascade/src/org/simantics/opencascade/OccTriangulator.java
White space clean-up
[simantics/3d.git] / org.simantics.opencascade / src / org / simantics / opencascade / OccTriangulator.java
1 package org.simantics.opencascade;
2
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
9  *
10  * Contributors:
11  *     VTT Technical Research Centre of Finland - initial API and implementation
12  *******************************************************************************/
13
14 import javax.vecmath.Vector2d;
15
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;
33
34
35 public class OccTriangulator {
36
37         
38         public static final double MIN_VALUE = 0.001;
39         
40         public OccTriangulator() {
41                 
42         }
43
44
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);
50                         return shape;
51                 } else if (lowerFileName.endsWith(".iges")) {
52                         TopoDS_Shape shape = importIGES(filename);
53                         return shape;
54                 } else if (lowerFileName.endsWith(".brep")) {
55                         TopoDS_Shape shape = importBREP(filename);
56                         return shape;
57                 } else {
58                         throw new UnsupportedOperationException("Unsupported format " + filename);
59                 }
60         }
61
62         public static TopoDS_Shape importBREP(String filename) {
63                         return importBREP(filename,1.0); // convert to meters.
64         }
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);
68                 aBuilder.delete();
69                 if (Math.abs(scale-1.0) < 0.001)
70                         return myShape;
71                 TopoDS_Shape scaled = makeScale(myShape, scale);
72                 myShape.delete();
73                 return scaled;
74         }
75
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();
83                 aReader.delete();
84                 return result;
85         }
86         
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();
94                 aReader.delete();
95                 return result;
96         }
97
98
99
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);
104
105                 TopoDS_Shape shape = bt.shape();
106                 bt.delete();
107                 theTransformation.delete();
108                 return shape;
109         }
110
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();
117                 torus.delete();
118                 return tds;
119         }
120         
121
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();
129                 torus.delete();
130                 return tds;
131         }
132         
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();
139                 torus.delete();
140                 return tds;
141         }
142         
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();
150                 torus.delete();
151                 return tds;
152         }
153
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();
158                 sphere.delete();
159                 return tds;
160         }
161
162
163         public static TopoDS_Shape makeRotation(TopoDS_Shape aShape, double[] axisStruct, double angle) {
164
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();
169                 bt.delete();
170                 theTransformation.delete();
171                 return shape;
172         }
173
174         public static TopoDS_Shape makeScale(TopoDS_Shape aShape, double s) {
175
176                 GP_Trsf theTransformation = new GP_Trsf();
177                 theTransformation.setValues(s, 0, 0, 0,
178                                                                         0, s, 0, 0, 
179                                                                         0, 0, s, 0);
180                 BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);
181                 TopoDS_Shape shape = bt.shape();
182                 bt.delete();
183                 theTransformation.delete();
184                 return shape;
185         }
186
187
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();
194                 cyl.delete();
195                 return tds;
196         }
197
198         public static TopoDS_Shape makeCopy(TopoDS_Shape topoDS_Shape) {
199                 throw new UnsupportedOperationException();
200         }
201
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();
208                 cone.delete();
209                 return tds;
210         }
211
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++) {
217
218                         builder.add(comp, shapes[i]);
219                 }
220                 builder.delete();
221                 return comp;
222         }
223
224
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();
230                 box.delete();
231                 return tds;
232         }
233
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();
237                 cut.delete();
238                 return s;
239         }
240         
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();
244                 common.delete();
245                 return s;
246         }
247         
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();
251                 fuse.delete();
252                 return s;
253         }
254
255         
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);
260                 
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();
263                 wedge.delete();
264                 return s;
265         }
266         
267         public static TopoDS_Shape makeEllipticCylinder(double h, double r1, double r2) {
268                 GP_Elips ellipse;
269                 if (r1 < 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);
272                 } else {
273                         ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r1,r2);
274                 }
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();
283                 ellipse.delete();
284                 edge.delete();
285                 wire.delete();
286                 face.delete();
287                 ed.delete();
288                 w.delete();
289                 F.delete();
290                 prism.delete();
291                 return shape;
292         }
293
294         public static TopoDS_Shape makeReqularPrism(double h, double r, int n) {
295                 if (n < 3)
296                         n = 3;
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);
300                 }
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());
307                         edge.delete();
308                 }
309                 TopoDS_Wire w = (TopoDS_Wire)wire.shape();
310                 
311                 BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w);
312                 TopoDS_Face F = (TopoDS_Face) face.shape();
313                 face.delete();
314                 
315                 BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 }); 
316                 TopoDS_Shape shape = prism.shape();     
317                 prism.delete();
318                 
319                 wire.delete();
320                 w.delete();
321                 F.delete();
322                 return shape;
323         }
324         
325         public static TopoDS_Shape makeFillet(TopoDS_Shape shape, double r) {
326                 BRepFilletAPI_MakeFillet fillet = new BRepFilletAPI_MakeFillet(shape);
327                 
328                 TopExp_Explorer exp = new TopExp_Explorer(shape, TopAbs_ShapeEnum.EDGE);
329                 while (exp.more()) {
330                         TopoDS_Edge e = (TopoDS_Edge) exp.current();
331                         fillet.add(r, e);
332                         e.delete();
333                         exp.next();
334                 }
335                 TopoDS_Shape result = fillet.shape();
336                 exp.delete();
337                 shape.delete();
338                 fillet.delete();
339                 return result;
340                 
341         }
342         
343         public static TopoDS_Shape makeChamfer(TopoDS_Shape shape, double d) {
344                 BRepFilletAPI_MakeChamfer fillet = new BRepFilletAPI_MakeChamfer(shape);
345                 
346                 TopExp_Explorer exp = new TopExp_Explorer(shape, TopAbs_ShapeEnum.FACE);
347                 while (exp.more()) {
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();
352                                 fillet.add(d, e, f);
353                                 exp2.next();
354                                 e.delete();
355                         }
356                         exp2.delete();
357                         f.delete();
358                         exp.next();
359                 }
360                 TopoDS_Shape result = fillet.shape();
361                 exp.delete();
362                 shape.delete();
363                 fillet.delete();
364                 return result;
365                 
366         }
367         
368
369         public static void exportBREP(TopoDS_Shape shape, String filename) {
370                 org.jcae.opencascade.jni.BRepTools.write(shape, filename);
371         }
372         
373 }