--- /dev/null
+package org.simantics.plant3d.geometry;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.jcae.opencascade.jni.BRepBuilderAPI_MakeEdge;
+import org.jcae.opencascade.jni.BRepBuilderAPI_MakeFace;
+import org.jcae.opencascade.jni.BRepBuilderAPI_MakeWire;
+import org.jcae.opencascade.jni.BRepPrimAPI_MakeRevol;
+import org.jcae.opencascade.jni.GC_MakeArcOfCircle;
+import org.jcae.opencascade.jni.GC_MakeSegment;
+import org.jcae.opencascade.jni.TopoDS_Edge;
+import org.jcae.opencascade.jni.TopoDS_Face;
+import org.jcae.opencascade.jni.TopoDS_Shape;
+import org.jcae.opencascade.jni.TopoDS_Wire;
+import org.simantics.db.Resource;
+import org.simantics.opencascade.OccTriangulator;
+
+public class HorizontalTankGeometryProvider extends BuiltinGeometryProvider {
+
+ public HorizontalTankGeometryProvider(Resource resource) {
+ super(resource);
+ }
+
+ private double length = 1.0;
+ private double radius = 0.2;
+
+ @Override
+ public Collection<TopoDS_Shape> getModel() throws Exception {
+
+ double p0[] = new double[]{-length*0.50, 0.0,0.0};
+ double p1[] = new double[]{-length*0.488, radius*0.6,0.0};
+ double p2[] = new double[]{-length*0.46, radius,0.0};
+ double p3[] = new double[]{ length*0.46, radius,0.0};
+ double p4[] = new double[]{ length*0.488, radius*0.6,0.0};
+ double p5[] = new double[]{ length*0.50, 0.0,0.0};
+
+ GC_MakeArcOfCircle m1 = new GC_MakeArcOfCircle(p0,p1,p2);
+ GC_MakeSegment s1 = new GC_MakeSegment(p2,p3);
+ GC_MakeArcOfCircle m2 = new GC_MakeArcOfCircle(p3,p4,p5);
+
+ BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(m1.value());
+ TopoDS_Edge e1 = (TopoDS_Edge)edge.shape();
+ edge.delete();
+
+ edge = new BRepBuilderAPI_MakeEdge(s1.value());
+ TopoDS_Edge e2 = (TopoDS_Edge)edge.shape();
+ edge.delete();
+
+ edge = new BRepBuilderAPI_MakeEdge(m2.value());
+ TopoDS_Edge e3 = (TopoDS_Edge)edge.shape();
+ edge.delete();
+
+ BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire(e1,e2,e3);
+ TopoDS_Wire w = (TopoDS_Wire)wire.shape();
+ wire.delete();
+
+ BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w);
+ TopoDS_Face F = (TopoDS_Face) face.shape();
+ face.delete();
+
+ BRepPrimAPI_MakeRevol revol = new BRepPrimAPI_MakeRevol(F,new double[]{0.0,0.0,0.0,1.0,0.0,0.0});
+ TopoDS_Shape shape = revol.shape();
+ revol.delete();
+
+ m1.delete();
+ s1.delete();
+ m2.delete();
+ e1.delete();
+ e2.delete();
+ e3.delete();
+ w.delete();
+ F.delete();
+
+ TopoDS_Shape shape2 = OccTriangulator.makeTranslation(shape, 0.0, radius, 0.0);
+ shape.delete();
+ shape = shape2;
+ TopoDS_Shape box = OccTriangulator.makeBox(-length*0.4, 0.0, -radius*0.5, -length*0.3, radius, radius*0.5);
+ shape2 = OccTriangulator.makeFuse(shape, box);
+ shape.delete();
+ box.delete();
+ box = OccTriangulator.makeBox(length*0.3, 0.0, -radius*0.5, length*0.4, radius, radius*0.5);
+ shape = OccTriangulator.makeFuse(shape2, box);
+ shape2.delete();
+ box.delete();
+
+ return Collections.singletonList(shape);
+ }
+
+ @Override
+ public void setProperties(Map<String, Object> props) {
+ if (props.containsKey("length"))
+ length = (Double)props.get("length");
+ if (props.containsKey("radius")) {
+ radius = (Double)props.get("radius");
+ }
+
+ }
+
+}