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);
+ }
+}