1 package org.simantics.plant3d.editor;
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.HashSet;
9 import org.simantics.db.ReadGraph;
10 import org.simantics.db.Session;
11 import org.simantics.db.exception.DatabaseException;
12 import org.simantics.g3d.ontology.G3D;
13 import org.simantics.g3d.scenegraph.base.INode;
14 import org.simantics.g3d.scenegraph.base.ParentNode;
15 import org.simantics.g3d.vtk.common.AbstractVTKNodeMap;
16 import org.simantics.g3d.vtk.common.VtkView;
17 import org.simantics.objmap.graph.IMapping;
18 import org.simantics.plant3d.ontology.Plant3D;
19 import org.simantics.plant3d.scenegraph.IP3DNode;
20 import org.simantics.plant3d.scenegraph.IP3DVisualNode;
21 import org.simantics.plant3d.scenegraph.P3DParentNode;
22 import org.simantics.plant3d.scenegraph.P3DRootNode;
23 import org.simantics.plant3d.scenegraph.ParameterizedNode;
24 import org.simantics.plant3d.scenegraph.PipeRun;
25 import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint;
26 import org.simantics.plant3d.scenegraph.controlpoint.PipingRules;
31 public class P3DNodeMap extends AbstractVTKNodeMap<INode> {
33 private static final boolean DEBUG = false;
35 public P3DNodeMap(Session session, IMapping mapping, VtkView panel, P3DRootNode rootNode) {
36 super(session, mapping, panel, rootNode);
37 rootNode.setNodeMap(this);
40 protected void updateActor(INode n, Set<String> ids) {
41 if (DEBUG) System.out.println("P3DNodeMap update " + n);
42 if (!(n instanceof IP3DVisualNode)) {
43 if (n instanceof PipeControlPoint) {
44 n = ((PipeControlPoint)n).getPipelineComponent();
52 IP3DVisualNode node = (IP3DVisualNode)n;
55 System.out.print("P3DNodeMap update " + node);
57 System.out.print(" " + s);
61 if (ids.contains(Plant3D.URIs.hasGeometry)) {
63 updateRenderObjectsFor(node);
64 updateTransform(node);
66 if (n instanceof ParameterizedNode) {
67 ParameterizedNode geom = (ParameterizedNode)n;
68 for (String id : geom.getParameterMap().keySet()) {
69 if (ids.contains(id)) {
71 updateRenderObjectsFor(node);
72 updateTransform(node);
76 } else if (n instanceof PipeRun) {
77 // FIXME: may require rule based update!
78 PipeRun run = (PipeRun)n;
79 Set<String> ids2 = new HashSet<String>();
80 ids2.add(Plant3D.URIs.hasGeometry);
81 for (PipeControlPoint pcp : run.getControlPoints()) {
82 updateActor(pcp, ids2);
86 if (ids.contains(G3D.URIs.hasPosition) ||
87 ids.contains(G3D.URIs.hasOrientation) ||
88 ids.contains(G3D.URIs.hasWorldPosition) ||
89 ids.contains(G3D.URIs.hasWorldOrientation)) {
90 updateTransform(node);
94 private void updateTransform(IP3DNode node) {
95 if (DEBUG) System.out.println("P3DNodeMap update Transform " + node);
97 node.update(view.getRenderer());
99 if (node instanceof ParentNode<?>) {
100 ParentNode<IP3DNode> p = (ParentNode<IP3DNode>)node;
101 for (IP3DNode n : p.getNodes())
107 protected Collection<vtkProp> getActors(INode n) {
108 List<vtkProp> props = new ArrayList<vtkProp>();
109 if (!(n instanceof IP3DVisualNode))
111 IP3DVisualNode node = (IP3DVisualNode)n;
112 for (vtkProp3D p : ((IP3DVisualNode)node).getActors())
119 protected void removeActor(INode n) {
120 if (DEBUG) System.out.println("P3DNodeMap.removeActor " + n);
121 if (!(n instanceof IP3DVisualNode))
123 IP3DVisualNode node = (IP3DVisualNode)n;
126 if (node instanceof P3DParentNode<?>) {
127 for (IP3DNode n2 : ((P3DParentNode<?>)node).getNodes())
128 if (n2 instanceof IP3DVisualNode)
129 removeActor((IP3DVisualNode)n2);
134 protected void addActor(INode n) {
135 if (DEBUG) System.out.println("P3DNodeMap.addActor " + n);
136 if (!(n instanceof IP3DVisualNode))
138 IP3DVisualNode node = (IP3DVisualNode)n;
142 if (Thread.currentThread() != view.getThreadQueue().getThread())
143 throw new RuntimeException("Illegal thread.");
147 node.visualize(view);
149 for (vtkProp3D act : node.getActors()) {
150 nodeToActor.add(node, act);
151 actorToNode.put(act, node);
154 if (node instanceof P3DParentNode<?>) {
155 for (IP3DNode n2 : ((P3DParentNode<?>)node).getNodes())
156 if (n2 instanceof IP3DVisualNode)
157 addActor((IP3DVisualNode)n2);
160 updateTransform(node);
168 private boolean hasActor(IP3DVisualNode node) {
169 List<vtkProp> list = nodeToActor.getValues(node);
170 if (list == null || list.size() == 0)
175 private void remActor(IP3DVisualNode node) {
176 if (Thread.currentThread() != view.getThreadQueue().getThread())
177 throw new RuntimeException("Illegal thread.");
179 List<vtkProp> list = nodeToActor.getValues(node);
181 for (vtkProp obj : list) {
182 actorToNode.remove(obj);
184 nodeToActor.remove(node);
187 node.stopVisualize();
194 protected void update(ReadGraph graph) throws DatabaseException {
196 // System.out.println("Graph updates");
202 public void commit(String commitMessage) {
204 // System.out.println("Graph commit");
205 super.commit(commitMessage);
209 protected void doCommit() {
210 // System.out.println("Do commit");
215 private void validate() {
216 for (INode node : rootNode.getNodes()) {
217 if (node instanceof PipeRun)
218 PipingRules.validate((PipeRun)node);
223 public synchronized void preRender() {
224 // System.out.println("P3DNodeMap preRender");
225 // super.preRender();
227 // boolean b = false;
228 // synchronized (syncMutex) {
229 // b = PipingRules.update();
232 // super.preRender();
236 b = PipingRules.update();
238 } catch (Exception e) {