]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.plant3d/src/org/simantics/plant3d/scenegraph/GeometryComponent.java
0e53c1b6402860f002ef301b8b0ccadd706392c5
[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<>();
46                 calculatedParameters = new HashMap<>();
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 Map<String, Object> getTotalParameters() {
121         Map<String,Object> params = new HashMap<>();
122         params.putAll(currentParameters);
123         params.putAll(calculatedParameters);
124         return params;
125     }
126         
127         public void setParametersUpdated(boolean parametersUpdated) {
128                 this.parametersUpdated = parametersUpdated;
129         }
130         
131         public Set<String> setParameterMap(Map<String, Object> parameters) {
132                 Set<String> ids = new HashSet<String>();
133                 for (String id : parameters.keySet()) {
134                         Object currentValue = currentParameters.get(id);
135                         Object newValue = parameters.get(id);
136                         if (currentValue == newValue)
137                                 continue;
138                         if (currentValue instanceof Double) {
139                                 if (Math.abs((Double)currentValue-(Double)newValue) < MathTools.NEAR_ZERO)
140                                         continue;
141                         }
142                         currentParameters.put(id, newValue);
143                         parametersUpdated = true;
144                         ids.add(id);
145                 }
146                 return ids;
147         }
148         
149         public GeometryProvider getGeometry() {
150                 return geometryProvider;
151         }
152         
153         public void setGeometry(final GeometryProvider provider) {
154                 if (provider != null && provider.equals(geometryProvider))
155                         return;
156
157                 if (geometryProvider != null) {
158                         deleteData();
159                 }
160                 geometryProvider = provider;
161         }
162         
163         private void deleteData() {
164                 geometryProvider = null;
165                 if (solidObject != null) {
166                         solidObject.clearActors();
167                         solidObject = null;
168                 }
169                 if (solidModel != null) {
170                         solidModel.delete();
171                         solidModel = null;
172                 }
173                 if (meshObject != null) {
174                         meshObject.clearActors();
175                         meshObject = null;
176                 }
177                 if (mesh != null)
178                         mesh = null;
179                 
180         }
181
182         public Collection<vtkProp3D> getActors() {
183                 List<vtkProp3D> list = new ArrayList<vtkProp3D>();
184                 if (solidObject != null)
185                         list.addAll(solidObject.getActors());
186                 if (meshObject != null && meshObject.getActor() != null)
187                         list.add(meshObject.getActor());
188                 return list;
189         }
190         
191         public void stopVisualize() {
192                 if (solidObject != null) {
193                         solidObject.clearActorsVTK();
194                         solidObject = null;
195                 }
196                 if (solidModel != null) {
197                         solidModel.delete();
198                         solidModel = null;
199                 }
200                 if (meshObject != null) {
201                         meshObject.clearActorsVTK();
202                         meshObject = null;
203                 }
204                 if (mesh != null)
205                         mesh = null;
206                 
207         }
208         
209         private boolean selected = false;
210         private boolean hover = false;
211         
212         public void highlight(HighlightEventType type) {
213                 if (type == HighlightEventType.Selection || type == HighlightEventType.ClearSelection) {
214                         selected = type == HighlightEventType.Selection;
215 //                      hingeA.visualizeSolid(selected,true,false);
216 //                      hingeB.visualizeSolid(selected,true,false);
217                         updateVisuals(true, false);
218 //                      update(null);
219                 } else {
220                         hover = type == HighlightEventType.Hover;
221                         updateVisuals(false, true);
222                 }
223                 
224                 
225         }
226         
227         protected double[] getSelectedColor() {
228                 return new double[]{1,0,0};
229         }
230         
231         protected double[] getColor() {
232                 return new double[]{1,1,0};
233         }
234         
235         public void updateVisuals(boolean s, boolean h) {
236                 if (solidObject != null) {
237                         if (s) {
238                                 double color[];
239                                 if (selected) {
240                                         color = getSelectedColor();
241                                 
242                                 } else {
243                                         color = getColor();
244
245                                 }
246                                 for (vtkProp3D prop : solidObject.getSolid()) {
247                                         vtkProperty property = ((vtkActor)prop).GetProperty();
248                                         property.SetColor(color);
249                                         property.Delete();
250                                 }
251                         }
252                         if (h) {
253                                 double color[] = new double[]{0,0,0};
254                                 if (hover)
255                                         color = new double[]{1,0,1};
256                                 for (vtkProp3D prop : solidObject.getEdges()) {
257                                         vtkProperty property = ((vtkActor)prop).GetProperty();
258                                         property.SetColor(color);
259                                         property.Delete();
260                                 }
261                                 
262                         }
263                 } else if (meshObject != null) {
264                         if (s) {
265                                 double color[];
266                                 if (selected) {
267                                         color = getSelectedColor();
268                                 
269                                 } else {
270                                         color = getColor();
271
272                                 }
273                                 vtkProp3D prop = meshObject.getActor();
274                                 if (prop != null) {
275                                         vtkProperty property = ((vtkActor)prop).GetProperty();
276                                         property.SetColor(color);
277                                         property.Delete();
278                                 }
279                                 
280                         }
281                         if (h) {
282                                 double color[] = new double[]{0,0,0};
283                                 MeshActor actor = meshObject.getActor();
284                                 if (actor != null) {
285                                         vtkProperty property = actor.GetProperty();
286                                         if (hover) {
287                                                 color = new double[]{1,0,1};
288                                                 property.SetEdgeVisibility(1);
289                                                 property.SetEdgeColor(color);
290                                         } else {
291                                                 property.SetEdgeVisibility(0);
292                                                 property.SetEdgeColor(color);
293                                         }
294                                         property.Delete();
295                                 }
296                         }
297                 } else {
298 //                      if (s) {
299 //                              axes.addToRenderer();
300 //                              axes.setAxesVisibility(selected);
301 //                      }
302                 }
303         }
304 }