diff --git a/cypress.json b/cypress.json index 5fa62041..860ef20d 100644 --- a/cypress.json +++ b/cypress.json @@ -5,5 +5,7 @@ "pluginsFile": "test/cypress/plugins/index.js", "screenshotsFolder": "test/cypress/screenshots", "videosFolder": "test/cypress/videos", - "supportFile": "test/cypress/support/index.js" + "supportFile": "test/cypress/support/index.js", + "viewportWidth": 1600, + "viewportHeight": 1000 } diff --git a/modules/math/l3space.ts b/modules/math/l3space.ts index 5a54919a..45452b6a 100644 --- a/modules/math/l3space.ts +++ b/modules/math/l3space.ts @@ -4,7 +4,7 @@ export type Basis = [Vector, Vector, Vector]; export type Vec3 = [number, number, number]; -export type Matrix3x4Data = [number, number, number, number, number, number, number, number, number, number, number, number]; +export type Matrix3x4Data = [[number, number, number, number],[number, number, number, number],[number, number, number, number]]; const freeze = Object.freeze; @@ -180,7 +180,7 @@ export class Matrix3 { ); }; - toArray(): [[number, number, number, number],[number, number, number, number],[number, number, number, number]] { + toArray(): Matrix3x4Data { return [ [this.mxx, this.mxy, this.mxz, this.tx], [this.myx, this.myy, this.myz, this.ty], diff --git a/test/coreTests/testCases/craftExtrude.js b/test/coreTests/testCases/craftExtrude.js index 6d1f5bce..4871d5b4 100644 --- a/test/coreTests/testCases/craftExtrude.js +++ b/test/coreTests/testCases/craftExtrude.js @@ -1,4 +1,5 @@ import {extrudeCube} from '../utils/scripts'; +import {testExtrudeBezier} from "./craftExtrudeBasicShapes"; export const TEST_MODE = 'modellerUI'; diff --git a/test/coreTests/testCases/craftRevolve.js b/test/coreTests/testCases/craftRevolve.js index a20dd443..f135b73d 100644 --- a/test/coreTests/testCases/craftRevolve.js +++ b/test/coreTests/testCases/craftRevolve.js @@ -1,18 +1,21 @@ import {createPlaneAndOpenSketcher, extrudeCube} from '../utils/scripts'; +import {testExtrudeCOI1Faces} from "./craftExtrude"; export const TEST_MODE = 'modellerUI'; +testRevolveHalfWay.only = true; export async function testRevolveHalfWay(env, ui) { await createPlaneAndOpenSketcher(ui); let sui = ui.openSketcher(); - sui.addRectangle(20, -50, 50, 50); + sui.addRectangle(200, -500, 500, 500); sui.changeToConstructionLayer(); - sui.addSegment(0, -50, 0, 50); + sui.addSegment(0, -500, 0, 500); ui.commitSketch(); ui.openWizard('REVOLVE'); ui.wizardContext.updateParam('angle', 180); - ui.select([0, 0, 10], [0, 0, -10]); + ui.simulateClickByRayCast([0, 0, 10], [0, 0, -10]); + ui.simulateClickByRayCast([100, 0, 10], [100, 0, -10]); await ui.wizardOK(); diff --git a/test/coreTests/utils/sketcherUtils.js b/test/coreTests/utils/sketcherUtils.js index 726d3801..58917e7e 100644 --- a/test/coreTests/utils/sketcherUtils.js +++ b/test/coreTests/utils/sketcherUtils.js @@ -123,7 +123,7 @@ export function addEllipticalArc(ctx, aX, aY, bX, bY, rX, rY) { export function addBezier(ctx, aX, aY, bX, bY) { [aX, aY] = modelToScreen(ctx.viewer, aX, aY); [bX, bY] = modelToScreen(ctx.viewer, bX, bY); - ctx.actions['addBezierCurve'].action(); + ctx.actions.BezierTool.invoke(ctx); moveAndClickXY(ctx, aX, aY); let curve = ctx.viewer.toolManager.tool.curve; moveAndClickXY(ctx, bX, bY); diff --git a/test/cypress/support/index.d.ts b/test/cypress/support/index.d.ts index 61953d7b..4287f666 100644 --- a/test/cypress/support/index.d.ts +++ b/test/cypress/support/index.d.ts @@ -22,8 +22,10 @@ declare namespace Cypress { } export interface SketcherTPI { + addRectangle(x1: number, y1: number, x2: number, y2: number): any; + addCircle(x: number, y: number, r: number): any; } type vec3 = [number, number, number]; diff --git a/web/app/cad/craft/e0/operationHandler.js b/web/app/cad/craft/e0/operationHandler.js index e2e028c7..8162d4d9 100644 --- a/web/app/cad/craft/e0/operationHandler.js +++ b/web/app/cad/craft/e0/operationHandler.js @@ -62,7 +62,7 @@ function createRevolveCommand(request, {cadRegistry, sketchStorageService}) { let pivot = cadRegistry.findSketchObject(request.axis).sketchPrimitive; let tr = face.csys.outTransformation; - let vec = __CAD_APP.services.exposure.math.dir; + let vec = __CAD_APP.services.exposure.math.vec; let axisOrigin = tr._apply3(pivot.a.data()); let axisDir = vec._normalize(vec._sub(tr._apply3(pivot.b.data()), axisOrigin)) diff --git a/web/app/cad/sketch/sketcherPlugin.ts b/web/app/cad/sketch/sketcherPlugin.ts index ae748e65..989c8e9c 100644 --- a/web/app/cad/sketch/sketcherPlugin.ts +++ b/web/app/cad/sketch/sketcherPlugin.ts @@ -6,6 +6,7 @@ import initReassignSketchMode from './reassignSketchMode'; import {Viewer} from "../../sketcher/viewer2d"; import {IO} from "../../sketcher/io"; import {Generator} from "../../sketcher/id-generator"; +import {NOOP} from "gems/func"; export function defineStreams(ctx) { ctx.streams.sketcher = { @@ -79,6 +80,7 @@ export function activate(ctx) { function updateSketchForFace(mFace) { let sketch = ctx.sketchStorageService.readSketch(mFace.defaultSketchId); mFace.setSketch(sketch); + ctx.craftService.models$.mutate(NOOP);// to reindex all entities streams.sketcher.update.next(mFace); } diff --git a/web/app/sketcher/constr/ANConstraints.ts b/web/app/sketcher/constr/ANConstraints.ts index fa61cf6e..d2ab0d1b 100644 --- a/web/app/sketcher/constr/ANConstraints.ts +++ b/web/app/sketcher/constr/ANConstraints.ts @@ -336,17 +336,43 @@ export const ConstraintDefinitions icon: PointOnCurveConstraintIcon, defineParamsScope: ([pt, ellipse], callback) => { - ellipse.visitParams(callback); - callback(new Param(0, 't')); pt.visitParams(callback); + ellipse.visitParams(callback); + callback(new Param(Math.atan2(pt.y - ellipse.c.y, pt.x - ellipse.c.x), 't')); }, - collectPolynomials: (polynomials, [p1x,p1y, p2x,p2y, r, t, px, py]) => { - const ellipsePoly = (p, t, p0, p1, p2, p3) => new Polynomial() - .monomial(-1); + collectPolynomials: (polynomials, [px,py, cx,cy, rx,ry, rot, t]) => { + polynomials.push(new Polynomial() + .monomial(-1) + .term(px, POW_1_FN) + .monomial() + .term(cx, POW_1_FN) + .monomial() + .term(rx, POW_1_FN) + .term(rot, COS_FN) + .term(t, COS_FN) + .monomial(-1) + .term(ry, POW_1_FN) + .term(rot, SIN_FN) + .term(t, SIN_FN) + ); + + polynomials.push(new Polynomial() + .monomial(-1) + .term(py, POW_1_FN) + .monomial() + .term(cy, POW_1_FN) + .monomial() + .term(rx, POW_1_FN) + .term(rot, SIN_FN) + .term(t, COS_FN) + .monomial() + .term(ry, POW_1_FN) + .term(rot, COS_FN) + .term(t, SIN_FN) + ); - // polynomials.push(ellipsePoly()); // polynomials.push(ellipsePoly()); }, @@ -956,7 +982,7 @@ export interface ConstraintSchema { id: string; name: string, - icon: IconType, + icon?: IconType, constants?: { [name: string]: { readOnly?: boolean; diff --git a/web/app/sketcher/constr/AlgNumSystem.ts b/web/app/sketcher/constr/AlgNumSystem.ts index 39ea992a..cbd2bb9e 100644 --- a/web/app/sketcher/constr/AlgNumSystem.ts +++ b/web/app/sketcher/constr/AlgNumSystem.ts @@ -5,7 +5,7 @@ import {compositeFn} from "gems/func"; import {AlgNumConstraint} from "./ANConstraints"; import {SolverParam} from "./solverParam"; -const DEBUG = true; +const DEBUG = false; export class AlgNumSubSystem { diff --git a/web/app/sketcher/io.ts b/web/app/sketcher/io.ts index 71c50281..62aaee13 100644 --- a/web/app/sketcher/io.ts +++ b/web/app/sketcher/io.ts @@ -1,6 +1,5 @@ import {Generator} from './id-generator' import {Viewer} from './viewer2d' -import {Styles} from './styles' import {Arc} from './shapes/arc' import {EndPoint} from './shapes/point' import {Segment} from './shapes/segment' @@ -8,10 +7,17 @@ import {Circle} from './shapes/circle' import {Ellipse} from './shapes/ellipse' import {EllipticalArc} from './shapes/elliptical-arc' import {BezierCurve} from './shapes/bezier-curve' -import {LinearDimension, AngleBetweenDimension, DiameterDimension, Dimension, HDimension, VDimension} from './shapes/dim' +import { + AngleBetweenDimension, + DiameterDimension, + Dimension, + HDimension, + LinearDimension, + VDimension +} from './shapes/dim' import Vector from 'math/vector'; import exportTextData from 'gems/exportTextData'; -import {AlgNumConstraint} from "./constr/ANConstraints"; +import {AlgNumConstraint, ConstraintSerialization} from "./constr/ANConstraints"; import {SketchGenerator} from "./generators/sketchGenerator"; import {BoundaryGeneratorSchema} from "./generators/boundaryGenerator"; import {SketchTypes} from "./shapes/sketch-types"; @@ -41,12 +47,7 @@ export interface SketchFormat_V3 { typeId: string }[]; - constraints: { - typeId: string, - objects: string[], - constants: {[key: string]: string}, - annotations: any - }[]; + constraints: ConstraintSerialization[]; }[]; @@ -125,7 +126,7 @@ export class IO { skobj = Ellipse.read(obj.id, obj.data); } else if (type === EllipticalArc.prototype.TYPE) { skobj = EllipticalArc.read(obj.id, obj.data); - } else if (type === EllipticalArc.prototype.TYPE) { + } else if (type === BezierCurve.prototype.TYPE) { skobj = BezierCurve.read(obj.id, obj.data); } if (skobj != null) {