awv3
Version:
⚡ AWV3 embedded CAD
18 lines • 7.93 kB
JavaScript
'use strict';Object.defineProperty(exports,'__esModule',{value:!0});exports.ConstraintGenerator=exports.ConstraintsAdder=exports.DSU=void 0;var _getIterator2=require('babel-runtime/core-js/get-iterator'),_getIterator3=_interopRequireDefault(_getIterator2),_set=require('babel-runtime/core-js/set'),_set2=_interopRequireDefault(_set),_from=require('babel-runtime/core-js/array/from'),_from2=_interopRequireDefault(_from),_map=require('babel-runtime/core-js/map'),_map2=_interopRequireDefault(_map),_classCallCheck2=require('babel-runtime/helpers/classCallCheck'),_classCallCheck3=_interopRequireDefault(_classCallCheck2),_createClass2=require('babel-runtime/helpers/createClass'),_createClass3=_interopRequireDefault(_createClass2),_constraint=require('../sketcher/constraint'),_constraint2=_interopRequireDefault(_constraint),_sketch=require('../sketcher/sketch'),_sketch2=_interopRequireDefault(_sketch),_three=require('three'),THREE=_interopRequireWildcard(_three);function _interopRequireWildcard(obj){if(obj&&obj.__esModule)return obj;var newObj={};if(null!=obj)for(var key in obj)Object.prototype.hasOwnProperty.call(obj,key)&&(newObj[key]=obj[key]);return newObj.default=obj,newObj}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}//====================== Disjoint Set Union ========================
var DSU=exports.DSU=function(){function DSU(){(0,_classCallCheck3.default)(this,DSU),this.parents=new _map2.default}return(0,_createClass3.default)(DSU,[{key:'getParent',value:function getParent(a){return this.parents.get(a)||a}},{key:'setParent',value:function setParent(a,b){this.parents.set(a,b)}},{key:'touch',value:function touch(a){this.parents.has(a)||this.parents.set(a,a)}},{key:'getHead',value:function getHead(a){var b=this.getParent(a);if(b===a)return a;var c=this.getHead(b);return this.setParent(a,c),c}},{key:'merge',value:function merge(a,b){return this.touch(a),this.touch(b),a=this.getHead(a),b=this.getHead(b),0.5>Math.random()?this.setParent(a,b):this.setParent(b,a)}},{key:'getTouched',value:function getTouched(){return(0,_from2.default)(this.parents.keys())}}]),DSU}();//====================== Constraints adder ========================
var ConstraintsAdder=exports.ConstraintsAdder=function(){function ConstraintsAdder(a){(0,_classCallCheck3.default)(this,ConstraintsAdder),this.sketch=a,this.constraints=[],this.incidenceDsu=new DSU,this.horizontalSet=new _set2.default,this.verticalSet=new _set2.default,this.init()}return(0,_createClass3.default)(ConstraintsAdder,[{key:'init',value:function init(){//take all present constraints into account
var a=this.sketch.getConstraintsOnSketch(),_iteratorNormalCompletion=!0,_didIteratorError=!1,_iteratorError=void 0;try{for(var _step,_iterator=(0,_getIterator3.default)(a);!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=!0){var b=_step.value;b.typename===_constraint2.default.Type.INCIDENCE[0]&&this.incidenceDsu.merge(b.args[0],b.args[1]),b.typename===_constraint2.default.Type.VERTICALITY[0]&&this.verticalSet.add(b.args[0]),b.typename===_constraint2.default.Type.HORIZONTALITY[0]&&this.horizontalSet.add(b.args[0])}}catch(err){_didIteratorError=!0,_iteratorError=err}finally{try{!_iteratorNormalCompletion&&_iterator.return&&_iterator.return()}finally{if(_didIteratorError)throw _iteratorError}}}//add new constraint to internal buffer (if it is not excessive)
},{key:'add',value:function add(a,b,c){var d=!1;//if the new constraint is not excessive, then take it into account
if(a===_constraint2.default.Type.INCIDENCE)this.incidenceDsu.getHead(b[0])!==this.incidenceDsu.getHead(b[1])&&(d=!0,this.incidenceDsu.merge(b[0],b[1]));else if(a===_constraint2.default.Type.VERTICALITY)this.verticalSet.has(b[0])||(d=!0,this.verticalSet.add(b[0]));else if(a===_constraint2.default.Type.HORIZONTALITY)this.horizontalSet.has(b[0])||(d=!0,this.horizontalSet.add(b[0]));else{var e=this.sketch.getConstraintsOnSketch();e=e.map(function(f){return f.getData()}),e=e.concat(this.constraints),d=!e.some(function(f){var g=f[0],h=f[1],i=f[2];if(g[0]!==a[0])return!1;if(h.length!=b.length)return!1;if(c.value||i.value||c.expression||i.expression)return!1;//ignore parametric constraints
if(h.every(function(k,l){return k===b[l]}))return!0;var j=[_constraint2.default.Type.INCIDENCE,_constraint2.default.Type.DISTANCE,_constraint2.default.Type.ANGLE,_constraint2.default.Type.TANGENCY,_constraint2.default.Type.PERPENDICULARITY,_constraint2.default.Type.PARALLELITY,_constraint2.default.Type.CONCENTRIC,_constraint2.default.Type.COLINEAR,//not sure
_constraint2.default.Type.EQUAL_RADIUS//not sure
].map(function(k){return k[0]});return-1!==j.indexOf(a[0])&&b[0]===h[1]&&b[1]===h[0]})}//now add it internally
d&&this.constraints.push([a,b,c])}//returns all constraints in the internal buffer, purges the buffer
},{key:'commit',value:function commit(){var a=[];return this.constraints.forEach(function(b){var c=new _constraint2.default(b[0],b[1],b[2]);a.push(c)}),this.constraints=[],a}}]),ConstraintsAdder}();//====================== Implied constraints generator ========================
/*
* ConstraintGenerator - an object that generates implied constraints for some sketch
*/var ConstraintGenerator=exports.ConstraintGenerator=function(){function ConstraintGenerator(a){(0,_classCallCheck3.default)(this,ConstraintGenerator),this.sketch=a,this.generate={horizontality:!0,verticality:!0,pointCoincidence:!0,tangency:!0},this.angularTolerance=1e-6,this.linearTolerance=1e-6}//if relatedTo is set, then only constraints which are somehow related to objects from [relatedTo] are added
return(0,_createClass3.default)(ConstraintGenerator,[{key:'generateImpliedConstraints',value:function generateImpliedConstraints(a){var b=new ConstraintsAdder(this.sketch),c=this.sketch.getObjectsOnSketch(),d=_sketch2.default.ForObjectsWithChildren(c);void 0===a&&(a=d);var e=new _set2.default(a),_iteratorNormalCompletion2=!0,_didIteratorError2=!1,_iteratorError2=void 0;try{for(var _step2,_iterator2=(0,_getIterator3.default)(a);!(_iteratorNormalCompletion2=(_step2=_iterator2.next()).done);_iteratorNormalCompletion2=!0){var f=_step2.value;if('CC_Line'===f.state.class){// generate implied horizontality or verticality
var g=f.getTangent();//unit vector or zero
g.length()>this.angularTolerance&&(Math.abs(g.y)<=this.angularTolerance&&b.add(_constraint2.default.Type.HORIZONTALITY,[f],{fixed:!0,noVisualize:!0}),Math.abs(g.x)<=this.angularTolerance&&b.add(_constraint2.default.Type.VERTICALITY,[f],{fixed:!0,noVisualize:!0}))}var _iteratorNormalCompletion3=!0,_didIteratorError3=!1,_iteratorError3=void 0;try{for(var _step3,_iterator3=(0,_getIterator3.default)(d);!(_iteratorNormalCompletion3=(_step3=_iterator3.next()).done);_iteratorNormalCompletion3=!0){var h=_step3.value;if('CC_Point'===f.state.class&&'CC_Point'===h.state.class&&f.position.distanceTo(h.position)<=this.linearTolerance){b.add(_constraint2.default.Type.INCIDENCE,[f,h],{noVisualize:!0});// generate implied tangency of touching endpoints
var i=f.parent,j=h.parent;if('CC_Sketch'!==i.state.class&&'CC_Sketch'!==j.state.class&&i!==j&&e.has(i)&&-1!==i.points.indexOf(f)&&-1!==j.points.indexOf(h)){var k=i.getTangent(f.position),l=j.getTangent(h.position);if(k.length()>this.linearTolerance&&l.length()>this.linearTolerance&&Math.abs(k.cross(l).z)<=this.angularTolerance){var m='CC_Line'===i.class&&'CC_Line'===j.class?_constraint2.default.Type.INCIDENCE:_constraint2.default.Type.TANGENCY;b.add(m,[i,j],{noVisualize:!0})}}}}}catch(err){_didIteratorError3=!0,_iteratorError3=err}finally{try{!_iteratorNormalCompletion3&&_iterator3.return&&_iterator3.return()}finally{if(_didIteratorError3)throw _iteratorError3}}}}catch(err){_didIteratorError2=!0,_iteratorError2=err}finally{try{!_iteratorNormalCompletion2&&_iterator2.return&&_iterator2.return()}finally{if(_didIteratorError2)throw _iteratorError2}}return b.commit()}}]),ConstraintGenerator}();