UNPKG

awv3

Version:
445 lines (366 loc) 19.8 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = undefined; var _stringify = require('babel-runtime/core-js/json/stringify'); var _stringify2 = _interopRequireDefault(_stringify); var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _map = require('babel-runtime/core-js/map'); var _map2 = _interopRequireDefault(_map); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); 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 _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _extends3 = require('babel-runtime/helpers/extends'); var _extends4 = _interopRequireDefault(_extends3); var _three = require('three'); var THREE = _interopRequireWildcard(_three); var _elements = require('../../session/elements'); var _helpers = require('../../session/helpers'); var _plugin = require('../../session/plugin'); var _plugin2 = _interopRequireDefault(_plugin); var _object = require('../../three/object3'); var _object2 = _interopRequireDefault(_object); var _hud = require('../../core/hud'); var _hud2 = _interopRequireDefault(_hud); var _graphics = require('./graphics'); var _graphics2 = _interopRequireDefault(_graphics); var _handle = require('./handle'); 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 resources = ['dimension', 'fixation'].reduce(function (prev, item) { return (0, _extends4.default)({}, prev, (0, _defineProperty3.default)({}, item, require('!!url-loader!awv3-icons/32x32/' + item + '.png'))); }, {}); var Dimension = function (_Plugin) { (0, _inherits3.default)(Dimension, _Plugin); function Dimension(session) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var _ref$createDimensions = _ref.createDimensions, createDimensions = _ref$createDimensions === undefined ? true : _ref$createDimensions, _ref$recalc = _ref.recalc, recalc = _ref$recalc === undefined ? true : _ref$recalc, _ref$handlePrototypes = _ref.handlePrototypes, handlePrototypes = _ref$handlePrototypes === undefined ? [_handle.PositionHandle, _handle.ValueHandle] : _ref$handlePrototypes, args = (0, _objectWithoutProperties3.default)(_ref, ['createDimensions', 'recalc', 'handlePrototypes']); (0, _classCallCheck3.default)(this, Dimension); var _this = (0, _possibleConstructorReturn3.default)(this, (Dimension.__proto__ || (0, _getPrototypeOf2.default)(Dimension)).call(this, session, (0, _extends4.default)({ type: 'Dimensions', icon: 'dimension', createDimensions: createDimensions, handlePrototypes: handlePrototypes, recalc: recalc, resources: resources }, args))); _this.onChange = function (dimension) { var id = dimension.id; var element = void 0, graphics = void 0; if (_this.dimensions.has(id)) { var _this$dimensions$get = _this.dimensions.get(id); element = _this$dimensions$get.element; graphics = _this$dimensions$get.graphics; } else { element = _this.makeDimensionElement(id); _this.addElement(element); graphics = (0, _graphics2.default)(dimension.class, _this); _this.hud.scene.add(graphics); _this.dimensions.set(id, { element: element, graphics: graphics }); } graphics.updateFromState(dimension); graphics.onRender(); }; _this.onRemove = function (dimension, unsubscribe) { var id = dimension.id; var _this$dimensions$get2 = _this.dimensions.get(id), element = _this$dimensions$get2.element, graphics = _this$dimensions$get2.graphics; _this.dimensions.delete(id); element.removeSubscriptions(); _this.removeElement(element); graphics.destroy(); _this.removeSubscription(unsubscribe); }; _this.dimensions = new _map2.default(); //note: set manually by sketcher plugin _this.selector = undefined; _this.afterSetCallback = function () {}; _this.valueHandleTexturePromise = new _promise2.default(function (resolve, reject) { return new THREE.TextureLoader().load(resources['dimension'], resolve, undefined, reject); }); return _this; } (0, _createClass3.default)(Dimension, [{ key: 'CreateDimensions', value: function CreateDimensions(feature) { this.connection.execute('VAR obj, set;\n obj = CADH_RealToId(' + feature + ');\n set = @BaseModelingCommonFuncs.GetDimensionSet(obj);\n set.CreateDimensions(obj);'); } }, { key: 'onEnabled', value: function onEnabled() { var _this2 = this; // Init new heads up display, add it to the view this.hud = new _hud2.default(this.view); this.view.addHud(this.hud); this.filter = new _elements.Input(this, { name: 'Filter', value: '', hint: 'filter' }); this.addElement(this.filter); if (!this.connection) { console.log('dimensions called without active connection'); return; } var observerConfig = { manager: this.addSubscription.bind(this), fireOnStart: true, unsubscribeOnUndefined: true }; var featureParent = (this.session.plugins[this.parent] || {}).feature; // Watch current root for changes this.rootUnsubscribe = this.session.observe(function (state) { var tree = state.connections[state.globals.activeConnection].tree; return tree[tree.root].item || tree.root; }, function (root) { _this2.removeSubscriptions(); var tree = _this2.connection.tree; var itemRef = (tree[tree.root].instances || []).find(function (instance) { return tree[instance].link === root; }) || root; // Only react to parts and assemblies if (!tree[itemRef].class) return; var csys = tree[itemRef].coordinateSystem.map(function (row) { return new THREE.Vector3().fromArray(row); }); _this2.hud.scene.matrix.makeBasis(csys[1], csys[2], csys[3]).setPosition(csys[0]).decompose(_this2.hud.scene.position, _this2.hud.scene.quaternion, _this2.hud.scene.scale); _this2.hud.scene.matrixWorldNeedsUpdate = true; // Observe features and create dimensions on them if (featureParent) { _this2.createDimensions && _this2.CreateDimensions(featureParent); } else { _this2.createDimensions && _this2.connection.observe(function (state) { return state.tree[root].features; }, function (features) { return features.forEach(function (feature) { return _this2.CreateDimensions(feature); }); }, observerConfig); } // Fetch expressionset _this2.expressionSet = tree[root].expressionSet; _this2.connection.observe(function (state) { return state.tree[root].dimensions; }, function (next, prev) { return (0, _helpers.arrayDiff)(next, prev, function (newDims) { return newDims.forEach(function (id) { var tree = _this2.connection.tree; if (featureParent && featureParent !== tree[tree[id].parent].members.owner.value) return; // skip dimensions of different features _this2.connection.observe(function (state) { return state.tree[id]; }, _this2.onChange, { manager: _this2.addSubscription.bind(_this2), onRemove: _this2.onRemove, fireOnStart: true, unsubscribeOnUndefined: true }); }); }); }, observerConfig); //update all graphics on expression set changes //note: this is necessary to update dimension value in non-incremental sketcher mode _this2.connection.observe(function (state) { return state.tree[_this2.expressionSet]; }, function () { var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)(_this2.dimensions.keys()), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var id = _step.value; _this2.onChange(_this2.connection.tree[id]); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } }, observerConfig); if (_this2.selector) { //update visual representation of GUI element when selection changes _this2.selector.element.observe(function (s) { return s.children; }, function (x) { var selectedIds = _this2.selector.getSelectedIds(); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = (0, _getIterator3.default)(_this2.dimensions.entries()), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var _step2$value = (0, _slicedToArray3.default)(_step2.value, 2), id = _step2$value[0], element = _step2$value[1].element; var highlight = selectedIds.indexOf(id) !== -1; //TODO: set some other property which affects visual style element.visible = highlight ? true : false; //console.log("Changed selection: " + id + " := " + highlight); } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } }, observerConfig); } }, // no manager so that this sub won't be unsubscribed by removeSubscriptions when root changes (0, _extends4.default)({}, observerConfig, { manager: undefined })); } }, { key: 'onDisabled', value: function onDisabled() { // Remove and destroy heads up display this.view.removeHud(this.hud); this.hud.destroy(); this.rootUnsubscribe(); this.destroyElements(); } }, { key: 'makeDimensionElement', value: function makeDimensionElement(id) { var _this3 = this; var isDriven = Number((this.tree[id].members.isDriven || { value: 0 }).value); var readonly = isDriven !== 0; var nameDescriptor = this.getMemberDescriptor(id, 'paramName'); var nameElement = this.makeInputElement(nameDescriptor, 'value', { readonly: readonly, hint: 'name' }); var descriptor = this.getDimensionDescriptor(id); var expressionElement = this.makeInputElement(descriptor, 'expression', { readonly: readonly, hint: 'expression' }); var fixation = new _elements.Button(this, { icon: 'fixation', hint: 'fixation', format: _elements.Button.Format.Toggle, color: 'blue', flex: 0, value: isDriven === 0, readonly: isDriven === -1 }); fixation.observe(function (state) { return state.value; }, function (value) { _this3.connection.execute('VAR o;\n o = CADH_RealToId(' + id + ');\n o.SetIsDriven(' + Number(!value) + ');'); nameElement.readonly = !value; expressionElement.readonly = !value; }); var element = new _elements.Group(this, { format: _elements.Group.Format.Rows, children: [nameElement, expressionElement, fixation] }); this.filter.observe(function (state) { return state.value; }, function (value) { return element.visible = nameElement.value.includes(value); }, { fireOnStart: true, manager: element.addSubscription.bind(element) }); return element; } }, { key: 'makeInputElement', value: function makeInputElement(descriptor, descriptorMember) { var _this4 = this; var props = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var element = new _elements.Input(this, props); element.observe(function (state) { return state.lastEvent; }, function (event) { if (event.key === 'Enter') { descriptor[descriptorMember] = element.value; _this4.afterSetCallback(); } }); descriptor.observeExpression(function (value) { return element.value = value; }, { fireOnStart: true, unsubscribeOnUndefined: true, manager: element.addSubscription.bind(element) }); return element; } }, { key: 'getDimensionDescriptor', value: function getDimensionDescriptor(id) { var tree = this.connection.tree, dimension = tree[id]; var master = tree[dimension.members.master.value]; // extrusion or constraint var masterLinkName = master.class === 'CC_Extrusion' ? dimension.name : master.members.userValue ? 'userValue' : 'value'; var expression = master.members[masterLinkName].expression; // supported expression forms: "a_r( ExpressionSet.taper_angle )", "ExpressionSet.limit2", "everything + else" var matchA_R = expression.match(/^ *a_r\((.*)\) *$/); if (matchA_R) expression = matchA_R[1]; var matchES = expression.match(/^ *ExpressionSet\.(\w+) *$/); if (matchES) return this.getMemberDescriptor(this.expressionSet, matchES[1], { hasA_R: Boolean(matchA_R) });else return this.getMemberDescriptor(dimension.members.master.value, masterLinkName); } }, { key: 'getMemberDescriptor', value: function getMemberDescriptor(id, memberName) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var scope = this; return (0, _extends4.default)({ get value() { return scope.connection.tree[id] && scope.connection.tree[id].members[memberName].value; }, set value(value) { scope.connection.execute('VAR o;\n o = CADH_RealToId(' + id + ');\n o.' + memberName + ' = ' + (0, _stringify2.default)(value) + ';'); }, get expression() { return scope.connection.tree[id] && (scope.connection.tree[id].members[memberName].expression || scope.connection.tree[id].members[memberName].value); }, set expression(value) { var expressionSet = scope.connection.tree[id].class === 'CC_ExpressionSet'; var flag = scope.recalc && expressionSet ? 1 : 2; var command = '_C.CADApplication.SetExpressions(' + id + ',["' + memberName + '"],[' + (0, _stringify2.default)(value) + '],' + flag + ');'; scope.connection.execute(command); }, observeExpression: function observeExpression(onChange, options) { var _this5 = this; return scope.connection.observe(function (state) { return state.tree[id] && _this5.expression; }, onChange, options); } }, options); } }]); return Dimension; }(_plugin2.default); exports.default = Dimension;