# Global and Local Context Plugins
This example shows how to communicate from different plugins across the BIMDataViewer window layout using the globalContext
and the localContext
.
# Demo
# HTML
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<style>
html,
body {
margin: 0;
cursor: default;
}
</style>
<title>BIMDataViewer</title>
</head>
<body>
<div style="height: 100vh">
<div id="viewer"></div>
</div>
<script type="module">
import makeBIMDataViewer from "https://cdn.jsdelivr.net/npm/@bimdata/viewer@2.6.1";
const bimdataViewer = makeBIMDataViewer({
// do not display the header, the bimdata logo and the viewer version
ui: {
header: false,
bimdataLogo: false,
version: false,
},
// remove all native plugins
plugins: false,
});
/*** PLUGIN REGISTRATION ***/
bimdataViewer.registerPlugin({
name: "plugin-1",
component: {
template: "<BIMDataButton fill @click='onClick' >Click to open the plugin 2</BIMDataButton>",
methods: {
onClick() {
this.$viewer.localContext.plugins.get("plugin-2").$open();
}
}
},
button: {
position: "left",
content: "simple",
},
});
bimdataViewer.registerPlugin({
name: "plugin-2",
component: {
template: "<BIMDataButton fill @click='onClick' >Click to open the plugin 3</BIMDataButton>",
methods: {
onClick() {
this.$viewer.globalContext.pluginInstances.get("plugin-3")[0].open();
}
}
},
button: {
position: "right",
content: "simple",
},
});
bimdataViewer.registerPlugin({
name: "plugin-3",
component: {
template: "<div>Plugin 3</div>",
},
button: {
position: "left",
content: "simple",
},
});
/*** WINDOW REGISTRATION ***/
bimdataViewer.registerWindow({
name: "window-1",
plugins: ["plugin-1", "plugin-2"],
});
bimdataViewer.registerWindow({
name: "window-2",
plugins: ["plugin-3"],
});
/*** LAYOUT ***/
const layout = {
ratios: [50, 50],
direction: "column",
children: [
"window-1",
"window-2",
],
};
bimdataViewer.mount("#viewer", layout);
</script>
</body>
</html>
TIP
Notice that PluginInstances and PluginComponentInstances (the entities returned by localContext.plugins
or globalContext.plugins
) do not use the same API to open the plugin. Also, globalContext.pluginInstances
return an Array of PluginInstances because the same plugin can be instantiated many times on different Windows.