X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.opencascade%2Fsrc%2Forg%2Fsimantics%2Fopencascade%2FOccTriangulator.java;fp=org.simantics.opencascade%2Fsrc%2Forg%2Fsimantics%2Fopencascade%2FOccTriangulator.java;h=5226eb8329836784002b1018445074ca843b31ca;hb=6c85a1331df92384baa03b3968ea6f06459a04ab;hp=3cc0ff4dd5af0bbbca829a300b890ee8b9a90415;hpb=1e885c30936c7df2efda5a00bfdc127ee059dee0;p=simantics%2F3d.git diff --git a/org.simantics.opencascade/src/org/simantics/opencascade/OccTriangulator.java b/org.simantics.opencascade/src/org/simantics/opencascade/OccTriangulator.java index 3cc0ff4d..5226eb83 100644 --- a/org.simantics.opencascade/src/org/simantics/opencascade/OccTriangulator.java +++ b/org.simantics.opencascade/src/org/simantics/opencascade/OccTriangulator.java @@ -1,326 +1,326 @@ -package org.simantics.opencascade; - -/******************************************************************************* - * Copyright (c) 2007, 2013- VTT Technical Research Centre of Finland. - * 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 - *******************************************************************************/ - -import javax.vecmath.Vector2d; - -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.BRepBuilderAPI_Transform; -import org.jcae.opencascade.jni.BRepPrimAPI_MakePrism; -import org.jcae.opencascade.jni.BRepPrimAPI_MakeTorus; -import org.jcae.opencascade.jni.BRep_Builder; -import org.jcae.opencascade.jni.GP_Elips; -import org.jcae.opencascade.jni.GP_Trsf; -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; - - -public class OccTriangulator { - - - public static final double MIN_VALUE = 0.001; - - public OccTriangulator() { - - } - - - public static TopoDS_Shape getShapeFromFile(String filename) { - assert (filename != null); - String lowerFileName = filename.toLowerCase(); - if (lowerFileName.endsWith(".stp") || lowerFileName.endsWith(".step")) { - TopoDS_Shape shape = importSTEP(filename); - return shape; - } else if (lowerFileName.endsWith(".iges")) { - TopoDS_Shape shape = importIGES(filename); - return shape; - } else if (lowerFileName.endsWith(".brep")) { - TopoDS_Shape shape = importBREP(filename); - return shape; - } else { - throw new UnsupportedOperationException("Unsupported format " + filename); - } - } - - public static TopoDS_Shape importBREP(String filename) { - return importBREP(filename,1.0); // convert to meters. - } - public static TopoDS_Shape importBREP(String filename, double scale) { - org.jcae.opencascade.jni.BRep_Builder aBuilder = new org.jcae.opencascade.jni.BRep_Builder(); - org.jcae.opencascade.jni.TopoDS_Shape myShape = org.jcae.opencascade.jni.BRepTools.read(filename, aBuilder); - aBuilder.delete(); - if (Math.abs(scale-1.0) < 0.001) - return myShape; - TopoDS_Shape scaled = makeScale(myShape, scale); - myShape.delete(); - return scaled; - } - - public static TopoDS_Shape importIGES(String filename) { - org.jcae.opencascade.jni.IGESControl_Reader aReader = new org.jcae.opencascade.jni.IGESControl_Reader(); - aReader.setReadUnitM(); - aReader.readFile(filename.getBytes()); - aReader.clearShapes(); - aReader.transferRoots(); - TopoDS_Shape result = aReader.oneShape(); - aReader.delete(); - return result; - } - - public static TopoDS_Shape importSTEP(String filename) { - org.jcae.opencascade.jni.STEPControl_Reader aReader = new org.jcae.opencascade.jni.STEPControl_Reader(); - aReader.setReadUnitM(); - aReader.readFile(filename.getBytes()); - aReader.clearShapes(); - aReader.transferRoots(); - TopoDS_Shape result = aReader.oneShape(); - aReader.delete(); - return result; - } - - - - public static TopoDS_Shape makeTranslation(TopoDS_Shape aShape, double x, double y, double z) { - GP_Trsf theTransformation = new GP_Trsf(); - theTransformation.setTranslation(new double[] { x, y, z }); - BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true); - - TopoDS_Shape shape = bt.shape(); - bt.delete(); - theTransformation.delete(); - return shape; - } - - public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2) { - double[] axe = new double[6]; - System.arraycopy(pointStruct, 0, axe, 0, 3); - System.arraycopy(dirStruct, 0, axe, 3, 3); - BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2); - org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape(); - torus.delete(); - return tds; - } - - - public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double[] dirStruct2, double r1, double r2) { - double[] axe = new double[9]; - System.arraycopy(pointStruct, 0, axe, 0, 3); - System.arraycopy(dirStruct, 0, axe, 3, 3); - System.arraycopy(dirStruct2, 0, axe, 6, 3); - BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2); - org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape(); - torus.delete(); - return tds; - } - - public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2, double angle1, double angle2, double angle) { - double[] axe = new double[6]; - System.arraycopy(pointStruct, 0, axe, 0, 3); - System.arraycopy(dirStruct, 0, axe, 3, 3); - BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2,angle1,angle2,angle); - org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape(); - torus.delete(); - return tds; - } - - public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double[] dirStruct2, double r1, double r2, double angle1, double angle2, double angle) { - double[] axe = new double[9]; - System.arraycopy(pointStruct, 0, axe, 0, 3); - System.arraycopy(dirStruct, 0, axe, 3, 3); - System.arraycopy(dirStruct2, 0, axe, 6, 3); - BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2,angle1,angle2,angle); - org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape(); - torus.delete(); - return tds; - } - - public static TopoDS_Shape makeSphere(double x, double y, double z, double radius) { - double[] c = new double[] { x, y, z }; - org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere sphere = new org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere(c, radius); - org.jcae.opencascade.jni.TopoDS_Shape tds = sphere.shape(); - sphere.delete(); - return tds; - } - - - public static TopoDS_Shape makeRotation(TopoDS_Shape aShape, double[] axisStruct, double angle) { - - GP_Trsf theTransformation = new GP_Trsf(); - theTransformation.setRotation(axisStruct, angle); - BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true); - TopoDS_Shape shape = bt.shape(); - bt.delete(); - theTransformation.delete(); - return shape; - } - - public static TopoDS_Shape makeScale(TopoDS_Shape aShape, double s) { - - GP_Trsf theTransformation = new GP_Trsf(); - theTransformation.setValues(s, 0, 0, 0, - 0, s, 0, 0, - 0, 0, s, 0, 1, 1); - BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true); - TopoDS_Shape shape = bt.shape(); - bt.delete(); - theTransformation.delete(); - return shape; - } - - - public static TopoDS_Shape makeCylinder(double[] pointStruct, double[] dirStruct, double radius, double height) { - double[] axe = new double[6]; - System.arraycopy(pointStruct, 0, axe, 0, 3); - System.arraycopy(dirStruct, 0, axe, 3, 3); - org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder cyl = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder(axe, radius, height, 2 * Math.PI); - org.jcae.opencascade.jni.TopoDS_Shape tds = cyl.shape(); - cyl.delete(); - return tds; - } - - public static TopoDS_Shape makeCopy(TopoDS_Shape topoDS_Shape) { - throw new UnsupportedOperationException(); - } - - public static TopoDS_Shape makeCone(double[] pointStruct, double[] dirStruct, double radius1, double radius2, double height) { - double[] axe = new double[6]; - System.arraycopy(pointStruct, 0, axe, 0, 3); - System.arraycopy(dirStruct, 0, axe, 3, 3); - org.jcae.opencascade.jni.BRepPrimAPI_MakeCone cone = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCone(axe, radius1, radius2, height, 2 * Math.PI); - org.jcae.opencascade.jni.TopoDS_Shape tds = cone.shape(); - cone.delete(); - return tds; - } - - public static TopoDS_Shape makeCompound(TopoDS_Shape[] shapes) { - BRep_Builder builder = new BRep_Builder(); - org.jcae.opencascade.jni.TopoDS_Compound comp = new org.jcae.opencascade.jni.TopoDS_Compound(); - builder.makeCompound(comp); - for (int i = 0; i < shapes.length; i++) { - - builder.add(comp, shapes[i]); - } - builder.delete(); - return comp; - } - - - public static TopoDS_Shape makeBox(double x1, double y1, double z1, double x2, double y2, double z2) { - double[] p1 = new double[] { x1, y1, z1 }; - double[] p2 = new double[] { x2, y2, z2 }; - org.jcae.opencascade.jni.BRepPrimAPI_MakeBox box = new org.jcae.opencascade.jni.BRepPrimAPI_MakeBox(p1, p2); - org.jcae.opencascade.jni.TopoDS_Shape tds = box.shape(); - box.delete(); - return tds; - } - - public static TopoDS_Shape makeCut(TopoDS_Shape shape1, TopoDS_Shape shape2) { - org.jcae.opencascade.jni.BRepAlgoAPI_Cut cut = new org.jcae.opencascade.jni.BRepAlgoAPI_Cut(shape1, shape2); - org.jcae.opencascade.jni.TopoDS_Shape s = cut.shape(); - cut.delete(); - return s; - } - - public static TopoDS_Shape makeCommon(TopoDS_Shape shape1, TopoDS_Shape shape2) { - org.jcae.opencascade.jni.BRepAlgoAPI_Common common = new org.jcae.opencascade.jni.BRepAlgoAPI_Common(shape1, shape2); - org.jcae.opencascade.jni.TopoDS_Shape s = common.shape(); - common.delete(); - return s; - } - - public static TopoDS_Shape makeFuse(TopoDS_Shape shape1, TopoDS_Shape shape2) { - org.jcae.opencascade.jni.BRepAlgoAPI_Fuse fuse = new org.jcae.opencascade.jni.BRepAlgoAPI_Fuse(shape1, shape2); - org.jcae.opencascade.jni.TopoDS_Shape s = fuse.shape(); - fuse.delete(); - return s; - } - - - public static TopoDS_Shape makeWedge(double[] pointStruct, double[] dirStruct,double dx, double dy, double dz, double xmin, double zmin, double xmax, double zmax) { - double[] axe = new double[6]; - System.arraycopy(pointStruct, 0, axe, 0, 3); - System.arraycopy(dirStruct, 0, axe, 3, 3); - - org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge wedge = new org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge(axe, dx, dy, dz, xmin, zmin, xmax, zmax); - org.jcae.opencascade.jni.TopoDS_Shape s = wedge.shape(); - wedge.delete(); - return s; - } - - public static TopoDS_Shape makeEllipticCylinder(double h, double r1, double r2) { - GP_Elips ellipse; - if (r1 < r2) { - // FIXME : ellipse should be rotated, but current JNI won't allow it since Ax2 is not separate object - ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r2,r1); - } else { - ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r1,r2); - } - BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(ellipse); - TopoDS_Edge ed = (TopoDS_Edge) edge.shape(); - BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire(ed); - TopoDS_Wire w = (TopoDS_Wire) wire.shape(); - BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w); - TopoDS_Face F = (TopoDS_Face) face.shape(); - BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 }); - TopoDS_Shape shape = prism.shape(); - ellipse.delete(); - edge.delete(); - wire.delete(); - face.delete(); - ed.delete(); - w.delete(); - F.delete(); - prism.delete(); - return shape; - } - - public static TopoDS_Shape makeReqularPrism(double h, double r, int n) { - if (n < 3) - n = 3; - Vector2d vertices[] = new Vector2d[n]; - for (int i = 0; i < n; i++) { - vertices[i] = new Vector2d(Math.sin(Math.PI * 2.0 * i / n)*r,Math.cos(Math.PI * 2.0 * i / n)*r); - } - BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire(); - for (int i = 0; i < n; i++) { - Vector2d v1 = vertices[i]; - Vector2d v2 = vertices[(i+1)%n]; - BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(new double[]{v1.x,-h*0.5,v1.y},new double[]{v2.x,-h*0.5,v2.y}); - wire.add((TopoDS_Edge)edge.shape()); - edge.delete(); - } - TopoDS_Wire w = (TopoDS_Wire)wire.shape(); - - BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w); - TopoDS_Face F = (TopoDS_Face) face.shape(); - face.delete(); - - BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 }); - TopoDS_Shape shape = prism.shape(); - prism.delete(); - - wire.delete(); - w.delete(); - F.delete(); - return shape; - } - - - public static void exportBREP(TopoDS_Shape shape, String filename) { - org.jcae.opencascade.jni.BRepTools.write(shape, filename); - } - -} +package org.simantics.opencascade; + +/******************************************************************************* + * Copyright (c) 2007, 2013- VTT Technical Research Centre of Finland. + * 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 + *******************************************************************************/ + +import javax.vecmath.Vector2d; + +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.BRepBuilderAPI_Transform; +import org.jcae.opencascade.jni.BRepPrimAPI_MakePrism; +import org.jcae.opencascade.jni.BRepPrimAPI_MakeTorus; +import org.jcae.opencascade.jni.BRep_Builder; +import org.jcae.opencascade.jni.GP_Elips; +import org.jcae.opencascade.jni.GP_Trsf; +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; + + +public class OccTriangulator { + + + public static final double MIN_VALUE = 0.001; + + public OccTriangulator() { + + } + + + public static TopoDS_Shape getShapeFromFile(String filename) { + assert (filename != null); + String lowerFileName = filename.toLowerCase(); + if (lowerFileName.endsWith(".stp") || lowerFileName.endsWith(".step")) { + TopoDS_Shape shape = importSTEP(filename); + return shape; + } else if (lowerFileName.endsWith(".iges")) { + TopoDS_Shape shape = importIGES(filename); + return shape; + } else if (lowerFileName.endsWith(".brep")) { + TopoDS_Shape shape = importBREP(filename); + return shape; + } else { + throw new UnsupportedOperationException("Unsupported format " + filename); + } + } + + public static TopoDS_Shape importBREP(String filename) { + return importBREP(filename,1.0); // convert to meters. + } + public static TopoDS_Shape importBREP(String filename, double scale) { + org.jcae.opencascade.jni.BRep_Builder aBuilder = new org.jcae.opencascade.jni.BRep_Builder(); + org.jcae.opencascade.jni.TopoDS_Shape myShape = org.jcae.opencascade.jni.BRepTools.read(filename, aBuilder); + aBuilder.delete(); + if (Math.abs(scale-1.0) < 0.001) + return myShape; + TopoDS_Shape scaled = makeScale(myShape, scale); + myShape.delete(); + return scaled; + } + + public static TopoDS_Shape importIGES(String filename) { + org.jcae.opencascade.jni.IGESControl_Reader aReader = new org.jcae.opencascade.jni.IGESControl_Reader(); + aReader.setReadUnitM(); + aReader.readFile(filename.getBytes()); + aReader.clearShapes(); + aReader.transferRoots(); + TopoDS_Shape result = aReader.oneShape(); + aReader.delete(); + return result; + } + + public static TopoDS_Shape importSTEP(String filename) { + org.jcae.opencascade.jni.STEPControl_Reader aReader = new org.jcae.opencascade.jni.STEPControl_Reader(); + aReader.setReadUnitM(); + aReader.readFile(filename.getBytes()); + aReader.clearShapes(); + aReader.transferRoots(); + TopoDS_Shape result = aReader.oneShape(); + aReader.delete(); + return result; + } + + + + public static TopoDS_Shape makeTranslation(TopoDS_Shape aShape, double x, double y, double z) { + GP_Trsf theTransformation = new GP_Trsf(); + theTransformation.setTranslation(new double[] { x, y, z }); + BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true); + + TopoDS_Shape shape = bt.shape(); + bt.delete(); + theTransformation.delete(); + return shape; + } + + public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2) { + double[] axe = new double[6]; + System.arraycopy(pointStruct, 0, axe, 0, 3); + System.arraycopy(dirStruct, 0, axe, 3, 3); + BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2); + org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape(); + torus.delete(); + return tds; + } + + + public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double[] dirStruct2, double r1, double r2) { + double[] axe = new double[9]; + System.arraycopy(pointStruct, 0, axe, 0, 3); + System.arraycopy(dirStruct, 0, axe, 3, 3); + System.arraycopy(dirStruct2, 0, axe, 6, 3); + BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2); + org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape(); + torus.delete(); + return tds; + } + + public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double r1, double r2, double angle1, double angle2, double angle) { + double[] axe = new double[6]; + System.arraycopy(pointStruct, 0, axe, 0, 3); + System.arraycopy(dirStruct, 0, axe, 3, 3); + BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2,angle1,angle2,angle); + org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape(); + torus.delete(); + return tds; + } + + public static TopoDS_Shape makeTorus(double[] pointStruct, double[] dirStruct, double[] dirStruct2, double r1, double r2, double angle1, double angle2, double angle) { + double[] axe = new double[9]; + System.arraycopy(pointStruct, 0, axe, 0, 3); + System.arraycopy(dirStruct, 0, axe, 3, 3); + System.arraycopy(dirStruct2, 0, axe, 6, 3); + BRepPrimAPI_MakeTorus torus = new BRepPrimAPI_MakeTorus(axe, r1, r2,angle1,angle2,angle); + org.jcae.opencascade.jni.TopoDS_Shape tds = torus.shape(); + torus.delete(); + return tds; + } + + public static TopoDS_Shape makeSphere(double x, double y, double z, double radius) { + double[] c = new double[] { x, y, z }; + org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere sphere = new org.jcae.opencascade.jni.BRepPrimAPI_MakeSphere(c, radius); + org.jcae.opencascade.jni.TopoDS_Shape tds = sphere.shape(); + sphere.delete(); + return tds; + } + + + public static TopoDS_Shape makeRotation(TopoDS_Shape aShape, double[] axisStruct, double angle) { + + GP_Trsf theTransformation = new GP_Trsf(); + theTransformation.setRotation(axisStruct, angle); + BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true); + TopoDS_Shape shape = bt.shape(); + bt.delete(); + theTransformation.delete(); + return shape; + } + + public static TopoDS_Shape makeScale(TopoDS_Shape aShape, double s) { + + GP_Trsf theTransformation = new GP_Trsf(); + theTransformation.setValues(s, 0, 0, 0, + 0, s, 0, 0, + 0, 0, s, 0); + BRepBuilderAPI_Transform bt = new BRepBuilderAPI_Transform(aShape, theTransformation, true); + TopoDS_Shape shape = bt.shape(); + bt.delete(); + theTransformation.delete(); + return shape; + } + + + public static TopoDS_Shape makeCylinder(double[] pointStruct, double[] dirStruct, double radius, double height) { + double[] axe = new double[6]; + System.arraycopy(pointStruct, 0, axe, 0, 3); + System.arraycopy(dirStruct, 0, axe, 3, 3); + org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder cyl = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCylinder(axe, radius, height, 2 * Math.PI); + org.jcae.opencascade.jni.TopoDS_Shape tds = cyl.shape(); + cyl.delete(); + return tds; + } + + public static TopoDS_Shape makeCopy(TopoDS_Shape topoDS_Shape) { + throw new UnsupportedOperationException(); + } + + public static TopoDS_Shape makeCone(double[] pointStruct, double[] dirStruct, double radius1, double radius2, double height) { + double[] axe = new double[6]; + System.arraycopy(pointStruct, 0, axe, 0, 3); + System.arraycopy(dirStruct, 0, axe, 3, 3); + org.jcae.opencascade.jni.BRepPrimAPI_MakeCone cone = new org.jcae.opencascade.jni.BRepPrimAPI_MakeCone(axe, radius1, radius2, height, 2 * Math.PI); + org.jcae.opencascade.jni.TopoDS_Shape tds = cone.shape(); + cone.delete(); + return tds; + } + + public static TopoDS_Shape makeCompound(TopoDS_Shape[] shapes) { + BRep_Builder builder = new BRep_Builder(); + org.jcae.opencascade.jni.TopoDS_Compound comp = new org.jcae.opencascade.jni.TopoDS_Compound(); + builder.makeCompound(comp); + for (int i = 0; i < shapes.length; i++) { + + builder.add(comp, shapes[i]); + } + builder.delete(); + return comp; + } + + + public static TopoDS_Shape makeBox(double x1, double y1, double z1, double x2, double y2, double z2) { + double[] p1 = new double[] { x1, y1, z1 }; + double[] p2 = new double[] { x2, y2, z2 }; + org.jcae.opencascade.jni.BRepPrimAPI_MakeBox box = new org.jcae.opencascade.jni.BRepPrimAPI_MakeBox(p1, p2); + org.jcae.opencascade.jni.TopoDS_Shape tds = box.shape(); + box.delete(); + return tds; + } + + public static TopoDS_Shape makeCut(TopoDS_Shape shape1, TopoDS_Shape shape2) { + org.jcae.opencascade.jni.BRepAlgoAPI_Cut cut = new org.jcae.opencascade.jni.BRepAlgoAPI_Cut(shape1, shape2); + org.jcae.opencascade.jni.TopoDS_Shape s = cut.shape(); + cut.delete(); + return s; + } + + public static TopoDS_Shape makeCommon(TopoDS_Shape shape1, TopoDS_Shape shape2) { + org.jcae.opencascade.jni.BRepAlgoAPI_Common common = new org.jcae.opencascade.jni.BRepAlgoAPI_Common(shape1, shape2); + org.jcae.opencascade.jni.TopoDS_Shape s = common.shape(); + common.delete(); + return s; + } + + public static TopoDS_Shape makeFuse(TopoDS_Shape shape1, TopoDS_Shape shape2) { + org.jcae.opencascade.jni.BRepAlgoAPI_Fuse fuse = new org.jcae.opencascade.jni.BRepAlgoAPI_Fuse(shape1, shape2); + org.jcae.opencascade.jni.TopoDS_Shape s = fuse.shape(); + fuse.delete(); + return s; + } + + + public static TopoDS_Shape makeWedge(double[] pointStruct, double[] dirStruct,double dx, double dy, double dz, double xmin, double zmin, double xmax, double zmax) { + double[] axe = new double[6]; + System.arraycopy(pointStruct, 0, axe, 0, 3); + System.arraycopy(dirStruct, 0, axe, 3, 3); + + org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge wedge = new org.jcae.opencascade.jni.BRepPrimAPI_MakeWedge(axe, dx, dy, dz, xmin, zmin, xmax, zmax); + org.jcae.opencascade.jni.TopoDS_Shape s = wedge.shape(); + wedge.delete(); + return s; + } + + public static TopoDS_Shape makeEllipticCylinder(double h, double r1, double r2) { + GP_Elips ellipse; + if (r1 < r2) { + // FIXME : ellipse should be rotated, but current JNI won't allow it since Ax2 is not separate object + ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r2,r1); + } else { + ellipse = new GP_Elips(new double[]{0.0,-h*0.5,0.0,0.0,1.0,0.0},r1,r2); + } + BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(ellipse); + TopoDS_Edge ed = (TopoDS_Edge) edge.shape(); + BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire(ed); + TopoDS_Wire w = (TopoDS_Wire) wire.shape(); + BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w); + TopoDS_Face F = (TopoDS_Face) face.shape(); + BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 }); + TopoDS_Shape shape = prism.shape(); + ellipse.delete(); + edge.delete(); + wire.delete(); + face.delete(); + ed.delete(); + w.delete(); + F.delete(); + prism.delete(); + return shape; + } + + public static TopoDS_Shape makeReqularPrism(double h, double r, int n) { + if (n < 3) + n = 3; + Vector2d vertices[] = new Vector2d[n]; + for (int i = 0; i < n; i++) { + vertices[i] = new Vector2d(Math.sin(Math.PI * 2.0 * i / n)*r,Math.cos(Math.PI * 2.0 * i / n)*r); + } + BRepBuilderAPI_MakeWire wire = new BRepBuilderAPI_MakeWire(); + for (int i = 0; i < n; i++) { + Vector2d v1 = vertices[i]; + Vector2d v2 = vertices[(i+1)%n]; + BRepBuilderAPI_MakeEdge edge = new BRepBuilderAPI_MakeEdge(new double[]{v1.x,-h*0.5,v1.y},new double[]{v2.x,-h*0.5,v2.y}); + wire.add((TopoDS_Edge)edge.shape()); + edge.delete(); + } + TopoDS_Wire w = (TopoDS_Wire)wire.shape(); + + BRepBuilderAPI_MakeFace face = new BRepBuilderAPI_MakeFace(w); + TopoDS_Face F = (TopoDS_Face) face.shape(); + face.delete(); + + BRepPrimAPI_MakePrism prism = new BRepPrimAPI_MakePrism(F, new double[] { 0.0, h, 0.0 }); + TopoDS_Shape shape = prism.shape(); + prism.delete(); + + wire.delete(); + w.delete(); + F.delete(); + return shape; + } + + + public static void exportBREP(TopoDS_Shape shape, String filename) { + org.jcae.opencascade.jni.BRepTools.write(shape, filename); + } + +}