]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.plant3d/src/org/simantics/plant3d/geometry/HorizontalTankGeometryProvider.java
Publish Plant3D feature
[simantics/3d.git] / org.simantics.plant3d / src / org / simantics / plant3d / geometry / HorizontalTankGeometryProvider.java
diff --git a/org.simantics.plant3d/src/org/simantics/plant3d/geometry/HorizontalTankGeometryProvider.java b/org.simantics.plant3d/src/org/simantics/plant3d/geometry/HorizontalTankGeometryProvider.java
new file mode 100644 (file)
index 0000000..7a3dc41
--- /dev/null
@@ -0,0 +1,101 @@
+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");
+               }
+               
+       }
+
+}