]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.opencascade.vtk/src/org/simantics/opencascade/vtk/VTKOCCTool.java
8f5078dff059460fdccda26614d4e872127c2ba0
[simantics/3d.git] / org.simantics.opencascade.vtk / src / org / simantics / opencascade / vtk / VTKOCCTool.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012, 2013 Association for Decentralized Information Management in\r
3  * Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.opencascade.vtk;\r
13 \r
14 import java.util.List;\r
15 \r
16 import javax.vecmath.Matrix4d;\r
17 import javax.vecmath.Point3d;\r
18 \r
19 import org.jcae.opencascade.jni.BRepMesh_IncrementalMesh;\r
20 import org.jcae.opencascade.jni.BRep_Tool;\r
21 import org.jcae.opencascade.jni.GP_Trsf;\r
22 import org.jcae.opencascade.jni.Poly_Triangulation;\r
23 import org.jcae.opencascade.jni.TopAbs_Orientation;\r
24 import org.jcae.opencascade.jni.TopAbs_ShapeEnum;\r
25 import org.jcae.opencascade.jni.TopExp_Explorer;\r
26 import org.jcae.opencascade.jni.TopLoc_Location;\r
27 import org.jcae.opencascade.jni.TopoDS_Face;\r
28 import org.jcae.opencascade.jni.TopoDS_Shape;\r
29 import org.simantics.opencascade.OCCTTool;\r
30 \r
31 import vtk.vtkActor;\r
32 import vtk.vtkAlgorithmOutput;\r
33 import vtk.vtkAppendPolyData;\r
34 import vtk.vtkAssembly;\r
35 import vtk.vtkCleanPolyData;\r
36 import vtk.vtkDataSetMapper;\r
37 import vtk.vtkFeatureEdges;\r
38 import vtk.vtkGlyph3D;\r
39 import vtk.vtkIdList;\r
40 import vtk.vtkPoints;\r
41 import vtk.vtkPolyData;\r
42 import vtk.vtkPolyDataMapper;\r
43 import vtk.vtkPolyDataNormals;\r
44 import vtk.vtkProp;\r
45 import vtk.vtkPropCollection;\r
46 import vtk.vtkProperty;\r
47 import vtk.vtkSphereSource;\r
48 import vtk.vtkTriangle;\r
49 \r
50 public class VTKOCCTool {\r
51         public static vtkAssembly vtkTestAssembly() {\r
52                 vtkAssembly assemblies = new vtkAssembly();\r
53                 vtkPolyData partGrid = createTestPartGrid();\r
54                 gridToAssembly(assemblies, partGrid);\r
55                 return assemblies;\r
56         }\r
57         \r
58         public static vtkAssembly vtkOCCShapeToAssembly(TopoDS_Shape shape) {\r
59                 double deflection = 0.001;\r
60 \r
61                 if (deflection <= 0.0) {\r
62                         deflection = 0.0005;\r
63                         System.out.println("Bad value for deflection. Using: " + deflection);\r
64                 }\r
65 \r
66                 // FIXME : leaks memory!\r
67                 //BRepTools.clean(shape);\r
68 \r
69                 double mass = OCCTTool.getMass(shape);\r
70 \r
71                 if (mass < 1.0e-12) {\r
72                         System.out.println("Non 3D-shape detected");\r
73                         System.out.println("The cad import features are currently limited to 3D models.");\r
74                 }\r
75 \r
76                 double length = OCCTTool.getBoundingBoxDiagonal(shape);\r
77                 deflection *= length; // use relative units\r
78 \r
79                 BRepMesh_IncrementalMesh mesh = new BRepMesh_IncrementalMesh(shape,deflection);\r
80 \r
81                 int faceNumber = 0;\r
82                 TopExp_Explorer expFace = new TopExp_Explorer();\r
83 \r
84                 vtkAssembly assemblies = new vtkAssembly();\r
85                 for (expFace.init(shape, TopAbs_ShapeEnum.FACE); expFace.more(); expFace.next()) {\r
86                         TopoDS_Face face = (TopoDS_Face) expFace.current();\r
87                         vtkPolyData partGrid = createPartGrid(face);\r
88                         face.delete();\r
89                         if (partGrid == null)\r
90                                 continue;\r
91                         faceNumber++;\r
92                         //gridToAssembly(assemblies, partGrid, stlSurfaceData, stlEdgeData);\r
93                         gridToAssembly(assemblies, partGrid);\r
94                         \r
95                 }\r
96                 expFace.delete();\r
97                 mesh.delete();\r
98 \r
99                 if (faceNumber == 0) {\r
100                         System.out\r
101                                         .println("Cad import: error: no surface triangulation was generated.");\r
102                         return null;\r
103                 }\r
104 \r
105                 return assemblies;\r
106         }\r
107         \r
108         private static void gridToAssembly(vtkAssembly assemblies, vtkPolyData partGrid, vtkAppendPolyData stlSurfaceData, vtkAppendPolyData stlEdgeData) {\r
109         \r
110         double featureAngle = 30;\r
111 \r
112         \r
113         vtkDataSetMapper partMapper = new vtkDataSetMapper();\r
114         \r
115         boolean computeNormals = true;\r
116         boolean cleanPart = true;\r
117         boolean mergePoints = false;\r
118 \r
119         vtkCleanPolyData partCleaner = new vtkCleanPolyData();       \r
120         if (cleanPart)\r
121         {\r
122             partCleaner.SetInput(partGrid);\r
123             if(mergePoints) {\r
124               partCleaner.PointMergingOn();\r
125             } else {\r
126               partCleaner.PointMergingOff();\r
127             }\r
128         }\r
129         \r
130         if (computeNormals)\r
131         {\r
132             vtkPolyDataNormals partNormals = new vtkPolyDataNormals();\r
133          \r
134             if (cleanPart)\r
135             {\r
136                 partNormals.SetInputConnection(partCleaner.GetOutputPort());\r
137             }\r
138             else partNormals.SetInput(partGrid);\r
139                 \r
140             partNormals.SetFeatureAngle(featureAngle); // this do not have to be neccesarily called\r
141             partMapper.SetInputConnection(partNormals.GetOutputPort());\r
142             partNormals.Delete();          \r
143         }\r
144         else\r
145         {\r
146             if (cleanPart) partMapper.SetInputConnection(partCleaner.GetOutputPort()); // metoda 2, ne tak pekne, viz http://www.codeguru.com/cpp/g-m/opengl/article.php/c2681\r
147             else partMapper.SetInput(partGrid); // metoda 1, ne tak pekne stinovani, viz: http://www.codeguru.com/cpp/g-m/opengl/article.php/c2681\r
148         }\r
149         partMapper.ScalarVisibilityOn();\r
150         \r
151         vtkActor partActor = new vtkActor();\r
152 \r
153         partActor.SetPickable(1);\r
154         partActor.GetProperty().SetColor(1, 1, 0);\r
155         partActor.SetMapper(partMapper);\r
156         \r
157         // EDGES OF PARTS DETECTION\r
158         vtkFeatureEdges partEdges = new vtkFeatureEdges();\r
159         if (cleanPart) partEdges.SetInputConnection(partCleaner.GetOutputPort());\r
160         else partEdges.SetInput(partGrid); \r
161         partEdges.SetFeatureAngle(featureAngle);  // this do not have to be neccesarily called\r
162         partEdges.FeatureEdgesOn();\r
163         partEdges.BoundaryEdgesOn();\r
164         partEdges.NonManifoldEdgesOn();\r
165         partEdges.ManifoldEdgesOn();\r
166 \r
167         vtkDataSetMapper partEdgesMapper = new vtkDataSetMapper();\r
168         partEdgesMapper.SetInputConnection(partEdges.GetOutputPort());\r
169         partEdgesMapper.SetResolveCoincidentTopologyToPolygonOffset();\r
170         partEdgesMapper.ScalarVisibilityOff();\r
171         \r
172         vtkActor partEdgesActor = new vtkActor();\r
173         partEdgesActor.SetPickable(0);\r
174         partEdgesActor.GetProperty().SetColor(1, 0, 1);\r
175         partEdgesActor.SetMapper(partEdgesMapper);\r
176         \r
177 \r
178         // Add triangles and edges to STL structures:\r
179         //--------------------------------------------\r
180         if (cleanPart) stlSurfaceData.AddInput(partCleaner.GetOutput());\r
181         else stlSurfaceData.AddInput(partGrid);\r
182         stlEdgeData.AddInput(partEdges.GetOutput());\r
183                 \r
184         assemblies.AddPart(partActor);\r
185         assemblies.AddPart(partEdgesActor);        \r
186         \r
187         // Clean up:\r
188         //----------\r
189         partEdgesActor.Delete();\r
190         partEdgesMapper.Delete();\r
191         partEdges.Delete();\r
192         partActor.Delete();\r
193         partMapper.Delete();\r
194         partGrid.Delete();\r
195         partCleaner.Delete();\r
196     }\r
197 \r
198 public static void gridToAssembly(vtkAssembly assemblies, vtkPolyData partGrid) {\r
199     \r
200     double featureAngle = 30;\r
201 \r
202     \r
203     vtkDataSetMapper partMapper = new vtkDataSetMapper();\r
204     \r
205     boolean computeNormals = true;\r
206     boolean cleanPart = false;\r
207     boolean mergePoints = false;\r
208 \r
209     vtkCleanPolyData partCleaner = new vtkCleanPolyData();       \r
210     if (cleanPart)\r
211     {\r
212         partCleaner.SetInput(partGrid);\r
213         if(mergePoints) {\r
214           partCleaner.PointMergingOn();\r
215         } else {\r
216           partCleaner.PointMergingOff();\r
217         }\r
218     }\r
219     \r
220     if (computeNormals)\r
221     {\r
222         vtkPolyDataNormals partNormals = new vtkPolyDataNormals();\r
223      \r
224         if (cleanPart)\r
225         {\r
226                 vtkAlgorithmOutput out = partCleaner.GetOutputPort();\r
227             partNormals.SetInputConnection(out);\r
228             out.Delete();\r
229         }\r
230         else partNormals.SetInput(partGrid);\r
231             \r
232         partNormals.SetFeatureAngle(featureAngle); // this do not have to be neccesarily called\r
233         vtkAlgorithmOutput out = partNormals.GetOutputPort();\r
234         partMapper.SetInputConnection(out);\r
235         out.Delete();\r
236         partNormals.Delete();          \r
237     }\r
238     else\r
239     {\r
240         if (cleanPart) {\r
241                 vtkAlgorithmOutput out = partCleaner.GetOutputPort();\r
242                 partMapper.SetInputConnection(out); // metoda 2, ne tak pekne, viz http://www.codeguru.com/cpp/g-m/opengl/article.php/c2681\r
243                 out.Delete();\r
244         }\r
245         else partMapper.SetInput(partGrid); // metoda 1, ne tak pekne stinovani, viz: http://www.codeguru.com/cpp/g-m/opengl/article.php/c2681\r
246     }\r
247     partMapper.ScalarVisibilityOn();\r
248     \r
249     vtkActor partActor = new vtkActor();\r
250     partActor.SetPickable(1);\r
251     vtkProperty prop = partActor.GetProperty();\r
252     prop.SetColor(1, 1, 0);\r
253     prop.Delete();\r
254     partActor.SetMapper(partMapper);\r
255     \r
256     assemblies.AddPart(partActor);\r
257     \r
258     {\r
259             // EDGES OF PARTS DETECTION\r
260             vtkFeatureEdges partEdges = new vtkFeatureEdges();\r
261             if (cleanPart) {\r
262                 vtkAlgorithmOutput out = partCleaner.GetOutputPort();\r
263                 partEdges.SetInputConnection(out);\r
264                 out.Delete();\r
265             }\r
266             else partEdges.SetInput(partGrid); \r
267            // partEdges.SetFeatureAngle(featureAngle);  // this do not have to be neccesarily called\r
268             partEdges.FeatureEdgesOn();\r
269             partEdges.BoundaryEdgesOn();\r
270             partEdges.NonManifoldEdgesOn();\r
271             partEdges.ManifoldEdgesOn();\r
272         \r
273             vtkDataSetMapper partEdgesMapper = new vtkDataSetMapper();\r
274             vtkAlgorithmOutput out = partEdges.GetOutputPort();\r
275             partEdgesMapper.SetInputConnection(out);\r
276             out.Delete();\r
277             partEdgesMapper.SetResolveCoincidentTopologyToPolygonOffset();\r
278             partEdgesMapper.ScalarVisibilityOff();\r
279             \r
280             vtkActor partEdgesActor = new vtkActor();\r
281            \r
282             prop = partEdgesActor.GetProperty();\r
283             prop.SetColor(0, 0, 0);\r
284             prop.SetLineWidth(2.0);\r
285             prop.Delete();\r
286             partEdgesActor.SetMapper(partEdgesMapper);\r
287             partEdgesActor.PickableOn();  \r
288             \r
289             assemblies.AddPart(partEdgesActor);        \r
290             \r
291             {\r
292 \r
293                 EdgePointsFilter edgePoints = new EdgePointsFilter();\r
294                 \r
295                  \r
296                 out = partEdges.GetOutputPort();\r
297                     edgePoints.SetInputConnection(out);\r
298                     out.Delete();\r
299                     \r
300 //                  vtkDataSetMapper partEdgePointsMapper = new vtkDataSetMapper();\r
301 //                  out = edgePoints.GetOutputPort();\r
302 //                  partEdgePointsMapper.SetInputConnection(out);\r
303 //                  out.Delete();\r
304                     \r
305 //                  vtkVertexGlyphFilter glyphFilter = new vtkVertexGlyphFilter();\r
306 //                  out = edgePoints.GetOutputPort();\r
307 //                  glyphFilter.SetInputConnection(out);\r
308 //                  glyphFilter.Update();\r
309 //                  out.Delete();\r
310 //                  \r
311 //                  vtkPolyDataMapper partEdgePointsMapper = new vtkPolyDataMapper();\r
312 //                  out = glyphFilter.GetOutputPort();\r
313 //                  partEdgePointsMapper.SetInputConnection(out);\r
314 //                  out.Delete();\r
315                     \r
316                     vtkSphereSource sphereSource = new vtkSphereSource();\r
317                     vtkGlyph3D glyph3D = new vtkGlyph3D();\r
318                     out = sphereSource.GetOutputPort();\r
319                     glyph3D.SetSourceConnection(out);\r
320                     out.Delete();\r
321                     \r
322                     out = edgePoints.GetOutputPort();\r
323                     glyph3D.SetInputConnection(out);\r
324                     out.Delete();\r
325                     \r
326                     //glyph3D.ScalingOff();\r
327                     glyph3D.SetScaleFactor(0.03);\r
328                     \r
329                     glyph3D.Update();\r
330                     \r
331                     vtkPolyDataMapper partEdgePointsMapper = new vtkPolyDataMapper();\r
332                     out = glyph3D.GetOutputPort();\r
333                     partEdgePointsMapper.SetInputConnection(out);\r
334                     out.Delete();\r
335                     \r
336                     vtkActor edgePointsActor = new vtkActor();\r
337                    \r
338                     prop = edgePointsActor.GetProperty();\r
339                     prop.SetColor(0, 0, 1);\r
340                     //prop.SetPointSize(10.0);\r
341                     //prop.SetRepresentationToPoints();\r
342                     prop.Delete();\r
343                     edgePointsActor.SetMapper(partEdgePointsMapper);\r
344                    \r
345                     edgePointsActor.PickableOn();\r
346                     assemblies.AddPart(edgePointsActor);\r
347                     \r
348                     \r
349                     edgePointsActor.Delete();\r
350                     partEdgePointsMapper.Delete();\r
351                    // edgePoints.Delete();\r
352             }\r
353             // Clean up:\r
354             //----------\r
355             partEdgesActor.Delete();\r
356             partEdgesMapper.Delete();\r
357             partEdges.Delete();\r
358     }\r
359    \r
360     partActor.Delete();\r
361     partMapper.Delete();\r
362     partGrid.Delete();\r
363     partCleaner.Delete();\r
364 }\r
365         \r
366         \r
367         \r
368         public static vtkPolyData createPartGrid ( TopoDS_Face face)\r
369     {\r
370         TopLoc_Location Location = new TopLoc_Location();\r
371         \r
372         Poly_Triangulation triangulation = BRep_Tool.triangulation(face, Location);\r
373 \r
374         if(triangulation == null) {\r
375                 Location.delete();\r
376                 System.out.println("Encountered empty triangulation after face");\r
377                 return null;\r
378         }\r
379                 \r
380         boolean reverse = face.orientation()==TopAbs_Orientation.REVERSED;\r
381 \r
382         int[]triangles = triangulation.triangles();\r
383         double[]nodes = triangulation.nodes();\r
384 \r
385         int nofTriangles = triangulation.nbTriangles();\r
386         int nofNodes = triangulation.nbNodes();\r
387         \r
388         triangulation.delete();\r
389 \r
390         if(nofTriangles < 1) {\r
391           System.out.println("No triangles for mesh on face");\r
392           Location.delete();\r
393           return null;\r
394         }\r
395 \r
396         if(nofNodes < 1) {\r
397             System.out.println("No nodes for mesh on face:");\r
398             Location.delete();\r
399             return null;\r
400         }\r
401         //System.out.println("v " + nofNodes + " t " +nofTriangles);\r
402         vtkPolyData partGrid = new vtkPolyData();\r
403         partGrid.Allocate(nofTriangles, nofTriangles);\r
404 \r
405         vtkTriangle triangle = new vtkTriangle();\r
406         vtkIdList list = triangle.GetPointIds();\r
407         for(int i = 0; i < nofTriangles; i++) \r
408         {\r
409           int n0, n1, n2;\r
410           if (!reverse) {\r
411                   n0 = triangles[3 * i]; \r
412                   n1 = triangles[3 * i + 1]; \r
413                   n2 = triangles[3 * i + 2];\r
414           } else {\r
415                   n0 = triangles[3 * i + 2]; \r
416                   n1 = triangles[3 * i + 1]; \r
417                   n2 = triangles[3 * i];\r
418           }\r
419           \r
420           list.SetId(0, n0);\r
421           list.SetId(1, n1);\r
422           list.SetId(2, n2);\r
423           partGrid.InsertNextCell(triangle.GetCellType(), list);\r
424           \r
425         }\r
426         list.Delete();\r
427         triangle.Delete();   \r
428         \r
429         GP_Trsf transformation = Location.transformation();\r
430         Location.delete();\r
431 \r
432         double d_mat[] = new double[16];\r
433         double d_p[] = new double[3];\r
434         transformation.getValues(d_mat);\r
435         Matrix4d mat = new Matrix4d(d_mat);\r
436         \r
437         vtkPoints partPoints = new vtkPoints();\r
438         \r
439         for(int i = 0; i < nofNodes; i++) {     \r
440           // FIXME: GP_Trsf.transform(double[]) leaks memory\r
441                 \r
442           //double xyz[] = new double[]{nodes[3 * i], nodes[3 * i + 1], nodes[3 * i + 2]};          \r
443           //transformation.transforms(xyz);\r
444           //partPoints.InsertPoint(i, xyz);\r
445                 Point3d p = new Point3d(nodes[3 * i], nodes[3 * i + 1], nodes[3 * i + 2]);\r
446                 mat.transform(p);\r
447                 d_p[0] = p.x;\r
448                 d_p[1] = p.y;\r
449                 d_p[2] = p.z;\r
450                 partPoints.InsertPoint(i, d_p);\r
451         }\r
452         \r
453         transformation.delete();\r
454         \r
455         partGrid.SetPoints(partPoints);\r
456         partPoints.Delete();\r
457        \r
458         return partGrid;\r
459     }\r
460         \r
461         \r
462         \r
463         public static vtkPolyData createPartGrid ( List<Double> meshPoints, List<Integer> meshTriangles)\r
464     {\r
465        \r
466                 \r
467       \r
468 \r
469         \r
470         int nofTriangles = meshTriangles.size() / 3;\r
471         int nofNodes = meshPoints.size() /3;\r
472         \r
473       \r
474         if(nofTriangles < 1) {\r
475           System.out.println("No triangles for mesh on face");\r
476           return null;\r
477         }\r
478 \r
479         if(nofNodes < 1) {\r
480             System.out.println("No nodes for mesh on face:");\r
481             return null;\r
482         }\r
483         //System.out.println("v " + nofNodes + " t " +nofTriangles);\r
484         vtkPolyData partGrid = new vtkPolyData();\r
485         partGrid.Allocate(nofTriangles, nofTriangles);\r
486 \r
487         vtkTriangle triangle = new vtkTriangle();\r
488         vtkIdList list = triangle.GetPointIds();\r
489         for(int i = 0; i < nofTriangles; i++) \r
490         {\r
491           int n0, n1, n2;          \r
492           n0 = meshTriangles.get(3 * i); \r
493           n1 = meshTriangles.get(3 * i + 1);\r
494           n2 = meshTriangles.get(3 * i + 2); \r
495 \r
496          \r
497           list.SetId(0, n0);\r
498           list.SetId(1, n1);\r
499           list.SetId(2, n2);\r
500           partGrid.InsertNextCell(triangle.GetCellType(), list);\r
501           \r
502         }\r
503         list.Delete();\r
504         triangle.Delete();   \r
505         \r
506 \r
507 \r
508         double d_p[] = new double[3];\r
509 \r
510         \r
511         vtkPoints partPoints = new vtkPoints();\r
512         \r
513         for(int i = 0; i < nofNodes; i++) {     \r
514 \r
515                 d_p[0] = meshPoints.get(3*i);\r
516                 d_p[1] = meshPoints.get(3*i+1);\r
517                 d_p[2] = meshPoints.get(3*i+2);\r
518                 partPoints.InsertPoint(i, d_p);\r
519         }\r
520         \r
521         partGrid.SetPoints(partPoints);\r
522         partPoints.Delete();\r
523        \r
524         return partGrid;\r
525     }\r
526         \r
527         private static vtkPolyData createTestPartGrid ()\r
528     {\r
529                 int size = 64;\r
530                 \r
531         double[] nodes = new double[(size+1)*(size+1)*3];\r
532         int[] triangles = new int[3 * size * size * 2];\r
533 \r
534         double es = 1.0;\r
535         for (int i = 0; i <= size; i++) {\r
536                 for (int j = 0; j <= size; j++) {\r
537                         int index = j * size + i;\r
538                         index *= 3;\r
539                         double x = (double)i * es;\r
540                         double y = (Math.sin((double)i/(double)size)  + Math.sin((double)j/(double)size)) * es;\r
541                         double z = (double)j * es;\r
542                         nodes[index] = x;\r
543                         nodes[index+1] = y;\r
544                         nodes[index+2] = z;\r
545                 }\r
546         }\r
547         \r
548         for (int i = 0; i < size; i++) {\r
549                 for (int j = 0; j < size; j++) {\r
550                         int index = j * size + i;\r
551                         index *= 3;\r
552                         index *= 2;\r
553                         triangles[index  ] = (j     * (size+1) + i  );\r
554                         triangles[index+1] = (j     * (size+1) + i+1);\r
555                         triangles[index+2] = ((j+1) * (size+1) + i  );\r
556                         triangles[index+3] = ((j+1) * (size+1) + i  );\r
557                         triangles[index+4] = ((j  ) * (size+1) + i +1 );\r
558                         triangles[index+5] = ((j+1) * (size+1) + i +1 );\r
559                 }\r
560         }\r
561 \r
562         int nofTriangles = triangles.length / 3;\r
563         int nofNodes = nodes.length / 3;\r
564 \r
565         if(nofTriangles < 1) {\r
566          \r
567           return null;\r
568         }\r
569 \r
570         if(nofNodes < 1) {\r
571            \r
572             return null;\r
573         }\r
574         //System.out.println("v " + nofNodes + " t " +nofTriangles);\r
575         vtkPolyData partGrid = new vtkPolyData();\r
576         partGrid.Allocate(nofTriangles, nofTriangles);\r
577 \r
578         vtkTriangle triangle = new vtkTriangle();\r
579         vtkIdList list = triangle.GetPointIds();\r
580         for(int i = 0; i < nofTriangles; i++) \r
581         {\r
582           int n0, n1, n2;          \r
583           n0 = triangles[3 * i]; n1 = triangles[3 * i + 1]; n2 = triangles[3 * i + 2]; // triangles(i).Get(n0, n1, n2);\r
584 \r
585 //          if(face.orientation() != TopAbs_Orientation.FORWARD) {\r
586 //              int tmp = n2; n2 = n1; n1 = tmp;\r
587 //          }\r
588          \r
589           list.SetId(0, n0);\r
590           list.SetId(1, n1);\r
591           list.SetId(2, n2);\r
592           partGrid.InsertNextCell(triangle.GetCellType(), list);\r
593           \r
594         }\r
595         list.Delete();\r
596         triangle.Delete();      \r
597 \r
598         vtkPoints partPoints = new vtkPoints();\r
599         for(int i = 0; i < nofNodes; i++) {       \r
600             double xyz[] = new double[]{nodes[3 * i], nodes[3 * i + 1], nodes[3 * i + 2]};          \r
601             partPoints.InsertPoint(i, xyz);\r
602         }\r
603         \r
604         partGrid.SetPoints(partPoints);\r
605         \r
606         partPoints.Delete();\r
607 \r
608         return partGrid;\r
609     }\r
610         \r
611         public static void test() {\r
612                 TopoDS_Shape shape = null;\r
613                 //shape = OccTriangulator.makeCylinder(new double[]{0,0,0}, new double[]{0,1,0}, 1, 1);\r
614                 for (int t = 0; t < 5000; t++) {\r
615                         //shape = OccTriangulator.makeCylinder(new double[]{0,0,0}, new double[]{0,1,0}, 1, 1);\r
616                         int test = 2;\r
617                         if (test == 0) {\r
618                                 vtkAssembly ass = VTKOCCTool.vtkOCCShapeToAssembly(shape);\r
619                                 vtkPropCollection col;\r
620                         col = ass.GetParts();\r
621                         for (int i = 0; i < col.GetNumberOfItems(); i++)\r
622                         {\r
623                             vtkProp prop = (vtkProp) col.GetItemAsObject(i);\r
624                             //System.out.println(prop.Print());\r
625                             prop.Delete();\r
626                         }\r
627                         col.Delete();\r
628                         ass.Delete();\r
629                         }\r
630                         else if (test == 1) {\r
631                                 //BRepTools.clean(shape);\r
632                                 \r
633                                 \r
634                                 vtkAssembly ass = new vtkAssembly();\r
635                                 \r
636                                 double vol = OCCTTool.getBoundingBoxDiagonal(shape);\r
637                                 double d = 0.001 * vol;\r
638                                 BRepMesh_IncrementalMesh mesh = new BRepMesh_IncrementalMesh(shape,d);\r
639                                 TopExp_Explorer expFace = new TopExp_Explorer();\r
640                                 for (expFace.init(shape, TopAbs_ShapeEnum.FACE); expFace.more(); expFace.next()) {\r
641                                         TopoDS_Face face = (TopoDS_Face) expFace.current();\r
642                                         {\r
643 //                                              TopLoc_Location Location = new TopLoc_Location();\r
644 //                                              Poly_Triangulation triangulation = BRep_Tool.triangulation(face, Location);\r
645 //                                              if (triangulation != null) {\r
646 //                                                      \r
647 //                                                      int[]triangles = triangulation.triangles();\r
648 //                                              double[]nodes = triangulation.nodes();\r
649 //                                              int nofTriangles = triangulation.nbTriangles();\r
650 //                                              int nofNodes = triangulation.nbNodes();\r
651 //                                              \r
652 //                                              triangulation.delete();\r
653 //                                              \r
654 //                                              GP_Trsf transformation = Location.transformation();\r
655 //                                              double d_mat[] = new double[16];\r
656 //                                              transformation.getValues(d_mat);\r
657 //                                              Matrix4d mat = new Matrix4d(d_mat);\r
658 //                                              for(int i = 0; i < nofNodes; i++) {       \r
659 //                                                  //double xyz[] = new double[]{nodes[3 * i], nodes[3 * i + 1], nodes[3 * i + 2]};          \r
660 //                                                  Point3d p = new Point3d(nodes[3 * i], nodes[3 * i + 1], nodes[3 * i + 2]);\r
661 //                                                      //transformation.transforms(xyz);\r
662 //                                                  mat.transform(p);\r
663 //                                              }\r
664 //                                              transformation.delete();\r
665 //                                              }\r
666 //                                              \r
667 //                                              Location.delete();\r
668                                                 vtkPolyData data = VTKOCCTool.createPartGrid(face);\r
669                                                 VTKOCCTool.gridToAssembly(ass, data);\r
670                                                 //data.Delete();\r
671                                         }\r
672                                         face.delete();\r
673                                 }\r
674                                 expFace.delete();\r
675                                 mesh.delete();\r
676                                 \r
677                                 vtkPropCollection col;\r
678                         col = ass.GetParts();\r
679                         for (int i = 0; i < col.GetNumberOfItems(); i++)\r
680                         {\r
681                             vtkProp prop = (vtkProp) col.GetItemAsObject(i);\r
682                             //System.out.println(prop.Print());\r
683                             prop.Delete();\r
684                         }\r
685                         col.Delete();\r
686                         ass.Delete();\r
687                         } else if (test == 2) {\r
688                                 double[] pointStruct = new double[]{0,0,0}, dirStruct = new double[]{0,1,0};\r
689                                 double radius = 1.0;\r
690                                 double height = 1.0;\r
691                                 \r
692                                 double[] axe = new double[6];\r
693                                  \r
694                         System.arraycopy(pointStruct, 0, axe, 0, 3);\r
695                         System.arraycopy(dirStruct, 0, axe, 3, 3);\r
696                         org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder cyl = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder(axe, radius, height, 2 * Math.PI);\r
697                         org.jcae.opencascade.jni.TopoDS_Shape tds = cyl.shape();\r
698                         cyl.delete();\r
699                         \r
700                         double vol = OCCTTool.getBoundingBoxDiagonal(tds);\r
701                                 double d = 0.001 * vol;\r
702                                 BRepMesh_IncrementalMesh mesh = new BRepMesh_IncrementalMesh(tds,d);\r
703 //                              TopExp_Explorer expFace = new TopExp_Explorer();\r
704 //                              for (expFace.init(tds, TopAbs_ShapeEnum.FACE); expFace.more(); expFace.next()) {\r
705 //                                      TopoDS_Face face = (TopoDS_Face) expFace.current();\r
706 //                                      {\r
707 //                                              \r
708 //                                      }\r
709 //                                      face.delete();\r
710 //                              }\r
711                                 mesh.delete();\r
712                                 \r
713                         tds.delete();\r
714                         }\r
715                         //shape.delete();\r
716                 System.out.println(t);\r
717                 }\r
718                 //shape.delete();\r
719         }\r
720 }\r