awv3
Version:
⚡ AWV3 embedded CAD
559 lines (453 loc) • 21.2 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _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 _values = require('babel-runtime/core-js/object/values');
var _values2 = _interopRequireDefault(_values);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _three = require('three');
var THREE = _interopRequireWildcard(_three);
var _memoize = require('lodash/memoize');
var _memoize2 = _interopRequireDefault(_memoize);
var _cloneDeep = require('lodash/cloneDeep');
var _cloneDeep2 = _interopRequireDefault(_cloneDeep);
var _lifecycle = require('./lifecycle.js');
var _lifecycle2 = _interopRequireDefault(_lifecycle);
var _helpers = require('./helpers');
var _store = require('./store/');
var _connections = require('./store/connections');
var _globals = require('./store/globals');
var _plugins = require('./store/plugins');
var _base = require('../communication/base');
var _base2 = _interopRequireDefault(_base);
var _error = require('../core/error');
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 observe(id, parent) {
var tree = this.getState().tree;
var object = tree[id];
switch (object.class) {
case "CC_Assembly":
console.log("observing", object.name);
return observeAssembly.bind(this)(id, parent);
case "CC_Part":
observeFeatures.bind(this)(id, parent);
return observePart.bind(this)(id, parent);
}
}
function observeAssembly(root) {
var _this = this;
var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.pool;
var instances = {};
var container = new this.session.options.objectPrototype({ session: this.session });
parent.addAsync(container);
this.observe(
// selector
function (state) {
return (state.tree[root] || {}).instances || [];
},
// onChange
function () {
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var tree;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
tree = _this.tree;
_context.next = 3;
return _helpers.arrayDiff.apply(undefined, args.concat([function (newItems) {
return newItems.forEach(function (item) {
var instance = tree[item];
var csys = instance.coordinateSystem;
console.log(" observing instance", instance.name, (0, _stringify2.default)(csys[0]));
var object = instances[item] = observe.bind(_this)(instance.link, container);
object.name = instance.name;
object.matrixAutoUpdate = false;
object.matrix = new THREE.Matrix4().makeBasis(new (Function.prototype.bind.apply(THREE.Vector3, [null].concat((0, _toConsumableArray3.default)(csys[1]))))(), new (Function.prototype.bind.apply(THREE.Vector3, [null].concat((0, _toConsumableArray3.default)(csys[2]))))(), new (Function.prototype.bind.apply(THREE.Vector3, [null].concat((0, _toConsumableArray3.default)(csys[3]))))()).setPosition(new (Function.prototype.bind.apply(THREE.Vector3, [null].concat((0, _toConsumableArray3.default)(csys[0]))))());
return;
});
}, function (deletedItems) {
return deletedItems.forEach(function (item) {
var instance = instances[item];
delete instances[item];
return instance.destroyAsync();
});
}]));
case 3:
tree.root === root && _this.pool.update();
case 4:
case 'end':
return _context.stop();
}
}
}, _callee, _this);
}));
return function () {
return _ref.apply(this, arguments);
};
}(),
// options
{
onRemove: function () {
var _ref2 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2() {
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return _promise2.default.all((0, _values2.default)(instances).map(function (item) {
return item.destroyAsync();
}));
case 2:
instances = {};
_context2.next = 5;
return container.destroyAsync();
case 5:
case 'end':
return _context2.stop();
}
}
}, _callee2, _this);
}));
return function onRemove() {
return _ref2.apply(this, arguments);
};
}(), fireOnStart: true, unsubscribeOnUndefined: true
});
return container;
}
function observePart(root) {
var _this2 = this;
var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.pool;
var solids = {};
var container = new this.session.options.objectPrototype({ session: this.session });
parent.addAsync(container);
this.observe(
// selector
function (state) {
return (state.tree[root] || {}).solids || [];
},
// onChange
function () {
var _ref3 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee3() {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
var tree;
return _regenerator2.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_context3.next = 2;
return _helpers.arrayDiff.apply(undefined, args.concat([function (newItems) {
return newItems.map(function (item) {
var solid = solids[item] = _this2.primitives[item].clone();
return container.addAsync(solid);
});
}, function (deletedItems) {
return deletedItems.map(function (item) {
var solid = solids[item];
delete solids[item];
return solid.destroyAsync();
});
}]));
case 2:
tree = _this2.tree;
tree.root === root && _this2.pool.update();
case 4:
case 'end':
return _context3.stop();
}
}
}, _callee3, _this2);
}));
return function () {
return _ref3.apply(this, arguments);
};
}(),
// options
{
onRemove: function () {
var _ref4 = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee4() {
return _regenerator2.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return _promise2.default.all((0, _values2.default)(solids).map(function (item) {
return item.destroyAsync();
}));
case 2:
solids = {};
_context4.next = 5;
return container.destroyAsync();
case 5:
case 'end':
return _context4.stop();
}
}
}, _callee4, _this2);
}));
return function onRemove() {
return _ref4.apply(this, arguments);
};
}(),
fireOnStart: true, unsubscribeOnUndefined: true
});
return container;
}
function observeFeatures(root) {
var _this3 = this;
var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.pool;
return this.observe(
// selector
function (state) {
return (state.tree[root] || {}).features || [];
},
// onChange
function () {
for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
args[_key3] = arguments[_key3];
}
_helpers.arrayDiff.apply(undefined, args.concat([function (newItems) {
var items = newItems.map(function (id) {
var feature = _this3.tree[id];
var type = feature.class;
var pluginPrototype = _this3.session.prototypes[type];
if (!pluginPrototype && _this3.session.defaultPrototype) pluginPrototype = _this3.session.defaultPrototype;
if (pluginPrototype) {
// If activeSelection is on we must reset it
_this3.session.globals.activeSelection && _this3.store.dispatch(_globals.actions.setActiveSelection());
// Each plugin gets a distinct pool to draw into
var pool = new THREE.Object3D();
pool.updateParentMaterials = false;
pool.measurable = false;
pool.name = feature.name;
_this3.pool.temporary.add(pool);
// Intanciate and link new plugin
var plugin = new pluginPrototype(_this3.session, { name: feature.name, feature: feature, pool: pool, connection: _this3 });
_this3.featurePlugins[id] = plugin;
return plugin.id;
}
});
// Flush store and link plugins
_this3.store.dispatch(_connections.actions.linkPlugins(_this3.id, items));
}, function (deletedItems) {
return deletedItems.forEach(function (id) {
// Find real plugin class
var plugin = _this3.featurePlugins[id];
if (plugin) {
_this3.pool.temporary.remove(plugin.pool);
_this3.store.dispatch(_plugins.actions.unregister(plugin.id));
delete _this3.featurePlugins[id];
}
});
}]));
},
// options
{ fireOnStart: true, unsubscribeOnUndefined: true });
}
/**
* @class Connection manages a local or remote connection to a running ClassCAD instances.
ClassCAD will then drive the tree-state and cause visual actions, models, meshes, movement, etc.
In theory a ClassCAD instance is not needed, results could be fed statically using parse or stream.
*/
var Connection = function (_Lifecycle) {
(0, _inherits3.default)(Connection, _Lifecycle);
function Connection() {
var session = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _error.halt)("connection must be initialized with a session");
var props = arguments[1];
(0, _classCallCheck3.default)(this, Connection);
var _this4 = (0, _possibleConstructorReturn3.default)(this, (Connection.__proto__ || (0, _getPrototypeOf2.default)(Connection)).call(this, session, _connections.actions, function (state) {
return state.connections[_this4.id];
}, (0, _extends3.default)({
name: "Part"
}, props, {
connected: false,
activeFeature: undefined,
messages: [],
plugins: [],
tree: {
root: 1
}
})));
_this4._get = (0, _memoize2.default)(function (key) {
var state = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this4.getState().tree;
if (_this4.store) {
var obj = state[key];
if (obj) {
obj = (0, _cloneDeep2.default)(state[key]);
if (obj.children) obj.children = obj.children.map(function (item) {
return _this4._get(item, state);
});
if (obj.members) {
for (var _key4 in obj.members) {
var member = obj.members[_key4];
if (member.type === 'id') {
obj.members[_key4] = _this4._get(member.value, state);
} else if (member.type === 'array') {
_this4._resolveArray(member.members, state);
}
}
}
}
return obj;
}
});
_this4.pool = new session.options.pool((0, _extends3.default)({ session: session }, session.options.poolOptions));
_this4.primitives = {};
_this4.featurePlugins = {};
// Observe tree changes to clear cache
_this4.observe(function (state) {
return state.tree;
}, function () {
return _this4._get.cache.clear();
});
// Observe root
_this4.observe(function (state) {
return state.tree.root;
}, function (root) {
return observe.bind(_this4)(root);
});
// Observe active feature
_this4.observe(function (state) {
return state.activeFeature;
}, function (feature, oldFeature) {
if (oldFeature) {
var plugin = (0, _values2.default)(_this4.session.plugins).find(function (plugin) {
return plugin.feature === oldFeature;
});
_this4.store.dispatch(_plugins.actions.update(plugin.id, { enabled: false, collapsed: true }));
}
if (feature) {
var _plugin = (0, _values2.default)(_this4.session.plugins).find(function (plugin) {
return plugin.feature === feature;
});
_this4.store.dispatch(_plugins.actions.update(_plugin.id, { enabled: true, collapsed: false }));
_this4.activeFeaturePlugin = _plugin;
}
});
// Connect to server
if (_this4.session.options.url && _this4.session.options.protocol) {
_this4.connect(_this4.session.options.url);
}
return _this4;
}
(0, _createClass3.default)(Connection, [{
key: 'request',
value: function request(command, factory) {
return this.store.dispatch(this.actions.request(this.id, command, factory));
}
}, {
key: 'stream',
value: function stream(url, factory) {
return this.store.dispatch(this.actions.stream(this.id, url, factory));
}
}, {
key: 'parse',
value: function parse(blob, factory) {
return this.store.dispatch(this.actions.parse(this.id, blob, factory));
}
}, {
key: 'connect',
value: function connect(url) {
return this.store.dispatch(this.actions.connect(this.id, url, this.session.options.protocol));
}
}, {
key: 'init',
value: function init(payload) {
this.store.dispatch({ type: "connections/init", payload: { id: this.id, data: payload } });
}
}, {
key: 'patch',
value: function patch(payload) {
return this.store.dispatch(this.actions.patch(this.id, payload));
}
}, {
key: 'resolveTree',
value: function resolveTree(args) {
var _this5 = this;
if (!args) return;
args = Array.isArray(args) ? args : [args];
var result = args.map(function (key) {
return _this5._get(key, _this5.getState().tree);
});
return result;
}
}, {
key: '__onDestroyed',
value: function __onDestroyed() {
var _this6 = this;
(0, _values2.default)(this.primitives).forEach(function (item) {
return item.destroy();
});
this.primitives = {};
(0, _values2.default)(this.session.plugins).forEach(function (plugin) {
return plugin.connection === _this6.id && _this6.store.dispatch(_plugins.actions.unregister(plugin.id));
});
if (this.session.globals.activeConnection === this.id) {
this.session.dispatch(_globals.actions.setActiveConnection());
}
this.socket && this.socket.disconnect();
}
}, {
key: '_resolveArray',
value: function _resolveArray(array, state) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = (0, _getIterator3.default)(array), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var member = _step.value;
if (member.type === 'id') {
array[array.indexOf(member)] = this._get(member.value, state);
} else if (member.type === 'array') {
this._resolveArray(member, state);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
}]);
return Connection;
}((0, _lifecycle2.default)(_base2.default, false));
exports.default = Connection;