]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.opencascade.vtk/src/org/simantics/opencascade/vtk/vtkSolidObject.java
Using SWT thread with Plant3d
[simantics/3d.git] / org.simantics.opencascade.vtk / src / org / simantics / opencascade / vtk / vtkSolidObject.java
index fd2c0bb1d6bc6637d7e613d671457fdd5e855a25..797c9ae23298d6fb796be43cd0058a3e3f6be069 100644 (file)
@@ -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;
@@ -50,7 +49,7 @@ public class vtkSolidObject {
        public static boolean cleanPart = false;
        public static boolean mergePoints = false;
        
-       private vtkPanel panel;
+       private VtkView panel;
        private TopoDS_Shape shape;
        
        private List<vtkProp3D> actors = new ArrayList<vtkProp3D>(2);
@@ -61,7 +60,7 @@ public class vtkSolidObject {
        
        private boolean errors = false;
        
-       public vtkSolidObject(vtkPanel panel,TopoDS_Shape shape) {
+       public vtkSolidObject(VtkView panel,TopoDS_Shape shape) {
                this.shape = shape;
                this.panel = panel;
        }
@@ -75,7 +74,7 @@ public class vtkSolidObject {
        }
        
        public void visualizeSolid(boolean showFaces, boolean showEdges, boolean showVertices, boolean showSilhouette) {
-               clearActorsAWT();
+               clearActorsVTK();
                errors = false;
                Pair<vtkPolyData, Boolean> res = createSolidMesh(shape);
                if (res == null) {
@@ -96,19 +95,19 @@ 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<vtkPolyData> datas = createFaceMeshes(shape);
                for (vtkPolyData data : datas) {
                        if (data == null) {
@@ -130,7 +129,7 @@ public class vtkSolidObject {
                actors.addAll(solid);
                actors.addAll(edges);
                
-               showActorsAWT();
+               showActorsVTK();
        }
        
        public boolean hasErrors() {
@@ -138,65 +137,73 @@ public class vtkSolidObject {
        }
        
        public List<vtkProp3D> getActors() {
-               assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread());
+               assert (Thread.currentThread() == panel.getThreadQueue().getThread());
                return actors;
        }
        
        public List<vtkProp3D> getSolid() {
-               assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread());
+               assert (Thread.currentThread() == panel.getThreadQueue().getThread());
                return solid;
        }
        
        public List<vtkProp3D> 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();
                for (vtkProp3D act : actors) {
                        if (act.GetVTKId() != 0) {
                                ren.RemoveActor(act);
                                act.Delete();
                        }
                }
+               panel.unlock();
                actors.clear();
                solid.clear();
                edges.clear();
        }
        
        private void clearActorsAWT(List<vtkProp3D> 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();
                for (vtkProp3D act : actors) {
                        if (act.GetVTKId() != 0) {
@@ -215,7 +222,7 @@ 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() {
@@ -237,7 +244,7 @@ public class vtkSolidObject {
                        shape.delete();
                        shape = null;
                }
-               clearActorsAWT();
+               clearActorsVTK();
        }
        
        private static double TOLERANCE = 0.01;