]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/common/SelectionHighlighter.java
Recomplied G3D ontologies and updated AnntotatedPropertyTabContrubutor
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / common / SelectionHighlighter.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.g3d.vtk.common;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.List;\r
17 \r
18 import org.eclipse.jface.viewers.ISelection;\r
19 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
20 import org.eclipse.jface.viewers.SelectionChangedEvent;\r
21 import org.simantics.g3d.scenegraph.IG3DNode;\r
22 import org.simantics.g3d.scenegraph.NodeHighlighter;\r
23 import org.simantics.g3d.scenegraph.NodeHighlighter.HighlightEventType;\r
24 import org.simantics.g3d.scenegraph.NodeHighlighter.HighlightObjectType;\r
25 import org.simantics.g3d.scenegraph.base.INode;\r
26 import org.simantics.g3d.tools.AdaptationUtils;\r
27 import org.simantics.utils.threads.AWTThread;\r
28 import org.simantics.utils.threads.ThreadUtils;\r
29 \r
30 import vtk.vtkActor;\r
31 import vtk.vtkAlgorithm;\r
32 import vtk.vtkAlgorithmOutput;\r
33 import vtk.vtkFeatureEdges;\r
34 import vtk.vtkMapper;\r
35 import vtk.vtkPanel;\r
36 import vtk.vtkProp;\r
37 import vtk.vtkProperty;\r
38 \r
39 public class SelectionHighlighter implements ISelectionChangedListener{\r
40 \r
41         \r
42         \r
43         vtkPanel panel;\r
44         VTKNodeMap nodeMap;\r
45         \r
46         List<IG3DNode> selectedNodes = new ArrayList<IG3DNode>();\r
47         List<vtkActor> selectedActors = new ArrayList<vtkActor>();\r
48         \r
49         HighlightObjectType type = HighlightObjectType.Node;\r
50         \r
51         public SelectionHighlighter(vtkPanel panel, VTKNodeMap nodeMap) {\r
52                 this.panel = panel;\r
53                 this.nodeMap = nodeMap;\r
54         }\r
55         \r
56         @Override\r
57         public void selectionChanged(SelectionChangedEvent event) {\r
58                 final ISelection s = event.getSelection();\r
59                 \r
60                 if (Thread.currentThread().equals(AWTThread.getThreadAccess().getThread()))\r
61                         highlight(s);\r
62                 else {\r
63                         ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {\r
64                                 @Override\r
65                                 public void run() {\r
66                                         highlight(s);\r
67                                         //System.out.println(this.getClass().getName() + " highlight ");\r
68                                         panel.Render();\r
69                                         //panel.repaint();\r
70                                 }\r
71                         });\r
72                 }\r
73                         \r
74         }\r
75         \r
76         protected void hilight(IG3DNode node, HighlightEventType type) {\r
77                 if (node instanceof NodeHighlighter) {\r
78                         ((NodeHighlighter)node).highlight(type);\r
79                         return;\r
80                 }\r
81                 if (type == HighlightEventType.Selection) {\r
82                         setSelectedColor(node); \r
83                 } else if (type == HighlightEventType.ClearSelection) {\r
84                         setDefaultColor(node);\r
85                 }\r
86         }\r
87         \r
88         protected void hilight(vtkActor actor, HighlightEventType type) {\r
89                 if (type == HighlightEventType.Selection) {\r
90                         setColor(actor,false,new double[]{1,0,0});\r
91                         setColor(actor,true,new double[]{1,0,1});\r
92                 } else if (type == HighlightEventType.ClearSelection) {\r
93                         setColor(actor,false,new double[]{1,1,0});\r
94                         setColor(actor,true,new double[]{0,0,0});\r
95                 }\r
96         }\r
97         \r
98         protected void highlight(ISelection s) {\r
99                 highlight(s, HighlightEventType.Selection, HighlightEventType.ClearSelection);\r
100         }\r
101         \r
102         protected void highlight(ISelection s, HighlightEventType apply, HighlightEventType clear) {\r
103         \r
104                 boolean changed = false;\r
105                 if (type == HighlightObjectType.Node) {\r
106                         Collection<IG3DNode> currentSelectedNodes = AdaptationUtils.adaptToCollection(s,IG3DNode.class);//getSelectedNodes(currentSelectedActors);\r
107                         if (currentSelectedNodes.size() == 0) {\r
108                                 Collection<vtkProp> currentSelectedActors = AdaptationUtils.adaptToCollection(s, vtkProp.class);\r
109                                 currentSelectedNodes = getSelectedNodes(currentSelectedActors);\r
110                         }\r
111                         for (IG3DNode node : selectedNodes) {\r
112                                 if (!currentSelectedNodes.contains(node)) {\r
113                                         hilight(node, clear);\r
114                                         changed = true;\r
115                                 }\r
116                         }\r
117                         for (IG3DNode node : currentSelectedNodes) {\r
118                                 if (!selectedNodes.contains(node)) {\r
119                                         hilight(node, apply);\r
120                                         changed = true;\r
121                                 }\r
122                         }\r
123                         selectedNodes.clear();\r
124                         selectedNodes.addAll(currentSelectedNodes);\r
125                         //selectedNodes = currentSelectedNodes;\r
126                         \r
127                 } else {\r
128                         \r
129                         Collection<vtkActor> currentSelectedActors = AdaptationUtils.adaptToCollection(s, vtkActor.class);\r
130                         \r
131                         for (vtkActor act : selectedActors) {\r
132                                 if (!currentSelectedActors.contains(act)) {\r
133                                         hilight(act,clear);\r
134                                         changed = true;\r
135                                 }\r
136                         }\r
137                         for (vtkActor act : currentSelectedActors) {\r
138                                 if (!selectedActors.contains(act)) {\r
139                                         hilight(act,apply);\r
140                                         changed = true;\r
141                                 }\r
142                         }\r
143                         selectedActors.clear();\r
144                         selectedActors.addAll(currentSelectedActors);\r
145                 }\r
146                 if (changed) {\r
147                         panel.repaint();\r
148                 }\r
149         }\r
150         \r
151         protected List<IG3DNode> getSelectedNodes(Collection<vtkProp> selectedActors) {\r
152                 List<IG3DNode> currentSelectedNodes = new ArrayList<IG3DNode>();\r
153                 \r
154                 for (vtkProp a : selectedActors) {\r
155                         INode node = nodeMap.getNode((vtkProp)a);\r
156                         if (node == null || !(node instanceof IG3DNode))\r
157                                 continue;\r
158                         if (!currentSelectedNodes.contains(node))\r
159                                 currentSelectedNodes.add((IG3DNode)node);\r
160                 }\r
161                 return currentSelectedNodes;\r
162         }\r
163         \r
164         protected void setDefaultColor(IG3DNode node) {\r
165                 double color[] = new double[]{1,1,0};\r
166                 setColor(node, false, color);\r
167         }\r
168         \r
169         protected void setSelectedColor(IG3DNode node) {\r
170                 double color[] = new double[]{1,0,0};\r
171                 setColor(node, false, color);\r
172         }\r
173         \r
174         \r
175         protected void setColor(IG3DNode node, boolean edge, double color[]) {\r
176                 for (vtkProp prop : nodeMap.getRenderObjects(node)) {\r
177                         if (prop instanceof vtkActor) {\r
178                                 vtkActor act = (vtkActor)prop;\r
179                                 setColor(act, edge, color);\r
180                         }\r
181                 }\r
182         }\r
183         \r
184         protected void setColor(vtkActor act, boolean edge, double color[]) {\r
185                 \r
186                 vtkMapper mapper = act.GetMapper();\r
187                 vtkAlgorithmOutput out = mapper.GetInputConnection(0, 0);\r
188                 vtkAlgorithm producer = out.GetProducer();\r
189                 boolean isEdge = (producer instanceof vtkFeatureEdges);\r
190                 producer.Delete();\r
191                 if (isEdge == edge) {\r
192                         vtkProperty property = act.GetProperty();\r
193                         property.SetColor(color);\r
194                         property.Delete();\r
195                 }\r
196                 out.Delete();\r
197                 mapper.Delete();\r
198         }\r
199 }\r