X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Feditor%2FPlant3DEditor.java;h=9051d44a55f0c79aa92e00078d19bf61296af3d0;hb=9817ec2aa0d2afada7024d2aba0cd7562de317ed;hp=82d592c4d4b8b8c0c95652b81b4d6819f72dd899;hpb=7531a473ca1fa611ae1a1b84b09f89effd4fa919;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 82d592c4..9051d44a 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; @@ -7,9 +8,12 @@ import java.util.Set; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.FillLayout; @@ -21,16 +25,19 @@ import org.simantics.db.Resource; import org.simantics.db.Session; 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.toolbar.ToolComposite; 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; @@ -43,14 +50,18 @@ 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.ReversePipeRunAction; 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; @@ -69,40 +80,52 @@ import org.simantics.utils.ui.ExceptionUtils; import vtk.vtkActor; import vtk.vtkCameraPass; import vtk.vtkDefaultPass; +import vtk.vtkGaussianBlurPass; import vtk.vtkLightsPass; +import vtk.vtkProp; import vtk.vtkRenderPassCollection; import vtk.vtkRenderer; +import vtk.vtkSSAAPass; import vtk.vtkSequencePass; +import vtk.vtkSimpleMotionBlurPass; public class Plant3DEditor extends ResourceEditorPart { private Composite parent; + protected ToolComposite toolComposite; private Resource input; // private InteractiveVtkPanel panel; // private SWTAWTComponent component; private InteractiveVtkComposite panel; + private P3DRootNode rootNode; - private IMapping mapping; + private IMapping mapping; + + protected NodeSelectionProvider2 selectionProvider; - private NodeSelectionProvider2 selectionProvider; - private vtkCameraAndSelectorAction cameraAction; - private TranslateAction translateAction; - private TranslateInlineAction translateInlineAction; - private RotateAction rotateAction; - private RemoveAction removeAction; - private RemoveAndSplitAction removeSplitAction; - 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; + protected ReversePipeRunAction reversePipeRunAction; private P3DNodeMap nodeMap; @Override public void createPartControl(Composite parent) { this.parent = parent; - parent.setLayout (new FillLayout ()); + //parent.setLayout (new FillLayout ()); + + // component = new SWTAWTComponent(parent,SWT.NONE) { // // @Override @@ -119,16 +142,22 @@ public class Plant3DEditor extends ResourceEditorPart { IResourceEditorInput rei = (IResourceEditorInput)getEditorInput(); input = rei.getResource(); + toolComposite = new ToolComposite(parent, SWT.BORDER); + toolComposite.setVisible(true); + panel = new InteractiveVtkComposite(parent); + GridLayoutFactory.fillDefaults().margins(0, 0).spacing(0, 0).applyTo(parent); + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(getPanel().getComponent()); + + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, false).applyTo(toolComposite); + //IActionBars actionBars = getEditorSite().getActionBars(); hookContextMenu(); createScene(); - - //component.syncPopulate(); new ContextMenuListener(panel, contextMenu); @@ -138,7 +167,7 @@ public class Plant3DEditor extends ResourceEditorPart { panel.setPickType(4); try { - ControlPointFactory.preloadCache(); + ControlPointFactory.preloadCache(getLibraryUri()); ComponentUtils.preloadCache(); } catch (Exception e) { ExceptionUtils.logAndShowError("Cannot open Plant3D editor",e); @@ -148,22 +177,25 @@ public class Plant3DEditor extends ResourceEditorPart { try { getSession().syncRequest(new ReadRequest() { - @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public void run(ReadGraph graph) throws DatabaseException { + System.out.println("START PLANT3D LOAD"); PipingRules.setEnabled(false); - IMappingSchema schema = getSchema(graph); + 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); + P3DUtil.finalizeDBLoad(rootNode); + nodeMap = createNodeMap(getSession(), mapping, panel,rootNode); + + } catch (Exception e) { + throw new DatabaseException(e); + } + + System.out.println("END PLANT3D LOAD"); } }); @@ -171,12 +203,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); @@ -212,19 +244,33 @@ public class Plant3DEditor extends ResourceEditorPart { 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); - } - }; - + focusAction = new FocusAction(panel, cameraAction); + translateAction = new TranslateAction(panel,nodeMap,toolComposite); + translateInlineAction = new TranslateInlineAction(panel, nodeMap,toolComposite); + translateFreeVariableLengthAction = new TranslateFreeVariableLengthAction(panel, getRootNode(), toolComposite); + rotateAction = new RotateAction(panel,nodeMap,toolComposite); + removeAction = new RemoveAction(nodeMap); removeSplitAction = new RemoveAndSplitAction(nodeMap); - routePipeAction = new RoutePipeAction(panel,rootNode); - addComponentAction = new AddComponentAction(panel, rootNode); + routePipeAction = new RoutePipeAction(panel,rootNode, toolComposite); + addComponentAction = new AddComponentAction(panel, rootNode, getLibraryUri()); + reversePipeRunAction = new ReversePipeRunAction(nodeMap); } public void populate() { @@ -233,17 +279,38 @@ 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); + + } + }); + } }); } - protected IMappingSchema getSchema(ReadGraph graph) throws DatabaseException { - IMappingSchema schema = SchemaBuilder.getSchema(graph); + protected IMappingSchema getSchema(ReadGraph graph) throws DatabaseException { + IMappingSchema schema = SchemaBuilder.getSchema(graph); return schema; } - protected P3DNodeMap createNodeMap(Session session, IMapping mapping, VtkView panel, P3DRootNode rootNode) { + protected P3DNodeMap createNodeMap(Session session, IMapping mapping, VtkView panel, P3DRootNode rootNode) { return new P3DNodeMap(session, mapping, panel,rootNode); } @@ -257,6 +324,10 @@ public class Plant3DEditor extends ResourceEditorPart { vtkRenderer ren1 = panel.getRenderer(); boolean multiPass = false; + boolean blur = false; + boolean ssaa = false; + //boolean sobel = true; + boolean mblur = false; if (multiPass) { vtkLightsPass lightsPass = new vtkLightsPass(); @@ -273,8 +344,26 @@ public class Plant3DEditor extends ResourceEditorPart { vtkCameraPass cameraPass = new vtkCameraPass(); cameraPass.SetDelegatePass(seq); - ren1.SetPass(cameraPass); - + if (blur) { + vtkGaussianBlurPass blurPass = new vtkGaussianBlurPass(); + blurPass.SetDelegatePass(cameraPass); + ren1.SetPass(blurPass); + } else if (ssaa) { + vtkSSAAPass ssaaPass = new vtkSSAAPass(); + ssaaPass.SetDelegatePass(cameraPass); + ren1.SetPass(ssaaPass); + } else if (mblur) { + vtkSimpleMotionBlurPass mBlurPass = new vtkSimpleMotionBlurPass(); + mBlurPass.SetDelegatePass(cameraPass); + ren1.SetPass(mBlurPass); +// } else if (sobel) { +// vtkSobelGradientMagnitudePass sobelPass = new vtkSobelGradientMagnitudePass(); +// sobelPass.SetDelegatePass(sobelPass); +// ren1.SetPass(sobelPass); + } else { + ren1.SetPass(cameraPass); + } + } // ren1.GetRenderWindow().LineSmoothingOn(); // ren1.GetRenderWindow().PointSmoothingOn(); @@ -313,18 +402,32 @@ public class Plant3DEditor extends ResourceEditorPart { } 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()) { - m.add(new AddEquipmentAction(rootNode, eq)); - } + m.add(new AddEquipmentAction(rootNode, getLibraryUri())); +// for (Item eq : P3DUtil.getEquipments(getLibraryUri())) { +// m.add(new AddEquipmentAction(rootNode, eq)); +// } } else if (selected.size() == 1) { IP3DNode node = (IP3DNode)selected.get(0); 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); @@ -361,7 +464,10 @@ public class Plant3DEditor extends ResourceEditorPart { } 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); @@ -369,6 +475,10 @@ public class Plant3DEditor extends ResourceEditorPart { m.add(removeAction); m.add(removeSplitAction); removeSplitAction.setNode(node); + } else if (node instanceof PipeRun) { + m.add(reversePipeRunAction); + m.add(removeAction); + reversePipeRunAction.setNode(node); } else { m.add(removeAction); } @@ -376,6 +486,7 @@ public class Plant3DEditor extends ResourceEditorPart { translateAction.setNode(node); translateInlineAction.setNode(node); + translateFreeVariableLengthAction.setNode(node); rotateAction.setNode(node); removeAction.setNode(node); @@ -404,30 +515,29 @@ public class Plant3DEditor extends ResourceEditorPart { return outlinePage; } - @SuppressWarnings("rawtypes") @Override - public Object getAdapter(Class adapter) { - if (IPropertyPage.class.equals(adapter)) - return new StandardPropertyPage(getSite(),getPropertyContexts()); - if (IContentOutlinePage.class.equals(adapter)) { - return createOutline(); + public T getAdapter(Class adapter) { + if (adapter.isAssignableFrom(IPropertyPage.class)) + return adapter.cast(new StandardPropertyPage(getSite(),getPropertyContexts())); + if (adapter.isAssignableFrom(ISelectionProvider.class)) + return adapter.cast(selectionProvider); + if (adapter.isAssignableFrom(IContentOutlinePage.class)) { + return adapter.cast(createOutline()); } - if (NodeMap.class.equals(adapter)) { - return nodeMap; + if (adapter.isAssignableFrom(NodeMap.class)) { + return adapter.cast(nodeMap); } - if (INode.class.equals(adapter)) { - return rootNode; + if (adapter.isAssignableFrom(INode.class)) { + return adapter.cast(rootNode); } - if (IMapping.class.equals(adapter)) { - return mapping; + if (adapter.isAssignableFrom(IMapping.class)) { + return adapter.cast(mapping); } -// if (InteractiveVtkPanel.class.equals(adapter)) { -// return panel; +// if (adapter.isAssignableFrom(InteractiveVtkPanel.class)) { +// return adapter.cast(panel); // } - if (VtkView.class.equals(adapter)) - return panel; - if (ISelectionProvider.class.equals(adapter)) - return selectionProvider; + if (adapter.isAssignableFrom(VtkView.class)) + return adapter.cast(panel); return super.getAdapter(adapter); } @@ -437,11 +547,19 @@ public class Plant3DEditor extends ResourceEditorPart { return result; } + public InteractiveVtkComposite getPanel() { + return panel; + } + public P3DRootNode getRootNode() { return rootNode; } - public IMapping getMapping() { + public IMapping getMapping() { return mapping; } + + public P3DNodeMap getNodeMap() { + return nodeMap; + } }