X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Feditor%2FP3DNodeMap.java;h=8daee3a530e9286a725bf5b0a113f711fd507f86;hb=b93886889422a3111b05a6944b3bcb2cdd8c416a;hp=b098951346a114f6b1566ee798a6c20d358d88b1;hpb=22bb24d2a7e26c70b0dd4c57080f2c25ac3d40a8;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/editor/P3DNodeMap.java b/org.simantics.plant3d/src/org/simantics/plant3d/editor/P3DNodeMap.java index b0989513..8daee3a5 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/editor/P3DNodeMap.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/editor/P3DNodeMap.java @@ -9,12 +9,13 @@ import java.util.Set; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.Session; +import org.simantics.db.WriteGraph; import org.simantics.db.exception.DatabaseException; import org.simantics.g3d.ontology.G3D; import org.simantics.g3d.scenegraph.base.INode; import org.simantics.g3d.scenegraph.base.ParentNode; import org.simantics.g3d.vtk.common.AbstractVTKNodeMap; -import org.simantics.g3d.vtk.common.InteractiveVtkPanel; +import org.simantics.g3d.vtk.common.VtkView; import org.simantics.objmap.graph.IMapping; import org.simantics.plant3d.ontology.Plant3D; import org.simantics.plant3d.scenegraph.IP3DNode; @@ -25,22 +26,21 @@ import org.simantics.plant3d.scenegraph.ParameterizedNode; import org.simantics.plant3d.scenegraph.PipeRun; import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint; import org.simantics.plant3d.scenegraph.controlpoint.PipingRules; -import org.simantics.utils.threads.AWTThread; import vtk.vtkProp; import vtk.vtkProp3D; -public class P3DNodeMap extends AbstractVTKNodeMap { +public class P3DNodeMap extends AbstractVTKNodeMap { private static final boolean DEBUG = false; - public P3DNodeMap(Session session, IMapping mapping, InteractiveVtkPanel panel, P3DRootNode rootNode) { + public P3DNodeMap(Session session, IMapping mapping, VtkView panel, P3DRootNode rootNode) { super(session, mapping, panel, rootNode); rootNode.setNodeMap(this); } @Override protected void updateActor(INode n, Set ids) { - if (DEBUG) System.out.println("P3DNodeMap update " + n); + if (DEBUG) System.out.println("P3DNodeMap update " + debugString(n)); if (!(n instanceof IP3DVisualNode)) { if (n instanceof PipeControlPoint) { n = ((PipeControlPoint)n).getPipelineComponent(); @@ -54,14 +54,14 @@ public class P3DNodeMap extends AbstractVTKNodeMap { IP3DVisualNode node = (IP3DVisualNode)n; if (DEBUG) { - System.out.print("P3DNodeMap update " + node); + System.out.print("P3DNodeMap update " + debugString(node)); for (String s : ids) System.out.print(" " + s); System.out.println(); } if (ids.contains(Plant3D.URIs.hasGeometry)) { - node.visualize(panel); + node.visualize(view); updateRenderObjectsFor(node); updateTransform(node); } @@ -69,9 +69,9 @@ public class P3DNodeMap extends AbstractVTKNodeMap { ParameterizedNode geom = (ParameterizedNode)n; for (String id : geom.getParameterMap().keySet()) { if (ids.contains(id)) { - node.visualize(panel); + node.visualize(view); updateRenderObjectsFor(node); - updateTransform(node); + //updateTransform(node); break; } } @@ -83,7 +83,7 @@ public class P3DNodeMap extends AbstractVTKNodeMap { for (PipeControlPoint pcp : run.getControlPoints()) { updateActor(pcp, ids2); } - } + } if (ids.contains(G3D.URIs.hasPosition) || ids.contains(G3D.URIs.hasOrientation) || @@ -91,12 +91,16 @@ public class P3DNodeMap extends AbstractVTKNodeMap { ids.contains(G3D.URIs.hasWorldOrientation)) { updateTransform(node); } + if (ids.contains(Plant3D.URIs.HasTurnRadiusIndex)) { + node.visualize(view); + updateRenderObjectsFor(node); + } } private void updateTransform(IP3DNode node) { - if (DEBUG) System.out.println("P3DNodeMap update Transform " + node); + if (DEBUG) System.out.println("P3DNodeMap update Transform " + debugString(node)); - node.update(panel.GetRenderer()); + node.update(view.getRenderer()); if (node instanceof ParentNode) { ParentNode p = (ParentNode)node; @@ -119,7 +123,7 @@ public class P3DNodeMap extends AbstractVTKNodeMap { @Override protected void removeActor(INode n) { - if (DEBUG) System.out.println("P3DNodeMap.removeActor " + n); + if (DEBUG) System.out.println("P3DNodeMap.removeActor " + debugString(n)); if (!(n instanceof IP3DVisualNode)) return; IP3DVisualNode node = (IP3DVisualNode)n; @@ -134,24 +138,25 @@ public class P3DNodeMap extends AbstractVTKNodeMap { @Override protected void addActor(INode n) { - if (DEBUG) System.out.println("P3DNodeMap.addActor " + n); + if (DEBUG) System.out.println("P3DNodeMap.addActor " + debugString(n)); if (!(n instanceof IP3DVisualNode)) return; IP3DVisualNode node = (IP3DVisualNode)n; - if (hasActor(node)) + if (hasActor(node)) { + if (DEBUG) System.out.println("Node already has an actor"); return; - if (Thread.currentThread() != AWTThread.getThreadAccess().getThread()) + } + if (Thread.currentThread() != view.getThreadQueue().getThread()) throw new RuntimeException("Illegal thread."); - panel.lock(); + view.lock(); - node.visualize(panel); + node.visualize(view); - for (vtkProp3D act : node.getActors()) { - nodeToActor.add(node, act); - actorToNode.put(act, node); - } + map(node, node.getActors()); + + if (DEBUG) System.out.println("Added " + node.getActors().size() + " actors"); if (node instanceof P3DParentNode) { for (IP3DNode n2 : ((P3DParentNode)node).getNodes()) @@ -161,34 +166,29 @@ public class P3DNodeMap extends AbstractVTKNodeMap { updateTransform(node); - panel.unlock(); + view.unlock(); } private boolean hasActor(IP3DVisualNode node) { - List list = nodeToActor.getValues(node); + Collection list = getRenderObjects(node); if (list == null || list.size() == 0) return false; return true; } private void remActor(IP3DVisualNode node) { - if (Thread.currentThread() != AWTThread.getThreadAccess().getThread()) + if (Thread.currentThread() != view.getThreadQueue().getThread()) throw new RuntimeException("Illegal thread."); - List list = nodeToActor.getValues(node); - if (list != null) { - for (vtkProp obj : list) { - actorToNode.remove(obj); - } - nodeToActor.remove(node); - panel.lock(); - - node.stopVisualize(); - - panel.unlock(); + Collection list = getRenderObjects(node); + if (list.size() > 0) { + removeMap(node); + view.lock(); + node.stopVisualize(); + view.unlock(); } } @@ -201,12 +201,18 @@ public class P3DNodeMap extends AbstractVTKNodeMap { } @Override - public void commit() { + public void commit(String commitMessage) { validate(); // System.out.println("Graph commit"); - super.commit(); + super.commit(commitMessage); } + + @Override + protected void commit(WriteGraph graph) throws DatabaseException { + super.commit(graph); + validateGraph(graph); + } @Override protected void doCommit() { // System.out.println("Do commit"); @@ -242,5 +248,56 @@ public class P3DNodeMap extends AbstractVTKNodeMap { } } + + protected void validateGraph(ReadGraph graph) throws DatabaseException { + Plant3D P3D = Plant3D.getInstance(graph); + Resource root = (Resource)mapping.inverseGet(rootNode); + if (!graph.isInstanceOf(root, P3D.Plant)) + throw new DatabaseException("Root is not a Plant"); + Set equipment = new HashSet<>(); + Set pipeRuns = new HashSet<>(); + for (Resource r : graph.getObjects(root, P3D.children)) { + if (graph.isInstanceOf(r, P3D.Equipment)) { + equipment.add(r); + } else if (graph.isInstanceOf(r, P3D.PipeRun)) { + pipeRuns.add(r); + } else { + throw new DatabaseException("Unknown resource " + r+ " " + mapping.get(r)); + } + } + Set nozzles = new HashSet<>(); + for (Resource e : equipment) { + for (Resource n : graph.getObjects(e, P3D.HasNozzle)) { + if (graph.isInstanceOf(n, P3D.Nozzle)) { + nozzles.add(n); + } else { + throw new DatabaseException("Unknown nozzle resource " + n+ " " + mapping.get(n)); + } + } + } + + Set components = new HashSet<>(); + for (Resource run : pipeRuns) { + for (Resource c : graph.getObjects(run, P3D.children)) { + if (graph.isInstanceOf(c, P3D.PipelineComponent)) { + components.add(c); + } else { + throw new DatabaseException("Unknown component resource " + c + " " + mapping.get(c)); + } + } + } + + for (Resource c : components) { + for (Resource connected : graph.getObjects(c, P3D.Connects)) { + if (!components.contains(connected) && !nozzles.contains(connected)) { + throw new DatabaseException("Unbrowsable component resource " + connected + " " + mapping.get(connected) +" connected to " + c + " " + mapping.get(c)); + } + Collection connectedConnected = graph.getObjects(connected, P3D.Connects); + if (!connectedConnected.contains(c)) { + throw new DatabaseException("Component resource " + c + " " + mapping.get(c) + " is connected to " + connected + " " + mapping.get(connected) +", but its has no connection back."); + } + } + } + } }