awv3
Version:
⚡ AWV3 embedded CAD
358 lines (292 loc) • 17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.filletHandler = undefined;
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
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 _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _geomutils = require('../sketcher/geomutils');
var _point = require('./graphics/point');
var _point2 = _interopRequireDefault(_point);
var _line = require('./graphics/line');
var _line2 = _interopRequireDefault(_line);
var _arc = require('./graphics/arc');
var _arc2 = _interopRequireDefault(_arc);
var _fillet = require('../sketcher/fillet');
var _fillet2 = _interopRequireDefault(_fillet);
var _object = require('../../three/object3');
var _object2 = _interopRequireDefault(_object);
var _base = require('./handlers/base');
var _base2 = _interopRequireDefault(_base);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var filletHandler = exports.filletHandler = function (_BaseHandler) {
(0, _inherits3.default)(filletHandler, _BaseHandler);
function filletHandler(sketcher) {
(0, _classCallCheck3.default)(this, filletHandler);
var _this = (0, _possibleConstructorReturn3.default)(this, (filletHandler.__proto__ || (0, _getPrototypeOf2.default)(filletHandler)).call(this, sketcher));
_this.processor = new _fillet2.default(sketcher, sketcher.currentSketch);
_this.busy = false;
_this.filletablePoints = [];
_this.filletArcs = [];
_this.filletLines = [];
_this.preview = null;
_this.updateInteractiveObjects();
return _this;
}
(0, _createClass3.default)(filletHandler, [{
key: 'clear',
value: function clear() {
this.filletablePoints.forEach(function (obj) {
return obj.interact.removeInteraction();
});
this.filletArcs.forEach(function (obj) {
return obj.interact.removeInteraction();
});
this.filletLines.forEach(function (obj) {
return obj.interact.removeInteraction();
});
this.filletablePoints = [];
this.filletArcs = [];
this.filletLines = [];
}
}, {
key: 'updateInteractiveObjects',
value: function updateInteractiveObjects() {
var _this2 = this;
this.clear();
var allObjects = this.sketcher.currentSketch.getObjectsOnSketch();
Sketch.ForObjectsWithChildren(allObjects, function (obj) {
if (obj instanceof _point2.default) if (_this2.processor.RecognizeFilletableAngle(obj.position)) _this2.filletablePoints.push(obj);
});
allObjects.forEach(function (obj) {
if (obj instanceof _arc2.default) if (_this2.processor.RecognizeFilletByArcOrEdge(obj)) _this2.filletArcs.push(obj);
if (obj instanceof _line2.default) if (_this2.processor.RecognizeFilletByArcOrEdge(obj)) _this2.filletLines.push(obj);
});
var self = this;
var sketcher = self.sketcher;
function addPreview(info) {
self.preview = {
obj: null,
lineStart: null,
lineEnd: null
};
if (info.obj instanceof _arc2.default) {
self.preview.objectIndex = createGeomObject({
start: info.obj.points[0].position.clone(),
end: info.obj.points[1].position.clone(),
center: info.obj.centerPoint.position.clone(),
clockwise: info.obj.clockwise
}, self.preview.obj);
} else if (info.obj instanceof _line2.default) {
self.preview.objectIndex = createGeomObject({
start: info.obj.points[0].position.clone(),
end: info.obj.points[1].position.clone()
}, self.preview.obj);
}
self.preview.lineStart = createGeomObject({
start: info.lines[0].points[0].position.clone(),
end: info.lines[0].points[1].position.clone()
}, self.preview.lineStart);
self.preview.lineEnd = createGeomObject({
start: info.lines[1].points[0].position.clone(),
end: info.lines[1].points[1].position.clone()
}, self.preview.lineEnd);
self.sketcher.currentSketch.addAuxObject(self.preview.obj);
self.sketcher.currentSketch.addAuxObject(self.preview.lineStart);
self.sketcher.currentSketch.addAuxObject(self.preview.lineEnd);
}
function removePreview() {
if (self.preview.obj) self.sketcher.currentSketch.removeAuxObject(self.preview.obj);
if (self.preview.lineStart) self.sketcher.currentSketch.removeAuxObject(self.preview.lineStart);
if (self.preview.lineEnd) self.sketcher.currentSketch.removeAuxObject(self.preview.lineEnd);
self.preview = null;
}
function getPreviewGeomParams(info) {
var newPnt = self.sketcher.interactionPoint.clone();
var newGeomParams;
if (info.obj instanceof _arc2.default) {
// Get arc constructed by two incident lines and mouse position
newGeomParams = (0, _geomutils.drawArcBy_Angle_M)(info.vertex.position.clone(), info.objEnds[0].position.clone().sub(info.vertex.position).normalize(), info.objEnds[1].position.clone().sub(info.vertex.position).normalize(), newPnt);
newGeomParams && (newGeomParams.clockwise = info.obj.clockwise);
} else {
// Get line constructed by two incident lines and mouse position
newGeomParams = (0, _geomutils.drawLineBy_Angle_M)(info.vertex.position.clone(), info.objEnds[0].position.clone().sub(info.vertex.position).normalize(), info.objEnds[1].position.clone().sub(info.vertex.position).normalize(), newPnt);
}
var freeIdx0 = info.lineEnds[0] === info.lines[0].points[0] ? 1 : 0;
var freeIdx1 = info.lineEnds[1] === info.lines[1].points[0] ? 1 : 0;
if (newGeomParams) {
// Recalculate fillet to be sure its endpoints belong to the related linesegments
var filletOffset = newGeomParams.start.clone().sub(info.vertex.position).length();
var maxDist = Math.min(info.lines[0].points[freeIdx0].position.clone().sub(info.vertex.position).length(), info.lines[1].points[freeIdx1].position.clone().sub(info.vertex.position).length(), filletOffset);
if (filletOffset > maxDist) {
newGeomParams.start = newGeomParams.start.clone().sub(info.vertex.position).normalize().multiplyScalar(maxDist).add(info.vertex.position);
newGeomParams.end = newGeomParams.end.clone().sub(info.vertex.position).normalize().multiplyScalar(maxDist).add(info.vertex.position);
if (info.obj instanceof _arc2.default) {
var centerDir = newGeomParams.center.clone().sub(info.vertex.position).normalize();
var angle = newGeomParams.start.clone().sub(info.vertex.position).angleTo(newGeomParams.end.clone().sub(info.vertex.position));
newGeomParams.center = centerDir.multiplyScalar(maxDist / Math.cos(angle / 2)).add(info.vertex.position);
}
}
} else {
// get two lines if fillet is singular
newGeomParams = {
start: info.vertex.position.clone(),
end: info.vertex.position.clone()
};
}
// redraw preview objects
var oldPreview = self.preview.obj;
var newPreview = createGeomObject(newGeomParams, self.preview.obj);
if (newPreview != oldPreview) {
//new preview geometry was created: update sketch
if (oldPreview) self.sketch.removeAuxObject(oldPreview);
if (newPreview) {
self.sketch.addAuxObject(newPreview);
self.preview.obj = newPreview;
}
}
oldPreview = self.preview.lineStart;
newPreview = createGeomObject({
start: info.lines[0].points[freeIdx0].position.clone(),
end: newGeomParams.start.clone()
}, self.preview.lineStart);
if (newPreview != oldPreview) {
//new preview geometry was created: update sketch
if (oldPreview) this.sketch.removeAuxObject(oldPreview);
if (newPreview) {
self.sketch.addAuxObject(newPreview);
self.preview.lineStart = newPreview;
}
}
oldPreview = self.preview.lineEnd;
newPreview = createGeomObject({
start: info.lines[1].points[freeIdx1].position.clone(),
end: newGeomParams.end.clone()
}, self.preview.lineEnd);
if (newPreview != oldPreview) {
//new preview geometry was created: update sketch
if (oldPreview) self.sketch.removeAuxObject(oldPreview);
if (newPreview) {
self.sketch.addAuxObject(newPreview);
self.preview.lineEnd = newPreview;
}
}
}
//interaction for creating new fillet when clicking at vertex
function addFilletablePointInteraction(obj) {
var _obj$interact$createI;
obj.interact.createInteraction({
priority: 10 }).on((_obj$interact$createI = {}, (0, _defineProperty3.default)(_obj$interact$createI, _object2.default.Events.Interaction.Hovered, function (data) {
obj.interact.hover();
sketcher.refresh();
}), (0, _defineProperty3.default)(_obj$interact$createI, _object2.default.Events.Interaction.Unhovered, function (data) {
obj.interact.unhover();
sketcher.refresh();
}), (0, _defineProperty3.default)(_obj$interact$createI, _object2.default.Events.Interaction.Clicked, function (data) {
if (self.busy) return;
var info = self.processor.RecognizeFilletableAngle(obj.position);
if (!info) return;
var shiftPressed = self.sketcher.view.interaction.shiftKey;
if (shiftPressed) var params = self.processor.CalculateFilletParamsByRadius(info, 10.0);else var params = self.processor.CalculateChamferParamsByOffset(info, 10.0);
if (!params) return;
self.busy = true;
return self.processor.CreateNewFillet(info, params).then(function () {
self.updateInteractiveObjects();
// self.sketcher.refresh();
self.busy = false;
});
}), _obj$interact$createI));
}
//interaction for deleting a present fillet when clicking in its arc
function addFilletArcLineInteraction(obj) {
var _obj$interact$createI2;
obj.interact.createInteraction({
priority: 10 }).on((_obj$interact$createI2 = {}, (0, _defineProperty3.default)(_obj$interact$createI2, _object2.default.Events.Interaction.Hovered, function (data) {
obj.interact.hover();
sketcher.refresh();
}), (0, _defineProperty3.default)(_obj$interact$createI2, _object2.default.Events.Interaction.Unhovered, function (data) {
obj.interact.unhover();
sketcher.refresh();
}), (0, _defineProperty3.default)(_obj$interact$createI2, _object2.default.Events.Interaction.Picked, function (data) {
if (self.busy) return;
var info = self.processor.RecognizeFilletByArcOrEdge(obj);
if (!info) return;
var shiftPressed = self.sketcher.view.interaction.shiftKey;
if (!shiftPressed) {
var promise = self.processor.DeleteFillet(info);
return promise.then(function () {
info.obj.interact.unhover();
self.updateInteractiveObjects();
self.busy = false;
});
}
self.busy = true;
sketcher.view.controls.enabled = false; //do not update camera when dragging
info.obj.interact.unhover();
info.obj.setVisible(false);
info.lines.forEach(function (line) {
return line.setVisible(false);
});
addPreview(info);
sketcher.refresh();
self.busy = false;
}), (0, _defineProperty3.default)(_obj$interact$createI2, _object2.default.Events.Interaction.Dropped, function (data) {
if (self.busy || !self.preview) return;
var info = self.processor.RecognizeFilletByArcOrEdge(obj);
if (!info) return;
self.busy = true;
if (info.obj instanceof _arc2.default) {
var radius = self.preview.obj ? self.preview.obj.radius : info.obj.radius;
var params = self.processor.CalculateFilletParamsByRadius(info, radius);
} else {
if (self.preview.obj) var offset = self.preview.obj.points[0].position.distanceTo(info.vertex.position);else var offset = info.obj.points[0].position.distanceTo(info.vertex);
var params = self.processor.CalculateChamferParamsByOffset(info, offset);
}
var promise;
if (!self.preview.obj || self.preview.obj.points[0].position.distanceTo(self.preview.obj.points[1].position) < 1e-3) {
promise = self.processor.DeleteFillet(info);
} else {
promise = self.processor.ChangeFillet(info, params);
}
removePreview();
sketcher.view.controls.enabled = true;
info.lines.forEach(function (line) {
return line.setVisible(true);
});
return promise.then(function () {
info.obj.setVisible(true);
info.obj.interact.unhover();
self.sketcher.refresh();
self.busy = false;
self.updateInteractiveObjects();
});
}), (0, _defineProperty3.default)(_obj$interact$createI2, _object2.default.Events.Interaction.Dragged, function (data) {
if (self.busy || !self.preview) return;
var info = self.processor.RecognizeFilletByArcOrEdge(obj);
if (!info) return;
updatePreview(info);
}), _obj$interact$createI2));
}
this.filletablePoints.forEach(addFilletablePointInteraction);
this.filletArcs.forEach(addFilletArcLineInteraction);
this.filletLines.forEach(addFilletArcLineInteraction);
}
}, {
key: 'destroy',
value: function destroy() {
this.clear();
}
}]);
return filletHandler;
}(_base2.default);
;