/******************************************************************************* * 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_MakeWire; import org.jcae.opencascade.jni.BRepOffsetAPI_ThruSections; import org.jcae.opencascade.jni.TopoDS_Edge; 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.RectangularSolid) public class RectangularSolidNode extends CSGnode { double x1 = 0.5; double x2 = 1.0; double y = 1.0; double z1 = 0.5; double z2 = 1.0; @RelatedSetValue(CSG.URIs.HasXAxisMinimumSize) @SetPropertyValue(CSG.URIs.HasXAxisMinimumSize) public void setX1(double d) { this.x1 = d; firePropertyChanged(CSG.URIs.HasXAxisMinimumSize); } @RelatedSetValue(CSG.URIs.HasXAxisMaximumSize) @SetPropertyValue(CSG.URIs.HasXAxisMaximumSize) public void setX2(double d) { this.x2 = d; firePropertyChanged(CSG.URIs.HasXAxisMaximumSize); } @RelatedSetValue(CSG.URIs.HasYAxisSize) @SetPropertyValue(CSG.URIs.HasYAxisSize) public void setSY(double d) { this.y = d; firePropertyChanged(CSG.URIs.HasYAxisSize); } @RelatedSetValue(CSG.URIs.HasZAxisMinimumSize) @SetPropertyValue(CSG.URIs.HasZAxisMinimumSize) public void setZ1(double d) { this.z1 = d; firePropertyChanged(CSG.URIs.HasZAxisMinimumSize); } @RelatedSetValue(CSG.URIs.HasZAxisMaximumSize) @SetPropertyValue(CSG.URIs.HasZAxisMaximumSize) public void setZ2(double d) { this.z2 = d; firePropertyChanged(CSG.URIs.HasZAxisMaximumSize); } @RelatedGetValue(CSG.URIs.HasXAxisMinimumSize) @GetPropertyValue(value=CSG.URIs.HasXAxisMinimumSize, name = "X Min Size") public double getX1() { return x1; } @RelatedGetValue(CSG.URIs.HasXAxisMaximumSize) @GetPropertyValue(value=CSG.URIs.HasXAxisMaximumSize, name = "X Max Size") public double getX2() { return x2; } @RelatedGetValue(CSG.URIs.HasYAxisSize) @GetPropertyValue(value=CSG.URIs.HasYAxisSize, name = "Y Size") public double getY() { return y; } @RelatedGetValue(CSG.URIs.HasZAxisMinimumSize) @GetPropertyValue(value=CSG.URIs.HasZAxisMinimumSize, name = "Z Min Size") public double getZ1() { return z1; } @RelatedGetValue(CSG.URIs.HasZAxisMaximumSize) @GetPropertyValue(value=CSG.URIs.HasZAxisMaximumSize, name = "Z Max Size") public double getZ2() { return z2; } @Override public TopoDS_Shape getBaseGeometry() { double x1 = this.x1 *0.5; double x2 = this.x2 *0.5; double z1 = this.z1 *0.5; double z2 = this.z2 *0.5; double y = this.y * 0.5; BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire(); BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(new double[]{x1,-y,z1},new double[]{x1,-y,-z1}); TopoDS_Edge top_edge = (TopoDS_Edge)edge.shape(); wire.add(top_edge); edge.delete(); top_edge.delete(); edge = new BRepBuilderAPI_MakeEdge(new double[]{x1,-y,-z1},new double[]{-x1,-y,-z1}); top_edge = (TopoDS_Edge)edge.shape(); wire.add(top_edge); edge.delete(); top_edge.delete(); edge = new BRepBuilderAPI_MakeEdge(new double[]{-x1,-y,-z1},new double[]{-x1,-y,z1}); top_edge = (TopoDS_Edge)edge.shape(); wire.add(top_edge); edge.delete(); top_edge.delete(); edge = new BRepBuilderAPI_MakeEdge(new double[]{-x1,-y,z1},new double[]{x1,-y,z1}); top_edge = (TopoDS_Edge)edge.shape(); wire.add(top_edge); edge.delete(); top_edge.delete(); TopoDS_Wire w1 = (TopoDS_Wire)wire.shape(); wire.delete(); wire = new BRepBuilderAPI_MakeWire(); edge = new BRepBuilderAPI_MakeEdge(new double[]{x2, y,z2},new double[]{x2, y,-z2}); top_edge = (TopoDS_Edge)edge.shape(); wire.add(top_edge); edge.delete(); top_edge.delete(); edge = new BRepBuilderAPI_MakeEdge(new double[]{x2, y,-z2},new double[]{-x2, y,-z2}); top_edge = (TopoDS_Edge)edge.shape(); wire.add(top_edge); edge.delete(); top_edge.delete(); edge = new BRepBuilderAPI_MakeEdge(new double[]{-x2, y,-z2},new double[]{-x2, y,z2}); top_edge = (TopoDS_Edge)edge.shape(); wire.add(top_edge); edge.delete(); top_edge.delete(); edge = new BRepBuilderAPI_MakeEdge(new double[]{-x2, y,z2},new double[]{x2, y,z2}); top_edge = (TopoDS_Edge)edge.shape(); wire.add(top_edge); edge.delete(); top_edge.delete(); TopoDS_Wire w2 = (TopoDS_Wire)wire.shape(); wire.delete(); BRepOffsetAPI_ThruSections generatorb = new BRepOffsetAPI_ThruSections(true, true); generatorb.addWire(w1); generatorb.addWire(w2); generatorb.build(); w1.delete(); w2.delete(); TopoDS_Shape shape = generatorb.shape(); generatorb.delete(); return shape; } }