mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-10 02:13:58 +01:00
121 lines
3.5 KiB
JavaScript
121 lines
3.5 KiB
JavaScript
import {brepFaceToGeom, tessDataToGeom} from './viewUtils';
|
|
import * as SceneGraph from 'scene/sceneGraph';
|
|
import {SketchObjectView} from './sketchObjectView';
|
|
import {View} from './view';
|
|
import {SketchLoopView} from './sketchLoopView';
|
|
import {createSolidMaterial} from "cad/scene/views/viewUtils";
|
|
import {SketchMesh} from "cad/scene/views/shellView";
|
|
import {FACE} from "cad/model/entities";
|
|
import {setAttribute} from "scene/objectData";
|
|
import {ViewMode} from "cad/scene/viewer";
|
|
import {SketchPoint} from "cad/sketch/sketchModel";
|
|
import {SketchPointView} from "cad/scene/views/sketchPointView";
|
|
|
|
export class SketchingView extends View {
|
|
|
|
constructor(ctx, face, parent) {
|
|
super(ctx, face, parent);
|
|
this.sketchGroup = SceneGraph.createGroup();
|
|
this.sketchObjectViews = [];
|
|
this.sketchLoopViews = [];
|
|
this.rootGroup = SceneGraph.createGroup();
|
|
SceneGraph.addToGroup(this.rootGroup, this.sketchGroup);
|
|
this.updateSketch();
|
|
|
|
const stream = ctx.attributesService.streams.get(this.model.id);
|
|
this.addDisposer(stream.attach(attr => {
|
|
if (this.mesh) {
|
|
this.setColor(attr.color);
|
|
ctx.viewer.requestRender();
|
|
}
|
|
}));
|
|
}
|
|
|
|
updateSketch() {
|
|
SceneGraph.emptyGroup(this.sketchGroup);
|
|
this.disposeSketch();
|
|
|
|
const sketchTr = this.model.sketchToWorldTransformation;
|
|
for (const sketchObject of this.model.sketchObjects) {
|
|
let sov;
|
|
if (sketchObject.sketchPrimitive instanceof SketchPoint) {
|
|
sov = new SketchPointView(this.ctx, sketchObject, sketchTr);
|
|
} else {
|
|
sov = new SketchObjectView(this.ctx, sketchObject, sketchTr);
|
|
}
|
|
|
|
SceneGraph.addToGroup(this.sketchGroup, sov.rootGroup);
|
|
this.sketchObjectViews.push(sov);
|
|
}
|
|
this.model.sketchLoops.forEach(mLoop => {
|
|
const loopView = new SketchLoopView(this.ctx, mLoop);
|
|
SceneGraph.addToGroup(this.sketchGroup, loopView.rootGroup);
|
|
this.sketchLoopViews.push(loopView);
|
|
});
|
|
}
|
|
|
|
updateVisuals() {
|
|
this.mesh.material.color.set(this.markColor||this.parent.markColor||this.color||this.parent.color||NULL_COLOR);
|
|
}
|
|
|
|
disposeSketch() {
|
|
this.sketchObjectViews.forEach(o => o.dispose());
|
|
this.sketchLoopViews.forEach(o => o.dispose());
|
|
this.sketchObjectViews = [];
|
|
this.sketchLoopViews = [];
|
|
}
|
|
|
|
dispose() {
|
|
this.disposeSketch();
|
|
super.dispose();
|
|
}
|
|
|
|
}
|
|
|
|
export class FaceView extends SketchingView {
|
|
|
|
constructor(ctx, face, parent, skin) {
|
|
super(ctx, face, parent);
|
|
let geom;
|
|
|
|
if (face.brepFace.data.tessellation) {
|
|
geom = tessDataToGeom(face.brepFace.data.tessellation.data)
|
|
} else {
|
|
geom = brepFaceToGeom(face.brepFace);
|
|
}
|
|
this.geometry = geom;
|
|
this.material = createSolidMaterial(skin);
|
|
this.mesh = new SketchMesh(geom, this.material);
|
|
setAttribute(this.mesh, FACE, this);
|
|
this.mesh.onMouseEnter = () => {
|
|
this.ctx.highlightService.highlight(this.model.id);
|
|
}
|
|
this.mesh.onMouseLeave = () => {
|
|
this.ctx.highlightService.unHighlight(this.model.id);
|
|
}
|
|
this.rootGroup.add(this.mesh);
|
|
|
|
this.addDisposer(ctx.viewer.viewMode$.attach(mode => {
|
|
this.mesh.visible = (mode === ViewMode.SHADED_WITH_EDGES || mode === ViewMode.SHADED);
|
|
}));
|
|
}
|
|
|
|
dispose() {
|
|
super.dispose();
|
|
this.material.dispose();
|
|
this.geometry.dispose();
|
|
}
|
|
}
|
|
|
|
export function setFacesColor(faces, color) {
|
|
for (const face of faces) {
|
|
if (color === null) {
|
|
face.color.set(NULL_COLOR);
|
|
} else {
|
|
face.color.set( color );
|
|
}
|
|
}
|
|
}
|
|
|
|
const NULL_COLOR = 0xbfbfbf;
|
|
|