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 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 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); } }