X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.opencascade.vtk%2Fsrc%2Forg%2Fsimantics%2Fopencascade%2Fvtk%2FvtkSolidObject.java;h=0979eb355b6e16a810fe4e5a782f640844b8f0e7;hb=a3d63f1ba39c56c2b0236932965b9712654fad12;hp=f2501e95d7fe659965b9421608a30db44e9feee2;hpb=86739231beb0535bde4abae49d2011e3a042810b;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 f2501e95..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 @@ -20,9 +20,9 @@ import org.jcae.opencascade.jni.TopAbs_ShapeEnum; import org.jcae.opencascade.jni.TopExp_Explorer; import org.jcae.opencascade.jni.TopoDS_Face; import org.jcae.opencascade.jni.TopoDS_Shape; +import org.simantics.g3d.vtk.common.VtkView; import org.simantics.opencascade.OCCTTool; import org.simantics.utils.datastructures.Pair; -import org.simantics.utils.threads.AWTThread; import org.simantics.utils.threads.ThreadUtils; import vtk.vtkActor; @@ -31,7 +31,6 @@ import vtk.vtkCleanPolyData; import vtk.vtkDataSetMapper; import vtk.vtkFeatureEdges; import vtk.vtkGlyph3D; -import vtk.vtkPanel; import vtk.vtkPolyData; import vtk.vtkPolyDataMapper; import vtk.vtkPolyDataNormals; @@ -42,40 +41,40 @@ 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 vtkPanel panel; + + 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(vtkPanel panel,TopoDS_Shape shape) { + + 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) { - clearActorsAWT(); + clearActorsVTK(); errors = false; Pair res = createSolidMesh(shape); if (res == null) { @@ -96,28 +95,28 @@ public class vtkSolidObject { } } if (showSilhouette) { - silhouette = createSilhouette(panel.GetRenderer(), data); + silhouette = createSilhouette(panel.getRenderer(), data); } actors.addAll(solid); actors.addAll(edges); if (silhouette != null) actors.add(silhouette); data.Delete(); - showActorsAWT(); + showActorsVTK(); } - + public void visualizeFaces(boolean showEdges, boolean showVertices) { errors = false; - clearActorsAWT(); + clearActorsVTK(); Collection datas = createFaceMeshes(shape); for (vtkPolyData data : datas) { if (data == null) { errors = true; continue; } - + solid.add(createActor(data)); - + if (showEdges) { vtkActor edgesActor = createEdgesActor(data); edges.add(edgesActor); @@ -129,57 +128,59 @@ public class vtkSolidObject { } actors.addAll(solid); actors.addAll(edges); - - showActorsAWT(); + + showActorsVTK(); } - + public boolean hasErrors() { return errors; } - + public List getActors() { - assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); + assert (Thread.currentThread() == panel.getThreadQueue().getThread()); return actors; } - + public List getSolid() { - assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); + assert (Thread.currentThread() == panel.getThreadQueue().getThread()); return solid; } - + public List getEdges() { - assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); + assert (Thread.currentThread() == panel.getThreadQueue().getThread()); return edges; } - + public vtkActor getSilhouette() { - assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); + assert (Thread.currentThread() == panel.getThreadQueue().getThread()); return silhouette; } - - public void showActorsAWT() { - assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); - vtkRenderer ren = panel.GetRenderer(); + + public void showActorsVTK() { + assert (Thread.currentThread() == panel.getThreadQueue().getThread()); + panel.lock(); + vtkRenderer ren = panel.getRenderer(); for (vtkProp3D act : actors) { ren.AddActor(act); } + panel.unlock(); } - + public void showActors() { - ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() { - + ThreadUtils.asyncExec(panel.getThreadQueue(), new Runnable() { + @Override public void run() { - showActorsAWT(); + showActorsVTK(); } }); } - - public void clearActorsAWT() { - assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); + + public void clearActorsVTK() { + assert (Thread.currentThread() == panel.getThreadQueue().getThread()); if (actors.size() == 0) return; - vtkRenderer ren = panel.GetRenderer(); + vtkRenderer ren = panel.getRenderer(); if (ren == null) return; panel.lock(); @@ -194,13 +195,13 @@ public class vtkSolidObject { solid.clear(); edges.clear(); } - + private void clearActorsAWT(List actors) { - assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); - + assert (Thread.currentThread() == panel.getThreadQueue().getThread()); + if (actors.size() == 0) return; - vtkRenderer ren = panel.GetRenderer(); + vtkRenderer ren = panel.getRenderer(); if (ren == null) return; panel.lock(); @@ -212,7 +213,7 @@ public class vtkSolidObject { } panel.unlock(); } - + public void clearActors() { if (actors.size() == 0) return; @@ -221,15 +222,15 @@ public class vtkSolidObject { actors.clear(); solid.clear(); edges.clear(); - ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() { - + ThreadUtils.asyncExec(panel.getThreadQueue(), new Runnable() { + @Override public void run() { clearActorsAWT(temp); } }); } - + public void dispose() { if (shape != null) { shape.delete(); @@ -237,29 +238,29 @@ public class vtkSolidObject { } clearActors(); } - + public void delete() { if (shape != null) { shape.delete(); shape = null; } - clearActorsAWT(); + 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()) { @@ -270,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; - - - + + + } }