From a67bd9bfe77b2e588e23762fad381137bb6a9cfe Mon Sep 17 00:00:00 2001 From: Val Erastov Date: Tue, 19 Feb 2019 01:36:05 -0800 Subject: [PATCH] craft tests scenarios --- web/test/cases/craftCut.js | 156 ++++++++++++++++++ web/test/cases/craftExtrude.js | 78 +++++++++ web/test/cases/craftExtrudeBasicShapes.js | 13 +- web/test/cases/craftExtrudeOptions.js | 3 +- web/test/cases/craftFillet.js | 32 ++++ web/test/cases/craftLoft.js | 26 +++ web/test/cases/craftRevolve.js | 36 ++++ web/test/runner.less | 8 +- web/test/suites.js | 5 + web/test/utils/scripts.js | 18 ++ .../subjects/modeller/modellerUISubject.js | 51 ++---- .../subjects/modeller/sketcherUISubject.js | 38 ++++- 12 files changed, 418 insertions(+), 46 deletions(-) create mode 100644 web/test/cases/craftCut.js create mode 100644 web/test/cases/craftExtrude.js create mode 100644 web/test/cases/craftFillet.js create mode 100644 web/test/cases/craftLoft.js create mode 100644 web/test/cases/craftRevolve.js create mode 100644 web/test/utils/scripts.js diff --git a/web/test/cases/craftCut.js b/web/test/cases/craftCut.js new file mode 100644 index 00000000..3f6e660a --- /dev/null +++ b/web/test/cases/craftCut.js @@ -0,0 +1,156 @@ +import {extrudeCube} from '../utils/scripts'; + +export const TEST_MODE = 'modellerUI'; + +export function testCutMid(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(-50, -50, 50, 50); + ui.commitSketch(); + + ui.openWizard('CUT'); + ui.wizardContext.updateParam('value', 50); + ui.wizardOK(); + + env.done(); +} + +export function testCutCOI1Faces(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(0, 0, 80, 100); + ui.commitSketch(); + + ui.openWizard('CUT'); + ui.wizardContext.updateParam('value', 50); + ui.wizardOK(); + + env.done(); +} + +export function testCutCOI2Faces(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(0, 0, 100, 100); + ui.commitSketch(); + + ui.openWizard('CUT'); + ui.wizardContext.updateParam('value', 50); + ui.wizardOK(); + + env.done(); +} + +export function testCutCOI3Faces(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(0, -100, 100, 100); + ui.commitSketch(); + + ui.openWizard('CUT'); + ui.wizardContext.updateParam('value', 50); + ui.wizardOK(); + + env.done(); +} + +export function testCutCOI4Faces(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(-100, -100, 100, 100); + ui.commitSketch(); + + ui.openWizard('CUT'); + ui.wizardContext.updateParam('value', 50); + ui.wizardOK(); + + env.done(); +} + +// all the way cuts + +export function testCutMidAllWay(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(-50, -50, 50, 50); + ui.commitSketch(); + + ui.openWizard('CUT'); + ui.wizardContext.updateParam('value', 200); + ui.wizardOK(); + + env.done(); +} + +export function testCutCOI1FacesAllWay(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(0, 0, 80, 100); + ui.commitSketch(); + + ui.openWizard('CUT'); + ui.wizardContext.updateParam('value', 200); + ui.wizardOK(); + + env.done(); +} + +export function testCutCOI2FacesAllWay(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(0, 0, 100, 100); + ui.commitSketch(); + + ui.openWizard('CUT'); + ui.wizardContext.updateParam('value', 200); + ui.wizardOK(); + + env.done(); +} + +export function testCutCOI3FacesAllWay(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(0, -100, 100, 100); + ui.commitSketch(); + + ui.openWizard('CUT'); + ui.wizardContext.updateParam('value', 200); + ui.wizardOK(); + + env.done(); +} + +export function testCutCOI4FacesAllWay(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(-100, -100, 100, 100); + ui.commitSketch(); + + ui.openWizard('CUT'); + ui.wizardContext.updateParam('value', 200); + ui.wizardOK(); + + env.done(); +} + diff --git a/web/test/cases/craftExtrude.js b/web/test/cases/craftExtrude.js new file mode 100644 index 00000000..6ff06193 --- /dev/null +++ b/web/test/cases/craftExtrude.js @@ -0,0 +1,78 @@ +import {extrudeCube} from '../utils/scripts'; + +export const TEST_MODE = 'modellerUI'; + +export function testExtrudeMid(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(-50, -50, 50, 50); + ui.commitSketch(); + + ui.openWizard('EXTRUDE'); + ui.wizardContext.updateParam('value', 50); + ui.wizardOK(); + + env.done(); +} + +export function testExtrudeCOI1Faces(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(0, 0, 80, 100); + ui.commitSketch(); + + ui.openWizard('EXTRUDE'); + ui.wizardContext.updateParam('value', 50); + ui.wizardOK(); + + env.done(); +} + +export function testExtrudeCOI2Faces(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(0, 0, 100, 100); + ui.commitSketch(); + + ui.openWizard('EXTRUDE'); + ui.wizardContext.updateParam('value', 50); + ui.wizardOK(); + + env.done(); +} + +export function testExtrudeCOI3Faces(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(0, -100, 100, 100); + ui.commitSketch(); + + ui.openWizard('EXTRUDE'); + ui.wizardContext.updateParam('value', 50); + ui.wizardOK(); + + env.done(); +} + +export function testExtrudeCOI4Faces(env, ui) { + extrudeCube(ui); + ui.selectFaces([0, 0, 210], [0, 0, 190]); + + let sui = ui.openSketcher(); + sui.addPolygon(-100, -100, 100, 100); + ui.commitSketch(); + + ui.openWizard('EXTRUDE'); + ui.wizardContext.updateParam('value', 50); + ui.wizardOK(); + + env.done(); +} diff --git a/web/test/cases/craftExtrudeBasicShapes.js b/web/test/cases/craftExtrudeBasicShapes.js index 816287de..e373b293 100644 --- a/web/test/cases/craftExtrudeBasicShapes.js +++ b/web/test/cases/craftExtrudeBasicShapes.js @@ -1,9 +1,10 @@ import {assertFaceOrigination, assertFaceRole} from '../utils/asserts'; +import {createPlaneAndOpenSketcher} from '../utils/scripts'; export const TEST_MODE = 'modellerUI'; export function testExtrudeFromSketch(env, ui) { - let sketcherUI = ui.createPlaneAndOpenSketcher(); + let sketcherUI = createPlaneAndOpenSketcher(ui); let sketchedFace = ui.context.services.selection.face.single; let seg1 = sketcherUI.addSegment(-100, -100, 100, -100); let seg2 = sketcherUI.addSegment(100, -100, 100, 100); @@ -47,7 +48,7 @@ export function testExtrudeFromSketch(env, ui) { } export function testExtrudeArc(env, ui) { - let sketcherUI = ui.createPlaneAndOpenSketcher(); + let sketcherUI = createPlaneAndOpenSketcher(ui); let sketchedFace = ui.context.services.selection.face.single; let arc = sketcherUI.addArc(0, 0, 100, 0, -100, 0); let segment = sketcherUI.addSegment(100, 0, -100, 0); @@ -85,7 +86,7 @@ export function testExtrudeArc(env, ui) { } export function testExtrudeCircle(env, ui) { - let sketcherUI = ui.createPlaneAndOpenSketcher(); + let sketcherUI = createPlaneAndOpenSketcher(ui); let sketchedFace = ui.context.services.selection.face.single; let circle = sketcherUI.addCircle(100, 100, 100); @@ -115,7 +116,7 @@ export function testExtrudeCircle(env, ui) { } export function testExtrudeEllipse(env, ui) { - let sketcherUI = ui.createPlaneAndOpenSketcher(); + let sketcherUI = createPlaneAndOpenSketcher(ui); let sketchedFace = ui.context.services.selection.face.single; let ellipse = sketcherUI.addEllipse(-100, 100, 100, 100, 0, 150); @@ -145,7 +146,7 @@ export function testExtrudeEllipse(env, ui) { } export function testExtrudeEllipticalArc(env, ui) { - let sketcherUI = ui.createPlaneAndOpenSketcher(); + let sketcherUI = createPlaneAndOpenSketcher(ui); let sketchedFace = ui.context.services.selection.face.single; let eArc = sketcherUI.addEllipticalArc(-100, 100, 100, 100, 0, 150); sketcherUI.move(100, 100, -50, 170); @@ -177,7 +178,7 @@ export function testExtrudeEllipticalArc(env, ui) { } export function testExtrudeBezier(env, ui) { - let sketcherUI = ui.createPlaneAndOpenSketcher(); + let sketcherUI = createPlaneAndOpenSketcher(ui); let sketchedFace = ui.context.services.selection.face.single; let bezier = sketcherUI.addBezier(-100, 100, 100, 100, 0, 150); sketcherUI.move(bezier.cp2.x, bezier.cp2.y, bezier.cp2.x, bezier.cp1.y); diff --git a/web/test/cases/craftExtrudeOptions.js b/web/test/cases/craftExtrudeOptions.js index 70618fe5..a4d09b86 100644 --- a/web/test/cases/craftExtrudeOptions.js +++ b/web/test/cases/craftExtrudeOptions.js @@ -1,9 +1,10 @@ import {assertFaceOrigination, assertFaceRole} from '../utils/asserts'; +import {createPlaneAndOpenSketcher} from '../utils/scripts'; export const TEST_MODE = 'modellerUI'; export function testExtrudePrism(env, ui) { - let sketcherUI = ui.createPlaneAndOpenSketcher(); + let sketcherUI = createPlaneAndOpenSketcher(ui); let sketchedFace = ui.context.services.selection.face.single; let [S1, S2, S3, S4] = sketcherUI.addPolygon(-100, -100, 100, 100); diff --git a/web/test/cases/craftFillet.js b/web/test/cases/craftFillet.js new file mode 100644 index 00000000..bf8582d4 --- /dev/null +++ b/web/test/cases/craftFillet.js @@ -0,0 +1,32 @@ +import {createPlaneAndOpenSketcher, extrudeCube} from '../utils/scripts'; + +export const TEST_MODE = 'modellerUI'; + +export function test1Fillet(env, ui) { + extrudeCube(ui); + ui.openWizard('FILLET'); + ui.select([0, 110, 210], [0, 90, 190]); + ui.wizardOK(); + env.done(); +} + +export function test2Fillet(env, ui) { + extrudeCube(ui); + ui.openWizard('FILLET'); + ui.select([0, 110, 210], [0, 90, 190]); + ui.select([-110, 110, 100], [-90, 90, 100]); + ui.wizardOK(); + env.done(); +} + +export function test3Fillet(env, ui) { + extrudeCube(ui); + ui.openWizard('FILLET'); + ui.select([0, 110, 210], [0, 90, 190]); + ui.select([-110, 110, 100], [-90, 90, 100]); + ui.select([-110, 0, 210], [-90, 0, 190]); + ui.wizardOK(); + env.done(); +} + + diff --git a/web/test/cases/craftLoft.js b/web/test/cases/craftLoft.js new file mode 100644 index 00000000..28d58296 --- /dev/null +++ b/web/test/cases/craftLoft.js @@ -0,0 +1,26 @@ +import {createPlaneAndOpenSketcher, extrudeCube} from '../utils/scripts'; + +export const TEST_MODE = 'modellerUI'; + +export function testLoftOver2Sections(env, ui) { + let sui = createPlaneAndOpenSketcher(ui); + sui.addPolygon(-100, -100, 100, 100); + ui.commitSketch(); + + ui.openWizard('PLANE'); + ui.wizardContext.updateParam('depth', 300); + ui.wizardOK(); + ui.selectFaces([0, 0, 290], [0, 0, 310]); + sui = ui.openSketcher(); + sui.addSerpinski([-100, 0], [100, 0], 2); + ui.commitSketch(); + + ui.openWizard('LOFT'); + ui.select([-3, -3, 310], [-3, -3, 290]); + ui.select([-3, -3, -10], [-3, -3, 10]); + ui.wizardOK(); + env.done(); +} + + + diff --git a/web/test/cases/craftRevolve.js b/web/test/cases/craftRevolve.js new file mode 100644 index 00000000..cc840310 --- /dev/null +++ b/web/test/cases/craftRevolve.js @@ -0,0 +1,36 @@ +import {createPlaneAndOpenSketcher, extrudeCube} from '../utils/scripts'; + +export const TEST_MODE = 'modellerUI'; + +export function testRevolveHalfWay(env, ui) { + createPlaneAndOpenSketcher(ui); + let sui = ui.openSketcher(); + sui.addPolygon(20, -50, 50, 50); + sui.changeToConstructionLayer(); + sui.addSegment(0, -50, 0, 50); + ui.commitSketch(); + + ui.openWizard('REVOLVE'); + ui.wizardContext.updateParam('angle', 180); + ui.select([0, 0, 10], [0, 0, -10]); + ui.wizardOK(); + + env.done(); +} + +export function testRevolveAllWay(env, ui) { + createPlaneAndOpenSketcher(ui); + let sui = ui.openSketcher(); + sui.addPolygon(20, -50, 50, 50); + sui.changeToConstructionLayer(); + sui.addSegment(0, -50, 0, 50); + ui.commitSketch(); + + ui.openWizard('REVOLVE'); + ui.wizardContext.updateParam('angle', 360); + ui.select([0, 0, 10], [0, 0, -10]); + ui.wizardOK(); + + env.done(); +} + diff --git a/web/test/runner.less b/web/test/runner.less index 8e519782..3d10f65d 100644 --- a/web/test/runner.less +++ b/web/test/runner.less @@ -9,10 +9,10 @@ body { box-sizing: border-box; right: 0; bottom: 0; - height: 40%; - max-height: 500px; - width: 40%; - max-width: 500px; + //max-height: 700px; + //max-width: 700px; + width: 70%; + height: 70%; background-color: #233930; } diff --git a/web/test/suites.js b/web/test/suites.js index af414b47..892f4e30 100644 --- a/web/test/suites.js +++ b/web/test/suites.js @@ -7,6 +7,11 @@ export default { TestCase('craftPlane'), TestCase('craftExtrudeBasicShapes'), TestCase('craftExtrudeOptions'), + TestCase('craftExtrude'), + TestCase('craftCut'), + TestCase('craftRevolve'), + TestCase('craftFillet'), + TestCase('craftLoft'), ], SketcherObjects: [ diff --git a/web/test/utils/scripts.js b/web/test/utils/scripts.js new file mode 100644 index 00000000..2942906b --- /dev/null +++ b/web/test/utils/scripts.js @@ -0,0 +1,18 @@ + +export function createPlaneAndOpenSketcher(ui) { + ui.openWizard('PLANE'); + ui.wizardOK(); + ui.selectFaces([0, 0, -10], [0, 0, 10]); + return ui.openSketcher(); +} + +export function extrudeCube(ui) { + let sketcherUI = createPlaneAndOpenSketcher(ui); + sketcherUI.addPolygon(-100, -100, 100, 100); + ui.commitSketch(); + ui.selectFaces([0, 0, -10], [0, 0, 10]); + ui.openWizard('EXTRUDE'); + ui.wizardContext.updateParam('value', 200); + ui.wizardOK(); +} + diff --git a/web/test/utils/subjects/modeller/modellerUISubject.js b/web/test/utils/subjects/modeller/modellerUISubject.js index 8ead484b..5b9802d1 100644 --- a/web/test/utils/subjects/modeller/modellerUISubject.js +++ b/web/test/utils/subjects/modeller/modellerUISubject.js @@ -1,6 +1,9 @@ -import {getAttribute} from '../../../../../modules/scene/objectData'; -import {FACE} from '../../../../app/cad/scene/entites'; import {createSubjectFromInPlaceSketcher} from './sketcherUISubject'; +import { + ALL_EXCLUDING_SOLID_KINDS, + PICK_KIND, + traversePickResults +} from '../../../../app/cad/scene/controls/pickControlPlugin'; export default ctx => { @@ -24,37 +27,25 @@ export default ctx => { sceneMouseEvent('mouseup', x, y); } - function rayCast(from3, to3) { - const THREE = ctx.services.tpi.THREE; - let raycaster = new THREE.Raycaster(); - let from = new THREE.Vector3().fromArray(from3); - let to = new THREE.Vector3().fromArray(to3); - let dir = to.sub(from); - let dist = dir.length(); - raycaster.set(from, dir.normalize()); - return raycaster.intersectObjects( ctx.services.cadScene.workGroup.children, true ).filter(h => h.distance <= dist); - } - function rayCastFaces(from, to) { - let models = rayCast(from, to).map(h => { - if (h.face) { - let faceV = getAttribute(h.face, FACE); - if (faceV && faceV.model) { - return faceV.model; - } - } - }); + let rawObjects = ctx.services.viewer.customRaycast(from, to, ctx.services.cadScene.workGroup.children); + let faces = []; + traversePickResults(null, rawObjects, PICK_KIND.FACE, face => faces.push(face)); let out = []; - models.forEach(m => { - if (!!m && !out.includes(m)) { - out.push(m); + faces.forEach(face => { + if (!out.includes(face)) { + out.push(face); } }); return out; } function selectFaces(from, to) { - rayCastFaces(from, to).forEach(face => ctx.services.pickControl.pick(face)); + ctx.services.pickControl.pickFromRay(from, to, PICK_KIND.FACE); + } + + function select(from, to) { + ctx.services.pickControl.pickFromRay(from, to, ALL_EXCLUDING_SOLID_KINDS); } function getWizardContext() { @@ -70,19 +61,11 @@ export default ctx => { ctx.services.action.run('sketchSaveAndExit'); } - function createPlaneAndOpenSketcher() { - openWizard('PLANE'); - wizardOK(); - selectFaces([0, 0, -10], [0, 0, 10]); - return openSketcher(); - } - return { context: ctx, openWizard, wizardOK, sceneMouseEvent, clickOnScene, - rayCastFaces, selectFaces, openSketcher, commitSketch, + rayCastFaces, select, selectFaces, openSketcher, commitSketch, get wizardContext() { return getWizardContext()}, - createPlaneAndOpenSketcher, __DEBUG__: ctx.services.debug.utils }; } diff --git a/web/test/utils/subjects/modeller/sketcherUISubject.js b/web/test/utils/subjects/modeller/sketcherUISubject.js index 94a31ae2..253ddb63 100644 --- a/web/test/utils/subjects/modeller/sketcherUISubject.js +++ b/web/test/utils/subjects/modeller/sketcherUISubject.js @@ -1,5 +1,7 @@ import * as sketcher_utils from '../../../utils/sketcher-utils' import {decapitalize} from '../../../../../modules/gems/capitalize'; +import genSerpinski, {genSerpinskiImpl} from '../../../../app/utils/genSerpinski'; +import {distance, distanceAB} from '../../../../app/math/math'; export function createSubjectFromInPlaceSketcher(ctx) { @@ -35,8 +37,42 @@ export function createSubjectFromInPlaceSketcher(ctx) { ]; } + function addSerpinski([ax, ay], [bx, by], depth) { + genSerpinskiImpl(ctx.services.sketcher.inPlaceEditor.viewer, {x: ax, y: ay}, {x: bx, y: by}, depth); + let jointWidth = distance(ax, ay, bx, by) / (depth + 1) / 2; + + let dx = bx - ax; + let dy = by - ay; + + let D = Math.sqrt(dx*dx + dy*dy); + + dx /= D; + dy /= D; + + let ddx = -dy * jointWidth; + let ddy = dx * jointWidth; + + + genSerpinskiImpl(ctx.services.sketcher.inPlaceEditor.viewer, {x: bx-ddx, y: by-ddy}, {x: ax-ddx, y: ay-ddy}, depth); + addSegment(ax, ay, ax-ddx, ay-ddy); + addSegment(bx, by, bx-ddx, by-ddy); + } + + function changeLayer(layerName) { + ctx.services.sketcher.inPlaceEditor.viewer.setActiveLayerName(layerName); + } + + function changeToConstructionLayer() { + changeLayer('_construction_'); + } + + function changeToDefaultLayer() { + changeLayer('sketch'); + } + return { - addSegment, addPolygon, addArc, addCircle, addEllipse, addEllipticalArc, addBezier, move + addSegment, addPolygon, addArc, addCircle, addEllipse, addEllipticalArc, addSerpinski, addBezier, + move, changeLayer, changeToConstructionLayer, changeToDefaultLayer, } } \ No newline at end of file