From 95c69ec101fce503c22e40404247449ef6553cf0 Mon Sep 17 00:00:00 2001 From: Val Erastov Date: Fri, 24 Mar 2017 17:00:11 -0700 Subject: [PATCH] make extruding from plane work --- web/app/3d/craft/brep/cut-extrude.js | 27 ++++++++++++------- web/app/3d/craft/brep/sketch-reader.js | 4 +-- web/app/3d/craft/brep/wizards/cut-extrude.js | 6 ++--- .../3d/craft/brep/wizards/preview-wizard.js | 12 ++++----- web/app/3d/craft/mesh/workbench.js | 7 ++--- web/app/3d/selection.js | 8 +++--- 6 files changed, 38 insertions(+), 26 deletions(-) diff --git a/web/app/3d/craft/brep/cut-extrude.js b/web/app/3d/craft/brep/cut-extrude.js index 38bb69da..ec2a8e8f 100644 --- a/web/app/3d/craft/brep/cut-extrude.js +++ b/web/app/3d/craft/brep/cut-extrude.js @@ -23,19 +23,28 @@ export function Cut(app, params) { export function doOperation(app, params, cut) { const face = app.findFace(params.face); const solid = face.solid; - const sketch = ReadSketchFromFace(app, face); + const reverseNormal = !cut; + + let normal = face.normal(); + if (reverseNormal) normal = normal.negate(); + const sketch = ReadSketchFromFace(app, face, reverseNormal); + const extruder = new ParametricExtruder(params); - let normal = face.brepFace.surface.normal; - if (!cut) normal = normal.negate(); const operand = combineShells(sketch.map(s => extruder.extrude(s, normal))); BREPValidator.validateToConsole(operand); - - const op = cut ? subtract : union; - const result = op(solid.shell, operand); - for (let newFace of result.faces) { - if (newFace.id == face.id) { - newFace.id = undefined; + + let result; + if (solid instanceof BREPSceneSolid) { + const op = cut ? subtract : union; + result = op(solid.shell, operand); + for (let newFace of result.faces) { + if (newFace.id == face.id) { + newFace.id = undefined; + } } + } else { + if (cut) throw 'unable to cut plane'; + result = operand; } approx.update(result); const newSolid = new BREPSceneSolid(result); diff --git a/web/app/3d/craft/brep/sketch-reader.js b/web/app/3d/craft/brep/sketch-reader.js index cb8c6e8b..7b3d0d20 100644 --- a/web/app/3d/craft/brep/sketch-reader.js +++ b/web/app/3d/craft/brep/sketch-reader.js @@ -4,6 +4,6 @@ import {sortPolygons, getSketchedPolygons3D} from '../mesh/workbench' // here will be function of conversion sketch objects to brep DS -export function ReadSketchFromFace(app, face) { - return getSketchedPolygons3D(app, face); +export function ReadSketchFromFace(app, face, reverseGeom) { + return getSketchedPolygons3D(app, face, reverseGeom); } \ No newline at end of file diff --git a/web/app/3d/craft/brep/wizards/cut-extrude.js b/web/app/3d/craft/brep/wizards/cut-extrude.js index 89704e34..74d12876 100644 --- a/web/app/3d/craft/brep/wizards/cut-extrude.js +++ b/web/app/3d/craft/brep/wizards/cut-extrude.js @@ -50,9 +50,9 @@ export class ExtrudePreviewer extends SketchBasedPreviewer { createImpl(app, params, sketch, face) { const parametricExtruder = new ParametricExtruder(params); - const surface = face.brepFace.surface; - const baseNormal = this.inversed ? surface.normal : surface.normal.negate(); - const lidNormal = this.inversed ? baseNormal.negate() : surface.normal; + const normal = face.normal(); + const baseNormal = this.inversed ? normal : normal.negate(); + const lidNormal = this.inversed ? baseNormal.negate() : normal; parametricExtruder.prepareLidCalculation(baseNormal, lidNormal); diff --git a/web/app/3d/craft/brep/wizards/preview-wizard.js b/web/app/3d/craft/brep/wizards/preview-wizard.js index d5fcc957..7774b004 100644 --- a/web/app/3d/craft/brep/wizards/preview-wizard.js +++ b/web/app/3d/craft/brep/wizards/preview-wizard.js @@ -65,7 +65,7 @@ PreviewWizard.createMesh = function(triangles) { export class SketchBasedPreviewer { constructor() { - this.fixToCCW = true; + //this.fixToCCW = true; } createImpl(app, params, sketch, face) { @@ -78,11 +78,11 @@ export class SketchBasedPreviewer { const needSketchRead = !this.sketch || params.face != this.face; if (needSketchRead) { this.sketch = ReadSketchFromFace(app, face); - for (let polygon of this.sketch) { - if (!Loop.isPolygonCCWOnSurface(polygon, face.brepFace.surface) && this.fixToCCW) { - polygon.reverse(); - } - } + //for (let polygon of this.sketch) { + //if (!Loop.isPolygonCCWOnSurface(polygon, face.brepFace.surface) && this.fixToCCW) { + // polygon.reverse(); + //} + //} this.face = params.face; } const triangles = this.createImpl(app, params, this.sketch, face); diff --git a/web/app/3d/craft/mesh/workbench.js b/web/app/3d/craft/mesh/workbench.js index 6e7dfda2..25673ed7 100644 --- a/web/app/3d/craft/mesh/workbench.js +++ b/web/app/3d/craft/mesh/workbench.js @@ -162,15 +162,16 @@ export function approxBezierCurve(a, b, cp1, cp2, resolution) { return LUT(a, b, cp1, cp2, 10); } -export function getSketchedPolygons3D(app, face) { +export function getSketchedPolygons3D(app, face, reverseGeom) { var savedFace = localStorage.getItem(app.faceStorageKey(face.id)); if (savedFace == null) return null; var geom = readSketchGeom(JSON.parse(savedFace), face.id, false); var polygons2D = cad_utils.sketchToPolygons(geom); - - var normal = face.normal(); + if (reverseGeom) { + polygons2D.forEach(p => p.reverse()); + } var depth = null; var sketchedPolygons = []; for (var i = 0; i < polygons2D.length; i++) { diff --git a/web/app/3d/selection.js b/web/app/3d/selection.js index 497fb6ae..05a0fc48 100644 --- a/web/app/3d/selection.js +++ b/web/app/3d/selection.js @@ -157,9 +157,11 @@ export class SelectionManager extends AbstractSelectionManager { if (sceneFace.curvedSurfaces) { return sceneFace.curvedSurfaces; } - const approxFace = sceneFace.brepFace.data[approx.FACE_CHUNK]; - if (approxFace) { - return approxFace.faces.map(f => f.data['scene.face']); + if (sceneFace.brepFace) { + const approxFace = sceneFace.brepFace.data[approx.FACE_CHUNK]; + if (approxFace) { + return approxFace.faces.map(f => f.data['scene.face']); + } } return undefined; }