X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=org.simantics.opencascade.vtk%2Fsrc%2Forg%2Fsimantics%2Fopencascade%2Fvtk%2FvtkSolidObject.java;h=0979eb355b6e16a810fe4e5a782f640844b8f0e7;hb=a3d63f1ba39c56c2b0236932965b9712654fad12;hp=797c9ae23298d6fb796be43cd0058a3e3f6be069;hpb=84132a1d750c45f9161afbd58b78572964e50d26;p=simantics%2F3d.git diff --git a/org.simantics.opencascade.vtk/src/org/simantics/opencascade/vtk/vtkSolidObject.java b/org.simantics.opencascade.vtk/src/org/simantics/opencascade/vtk/vtkSolidObject.java index 797c9ae2..0979eb35 100644 --- a/org.simantics.opencascade.vtk/src/org/simantics/opencascade/vtk/vtkSolidObject.java +++ b/org.simantics.opencascade.vtk/src/org/simantics/opencascade/vtk/vtkSolidObject.java @@ -41,38 +41,38 @@ import vtk.vtkRenderer; import vtk.vtkSphereSource; public class vtkSolidObject { - + public static double deflection = 0.001; - + public static double featureAngle = 30; public static boolean computeNormals = true; public static boolean cleanPart = false; public static boolean mergePoints = false; - + private VtkView panel; private TopoDS_Shape shape; - + private List actors = new ArrayList(2); - + private List solid = new ArrayList(1); private List edges = new ArrayList(1); private vtkActor silhouette = null; - + private boolean errors = false; - + public vtkSolidObject(VtkView panel,TopoDS_Shape shape) { this.shape = shape; this.panel = panel; } - + public void visualizeSolid(boolean showEdges, boolean showVertices) { visualizeSolid(true, showEdges, showVertices); } - + public void visualizeSolid(boolean showFaces, boolean showEdges, boolean showVertices) { visualizeSolid(showFaces, showEdges, showVertices, false); } - + public void visualizeSolid(boolean showFaces, boolean showEdges, boolean showVertices, boolean showSilhouette) { clearActorsVTK(); errors = false; @@ -104,7 +104,7 @@ public class vtkSolidObject { data.Delete(); showActorsVTK(); } - + public void visualizeFaces(boolean showEdges, boolean showVertices) { errors = false; clearActorsVTK(); @@ -114,9 +114,9 @@ public class vtkSolidObject { errors = true; continue; } - + solid.add(createActor(data)); - + if (showEdges) { vtkActor edgesActor = createEdgesActor(data); edges.add(edgesActor); @@ -128,34 +128,34 @@ public class vtkSolidObject { } actors.addAll(solid); actors.addAll(edges); - + showActorsVTK(); } - + public boolean hasErrors() { return errors; } - + public List getActors() { assert (Thread.currentThread() == panel.getThreadQueue().getThread()); return actors; } - + public List getSolid() { assert (Thread.currentThread() == panel.getThreadQueue().getThread()); return solid; } - + public List getEdges() { assert (Thread.currentThread() == panel.getThreadQueue().getThread()); return edges; } - + public vtkActor getSilhouette() { assert (Thread.currentThread() == panel.getThreadQueue().getThread()); return silhouette; } - + public void showActorsVTK() { assert (Thread.currentThread() == panel.getThreadQueue().getThread()); panel.lock(); @@ -165,17 +165,17 @@ public class vtkSolidObject { } panel.unlock(); } - + public void showActors() { ThreadUtils.asyncExec(panel.getThreadQueue(), new Runnable() { - + @Override public void run() { showActorsVTK(); } }); } - + public void clearActorsVTK() { assert (Thread.currentThread() == panel.getThreadQueue().getThread()); if (actors.size() == 0) @@ -195,10 +195,10 @@ public class vtkSolidObject { solid.clear(); edges.clear(); } - + private void clearActorsAWT(List actors) { assert (Thread.currentThread() == panel.getThreadQueue().getThread()); - + if (actors.size() == 0) return; vtkRenderer ren = panel.getRenderer(); @@ -213,7 +213,7 @@ public class vtkSolidObject { } panel.unlock(); } - + public void clearActors() { if (actors.size() == 0) return; @@ -223,14 +223,14 @@ public class vtkSolidObject { solid.clear(); edges.clear(); ThreadUtils.asyncExec(panel.getThreadQueue(), new Runnable() { - + @Override public void run() { clearActorsAWT(temp); } }); } - + public void dispose() { if (shape != null) { shape.delete(); @@ -238,7 +238,7 @@ public class vtkSolidObject { } clearActors(); } - + public void delete() { if (shape != null) { shape.delete(); @@ -246,21 +246,21 @@ public class vtkSolidObject { } clearActorsVTK(); } - + private static double TOLERANCE = 0.01; - + public static Pair createSolidMesh(TopoDS_Shape shape) { - + boolean success = true; - + double volume = OCCTTool.getBoundingBoxDiagonal(shape); if (volume < TOLERANCE) return null; - + BRepMesh_IncrementalMesh mesh = new BRepMesh_IncrementalMesh(shape,deflection*volume); - + TopExp_Explorer expFace = new TopExp_Explorer(); - + List meshPoints = new ArrayList(); List meshTriangles = new ArrayList(); for (expFace.init(shape, TopAbs_ShapeEnum.FACE); expFace.more(); expFace.next()) { @@ -271,234 +271,234 @@ public class vtkSolidObject { } if (meshPoints.size() == 0 || meshTriangles.size() == 0) return null; - + vtkPolyData data = VTKOCCTool.createPartGrid(meshPoints, meshTriangles); - + expFace.delete(); mesh.delete(); - + return new Pair(data, success); } - + public static Collection createFaceMeshes(TopoDS_Shape shape) { - + double volume = OCCTTool.getBoundingBoxDiagonal(shape); Collection faces = new ArrayList(); - + if (volume > TOLERANCE) { - + BRepMesh_IncrementalMesh mesh = new BRepMesh_IncrementalMesh(shape,deflection*volume); - + TopExp_Explorer expFace = new TopExp_Explorer(); - - + + for (expFace.init(shape, TopAbs_ShapeEnum.FACE); expFace.more(); expFace.next()) { TopoDS_Face face = (TopoDS_Face) expFace.current(); vtkPolyData data = VTKOCCTool.createPartGrid(face); face.delete(); faces.add(data); } - + expFace.delete(); mesh.delete(); } - + return faces; } - - - + + + public static vtkActor createActor(vtkPolyData partGrid) { - - - vtkDataSetMapper partMapper = new vtkDataSetMapper(); - - vtkCleanPolyData partCleaner = null; - if (cleanPart) - { - partCleaner = new vtkCleanPolyData(); - partCleaner.SetInputData(partGrid); - if(mergePoints) { - partCleaner.PointMergingOn(); - } else { - partCleaner.PointMergingOff(); - } - } - - if (computeNormals) - { - vtkPolyDataNormals partNormals = new vtkPolyDataNormals(); - - if (cleanPart) - { - vtkAlgorithmOutput out = partCleaner.GetOutputPort(); - partNormals.SetInputConnection(out); - out.Delete(); - } - else partNormals.SetInputData(partGrid); - - partNormals.SetFeatureAngle(featureAngle); // this do not have to be neccesarily called - vtkAlgorithmOutput out = partNormals.GetOutputPort(); - partMapper.SetInputConnection(out); - out.Delete(); - partNormals.Delete(); - } - else - { - if (cleanPart) { - vtkAlgorithmOutput out = partCleaner.GetOutputPort(); - partMapper.SetInputConnection(out); // metoda 2, ne tak pekne, viz http://www.codeguru.com/cpp/g-m/opengl/article.php/c2681 - out.Delete(); - } - else partMapper.SetInputData(partGrid); // metoda 1, ne tak pekne stinovani, viz: http://www.codeguru.com/cpp/g-m/opengl/article.php/c2681 - } - partMapper.ScalarVisibilityOn(); - - vtkActor partActor = new vtkActor(); - // partActor.SetPickable(1); - vtkProperty prop = partActor.GetProperty(); - prop.SetColor(1, 1, 0); - prop.Delete(); - partActor.SetMapper(partMapper); - - partMapper.Delete(); - - if (cleanPart) - partCleaner.Delete(); - - return partActor; + + + vtkDataSetMapper partMapper = new vtkDataSetMapper(); + + vtkCleanPolyData partCleaner = null; + if (cleanPart) + { + partCleaner = new vtkCleanPolyData(); + partCleaner.SetInputData(partGrid); + if(mergePoints) { + partCleaner.PointMergingOn(); + } else { + partCleaner.PointMergingOff(); + } + } + + if (computeNormals) + { + vtkPolyDataNormals partNormals = new vtkPolyDataNormals(); + + if (cleanPart) + { + vtkAlgorithmOutput out = partCleaner.GetOutputPort(); + partNormals.SetInputConnection(out); + out.Delete(); + } + else partNormals.SetInputData(partGrid); + + partNormals.SetFeatureAngle(featureAngle); // this do not have to be neccesarily called + vtkAlgorithmOutput out = partNormals.GetOutputPort(); + partMapper.SetInputConnection(out); + out.Delete(); + partNormals.Delete(); + } + else + { + if (cleanPart) { + vtkAlgorithmOutput out = partCleaner.GetOutputPort(); + partMapper.SetInputConnection(out); // metoda 2, ne tak pekne, viz http://www.codeguru.com/cpp/g-m/opengl/article.php/c2681 + out.Delete(); + } + else partMapper.SetInputData(partGrid); // metoda 1, ne tak pekne stinovani, viz: http://www.codeguru.com/cpp/g-m/opengl/article.php/c2681 + } + partMapper.ScalarVisibilityOn(); + + vtkActor partActor = new vtkActor(); + // partActor.SetPickable(1); + vtkProperty prop = partActor.GetProperty(); + prop.SetColor(1, 1, 0); + prop.Delete(); + partActor.SetMapper(partMapper); + + partMapper.Delete(); + + if (cleanPart) + partCleaner.Delete(); + + return partActor; } - + public static vtkActor createEdgesActor(vtkPolyData partGrid) { vtkCleanPolyData partCleaner = null; - + if (cleanPart) - { + { partCleaner = new vtkCleanPolyData(); - partCleaner.SetInputData(partGrid); - if(mergePoints) { - partCleaner.PointMergingOn(); - } else { - partCleaner.PointMergingOff(); - } - } - + partCleaner.SetInputData(partGrid); + if(mergePoints) { + partCleaner.PointMergingOn(); + } else { + partCleaner.PointMergingOff(); + } + } + vtkFeatureEdges partEdges = new vtkFeatureEdges(); - if (cleanPart) { - vtkAlgorithmOutput out = partCleaner.GetOutputPort(); - partEdges.SetInputConnection(out); - out.Delete(); - } - else partEdges.SetInputData(partGrid); - // partEdges.SetFeatureAngle(featureAngle); // this do not have to be neccesarily called - partEdges.FeatureEdgesOn(); - partEdges.BoundaryEdgesOn(); - partEdges.NonManifoldEdgesOn(); - partEdges.ManifoldEdgesOn(); - - vtkDataSetMapper partEdgesMapper = new vtkDataSetMapper(); - vtkAlgorithmOutput out = partEdges.GetOutputPort(); - partEdgesMapper.SetInputConnection(out); - out.Delete(); - partEdgesMapper.SetResolveCoincidentTopologyToPolygonOffset(); - partEdgesMapper.ScalarVisibilityOff(); - - vtkActor partEdgesActor = new vtkActor(); - - vtkProperty prop = partEdgesActor.GetProperty(); - prop.SetColor(0, 0, 0); - prop.SetLineWidth(2.0); - prop.Delete(); - partEdgesActor.SetMapper(partEdgesMapper); - - partEdgesMapper.Delete(); - partEdges.Delete(); - - if (cleanPart) - partCleaner.Delete(); - - return partEdgesActor; + if (cleanPart) { + vtkAlgorithmOutput out = partCleaner.GetOutputPort(); + partEdges.SetInputConnection(out); + out.Delete(); + } + else partEdges.SetInputData(partGrid); + // partEdges.SetFeatureAngle(featureAngle); // this do not have to be neccesarily called + partEdges.FeatureEdgesOn(); + partEdges.BoundaryEdgesOn(); + partEdges.NonManifoldEdgesOn(); + partEdges.ManifoldEdgesOn(); + + vtkDataSetMapper partEdgesMapper = new vtkDataSetMapper(); + vtkAlgorithmOutput out = partEdges.GetOutputPort(); + partEdgesMapper.SetInputConnection(out); + out.Delete(); + partEdgesMapper.SetResolveCoincidentTopologyToPolygonOffset(); + partEdgesMapper.ScalarVisibilityOff(); + + vtkActor partEdgesActor = new vtkActor(); + + vtkProperty prop = partEdgesActor.GetProperty(); + prop.SetColor(0, 0, 0); + prop.SetLineWidth(1.0); + prop.Delete(); + partEdgesActor.SetMapper(partEdgesMapper); + + partEdgesMapper.Delete(); + partEdges.Delete(); + + if (cleanPart) + partCleaner.Delete(); + + return partEdgesActor; } - + public static vtkActor createVerticesActor(vtkActor partEdgesActor) { vtkDataSetMapper partEdgesMapper = (vtkDataSetMapper) partEdgesActor.GetMapper(); vtkAlgorithmOutput out = partEdgesMapper.GetInputConnection(0, 0); vtkFeatureEdges partEdges = (vtkFeatureEdges)out.GetProducer(); - + vtkActor edgePointsActor = createVerticesActor(partEdges); - + partEdges.Delete(); //out.Delete(); partEdgesMapper.Delete(); return edgePointsActor; } - + public static vtkActor createVerticesActor(vtkFeatureEdges partEdges) { EdgePointsFilter edgePoints = new EdgePointsFilter(); - - - vtkAlgorithmOutput out = partEdges.GetOutputPort(); - edgePoints.SetInputConnection(out); - out.Delete(); - - vtkSphereSource sphereSource = new vtkSphereSource(); - vtkGlyph3D glyph3D = new vtkGlyph3D(); - out = sphereSource.GetOutputPort(); - glyph3D.SetSourceConnection(out); - out.Delete(); - - out = edgePoints.GetOutputPort(); - glyph3D.SetInputConnection(out); - out.Delete(); - - glyph3D.SetScaleFactor(0.03); - - glyph3D.Update(); - - vtkPolyDataMapper partEdgePointsMapper = new vtkPolyDataMapper(); - out = glyph3D.GetOutputPort(); - partEdgePointsMapper.SetInputConnection(out); - out.Delete(); - - vtkActor edgePointsActor = new vtkActor(); - - vtkProperty prop = edgePointsActor.GetProperty(); - prop.SetColor(0, 0, 1); - prop.Delete(); - edgePointsActor.SetMapper(partEdgePointsMapper); - - edgePointsActor.PickableOn(); - - - partEdgePointsMapper.Delete(); - edgePoints.Delete(); - sphereSource.Delete(); - - return edgePointsActor; + + + vtkAlgorithmOutput out = partEdges.GetOutputPort(); + edgePoints.SetInputConnection(out); + out.Delete(); + + vtkSphereSource sphereSource = new vtkSphereSource(); + vtkGlyph3D glyph3D = new vtkGlyph3D(); + out = sphereSource.GetOutputPort(); + glyph3D.SetSourceConnection(out); + out.Delete(); + + out = edgePoints.GetOutputPort(); + glyph3D.SetInputConnection(out); + out.Delete(); + + glyph3D.SetScaleFactor(0.03); + + glyph3D.Update(); + + vtkPolyDataMapper partEdgePointsMapper = new vtkPolyDataMapper(); + out = glyph3D.GetOutputPort(); + partEdgePointsMapper.SetInputConnection(out); + out.Delete(); + + vtkActor edgePointsActor = new vtkActor(); + + vtkProperty prop = edgePointsActor.GetProperty(); + prop.SetColor(0, 0, 1); + prop.Delete(); + edgePointsActor.SetMapper(partEdgePointsMapper); + + edgePointsActor.PickableOn(); + + + partEdgePointsMapper.Delete(); + edgePoints.Delete(); + sphereSource.Delete(); + + return edgePointsActor; } - + public static vtkActor createSilhouette(vtkRenderer ren, vtkPolyData data) { - - + + vtkPolyDataSilhouette silhouette = new vtkPolyDataSilhouette(); - + silhouette.SetInputData(data); silhouette.SetCamera(ren.GetActiveCamera()); silhouette.SetEnableFeatureAngle(0); vtkPolyDataMapper mapper = new vtkPolyDataMapper(); - + mapper.SetInputConnection(silhouette.GetOutputPort()); - + vtkActor actor = new vtkActor(); actor.SetMapper(mapper); - + actor.GetProperty().SetColor(0,0,1); actor.GetProperty().SetLineWidth(6); - + return actor; - - - + + + } }