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.IAction;
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.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;
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;
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;
import vtk.vtkDefaultPass;
import vtk.vtkGaussianBlurPass;
import vtk.vtkLightsPass;
-import vtk.vtkProp;
+import vtk.vtkProp3D;
import vtk.vtkRenderPassCollection;
import vtk.vtkRenderer;
import vtk.vtkSSAAPass;
public static final int X = 0, Y = 1, Z = 2;
protected int upDirection = 1;
-
+
+ ParametrizedRead<IResourceEditorInput, Boolean> INPUT_VALIDATOR =
+ Combinators.compose(
+ InputValidationCombinators.hasURI(),
+ InputValidationCombinators.extractInputResource()
+ );
+
+ @Override
+ protected ParametrizedRead<IResourceEditorInput, Boolean> 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();
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;
}
createActions();
-
}
public void setUpDirection(int upDirection) {
@Override
public void run() {
+ nodeMap.setChangeTracking(false);
nodeMap.populate();
+ nodeMap.setChangeTracking(true);
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) {
- ExceptionUtils.logAndShowError("Failed to load model correctly", e);
- //throw new DatabaseException(e);
- }
- panel.removeListener(this);
-
- }
- });
-
+
+ @Override
+ public void preRender() {
+
+ }
+
+ @Override
+ public void postRender() {
+ panel.removeListener(this);
+
+ try {
+ P3DUtil.finalizeDBLoad2(rootNode);
+ if (nodeMap.getMapping().isRangeModified())
+ nodeMap.commit("Load sync");
+ } catch (Exception e) {
+ ExceptionUtils.logAndShowError("Failed to load model correctly", e);
+ }
+
+ onEditorInitializationComplete();
+
+ List<vtkProp3D> props = new ArrayList<>();
+ collectProps(rootNode, props);
+ fitToWindow(props);
+ }
+ });
}
});
-
+
+ }
+
+ /**
+ * This can be overridden by clients to perform extra initialization tasks
+ */
+ protected void onEditorInitializationComplete() {
}
protected IMappingSchema<Resource, INode> getSchema(ReadGraph graph) throws DatabaseException {
panel.getComponent().setFocus();
}
- private void createScene() {
+ protected void createScene() {
vtkRenderer ren1 = panel.getRenderer();
boolean multiPass = false;
AxesDisplay axesDisplay = new AxesDisplay(panel);
axesDisplay.show();
-
}
protected Menu contextMenu;
protected void createContextMenu(IMenuManager m) {
List<INode> selected = selectionProvider.getSelectedNodes();
- List<VTKSelectionItem<Resource>> selectedItems = selectionProvider.getSelectedItems();
- if (selectedItems.size() > 0) {
- List<vtkProp> props = new ArrayList<>();
- for (VTKSelectionItem<Resource> 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) {
m.add(new AddEquipmentAction(rootNode, getLibraryUri()));
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);
ExceptionUtils.logAndShowError(e);
}
}
-
+
+ protected class FitToWindow extends Action {
+ private List<INode> selected;
+ public FitToWindow(List<INode> selected) {
+ super("Fit to Window");
+ this.selected = selected;
+ //setAccelerator('1');
+ }
+ @Override
+ public void run() {
+ List<vtkProp3D> props = new ArrayList<>();
+ final Collection<INode> collection = !selected.isEmpty() ? selected : getRootNode().getChild();
+ for (INode n : collection)
+ collectProps(n, props);
+
+ fitToWindow(props);
+ getPanel().refresh();
+ }
+ }
+
+ protected void createFocusMenu(IMenuManager m, List<INode> selected) {
+ m.add(createFitToWindowAction(selected));
+
+ if (!selected.isEmpty()) {
+ List<vtkProp3D> actors = new ArrayList<>();
+ for (INode n : selected)
+ collectProps(n, actors);
+ if (actors.size() > 0) {
+ focusAction.setProps(new ArrayList<>(actors));
+ m.add(focusAction);
+ }
+ }
+ }
+
+ protected IAction createFitToWindowAction(List<INode> selected) {
+ return new FitToWindow(selected);
+ }
+
private IContentOutlinePage createOutline() {
if (rootNode == null || selectionProvider == null)
return null;
public P3DNodeMap getNodeMap() {
return nodeMap;
}
+
+ public void fitToWindow(Collection<vtkProp3D> props) {
+ cameraAction.fitToView(props);
+ }
+
+ protected static void collectProps(INode node, List<vtkProp3D> props) {
+ if (node instanceof IP3DVisualNode)
+ props.addAll(((IP3DVisualNode) node).getActors());
+
+ if (node instanceof ParentNode)
+ for (INode n : ((ParentNode<?>) node).getNodes()) {
+ collectProps(n, props);
+ }
+ }
}