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;
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<INode> {
+public class P3DNodeMap extends AbstractVTKNodeMap<Resource,INode> {
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<String> 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();
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);
}
ParameterizedNode geom = (ParameterizedNode)n;
for (String id : geom.getParameterMap().keySet()) {
if (ids.contains(id)) {
- node.visualize(panel);
+ node.visualize(view);
updateRenderObjectsFor(node);
updateTransform(node);
break;
}
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<IP3DNode> p = (ParentNode<IP3DNode>)node;
@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;
@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);
+ actorToNode.put(act, node);
}
+ if (DEBUG) System.out.println("Added " + node.getActors().size() + " actors");
if (node instanceof P3DParentNode<?>) {
for (IP3DNode n2 : ((P3DParentNode<?>)node).getNodes())
updateTransform(node);
- panel.unlock();
+ view.unlock();
}
}
private void remActor(IP3DVisualNode node) {
- if (Thread.currentThread() != AWTThread.getThreadAccess().getThread())
+ if (Thread.currentThread() != view.getThreadQueue().getThread())
throw new RuntimeException("Illegal thread.");
List<vtkProp> list = nodeToActor.getValues(node);
actorToNode.remove(obj);
}
nodeToActor.remove(node);
- panel.lock();
+ view.lock();
node.stopVisualize();
- panel.unlock();
+ view.unlock();
}
}
}
@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");
}
}
+
+ 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<Resource> equipment = new HashSet<>();
+ Set<Resource> 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<Resource> 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<Resource> 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<Resource> 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.");
+ }
+ }
+ }
+ }
}