awv3
Version:
⚡ AWV3 embedded CAD
206 lines (166 loc) • 6.35 kB
JavaScript
import * as THREE from 'three';
var Snapper =
/*#__PURE__*/
function () {
function Snapper(options) {
this.sketch = options.sketch;
this.gridStep = options.gridStep;
this.pointRadius = options.pointRadius;
this.ignoredIds = [];
this.keyOffsets = undefined;
this.maxSnapDistance = this.gridStep / 5.0;
this.sketchPoints = undefined;
} //note: subobjects (like endpoints of line) are also marked
var _proto = Snapper.prototype;
_proto.ignoreObject = function ignoreObject(ccrefs) {
ccrefs = [].concat(ccrefs);
for (var _iterator = ccrefs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
_ref = _i.value;
}
var _ccref = _ref;
for (var _iterator2 = _ccref.descendants, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
var _ref2;
if (_isArray2) {
if (_i2 >= _iterator2.length) break;
_ref2 = _iterator2[_i2++];
} else {
_i2 = _iterator2.next();
if (_i2.done) break;
_ref2 = _i2.value;
}
var _obj = _ref2;
this.ignoredIds.push(_obj.id);
}
}
}; //call this when dragging (or duplicating) many objects
// ccrefs: set of objects which is going to be moved
// mousePosition: where must cursor is currently
// dragged (optional): the object we drag with mouse (note: special case if it is point)
_proto.setDraggedObjects = function setDraggedObjects(ccrefs, mousePosition, dragged) {
this.keyOffsets = [];
for (var _iterator3 = ccrefs, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
var _ref3;
if (_isArray3) {
if (_i3 >= _iterator3.length) break;
_ref3 = _iterator3[_i3++];
} else {
_i3 = _iterator3.next();
if (_i3.done) break;
_ref3 = _i3.value;
}
var obj = _ref3;
var subpoints = Array.from(obj.descendants).filter(function (obj) {
return obj.isPoint();
});
for (var _iterator4 = subpoints, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {
var _ref4;
if (_isArray4) {
if (_i4 >= _iterator4.length) break;
_ref4 = _iterator4[_i4++];
} else {
_i4 = _iterator4.next();
if (_i4.done) break;
_ref4 = _i4.value;
}
var pnt = _ref4;
var offset = pnt.pos.clone().sub(mousePosition);
if (dragged && dragged.isPoint()) offset.set(0, 0, 0);
if (!this.keyOffsets.some(function (vec) {
return vec.distanceTo(offset) <= 1e-9;
})) this.keyOffsets.push(offset);
}
}
}; //use this to snap dragged object
_proto.snapDraggedObject = function snapDraggedObject(mousePosition) {
var res = this.noneResult();
for (var _iterator5 = this.keyOffsets, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {
var _ref5;
if (_isArray5) {
if (_i5 >= _iterator5.length) break;
_ref5 = _iterator5[_i5++];
} else {
_i5 = _iterator5.next();
if (_i5.done) break;
_ref5 = _i5.value;
}
var key = _ref5;
var position = mousePosition.clone().add(key);
var tres = this.snapPoint(position);
tres.position.sub(key);
if (this.compareResult(res, tres) > 0) res = tres;
}
return res;
}; //use this method for drawing things (and NOT for dragging)
_proto.snapPoint = function snapPoint(position) {
var res = this.noneResult();
var resPoints = this.snapToSketchPoints(position);
if (this.compareResult(res, resPoints) > 0) res = resPoints;
var resGrid = this.snapToGrid(position);
if (this.compareResult(res, resGrid) > 0) res = resGrid;
res.position = res.displacement.clone().add(position);
return res;
}; //internal methods
_proto.noneResult = function noneResult() {
return {
cost: Infinity,
displacement: new THREE.Vector3(0, 0, 0)
};
};
_proto.compareResult = function compareResult(resA, resB) {
if (Math.abs(resA.cost - resB.cost) <= 1e-3) return 0;
return resA.cost < resB.cost ? -1 : 1;
};
_proto.snapToGrid = function snapToGrid(position) {
if (this.gridStep > 0) {
var x = Math.round(position.x / this.gridStep) * this.gridStep;
var y = Math.round(position.y / this.gridStep) * this.gridStep;
var gridNode = new THREE.Vector3(x, y, 0);
var dist = gridNode.distanceTo(position);
if (dist < this.maxSnapDistance) {
return {
cost: dist,
displacement: gridNode.clone().sub(position)
};
}
}
return this.noneResult();
};
_proto.snapToSketchPoints = function snapToSketchPoints(position) {
var res = this.noneResult(); //note: cache sketch points for faster multi-snapping
if (this.sketchPoints === undefined) this.sketchPoints = Array.from(this.sketch.descendants).filter(function (obj) {
return obj.isPoint();
});
for (var _iterator6 = this.sketchPoints, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {
var _ref6;
if (_isArray6) {
if (_i6 >= _iterator6.length) break;
_ref6 = _iterator6[_i6++];
} else {
_i6 = _iterator6.next();
if (_i6.done) break;
_ref6 = _i6.value;
}
var _obj2 = _ref6;
if (this.ignoredIds.indexOf(_obj2.id) !== -1) continue;
var pointPos = _obj2.pos;
var dist = pointPos.distanceTo(position);
if (dist > this.maxSnapDistance) continue;
var snap = {
cost: dist,
displacement: pointPos.clone().sub(position),
toPoint: _obj2
};
if (this.compareResult(snap, res) < 0) res = snap;
}
return res;
};
return Snapper;
}();
export { Snapper as default };