]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/editor/Plant3DEditor.java
Use generics type variable for mapping db object.
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / editor / Plant3DEditor.java
index ba56f2f9201d0d1ca3d0c09dada69d7ee2284888..d3f3c5e47e11d199b838225ee16f7afa6a0fd4e0 100644 (file)
@@ -23,6 +23,7 @@ import org.simantics.db.common.request.ReadRequest;
 import org.simantics.db.exception.DatabaseException;
 import org.simantics.g3d.scenegraph.IG3DNode;
 import org.simantics.g3d.scenegraph.NodeMap;
+import org.simantics.g3d.scenegraph.RenderListener;
 import org.simantics.g3d.scenegraph.base.INode;
 import org.simantics.g3d.vtk.action.RemoveAction;
 import org.simantics.g3d.vtk.common.HoverHighlighter;
@@ -42,20 +43,20 @@ import org.simantics.objmap.graph.schema.IMappingSchema;
 import org.simantics.plant3d.actions.AddComponentAction;
 import org.simantics.plant3d.actions.AddEquipmentAction;
 import org.simantics.plant3d.actions.AddNozzleAction;
+import org.simantics.plant3d.actions.RemoveAndSplitAction;
 import org.simantics.plant3d.actions.RoutePipeAction;
 import org.simantics.plant3d.actions.TranslateInlineAction;
+import org.simantics.plant3d.ontology.Plant3D;
 import org.simantics.plant3d.scenegraph.EndComponent;
 import org.simantics.plant3d.scenegraph.Equipment;
 import org.simantics.plant3d.scenegraph.IP3DNode;
 import org.simantics.plant3d.scenegraph.InlineComponent;
 import org.simantics.plant3d.scenegraph.Nozzle;
 import org.simantics.plant3d.scenegraph.P3DRootNode;
-import org.simantics.plant3d.scenegraph.PipeRun;
 import org.simantics.plant3d.scenegraph.PipelineComponent;
 import org.simantics.plant3d.scenegraph.SchemaBuilder;
 import org.simantics.plant3d.scenegraph.TurnComponent;
 import org.simantics.plant3d.scenegraph.controlpoint.ControlPointFactory;
-import org.simantics.plant3d.scenegraph.controlpoint.PipeControlPoint;
 import org.simantics.plant3d.scenegraph.controlpoint.PipingRules;
 import org.simantics.plant3d.utils.ComponentUtils;
 import org.simantics.plant3d.utils.Item;
@@ -94,6 +95,7 @@ public class Plant3DEditor extends ResourceEditorPart {
        private TranslateInlineAction translateInlineAction;
        private RotateAction rotateAction;
        private RemoveAction removeAction;
+       private RemoveAndSplitAction removeSplitAction;
        private RoutePipeAction routePipeAction;
        private AddComponentAction addComponentAction;
        
@@ -132,13 +134,13 @@ public class Plant3DEditor extends ResourceEditorPart {
                
                new ContextMenuListener(panel, contextMenu);
                
-               cameraAction = new vtkCameraAndSelectorAction(panel);   
+               cameraAction = createCameraAction();
                panel.setDefaultAction(cameraAction);
                panel.useDefaultAction();
                panel.setPickType(4);
                
                try {
-                       ControlPointFactory.preloadCache();
+                       ControlPointFactory.preloadCache(getLibraryUri());
                        ComponentUtils.preloadCache();
                } catch (Exception e) {
                        ExceptionUtils.logAndShowError("Cannot open Plant3D editor",e);
@@ -151,19 +153,25 @@ public class Plant3DEditor extends ResourceEditorPart {
                                @SuppressWarnings({ "rawtypes", "unchecked" })
                                @Override
                                public void run(ReadGraph graph) throws DatabaseException {
+                                   System.out.println("START PLANT3D LOAD");
                                        PipingRules.setEnabled(false);
                                        IMappingSchema<Resource, Object> schema = getSchema(graph);
                                        mapping = Mappings.createWithListening(schema);
                                        rootNode = (P3DRootNode)mapping.map(graph, input);
                                        // update control points.
                                        // TODO : this should be optimized.
+                                       
+                                       
+                                       
                                        try {
-                                               P3DUtil.finalizeDBLoad(rootNode);
-                                               
-                                       } catch (Exception e) {
-                                               throw new DatabaseException(e);
-                                       }
-                                       nodeMap = createNodeMap(getSession(), mapping, panel,rootNode);
+                                           P3DUtil.finalizeDBLoad(rootNode);
+                                           nodeMap = createNodeMap(getSession(), mapping, panel,rootNode);
+                                          
+                    } catch (Exception e) {
+                        throw new DatabaseException(e);
+                    }
+                                       
+                                       System.out.println("END PLANT3D LOAD");
                                }
                        });
                        
@@ -171,12 +179,12 @@ public class Plant3DEditor extends ResourceEditorPart {
                                throw new RuntimeException("Scenegraph loading failed.");
                        populate();
                        
-                       selectionProvider = new NodeSelectionProvider2<Resource,Object>(this,mapping,nodeMap);
+                       selectionProvider = createSelectionProvider();
 
                        cameraAction.addSelectionChangedListener(selectionProvider);
 
-                       cameraAction.addHoverChangedListener(new HoverHighlighter(panel,nodeMap));
-                       selectionProvider.addSelectionChangedListener(new SelectionHighlighter(panel,nodeMap));
+                       cameraAction.addHoverChangedListener(createHoverHighlhighter());
+                       selectionProvider.addSelectionChangedListener(createSelectionHighlighter());
                        
                        getSite().setSelectionProvider(selectionProvider);
                        getSite().getPage().addPostSelectionListener(selectionProvider);
@@ -208,6 +216,26 @@ public class Plant3DEditor extends ResourceEditorPart {
                
        }
        
+       protected vtkCameraAndSelectorAction createCameraAction() {
+           return new vtkCameraAndSelectorAction(panel); 
+       }
+       
+       protected NodeSelectionProvider2<Resource,Object> createSelectionProvider() {
+           return new NodeSelectionProvider2<Resource,Object>(this,mapping,nodeMap);
+       }
+       
+       protected HoverHighlighter createHoverHighlhighter() {
+           return new HoverHighlighter(panel,nodeMap);
+       }
+       
+       protected SelectionHighlighter<Resource,INode> createSelectionHighlighter() {
+           return new SelectionHighlighter<Resource,INode>(panel,nodeMap);
+       }
+       
+       protected String getLibraryUri() {
+           return Plant3D.URIs.Builtin;
+       }
+       
        protected void createActions() {
                translateAction = new TranslateAction(panel,nodeMap);
                translateInlineAction = new TranslateInlineAction(panel, nodeMap);
@@ -215,12 +243,12 @@ public class Plant3DEditor extends ResourceEditorPart {
                removeAction = new RemoveAction(nodeMap) {
                        public void setNode(IG3DNode node) {
                                super.setNode(node);
-                               
-                               
                        }
                };
+               
+               removeSplitAction = new RemoveAndSplitAction(nodeMap);
                routePipeAction = new RoutePipeAction(panel,rootNode);
-               addComponentAction = new AddComponentAction(panel, rootNode);
+               addComponentAction = new AddComponentAction(panel, rootNode, getLibraryUri());
        }
        
        public void populate() {
@@ -229,6 +257,27 @@ public class Plant3DEditor extends ResourceEditorPart {
                        @Override
                        public void run() {
                                nodeMap.populate();
+                               panel.addListener(new RenderListener() {
+                    
+                    @Override
+                    public void preRender() {
+                   
+                    }
+                    
+                    @Override
+                    public void postRender() {
+                        try {
+                            P3DUtil.finalizeDBLoad2(rootNode);
+                            if (nodeMap.isRangeModified());
+                                nodeMap.commit("Load sync");
+                        } catch (Exception e) {
+                            //throw new DatabaseException(e);
+                        }
+                        panel.removeListener(this);  
+                        
+                    }
+                });
+                               
                        }
                });
                
@@ -312,7 +361,7 @@ public class Plant3DEditor extends ResourceEditorPart {
                List<IG3DNode> selected = selectionProvider.getSelectedNodes();
                try {
                        if (selected.size() == 0) {
-                               for (Item eq : P3DUtil.getEquipments()) {
+                               for (Item eq : P3DUtil.getEquipments(getLibraryUri())) {
                                        m.add(new AddEquipmentAction(rootNode, eq));
                                }
                        } else if (selected.size() == 1) {
@@ -320,11 +369,12 @@ public class Plant3DEditor extends ResourceEditorPart {
                                if (node instanceof Equipment) {
                                        m.add(translateAction);
                                        m.add(rotateAction);
-                                       for (Item eq : P3DUtil.getNozzles()) {
+                                       for (Item eq : P3DUtil.getNozzles(getLibraryUri())) {
                                                AddNozzleAction add = new AddNozzleAction(rootNode, eq);
                                                add.setEquipment((Equipment)node);
                                                m.add(add);
                                        }
+                                       m.add(removeAction);
                                } else if (node instanceof Nozzle) {
                                        Nozzle nozzle = (Nozzle)node;
                                        if (!nozzle.isFixed()) {
@@ -336,6 +386,7 @@ public class Plant3DEditor extends ResourceEditorPart {
                                        routePipeAction.setEnabled(nozzle.getNext() == null && nozzle.getPrevious() == null);
                                        m.add(addComponentAction);
                                        addComponentAction.setComponent(nozzle);
+                                       m.add(removeAction);
                                } else if (node instanceof TurnComponent) {
                                        m.add(translateAction);
                                        TurnComponent component = (TurnComponent)node;
@@ -344,10 +395,14 @@ public class Plant3DEditor extends ResourceEditorPart {
                                        routePipeAction.setEnabled(component.getNext() == null || component.getPrevious() == null);
                                        m.add(addComponentAction);
                                        addComponentAction.setComponent(component);
+                                       m.add(removeAction);
+                                       m.add(removeSplitAction);
+                                       removeSplitAction.setNode(node);
                                } else if (node instanceof EndComponent) {
                                        m.add(translateAction);
                                        m.add(addComponentAction);
                                        addComponentAction.setComponent((PipelineComponent)node);
+                                       m.add(removeAction);
                                } else if (node instanceof InlineComponent) {
                                        //m.add(translateInlineAction);
                                        InlineComponent component = (InlineComponent)node;
@@ -356,9 +411,14 @@ public class Plant3DEditor extends ResourceEditorPart {
                                        routePipeAction.setComponent(component);
                                        m.add(addComponentAction);
                                        addComponentAction.setComponent(component);
+                                       m.add(removeAction);
+                                       m.add(removeSplitAction);
+                                       removeSplitAction.setNode(node);
+                               } else {
+                                   m.add(removeAction);
                                }
                                
-                               m.add(removeAction);
+                               
                                translateAction.setNode(node);
                                translateInlineAction.setNode(node);
                                rotateAction.setNode(node);
@@ -422,6 +482,10 @@ public class Plant3DEditor extends ResourceEditorPart {
                return result;
        }
        
+       public InteractiveVtkComposite getPanel() {
+        return panel;
+    }
+       
        public P3DRootNode getRootNode() {
                return rootNode;
        }
@@ -429,4 +493,8 @@ public class Plant3DEditor extends ResourceEditorPart {
        public IMapping<Resource, Object> getMapping() {
                return mapping;
        }
+       
+       public P3DNodeMap getNodeMap() {
+        return nodeMap;
+    }
 }