awv3
Version:
AWV client CAD framework
1 lines • 10.4 kB
JavaScript
"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}exports.__esModule=!0;var _getIterator2=require("babel-runtime/core-js/get-iterator"),_getIterator3=_interopRequireDefault(_getIterator2),_toConsumableArray2=require("babel-runtime/helpers/toConsumableArray"),_toConsumableArray3=_interopRequireDefault(_toConsumableArray2),_extends2=require("babel-runtime/helpers/extends"),_extends3=_interopRequireDefault(_extends2),_classCallCheck2=require("babel-runtime/helpers/classCallCheck"),_classCallCheck3=_interopRequireDefault(_classCallCheck2),_three=require("three"),_three2=_interopRequireDefault(_three),_object2=require("../three/object3"),_object3=_interopRequireDefault(_object2),_orbit=require("../controls/orbit"),_orbit2=_interopRequireDefault(_orbit),_perspective=require("../three/perspective"),_perspective2=_interopRequireDefault(_perspective),Selection=function(){function e(t,r){(0,_classCallCheck3.default)(this,e),this.options=(0,_extends3.default)({hover:e.hover,unhover:e.unhover,select:e.select,unselect:e.unselect},r),this.integration=t,this.view=this.integration.view,this.selection=[],this.element=void 0}return e.prototype.toggle=function(){var e=arguments.length<=0||void 0===arguments[0]?this.element:arguments[0],t=arguments[1];e.active?this.deactivate(e,t):this.activate(e)},e.prototype.deactivate=function(){var e=arguments.length<=0||void 0===arguments[0]?this.element:arguments[0],t=!(arguments.length<=1||void 0===arguments[1])&&arguments[1];this.removeAll(t),e.active=!1,this.shiftHandler&&document.removeEventListener("keydown",this.shiftHandler),this.shiftHandler=void 0,this.view.scene.removeInteraction(),this.view.interaction.filter=void 0,this.view.setCursor(),this.element=void 0},e.prototype.activate=function(){var e,t=this,r=arguments.length<=0||void 0===arguments[0]?this.element:arguments[0];this.element&&this.element!==r&&this.deactivate(this.element),this.element=r,r.active=!0,this.view.interaction.filter=[this.view.scene],this.selection=r.items.map(function(e){return t.add(t.view.scene.getObjectById(e))});var a=["Scene"];Array.isArray(r.types)?a=[].concat((0,_toConsumableArray3.default)(a),(0,_toConsumableArray3.default)(r.types)):"function"==typeof r.types&&(a=function(e){return"Scene"===e.type||r.types(e)}),this.view.scene.createInteraction({recursive:!0,first:!0,types:a}).on((e={},e[_object3.default.Events.Interaction.Hovered]=function(e){t.shiftHandler.handled||(t.view.setCursor("pointer"),t.options.hover(e,e.material.__selected))},e[_object3.default.Events.Interaction.Unhovered]=function(e){t.shiftHandler.handled||t.options.unhover(e,e.material.__selected)},e[_object3.default.Events.Interaction.Clicked]=function(e){if(!t.shiftHandler.handled){var a=t.selection.findIndex(function(t){return t.id===e.id});a==-1&&1===r.limit&&t.selection.length>=1?t.switch(t.selection[0],e):a==-1?t.add(e):t.remove(e)}},e[_object3.default.Events.Interaction.Missed]=function(){return t.removeAll()},e));var i=[];this.shiftHandler=function(e){t.shiftHandler.handled||16!==e.keyCode||!function(){t.shiftHandler.handled=!0,t.view.input.debounce=!1,t.view.controls.enabled=!1,t.view.interaction.enabled=!1;var e=[];t.view.scene.traverseMaterials(function(t,r){"Mesh"===r.type&&(t.__originalOpacity||(t.__originalOpacity=t.opacity),t.animate({opacity:.1}).start(1e3));var a=_object3.default.RenderOrder.MeshesFirst[r.type];if(void 0!==a&&(r.renderOrder=a),r.visible&&r.interactive&&t.meta){r.updateMatrixWorld(!0);var i=t.meta.box.clone();i.applyMatrix4(r.matrixWorld),i.parent=t,e.push(i)}});var r=t.view.camera.near,a=t.view.camera.far;t.view.hud=!0,t.view.controlsHud=void 0,t.view.cameraHud=new _perspective2.default({near:r,far:a,fov:t.view.camera.fov}),t.view.measure(!0);var n=(t.view.scene.updateBounds().bounds,new _three2.default.PlaneGeometry(1,1)),o=new _three2.default.Mesh(n,new _three2.default.MeshBasicMaterial({transparent:!0,opacity:.05,color:new _three2.default.Color(0)}));o.renderOrder=-1,t.view.sceneHud.add(o);var l=void 0,s=void 0,c=void 0,d=void 0,u=void 0,h=void 0,m=void 0,v=void 0,f=void 0,_=void 0,p=void 0,w=function(w){switch(w.type){case"mousedown":t.removeAll(),l=t.view.getPoint3({x:w.offsetX,y:w.offsetY}),s=t.view.getPoint3({x:w.offsetX,y:w.offsetY},t.view.cameraHud),o.position.copy(s);break;case"mousemove":if(!s)return;var y=t.view.getPoint3({x:w.offsetX,y:w.offsetY},t.view.cameraHud).sub(s),b=Math.abs(y.x),x=Math.abs(y.y),g=x/2,k=b/2,C=y.x/2,M=y.y/2;n.vertices[0].set(-k+C,g+M,0),n.vertices[1].set(b-k+C,g+M,0),n.vertices[2].set(-k+C,-(x-g)+M,0),n.vertices[3].set(b-k+C,-(x-g)+M,0),n.verticesNeedUpdate=!0;var I=t.view.getPoint3({x:w.offsetX,y:w.offsetY}),A=t.view.camera.position,H=t.view.camera.getWorldDirection().normalize();_=new _three2.default.Line3(A,I),p=new _three2.default.Line3(A,l),v=H.clone().multiplyScalar(r+600).add(A);var E=new _three2.default.Plane(H);E.translate(v),f=H.clone().multiplyScalar(a-1e3).add(A);var j=new _three2.default.Plane(H);if(j.translate(f),c=E.intersectLine(_),d=E.intersectLine(p),u=j.intersectLine(_),h=j.intersectLine(p),!(c&&d&&u&&h))return;m=(new _three2.default.Box3).setFromPoints([c,d,u,h]);for(var P=[],q=e,L=Array.isArray(q),z=0,q=L?q:(0,_getIterator3.default)(q);;){var B;if(L){if(z>=q.length)break;B=q[z++]}else{if(z=q.next(),z.done)break;B=z.value}var O=B;m.containsBox(O)&&P.push(O.parent)}for(var R=i,D=Array.isArray(R),S=0,R=D?R:(0,_getIterator3.default)(R);;){var V;if(D){if(S>=R.length)break;V=R[S++]}else{if(S=R.next(),S.done)break;V=S.value}var F=V;P.indexOf(F)===-1&&t.remove(F)}i=P;for(var G=i,X=Array.isArray(G),Y=0,G=X?G:(0,_getIterator3.default)(G);;){var W;if(X){if(Y>=G.length)break;W=G[Y++]}else{if(Y=G.next(),Y.done)break;W=Y.value}var T=W;!T.__selected&&t.add(T)}t.view.invalidate();break;case"mouseup":l=void 0,o&&o.destroy()}};t.view.input.on(["mousedown","mousemove","mouseup"],w),t.tempHandler=function(){t.shiftHandler.handled=!1,o&&o.destroy(),t.view.input.removeListener(["mousedown","mousemove","mouseup"],w),document.removeEventListener("keyup",t.tempHandler),t.view.input.debounce=!0,t.view.controls.enabled=!0,t.view.interaction.enabled=!0,t.view.scene.setRenderOrder(),t.view.scene.traverseMaterials(function(e,t){"Mesh"===t.type&&e.animate({opacity:e.__originalOpacity}).start(1e3)})},document.addEventListener("keyup",t.tempHandler)}()},this.shiftHandler.handled=!1,document.addEventListener("keydown",this.shiftHandler)},e.prototype.add=function(e){return e.material.__selected=!0,this.options.select(e),this.selection.push(e),this.element.items.push(e.id),this.element.onChange({element:this.element,objects:this.selection}),e},e.prototype.remove=function(e){var t=this.selection.findIndex(function(t){return t.id===e.id});t!=-1&&(e.material.__selected=void 0,this.options.unhover(e,!1),this.options.unselect(e),this.selection.splice(t,1),this.element.items.splice(t,1),this.element.onChange({element:this.element,objects:this.selection}))},e.prototype.removeAll=function(){for(var e=!(arguments.length<=0||void 0===arguments[0])&&arguments[0],t=this.selection,r=Array.isArray(t),a=0,t=r?t:(0,_getIterator3.default)(t);;){var i;if(r){if(a>=t.length)break;i=t[a++]}else{if(a=t.next(),a.done)break;i=a.value}var n=i;n.material.__selected=void 0,this.options.unhover(n,!1),this.options.unselect(n)}this.selection=[],e||(this.element.items=[],this.element.onChange({element:this.element,objects:this.selection}))},e.prototype.switch=function(e,t){this.remove(e),this.add(t)},e.hover=function(e,t){e.material.__originalColor||(e.material.__originalColor=e.material.color.clone(),e.material.__originalOpacity=e.material.opacity),!t&&e.material.animate({color:new _three2.default.Color(2676639),opacity:1}).start(0),e.material.__marker&&e.material.__marker.animate({scale:new _three2.default.Euler(1.25,1.25,1.25)}).start(250)},e.unhover=function(e,t){!t&&e.material.animate({color:e.material.__originalColor,opacity:e.material.__originalOpacity}).start(1e3),e.material.__marker&&e.material.__marker.animate({scale:new _three2.default.Euler(1.2,1.2,1.2)}).start(250)},e.select=function(e){e.material.__originalColor||(e.material.__originalColor=e.material.color.clone(),e.material.__originalOpacity=e.material.opacity);var t=new _three2.default.Color(12727145),r=new _three2.default.Color(2676639);e.material.animate({color:t}).start(1e3);var a=e.meta.box,i=new _three2.default.LineBasicMaterial({color:r});e.material.__marker&&e.material.__marker.destroy();var n=a.size(),o=new _three2.default.BoxGeometry(n.x||2,n.y||2,n.z||2),l=new _three2.default.Mesh(o,new _three2.default.MeshBasicMaterial);e.material.__marker=new _three2.default.BoxHelper(l),e.material.__marker.material=new _three2.default.LineBasicMaterial({color:0,transparent:!0,opacity:.1}),e.material.__marker.interactive=!1;var s=function(t,r){var a=arguments.length<=2||void 0===arguments[2]?2:arguments[2];t=e.object.worldToLocal(t.clone());var n=new Float32Array([t.x,t.y,t.z,t.x+a,t.y,t.z,t.x,t.y,t.z,t.x,t.y+a,t.z,t.x,t.y,t.z,t.x,t.y,t.z+a]),o=new _three2.default.BufferGeometry;o.addAttribute("position",new _three2.default.BufferAttribute(n,3));var l=new _three2.default.LineSegments(o,i).centerGeometry(t);l.geometry.applyMatrix((new _three2.default.Matrix4).makeRotationFromEuler(r)),l.position.set(0,0,0),e.material.__marker.add(l)};s(a.min,new _three2.default.Euler(0,0,0)),s(a.max,new _three2.default.Euler(-Math.PI/2,-Math.PI/2,Math.PI/2)),s(new _three2.default.Vector3(a.min.x,a.min.y,a.max.z),new _three2.default.Euler(0,Math.PI/2,0)),s(new _three2.default.Vector3(a.max.x,a.min.y,a.min.z),new _three2.default.Euler(0,-Math.PI/2,0)),s(new _three2.default.Vector3(a.min.x,a.max.y,a.min.z),new _three2.default.Euler(Math.PI/2,0,0)),s(new _three2.default.Vector3(a.max.x,a.min.y,a.max.z),new _three2.default.Euler((-Math.PI),0,Math.PI)),s(new _three2.default.Vector3(a.min.x,a.max.y,a.max.z),new _three2.default.Euler((-Math.PI),0,0)),s(new _three2.default.Vector3(a.max.x,a.max.y,a.min.z),new _three2.default.Euler(0,0,Math.PI)),e.material.__marker.position.copy(e.object.worldToLocal(a.center())),e.object.add(e.material.__marker);var c=this.view.interaction.isHit(e.object)?1.25:1.2;e.material.__marker.animate({scale:new _three2.default.Euler(c,c,c)}).from({scale:new _three2.default.Euler(.1,.1,.1)}).start(250)},e.unselect=function(e){e.material.__marker&&e.material.__marker.destroy(),e.material.__marker=void 0},e}();exports.default=Selection;