awv3
Version:
⚡ AWV3 embedded CAD
388 lines (318 loc) • 13.5 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var observeActiveConnection = function () {
var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(id, previous) {
var activeConnection;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (previous) this.pool.removeAsync(_connections.base.references[previous].pool);
if (!id) {
_context.next = 8;
break;
}
activeConnection = _connections.base.references[id];
_context.next = 5;
return this.pool.addAsync(activeConnection.pool);
case 5:
_context.next = 7;
return this.pool.viewFound();
case 7:
this.pool.view.updateBounds().controls.focus().zoom().rotate(0, Math.PI / 3);
case 8:
case 'end':
return _context.stop();
}
}
}, _callee, this);
}));
return function observeActiveConnection(_x3, _x4) {
return _ref.apply(this, arguments);
};
}();
var _three = require('three');
var THREE = _interopRequireWildcard(_three);
var _redux = require('redux');
var _reduxThunk = require('redux-thunk');
var _reduxThunk2 = _interopRequireDefault(_reduxThunk);
var _remove = require('lodash/remove');
var _remove2 = _interopRequireDefault(_remove);
var _isFunction = require('lodash/isFunction');
var _isFunction2 = _interopRequireDefault(_isFunction);
var _element = require('./element');
var _element2 = _interopRequireDefault(_element);
var _index = require('./store/index.js');
var _globals = require('./store/globals');
var _elements = require('./store/elements');
var _connections = require('./store/connections');
var _plugins = require('./store/plugins');
var _helpers = require('./helpers');
var _selector = require('./selection/selector');
var _connection = require('./connection');
var _connection2 = _interopRequireDefault(_connection);
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 Session = function () {
function Session() {
var _options,
_this = this;
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
(0, _classCallCheck3.default)(this, Session);
var materials = options.materials || {};
delete options.materials;
this.options = (0, _extends3.default)({
debug: false,
updateMaterials: false,
centerGeometry: false,
pool: _helpers.Pool,
poolOptions: {},
objectPrototype: _helpers.ObjectPrototype,
materials: (0, _extends3.default)({
multi: true,
shadows: true,
edgeColor: undefined,
edgeOpacity: undefined,
meshes: {
shader: THREE.MeshPhysicalMaterial,
options: (_options = {
transparent: true,
fog: false,
emissive: new THREE.Color(0),
reflectivity: 1,
polygonOffset: true,
polygonOffsetFactor: 1,
polygonOffsetUnits: 1
}, (0, _defineProperty3.default)(_options, 'emissive', new THREE.Color(0)), (0, _defineProperty3.default)(_options, 'metalness', 0.7), (0, _defineProperty3.default)(_options, 'roughness', 0.7), (0, _defineProperty3.default)(_options, 'clearCoat', 0.6), (0, _defineProperty3.default)(_options, 'clearCoatRoughness', 0.6), (0, _defineProperty3.default)(_options, 'envMapIntensity', 0.5), _options)
}
}, materials)
}, options);
var composeEnhancers = this.options.debug && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : _redux.compose;
this.store = options.store || (0, _redux.createStore)(_index.reducer, composeEnhancers((0, _redux.applyMiddleware)(_reduxThunk2.default) /*, batchedSubscribe(batchedUpdates)*/));
// Support hot reloading reducers
if (process.env.NODE_ENV !== 'production' && !options.store && module.hot) {
module.hot.accept(['./store/globals', './store/plugins', './store/elements', './store/connections', './store/index'], function () {
return _this.store.replaceReducer(require('./store/index.js').reducer);
});
}
this.pool = new _helpers.Pool(this);
this.defaultPrototype;
this.prototypes = {};
this.layerNames = [];
this.observe = (0, _helpers.createObserver)(this.store, this.getState.bind(this));
this.selector = new _selector.Selector(this, options);
// Global observers
this.observe(function (state) {
return state.globals.activeConnection;
}, observeActiveConnection.bind(this));
options.resources && this.addResources(options.resources);
options.prototypes && this.registerPrototypes(options.prototypes);
options.defaultPrototype && this.registerDefaultPrototype(options.defaultPrototype);
// Add a global keylistener that will forward events to a plugins console
var keydownEventHandler = keydownEvent.bind(this);
document.addEventListener("keydown", keydownEventHandler);
}
(0, _createClass3.default)(Session, [{
key: 'showLayer',
value: function showLayer() {
var _this2 = this;
var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
this.layerNames = Array.isArray(args) ? args : [args];
this.pool.traverse(function (obj) {
if (obj.material) {
if (obj.material instanceof THREE.MultiMaterial) {
obj.material.materials.forEach(function (mat) {
return mat.visible = mat.meta ? _this2.layerNames.length == 0 || _this2.layerNames.indexOf(mat.meta.layer) > -1 : mat.visible;
});
} else if (obj.material.meta) {
obj.material.visible = _this2.layerNames.length == 0 || _this2.layerNames.indexOf(obj.material.meta.layer) > -1;
}
}
});
this.pool.view.invalidate();
}
}, {
key: 'isVisibleLayer',
value: function isVisibleLayer(layerName) {
if (this.layerNames.length === 0 || this.layerNames.indexOf(layerName) > -1) return true;
return false;
}
}, {
key: 'getState',
value: function getState() {
return this.store.getState() || {};
}
}, {
key: 'dispatch',
value: function dispatch(action) {
return this.store.dispatch(action);
}
}, {
key: 'registerDefaultPrototype',
value: function registerDefaultPrototype(prototype) {
this.defaultPrototype = prototype;
}
}, {
key: 'registerPrototypes',
value: function registerPrototypes(map) {
this.prototypes = (0, _extends3.default)({}, this.prototypes, map);
}
}, {
key: 'findFeaturePlugin',
value: function findFeaturePlugin(id) {
return this.featurePlugins.find(function (item) {
return item.id === id;
});
}
}, {
key: 'addResources',
value: function addResources(map) {
this.dispatch(_globals.actions.addResources(map));
}
}, {
key: 'addConnection',
value: function addConnection(name) {
var connection = new _connection2.default(this, { name: name });
this.store.dispatch(_globals.actions.setActiveConnection(connection.id));
return connection;
}
}, {
key: 'resolveResource',
value: function resolveResource(name, plugin) {
var resource = void 0;
var scope = this.plugins[plugin];
if (scope) resource = scope.resources[name];
if (!resource) resource = this.globals.resources[name];
return resource;
}
}, {
key: 'resolveTree',
value: function resolveTree(args) {
var id = this.globals.activeConnection;
var connection = _connections.base.references[id];
return connection.resolveTree(args);
}
}, {
key: 'state',
get: function get() {
return this.getState();
}
}, {
key: 'globals',
get: function get() {
return this.state.globals;
}
}, {
key: 'plugins',
get: function get() {
return this.state.plugins;
}
}, {
key: 'elements',
get: function get() {
return this.state.elements;
}
}, {
key: 'connections',
get: function get() {
return this.state.connections;
}
}, {
key: 'collections',
get: function get() {
return this.state.collections;
}
// Computed props
}, {
key: 'activeConnection',
get: function get() {
return this.state.connections[this.state.globals.activeConnection];
}
}, {
key: 'activePlugin',
get: function get() {
var _this3 = this;
return this.plugins[this.activeConnection.plugins.find(function (item) {
return _this3.plugins[item].feature === _this3.activeConnection.activeFeature;
})];
}
}, {
key: 'tree',
get: function get() {
return this.activeConnection.tree;
}
}, {
key: 'activeConnectionClass',
get: function get() {
return _connections.base.references[this.globals.activeConnection];
}
}, {
key: 'activePluginClass',
get: function get() {
return _plugins.base.references[this.activePlugin.id];
}
}]);
return Session;
}();
//import { batchedSubscribe } from 'redux-batched-subscribe';
//import { unstable_batchedUpdates as batchedUpdates } from 'react-dom';
exports.default = Session;
function checkElements(session, elements) {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = (0, _getIterator3.default)(elements), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var key = _step.value;
var element = session.elements[key];
if (element.type === _element2.default.Type.Console) {
session.store.dispatch(_elements.actions.update(element.id, { focus: true }));
session.store.dispatch(_elements.actions.event(element.id, event));
return true;
} else if (element.type === _element2.default.Type.Group && checkElements(session, element.children)) {
return true;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return false;
}
function keydownEvent(event) {
var target = event.target;
if (!(target instanceof HTMLInputElement)) {
for (var key in this.plugins) {
var plugin = this.plugins[key];
if (plugin.enabled && !plugin.collapsed && checkElements(this, plugin.elements)) {
return;
}
}
}
}