awv3
Version:
⚡ AWV3 embedded CAD
505 lines (422 loc) • 21.7 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _get2 = require('babel-runtime/helpers/get');
var _get3 = _interopRequireDefault(_get2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _freeze = require('babel-runtime/core-js/object/freeze');
var _freeze2 = _interopRequireDefault(_freeze);
var _three = require('three');
var THREE = _interopRequireWildcard(_three);
var _object = require('../../../three/object3');
var _object2 = _interopRequireDefault(_object);
var _ccfuturef = require('../ccfuturef');
var _ccfuturef2 = _interopRequireDefault(_ccfuturef);
var _ccref = require('../ccref');
var _ccref2 = _interopRequireDefault(_ccref);
var _highlevel = require('../command/highlevel');
var _lowlevel = require('../command/lowlevel');
var _type = require('../constraint/type');
var _geomutils = require('../geomutils');
var _preview = require('../preview');
var _base = require('./base');
var _base2 = _interopRequireDefault(_base);
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 }; }
var Mode = (0, _freeze2.default)({ point: 'point', line: 'line', arccenter: 'arccenter', arcmiddle: 'arcmiddle', arctangent: 'arctangent', circle: 'circle' });
var DrawHandler = function (_BaseHandler) {
(0, _inherits3.default)(DrawHandler, _BaseHandler);
function DrawHandler(sketcher, name) {
(0, _classCallCheck3.default)(this, DrawHandler);
var _this = (0, _possibleConstructorReturn3.default)(this, (DrawHandler.__proto__ || (0, _getPrototypeOf2.default)(DrawHandler)).call(this, sketcher, name));
_this.endPoint = null; // ccref of the last point of the polyline
_this.endTangent = null; // normalized THREE.Vector3() tangent of the last edge
_this.positions = [new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3()];
_this.preview = new THREE.Group();
_this.sketcher.pool.add(_this.preview);
_this.queue = new PromiseQueue();
_this.restrictions = {};
_this.startPoint = null; // ccref of the first point of the polyline
_this.state = 0; // number of element filled in this.positions
_this.statesCount = 2; // number of states needed to create an edge
return _this;
}
(0, _createClass3.default)(DrawHandler, [{
key: 'destroy',
value: function destroy() {
this.preview.destroy();
this.sketcher.setCursorCoordinates(undefined);
(0, _get3.default)(DrawHandler.prototype.__proto__ || (0, _getPrototypeOf2.default)(DrawHandler.prototype), 'destroy', this).call(this);
}
}, {
key: 'filterObjectsWithInteraction',
value: function filterObjectsWithInteraction(object) {
return object.id === this.sketch.id;
}
}, {
key: _object2.default.Events.Interaction.Clicked,
value: function value(object, hitObject) {
var _this2 = this;
var ray = hitObject.ray.clone().applyMatrix4(new THREE.Matrix4().getInverse(this.sketch.matrixWorld));
var position = ray.intersectPlane(new THREE.Plane(new THREE.Vector3(0, 0, 1)));
return this.queue.run(function () {
return _this2.afterEdgeAdded(_this2.click(position));
});
}
}, {
key: 'afterEdgeAdded',
value: function () {
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(geomParams) {
var object, manualConstrCommand, command, p, ccref;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (geomParams) {
_context.next = 2;
break;
}
return _context.abrupt('return');
case 2:
object = new _ccfuturef2.default((0, _lowlevel.Variable)(), geomParams);
if (!(!object.isLine() && !object.isArc())) {
_context.next = 6;
break;
}
this.endPolyline();
return _context.abrupt('return', this.sketcher.run((0, _highlevel.addCommand)(this.sketch, geomParams)));
case 6:
manualConstrCommand = this.endPoint && !this.sketcher.autoconstraintIncremental ? (0, _highlevel.addCommand)(this.sketch, {
class: _type.incidence.type,
entities: [this.endPoint, object.startPoint],
value: {}
}) : null;
command = _lowlevel.Sequence.apply(undefined, [(0, _lowlevel.Assign)(object, (0, _highlevel.addCommand)(this.sketch, geomParams))].concat((0, _toConsumableArray3.default)(this.sketcher.autoconstraintCommands(object)), (0, _toConsumableArray3.default)((0, _highlevel.restrictionCommands)(this.sketch, object, this.restrictions)), [manualConstrCommand, (0, _lowlevel.Return)((0, _lowlevel.IdToReal)(object))]));
this.restrictions = {};
p = this.sketcher.run(command);
this.sketcher.incrementalSolveConstraints();
_context.t0 = _ccref2.default;
_context.t1 = this.sketcher;
_context.next = 15;
return p;
case 15:
_context.t2 = _context.sent;
ccref = new _context.t0(_context.t1, _context.t2);
this.startPoint = this.startPoint || ccref.startPoint;
this.endPoint = ccref.endPoint || this.endPoint;
this.endTangent = (0, _geomutils.getTangent)(ccref.geomParams, this.endPoint.pos);
this.click(this.endPoint.pos);
case 21:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
function afterEdgeAdded(_x) {
return _ref.apply(this, arguments);
}
return afterEdgeAdded;
}()
}, {
key: 'cancel',
value: function cancel() {
if (this.state !== 0) this.endPolyline();else (0, _get3.default)(DrawHandler.prototype.__proto__ || (0, _getPrototypeOf2.default)(DrawHandler.prototype), 'cancel', this).call(this);
}
}, {
key: 'endPolyline',
value: function endPolyline() {
this.endPoint = null;
this.endTangent = null;
this.restrictions = {};
this.startPoint = null;
this.state = 0;
this.onMouseMove();
}
}, {
key: 'closePolyline',
value: function () {
var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2() {
var geomParams, object, command;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (!(!this.startPoint || !this.endPoint)) {
_context2.next = 2;
break;
}
return _context2.abrupt('return');
case 2:
geomParams = { start: this.startPoint.pos, end: this.endPoint.pos };
object = new _ccfuturef2.default((0, _lowlevel.Variable)(), geomParams);
command = (0, _lowlevel.Sequence)((0, _lowlevel.Assign)(object, (0, _highlevel.addCommand)(this.sketch, geomParams)), (0, _highlevel.addCommand)(this.sketch, { class: _type.incidence.type, entities: [this.endPoint, object.startPoint], value: {} }), (0, _highlevel.addCommand)(this.sketch, { class: _type.incidence.type, entities: [object.endPoint, this.startPoint], value: {} }));
_context2.next = 7;
return this.sketcher.run(command);
case 7:
this.endPolyline();
case 8:
case 'end':
return _context2.stop();
}
}
}, _callee2, this);
}));
function closePolyline() {
return _ref2.apply(this, arguments);
}
return closePolyline;
}()
}, {
key: 'click',
value: function click(position) {
var doSnapping = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var geomParams = this.move(position, true, doSnapping);
if (!this.handleClick(this.positions[this.state])) return;
if (++this.state === this.statesCount) {
this.state = 0;
return geomParams;
}
}
}, {
key: 'getPreviewGeomParams',
value: function getPreviewGeomParams() {
if (this.state === 0) return (0, _geomutils.drawPointBy_S)(this.positions, this.restrictions);
switch (this.name) {
case Mode.point:
return (0, _geomutils.drawPointBy_S)(this.positions, this.restrictions);
case Mode.line:
return (0, _geomutils.drawLineBy_S_E)(this.positions, this.restrictions);
case Mode.arccenter:
return (0, _geomutils.drawArcBy_S_E_C)(this.positions, this.restrictions);
case Mode.arcmiddle:
return (0, _geomutils.drawArcBy_S_E_M)(this.positions, this.restrictions);
case Mode.arctangent:
return (0, _geomutils.drawArcBy_S_T_E)([this.positions[0], this.endTangent, this.positions[1]], this.restrictions);
case Mode.circle:
return (0, _geomutils.drawCircleBy_C_E)(this.positions, this.restrictions);
}
}
}, {
key: 'move',
value: function move(position, force) {
var doSnapping = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
if (!force && this.queue.isBusy()) return;
if (doSnapping) position.copy(this.doSnapping(position));
this.sketcher.setCursorCoordinates(position);
for (var i = this.state; i < this.positions.length; ++i) {
this.positions[i].copy(position);
}var previewParams = this.getPreviewGeomParams();
if (this.state === 0) this.positions[0].copy(previewParams.start);
(0, _preview.updateGeomObjectContainer)(this.preview, (0, _extends3.default)({
coordinateSystem: this.sketch.graphics.matrix,
scale: this.sketcher.graphicScale
}, previewParams));
return previewParams;
}
}, {
key: 'onMouseMove',
value: function onMouseMove() {
this.move(this.getRecentMousePosition());
this.sketcher.refresh();
}
}, {
key: 'switchMode',
value: function switchMode(mode) {
if (this.state > 1) this.state = 1;
this.statesCount = mode === Mode.point ? 1 : mode === Mode.arccenter || mode === Mode.arcmiddle ? 3 : 2;
// handler switching logic in handler/index.js expects mode to be stored in this.name
this.name = mode;
}
}, {
key: 'consoleComplete',
value: function consoleComplete(cmd) {
cmd = cmd.trim();
var tokens = cmd === '' ? [] : cmd.split(/\s+/);
var completions = (0, _get3.default)(DrawHandler.prototype.__proto__ || (0, _getPrototypeOf2.default)(DrawHandler.prototype), 'consoleComplete', this).call(this, cmd);
if (completions.indexOf(cmd) !== -1) return completions;
return [cmd].concat(this.name.startsWith('point') ? [cmd + ' ax', cmd + ' ay'] : this.name.startsWith('line') ? [cmd + ' l', cmd + ' a', cmd + ' x', cmd + ' y'] : this.name.startsWith('arc') ? [cmd + ' a', cmd + ' r', cmd + ' cw', cmd + ' ccw'] : [], completions);
}
}, {
key: 'consoleExecute',
value: function consoleExecute(cmd) {
if ((0, _get3.default)(DrawHandler.prototype.__proto__ || (0, _getPrototypeOf2.default)(DrawHandler.prototype), 'consoleExecute', this).call(this, cmd)) return; // switch handlers
if (cmd === 'cl') return this.closePolyline();else return this.afterEdgeAdded(this.click(this.getRecentMousePosition(), false));
}
}, {
key: 'parseRestrictions',
value: function parseRestrictions(cmd) {
var tokens = cmd.trim().split(/\s+/);
this.restrictions = {};
while (tokens.length !== 0) {
var name = tokens.shift();
var value = Number.NaN;
switch (name) {
case 'x':
name = 'xoffset';
value = Number(tokens.shift());
break;
case 'y':
name = 'yoffset';
value = Number(tokens.shift());
break;
case 'ax':
name = 'xabsolute';
value = Number(tokens.shift());
break;
case 'ay':
name = 'yabsolute';
value = Number(tokens.shift());
break;
case 'l':
name = 'length';
value = Number(tokens.shift());
break;
case 'a':
name = 'angle';
value = Math.PI / 180 * Number(tokens.shift());
break;
case 'r':
name = 'radius';
value = Number(tokens.shift());
break;
case 'cw':
name = 'clockwise';
value = true;
break;
case 'ccw':
name = 'clockwise';
value = false;
break;
}
if (!isFinite(value)) continue;
this.restrictions[name] = value;
}
// update priview
this.onMouseMove();
}
}, {
key: 'doSnapping',
value: function doSnapping(position) {
if (this.preview.geomType === 'CC_Point') return this.createSnapper().snapPoint(position).position;
if (this.preview.geomType === 'CC_Line') return this.createSnapper().snapPoint(position).position;
if (this.preview.geomType === 'CC_Arc') return this.createSnapper().snapPoint(position).position;
return position;
}
}, {
key: 'handleClick',
value: function handleClick(position) {
if (!this.endTangent) {
var variants = [];
// for all lines/arcs on the sketch
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = (0, _getIterator3.default)(this.sketch.children), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var object = _step.value;
if (!object.isLine() && !object.isArc()) continue;
// for their endpoint matching position
var _arr = ['startPoint', 'endPoint'];
for (var _i = 0; _i < _arr.length; _i++) {
var end = _arr[_i];
if (!object[end].pos.equals(position)) continue;
var tangent = (0, _geomutils.getTangent)(object.geomParams, position);
if (tangent.lengthSq() === 0) continue;
if (end === 'startPoint') tangent.negate();
variants.push(tangent);
}
}
// deny click in arctangent mode if doesn't uniquely determine the tangent
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
if (this.name === 'arctangent' && variants.length !== 1) return false;
this.endTangent = variants[0] || new THREE.Vector3();
return true;
}
return true;
}
}]);
return DrawHandler;
}(_base2.default);
exports.default = DrawHandler;
var PromiseQueue = function () {
function PromiseQueue() {
(0, _classCallCheck3.default)(this, PromiseQueue);
this.nPending = 0;
this.promise = _promise2.default.resolve();
}
(0, _createClass3.default)(PromiseQueue, [{
key: 'run',
value: function run(functor) {
var _this3 = this;
this.promise = function () {
var _ref3 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3(promise) {
return _regenerator2.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
++_this3.nPending;
_context3.next = 3;
return promise;
case 3:
_context3.next = 5;
return functor();
case 5:
--_this3.nPending;
case 6:
case 'end':
return _context3.stop();
}
}
}, _callee3, _this3);
}));
return function (_x4) {
return _ref3.apply(this, arguments);
};
}()(this.promise);
return this.promise;
}
}, {
key: 'isBusy',
value: function isBusy() {
return this.nPending > 0;
}
}]);
return PromiseQueue;
}();