1 package org.simantics.plant3d.geometry;
3 import java.util.Collection;
4 import java.util.Collections;
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;
21 public class HorizontalTankGeometryProvider extends BuiltinGeometryProvider {
23 public HorizontalTankGeometryProvider(Resource resource) {
27 private double length = 1.0;
28 private double radius = 0.2;
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};
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);
45 BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(m1.value());
46 TopoDS_Edge e1 = (TopoDS_Edge)edge.shape();
49 edge = new BRepBuilderAPI_MakeEdge(s1.value());
50 TopoDS_Edge e2 = (TopoDS_Edge)edge.shape();
53 edge = new BRepBuilderAPI_MakeEdge(m2.value());
54 TopoDS_Edge e3 = (TopoDS_Edge)edge.shape();
57 BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire(e1,e2,e3);
58 TopoDS_Wire w = (TopoDS_Wire)wire.shape();
61 BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w);
62 TopoDS_Face F = (TopoDS_Face) face.shape();
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();
78 TopoDS_Shape shape2 = OccTriangulator.makeTranslation(shape, 0.0, radius, 0.0);
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);
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);
89 return Collections.singletonList(shape2);
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");