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