Published
Edited
Sep 28, 2021
Importers
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
X3DDefaults.querySelector('Scene').outerHTML
Insert cell
Insert cell
X3DUOM = FileAttachment("X3dUnifiedObjectModel-3.3.xml").xml()
Insert cell
concreteNodes = X3DUOM.querySelector("ConcreteNodes")
Insert cell
X3D = file.xml()
Insert cell
X3DDefaults = addDefaultsToX3D(X3D)
Insert cell
function serializeXMLdoc (doc) {
const s = new XMLSerializer();
return `<?xml version="1.0" encoding="UTF-8"?>
${s.serializeToString(doc)}` ;
}
Insert cell
function addX3DDefaults (node) {
if ( node.hasAttribute("USE") ) { return node } // skip USE nodes
const concreteNode = concreteNodes.querySelector(`ConcreteNode[name=${node.tagName}]`);
if (!concreteNode) {
return
}
const fields = concreteNode.querySelectorAll("field[default]" );
fields.forEach( field => {
const type = field.getAttribute("type");
const name = field.getAttribute("name");
if ( type == "SFNode" || type == "MFNode" ) {
//check some node fields
}
else { // non-node fields
if ( ! node.getAttribute(name) ) {
node.setAttribute(name, field.getAttribute("default"));
}
}
});
const children = node.children;
for ( let i=0; i < children.length; i++) {
addX3DDefaults(children[i]);
};
return node;
}
Insert cell
function addDefaultsToX3D (doc, options) {
options = options || {};
const clone = doc.cloneNode(true);
if ( ! (options.inline) ) {
let scene = clone.querySelector('Scene');
if (!scene.querySelector('Viewpoint')) {
scene.innerHTML += "<Viewpoint />\n";
}
if (!scene.querySelector('NavigationInfo')) {
scene.innerHTML += "<NavigationInfo />\n";
}
}
addX3DDefaults(clone.querySelector('X3D'));
return clone
}
Insert cell
function serializeDefaultsToX3D (doc, options) {
return serializeXMLdoc (addDefaultsToX3D (doc, options))
}
Insert cell
Insert cell
import { localFileInput } from '@mbostock/localfile'
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more