]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.plant3d/src/org/simantics/plant3d/geometry/HorizontalTankGeometryProvider.java
Allow adding adjustable length components in the middle of a pipe
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / geometry / HorizontalTankGeometryProvider.java
1 package org.simantics.plant3d.geometry;
2
3 import java.util.Collection;
4 import java.util.Collections;
5 import java.util.Map;
6
7 import org.jcae.opencascade.jni.BRepBuilderAPI_MakeEdge;
8 import org.jcae.opencascade.jni.BRepBuilderAPI_MakeFace;
9 import org.jcae.opencascade.jni.BRepBuilderAPI_MakeWire;
10 import org.jcae.opencascade.jni.BRepPrimAPI_MakeRevol;
11 import org.jcae.opencascade.jni.GC_MakeArcOfCircle;
12 import org.jcae.opencascade.jni.GC_MakeSegment;
13 import org.jcae.opencascade.jni.TopoDS_Edge;
14 import org.jcae.opencascade.jni.TopoDS_Face;
15 import org.jcae.opencascade.jni.TopoDS_Shape;
16 import org.jcae.opencascade.jni.TopoDS_Wire;
17 import org.simantics.db.Resource;
18 import org.simantics.g3d.math.MathTools;
19 import org.simantics.opencascade.OccTriangulator;
20
21 public class HorizontalTankGeometryProvider extends BuiltinGeometryProvider  {
22         
23         public HorizontalTankGeometryProvider(Resource resource) {
24                 super(resource);
25         }
26
27         private double length = 1.0;
28         private double radius = 0.2;
29         
30         @Override
31         public Collection<TopoDS_Shape> getModel() throws Exception {
32                 if (radius < MathTools.NEAR_ZERO || length < MathTools.NEAR_ZERO)
33                         return Collections.emptyList();
34                 double p0[] = new double[]{ length*0.50,        0.0,0.0};
35                 double p1[] = new double[]{ length*0.488, radius*0.6,0.0};
36                 double p2[] = new double[]{ length*0.46,     radius,0.0};
37                 double p3[] = new double[]{-length*0.46,     radius,0.0};
38                 double p4[] = new double[]{-length*0.488, radius*0.6,0.0};
39                 double p5[] = new double[]{-length*0.50,        0.0,0.0};
40                 
41                 GC_MakeArcOfCircle m1 = new GC_MakeArcOfCircle(p0,p1,p2);
42                 GC_MakeSegment s1 = new GC_MakeSegment(p2,p3);
43                 GC_MakeArcOfCircle m2 = new GC_MakeArcOfCircle(p3,p4,p5);
44                 
45                 BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(m1.value());
46                 TopoDS_Edge e1 = (TopoDS_Edge)edge.shape();
47                 edge.delete();
48                 
49                 edge = new BRepBuilderAPI_MakeEdge(s1.value());
50                 TopoDS_Edge e2 = (TopoDS_Edge)edge.shape();
51                 edge.delete();
52                 
53                 edge = new BRepBuilderAPI_MakeEdge(m2.value());
54                 TopoDS_Edge e3 = (TopoDS_Edge)edge.shape();
55                 edge.delete();
56                 
57                 BRepBuilderAPI_MakeWire wire =  new BRepBuilderAPI_MakeWire(e1,e2,e3);
58                 TopoDS_Wire w = (TopoDS_Wire)wire.shape();
59                 wire.delete();
60                 
61                 BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w);
62                 TopoDS_Face F = (TopoDS_Face) face.shape();
63                 face.delete();
64                 
65                 BRepPrimAPI_MakeRevol revol = new BRepPrimAPI_MakeRevol(F,new double[]{0.0,0.0,0.0,1.0,0.0,0.0}); 
66                 TopoDS_Shape shape = revol.shape();
67                 revol.delete();
68         
69                 m1.delete();
70                 s1.delete();
71                 m2.delete();
72                 e1.delete();
73                 e2.delete();
74                 e3.delete();
75                 w.delete();
76                 F.delete();
77                 
78                 TopoDS_Shape shape2 = OccTriangulator.makeTranslation(shape, 0.0, radius, 0.0);
79                 shape.delete();
80                 TopoDS_Shape box = OccTriangulator.makeBox(-length*0.4, 0.0, -radius*0.5, -length*0.3, radius, radius*0.5);
81                 shape = OccTriangulator.makeFuse(shape2, box);
82                 shape2.delete();
83                 box.delete();
84                 box = OccTriangulator.makeBox(length*0.3, 0.0, -radius*0.5, length*0.4, radius, radius*0.5);
85                 shape2 = OccTriangulator.makeFuse(shape, box);
86                 shape.delete();
87                 box.delete();
88                 
89                 return Collections.singletonList(shape2);
90         }
91         
92         @Override
93         public void setProperties(Map<String, Object> props) {
94                 if (props.containsKey("length"))
95                         length = (Double)props.get("length");
96                 if (props.containsKey("radius")) {
97                         radius = (Double)props.get("radius");
98                 }
99                 
100         }
101
102 }