jsketcher/web/app/cad/scene/viewSyncPlugin.js
2022-06-25 15:19:48 -07:00

74 lines
No EOL
2.6 KiB
JavaScript

import * as SceneGraph from 'scene/sceneGraph';
import {ShellView} from './views/shellView';
import {getAttribute} from 'scene/objectData';
import {MOpenFaceShell} from '../model/mopenFace';
import {OpenFaceShellView} from './views/openFaceView';
import {MShell} from '../model/mshell';
import {MDatum} from '../model/mdatum';
import DatumView from './views/datumView';
import {View} from './views/view';
import {SketchingView} from "cad/scene/views/faceView";
export function activate(context) {
let {streams} = context;
streams.cadRegistry.update.attach(sceneSynchronizer(context));
streams.sketcher.update.attach(mFace => mFace.ext.view.updateSketch());
}
function sceneSynchronizer(ctx) {
const {services: {cadScene, cadRegistry, viewer, wizard, action, pickControl}} = ctx;
return function() {
let wgChildren = cadScene.workGroup.children;
let existent = new Set();
for (let i = wgChildren.length - 1; i >= 0; --i) {
let obj = wgChildren[i];
let shellView = getAttribute(obj, View.MARKER);
if (shellView) {
let exists = cadRegistry.modelIndex.has(shellView.model.id);
if (!exists) {
SceneGraph.removeFromGroup(cadScene.workGroup, obj);
shellView.dispose();
} else {
existent.add(shellView.model.id);
}
}
}
for (let model of cadRegistry.models) {
if (!existent.has(model.id)) {
let modelView;
if (model instanceof MOpenFaceShell) {
modelView = new OpenFaceShellView(model);
} else if (model instanceof MShell) {
modelView = new ShellView(model, undefined, viewer);
} else if (model instanceof MDatum) {
modelView = new DatumView(model, viewer,
wizard.open,
datum => pickControl.pick(datum),
e => action.run('menu.datum', e),
wizard.isInProgress);
} else {
console.warn('unsupported model ' + model);
}
const attrStream = ctx.attributesService.streams.get(model.id);
const disposer = attrStream.attach(attrs => {
modelView.rootGroup.visible = !attrs.hidden
viewer.requestRender();
});
modelView.traverse(view => {
if (view instanceof SketchingView) {
const stream = ctx.attributesService.streams.get(view.model.id);
modelView.addDisposer(stream.attach(attr => {
view.setColor(attr.color);
viewer.requestRender();
}))
}
});
modelView.addDisposer(disposer)
SceneGraph.addToGroup(cadScene.workGroup, modelView.rootGroup);
}
}
viewer.requestRender();
}
}