awv3
Version:
⚡ AWV3 embedded CAD
223 lines (184 loc) • 8.06 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
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 _three = require('three');
var THREE = _interopRequireWildcard(_three);
var _object = require('../../../three/object3');
var _object2 = _interopRequireDefault(_object);
var _graphics = require('../../dimension/graphics/');
var _graphics2 = _interopRequireDefault(_graphics);
var _base = require('./base');
var _base2 = _interopRequireDefault(_base);
var _geomutils = require('../../sketcher/geomutils');
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 AngleHandler = function (_BaseHandler) {
(0, _inherits3.default)(AngleHandler, _BaseHandler);
function AngleHandler() {
var _ref;
(0, _classCallCheck3.default)(this, AngleHandler);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var _this = (0, _possibleConstructorReturn3.default)(this, (_ref = AngleHandler.__proto__ || (0, _getPrototypeOf2.default)(AngleHandler)).call.apply(_ref, [this].concat(args)));
_this.preview = new _graphics2.default('CC_AngularDimension', _this.sketcher.dimension);
_this.sketcher.pool.add(_this.preview);
_this.intersectionPoint = new THREE.Vector3();
_this.dir0 = new THREE.Vector3();
_this.dir1 = new THREE.Vector3();
_this.tuv = { type: 0, userValue: 0, value: 0, sector: 0, reflex: false, dimPos: new THREE.Vector3() };
_this.resolve = function () {};
return _this;
}
(0, _createClass3.default)(AngleHandler, [{
key: 'destroy',
value: function destroy(options) {
this.preview.destroy();
(0, _get3.default)(AngleHandler.prototype.__proto__ || (0, _getPrototypeOf2.default)(AngleHandler.prototype), 'destroy', this).call(this, options);
}
}, {
key: 'filterObjectsWithInteraction',
value: function filterObjectsWithInteraction(object) {
return object.id === this.sketch.id;
}
}, {
key: _object2.default.Events.Interaction.Clicked,
value: function value(object, hitObject) {
this.resolve(this.tuv);
}
}, {
key: 'cancel',
value: function cancel() {
this.resolve(undefined);
}
}, {
key: 'onMouseMove',
value: function onMouseMove() {
this.updatePreview();
}
}, {
key: 'onKeyUp',
value: function onKeyUp() {
this.updatePreview();
}
}, {
key: 'onKeyDown',
value: function onKeyDown() {
this.updatePreview();
}
}, {
key: 'setLines',
value: function setLines(lines) {
var _lines$map = lines.map(function (line) {
return [line.startPoint.pos, line.endPoint.pos];
}),
_lines$map2 = (0, _slicedToArray3.default)(_lines$map, 2),
_lines$map2$ = (0, _slicedToArray3.default)(_lines$map2[0], 2),
p0s = _lines$map2$[0],
p0e = _lines$map2$[1],
_lines$map2$2 = (0, _slicedToArray3.default)(_lines$map2[1], 2),
p1s = _lines$map2$2[0],
p1e = _lines$map2$2[1];
this.dir0.copy(p0e).sub(p0s).normalize();
this.dir1.copy(p1e).sub(p1s).normalize();
// ensure that ccw angle from dir0 to dir1 is between 0 and Math.PI
if (ccwAngle(this.dir0, this.dir1) < 0) {
var s = lines[0];
lines[0] = lines[1];
lines[1] = s;
return this.setLines(lines);
}
this.intersectionPoint = (0, _geomutils.intersectLines)(p0s, this.dir0, p1s, this.dir1);
this.updatePreview();
this.preview.onRender();
}
}, {
key: 'updatePreview',
value: function updatePreview() {
var point = this.getRecentMousePosition();
var dir = point.clone().sub(this.intersectionPoint).normalize();
var rightOf0 = ccwAngle(this.dir0, dir) < 0,
leftOf1 = ccwAngle(this.dir1, dir) >= 0;
this.tuv.sector = rightOf0 << 1 | rightOf0 ^ leftOf1;
this.tuv.reflex = !!this.sketcher.view.input.keys.control;
this.tuv.type = this.tuv.sector ^ this.tuv.reflex << 1;
this.tuv.dimPos.copy(point);
var start = new THREE.Vector3(),
end = new THREE.Vector3();
switch (this.tuv.type) {
case 0:
{
start.copy(this.dir0);
end.copy(this.dir1);
break;
}
case 1:
{
start.copy(this.dir1);
end.copy(this.dir0).negate();
break;
}
case 2:
{
start.copy(this.dir0).negate();
end.copy(this.dir1).negate();
break;
}
case 3:
{
start.copy(this.dir1).negate();
end.copy(this.dir0);
break;
}
}
this.tuv.userValue = ofSign(ccwAngle(start, end), this.tuv.reflex);
this.tuv.value = ofSign(ccwAngle(this.dir0, this.dir1));
function f(v) {
return { value: v.toArray() };
}
var state = {
id: 0,
class: 'CC_AngularDimension',
coordinateSystem: this.sketch.state.coordinateSystem,
previewValue: THREE.Math.radToDeg(this.tuv.userValue),
members: {
startPt: f(start.add(this.intersectionPoint)),
endPt: f(end.add(this.intersectionPoint)),
dimPt: f(point),
cornerPt: f(this.intersectionPoint),
paramName: { value: '_' },
ccw: { value: !this.tuv.reflex },
extendToCorner: { value: true }
}
};
this.preview.updateFromState(state);
}
}]);
return AngleHandler;
}(_base2.default);
exports.default = AngleHandler;
function ccwAngle(a, b) {
return Math.atan2(a.x * b.y - a.y * b.x, a.x * b.x + a.y * b.y);
}
function ofSign(a) {
var neg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
if (neg && a > 0.0) a -= 2.0 * Math.PI;
if (!neg && a < 0.0) a += 2.0 * Math.PI;
return Math.abs(a);
}