X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Feditor%2FPlant3DEditor.java;h=82d592c4d4b8b8c0c95652b81b4d6819f72dd899;hb=7531a473ca1fa611ae1a1b84b09f89effd4fa919;hp=9d0c3b820a289e912a3be846b5c55fa748ab0897;hpb=a460e609147d064dd3da464bcf1626845e0f93b4;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 9d0c3b82..82d592c4 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/editor/Plant3DEditor.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/editor/Plant3DEditor.java @@ -1,6 +1,5 @@ package org.simantics.plant3d.editor; -import java.awt.Component; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -11,12 +10,10 @@ import org.eclipse.jface.action.MenuManager; 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; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import org.simantics.db.ReadGraph; @@ -28,34 +25,36 @@ import org.simantics.g3d.scenegraph.IG3DNode; import org.simantics.g3d.scenegraph.NodeMap; import org.simantics.g3d.scenegraph.base.INode; import org.simantics.g3d.vtk.action.RemoveAction; -import org.simantics.g3d.vtk.action.RotateAction; -import org.simantics.g3d.vtk.action.TranslateAction; -import org.simantics.g3d.vtk.action.vtkCameraAndSelectorAction; import org.simantics.g3d.vtk.common.HoverHighlighter; -import org.simantics.g3d.vtk.common.InteractiveVtkPanel; import org.simantics.g3d.vtk.common.NodeSelectionProvider2; import org.simantics.g3d.vtk.common.SelectionHighlighter; +import org.simantics.g3d.vtk.common.VtkView; import org.simantics.g3d.vtk.shape.vtkShape; -import org.simantics.g3d.vtk.utils.vtkPanelUtil; +import org.simantics.g3d.vtk.swt.ContextMenuListener; +import org.simantics.g3d.vtk.swt.InteractiveVtkComposite; +import org.simantics.g3d.vtk.swt.RotateAction; +import org.simantics.g3d.vtk.swt.TranslateAction; +import org.simantics.g3d.vtk.swt.vtkCameraAndSelectorAction; +import org.simantics.g3d.vtk.utils.AxesDisplay; import org.simantics.objmap.graph.IMapping; import org.simantics.objmap.graph.Mappings; 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.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; @@ -64,17 +63,13 @@ import org.simantics.selectionview.StandardPropertyPage; import org.simantics.ui.workbench.IPropertyPage; import org.simantics.ui.workbench.IResourceEditorInput; import org.simantics.ui.workbench.ResourceEditorPart; -import org.simantics.utils.threads.AWTThread; import org.simantics.utils.threads.ThreadUtils; import org.simantics.utils.ui.ExceptionUtils; -import org.simantics.utils.ui.SWTAWTComponent; import vtk.vtkActor; -import vtk.vtkAxesActor; import vtk.vtkCameraPass; import vtk.vtkDefaultPass; import vtk.vtkLightsPass; -import vtk.vtkOrientationMarkerWidget; import vtk.vtkRenderPassCollection; import vtk.vtkRenderer; import vtk.vtkSequencePass; @@ -84,8 +79,9 @@ public class Plant3DEditor extends ResourceEditorPart { private Composite parent; private Resource input; - private InteractiveVtkPanel panel; - private SWTAWTComponent component; +// private InteractiveVtkPanel panel; +// private SWTAWTComponent component; + private InteractiveVtkComposite panel; private P3DRootNode rootNode; private IMapping mapping; @@ -94,8 +90,10 @@ public class Plant3DEditor extends ResourceEditorPart { private vtkCameraAndSelectorAction cameraAction; private TranslateAction translateAction; + private TranslateInlineAction translateInlineAction; private RotateAction rotateAction; private RemoveAction removeAction; + private RemoveAndSplitAction removeSplitAction; private RoutePipeAction routePipeAction; private AddComponentAction addComponentAction; @@ -105,45 +103,36 @@ public class Plant3DEditor extends ResourceEditorPart { public void createPartControl(Composite parent) { this.parent = parent; parent.setLayout (new FillLayout ()); - component = new SWTAWTComponent(parent,SWT.NONE) { - - @Override - protected Component createSwingComponent() { - if (panel == null) { - panel = new InteractiveVtkPanel(); - vtkPanelUtil.registerPanel(panel); - createScene(); - } - return panel; - } - }; +// component = new SWTAWTComponent(parent,SWT.NONE) { +// +// @Override +// protected Component createSwingComponent() { +// if (panel == null) { +// panel = new InteractiveVtkPanel(); +// vtkPanelUtil.registerPanel(panel); +// createScene(); +// } +// return panel; +// } +// }; IResourceEditorInput rei = (IResourceEditorInput)getEditorInput(); input = rei.getResource(); + panel = new InteractiveVtkComposite(parent); + //IActionBars actionBars = getEditorSite().getActionBars(); hookContextMenu(); - component.syncPopulate(); + createScene(); + + //component.syncPopulate(); - panel.addMouseListener(new java.awt.event.MouseAdapter() { - @Override - public void mouseClicked(final java.awt.event.MouseEvent e) { - if (e.getButton() == java.awt.event.MouseEvent.BUTTON3) { - Display.getDefault().asyncExec(new Runnable() { - public void run() { - contextMenu.setLocation(e.getXOnScreen(), e.getYOnScreen()); - contextMenu.setVisible(true); - } - }); - } - } - }); + new ContextMenuListener(panel, contextMenu); - - cameraAction = new vtkCameraAndSelectorAction(panel); + cameraAction = createCameraAction(); panel.setDefaultAction(cameraAction); panel.useDefaultAction(); panel.setPickType(4); @@ -169,39 +158,8 @@ public class Plant3DEditor extends ResourceEditorPart { // update control points. // TODO : this should be optimized. try { - for (INode node : rootNode.getChild()) { - if (node instanceof PipeRun) { - for (PipelineComponent pc : ((PipeRun) node).getChild()) - pc.sync(); - } else if (node instanceof Equipment) { - for (PipelineComponent pc : ((Equipment) node).getChild()) - pc.sync(); - } - } + P3DUtil.finalizeDBLoad(rootNode); - for (INode node : rootNode.getChild()) { - if (node instanceof PipeRun) { - for (PipelineComponent pc : ((PipeRun) node).getChild()) - pc.sync2(); - } else if (node instanceof Equipment) { - for (PipelineComponent pc : ((Equipment) node).getChild()) - pc.sync2(); - } - } - for (INode node : rootNode.getChild()) { - if (node instanceof PipeRun) { - PipingRules.validate((PipeRun)node); - } - } - PipingRules.setEnabled(true); - for (INode node : rootNode.getChild()) { - if (node instanceof PipeRun) { - PipeRun run = (PipeRun)node; - for (PipeControlPoint pcp : run.getControlPoints()) - PipingRules.positionUpdate(pcp); - - } - } } catch (Exception e) { throw new DatabaseException(e); } @@ -232,20 +190,12 @@ public class Plant3DEditor extends ResourceEditorPart { public void widgetDisposed(DisposeEvent e) { getSite().getPage().removePostSelectionListener(selectionProvider); - ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() { - - @Override - public void run() { - PipingRules.setEnabled(false); - nodeMap.delete(); - PipingRules.setEnabled(true); - vtkPanelUtil.unregisterPanel(panel); - - } - }); + PipingRules.setEnabled(false); + nodeMap.delete(); + PipingRules.setEnabled(true); mapping.dispose(); - component.dispose(); - +// component.dispose(); + //panel.getComponent().dispose(); } }); @@ -254,22 +204,31 @@ public class Plant3DEditor extends ResourceEditorPart { return; } + createActions(); + + } + + protected vtkCameraAndSelectorAction createCameraAction() { + return new vtkCameraAndSelectorAction(panel); + } + + 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); - - } }; + + removeSplitAction = new RemoveAndSplitAction(nodeMap); routePipeAction = new RoutePipeAction(panel,rootNode); addComponentAction = new AddComponentAction(panel, rootNode); - } public void populate() { - ThreadUtils.asyncExec(AWTThread.getThreadAccess(), new Runnable() { + ThreadUtils.asyncExec(panel.getThreadQueue(), new Runnable() { @Override public void run() { @@ -284,17 +243,18 @@ public class Plant3DEditor extends ResourceEditorPart { return schema; } - protected P3DNodeMap createNodeMap(Session session, IMapping mapping, InteractiveVtkPanel panel, P3DRootNode rootNode) { - return new P3DNodeMap(session, mapping, panel,rootNode); + protected P3DNodeMap createNodeMap(Session session, IMapping mapping, VtkView panel, P3DRootNode rootNode) { + return new P3DNodeMap(session, mapping, panel,rootNode); } @Override public void setFocus() { - component.setFocus(); + //component.setFocus(); + panel.getComponent().setFocus(); } private void createScene() { - vtkRenderer ren1 = panel.GetRenderer(); + vtkRenderer ren1 = panel.getRenderer(); boolean multiPass = false; if (multiPass) { @@ -310,8 +270,6 @@ public class Plant3DEditor extends ResourceEditorPart { vtkSequencePass seq = new vtkSequencePass(); seq.SetPasses(passes); - - vtkCameraPass cameraPass = new vtkCameraPass(); cameraPass.SetDelegatePass(seq); @@ -329,56 +287,30 @@ 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); - - { - vtkAxesActor axes = new vtkAxesActor(); - axes.GetXAxisCaptionActor2D().GetCaptionTextProperty().SetColor(0,0,0); - axes.GetYAxisCaptionActor2D().GetCaptionTextProperty().SetColor(0,0,0); - axes.GetZAxisCaptionActor2D().GetCaptionTextProperty().SetColor(0,0,0); - axes.GetXAxisCaptionActor2D().GetCaptionTextProperty().SetShadow(0); - axes.GetYAxisCaptionActor2D().GetCaptionTextProperty().SetShadow(0); - axes.GetZAxisCaptionActor2D().GetCaptionTextProperty().SetShadow(0); - axes.GetXAxisCaptionActor2D().GetCaptionTextProperty().ItalicOff(); - axes.GetYAxisCaptionActor2D().GetCaptionTextProperty().ItalicOff(); - axes.GetZAxisCaptionActor2D().GetCaptionTextProperty().ItalicOff(); - axes.GetXAxisCaptionActor2D().GetCaptionTextProperty().Delete(); - axes.GetYAxisCaptionActor2D().GetCaptionTextProperty().Delete(); - axes.GetZAxisCaptionActor2D().GetCaptionTextProperty().Delete(); - axes.GetXAxisCaptionActor2D().Delete(); - axes.GetYAxisCaptionActor2D().Delete(); - axes.GetZAxisCaptionActor2D().Delete(); - vtkOrientationMarkerWidget widget = new vtkOrientationMarkerWidget(); - widget.SetOutlineColor(0.9300, 0.5700, 0.1300 ); - widget.SetOrientationMarker(axes); - widget.SetInteractor(panel.getRenderWindowInteractor()); - //widget.SetViewport(0.8, 0.0, 1.0, 0.2); // bottom right - //widget.SetViewport(0.0, 0.0, 0.4, 0.4); - widget.SetViewport(0.0, 0.0, 0.2, 0.2); // bottom left - widget.SetEnabled(1); - widget.InteractiveOff(); - } - + // 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(); @@ -397,15 +329,19 @@ public class Plant3DEditor extends ResourceEditorPart { add.setEquipment((Equipment)node); m.add(add); } + m.add(removeAction); } else if (node instanceof Nozzle) { - 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; @@ -414,28 +350,39 @@ 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); 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); rotateAction.setNode(node); removeAction.setNode(node); } } catch (DatabaseException e) { - ExceptionUtils.logAndShowError(e); - } + ExceptionUtils.logAndShowError(e); + } } private IContentOutlinePage createOutline() { @@ -474,9 +421,11 @@ public class Plant3DEditor extends ResourceEditorPart { if (IMapping.class.equals(adapter)) { return mapping; } - if (InteractiveVtkPanel.class.equals(adapter)) { +// if (InteractiveVtkPanel.class.equals(adapter)) { +// return panel; +// } + if (VtkView.class.equals(adapter)) return panel; - } if (ISelectionProvider.class.equals(adapter)) return selectionProvider; return super.getAdapter(adapter);