X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Feditor%2FPlant3DEditor.java;h=72f2c2066e4329bcac5c306786805ce4146eff01;hb=refs%2Fchanges%2F71%2F3971%2F1;hp=5d755d06f7e3d6b74f704365d1c8dc06c452551b;hpb=e75c2f6a2f0bdef0e8077879664715d99cede843;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 5d755d06..72f2c206 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/editor/Plant3DEditor.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/editor/Plant3DEditor.java @@ -1,35 +1,44 @@ package org.simantics.plant3d.editor; import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; +import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +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; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; +import org.simantics.Simantics; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.Session; +import org.simantics.db.common.request.ParametrizedRead; import org.simantics.db.common.request.ReadRequest; import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.request.combinations.Combinators; import org.simantics.g3d.scenegraph.NodeMap; import org.simantics.g3d.scenegraph.RenderListener; import org.simantics.g3d.scenegraph.base.INode; +import org.simantics.g3d.scenegraph.base.ParentNode; +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; @@ -54,6 +63,7 @@ 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.IP3DVisualNode; import org.simantics.plant3d.scenegraph.InlineComponent; import org.simantics.plant3d.scenegraph.Nozzle; import org.simantics.plant3d.scenegraph.P3DRootNode; @@ -70,6 +80,7 @@ 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.ui.workbench.editor.input.InputValidationCombinators; import org.simantics.utils.threads.ThreadUtils; import org.simantics.utils.ui.ExceptionUtils; @@ -78,7 +89,7 @@ import vtk.vtkCameraPass; import vtk.vtkDefaultPass; import vtk.vtkGaussianBlurPass; import vtk.vtkLightsPass; -import vtk.vtkProp; +import vtk.vtkProp3D; import vtk.vtkRenderPassCollection; import vtk.vtkRenderer; import vtk.vtkSSAAPass; @@ -89,10 +100,12 @@ 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; @@ -114,29 +127,42 @@ public class Plant3DEditor extends ResourceEditorPart { private P3DNodeMap nodeMap; + /** Constants for selecting the up-direction */ + public static final int X = 0, Y = 1, Z = 2; + + protected int upDirection = 1; + + ParametrizedRead INPUT_VALIDATOR = + Combinators.compose( + InputValidationCombinators.hasURI(), + InputValidationCombinators.extractInputResource() + ); + + @Override + protected ParametrizedRead getInputValidator() { + return INPUT_VALIDATOR; + } + @Override 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; -// } -// }; + + activateValidation(); 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(); @@ -146,13 +172,25 @@ public class Plant3DEditor extends ResourceEditorPart { new ContextMenuListener(panel, contextMenu); cameraAction = createCameraAction(); + switch (upDirection) { + case 0: + cameraAction.setUpDirection(new double[] { 1, 0, 0 }); + break; + case 1: + cameraAction.setUpDirection(new double[] { 0, 1, 0 }); + break; + case 2: + cameraAction.setUpDirection(new double[] { 0, 0, 1 }); + break; + } + panel.setDefaultAction(cameraAction); panel.useDefaultAction(); panel.setPickType(4); try { - ControlPointFactory.preloadCache(getLibraryUri()); - ComponentUtils.preloadCache(); + ControlPointFactory.preloadCache(Simantics.getSession(), getLibraryUri()); + ComponentUtils.preloadCache(Simantics.getSession()); } catch (Exception e) { ExceptionUtils.logAndShowError("Cannot open Plant3D editor",e); return; @@ -163,7 +201,7 @@ public class Plant3DEditor extends ResourceEditorPart { @Override public void run(ReadGraph graph) throws DatabaseException { - System.out.println("START PLANT3D LOAD"); + //System.out.println("START PLANT3D LOAD"); PipingRules.setEnabled(false); IMappingSchema schema = getSchema(graph); mapping = Mappings.createWithListening(schema); @@ -179,7 +217,7 @@ public class Plant3DEditor extends ResourceEditorPart { throw new DatabaseException(e); } - System.out.println("END PLANT3D LOAD"); + //System.out.println("END PLANT3D LOAD"); } }); @@ -221,9 +259,12 @@ public class Plant3DEditor extends ResourceEditorPart { } createActions(); - } + public void setUpDirection(int upDirection) { + this.upDirection = upDirection; + } + protected vtkCameraAndSelectorAction createCameraAction() { return new vtkCameraAndSelectorAction(panel); } @@ -246,13 +287,13 @@ public class Plant3DEditor extends ResourceEditorPart { protected void createActions() { 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); + 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); + routePipeAction = new RoutePipeAction(panel,rootNode, toolComposite); addComponentAction = new AddComponentAction(panel, rootNode, getLibraryUri()); reversePipeRunAction = new ReversePipeRunAction(nodeMap); } @@ -272,18 +313,21 @@ public class Plant3DEditor extends ResourceEditorPart { @Override public void postRender() { + panel.removeListener(this); + try { P3DUtil.finalizeDBLoad2(rootNode); if (nodeMap.isRangeModified()); nodeMap.commit("Load sync"); } catch (Exception e) { - //throw new DatabaseException(e); + ExceptionUtils.logAndShowError("Failed to load model correctly", e); } - panel.removeListener(this); - + + List props = new ArrayList<>(); + collectProps(rootNode, props); + fitToWindow(props); } }); - } }); @@ -304,7 +348,7 @@ public class Plant3DEditor extends ResourceEditorPart { panel.getComponent().setFocus(); } - private void createScene() { + protected void createScene() { vtkRenderer ren1 = panel.getRenderer(); boolean multiPass = false; @@ -361,14 +405,14 @@ public class Plant3DEditor extends ResourceEditorPart { ren1.SetGradientBackground(true); // vtkActor grid = vtkShape.createGridActor(8,1.0,1|2|4); - vtkActor grid = vtkShape.createGridActor(8,1.0, 2 ); + int dir = 1 << upDirection; + vtkActor grid = vtkShape.createGridActor(8, 1.0, dir); grid.SetPickable(0); ren1.AddActor(grid); panel.addDeletable(grid); AxesDisplay axesDisplay = new AxesDisplay(panel); axesDisplay.show(); - } protected Menu contextMenu; @@ -387,30 +431,23 @@ public class Plant3DEditor extends ResourceEditorPart { protected void createContextMenu(IMenuManager m) { 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); - } - } + + createFocusMenu(m, selected); + + m.add(new Separator()); + try { if (selected.size() == 0) { - for (Item eq : P3DUtil.getEquipments(getLibraryUri())) { - 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(getLibraryUri())) { + for (Item eq : P3DUtil.getNozzles(Simantics.getSession(), getLibraryUri())) { AddNozzleAction add = new AddNozzleAction(rootNode, eq); add.setEquipment((Equipment)node); m.add(add); @@ -478,6 +515,39 @@ public class Plant3DEditor extends ResourceEditorPart { ExceptionUtils.logAndShowError(e); } } + + private class FitToWindow extends Action { + private List selected; + public FitToWindow(List selected) { + super("Fit to Window"); + this.selected = selected; + //setAccelerator('1'); + } + @Override + public void run() { + List props = new ArrayList<>(); + final Collection collection = !selected.isEmpty() ? selected : getRootNode().getChild(); + for (INode n : collection) + collectProps(n, props); + + fitToWindow(props); + getPanel().refresh(); + } + } + + protected void createFocusMenu(IMenuManager m, List selected) { + m.add(new FitToWindow(selected)); + + if (!selected.isEmpty()) { + List actors = new ArrayList<>(); + for (INode n : selected) + collectProps(n, actors); + if (actors.size() > 0) { + focusAction.setProps(new ArrayList<>(actors)); + m.add(focusAction); + } + } + } private IContentOutlinePage createOutline() { if (rootNode == null || selectionProvider == null) @@ -545,4 +615,18 @@ public class Plant3DEditor extends ResourceEditorPart { public P3DNodeMap getNodeMap() { return nodeMap; } + + public void fitToWindow(Collection props) { + cameraAction.fitToView(props); + } + + protected static void collectProps(INode node, List props) { + if (node instanceof IP3DVisualNode) + props.addAll(((IP3DVisualNode) node).getActors()); + + if (node instanceof ParentNode) + for (INode n : ((ParentNode) node).getNodes()) { + collectProps(n, props); + } + } }