UNPKG

awv3

Version:
1,311 lines (1,062 loc) 153 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.runPerfoTest = exports.runAllTests = exports.SketchMatcher = exports.SketcherAutomation = undefined; var _typeof2 = require('babel-runtime/helpers/typeof'); var _typeof3 = _interopRequireDefault(_typeof2); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); //======================================================================================= var runSketchTest = function () { var _ref65 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee64(auto, testFunc) { var sketch; return _regenerator2.default.wrap(function _callee64$(_context64) { while (1) { switch (_context64.prev = _context64.next) { case 0: _context64.next = 2; return auto.cleanSketch(); case 2: console.log("Started unit test: ", testFunc.name); sketch = auto.getCurrentSketch(); _context64.next = 6; return testFunc(auto, sketch); case 6: console.log("Finished unit test: ", testFunc.name); case 7: case 'end': return _context64.stop(); } } }, _callee64, this); })); return function runSketchTest(_x104, _x105) { return _ref65.apply(this, arguments); }; }(); var runAllSketchTests = function () { var _ref66 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee65(auto) { var i; return _regenerator2.default.wrap(function _callee65$(_context65) { while (1) { switch (_context65.prev = _context65.next) { case 0: i = 0; case 1: if (!(i < sketchUnitTests.length)) { _context65.next = 7; break; } _context65.next = 4; return runSketchTest(auto, sketchUnitTests[i]); case 4: i++; _context65.next = 1; break; case 7: _context65.next = 9; return auto.cleanSketch(); case 9: case 'end': return _context65.stop(); } } }, _callee65, this); })); return function runAllSketchTests(_x106) { return _ref66.apply(this, arguments); }; }(); var someAutomationStuff = function () { var _ref67 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee69(auto) { var _this7 = this; var sketch, line1, line2, leg1, arc, leg2; return _regenerator2.default.wrap(function _callee69$(_context69) { while (1) { switch (_context69.prev = _context69.next) { case 0: sketch = auto.getCurrentSketch(); _context69.next = 3; return auto.drawLine([50, 100], [100, 50]); case 3: line1 = _context69.sent; SketchMatcher.run(sketch, [{ type: "line", ends: [[100, 50], [50, 100]], middle: [75, 75], undir: true }], { ignoreConstraints: false }); _context69.next = 7; return auto.drawLine([125, -50], [125, 50]); case 7: line2 = _context69.sent; _context69.next = 10; return auto.dragSketchPoint(auto.getStartPoint(line1), [[50, 100], [60, 100], [70, 100], [80, 100], [90, 100], [100, 100]], true, true); case 10: _context69.next = 12; return auto.dragSketchPoint(auto.getEndPoint(line2), [[125, 50], [50, 50]], true); case 12: SketchMatcher.run(sketch, [{ type: "line", ends: [[100, 100], [100, 50]] }, { type: "line", ends: [[125, -50], [50, 50]] }, { type: "verticality", args: 1 }], { ignoreConstraints: false }); SketchMatcher.run(sketch, [{ type: "point", position: [100, 100], optional: true }, //just for testing matcher =) { type: "line", ends: [[100, 100], [100, 50]] }, { type: "line", ends: [[125, -50], [50, 50]] }]); setTestName(line1, "line1"); setTestName(line2, "line2"); _context69.next = 18; return auto.drawConstraint('fixation', [auto.getEndPoint(line2)]); case 18: _context69.next = 20; return auto.solveConstraints(); case 20: SketchMatcher.run(sketch, [{ name: "line1", type: "line", ends: [[100, 100], [100, 50]] }, { name: "line2", type: "line", ends: [[50, -75], [50, 50]] }, { type: "verticality", args: "line2" }, { type: "fixation", args: "line2.e" }], { ignoreConstraints: false }); _context69.next = 23; return auto.dragSketchPoint(auto.getEndPoint(line2), [-100, -100], false); case 23: _context69.next = 25; return auto.dragSketchLine(line2, [-100, -100]); case 25: _context69.next = 27; return auto.chooseTool('polyline'); case 27: _context69.next = 29; return auto.trackAdded((0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee66() { return _regenerator2.default.wrap(function _callee66$(_context66) { while (1) { switch (_context66.prev = _context66.next) { case 0: _context66.next = 2; return auto.mouseClickAt({ x: -100, y: 0 }); case 2: _context66.next = 4; return auto.mouseClickAt({ x: -100, y: 50 }); case 4: case 'end': return _context66.stop(); } } }, _callee66, _this7); }))); case 29: _context69.t0 = _line2.default; leg1 = _context69.sent.ofType(_context69.t0).single(); _context69.next = 33; return auto.chooseTool('arcTangent'); case 33: _context69.next = 35; return auto.trackAdded((0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee67() { return _regenerator2.default.wrap(function _callee67$(_context67) { while (1) { switch (_context67.prev = _context67.next) { case 0: _context67.next = 2; return auto.mouseClickAt(new THREE.Vector3(-50, 100, 0)); case 2: case 'end': return _context67.stop(); } } }, _callee67, _this7); }))); case 35: _context69.t1 = _arc2.default; arc = _context69.sent.ofType(_context69.t1).single(); _context69.next = 39; return auto.trackAdded((0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee68() { return _regenerator2.default.wrap(function _callee68$(_context68) { while (1) { switch (_context68.prev = _context68.next) { case 0: _context68.next = 2; return auto.mouseClickAt(new THREE.Vector3(0, 100, "bugoga")); case 2: case 'end': return _context68.stop(); } } }, _callee68, _this7); }))); case 39: _context69.t2 = _line2.default; leg2 = _context69.sent.ofType(_context69.t2).single(); _context69.next = 43; return auto.chooseTool('empty'); case 43: _context69.next = 45; return auto.hoverObject(leg1); case 45: _context69.next = 47; return auto.unhoverObject(leg1); case 47: _context69.next = 49; return auto.hoverObject(leg2); case 49: _context69.next = 51; return auto.unhoverObject(leg2); case 51: _context69.next = 53; return auto.hoverObject(arc); case 53: _context69.next = 55; return auto.unhoverObject(arc); case 55: _context69.next = 57; return auto.dragSketchPoint(auto.getCenterPoint(arc), [10, 30], true); case 57: _context69.next = 59; return auto.setIncrementalSolve(true); case 59: _context69.next = 61; return auto.dragSketchPoint(auto.getCenterPoint(arc), [[10, 30], [0, 10], [0, 20], [0, 30], [-10, 30], [-10, 20], [-20, 10], [-50, 0]], true); case 61: _context69.next = 63; return auto.drawConstraint('fixation', [auto.getStartPoint(leg1)]); case 63: _context69.next = 65; return auto.drawConstraint('fixation', [auto.getEndPoint(leg2)]); case 65: _context69.next = 67; return auto.dragSketchPoint(auto.getCenterPoint(arc), [[0, 10], [0, 20], [0, 30], [-10, 30], [-10, 20], [-20, 10], [-50, 30]]); case 67: _context69.next = 69; return auto.solveConstraints(); case 69: _context69.next = 71; return auto.deleteObject(line2); case 71: _context69.next = 73; return (0, _delay2.default)(1000); case 73: _context69.next = 75; return auto.cleanSketch(); case 75: case 'end': return _context69.stop(); } } }, _callee69, this); })); return function someAutomationStuff(_x107) { return _ref67.apply(this, arguments); }; }(); var runAllTests = exports.runAllTests = function () { var _ref71 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee70(sketcher, rootObject) { var auto; return _regenerator2.default.wrap(function _callee70$(_context70) { while (1) { switch (_context70.prev = _context70.next) { case 0: auto = new SketcherAutomation(sketcher); //auto.setRootObject(rootObject); //TODO: sketch creation?... //auto.setTickWaitTime(200); //uncomment to slow down automation //await runSketchTest(auto, sketchUnitTests.find(x => x.name === "testHorizDistance0")); _context70.next = 3; return auto.execute(runAllSketchTests); case 3: auto.setTickWaitTime(200); _context70.next = 6; return auto.execute(someAutomationStuff); case 6: case 'end': return _context70.stop(); } } }, _callee70, this); })); return function runAllTests(_x108, _x109) { return _ref71.apply(this, arguments); }; }(); var runPerfoTest = exports.runPerfoTest = function () { var _ref72 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee71(sketcher) { var auto, objectsCount, startTime, rad, squaresCnt, i, elapsedTime; return _regenerator2.default.wrap(function _callee71$(_context71) { while (1) { switch (_context71.prev = _context71.next) { case 0: auto = new SketcherAutomation(sketcher); check(sketcher.currentSketch, "Select sketch before running perfo-test"); objectsCount = sketcher.currentSketch.getObjectsOnSketch().length; startTime = performance.now(); if (!(objectsCount == 0)) { _context71.next = 25; break; } _context71.next = 7; return auto.chooseTool('polyline'); case 7: rad = 0; squaresCnt = 20; i = 0; case 10: if (!(i < squaresCnt)) { _context71.next = 23; break; } rad = rad + 10; _context71.next = 14; return auto.mouseClickAt([rad, rad]); case 14: _context71.next = 16; return auto.mouseClickAt([-rad, rad]); case 16: _context71.next = 18; return auto.mouseClickAt([-rad, -rad]); case 18: _context71.next = 20; return auto.mouseClickAt([rad, -rad]); case 20: i++; _context71.next = 10; break; case 23: _context71.next = 27; break; case 25: _context71.next = 27; return auto.cleanSketch(); case 27: elapsedTime = performance.now() - startTime; if (objectsCount == 0) console.log("Drew polyline with " + squaresCnt * 4 + " vertices in time " + elapsedTime);else console.log("Cleaned sketch with " + objectsCount + " objects in time " + elapsedTime); case 29: case 'end': return _context71.stop(); } } }, _callee71, this); })); return function runPerfoTest(_x110) { return _ref72.apply(this, arguments); }; }(); var _delay = require('delay'); var _delay2 = _interopRequireDefault(_delay); var _levenshteinEditDistance = require('levenshtein-edit-distance'); var _levenshteinEditDistance2 = _interopRequireDefault(_levenshteinEditDistance); var _three = require('three'); var THREE = _interopRequireWildcard(_three); var _object = require('../../three/object3'); var _object2 = _interopRequireDefault(_object); var _sketch = require('../sketcher/sketch'); var _sketch2 = _interopRequireDefault(_sketch); var _sketcher = require('../sketcher'); var _sketcher2 = _interopRequireDefault(_sketcher); var _constraint = require('../sketcher/constraint'); var _constraint2 = _interopRequireDefault(_constraint); var _point = require('../sketcher/graphics/point'); var _point2 = _interopRequireDefault(_point); var _line = require('../sketcher/graphics/line'); var _line2 = _interopRequireDefault(_line); var _arc = require('../sketcher/graphics/arc'); var _arc2 = _interopRequireDefault(_arc); var _constraintgen = require('../sketcher/constraintgen'); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function check(cond, message) { //TODO: Throw custom exception and wrap arguments into it //so that it could be redirected to console.error later. //After that improve error messages all over the code. if (!cond) throw new Error(message); } //for setting names used in sketch matching function setTestName(obj, name) { check(obj.testName === undefined || obj.testName === name, "Overwriting object's name " + obj.testName + " with " + name); obj.testName = name; } function getTestName(obj, name) { return obj.testName; } function _convVector(vec) { if (Array.isArray(vec) && vec.length >= 2 && typeof vec[0] === "number" && typeof vec[1] === "number") return new THREE.Vector2(vec[0], vec[1]); if (typeof vec.x === "number" && typeof vec.y === "number") return new THREE.Vector2(vec.x, vec.y); return null; } function convVector(vec) { var res = _convVector(vec); check(res, "Expected 2D vector, found: " + vec.toString()); return res; } function convVectorArray(vecArray) { if (vecArray === undefined || vecArray === null) return []; var asOneVector = _convVector(vecArray); if (asOneVector) return asOneVector; check(Array.isArray(vecArray), "Expected array of vectors"); vecArray = vecArray.map(function (vec) { return convVector(vec); }); return vecArray; } var AddRemoveTracker = function () { function AddRemoveTracker(sketch) { (0, _classCallCheck3.default)(this, AddRemoveTracker); this.sketch = sketch; //set of listeners installed this.listeners = {}; //set of changes done since creation this.changes = {}; } (0, _createClass3.default)(AddRemoveTracker, [{ key: 'markChanged', value: function markChanged(obj, sign) { if (!(obj.id in this.changes)) this.changes[obj.id] = { object: obj, status: 0 }; if (sign) this.changes[obj.id].status += sign; } }, { key: 'listen', value: function listen() { var _this = this; var listenerP = function listenerP(obj) { return _this.markChanged(obj, +1); }; var listenerM = function listenerM(obj) { return _this.markChanged(obj, -1); }; this.sketch.on('SketchAdded', listenerP); this.sketch.on('SketchRemoved', listenerM); this.listeners['SketchAdded'] = listenerP; this.listeners['SketchRemoved'] = listenerM; } }, { key: 'ignore', value: function ignore() { this.sketch.removeListener('SketchAdded', this.listeners['SketchAdded']); this.sketch.removeListener('SketchRemoved', this.listeners['SketchRemoved']); } }, { key: 'getAllChanges', value: function getAllChanges() { var result = { added: [], removed: [], changed: [] }; for (var id in this.changes) { var info = this.changes[id]; var list = result.changed; if (info.status > 0) list = result.added; if (info.status < 0) list = result.removed; list.push(info.object); } return result; } }]); return AddRemoveTracker; }(); var ChangesArray = function (_Array) { (0, _inherits3.default)(ChangesArray, _Array); function ChangesArray(arr, label) { var _ref; (0, _classCallCheck3.default)(this, ChangesArray); var _this2 = (0, _possibleConstructorReturn3.default)(this, (_ref = ChangesArray.__proto__ || (0, _getPrototypeOf2.default)(ChangesArray)).call.apply(_ref, [this].concat((0, _toConsumableArray3.default)(arr)))); _this2.label = label; return _this2; } (0, _createClass3.default)(ChangesArray, [{ key: 'single', value: function single() { check(this.length === 1, "Expected single " + this.label + " object"); return this[0]; } }, { key: 'ofType', value: function ofType(type) { var newArr = []; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)(this), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var _obj = _step.value; if (_obj instanceof type) newArr.push(_obj); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return new ChangesArray(newArr, this.label); } }, { key: 'singleOfType', value: function singleOfType(type) { check(this.length === 1, "Expected single " + this.label + " object, " + this.length + " objects found"); var obj = this[0]; check(obj instanceof type, "Expected " + this.label + " object of type " + type.name); return obj; } }]); return ChangesArray; }(Array); ; var SketcherAutomation = exports.SketcherAutomation = function () { //Note: sketcher may be undefined. //Then only information methods can be used (like getting endpoints). function SketcherAutomation(sketcher) { (0, _classCallCheck3.default)(this, SketcherAutomation); //must have for any operations =) this.sketcher = sketcher; //configures automation speed this.tickWaitTime = 0; //how much can we miss this.linearTolerance = 0.01; //where we can move mouse to not hover anything this.safePoint = new THREE.Vector2(-123.456, -98.765); } //Note: not sure this method would survive.. (0, _createClass3.default)(SketcherAutomation, [{ key: 'setRootObject', value: function setRootObject(rootObject) { this.rootObject = rootObject; } }, { key: 'execute', value: function () { var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(lambda) { return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: this.sketcher.view.input.enabled = false; _context.prev = 1; _context.next = 4; return lambda(this); case 4: _context.prev = 4; this.sketcher.view.input.enabled = true; return _context.finish(4); case 7: case 'end': return _context.stop(); } } }, _callee, this, [[1,, 4, 7]]); })); function execute(_x) { return _ref2.apply(this, arguments); } return execute; }() //tick is called internally to control speed of automation }, { key: 'setTickWaitTime', value: function setTickWaitTime(delay) { this.tickWaitTime = delay; } }, { key: 'tick', value: function () { var _ref3 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2() { return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (this.tickWaitTime > 0) { _context2.next = 2; break; } return _context2.abrupt('return'); case 2: _context2.next = 4; return (0, _delay2.default)(this.tickWaitTime); case 4: case 'end': return _context2.stop(); } } }, _callee2, this); })); function tick() { return _ref3.apply(this, arguments); } return tick; }() //managing sketches creation and selection }, { key: 'createSketch', value: function () { var _ref4 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3(origin, quaternion, part) { var sketch; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: //try to automatically deduce parameters if not set if (!part) { check(this.rootObject, "Neither part nor root object not specified"); //try to find any part from the root this.rootObject.traverse(function (obj) { if (obj instanceof Part) part = obj; }); check(part, "Cannot find any part in ClassCad tree"); } origin = origin || part.getWorldQuaternion(); quaternion = quaternion || part.getWorldPosition(); //create a new sketch _context3.next = 5; return this.sketcher.newSketch(origin, quaternion, part); case 5: sketch = _context3.sent; check(sketch, "Failed to create new sketch"); return _context3.abrupt('return', sketch); case 8: case 'end': return _context3.stop(); } } }, _callee3, this); })); function createSketch(_x2, _x3, _x4) { return _ref4.apply(this, arguments); } return createSketch; }() }, { key: 'selectSketch', value: function () { var _ref5 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4(sketch) { return _regenerator2.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: check(sketch instanceof _sketch2.default, "Sketch is not specified or not a sketch"); _context4.next = 3; return this.sketcher.selectSketch(sketch); case 3: case 'end': return _context4.stop(); } } }, _callee4, this); })); function selectSketch(_x5) { return _ref5.apply(this, arguments); } return selectSketch; }() }, { key: 'deselectSketch', value: function () { var _ref6 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee5(sketch, byClick) { return _regenerator2.default.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: check(!sketch || sketch === this.sketcher.currentSketch, "Deselecting wrong sketch"); if (!byClick) { _context5.next = 6; break; } _context5.next = 4; return this.sketcher.sketchAreaRightClicked(this.sketcher.currentSketch); case 4: _context5.next = 8; break; case 6: _context5.next = 8; return this.sketcher.deselectSketch(); case 8: case 'end': return _context5.stop(); } } }, _callee5, this); })); function deselectSketch(_x6, _x7) { return _ref6.apply(this, arguments); } return deselectSketch; }() }, { key: 'getCurrentSketch', value: function getCurrentSketch() { return this.sketcher.currentSketch; } //revert current sketch to initial clean state }, { key: 'cleanSketch', value: function () { var _ref7 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee6() { return _regenerator2.default.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: _context6.next = 2; return this.deleteAll(); case 2: _context6.next = 4; return this.setIncrementalSolve(false); case 4: _context6.next = 6; return this.setIncrementalAutoconstraint(true); case 6: case 'end': return _context6.stop(); } } }, _callee6, this); })); function cleanSketch() { return _ref7.apply(this, arguments); } return cleanSketch; }() //emulating sketcher global buttons (tools, handlers, etc) }, { key: 'chooseTool', value: function () { var _ref8 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee7(toolName) { return _regenerator2.default.wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: _context7.next = 2; return this.sketcher.chooseTool(toolName || 'empty'); case 2: case 'end': return _context7.stop(); } } }, _callee7, this); })); function chooseTool(_x8) { return _ref8.apply(this, arguments); } return chooseTool; }() }, { key: 'autoconstraintAll', value: function () { var _ref9 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee8() { return _regenerator2.default.wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: _context8.next = 2; return this.sketcher.autoconstraintAll(); case 2: case 'end': return _context8.stop(); } } }, _callee8, this); })); function autoconstraintAll() { return _ref9.apply(this, arguments); } return autoconstraintAll; }() }, { key: 'solveConstraints', value: function () { var _ref10 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee9() { return _regenerator2.default.wrap(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: _context9.next = 2; return this.sketcher.solveConstraints(); case 2: case 'end': return _context9.stop(); } } }, _callee9, this); })); function solveConstraints() { return _ref10.apply(this, arguments); } return solveConstraints; }() }, { key: 'setIncrementalSolve', value: function () { var _ref11 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee10(flag) { return _regenerator2.default.wrap(function _callee10$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: _context10.next = 2; return this.sketcher.setIncrementalLevel(flag); case 2: case 'end': return _context10.stop(); } } }, _callee10, this); })); function setIncrementalSolve(_x9) { return _ref11.apply(this, arguments); } return setIncrementalSolve; }() }, { key: 'setIncrementalAutoconstraint', value: function () { var _ref12 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee11(flag) { return _regenerator2.default.wrap(function _callee11$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: this.sketcher.autoconstraintIncremental = flag; case 1: case 'end': return _context11.stop(); } } }, _callee11, this); })); function setIncrementalAutoconstraint(_x10) { return _ref12.apply(this, arguments); } return setIncrementalAutoconstraint; }() //tracking which objects were added/removed during lambda execution }, { key: 'trackAny', value: function () { var _ref13 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee12(lambda, sketch) { var tracker, changes; return _regenerator2.default.wrap(function _callee12$(_context12) { while (1) { switch (_context12.prev = _context12.next) { case 0: if (!sketch) sketch = this.sketcher.currentSketch; tracker = new AddRemoveTracker(sketch); tracker.listen(); _context12.next = 5; return lambda(); case 5: tracker.ignore(); changes = tracker.getAllChanges(); return _context12.abrupt('return', changes); case 8: case 'end': return _context12.stop(); } } }, _callee12, this); })); function trackAny(_x11, _x12) { return _ref13.apply(this, arguments); } return trackAny; }() }, { key: 'trackAdded', value: function () { var _ref14 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee13(lambda, sketch) { var changes; return _regenerator2.default.wrap(function _callee13$(_context13) { while (1) { switch (_context13.prev = _context13.next) { case 0: _context13.next = 2; return this.trackAny(lambda, sketch); case 2: changes = _context13.sent; check(changes.removed.length === 0, "Element removed unexpectedly"); return _context13.abrupt('return', new ChangesArray(changes.added)); case 5: case 'end': return _context13.stop(); } } }, _callee13, this); })); function trackAdded(_x13, _x14) { return _ref14.apply(this, arguments); } return trackAdded; }() }, { key: 'trackRemoved', value: function () { var _ref15 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee14(lambda, sketch) { var changes; return _regenerator2.default.wrap(function _callee14$(_context14) { while (1) { switch (_context14.prev = _context14.next) { case 0: _context14.next = 2; return this.trackAny(lambda, sketch); case 2: changes = _context14.sent; check(changes.added.length === 0, "Element added unexpectedly"); return _context14.abrupt('return', new ChangesArray(changes.removed)); case 5: case 'end': return _context14.stop(); } } }, _callee14, this); })); function trackRemoved(_x15, _x16) { return _ref15.apply(this, arguments); } return trackRemoved; }() //controlling mouse on the sketch area }, { key: '_mouseMoveTo', value: function () { var _ref16 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee15(posLocal) { return _regenerator2.default.wrap(function _callee15$(_context15) { while (1) { switch (_context15.prev = _context15.next) { case 0: posLocal = convVector(posLocal); //TODO: await interactionPointMoved? this.sketcher.interactionPoint.set(posLocal.x, posLocal.y, 0); this.sketcher.interactionPointMoved(); case 3: case 'end': return _context15.stop(); } } }, _callee15, this); })); function _mouseMoveTo(_x17) { return _ref16.apply(this, arguments); } return _mouseMoveTo; }() }, { key: 'mouseMoveTo', value: function () { var _ref17 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee16(posLocal) { return _regenerator2.default.wrap(function _callee16$(_context16) { while (1) { switch (_context16.prev = _context16.next) { case 0: check(this.sketcher.currentSketch, "Moving mouse without selected sketch"); _context16.next = 3; return this._mouseMoveTo(posLocal); case 3: _context16.next = 5; return this.tick(); case 5: case 'end': return _context16.stop(); } } }, _callee16, this); })); function mouseMoveTo(_x18) { return _ref17.apply(this, arguments); } return mouseMoveTo; }() }, { key: 'mouseClickAt', value: function () { var _ref18 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee17(posLocal, sketch) { return _regenerator2.default.wrap(function _callee17$(_context17) { while (1) { switch (_context17.prev = _context17.next) { case 0: check(this.sketcher.currentSketch, "Clicking mouse without selected sketch"); _context17.next = 3; return this._mouseMoveTo(posLocal); case 3: _context17.next = 5; return this.sketcher.sketchAreaClicked(this.sketcher.currentSketch); case 5: _context17.next = 7; return this.tick(); case 7: case 'end': return _context17.stop(); } } }, _callee17, this); })); function mouseClickAt(_x19, _x20) { return _ref18.apply(this, arguments); } return mouseClickAt; }() }, { key: '_interactionEmit', //controlling mouse actions on sketch objects value: function () { var _ref19 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee18(obj, type) { var _obj2; for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } return _regenerator2.default.wrap(function _callee18$(_context18) { while (1) { switch (_context18.prev = _context18.next) { case 0: check(obj instanceof THREE.Object3D, "Interacting with something not being a THREE object"); if (obj.interact instanceof THREE.Mesh) obj = obj.interact; //make things easier for sketch objects check(obj.interaction && obj.hasListener(type), "Interacting with object without interaction or handler installed"); obj.traverseAncestors(function (parent) { return check(parent.visible, "Interacting with invisible object"); }); _context18.next = 6; return (_obj2 = obj).emit.apply(_obj2, [type].concat(args)); case 6: case 'end': return _context18.stop(); } } }, _callee18, this); })); function _interactionEmit(_x21, _x22) { return _ref19.apply(this, arguments); } return _interactionEmit; }() }, { key: 'clickObject', value: function () { var _ref20 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee19(obj) { return _regenerator2.default.wrap(function _callee19$(_context19) { while (1) { switch (_context19.prev = _context19.next) { case 0: _context19.next = 2; return this._interactionEmit(obj, _object2.default.Events.Interaction.Clicked); case 2: _context19.next = 4; return this.tick(); case 4: case 'end': return _context19.stop(); } } }, _callee19, this); })); function clickObject(_x23) { return _ref20.apply(this, arguments); } return clickObject; }() }, { key: '_dragPathRelativeToAbsolute', value: function _dragPathRelativeToAbsolute(obj, posArray) { var keyPoint = null; if (obj instanceof _point2.default) keyPoint = obj.position;