From b9ea4c4c618dc2cc4b2f5eb1d43ba339453f1885 Mon Sep 17 00:00:00 2001 From: Johnathon Selstad Date: Tue, 6 Jul 2021 15:43:51 -0700 Subject: [PATCH 1/5] Begin switching backends... --- package-lock.json | 15 +++++++++++---- package.json | 2 +- src/Backend/OpenCascadeMesher.js | 8 ++++---- src/Backend/mainWorker.js | 9 +++++---- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 66750c2..eac1fce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "license": "Apache-2.0", "dependencies": { "leapjs": "^1.1.1", - "opencascade.js": "github:zalo/opencascade.js", + "opencascade.js": "2.0.0-beta.88b46d0", "potpack": "^1.0.1", "three": "^0.129.0" }, @@ -51,7 +51,12 @@ } }, "node_modules/opencascade.js": { - "resolved": "git+ssh://git@github.com/zalo/opencascade.js.git#6ce18f3a7fc41bccb2acdd798814142d71f1a6fc" + "version": "2.0.0-beta.88b46d0", + "resolved": "https://registry.npmjs.org/opencascade.js/-/opencascade.js-2.0.0-beta.88b46d0.tgz", + "integrity": "sha512-CNZxx26FfASoYjutZz+sq02fxX3Z1x5piWAV9Bzy7EfVPXnuebexs26n60YwV0GkXNzrCSUyKiidJ8llU+ulMg==", + "peerDependencies": { + "ws": "^7.4.5" + } }, "node_modules/potpack": { "version": "1.0.1", @@ -112,8 +117,10 @@ } }, "opencascade.js": { - "version": "git+ssh://git@github.com/zalo/opencascade.js.git#6ce18f3a7fc41bccb2acdd798814142d71f1a6fc", - "from": "opencascade.js@github:zalo/opencascade.js" + "version": "2.0.0-beta.88b46d0", + "resolved": "https://registry.npmjs.org/opencascade.js/-/opencascade.js-2.0.0-beta.88b46d0.tgz", + "integrity": "sha512-CNZxx26FfASoYjutZz+sq02fxX3Z1x5piWAV9Bzy7EfVPXnuebexs26n60YwV0GkXNzrCSUyKiidJ8llU+ulMg==", + "requires": {} }, "potpack": { "version": "1.0.1", diff --git a/package.json b/package.json index d55d718..c9cdfa8 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "bundledDependencies": false, "dependencies": { "leapjs": "^1.1.1", - "opencascade.js": "github:zalo/opencascade.js", + "opencascade.js": "2.0.0-beta.88b46d0", "potpack": "^1.0.1", "three": "^0.129.0" }, diff --git a/src/Backend/OpenCascadeMesher.js b/src/Backend/OpenCascadeMesher.js index 20b8832..d8717db 100644 --- a/src/Backend/OpenCascadeMesher.js +++ b/src/Backend/OpenCascadeMesher.js @@ -14,9 +14,9 @@ * limitations under the License. */ -//import oc from '../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; -//import potpack from '../../node_modules/potpack/index.mjs'; -importScripts('../../node_modules/potpack/index.js'); +import oc from '../../node_modules/opencascade.js/dist/opencascade.full.js'; +import potpack from '../../node_modules/potpack/index.mjs'; +//importScripts('../../node_modules/potpack/index.js'); /** This is the CAD Engine Worker Thread, where all the real work happens */ class OpenCascadeMesher { @@ -331,4 +331,4 @@ class OpenCascadeMesher { } } -//export { OpenCascadeMesher }; +export { OpenCascadeMesher }; diff --git a/src/Backend/mainWorker.js b/src/Backend/mainWorker.js index 65a353b..58a4808 100644 --- a/src/Backend/mainWorker.js +++ b/src/Backend/mainWorker.js @@ -16,9 +16,10 @@ // Leave these next 4 lines exactly as they are. The comments are toggled for ESBuild //import url from "../../node_modules/opencascade.js/dist/opencascade.wasm.wasm"; -//import opencascade from '../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; -//import { OpenCascadeMesher } from './OpenCascadeMesher.js'; -importScripts('../../node_modules/opencascade.js/dist/opencascade.wasm.js', './OpenCascadeMesher.js'); +//import opencascade from '../../node_modules/opencascade.js/dist/opencascade.full.js'; +//importScripts('./OpenCascadeMesher.js'); +import opencascade from '../../node_modules/opencascade.js/dist/opencascade.full.js'; +import { OpenCascadeMesher } from './OpenCascadeMesher.js'; /** This is the CAD Engine Worker Thread, where all the real work happens */ class LeapShapeEngineWorker { @@ -32,7 +33,7 @@ class LeapShapeEngineWorker { new opencascade({ locateFile(path) { if (path.endsWith('.wasm')) { - return (typeof ESBUILD !== 'undefined') ? "."+url : "../../node_modules/opencascade.js/dist/opencascade.wasm.wasm"; + return (typeof ESBUILD !== 'undefined') ? "."+url : "../../node_modules/opencascade.js/dist/opencascade.full.wasm"; } return path; } From e1442c84ec057b3c820d7616b34b0d985109cb7a Mon Sep 17 00:00:00 2001 From: Johnathon Selstad Date: Tue, 6 Jul 2021 18:07:08 -0700 Subject: [PATCH 2/5] Get Basic Meshing, Sphere, and Box Tools Working --- src/Backend/OpenCascadeMesher.js | 55 ++++++++++++------------- src/Backend/main.js | 4 +- src/Backend/mainWorker.js | 5 ++- src/Frontend/Tools/BoxTool.js | 16 +++---- src/Frontend/Tools/CleanEdgesTool.js | 2 +- src/Frontend/Tools/CopyTool.js | 2 +- src/Frontend/Tools/CylinderTool.js | 2 +- src/Frontend/Tools/DefaultTool.js | 2 +- src/Frontend/Tools/DifferenceTool.js | 2 +- src/Frontend/Tools/ExtrusionTool.js | 8 ++-- src/Frontend/Tools/FilletTool.js | 8 ++-- src/Frontend/Tools/General/Grid.js | 2 +- src/Frontend/Tools/General/ToolUtils.js | 16 +++---- src/Frontend/Tools/OffsetTool.js | 2 +- src/Frontend/Tools/RedoTool.js | 2 +- src/Frontend/Tools/RemoveTool.js | 2 +- src/Frontend/Tools/RotateTool.js | 2 +- src/Frontend/Tools/ScaleTool.js | 2 +- src/Frontend/Tools/SphereTool.js | 13 +++--- src/Frontend/Tools/TranslateTool.js | 2 +- src/Frontend/Tools/UndoTool.js | 2 +- src/Frontend/Tools/UnionTool.js | 2 +- src/Frontend/World/FileIO.js | 2 +- 23 files changed, 77 insertions(+), 78 deletions(-) diff --git a/src/Backend/OpenCascadeMesher.js b/src/Backend/OpenCascadeMesher.js index d8717db..49f64fb 100644 --- a/src/Backend/OpenCascadeMesher.js +++ b/src/Backend/OpenCascadeMesher.js @@ -14,7 +14,7 @@ * limitations under the License. */ -import oc from '../../node_modules/opencascade.js/dist/opencascade.full.js'; +import * as oc from '../../node_modules/opencascade.js/dist/opencascade.full.js'; import potpack from '../../node_modules/potpack/index.mjs'; //importScripts('../../node_modules/potpack/index.js'); @@ -22,7 +22,7 @@ import potpack from '../../node_modules/potpack/index.mjs'; class OpenCascadeMesher { /** Initialize the CAD Meshing System - * @param {oc} oc The OpenCascade Context */ + * @param {oc.OpenCascadeInstance} oc The OpenCascade Context */ constructor(oc) { this.oc = oc; } @@ -30,18 +30,18 @@ class OpenCascadeMesher { /** Iterate over all the faces in this shape, calling `callback` on each one. */ ForEachFace(shape, callback) { let face_index = 0; - if (!this.faceExplorer) { this.faceExplorer = new this.oc.TopExp_Explorer(shape, this.oc.TopAbs_FACE); } - for (this.faceExplorer.Init(shape, this.oc.TopAbs_FACE); this.faceExplorer.More(); this.faceExplorer.Next()) { - callback(face_index++, this.oc.TopoDS.prototype.Face(this.faceExplorer.Current())); + if (!this.faceExplorer) { this.faceExplorer = new this.oc.TopExp_Explorer_1(); }//shape, this.oc.TopAbs_FACE, this.oc.TopAbs_SHAPE); } + for (this.faceExplorer.Init(shape, this.oc.TopAbs_ShapeEnum.TopAbs_FACE, this.oc.TopAbs_ShapeEnum.TopAbs_SHAPE); this.faceExplorer.More(); this.faceExplorer.Next()) { + callback(face_index++, this.oc.TopoDS.Face_1(this.faceExplorer.Current())); } } /** Iterate over all the UNIQUE indices and edges in this shape, calling `callback` on each one. */ ForEachEdge(shape, callback) { let edgeHashes = {}; let edgeIndex = 0; - if (!this.edgeExplorer) { this.edgeExplorer = new this.oc.TopExp_Explorer(shape, this.oc.TopAbs_EDGE); } - for (this.edgeExplorer.Init(shape, this.oc.TopAbs_EDGE); this.edgeExplorer.More(); this.edgeExplorer.Next()) { - let edge = this.oc.TopoDS.prototype.Edge(this.edgeExplorer.Current()); + if (!this.edgeExplorer) { this.edgeExplorer = new this.oc.TopExp_Explorer_1(); }//shape, this.oc.TopAbs_EDGE, this.oc.TopAbs_SHAPE); } + for (this.edgeExplorer.Init(shape, this.oc.TopAbs_ShapeEnum.TopAbs_EDGE, this.oc.TopAbs_ShapeEnum.TopAbs_SHAPE); this.edgeExplorer.More(); this.edgeExplorer.Next()) { + let edge = this.oc.TopoDS.Edge_1(this.edgeExplorer.Current()); // Edge explorer visits every edge twice; // hash them to ensure visiting only once @@ -55,7 +55,7 @@ class OpenCascadeMesher { } LengthOfCurve(geomAdaptor, UMin, UMax, segments = 5) { - let point1 = [0, 0, 0], point2 = [0, 0, 0], arcLength = 0, gpPnt = new this.oc.gp_Pnt(); + let point1 = [0, 0, 0], point2 = [0, 0, 0], arcLength = 0, gpPnt = new this.oc.gp_Pnt_1(); for (let s = UMin; s <= UMax; s += (UMax - UMin) / segments) { geomAdaptor.D0(s, gpPnt); point1 = [gpPnt.X(), gpPnt.Y(), gpPnt.Z()]; @@ -75,7 +75,7 @@ class OpenCascadeMesher { * @param {oc.TopoDS_Shape} shape OpenCascade Shape * @param {number} maxDeviation */ shapeToMesh(shape, maxDeviation) { - if (!shape || shape.IsNull()) { console.error("Shape is null or undefined!"); return null; } + if (!shape || !shape.IsNull || shape.IsNull()) { console.error("Shape is null or undefined!"); return null; } let facelist = [], edgeList = []; let corrupt = false; try { //shape = new this.oc.TopoDS_Shape(shape); @@ -83,7 +83,7 @@ class OpenCascadeMesher { Object.assign(fullShapeEdgeHashes, this.ForEachEdge(shape, (index, edge) => { })); // Set up the Incremental Mesh builder, with a precision - this.incrementalMesh = new this.oc.BRepMesh_IncrementalMesh(shape, maxDeviation, false, 0.5); + this.incrementalMesh = new this.oc.BRepMesh_IncrementalMesh_2(shape, maxDeviation, false, 0.5, false); // Construct the edge hashes to assign proper indices to the edges let fullShapeEdgeHashes2 = {}; @@ -91,8 +91,8 @@ class OpenCascadeMesher { // Iterate through the faces and triangulate each one let triangulations = []; let uv_boxes = []; let curFace = 0; this.ForEachFace(shape, (faceIndex, myFace) => { - if (!this.aLocation) { this.aLocation = new this.oc.TopLoc_Location(); } - let myT = this.oc.BRep_Tool.prototype.Triangulation(myFace, this.aLocation); + if (!this.aLocation) { this.aLocation = new this.oc.TopLoc_Location_1(); } + let myT = this.oc.BRep_Tool.Triangulation(myFace, this.aLocation); if (myT.IsNull()) { console.error("Encountered Null Face!"); corrupt = true; } let this_face = { @@ -109,7 +109,7 @@ class OpenCascadeMesher { VMin: 0, VMax: 0 }; - if (!this.pc) { this.pc = new this.oc.Poly_Connect(myT); } else { this.pc.Load(myT); } + if (!this.pc) { this.pc = new this.oc.Poly_Connect_2(myT); } else { this.pc.Load(myT); } let Nodes = myT.get().Nodes(); // Write vertex buffer @@ -128,7 +128,7 @@ class OpenCascadeMesher { this_face.average[2] /= Nodes.Length(); // Write UV buffer - let orient = myFace.Orientation(); + let orient = myFace.Orientation_1(); if (myT.get().HasUVNodes()) { // Get UV Bounds let UMin = 0, UMax = 0, VMin = 0, VMax = 0; @@ -152,17 +152,17 @@ class OpenCascadeMesher { this_face.VMin = VMin; this_face.VMax = VMax; // Compute the Arclengths of the Isoparametric Curves of the face - let surfaceHandle = this.oc.BRep_Tool.prototype.Surface(myFace); + let surfaceHandle = this.oc.BRep_Tool.Surface_2(myFace); let surface = surfaceHandle.get(); let UIso_Handle = surface.UIso(UMin + ((UMax - UMin) * 0.5)); let VIso_Handle = surface.VIso(VMin + ((VMax - VMin) * 0.5)); if (!this.adaptorCurve) { - this.adaptorCurve = new this.oc.GeomAdaptor_Curve(VIso_Handle); + this.adaptorCurve = new this.oc.GeomAdaptor_Curve_2(VIso_Handle); } else { - this.adaptorCurve.Load(VIso_Handle); + this.adaptorCurve.Load_1(VIso_Handle); } let w = this.LengthOfCurve(this.adaptorCurve, UMin, UMax); - this.adaptorCurve.Load(UIso_Handle); + this.adaptorCurve.Load_1(UIso_Handle); let h = this.LengthOfCurve(this.adaptorCurve, VMin, VMax); uv_boxes.push({w: w, h: h, index: curFace }); @@ -173,13 +173,13 @@ class OpenCascadeMesher { x = ((x - UMin) / (UMax - UMin)); y = ((y - VMin) / (VMax - VMin)); - if (orient !== this.oc.TopAbs_FORWARD) { x = 1.0 - x; } + if (orient !== this.oc.TopAbs_Orientation.TopAbs_FORWARD) { x = 1.0 - x; } this_face.uv_coord[(i * 2) + 0] = x; this_face.uv_coord[(i * 2) + 1] = y; } - let planarChecker = new this.oc.GeomLib_IsPlanarSurface(surfaceHandle); + let planarChecker = new this.oc.GeomLib_IsPlanarSurface(surfaceHandle, 0.00001); this_face.is_planar = planarChecker.IsPlanar(); this.oc._free(planarChecker); } @@ -189,9 +189,8 @@ class OpenCascadeMesher { let normalArrayKey = Nodes.Lower() + ", " + Nodes.Upper(); let myNormal = null; if (this.normalArrays[normalArrayKey]) { myNormal = this.normalArrays[normalArrayKey]; } else { - myNormal = new this.oc.TColgp_Array1OfDir(Nodes.Lower(), Nodes.Upper()); } - if (!this.SST) { this.SST = new this.oc.StdPrs_ToolTriangulatedShape(); } - this.SST.Normal(myFace, this.pc, myNormal); + myNormal = new this.oc.TColgp_Array1OfDir_2(Nodes.Lower(), Nodes.Upper()); } + this.oc.StdPrs_ToolTriangulatedShape.Normal(myFace, this.pc, myNormal); this_face.normal_coord = new Array(myNormal.Length() * 3); for (let i = 0; i < myNormal.Length(); i++) { let d = myNormal.Value(i + 1).Transformed(this.aLocation.Transformation()); @@ -207,7 +206,7 @@ class OpenCascadeMesher { for (let nt = 1; nt <= myT.get().NbTriangles(); nt++) { let t = triangles.Value(nt); let n1 = t.Value(1), n2 = t.Value(2), n3 = t.Value(3); - if (orient !== this.oc.TopAbs_FORWARD) { + if (orient !== this.oc.TopAbs_Orientation.TopAbs_FORWARD) { let tmp = n1; n1 = n2; n2 = tmp; @@ -231,7 +230,7 @@ class OpenCascadeMesher { edge_index: -1 }; - let myP = this.oc.BRep_Tool.prototype.PolygonOnTriangulation(myEdge, myT, this.aLocation); + let myP = this.oc.BRep_Tool.PolygonOnTriangulation_1(myEdge, myT, this.aLocation); let edgeNodes = myP.get().Nodes(); // write vertex buffer @@ -291,12 +290,12 @@ class OpenCascadeMesher { }; if (!this.brepAdaptorCurve) { - this.brepAdaptorCurve = new this.oc.BRepAdaptor_Curve(myEdge); + this.brepAdaptorCurve = new this.oc.BRepAdaptor_Curve_2(myEdge); } else { this.brepAdaptorCurve.Initialize(myEdge); } if (!this.tangDef) { - this.tangDef = new this.oc.GCPnts_TangentialDeflection(this.brepAdaptorCurve, maxDeviation, 0.1); + this.tangDef = new this.oc.GCPnts_TangentialDeflection_2(this.brepAdaptorCurve, maxDeviation, 0.1, 2, 1.0e-9, 1.0e-7); } else { this.tangDef.Initialize(this.brepAdaptorCurve, maxDeviation, 0.1); } diff --git a/src/Backend/main.js b/src/Backend/main.js index 919bfff..ac93efd 100644 --- a/src/Backend/main.js +++ b/src/Backend/main.js @@ -27,9 +27,9 @@ class LeapShapeEngine { // Initialize the OpenCascade Worker Thread if (typeof ESBUILD !== 'undefined') { - this.worker = new Worker(new URL( './Backend/mainWorker.js', import.meta.url )/*, { type: "module" }*/); + this.worker = new Worker(new URL( './Backend/mainWorker.js', import.meta.url ), { type: "module" }); } else { - this.worker = new Worker('../src/Backend/mainWorker.js'/*, { type: "module" }*/); + this.worker = new Worker('../src/Backend/mainWorker.js', { type: "module" }); } // Ping Pong Messages Back and Forth based on their registration in messageHandlers diff --git a/src/Backend/mainWorker.js b/src/Backend/mainWorker.js index 58a4808..5899266 100644 --- a/src/Backend/mainWorker.js +++ b/src/Backend/mainWorker.js @@ -18,7 +18,7 @@ //import url from "../../node_modules/opencascade.js/dist/opencascade.wasm.wasm"; //import opencascade from '../../node_modules/opencascade.js/dist/opencascade.full.js'; //importScripts('./OpenCascadeMesher.js'); -import opencascade from '../../node_modules/opencascade.js/dist/opencascade.full.js'; +import opencascade, * as oc from '../../node_modules/opencascade.js/dist/opencascade.full.js'; import { OpenCascadeMesher } from './OpenCascadeMesher.js'; /** This is the CAD Engine Worker Thread, where all the real work happens */ @@ -75,6 +75,7 @@ class LeapShapeEngineWorker { } let op = this.backendFunctions[payload.shapeFunction]; + /** @type {oc.TopoDS_Shape} */ let shape = null; try { shape = op(...payload.shapeArguments); @@ -83,7 +84,7 @@ class LeapShapeEngineWorker { return { name: payload.name, payload: shape }; } else { // Otherwise Convert the Shape to a Mesh + Metadata - if (!shape || shape.IsNull()) { console.error("Shape is null"); console.error(shape); } + if (!shape || !shape.IsNull || shape.IsNull()) { console.error("Shape is null"); console.error(shape); } let meshData = this.mesher.shapeToMesh(shape, this.resolution, {}, {}); if (meshData) { this.shapes[payload.name] = shape; } return { name: payload.name, payload: meshData }; diff --git a/src/Frontend/Tools/BoxTool.js b/src/Frontend/Tools/BoxTool.js index 68fe545..a98d5aa 100644 --- a/src/Frontend/Tools/BoxTool.js +++ b/src/Frontend/Tools/BoxTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { Grid } from './General/Grid.js'; @@ -257,24 +257,24 @@ class BoxTool { let hitAnObject = hitObjectName in this.shapes; // Construct the Box Shape - let boxPlane = new this.oc.gp_Ax2(new this.oc.gp_Pnt(x, y, z), new this.oc.gp_Dir(nx, ny, nz), new this.oc.gp_Dir(vx, vy, vz)); - let shape = new this.oc.BRepPrimAPI_MakeBox(boxPlane, Math.abs(length), Math.abs(width), Math.abs(height)).Shape(); + let boxPlane = new this.oc.gp_Ax2_2(new this.oc.gp_Pnt_3(x, y, z), new this.oc.gp_Dir_4(nx, ny, nz), new this.oc.gp_Dir_4(vx, vy, vz)); + let shape = new this.oc.BRepPrimAPI_MakeBox_5(boxPlane, Math.abs(length), Math.abs(width), Math.abs(height)).Shape(); - if (!shape || shape.IsNull()) { console.error("BRepPrimAPI_MakeBox did not like its arguments!"); } + if (!shape || !shape.IsNull || shape.IsNull()) { console.error("BRepPrimAPI_MakeBox did not like its arguments!"); } // If we hit an object, let's CSG this Box to it if (hitAnObject && height > 0) { // The Height is Positive, let's Union let hitObject = this.shapes[hitObjectName]; - let unionOp = new this.oc.BRepAlgoAPI_Fuse(hitObject, shape); - unionOp.SetFuzzyValue(0.0000001); + let unionOp = new this.oc.BRepAlgoAPI_Fuse_3(hitObject, shape); + //unionOp.SetFuzzyValue(0.0000001); unionOp.Build(); return unionOp.Shape(); } else if (hitAnObject && height < 0) { // The Height is Negative, let's Subtract let hitObject = this.shapes[hitObjectName]; - let differenceOp = new this.oc.BRepAlgoAPI_Cut(hitObject, shape); - differenceOp.SetFuzzyValue(0.0000001); + let differenceOp = new this.oc.BRepAlgoAPI_Cut_3(hitObject, shape); + //differenceOp.SetFuzzyValue(0.0000001); differenceOp.Build(); return differenceOp.Shape(); } diff --git a/src/Frontend/Tools/CleanEdgesTool.js b/src/Frontend/Tools/CleanEdgesTool.js index 16aab2e..0c38ac1 100644 --- a/src/Frontend/Tools/CleanEdgesTool.js +++ b/src/Frontend/Tools/CleanEdgesTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { snapToGrid } from './General/ToolUtils.js'; diff --git a/src/Frontend/Tools/CopyTool.js b/src/Frontend/Tools/CopyTool.js index 79e7bab..160cf61 100644 --- a/src/Frontend/Tools/CopyTool.js +++ b/src/Frontend/Tools/CopyTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { snapToGrid } from './General/ToolUtils.js'; diff --git a/src/Frontend/Tools/CylinderTool.js b/src/Frontend/Tools/CylinderTool.js index 7fc45b4..1a6a68a 100644 --- a/src/Frontend/Tools/CylinderTool.js +++ b/src/Frontend/Tools/CylinderTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { Grid } from './General/Grid.js'; diff --git a/src/Frontend/Tools/DefaultTool.js b/src/Frontend/Tools/DefaultTool.js index e6ca9d8..522c746 100644 --- a/src/Frontend/Tools/DefaultTool.js +++ b/src/Frontend/Tools/DefaultTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { LSTransformControls } from './General/LSTransformControls.js'; diff --git a/src/Frontend/Tools/DifferenceTool.js b/src/Frontend/Tools/DifferenceTool.js index d858797..7008f32 100644 --- a/src/Frontend/Tools/DifferenceTool.js +++ b/src/Frontend/Tools/DifferenceTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { snapToGrid } from './General/ToolUtils.js'; diff --git a/src/Frontend/Tools/ExtrusionTool.js b/src/Frontend/Tools/ExtrusionTool.js index f27d11a..c41b18b 100644 --- a/src/Frontend/Tools/ExtrusionTool.js +++ b/src/Frontend/Tools/ExtrusionTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; @@ -222,10 +222,10 @@ class ExtrusionTool { // Get a reference to the face to extrude let face = null; let face_index = 0; - let anExplorer = new this.oc.TopExp_Explorer(hitObject, this.oc.TopAbs_FACE); - for (anExplorer.Init(hitObject, this.oc.TopAbs_FACE); anExplorer.More(); anExplorer.Next()) { + let anExplorer = new this.oc.TopExp_Explorer_1();//(hitObject, this.oc.TopAbs_FACE); + for (anExplorer.Init(hitObject, this.oc.TopAbs_ShapeEnum.TopAbs_FACE, this.oc.TopAbs_ShapeEnum.TopAbs_SHAPE); anExplorer.More(); anExplorer.Next()) { if (face_index === faceIndex) { - face = this.oc.TopoDS.prototype.Face(anExplorer.Current()); + face = this.oc.TopoDS.Face_1(anExplorer.Current()); break; } else { face_index += 1; diff --git a/src/Frontend/Tools/FilletTool.js b/src/Frontend/Tools/FilletTool.js index 5beacce..f35efe5 100644 --- a/src/Frontend/Tools/FilletTool.js +++ b/src/Frontend/Tools/FilletTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; @@ -205,9 +205,9 @@ class FilletTool { // Iterate through the edges of the shape and add them to the Fillet as they come let foundEdges = 0, edge_index = 0, edgeHashes = {}; - if (!this.edgeExplorer) { this.edgeExplorer = new this.oc.TopExp_Explorer(shape, this.oc.TopAbs_EDGE); } - for (this.edgeExplorer.Init(shape, this.oc.TopAbs_EDGE); this.edgeExplorer.More(); this.edgeExplorer.Next()) { - let edge = this.oc.TopoDS.prototype.Edge(this.edgeExplorer.Current()); + if (!this.edgeExplorer) { this.edgeExplorer = new this.oc.TopExp_Explorer_1(); }//(shape, this.oc.TopAbs_EDGE); } + for (this.edgeExplorer.Init(shape, this.oc.TopAbs_ShapeEnum.TopAbs_EDGE, this.oc.TopAbs_ShapeEnum.TopAbs_SHAPE); this.edgeExplorer.More(); this.edgeExplorer.Next()) { + let edge = this.oc.TopoDS.Edge_1(this.edgeExplorer.Current()); // Edge explorer visits every edge twice; // hash them to ensure visiting only once diff --git a/src/Frontend/Tools/General/Grid.js b/src/Frontend/Tools/General/Grid.js index 88735bc..b2fb58b 100644 --- a/src/Frontend/Tools/General/Grid.js +++ b/src/Frontend/Tools/General/Grid.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../../node_modules/three/build/three.module.js'; -import oc from '../../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { safeQuerySurface, snapToGrid } from './ToolUtils.js'; /** This is an in-scene helper for measurements and precision placement. */ diff --git a/src/Frontend/Tools/General/ToolUtils.js b/src/Frontend/Tools/General/ToolUtils.js index 4286600..ab831ce 100644 --- a/src/Frontend/Tools/General/ToolUtils.js +++ b/src/Frontend/Tools/General/ToolUtils.js @@ -16,7 +16,7 @@ import * as THREE from '../../../../node_modules/three/build/three.module.js'; import { World } from '../../World/World.js'; -import oc from '../../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../../node_modules/opencascade.js/dist/opencascade.full.js'; /** Returns whether Fragment Depth Buffers Exist on this hardware * @param {World} world */ @@ -135,10 +135,10 @@ class BackendFunctions { if (!this.surfaces) { this.surfaces = {}; } if (!(faceName in this.surfaces)) { let face = null; let face_index = 0; - let anExplorer = new this.oc.TopExp_Explorer(shape, this.oc.TopAbs_FACE); - for (anExplorer.Init(shape, this.oc.TopAbs_FACE); anExplorer.More(); anExplorer.Next()) { + let anExplorer = new this.oc.TopExp_Explorer_1();//shape, this.oc.TopAbs_FACE); + for (anExplorer.Init(shape, this.oc.TopAbs_ShapeEnum.TopAbs_FACE, this.oc.TopAbs_ShapeEnum.TopAbs_SHAPE); anExplorer.More(); anExplorer.Next()) { if (face_index === faceIndex) { - face = this.oc.TopoDS.prototype.Face(anExplorer.Current()); + face = this.oc.TopoDS.Face_1(anExplorer.Current()); break; } else { face_index += 1; @@ -146,7 +146,7 @@ class BackendFunctions { } // Cache the Adapter Surface in surfaces - this.surfaces[faceName] = new this.oc.BRepAdaptor_Surface(face, false); + this.surfaces[faceName] = new this.oc.BRepAdaptor_Surface_2(face, false); } /** @type {oc.BRepAdaptor_Surface} */ let adapter = this.surfaces[faceName]; @@ -188,9 +188,9 @@ class BackendFunctions { toReturn.uvs = uvs; // Get Surface Normal, Tangent, and Curvature Info - let surfaceHandle = this.oc.BRep_Tool.prototype.Surface(this.surfaces[faceName].Face()); + let surfaceHandle = this.oc.BRep_Tool.Surface_2(this.surfaces[faceName].Face()); if (!this.props) { - this.props = new this.oc.GeomLProp_SLProps(surfaceHandle, u, v, 1, 1); + this.props = new this.oc.GeomLProp_SLProps_1(surfaceHandle, u, v, 1, 1); } this.props.SetSurface(surfaceHandle); this.props.SetParameters(u, v); @@ -203,7 +203,7 @@ class BackendFunctions { } // Capture Tangent Directions - let tempDir = new this.oc.gp_Dir(); + let tempDir = new this.oc.gp_Dir_1(); if (this.props.IsTangentUDefined()) { this.props.TangentU(tempDir); toReturn.tU = [0, 0, 0]; diff --git a/src/Frontend/Tools/OffsetTool.js b/src/Frontend/Tools/OffsetTool.js index fb3e454..a0dae53 100644 --- a/src/Frontend/Tools/OffsetTool.js +++ b/src/Frontend/Tools/OffsetTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { Grid } from './General/Grid.js'; diff --git a/src/Frontend/Tools/RedoTool.js b/src/Frontend/Tools/RedoTool.js index c2c8844..0ce2dbf 100644 --- a/src/Frontend/Tools/RedoTool.js +++ b/src/Frontend/Tools/RedoTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { snapToGrid } from './General/ToolUtils.js'; diff --git a/src/Frontend/Tools/RemoveTool.js b/src/Frontend/Tools/RemoveTool.js index 3ff51ab..fbad43c 100644 --- a/src/Frontend/Tools/RemoveTool.js +++ b/src/Frontend/Tools/RemoveTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { snapToGrid } from './General/ToolUtils.js'; diff --git a/src/Frontend/Tools/RotateTool.js b/src/Frontend/Tools/RotateTool.js index af629b7..b64d9b6 100644 --- a/src/Frontend/Tools/RotateTool.js +++ b/src/Frontend/Tools/RotateTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; diff --git a/src/Frontend/Tools/ScaleTool.js b/src/Frontend/Tools/ScaleTool.js index c1cd9b6..9fa0d97 100644 --- a/src/Frontend/Tools/ScaleTool.js +++ b/src/Frontend/Tools/ScaleTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; diff --git a/src/Frontend/Tools/SphereTool.js b/src/Frontend/Tools/SphereTool.js index 881baf8..075dd2c 100644 --- a/src/Frontend/Tools/SphereTool.js +++ b/src/Frontend/Tools/SphereTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { Grid } from './General/Grid.js'; @@ -171,19 +171,18 @@ class SphereTool { /** Create a Sphere in OpenCascade; to be executed on the Worker Thread */ createSphere(x, y, z, radius, hitObjectName) { if (radius != 0) { - let spherePlane = new this.oc.gp_Ax2(new this.oc.gp_Pnt(x, y, z), this.oc.gp.prototype.DZ()); - let shape = new this.oc.BRepPrimAPI_MakeSphere(spherePlane, Math.abs(radius)).Shape(); + let shape = new this.oc.BRepPrimAPI_MakeSphere_5(new this.oc.gp_Pnt_3(x, y, z), radius).Shape(); if (hitObjectName in this.shapes) { let hitObject = this.shapes[hitObjectName]; if (radius > 0) { - let union = new this.oc.BRepAlgoAPI_Fuse(hitObject, shape); - union.SetFuzzyValue(0.00000001); + let union = new this.oc.BRepAlgoAPI_Fuse_3(hitObject, shape); + //union.SetFuzzyValue(0.00000001); union.Build(); return union.Shape(); } else { - let differenceCut = new this.oc.BRepAlgoAPI_Cut(hitObject, shape); - differenceCut.SetFuzzyValue(0.00000001); + let differenceCut = new this.oc.BRepAlgoAPI_Cut_3(hitObject, shape); + //differenceCut.SetFuzzyValue(0.00000001); differenceCut.Build(); return differenceCut.Shape(); } diff --git a/src/Frontend/Tools/TranslateTool.js b/src/Frontend/Tools/TranslateTool.js index 8f1c64e..a36d49a 100644 --- a/src/Frontend/Tools/TranslateTool.js +++ b/src/Frontend/Tools/TranslateTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; diff --git a/src/Frontend/Tools/UndoTool.js b/src/Frontend/Tools/UndoTool.js index e49b81b..0fbf720 100644 --- a/src/Frontend/Tools/UndoTool.js +++ b/src/Frontend/Tools/UndoTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { snapToGrid } from './General/ToolUtils.js'; diff --git a/src/Frontend/Tools/UnionTool.js b/src/Frontend/Tools/UnionTool.js index d00218f..48241ce 100644 --- a/src/Frontend/Tools/UnionTool.js +++ b/src/Frontend/Tools/UnionTool.js @@ -15,7 +15,7 @@ */ import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { Tools } from './Tools.js'; import { InteractionRay } from '../Input/Input.js'; import { snapToGrid } from './General/ToolUtils.js'; diff --git a/src/Frontend/World/FileIO.js b/src/Frontend/World/FileIO.js index 594d0c0..0e4173f 100644 --- a/src/Frontend/World/FileIO.js +++ b/src/Frontend/World/FileIO.js @@ -17,7 +17,7 @@ import { LeapShapeEngine } from '../../Backend/main.js'; import { World } from './World.js'; import * as THREE from '../../../node_modules/three/build/three.module.js'; -import oc from '../../../node_modules/opencascade.js/dist/opencascade.wasm.module.js'; +import * as oc from '../../../node_modules/opencascade.js/dist/opencascade.full.js'; import { OBJExporter } from '../../../node_modules/three/examples/jsm/exporters/OBJExporter.js'; import { STLExporter } from '../../../node_modules/three/examples/jsm/exporters/STLExporter.js'; import { GLTFExporter } from '../../../node_modules/three/examples/jsm/exporters/GLTFExporter.js'; From 1d15e36b8b6ed483ec765c82c00792eef40bef5c Mon Sep 17 00:00:00 2001 From: Johnathon Selstad Date: Tue, 6 Jul 2021 19:03:29 -0700 Subject: [PATCH 3/5] Add support to more tools, break new TopoDS_Shape --- src/Backend/mainWorker.js | 10 +++++----- src/Frontend/Debug/Debug.js | 12 ++++++------ src/Frontend/Tools/CylinderTool.js | 12 ++++++------ src/Frontend/Tools/DefaultTool.js | 18 +++++++++--------- src/Frontend/Tools/DifferenceTool.js | 8 +++++--- src/Frontend/Tools/ExtrusionTool.js | 12 ++++++------ src/Frontend/Tools/FilletTool.js | 6 +++--- src/Frontend/Tools/OffsetTool.js | 16 ++++++++-------- src/Frontend/Tools/UnionTool.js | 8 +++++--- 9 files changed, 53 insertions(+), 49 deletions(-) diff --git a/src/Backend/mainWorker.js b/src/Backend/mainWorker.js index 5899266..651e56c 100644 --- a/src/Backend/mainWorker.js +++ b/src/Backend/mainWorker.js @@ -77,7 +77,7 @@ class LeapShapeEngineWorker { /** @type {oc.TopoDS_Shape} */ let shape = null; - try { + //try { shape = op(...payload.shapeArguments); if (shape && shape.isMetadata) { // Return the output raw if it's marked as data @@ -89,10 +89,10 @@ class LeapShapeEngineWorker { if (meshData) { this.shapes[payload.name] = shape; } return { name: payload.name, payload: meshData }; } - } catch (e) { - console.error("CAD Operation Failed!"); - return { name: payload.name, payload: null }; - } + //} catch (e) { + // console.error("CAD Operation Failed!"); + // return { name: payload.name, payload: null }; + //} } /** Posts an error message back to the main thread diff --git a/src/Frontend/Debug/Debug.js b/src/Frontend/Debug/Debug.js index 0693f4e..ad3669e 100644 --- a/src/Frontend/Debug/Debug.js +++ b/src/Frontend/Debug/Debug.js @@ -28,12 +28,12 @@ class Debug { engine.registerCallback("error", this.fakeError.bind(this)); // Intercept Main Window Errors as well - window.realConsoleError = console.error; - window.addEventListener('error', (event) => { - let path = event.filename.split("/"); - this.display((path[path.length - 1] + ":" + event.lineno + " - " + event.message)); - }); - console.error = this.fakeError.bind(this); + //window.realConsoleError = console.error; + //window.addEventListener('error', (event) => { + // let path = event.filename.split("/"); + // this.display((path[path.length - 1] + ":" + event.lineno + " - " + event.message)); + //}); + //console.error = this.fakeError.bind(this); // Record whether we're on Safari or Mobile (unused so far) this.safari = /(Safari)/g.test( navigator.userAgent ) && ! /(Chrome)/g.test( navigator.userAgent ); diff --git a/src/Frontend/Tools/CylinderTool.js b/src/Frontend/Tools/CylinderTool.js index 1a6a68a..f97375e 100644 --- a/src/Frontend/Tools/CylinderTool.js +++ b/src/Frontend/Tools/CylinderTool.js @@ -227,22 +227,22 @@ class CylinderTool { //if (hitAnObject) { x -= nx * this.resolution; y -= ny * this.resolution; z -= nz * this.resolution; } // Construct the Cylinder Shape - let cylinderPlane = new this.oc.gp_Ax2(new this.oc.gp_Pnt(x, y, centered ? z-height / 2 : z), new this.oc.gp_Dir(nx, ny, nz)); - let shape = new this.oc.BRepPrimAPI_MakeCylinder(cylinderPlane, radius, Math.abs(height)).Shape(); + let cylinderPlane = new this.oc.gp_Ax2_3(new this.oc.gp_Pnt_3(x, y, centered ? z-height / 2 : z), new this.oc.gp_Dir_4(nx, ny, nz)); + let shape = new this.oc.BRepPrimAPI_MakeCylinder_3(cylinderPlane, radius, Math.abs(height)).Shape(); // If we hit an object, let's CSG this Cylinder to it if (hitAnObject && height > 0) { // The Height is Positive, let's Union let hitObject = this.shapes[hitObjectName]; - let unionOp = new this.oc.BRepAlgoAPI_Fuse(hitObject, shape); - unionOp.SetFuzzyValue(0.00000001); + let unionOp = new this.oc.BRepAlgoAPI_Fuse_3(hitObject, shape); + //unionOp.SetFuzzyValue(0.00000001); unionOp.Build(); return unionOp.Shape(); } else if (hitAnObject && height < 0) { // The Height is Negative, let's Subtract let hitObject = this.shapes[hitObjectName]; - let differenceOp = new this.oc.BRepAlgoAPI_Cut(hitObject, shape); - differenceOp.SetFuzzyValue(0.00000001); + let differenceOp = new this.oc.BRepAlgoAPI_Cut_3(hitObject, shape); + //differenceOp.SetFuzzyValue(0.00000001); differenceOp.Build(); return differenceOp.Shape(); } else { diff --git a/src/Frontend/Tools/DefaultTool.js b/src/Frontend/Tools/DefaultTool.js index 522c746..d623b12 100644 --- a/src/Frontend/Tools/DefaultTool.js +++ b/src/Frontend/Tools/DefaultTool.js @@ -172,25 +172,25 @@ class DefaultTool { /** Create a moved shape in OpenCascade; to be executed on the Worker Thread */ moveShape(shapeToMove, x, y, z, xDir, yDir, zDir, degrees, scale) { // Use three transforms until SetValues comes in... - let translation = new this.oc.gp_Trsf(), - rotation = new this.oc.gp_Trsf(), - scaling = new this.oc.gp_Trsf(); + let translation = new this.oc.gp_Trsf_1(), + rotation = new this.oc.gp_Trsf_1(), + scaling = new this.oc.gp_Trsf_1(); // Set Transformations - translation.SetTranslation(new this.oc.gp_Vec(x, y, z)); + translation.SetTranslation_1(new this.oc.gp_Vec_4(x, y, z)); if (degrees !== 0) { - rotation.SetRotation( - new this.oc.gp_Ax1(new this.oc.gp_Pnt(0, 0, 0), new this.oc.gp_Dir( - new this.oc.gp_Vec(xDir, yDir, zDir))), degrees * 0.0174533); + rotation.SetRotation_1( + new this.oc.gp_Ax1_2(new this.oc.gp_Pnt_3(0, 0, 0), new this.oc.gp_Dir_2( + new this.oc.gp_Vec_4(xDir, yDir, zDir))), degrees * 0.0174533); } if (scale !== 1) { scaling.SetScaleFactor(scale); } // Multiply together scaling.Multiply(rotation); translation.Multiply(scaling); - return new this.oc.TopoDS_Shape(this.shapes[shapeToMove].Moved( - new this.oc.TopLoc_Location(translation))); + return /*new this.oc.TopoDS_Shape(*/this.shapes[shapeToMove].Moved( + new this.oc.TopLoc_Location_2(translation));//); } updateGizmoVisibility() { diff --git a/src/Frontend/Tools/DifferenceTool.js b/src/Frontend/Tools/DifferenceTool.js index 7008f32..c479939 100644 --- a/src/Frontend/Tools/DifferenceTool.js +++ b/src/Frontend/Tools/DifferenceTool.js @@ -100,12 +100,14 @@ class DifferenceTool { let cuttingTool = this.shapes[differenceObjects[s]]; // Check to see if shape and fuseTool are touching - let overlapChecker = new this.oc.BRepExtrema_DistShapeShape(shape, cuttingTool); + let overlapChecker = new this.oc.BRepExtrema_DistShapeShape_2(shape, cuttingTool, + this.oc.Extrema_ExtFlag.Extrema_ExtFlag_MIN, this.oc.Extrema_ExtAlgo.Extrema_ExtAlgo_Grad); overlapChecker.Perform(); if (overlapChecker.Value() <= 0 || overlapChecker.InnerSolution()) { - let differenceOp = new this.oc.BRepAlgoAPI_Cut(shape, cuttingTool); - differenceOp.SetFuzzyValue(0.00001); differenceOp.Build(); + let differenceOp = new this.oc.BRepAlgoAPI_Cut_3(shape, cuttingTool); + //differenceOp.SetFuzzyValue(0.00001); + differenceOp.Build(); shape = differenceOp.Shape(); cut = true; } else { console.error("Skipping Shape; not touching..."); continue; } diff --git a/src/Frontend/Tools/ExtrusionTool.js b/src/Frontend/Tools/ExtrusionTool.js index c41b18b..ae57297 100644 --- a/src/Frontend/Tools/ExtrusionTool.js +++ b/src/Frontend/Tools/ExtrusionTool.js @@ -234,16 +234,16 @@ class ExtrusionTool { if (face) { // Construct the Extrusion Shape - let shape = new this.oc.BRepPrimAPI_MakePrism(face, - new this.oc.gp_Vec(nx, ny, nz), true, true).Shape(); + let shape = new this.oc.BRepPrimAPI_MakePrism_1(face, + new this.oc.gp_Vec_4(nx, ny, nz), true, true).Shape(); if (!csg) { return shape; } // Return the Raw Shape // Let's CSG this Extrusion onto/into the object it came from if (height > 0) { // The Height is Positive, let's Union - let unionOp = new this.oc.BRepAlgoAPI_Fuse(hitObject, shape); - unionOp.SetFuzzyValue(0.00001); + let unionOp = new this.oc.BRepAlgoAPI_Fuse_3(hitObject, shape); + //unionOp.SetFuzzyValue(0.00001); unionOp.Build(); return unionOp.Shape(); //let unionOp = new this.oc.BRepBuilderAPI_Sewing(0.00001); @@ -253,8 +253,8 @@ class ExtrusionTool { //return unionOp.SewedShape(); } else if (height < 0) { // The Height is Negative, let's Subtract - let differenceOp = new this.oc.BRepAlgoAPI_Cut(hitObject, shape); - differenceOp.SetFuzzyValue(0.00001); + let differenceOp = new this.oc.BRepAlgoAPI_Cut_3(hitObject, shape); + //differenceOp.SetFuzzyValue(0.00001); differenceOp.Build(); return differenceOp.Shape(); } diff --git a/src/Frontend/Tools/FilletTool.js b/src/Frontend/Tools/FilletTool.js index f35efe5..6640435 100644 --- a/src/Frontend/Tools/FilletTool.js +++ b/src/Frontend/Tools/FilletTool.js @@ -200,7 +200,7 @@ class FilletTool { if (radius === 0) { console.error("Invalid Fillet Radius!"); return null; } let shape = this.shapes[shapeToFillet]; let mkFillet = radius > 0 ? - new this.oc.BRepFilletAPI_MakeFillet (shape) : + new this.oc.BRepFilletAPI_MakeFillet (shape, this.oc.ChFi3d_FilletShape.ChFi3d_Rational) : new this.oc.BRepFilletAPI_MakeChamfer(shape); // Iterate through the edges of the shape and add them to the Fillet as they come @@ -217,7 +217,7 @@ class FilletTool { if(!edgeHashes.hasOwnProperty(edgeHash)){ edgeHashes[edgeHash] = edge_index; if (edges.includes(edge_index)) { - mkFillet.Add(Math.abs(radius),edge); + mkFillet.Add_2(Math.abs(radius),edge); foundEdges++; } edge_index++; @@ -225,7 +225,7 @@ class FilletTool { } if (foundEdges == 0) { console.error("Fillet Edges Not Found!"); return null; } mkFillet.Build(); // This call is where it will fail if it's going to fail! - return new this.oc.TopoDS_Solid(mkFillet.Shape()); + return /*new this.oc.TopoDS_Solid(*/mkFillet.Shape();//); } raycastObject(ray, checkSelected) { diff --git a/src/Frontend/Tools/OffsetTool.js b/src/Frontend/Tools/OffsetTool.js index a0dae53..d3d37ca 100644 --- a/src/Frontend/Tools/OffsetTool.js +++ b/src/Frontend/Tools/OffsetTool.js @@ -221,15 +221,15 @@ class OffsetTool { let inShape = this.shapes[hitObjectName]; //if (offsetDistance === 0) { return inShape; } if (offsetDistance !== 0) { - let offsetOp = new this.oc.BRepOffsetAPI_MakeOffsetShape(); - offsetOp.PerformByJoin(inShape, offsetDistance, 0.00001); - let outShape = new this.oc.TopoDS_Shape(offsetOp.Shape()); + let offsetOp = new this.oc.BRepOffsetAPI_MakeOffsetShape_1(); + offsetOp.PerformByJoin(inShape, offsetDistance, 0.00001, + this.oc.BRepOffset_Mode.BRepOffset_Skin, false, false, this.oc.GeomAbs_JoinType.GeomAbs_Arc, false); + let outShape = /*new this.oc.TopoDS_Shape(*/offsetOp.Shape();//); // Convert Shell to Solid as is expected if (outShape.ShapeType() == 3) { - let solidOffset = new this.oc.BRepBuilderAPI_MakeSolid(); - solidOffset.Add(outShape); - outShape = new this.oc.TopoDS_Solid(solidOffset.Solid()); + let solidOffset = new this.oc.BRepBuilderAPI_MakeSolid_3(outShape); + outShape = /*new this.oc.TopoDS_Solid(*/solidOffset.Solid();//); } if (offsetDistance > 0) { @@ -241,8 +241,8 @@ class OffsetTool { //hollowOp.MakeThickSolidByJoin(inShape, emptyList, offsetDistance, 0.00001); //hollowOp.Build(); //return hollowOp.Shape(); - let differenceCut = new this.oc.BRepAlgoAPI_Cut(inShape, outShape); - differenceCut.SetFuzzyValue(0.00001); + let differenceCut = new this.oc.BRepAlgoAPI_Cut_3(inShape, outShape); + //differenceCut.SetFuzzyValue(0.00001); differenceCut.Build(); return differenceCut.Shape(); } diff --git a/src/Frontend/Tools/UnionTool.js b/src/Frontend/Tools/UnionTool.js index 48241ce..4d37631 100644 --- a/src/Frontend/Tools/UnionTool.js +++ b/src/Frontend/Tools/UnionTool.js @@ -103,12 +103,14 @@ class UnionTool { console.log(shape, fuseTool); // Check to see if shape and fuseTool are touching - //let overlapChecker = new this.oc.BRepExtrema_DistShapeShape(shape, fuseTool); + //let overlapChecker = new this.oc.BRepExtrema_DistShapeShape_2(shape, cuttingTool, + // this.oc.Extrema_ExtFlag.Extrema_ExtFlag_MIN, this.oc.Extrema_ExtAlgo.Extrema_ExtAlgo_Grad); //overlapChecker.Perform(); //if (overlapChecker.InnerSolution()) { - let union = new this.oc.BRepAlgoAPI_Fuse(shape, fuseTool); - union.SetFuzzyValue(0.00001); union.Build(); + let union = new this.oc.BRepAlgoAPI_Fuse_3(shape, fuseTool); + //union.SetFuzzyValue(0.00001); + union.Build(); shape = union.Shape(); fused = true; //} From 229657cab2d82c377fe4409f86254de79261f45f Mon Sep 17 00:00:00 2001 From: Johnathon Selstad Date: Tue, 6 Jul 2021 19:15:02 -0700 Subject: [PATCH 4/5] Restore Non-crashing Error Messages --- src/Backend/mainWorker.js | 10 +++++----- src/Frontend/Debug/Debug.js | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Backend/mainWorker.js b/src/Backend/mainWorker.js index 651e56c..5899266 100644 --- a/src/Backend/mainWorker.js +++ b/src/Backend/mainWorker.js @@ -77,7 +77,7 @@ class LeapShapeEngineWorker { /** @type {oc.TopoDS_Shape} */ let shape = null; - //try { + try { shape = op(...payload.shapeArguments); if (shape && shape.isMetadata) { // Return the output raw if it's marked as data @@ -89,10 +89,10 @@ class LeapShapeEngineWorker { if (meshData) { this.shapes[payload.name] = shape; } return { name: payload.name, payload: meshData }; } - //} catch (e) { - // console.error("CAD Operation Failed!"); - // return { name: payload.name, payload: null }; - //} + } catch (e) { + console.error("CAD Operation Failed!"); + return { name: payload.name, payload: null }; + } } /** Posts an error message back to the main thread diff --git a/src/Frontend/Debug/Debug.js b/src/Frontend/Debug/Debug.js index ad3669e..0693f4e 100644 --- a/src/Frontend/Debug/Debug.js +++ b/src/Frontend/Debug/Debug.js @@ -28,12 +28,12 @@ class Debug { engine.registerCallback("error", this.fakeError.bind(this)); // Intercept Main Window Errors as well - //window.realConsoleError = console.error; - //window.addEventListener('error', (event) => { - // let path = event.filename.split("/"); - // this.display((path[path.length - 1] + ":" + event.lineno + " - " + event.message)); - //}); - //console.error = this.fakeError.bind(this); + window.realConsoleError = console.error; + window.addEventListener('error', (event) => { + let path = event.filename.split("/"); + this.display((path[path.length - 1] + ":" + event.lineno + " - " + event.message)); + }); + console.error = this.fakeError.bind(this); // Record whether we're on Safari or Mobile (unused so far) this.safari = /(Safari)/g.test( navigator.userAgent ) && ! /(Chrome)/g.test( navigator.userAgent ); From d75668f74d89b69896778402bb3db5ffab368475 Mon Sep 17 00:00:00 2001 From: Johnathon Selstad Date: Mon, 12 Jul 2021 15:58:11 -0700 Subject: [PATCH 5/5] Add back Fuzzy Ops --- package-lock.json | 14 +++++++------- package.json | 2 +- src/Frontend/Tools/BoxTool.js | 4 ++-- src/Frontend/Tools/CylinderTool.js | 4 ++-- src/Frontend/Tools/DifferenceTool.js | 2 +- src/Frontend/Tools/ExtrusionTool.js | 4 ++-- src/Frontend/Tools/OffsetTool.js | 2 +- src/Frontend/Tools/SphereTool.js | 4 ++-- src/Frontend/Tools/UnionTool.js | 2 +- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index eac1fce..1e42385 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "license": "Apache-2.0", "dependencies": { "leapjs": "^1.1.1", - "opencascade.js": "2.0.0-beta.88b46d0", + "opencascade.js": "2.0.0-beta.03aec7f", "potpack": "^1.0.1", "three": "^0.129.0" }, @@ -51,9 +51,9 @@ } }, "node_modules/opencascade.js": { - "version": "2.0.0-beta.88b46d0", - "resolved": "https://registry.npmjs.org/opencascade.js/-/opencascade.js-2.0.0-beta.88b46d0.tgz", - "integrity": "sha512-CNZxx26FfASoYjutZz+sq02fxX3Z1x5piWAV9Bzy7EfVPXnuebexs26n60YwV0GkXNzrCSUyKiidJ8llU+ulMg==", + "version": "2.0.0-beta.03aec7f", + "resolved": "https://registry.npmjs.org/opencascade.js/-/opencascade.js-2.0.0-beta.03aec7f.tgz", + "integrity": "sha512-H/ztCZDuexTfetqSKq09L9dEuzU3TTkA8+jOc5UM2D1Tqx4Je28Vyytc0/VRIminMDbBFaH4M8G1cyeQGjuedw==", "peerDependencies": { "ws": "^7.4.5" } @@ -117,9 +117,9 @@ } }, "opencascade.js": { - "version": "2.0.0-beta.88b46d0", - "resolved": "https://registry.npmjs.org/opencascade.js/-/opencascade.js-2.0.0-beta.88b46d0.tgz", - "integrity": "sha512-CNZxx26FfASoYjutZz+sq02fxX3Z1x5piWAV9Bzy7EfVPXnuebexs26n60YwV0GkXNzrCSUyKiidJ8llU+ulMg==", + "version": "2.0.0-beta.03aec7f", + "resolved": "https://registry.npmjs.org/opencascade.js/-/opencascade.js-2.0.0-beta.03aec7f.tgz", + "integrity": "sha512-H/ztCZDuexTfetqSKq09L9dEuzU3TTkA8+jOc5UM2D1Tqx4Je28Vyytc0/VRIminMDbBFaH4M8G1cyeQGjuedw==", "requires": {} }, "potpack": { diff --git a/package.json b/package.json index c9cdfa8..83893a8 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "bundledDependencies": false, "dependencies": { "leapjs": "^1.1.1", - "opencascade.js": "2.0.0-beta.88b46d0", + "opencascade.js": "2.0.0-beta.03aec7f", "potpack": "^1.0.1", "three": "^0.129.0" }, diff --git a/src/Frontend/Tools/BoxTool.js b/src/Frontend/Tools/BoxTool.js index a98d5aa..46641e4 100644 --- a/src/Frontend/Tools/BoxTool.js +++ b/src/Frontend/Tools/BoxTool.js @@ -267,14 +267,14 @@ class BoxTool { // The Height is Positive, let's Union let hitObject = this.shapes[hitObjectName]; let unionOp = new this.oc.BRepAlgoAPI_Fuse_3(hitObject, shape); - //unionOp.SetFuzzyValue(0.0000001); + unionOp.SetFuzzyValue(0.0000001); unionOp.Build(); return unionOp.Shape(); } else if (hitAnObject && height < 0) { // The Height is Negative, let's Subtract let hitObject = this.shapes[hitObjectName]; let differenceOp = new this.oc.BRepAlgoAPI_Cut_3(hitObject, shape); - //differenceOp.SetFuzzyValue(0.0000001); + differenceOp.SetFuzzyValue(0.0000001); differenceOp.Build(); return differenceOp.Shape(); } diff --git a/src/Frontend/Tools/CylinderTool.js b/src/Frontend/Tools/CylinderTool.js index f97375e..4d517b3 100644 --- a/src/Frontend/Tools/CylinderTool.js +++ b/src/Frontend/Tools/CylinderTool.js @@ -235,14 +235,14 @@ class CylinderTool { // The Height is Positive, let's Union let hitObject = this.shapes[hitObjectName]; let unionOp = new this.oc.BRepAlgoAPI_Fuse_3(hitObject, shape); - //unionOp.SetFuzzyValue(0.00000001); + unionOp.SetFuzzyValue(0.00000001); unionOp.Build(); return unionOp.Shape(); } else if (hitAnObject && height < 0) { // The Height is Negative, let's Subtract let hitObject = this.shapes[hitObjectName]; let differenceOp = new this.oc.BRepAlgoAPI_Cut_3(hitObject, shape); - //differenceOp.SetFuzzyValue(0.00000001); + differenceOp.SetFuzzyValue(0.00000001); differenceOp.Build(); return differenceOp.Shape(); } else { diff --git a/src/Frontend/Tools/DifferenceTool.js b/src/Frontend/Tools/DifferenceTool.js index c479939..a9a57ce 100644 --- a/src/Frontend/Tools/DifferenceTool.js +++ b/src/Frontend/Tools/DifferenceTool.js @@ -106,7 +106,7 @@ class DifferenceTool { if (overlapChecker.Value() <= 0 || overlapChecker.InnerSolution()) { let differenceOp = new this.oc.BRepAlgoAPI_Cut_3(shape, cuttingTool); - //differenceOp.SetFuzzyValue(0.00001); + differenceOp.SetFuzzyValue(0.00001); differenceOp.Build(); shape = differenceOp.Shape(); cut = true; diff --git a/src/Frontend/Tools/ExtrusionTool.js b/src/Frontend/Tools/ExtrusionTool.js index ae57297..a28a756 100644 --- a/src/Frontend/Tools/ExtrusionTool.js +++ b/src/Frontend/Tools/ExtrusionTool.js @@ -243,7 +243,7 @@ class ExtrusionTool { if (height > 0) { // The Height is Positive, let's Union let unionOp = new this.oc.BRepAlgoAPI_Fuse_3(hitObject, shape); - //unionOp.SetFuzzyValue(0.00001); + unionOp.SetFuzzyValue(0.00001); unionOp.Build(); return unionOp.Shape(); //let unionOp = new this.oc.BRepBuilderAPI_Sewing(0.00001); @@ -254,7 +254,7 @@ class ExtrusionTool { } else if (height < 0) { // The Height is Negative, let's Subtract let differenceOp = new this.oc.BRepAlgoAPI_Cut_3(hitObject, shape); - //differenceOp.SetFuzzyValue(0.00001); + differenceOp.SetFuzzyValue(0.00001); differenceOp.Build(); return differenceOp.Shape(); } diff --git a/src/Frontend/Tools/OffsetTool.js b/src/Frontend/Tools/OffsetTool.js index d3d37ca..3e6cce3 100644 --- a/src/Frontend/Tools/OffsetTool.js +++ b/src/Frontend/Tools/OffsetTool.js @@ -242,7 +242,7 @@ class OffsetTool { //hollowOp.Build(); //return hollowOp.Shape(); let differenceCut = new this.oc.BRepAlgoAPI_Cut_3(inShape, outShape); - //differenceCut.SetFuzzyValue(0.00001); + differenceCut.SetFuzzyValue(0.00001); differenceCut.Build(); return differenceCut.Shape(); } diff --git a/src/Frontend/Tools/SphereTool.js b/src/Frontend/Tools/SphereTool.js index 075dd2c..4410bc0 100644 --- a/src/Frontend/Tools/SphereTool.js +++ b/src/Frontend/Tools/SphereTool.js @@ -177,12 +177,12 @@ class SphereTool { let hitObject = this.shapes[hitObjectName]; if (radius > 0) { let union = new this.oc.BRepAlgoAPI_Fuse_3(hitObject, shape); - //union.SetFuzzyValue(0.00000001); + union.SetFuzzyValue(0.00000001); union.Build(); return union.Shape(); } else { let differenceCut = new this.oc.BRepAlgoAPI_Cut_3(hitObject, shape); - //differenceCut.SetFuzzyValue(0.00000001); + differenceCut.SetFuzzyValue(0.00000001); differenceCut.Build(); return differenceCut.Shape(); } diff --git a/src/Frontend/Tools/UnionTool.js b/src/Frontend/Tools/UnionTool.js index 4d37631..f65f06e 100644 --- a/src/Frontend/Tools/UnionTool.js +++ b/src/Frontend/Tools/UnionTool.js @@ -109,7 +109,7 @@ class UnionTool { //if (overlapChecker.InnerSolution()) { let union = new this.oc.BRepAlgoAPI_Fuse_3(shape, fuseTool); - //union.SetFuzzyValue(0.00001); + union.SetFuzzyValue(0.00001); union.Build(); shape = union.Shape(); fused = true;