1 /*******************************************************************************
2 * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.g3d.vtk.common;
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.List;
18 import org.eclipse.jface.viewers.ISelection;
19 import org.eclipse.jface.viewers.ISelectionChangedListener;
20 import org.eclipse.jface.viewers.SelectionChangedEvent;
21 import org.simantics.g3d.scenegraph.IG3DNode;
22 import org.simantics.g3d.scenegraph.NodeHighlighter;
23 import org.simantics.g3d.scenegraph.NodeHighlighter.HighlightEventType;
24 import org.simantics.g3d.scenegraph.NodeHighlighter.HighlightObjectType;
25 import org.simantics.g3d.scenegraph.base.INode;
26 import org.simantics.g3d.tools.AdaptationUtils;
27 import org.simantics.utils.threads.AWTThread;
28 import org.simantics.utils.threads.ThreadUtils;
31 import vtk.vtkAlgorithm;
32 import vtk.vtkAlgorithmOutput;
33 import vtk.vtkFeatureEdges;
36 import vtk.vtkProperty;
38 public class SelectionHighlighter<DBObject> implements ISelectionChangedListener {
40 protected VtkView panel;
41 protected VTKNodeMap<DBObject,?> nodeMap;
43 protected List<IG3DNode> selectedNodes = new ArrayList<IG3DNode>();
44 protected List<vtkActor> selectedActors = new ArrayList<vtkActor>();
46 protected HighlightObjectType type = HighlightObjectType.Node;
48 public SelectionHighlighter(VtkView panel, VTKNodeMap<DBObject,?> nodeMap) {
50 this.nodeMap = nodeMap;
54 public void selectionChanged(SelectionChangedEvent event) {
55 final ISelection s = event.getSelection();
57 if (Thread.currentThread().equals(panel.getThreadQueue().getThread()))
60 ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() {
64 //System.out.println(this.getClass().getName() + " highlight ");
73 protected void hilight(INode node, HighlightEventType type) {
74 if (node instanceof NodeHighlighter) {
75 ((NodeHighlighter)node).highlight(type);
78 if (type == HighlightEventType.Selection) {
79 setSelectedColor(node);
80 } else if (type == HighlightEventType.ClearSelection) {
81 setDefaultColor(node);
85 protected void hilight(vtkActor actor, HighlightEventType type) {
86 if (type == HighlightEventType.Selection) {
87 setColor(actor,false,new double[]{1,0,0});
88 setColor(actor,true,new double[]{1,0,1});
89 } else if (type == HighlightEventType.ClearSelection) {
90 setColor(actor,false,new double[]{1,1,0});
91 setColor(actor,true,new double[]{0,0,0});
95 protected void highlight(ISelection s) {
96 highlight(s, HighlightEventType.Selection, HighlightEventType.ClearSelection);
99 protected void highlight(ISelection s, HighlightEventType apply, HighlightEventType clear) {
101 boolean changed = false;
102 if (type == HighlightObjectType.Node) {
103 Collection<IG3DNode> currentSelectedNodes = AdaptationUtils.adaptToCollection(s,IG3DNode.class);//getSelectedNodes(currentSelectedActors);
104 if (currentSelectedNodes.size() == 0) {
105 Collection<vtkProp> currentSelectedActors = AdaptationUtils.adaptToCollection(s, vtkProp.class);
106 currentSelectedNodes = getSelectedNodes(currentSelectedActors);
108 for (IG3DNode node : selectedNodes) {
109 if (!currentSelectedNodes.contains(node)) {
110 hilight((INode)node, clear);
114 for (IG3DNode node : currentSelectedNodes) {
115 if (!selectedNodes.contains(node)) {
116 hilight((INode)node, apply);
120 selectedNodes.clear();
121 selectedNodes.addAll(currentSelectedNodes);
122 //selectedNodes = currentSelectedNodes;
126 Collection<vtkActor> currentSelectedActors = AdaptationUtils.adaptToCollection(s, vtkActor.class);
128 for (vtkActor act : selectedActors) {
129 if (!currentSelectedActors.contains(act)) {
134 for (vtkActor act : currentSelectedActors) {
135 if (!selectedActors.contains(act)) {
140 selectedActors.clear();
141 selectedActors.addAll(currentSelectedActors);
148 protected List<IG3DNode> getSelectedNodes(Collection<vtkProp> selectedActors) {
149 List<IG3DNode> currentSelectedNodes = new ArrayList<IG3DNode>();
151 for (vtkProp a : selectedActors) {
152 INode node = nodeMap.getNode((vtkProp)a);
153 if (node == null || !(node instanceof IG3DNode))
155 if (!currentSelectedNodes.contains(node))
156 currentSelectedNodes.add((IG3DNode)node);
158 return currentSelectedNodes;
161 protected void setDefaultColor(INode node) {
162 double color[] = new double[]{1,1,0};
163 setColor(node, false, color);
166 protected void setSelectedColor(INode node) {
167 double color[] = new double[]{1,0,0};
168 setColor(node, false, color);
171 public void setColor(INode node, boolean edge, double color[]) {
172 for (vtkProp prop : nodeMap.getRenderObjects(node)) {
173 if (prop instanceof vtkActor) {
174 vtkActor act = (vtkActor)prop;
175 setColor(act, edge, color);
180 protected void setColor(vtkActor act, boolean edge, double color[]) {
182 vtkMapper mapper = act.GetMapper();
183 vtkAlgorithmOutput out = mapper.GetInputConnection(0, 0);
184 vtkAlgorithm producer = out.GetProducer();
185 boolean isEdge = (producer instanceof vtkFeatureEdges);
187 if (isEdge == edge) {
188 vtkProperty property = act.GetProperty();
189 property.SetColor(color);