]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/GeometryComponent.java
9b2b750fde45a5a812f90eac25e2f47ea030cc07
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / scenegraph / GeometryComponent.java
1 package org.simantics.plant3d.scenegraph;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.Collections;
6 import java.util.HashMap;
7 import java.util.HashSet;
8 import java.util.List;
9 import java.util.Map;
10 import java.util.Set;
11
12 import org.jcae.opencascade.jni.TopoDS_Shape;
13 import org.simantics.g3d.math.MathTools;
14 import org.simantics.g3d.scenegraph.GeometryProvider;
15 import org.simantics.g3d.scenegraph.MeshProvider;
16 import org.simantics.g3d.scenegraph.NodeHighlighter.HighlightEventType;
17 import org.simantics.g3d.scenegraph.ParametricGeometryProvider;
18 import org.simantics.g3d.shape.Mesh;
19 import org.simantics.g3d.vtk.common.VtkView;
20 import org.simantics.g3d.vtk.shape.MeshActor;
21 import org.simantics.g3d.vtk.shape.vtkMeshObject;
22 import org.simantics.opencascade.OccTriangulator;
23 import org.simantics.opencascade.SolidModelProvider;
24 import org.simantics.opencascade.vtk.vtkSolidObject;
25
26 import vtk.vtkActor;
27 import vtk.vtkProp3D;
28 import vtk.vtkProperty;
29
30 public class GeometryComponent {
31         
32         private TopoDS_Shape solidModel;
33         private vtkSolidObject solidObject;
34         private Mesh mesh;
35         private vtkMeshObject meshObject;
36         
37         private Map<String,Object> currentParameters;
38         private Map<String,Object> calculatedParameters;
39         
40         private boolean parametersUpdated = true;
41         
42         private GeometryProvider geometryProvider;
43         
44         public GeometryComponent() {
45                 currentParameters = new HashMap<String, Object>();
46                 calculatedParameters = new HashMap<String, Object>();
47         }
48         
49         public void visualize(VtkView panel) {
50                 if (geometryProvider != null) {
51                         updateParameters();
52                         
53                         if (geometryProvider instanceof SolidModelProvider) {
54                                 SolidModelProvider solidModelProvider = (SolidModelProvider)geometryProvider;
55                                 if (solidModel == null || parametersUpdated) {
56                                         createGeometry(solidModelProvider);     
57                                 }
58                                 if ((solidObject == null || parametersUpdated) && solidModel != null) {
59                                         solidObject = new vtkSolidObject(panel, solidModel);
60                                 }
61                                 if (solidObject != null) {
62                                         solidObject.visualizeSolid(true,true, false,false);
63                                         updateVisuals(true, true);
64                                 }
65                         } else  if (geometryProvider instanceof MeshProvider) {
66                                 MeshProvider provider = (MeshProvider)geometryProvider;
67                                 if (mesh == null || parametersUpdated) {
68                                         mesh = provider.getMesh();
69                                 }
70                                 if ((meshObject== null || parametersUpdated) && mesh != null) {
71                                         meshObject = new vtkMeshObject(panel, mesh);
72                                         
73                                 }
74                                 if (meshObject != null) {
75                                         meshObject.visualizeMesh();
76                                         updateVisuals(true, true);
77                                 }
78                         }
79                 }
80                 
81                 parametersUpdated = false;
82
83         }
84         
85         public void updateParameters() {
86                 //if (parametersUpdated && geometryProvider instanceof ParametricGeometryProvider) {
87                 if (geometryProvider instanceof ParametricGeometryProvider) {
88                         ((ParametricGeometryProvider)geometryProvider).setProperties(currentParameters);
89                         ((ParametricGeometryProvider)geometryProvider).updateCalculatedProperties(calculatedParameters);
90                 }
91         }
92         
93         private void createGeometry(SolidModelProvider solidModelProvider) {
94                 Collection<TopoDS_Shape> shapes;
95                 try {
96                         shapes = solidModelProvider.getModel();
97                         if (shapes.size() == 1) {
98                                 solidModel = shapes.iterator().next();
99                         } else { 
100                                 solidModel = OccTriangulator.makeCompound(shapes.toArray(new TopoDS_Shape[shapes.size()]));
101                                 for (TopoDS_Shape shape : shapes) {
102                                         shape.delete();
103                                 }
104                         }
105 //                              shapes.clear();
106                 } catch (Exception e) {
107                         // TODO Auto-generated catch block
108                         e.printStackTrace();
109                 }
110         }
111         
112         public Map<String, Object> getParameterMap() {
113                 return Collections.unmodifiableMap(currentParameters);
114         }
115         
116         public Map<String, Object> getCalculatedParameters() {
117                 return calculatedParameters;
118         }
119         
120         public void setParametersUpdated(boolean parametersUpdated) {
121                 this.parametersUpdated = parametersUpdated;
122         }
123         
124         public Set<String> setParameterMap(Map<String, Object> parameters) {
125                 Set<String> ids = new HashSet<String>();
126                 for (String id : parameters.keySet()) {
127                         Object currentValue = currentParameters.get(id);
128                         Object newValue = parameters.get(id);
129                         if (currentValue == newValue)
130                                 continue;
131                         if (currentValue instanceof Double) {
132                                 if (Math.abs((Double)currentValue-(Double)newValue) < MathTools.NEAR_ZERO)
133                                         continue;
134                         }
135                         currentParameters.put(id, newValue);
136                         parametersUpdated = true;
137                         ids.add(id);
138                 }
139                 return ids;
140         }
141         
142         public GeometryProvider getGeometry() {
143                 return geometryProvider;
144         }
145         
146         public void setGeometry(final GeometryProvider provider) {
147                 if (provider != null && provider.equals(geometryProvider))
148                         return;
149
150                 if (geometryProvider != null) {
151                         deleteData();
152                 }
153                 geometryProvider = provider;
154         }
155         
156         private void deleteData() {
157                 geometryProvider = null;
158                 if (solidObject != null) {
159                         solidObject.clearActors();
160                         solidObject = null;
161                 }
162                 if (solidModel != null) {
163                         solidModel.delete();
164                         solidModel = null;
165                 }
166                 if (meshObject != null) {
167                         meshObject.clearActors();
168                         meshObject = null;
169                 }
170                 if (mesh != null)
171                         mesh = null;
172                 
173         }
174
175         public Collection<vtkProp3D> getActors() {
176                 List<vtkProp3D> list = new ArrayList<vtkProp3D>();
177                 if (solidObject != null)
178                         list.addAll(solidObject.getActors());
179                 if (meshObject != null && meshObject.getActor() != null)
180                         list.add(meshObject.getActor());
181                 return list;
182         }
183         
184         public void stopVisualize() {
185                 if (solidObject != null) {
186                         solidObject.clearActorsVTK();
187                         solidObject = null;
188                 }
189                 if (solidModel != null) {
190                         solidModel.delete();
191                         solidModel = null;
192                 }
193                 if (meshObject != null) {
194                         meshObject.clearActorsVTK();
195                         meshObject = null;
196                 }
197                 if (mesh != null)
198                         mesh = null;
199                 
200         }
201         
202         private boolean selected = false;
203         private boolean hover = false;
204         
205         public void highlight(HighlightEventType type) {
206                 if (type == HighlightEventType.Selection || type == HighlightEventType.ClearSelection) {
207                         selected = type == HighlightEventType.Selection;
208 //                      hingeA.visualizeSolid(selected,true,false);
209 //                      hingeB.visualizeSolid(selected,true,false);
210                         updateVisuals(true, false);
211 //                      update(null);
212                 } else {
213                         hover = type == HighlightEventType.Hover;
214                         updateVisuals(false, true);
215                 }
216                 
217                 
218         }
219         
220         protected double[] getSelectedColor() {
221                 return new double[]{1,0,0};
222         }
223         
224         protected double[] getColor() {
225                 return new double[]{1,1,0};
226         }
227         
228         public void updateVisuals(boolean s, boolean h) {
229                 if (solidObject != null) {
230                         if (s) {
231                                 double color[];
232                                 if (selected) {
233                                         color = getSelectedColor();
234                                 
235                                 } else {
236                                         color = getColor();
237
238                                 }
239                                 for (vtkProp3D prop : solidObject.getSolid()) {
240                                         vtkProperty property = ((vtkActor)prop).GetProperty();
241                                         property.SetColor(color);
242                                         property.Delete();
243                                 }
244                         }
245                         if (h) {
246                                 double color[] = new double[]{0,0,0};
247                                 if (hover)
248                                         color = new double[]{1,0,1};
249                                 for (vtkProp3D prop : solidObject.getEdges()) {
250                                         vtkProperty property = ((vtkActor)prop).GetProperty();
251                                         property.SetColor(color);
252                                         property.Delete();
253                                 }
254                                 
255                         }
256                 } else if (meshObject != null) {
257                         if (s) {
258                                 double color[];
259                                 if (selected) {
260                                         color = getSelectedColor();
261                                 
262                                 } else {
263                                         color = getColor();
264
265                                 }
266                                 vtkProp3D prop = meshObject.getActor();
267                                 if (prop != null) {
268                                         vtkProperty property = ((vtkActor)prop).GetProperty();
269                                         property.SetColor(color);
270                                         property.Delete();
271                                 }
272                                 
273                         }
274                         if (h) {
275                                 double color[] = new double[]{0,0,0};
276                                 MeshActor actor = meshObject.getActor();
277                                 if (actor != null) {
278                                         vtkProperty property = actor.GetProperty();
279                                         if (hover) {
280                                                 color = new double[]{1,0,1};
281                                                 property.SetEdgeVisibility(1);
282                                                 property.SetEdgeColor(color);
283                                         } else {
284                                                 property.SetEdgeVisibility(0);
285                                                 property.SetEdgeColor(color);
286                                         }
287                                         property.Delete();
288                                 }
289                         }
290                 } else {
291 //                      if (s) {
292 //                              axes.addToRenderer();
293 //                              axes.setAxesVisibility(selected);
294 //                      }
295                 }
296         }
297 }