]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.opencascade/src/org/simantics/opencascade/OccTriangulator.java
fixes #6054
[simantics/3d.git] / org.simantics.opencascade / src / org / simantics / opencascade / OccTriangulator.java
1 package org.simantics.opencascade;\r
2 \r
3 /*******************************************************************************\r
4  * Copyright (c) 2007, 2013- 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
9  *\r
10  * Contributors:\r
11  *     VTT Technical Research Centre of Finland - initial API and implementation\r
12  *******************************************************************************/\r
13 \r
14 import javax.vecmath.Vector2d;\r
15 \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
29 \r
30 \r
31 public class OccTriangulator {\r
32 \r
33     \r
34     public static final double MIN_VALUE = 0.001;\r
35     \r
36     public OccTriangulator() {\r
37         \r
38     }\r
39 \r
40 \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
46             return shape;\r
47         } else if (lowerFileName.endsWith(".iges")) {\r
48             TopoDS_Shape shape = importIGES(filename);\r
49             return shape;\r
50         } else if (lowerFileName.endsWith(".brep")) {\r
51             TopoDS_Shape shape = importBREP(filename);\r
52             return shape;\r
53         } else {\r
54             throw new UnsupportedOperationException("Unsupported format " + filename);\r
55         }\r
56     }\r
57 \r
58     public static TopoDS_Shape importBREP(String filename) {\r
59                 return importBREP(filename,1.0); // convert to meters.\r
60     }\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
64         aBuilder.delete();\r
65         if (Math.abs(scale-1.0) < 0.001)\r
66                 return myShape;\r
67         TopoDS_Shape scaled = makeScale(myShape, scale);\r
68         myShape.delete();\r
69         return scaled;\r
70     }\r
71 \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
79         aReader.delete();\r
80         return result;\r
81     }\r
82     \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
90         aReader.delete();\r
91         return result;\r
92     }\r
93 \r
94 \r
95 \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
100 \r
101         TopoDS_Shape shape = bt.shape();\r
102         bt.delete();\r
103         theTransformation.delete();\r
104         return shape;\r
105     }\r
106 \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
113         torus.delete();\r
114         return tds;\r
115     }\r
116     \r
117 \r
118     public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double[] dirStruct2, double r1, double r2) {\r
119         double[] axe = new double[9];\r
120         System.arraycopy(pointStruct, 0, axe, 0, 3);\r
121         System.arraycopy(dirStruct, 0, axe, 3, 3);\r
122         System.arraycopy(dirStruct2, 0, axe, 6, 3);\r
123         BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2);\r
124         org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape();\r
125         torus.delete();\r
126         return tds;\r
127     }\r
128     \r
129     public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2, double angle1, double angle2, double angle) {\r
130         double[] axe = new double[6];\r
131         System.arraycopy(pointStruct, 0, axe, 0, 3);\r
132         System.arraycopy(dirStruct, 0, axe, 3, 3);\r
133         BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2,angle1,angle2,angle);\r
134         org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape();\r
135         torus.delete();\r
136         return tds;\r
137     }\r
138     \r
139     public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double[] dirStruct2,  double r1, double r2, double angle1, double angle2, double angle) {\r
140         double[] axe = new double[9];\r
141         System.arraycopy(pointStruct, 0, axe, 0, 3);\r
142         System.arraycopy(dirStruct, 0, axe, 3, 3);\r
143         System.arraycopy(dirStruct2, 0, axe, 6, 3);\r
144         BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2,angle1,angle2,angle);\r
145         org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape();\r
146         torus.delete();\r
147         return tds;\r
148     }\r
149 \r
150     public static TopoDS_Shape makeSphere(double x, double y, double z, double radius) {\r
151         double[] c = new double[] { x, y, z };\r
152         org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere sphere = new org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere(c, radius);\r
153         org.jcae.opencascade.jni.TopoDS_Shape tds = sphere.shape();\r
154         sphere.delete();\r
155         return tds;\r
156     }\r
157 \r
158 \r
159     public static TopoDS_Shape makeRotation(TopoDS_Shape aShape, double[] axisStruct, double angle) {\r
160 \r
161         GP_Trsf theTransformation = new GP_Trsf();\r
162         theTransformation.setRotation(axisStruct, angle);\r
163         BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);\r
164         TopoDS_Shape shape = bt.shape();\r
165         bt.delete();\r
166         theTransformation.delete();\r
167         return shape;\r
168     }\r
169 \r
170     public static TopoDS_Shape makeScale(TopoDS_Shape aShape, double s) {\r
171 \r
172         GP_Trsf theTransformation = new GP_Trsf();\r
173         theTransformation.setValues(s, 0, 0, 0,\r
174                                             0, s, 0, 0, \r
175                                             0, 0, s, 0, 1, 1);\r
176         BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true);\r
177         TopoDS_Shape shape = bt.shape();\r
178         bt.delete();\r
179         theTransformation.delete();\r
180         return shape;\r
181     }\r
182 \r
183 \r
184     public static TopoDS_Shape makeCylinder(double[] pointStruct, double[] dirStruct, double radius, double height) {\r
185         double[] axe = new double[6];\r
186         System.arraycopy(pointStruct, 0, axe, 0, 3);\r
187         System.arraycopy(dirStruct, 0, axe, 3, 3);\r
188         org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder cyl = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder(axe, radius, height, 2 * Math.PI);\r
189         org.jcae.opencascade.jni.TopoDS_Shape tds = cyl.shape();\r
190         cyl.delete();\r
191         return tds;\r
192     }\r
193 \r
194     public static TopoDS_Shape makeCopy(TopoDS_Shape topoDS_Shape) {\r
195         throw new UnsupportedOperationException();\r
196     }\r
197 \r
198     public static TopoDS_Shape makeCone(double[] pointStruct, double[] dirStruct, double radius1, double radius2, double height) {\r
199         double[] axe = new double[6];\r
200         System.arraycopy(pointStruct, 0, axe, 0, 3);\r
201         System.arraycopy(dirStruct, 0, axe, 3, 3);\r
202         org.jcae.opencascade.jni.BRepPrimAPI_MakeCone cone = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCone(axe, radius1, radius2, height, 2 * Math.PI);\r
203         org.jcae.opencascade.jni.TopoDS_Shape tds = cone.shape();\r
204         cone.delete();\r
205         return tds;\r
206     }\r
207 \r
208     public static TopoDS_Shape makeCompound(TopoDS_Shape[] shapes) {\r
209         BRep_Builder builder = new BRep_Builder();\r
210         org.jcae.opencascade.jni.TopoDS_Compound comp = new org.jcae.opencascade.jni.TopoDS_Compound();\r
211         builder.makeCompound(comp);\r
212         for (int i = 0; i < shapes.length; i++) {\r
213 \r
214             builder.add(comp, shapes[i]);\r
215         }\r
216         builder.delete();\r
217         return comp;\r
218     }\r
219 \r
220 \r
221     public static TopoDS_Shape makeBox(double x1, double y1, double z1, double x2, double y2, double z2) {\r
222         double[] p1 = new double[] { x1, y1, z1 };\r
223         double[] p2 = new double[] { x2, y2, z2 };\r
224         org.jcae.opencascade.jni.BRepPrimAPI_MakeBox box = new org.jcae.opencascade.jni.BRepPrimAPI_MakeBox(p1, p2); \r
225         org.jcae.opencascade.jni.TopoDS_Shape tds = box.shape();\r
226         box.delete();\r
227         return tds;\r
228     }\r
229 \r
230     public static TopoDS_Shape makeCut(TopoDS_Shape shape1, TopoDS_Shape shape2) {\r
231         org.jcae.opencascade.jni.BRepAlgoAPI_Cut cut = new org.jcae.opencascade.jni.BRepAlgoAPI_Cut(shape1, shape2);\r
232         org.jcae.opencascade.jni.TopoDS_Shape s = cut.shape();\r
233         cut.delete();\r
234         return s;\r
235     }\r
236     \r
237     public static TopoDS_Shape makeCommon(TopoDS_Shape shape1, TopoDS_Shape shape2) {\r
238         org.jcae.opencascade.jni.BRepAlgoAPI_Common common = new org.jcae.opencascade.jni.BRepAlgoAPI_Common(shape1, shape2); \r
239         org.jcae.opencascade.jni.TopoDS_Shape s = common.shape();\r
240         common.delete();\r
241         return s;\r
242     }\r
243     \r
244     public static TopoDS_Shape makeFuse(TopoDS_Shape shape1, TopoDS_Shape shape2) {\r
245         org.jcae.opencascade.jni.BRepAlgoAPI_Fuse fuse = new org.jcae.opencascade.jni.BRepAlgoAPI_Fuse(shape1, shape2);\r
246         org.jcae.opencascade.jni.TopoDS_Shape s = fuse.shape();\r
247         fuse.delete();\r
248         return s;\r
249     }\r
250 \r
251     \r
252     public static TopoDS_Shape makeWedge(double[] pointStruct, double[] dirStruct,double dx, double dy, double dz, double xmin, double zmin, double xmax, double zmax) {\r
253         double[] axe = new double[6];\r
254         System.arraycopy(pointStruct, 0, axe, 0, 3);\r
255         System.arraycopy(dirStruct, 0, axe, 3, 3);\r
256         \r
257         org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge wedge = new org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge(axe,  dx,  dy,  dz,  xmin,  zmin, xmax, zmax); \r
258         org.jcae.opencascade.jni.TopoDS_Shape s = wedge.shape();\r
259         wedge.delete();\r
260         return s;\r
261     }\r
262     \r
263     public static TopoDS_Shape makeEllipticCylinder(double h, double r1, double r2) {\r
264         GP_Elips ellipse;\r
265                 if (r1 < r2) {\r
266                         // FIXME : ellipse should be rotated, but current JNI won't allow it since Ax2 is not separate object\r
267                         ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r2,r1);\r
268                 } else {\r
269                         ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r1,r2);\r
270                 }\r
271                 BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(ellipse);\r
272                 TopoDS_Edge ed = (TopoDS_Edge) edge.shape();\r
273                 BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire(ed);\r
274                 TopoDS_Wire w = (TopoDS_Wire) wire.shape();\r
275                 BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w); \r
276         TopoDS_Face F = (TopoDS_Face) face.shape();\r
277         BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 }); \r
278         TopoDS_Shape shape = prism.shape();\r
279         ellipse.delete();\r
280         edge.delete();\r
281         wire.delete();\r
282         face.delete();\r
283         ed.delete();\r
284         w.delete();\r
285         F.delete();\r
286         prism.delete();\r
287         return shape;\r
288     }\r
289 \r
290     public static TopoDS_Shape makeReqularPrism(double h, double r, int n) {\r
291         if (n < 3)\r
292                 n = 3;\r
293         Vector2d vertices[] = new Vector2d[n];\r
294                 for (int i = 0; i < n; i++) {\r
295                         vertices[i] = new Vector2d(Math.sin(Math.PI * 2.0 * i / n)*r,Math.cos(Math.PI * 2.0 * i / n)*r);\r
296                 }\r
297                 BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire();\r
298                 for (int i = 0; i < n; i++) {\r
299                         Vector2d v1 = vertices[i];\r
300                         Vector2d v2 = vertices[(i+1)%n];\r
301                         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
302                         wire.add((TopoDS_Edge)edge.shape());\r
303                         edge.delete();\r
304                 }\r
305                 TopoDS_Wire w = (TopoDS_Wire)wire.shape();\r
306                 \r
307                 BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w);\r
308                 TopoDS_Face F = (TopoDS_Face) face.shape();\r
309                 face.delete();\r
310                 \r
311                 BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 }); \r
312         TopoDS_Shape shape = prism.shape();     \r
313         prism.delete();\r
314         \r
315         wire.delete();\r
316         w.delete();\r
317         F.delete();\r
318         return shape;\r
319     }\r
320  \r
321 \r
322     public static void exportBREP(TopoDS_Shape shape, String filename) {\r
323         org.jcae.opencascade.jni.BRepTools.write(shape, filename);\r
324     }\r
325     \r
326 }\r