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 abstract class GeometryNode extends P3DNode implements ParameterizedNode, NodeHighlighter {
30 private TopoDS_Shape solidModel;
31 private vtkSolidObject solidObject;
33 private Map<String,Object> currentParameters;
34 private Map<String,Object> calculatedParameters;
36 private boolean parametersUpdated = true;
38 public GeometryNode() {
39 currentParameters = new HashMap<String, Object>();
40 calculatedParameters = new HashMap<String, Object>();
44 public void visualize(vtkPanel panel) {
45 if (solidModelProvider != null) {
48 if (solidModel == null || parametersUpdated) {
52 if ((solidObject == null || parametersUpdated) && solidModel != null) {
53 solidObject = new vtkSolidObject(panel, solidModel);
55 if (solidObject != null) {
56 solidObject.visualizeSolid(true,true, false,false);
57 updateVisuals(true, true);
59 parametersUpdated = false;
63 public void updateParameters() {
64 if (solidModelProvider instanceof ParametricSolidModelProvider) {
65 ((ParametricSolidModelProvider)solidModelProvider).setProperties(currentParameters);
66 ((ParametricSolidModelProvider)solidModelProvider).updateCalculatedProperties(calculatedParameters);
70 private void createGeometry() {
71 Collection<TopoDS_Shape> shapes;
73 shapes = solidModelProvider.getModel();
74 if (shapes.size() == 1) {
75 solidModel = shapes.iterator().next();
77 solidModel = OccTriangulator.makeCompound(shapes.toArray(new TopoDS_Shape[shapes.size()]));
78 for (TopoDS_Shape shape : shapes) {
83 } catch (Exception e) {
84 // TODO Auto-generated catch block
89 public Map<String, Object> getParameterMap() {
90 return Collections.unmodifiableMap(currentParameters);
93 public Map<String, Object> getCalculatedParameters() {
94 return calculatedParameters;
97 public void setParametersUpdated(boolean parametersUpdated) {
98 this.parametersUpdated = parametersUpdated;
101 public void setParameterMap(Map<String, Object> parameters) {
102 for (String id : parameters.keySet()) {
103 Object currentValue = currentParameters.get(id);
104 Object newValue = parameters.get(id);
105 if (currentValue == newValue)
107 if (currentValue instanceof Double) {
108 if (Math.abs((Double)currentValue-(Double)newValue) < MathTools.NEAR_ZERO)
111 currentParameters.put(id, newValue);
112 parametersUpdated = true;
113 firePropertyChanged(id);
117 private SolidModelProvider solidModelProvider;
119 @RelatedGetObj(Plant3D.URIs.hasGeometry)
120 public SolidModelProvider getGeometry() {
121 return solidModelProvider;
124 @RelatedSetObj(Plant3D.URIs.hasGeometry)
125 public void setGeometry(final SolidModelProvider provider) {
126 if (provider != null && provider.equals(solidModelProvider))
129 if (solidModelProvider != null) {
132 solidModelProvider = provider;
133 firePropertyChanged(Plant3D.URIs.hasGeometry);
136 private void deleteData() {
137 solidModelProvider = null;
138 if (solidObject != null) {
139 solidObject.clearActors();
142 if (solidModel != null) {
149 public Collection<vtkProp3D> getActors() {
150 List<vtkProp3D> list = new ArrayList<vtkProp3D>();
151 if (solidObject != null)
152 list.addAll(solidObject.getActors());
157 public void stopVisualize() {
158 if (solidObject != null) {
159 solidObject.clearActorsAWT();
162 if (solidModel != null) {
169 private boolean selected = false;
170 private boolean hover = false;
173 public void highlight(HighlightEventType type) {
174 if (type == HighlightEventType.Selection || type == HighlightEventType.ClearSelection) {
175 selected = type == HighlightEventType.Selection;
176 // hingeA.visualizeSolid(selected,true,false);
177 // hingeB.visualizeSolid(selected,true,false);
178 updateVisuals(true, false);
181 hover = type == HighlightEventType.Hover;
182 updateVisuals(false, true);
188 protected double[] getSelectedColor() {
189 return new double[]{1,0,0};
192 protected double[] getColor() {
193 return new double[]{1,1,0};
196 private void updateVisuals(boolean s, boolean h) {
197 if (solidObject != null) {
201 color = getSelectedColor();
207 for (vtkProp3D prop : solidObject.getSolid()) {
208 vtkProperty property = ((vtkActor)prop).GetProperty();
209 property.SetColor(color);
214 double color[] = new double[]{0,0,0};
216 color = new double[]{1,0,1};
217 for (vtkProp3D prop : solidObject.getEdges()) {
218 vtkProperty property = ((vtkActor)prop).GetProperty();
219 property.SetColor(color);
226 // axes.addToRenderer();
227 // axes.setAxesVisibility(selected);
232 public void update(vtkRenderer ren) {
233 vtkUtil.updateTransform(getActors(), getWorldPosition(), getWorldOrientation());
236 public TopoDS_Shape getSolidModel() {