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.g3d.math.MathTools; 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 getModel() throws Exception { if (radius < MathTools.NEAR_ZERO || length < MathTools.NEAR_ZERO) return Collections.emptyList(); 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(); TopoDS_Shape box = OccTriangulator.makeBox(-length*0.4, 0.0, -radius*0.5, -length*0.3, radius, radius*0.5); shape = OccTriangulator.makeFuse(shape2, box); shape2.delete(); box.delete(); box = OccTriangulator.makeBox(length*0.3, 0.0, -radius*0.5, length*0.4, radius, radius*0.5); shape2 = OccTriangulator.makeFuse(shape, box); shape.delete(); box.delete(); return Collections.singletonList(shape2); } @Override public void setProperties(Map props) { if (props.containsKey("length")) length = (Double)props.get("length"); if (props.containsKey("radius")) { radius = (Double)props.get("radius"); } } }