/******************************************************************************* * Copyright (c) 2012, 2013 Association for Decentralized Information Management in * Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.g3d.csg.scenegraph2; 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.g3d.csg.ontology.CSG; import org.simantics.g3d.property.annotations.GetPropertyValue; import org.simantics.g3d.property.annotations.SetPropertyValue; import org.simantics.objmap.graph.annotations.GraphType; import org.simantics.objmap.graph.annotations.RelatedGetValue; import org.simantics.objmap.graph.annotations.RelatedSetValue; @GraphType(CSG.URIs.Barrel) public class BarrelNode extends CSGnode { private double r1 = 1.0; private double r2 = 1.1; private double h = 1.0; @RelatedSetValue(CSG.URIs.HasMinorRadius) @SetPropertyValue(CSG.URIs.HasMinorRadius) public void setR1(double r1) { this.r1 = r1; firePropertyChanged(CSG.URIs.HasMinorRadius); } @RelatedSetValue(CSG.URIs.HasMajorRadius) @SetPropertyValue(CSG.URIs.HasMajorRadius) public void setR2(double r2) { this.r2 = r2; firePropertyChanged(CSG.URIs.HasMajorRadius); } @RelatedSetValue(CSG.URIs.HasHeight) @SetPropertyValue(CSG.URIs.HasHeight) public void setH(double h) { this.h = h; firePropertyChanged(CSG.URIs.HasHeight); } @RelatedGetValue(CSG.URIs.HasHeight) @GetPropertyValue(value=CSG.URIs.HasHeight, name = "Height") public double getH() { return h; } @RelatedGetValue(CSG.URIs.HasMinorRadius) @GetPropertyValue(value=CSG.URIs.HasMinorRadius, name = "Minor Radius") public double getR1() { return r1; } @RelatedGetValue(CSG.URIs.HasMajorRadius) @GetPropertyValue(value=CSG.URIs.HasMajorRadius, name = "Major Radius") public double getR2() { return r2; } @Override public TopoDS_Shape getBaseGeometry() { if (Math.abs(r1 -r2)< MIN_VALUE) r2 = r1 + MIN_VALUE; double p0[] = new double[]{0.0,-h*0.5,0.0}; double p1[] = new double[]{0.0,-h*0.5,r1}; double p2[] = new double[]{0.0, 0.0 ,r2}; double p3[] = new double[]{0.0, h*0.5,r1}; double p4[] = new double[]{0.0, h*0.5,0.0}; GC_MakeArcOfCircle m = new GC_MakeArcOfCircle(p1,p2,p3); GC_MakeSegment s1 = new GC_MakeSegment(p0,p1); GC_MakeSegment s2 = new GC_MakeSegment(p3,p4); BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(s1.value()); TopoDS_Edge e1 = (TopoDS_Edge)edge.shape(); edge.delete(); edge = new BRepBuilderAPI_MakeEdge(m.value()); TopoDS_Edge e2 = (TopoDS_Edge)edge.shape(); edge.delete(); edge = new BRepBuilderAPI_MakeEdge(s2.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,0.0,1.0,0.0}); TopoDS_Shape shape = revol.shape(); revol.delete(); m.delete(); s1.delete(); s2.delete(); e1.delete(); e2.delete(); e3.delete(); w.delete(); F.delete(); return shape; } }