X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.plant3d%2Fsrc%2Forg%2Fsimantics%2Fplant3d%2Fscenegraph%2FGeometryNode.java;h=585c244c4ca98fb3d67ebde9b6675535d7fa8c43;hb=HEAD;hp=8d7ba9d9825045c2eba417b38f23a08f99ef9960;hpb=22bb24d2a7e26c70b0dd4c57080f2c25ac3d40a8;p=simantics%2F3d.git diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/GeometryNode.java b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/GeometryNode.java index 8d7ba9d9..585c244c 100644 --- a/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/GeometryNode.java +++ b/org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/GeometryNode.java @@ -1,187 +1,100 @@ package org.simantics.plant3d.scenegraph; -import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; import java.util.Map; +import java.util.Set; -import org.jcae.opencascade.jni.TopoDS_Shape; -import org.simantics.g3d.math.MathTools; +import org.simantics.g3d.scenegraph.GeometryProvider; import org.simantics.g3d.scenegraph.NodeHighlighter; +import org.simantics.g3d.vtk.common.VtkView; import org.simantics.g3d.vtk.utils.vtkUtil; import org.simantics.objmap.graph.annotations.RelatedGetObj; import org.simantics.objmap.graph.annotations.RelatedSetObj; -import org.simantics.opencascade.OccTriangulator; -import org.simantics.opencascade.ParametricSolidModelProvider; -import org.simantics.opencascade.SolidModelProvider; -import org.simantics.opencascade.vtk.vtkSolidObject; import org.simantics.plant3d.ontology.Plant3D; -import vtk.vtkActor; -import vtk.vtkPanel; import vtk.vtkProp3D; -import vtk.vtkProperty; import vtk.vtkRenderer; public abstract class GeometryNode extends P3DNode implements ParameterizedNode, NodeHighlighter { - private TopoDS_Shape solidModel; - private vtkSolidObject solidObject; - - private Map currentParameters; - private Map calculatedParameters; - - private boolean parametersUpdated = true; - + private GeometryComponent component; + public GeometryNode() { - currentParameters = new HashMap(); - calculatedParameters = new HashMap(); - } - - @Override - public void visualize(vtkPanel panel) { - if (solidModelProvider != null) { + component = new GeometryComponent() { + @Override + protected double[] getColor() { + return GeometryNode.this.getColor(); + } - updateParameters(); - if (solidModel == null || parametersUpdated) { - createGeometry(); + @Override + protected double[] getSelectedColor() { + return GeometryNode.this.getSelectedColor(); } - } - if ((solidObject == null || parametersUpdated) && solidModel != null) { - solidObject = new vtkSolidObject(panel, solidModel); - } - if (solidObject != null) { - solidObject.visualizeSolid(true,true, false,false); - updateVisuals(true, true); - } - parametersUpdated = false; - + }; } - public void updateParameters() { - if (solidModelProvider instanceof ParametricSolidModelProvider) { - ((ParametricSolidModelProvider)solidModelProvider).setProperties(currentParameters); - ((ParametricSolidModelProvider)solidModelProvider).updateCalculatedProperties(calculatedParameters); - } + @Override + public void visualize(VtkView panel) { + updateParameters(); + component.visualize(panel); + update(panel.getRenderer()); } - private void createGeometry() { - Collection shapes; - try { - shapes = solidModelProvider.getModel(); - if (shapes.size() == 1) { - solidModel = shapes.iterator().next(); - } else { - solidModel = OccTriangulator.makeCompound(shapes.toArray(new TopoDS_Shape[shapes.size()])); - for (TopoDS_Shape shape : shapes) { - shape.delete(); - } - } -// shapes.clear(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + public void updateParameters() { + component.updateParameters(); } + public Map getParameterMap() { - return Collections.unmodifiableMap(currentParameters); + return component.getParameterMap(); } public Map getCalculatedParameters() { - return calculatedParameters; + return component.getCalculatedParameters(); } + + public Map getTotalParameters() { + return component.getTotalParameters(); + } + public void setParametersUpdated(boolean parametersUpdated) { - this.parametersUpdated = parametersUpdated; + component.setParametersUpdated(parametersUpdated); } public void setParameterMap(Map parameters) { - for (String id : parameters.keySet()) { - Object currentValue = currentParameters.get(id); - Object newValue = parameters.get(id); - if (currentValue == newValue) - continue; - if (currentValue instanceof Double) { - if (Math.abs((Double)currentValue-(Double)newValue) < MathTools.NEAR_ZERO) - continue; - } - currentParameters.put(id, newValue); - parametersUpdated = true; + Set ids = component.setParameterMap(parameters); + for (String id : ids) { firePropertyChanged(id); } } - private SolidModelProvider solidModelProvider; - @RelatedGetObj(Plant3D.URIs.hasGeometry) - public SolidModelProvider getGeometry() { - return solidModelProvider; + public GeometryProvider getGeometry() { + return component.getGeometry(); } @RelatedSetObj(Plant3D.URIs.hasGeometry) - public void setGeometry(final SolidModelProvider provider) { - if (provider != null && provider.equals(solidModelProvider)) + public void setGeometry(final GeometryProvider provider) { + if (provider != null && provider.equals(component.getGeometry())) return; - - if (solidModelProvider != null) { - deleteData(); - } - solidModelProvider = provider; + component.setGeometry(provider); firePropertyChanged(Plant3D.URIs.hasGeometry); } - - private void deleteData() { - solidModelProvider = null; - if (solidObject != null) { - solidObject.clearActors(); - solidObject = null; - } - if (solidModel != null) { - solidModel.delete(); - solidModel = null; - } - } - + @Override public Collection getActors() { - List list = new ArrayList(); - if (solidObject != null) - list.addAll(solidObject.getActors()); - return list; + return component.getActors(); } @Override public void stopVisualize() { - if (solidObject != null) { - solidObject.clearActorsAWT(); - solidObject = null; - } - if (solidModel != null) { - solidModel.delete(); - solidModel = null; - } - + component.stopVisualize(); } - private boolean selected = false; - private boolean hover = false; - @Override public void highlight(HighlightEventType type) { - if (type == HighlightEventType.Selection || type == HighlightEventType.ClearSelection) { - selected = type == HighlightEventType.Selection; -// hingeA.visualizeSolid(selected,true,false); -// hingeB.visualizeSolid(selected,true,false); - updateVisuals(true, false); -// update(null); - } else { - hover = type == HighlightEventType.Hover; - updateVisuals(false, true); - } - + component.highlight(type); } @@ -193,47 +106,8 @@ public abstract class GeometryNode extends P3DNode implements ParameterizedNode, return new double[]{1,1,0}; } - private void updateVisuals(boolean s, boolean h) { - if (solidObject != null) { - if (s) { - double color[]; - if (selected) { - color = getSelectedColor(); - - } else { - color = getColor(); - - } - for (vtkProp3D prop : solidObject.getSolid()) { - vtkProperty property = ((vtkActor)prop).GetProperty(); - property.SetColor(color); - property.Delete(); - } - } - if (h) { - double color[] = new double[]{0,0,0}; - if (hover) - color = new double[]{1,0,1}; - for (vtkProp3D prop : solidObject.getEdges()) { - vtkProperty property = ((vtkActor)prop).GetProperty(); - property.SetColor(color); - property.Delete(); - } - - } - } else { -// if (s) { -// axes.addToRenderer(); -// axes.setAxesVisibility(selected); -// } - } - } - public void update(vtkRenderer ren) { vtkUtil.updateTransform(getActors(), getWorldPosition(), getWorldOrientation()); } - - public TopoDS_Shape getSolidModel() { - return solidModel; - } + }