X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Feditor%2FPlant3DEditor.java;h=44e6529287bfb3ba9fd875098b8af6a2ca121668;hb=fddb02784e899fa450169a561d96cd883a222ef8;hp=5015e6ea4b8dd9d2e4dfb8798c92f06b6834c757;hpb=d00bd5522f6a92bbfeb2a72a7d28ba25c3f36fed;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/editor/Plant3DEditor.java b/org.simantics.plant3d/src/org/simantics/plant3d/editor/Plant3DEditor.java index 5015e6ea..44e65292 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/editor/Plant3DEditor.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/editor/Plant3DEditor.java @@ -1,5 +1,6 @@ package org.simantics.plant3d.editor; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -23,14 +24,17 @@ 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; import org.simantics.g3d.vtk.common.NodeSelectionProvider2; import org.simantics.g3d.vtk.common.SelectionHighlighter; +import org.simantics.g3d.vtk.common.VTKSelectionItem; import org.simantics.g3d.vtk.common.VtkView; import org.simantics.g3d.vtk.shape.vtkShape; import org.simantics.g3d.vtk.swt.ContextMenuListener; +import org.simantics.g3d.vtk.swt.FocusAction; import org.simantics.g3d.vtk.swt.InteractiveVtkComposite; import org.simantics.g3d.vtk.swt.RotateAction; import org.simantics.g3d.vtk.swt.TranslateAction; @@ -42,20 +46,21 @@ 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.TranslateFreeVariableLengthAction; 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; @@ -71,6 +76,7 @@ import vtk.vtkActor; import vtk.vtkCameraPass; import vtk.vtkDefaultPass; import vtk.vtkLightsPass; +import vtk.vtkProp; import vtk.vtkRenderPassCollection; import vtk.vtkRenderer; import vtk.vtkSequencePass; @@ -87,15 +93,19 @@ public class Plant3DEditor extends ResourceEditorPart { private P3DRootNode rootNode; private IMapping mapping; - private NodeSelectionProvider2 selectionProvider; + protected NodeSelectionProvider2 selectionProvider; - private vtkCameraAndSelectorAction cameraAction; - private TranslateAction translateAction; - private TranslateInlineAction translateInlineAction; - private RotateAction rotateAction; - private RemoveAction removeAction; - private RoutePipeAction routePipeAction; - private AddComponentAction addComponentAction; + + protected vtkCameraAndSelectorAction cameraAction; + protected FocusAction focusAction; + protected TranslateAction translateAction; + protected TranslateInlineAction translateInlineAction; + protected TranslateFreeVariableLengthAction translateFreeVariableLengthAction; + protected RotateAction rotateAction; + protected RemoveAction removeAction; + protected RemoveAndSplitAction removeSplitAction; + protected RoutePipeAction routePipeAction; + protected AddComponentAction addComponentAction; private P3DNodeMap nodeMap; @@ -127,18 +137,16 @@ public class Plant3DEditor extends ResourceEditorPart { hookContextMenu(); createScene(); - - //component.syncPopulate(); 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 +159,23 @@ 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 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); + nodeMap = createNodeMap(getSession(), mapping, panel,rootNode); + + } catch (Exception e) { + throw new DatabaseException(e); + } + + System.out.println("END PLANT3D LOAD"); } }); @@ -171,12 +183,12 @@ public class Plant3DEditor extends ResourceEditorPart { throw new RuntimeException("Scenegraph loading failed."); populate(); - selectionProvider = new NodeSelectionProvider2(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,19 +220,41 @@ public class Plant3DEditor extends ResourceEditorPart { } + protected vtkCameraAndSelectorAction createCameraAction() { + return new vtkCameraAndSelectorAction(panel); + } + + protected NodeSelectionProvider2 createSelectionProvider() { + return new NodeSelectionProvider2(this,mapping,nodeMap); + } + + protected HoverHighlighter createHoverHighlhighter() { + return new HoverHighlighter(panel,nodeMap); + } + + protected SelectionHighlighter createSelectionHighlighter() { + return new SelectionHighlighter(panel,nodeMap); + } + + protected String getLibraryUri() { + return Plant3D.URIs.Builtin; + } + protected void createActions() { - translateAction = new TranslateAction(panel,nodeMap); - translateInlineAction = new TranslateInlineAction(panel, nodeMap); - rotateAction = new RotateAction(panel,nodeMap); - removeAction = new RemoveAction(nodeMap) { - public void setNode(IG3DNode node) { - super.setNode(node); - - - } - }; - routePipeAction = new RoutePipeAction(panel,rootNode); - addComponentAction = new AddComponentAction(panel, rootNode); + focusAction = new FocusAction(panel, cameraAction); + translateAction = new TranslateAction(panel,nodeMap); + translateInlineAction = new TranslateInlineAction(panel, nodeMap); + translateFreeVariableLengthAction = new TranslateFreeVariableLengthAction(panel, getRootNode()); + rotateAction = new RotateAction(panel,nodeMap); + 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, getLibraryUri()); } public void populate() { @@ -229,6 +263,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); + + } + }); + } }); @@ -240,7 +295,7 @@ public class Plant3DEditor extends ResourceEditorPart { } protected P3DNodeMap createNodeMap(Session session, IMapping mapping, VtkView panel, P3DRootNode rootNode) { - return new P3DNodeMap(session, mapping, panel,rootNode); + return new P3DNodeMap(session, mapping, panel,rootNode); } @Override @@ -283,36 +338,49 @@ public class Plant3DEditor extends ResourceEditorPart { ren1.SetBackground(0.9,0.9,0.9); ren1.SetGradientBackground(true); - // vtkActor grid = vtkShape.createGridActor(8,1.0,1|2|4); - vtkActor grid = vtkShape.createGridActor(8,1.0, 2 ); - grid.SetPickable(0); - ren1.AddActor(grid); - panel.addDeletable(grid); - - AxesDisplay axesDisplay = new AxesDisplay(panel); - axesDisplay.show(); + // vtkActor grid = vtkShape.createGridActor(8,1.0,1|2|4); + vtkActor grid = vtkShape.createGridActor(8,1.0, 2 ); + grid.SetPickable(0); + ren1.AddActor(grid); + panel.addDeletable(grid); + + AxesDisplay axesDisplay = new AxesDisplay(panel); + axesDisplay.show(); } protected Menu contextMenu; protected void hookContextMenu() { - MenuManager menuMgr = new MenuManager("#PopupMenu"); - menuMgr.setRemoveAllWhenShown(true); - menuMgr.addMenuListener(new IMenuListener() { - public void menuAboutToShow(IMenuManager manager) { - createContextMenu(manager); - } - }); + MenuManager menuMgr = new MenuManager("#PopupMenu"); + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(new IMenuListener() { + public void menuAboutToShow(IMenuManager manager) { + createContextMenu(manager); + } + }); - contextMenu = menuMgr.createContextMenu(parent); - } + contextMenu = menuMgr.createContextMenu(parent); + } protected void createContextMenu(IMenuManager m) { - List selected = selectionProvider.getSelectedNodes(); + List selected = selectionProvider.getSelectedNodes(); + List> selectedItems = selectionProvider.getSelectedItems(); + if (selectedItems.size() > 0) { + List props = new ArrayList<>(); + for (VTKSelectionItem i : selectedItems) { + vtkProp p = (vtkProp)i.getAdapter(vtkProp.class); + if (p != null) + props.add(p); + } + if (props.size() > 0) { + focusAction.setProps(props); + m.add(focusAction); + } + } 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,22 +388,24 @@ 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()) { - m.add(translateAction); - m.add(rotateAction); - } + Nozzle nozzle = (Nozzle)node; + if (!nozzle.isFixed()) { + m.add(translateAction); + m.add(rotateAction); + } m.add(routePipeAction); routePipeAction.setComponent(nozzle); 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,30 +414,43 @@ 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; - m.add(translateInlineAction); + if (component.isVariableLength()) + m.add(translateFreeVariableLengthAction); + else + m.add(translateInlineAction); m.add(routePipeAction); 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); + translateFreeVariableLengthAction.setNode(node); rotateAction.setNode(node); removeAction.setNode(node); } } catch (DatabaseException e) { - ExceptionUtils.logAndShowError(e); - } + ExceptionUtils.logAndShowError(e); + } } private IContentOutlinePage createOutline() { @@ -422,6 +505,10 @@ public class Plant3DEditor extends ResourceEditorPart { return result; } + public InteractiveVtkComposite getPanel() { + return panel; + } + public P3DRootNode getRootNode() { return rootNode; } @@ -429,4 +516,8 @@ public class Plant3DEditor extends ResourceEditorPart { public IMapping getMapping() { return mapping; } + + public P3DNodeMap getNodeMap() { + return nodeMap; + } }