1 package org.simantics.plant3d.scenegraph;
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.Collections;
6 import java.util.HashMap;
10 import org.jcae.opencascade.jni.TopoDS_Shape;
11 import org.simantics.g3d.math.MathTools;
12 import org.simantics.g3d.scenegraph.NodeHighlighter;
13 import org.simantics.g3d.vtk.utils.vtkUtil;
14 import org.simantics.objmap.graph.annotations.RelatedGetObj;
15 import org.simantics.objmap.graph.annotations.RelatedSetObj;
16 import org.simantics.opencascade.OccTriangulator;
17 import org.simantics.opencascade.ParametricSolidModelProvider;
18 import org.simantics.opencascade.SolidModelProvider;
19 import org.simantics.opencascade.vtk.vtkSolidObject;
20 import org.simantics.plant3d.ontology.Plant3D;
25 import vtk.vtkProperty;
26 import vtk.vtkRenderer;
28 public class P3DParentGeometryNode<T extends IP3DNode> extends P3DParentNode<T> implements ParameterizedNode, NodeHighlighter{
29 private TopoDS_Shape solidModel;
30 private vtkSolidObject solidObject;
32 private Map<String,Object> currentParameters;
33 private Map<String,Object> calculatedParameters;
35 private boolean parametersUpdated = true;
38 public P3DParentGeometryNode() {
39 currentParameters = new HashMap<String, Object>();
40 calculatedParameters = new HashMap<String, Object>();
44 public void visualize(vtkPanel ren) {
45 if (solidModelProvider != null) {
49 if (solidModel == null || parametersUpdated) {
53 if ((solidObject == null || parametersUpdated) && solidModel != null) {
54 solidObject = new vtkSolidObject(ren, solidModel);
56 if (solidObject != null) {
57 solidObject.visualizeSolid(true,true, false,false);
58 updateVisuals(true, true);
60 parametersUpdated = false;
64 public void updateParameters() {
65 if (solidModelProvider instanceof ParametricSolidModelProvider) {
66 ((ParametricSolidModelProvider)solidModelProvider).setProperties(currentParameters);
67 ((ParametricSolidModelProvider)solidModelProvider).updateCalculatedProperties(calculatedParameters);
71 private void createGeometry() {
72 Collection<TopoDS_Shape> shapes;
74 shapes = solidModelProvider.getModel();
75 if (shapes.size() == 1) {
76 solidModel = shapes.iterator().next();
78 solidModel = OccTriangulator.makeCompound(shapes.toArray(new TopoDS_Shape[shapes.size()]));
79 for (TopoDS_Shape shape : shapes) {
84 } catch (Exception e) {
85 // TODO Auto-generated catch block
92 public Map<String, Object> getParameterMap() {
93 return Collections.unmodifiableMap(currentParameters);
96 public void setParameterMap(Map<String, Object> parameters) {
97 for (String id : parameters.keySet()) {
98 Object currentValue = currentParameters.get(id);
99 Object newValue = parameters.get(id);
100 if (currentValue == newValue)
102 if (currentValue instanceof Double) {
103 if (Math.abs((Double)currentValue-(Double)newValue) < MathTools.NEAR_ZERO)
106 currentParameters.put(id, newValue);
107 parametersUpdated = true;
108 firePropertyChanged(id);
113 private SolidModelProvider solidModelProvider;
115 @RelatedGetObj(Plant3D.URIs.hasGeometry)
116 public SolidModelProvider getGeometry() {
117 return solidModelProvider;
120 @RelatedSetObj(Plant3D.URIs.hasGeometry)
121 public void setGeometry(final SolidModelProvider provider) {
122 if (provider != null && provider.equals(solidModelProvider))
125 if (solidModelProvider != null) {
128 solidModelProvider = provider;
129 firePropertyChanged(Plant3D.URIs.hasGeometry);
132 private void deleteData() {
133 solidModelProvider = null;
134 if (solidObject != null) {
135 solidObject.clearActors();
138 if (solidModel != null) {
145 public Collection<vtkProp3D> getActors() {
146 List<vtkProp3D> list = new ArrayList<vtkProp3D>();
147 if (solidObject != null)
148 list.addAll(solidObject.getActors());
153 public void stopVisualize() {
154 if (solidObject != null) {
155 solidObject.clearActorsAWT();
158 if (solidModel != null) {
165 private boolean selected = false;
166 private boolean hover = false;
169 public void highlight(HighlightEventType type) {
170 if (type == HighlightEventType.Selection || type == HighlightEventType.ClearSelection) {
171 selected = type == HighlightEventType.Selection;
172 // hingeA.visualizeSolid(selected,true,false);
173 // hingeB.visualizeSolid(selected,true,false);
174 updateVisuals(true, false);
177 hover = type == HighlightEventType.Hover;
178 updateVisuals(false, true);
184 protected double[] getSelectedColor() {
185 return new double[]{1,0,0};
188 protected double[] getColor() {
189 return new double[]{1,1,0};
192 private void updateVisuals(boolean s, boolean h) {
193 if (solidObject != null) {
197 color = getSelectedColor();
203 for (vtkProp3D prop : solidObject.getSolid()) {
204 vtkProperty property = ((vtkActor)prop).GetProperty();
205 property.SetColor(color);
210 double color[] = new double[]{0,0,0};
212 color = new double[]{1,0,1};
213 for (vtkProp3D prop : solidObject.getEdges()) {
214 vtkProperty property = ((vtkActor)prop).GetProperty();
215 property.SetColor(color);
222 // axes.addToRenderer();
223 // axes.setAxesVisibility(selected);
228 public void update(vtkRenderer ren) {
229 vtkUtil.updateTransform(getActors(), getWorldPosition(), getWorldOrientation());
232 public TopoDS_Shape getSolidModel() {