diff --git a/modules/scene/scaleHelper.js b/modules/scene/scaleHelper.js index 88f1a44f..497f5a9e 100644 --- a/modules/scene/scaleHelper.js +++ b/modules/scene/scaleHelper.js @@ -1,4 +1,4 @@ -import {Vector3} from 'three'; +import {Object3D, Vector3} from 'three'; import DPR from '../dpr'; export function viewScaleFactor(sceneSetup, origin, SIZE_PX, SIZE_MODEL) { @@ -19,4 +19,29 @@ export function viewScaleFactor(sceneSetup, origin, SIZE_PX, SIZE_MODEL) { let modelActualSizePx = viewHeight * modelTakingPart; return SIZE_PX / modelActualSizePx; } +} + +export class ConstantScaleGroup extends Object3D { + + sizePx; + sizeModel; + getOrigin; + + constructor(sceneSetup, sizePx, sizeModel, getOrigin) { + super(); + this.sceneSetup = sceneSetup; + this.sizePx = sizePx; + this.sizeModel = sizeModel; + this.getOrigin = getOrigin; + } + + updateMatrix() { + // let {origin: o, x, y, z} = this.csys; + // + let k = viewScaleFactor(this.sceneSetup, this.getOrigin(), this.sizePx, this.sizeModel); + + this.scale.set(k,k,k); + super.updateMatrix(); + } + } \ No newline at end of file diff --git a/web/app/cad/dom/components/View3d.jsx b/web/app/cad/dom/components/View3d.jsx index f44f2955..d7b289e9 100644 --- a/web/app/cad/dom/components/View3d.jsx +++ b/web/app/cad/dom/components/View3d.jsx @@ -54,10 +54,13 @@ export default class View3d extends React.Component { +
- +
+ +
diff --git a/web/app/cad/scene/views/shellView.js b/web/app/cad/scene/views/shellView.js index 44d3b261..493d1082 100644 --- a/web/app/cad/scene/views/shellView.js +++ b/web/app/cad/scene/views/shellView.js @@ -6,6 +6,7 @@ import {FaceView, SELECTION_COLOR} from './faceView'; import {EdgeView} from './edgeView'; import {FACE, SHELL} from '../entites'; import {Mesh} from 'three'; +import {VertexView} from "./vertexView"; export class ShellView extends View { @@ -47,6 +48,11 @@ export class ShellView extends View { this.edgeViews.push(edgeView); } + for (let vertex of shell.vertices) { + const vertexView = new VertexView(vertex, viewer); + SceneGraph.addToGroup(this.vertexGroup, vertexView.rootGroup); + this.vertexViews.push(vertexView); + } this.rootGroup.matrixAutoUpdate = false; this.model.location$.attach(loc => { diff --git a/web/app/cad/scene/views/vertexView.js b/web/app/cad/scene/views/vertexView.js index d7a11239..67c1c2c0 100644 --- a/web/app/cad/scene/views/vertexView.js +++ b/web/app/cad/scene/views/vertexView.js @@ -1,10 +1,96 @@ import {View} from './view'; +import {Mesh, MeshBasicMaterial, SphereGeometry} from 'three'; +import {CSYS_SIZE_MODEL} from '../../craft/datum/csysObject'; +import {ConstantScaleGroup} from "../../../../../modules/scene/scaleHelper"; export class VertexView extends View { - - constructor() { - super(); + + constructor(vertex, viewer) { + super(vertex); + this.rootGroup = new VertexObject(viewer, 50, 100, () => this.rootGroup.position); + + this.rootGroup.position.x = vertex.brepVertex.point.x; + this.rootGroup.position.y = vertex.brepVertex.point.y; + this.rootGroup.position.z = vertex.brepVertex.point.z; + + + // setAttribute(this.rootGroup, DATUM, this); + // setAttribute(this.rootGroup, View.MARKER, this); } - -} \ No newline at end of file + + dispose() { + this.rootGroup.dispose(); + super.dispose(); + // this.rootGroup.dispose(); + } +} + +class VertexObject extends ConstantScaleGroup { + + constructor(viewer, sizePx, sizeModel, getOrigin) { + super(viewer.sceneSetup, sizePx, sizeModel, getOrigin); + this.sphere = new VertexSphere(viewer); + this.add(this.sphere); + } + + dispose() { + this.sphere.dispose(); + } +} + +class VertexSphere extends Mesh { + + mouseInside; + + constructor(viewer) { + super(new SphereGeometry( 1 ), new MeshBasicMaterial({ + transparent: true, + opacity: 0.5, + color: 0xFFFFFF, + visible: false + })); + this.viewer = viewer; + this.scale.multiplyScalar(CSYS_SIZE_MODEL * 0.2); + } + + dispose() { + this.geometry.dispose(); + this.material.dispose(); + } + + onMouseEnter() { + this.mouseInside = true; + this.updateVisibility(); + this.material.color.setHex(0xFBB4FF); + this.viewer.requestRender(); + } + + onMouseLeave(e) { + this.mouseInside = false; + this.updateVisibility(); + this.material.color.setHex(0xFFFFFF); + this.viewer.requestRender(); + } + + onMouseDown() { + this.material.color.setHex(0xB500FF); + this.viewer.requestRender(); + } + + onMouseUp() { + this.material.color.setHex(0xFBB4FF); + this.viewer.requestRender(); + } + + onMouseClick({mouseEvent: e}) { + if (!this.material.visible) { + return; + } + } + + updateVisibility() { + let datum3D = this.parent.parent; + this.viewer.setVisualProp(this.material, 'visible', this.mouseInside); + } +}