@inweb/viewer-three 26.7.0 → 26.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"IFCXLoader.module.js","sources":["../../../plugins/loaders/IFCX/render.js","../../../plugins/loaders/IFCX/IFCXLoader.ts","../../../plugins/loaders/IFCXFileLoader.ts","../../../plugins/loaders/IFCXCloudLoader.ts","../../../plugins/loaders/IFCXLoader.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\n// Repository: https://github.com/buildingSMART/IFC5-development\n// Original File: docs/viewer/render.mjs\n// Commit SHA-1: 83a7ae862232c90065d1bd03fcd538315e7d2563\n// Commit Date: 20.05.2025 21:00:52\n\n// (C) buildingSMART International\n// published under MIT license\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable prefer-const */\n/* eslint-disable no-useless-catch */\n\nimport {\n Box3,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Line,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n PerspectiveCamera,\n Scene,\n Vector3,\n} from \"three\";\n\nconst THREE = {\n Box3,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Line,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n PerspectiveCamera,\n Scene,\n Vector3,\n};\n\n// composed-object.ts\nfunction getChildByName(root, childName, skip = 0) {\n let fragments = childName.replace(/^<\\/|^\\/|>$/g, \"\").split(\"/\");\n for (let i = 0; i < skip; ++i) {\n fragments.shift();\n }\n let start = root;\n while (fragments.length && start && start.children) {\n // console.log(start, fragments[0]);\n let f = fragments.shift();\n start = start.children.find((i) => i.name.split(\"/\").reverse()[0] === f);\n }\n if (fragments.length == 0) {\n return start;\n }\n}\n\n// compose-alpha.ts\nfunction GetNode(node, path) {\n if (path === \"\") return node;\n let parts = path.split(\"/\");\n let child = node.children.get(parts[0]);\n if (child) {\n if (parts.length === 1) {\n return child;\n }\n return GetNode(child, GetTail(path));\n } else {\n return null;\n }\n}\nfunction GetHead(path) {\n return path.split(\"/\")[0];\n}\nfunction GetTail(path) {\n let parts = path.split(\"/\");\n parts.shift();\n return parts.join(\"/\");\n}\nfunction MakeNode(node) {\n return {\n node,\n children: /* @__PURE__ */ new Map(),\n attributes: /* @__PURE__ */ new Map(),\n };\n}\nfunction ConvertToCompositionNode(path, inputNodes) {\n let compositionNode = {\n path,\n children: {},\n inherits: {},\n attributes: {},\n };\n inputNodes.forEach((node) => {\n Object.keys(node.children).forEach((childName) => {\n compositionNode.children[childName] = node.children[childName];\n });\n Object.keys(node.inherits).forEach((inheritName) => {\n let ih = node.inherits[inheritName];\n if (ih === null) {\n delete compositionNode.inherits[inheritName];\n } else {\n compositionNode.inherits[inheritName] = ih;\n }\n });\n Object.keys(node.attributes).forEach((attrName) => {\n compositionNode.attributes[attrName] = node.attributes[attrName];\n });\n });\n return compositionNode;\n}\nfunction MMSet(map, key, value) {\n if (map.has(key)) {\n map.get(key)?.push(value);\n } else {\n map.set(key, [value]);\n }\n}\nfunction FindRootsOrCycles(nodes) {\n let dependencies = /* @__PURE__ */ new Map();\n let dependents = /* @__PURE__ */ new Map();\n nodes.forEach((node, path) => {\n Object.keys(node.inherits).forEach((inheritName) => {\n MMSet(dependencies, path, node.inherits[inheritName]);\n MMSet(dependents, node.inherits[inheritName], path);\n });\n Object.keys(node.children).forEach((childName) => {\n MMSet(dependencies, path, node.children[childName]);\n MMSet(dependents, node.children[childName], path);\n });\n });\n let paths = [...nodes.keys()];\n let perm = {};\n let temp = {};\n function visit(path) {\n if (perm[path]) return;\n if (temp[path]) throw new Error(`CYCLE!`);\n temp[path] = true;\n let deps = dependencies.get(path);\n if (deps) {\n deps.forEach((dep) => visit(dep));\n }\n perm[path] = true;\n }\n let roots = /* @__PURE__ */ new Set();\n try {\n paths.forEach((path) => {\n if (!dependents.has(path) && path.indexOf(\"/\") === -1) {\n roots.add(path);\n }\n visit(path);\n });\n } catch (e) {\n return null;\n }\n return roots;\n}\nfunction ConvertNodes(input) {\n let compositionNodes = /* @__PURE__ */ new Map();\n for (let [path, inputNodes] of input) {\n compositionNodes.set(path, ConvertToCompositionNode(path, inputNodes));\n }\n return compositionNodes;\n}\nvar CycleError = class extends Error {};\nfunction ExpandFirstRootInInput(nodes) {\n let roots = FindRootsOrCycles(nodes);\n if (!roots) {\n throw new CycleError();\n }\n return ExpandNewNode([...roots.values()][0], nodes);\n}\nfunction CreateArtificialRoot(nodes) {\n let roots = FindRootsOrCycles(nodes);\n if (!roots) {\n throw new CycleError();\n }\n let pseudoRoot = {\n node: \"\",\n attributes: /* @__PURE__ */ new Map(),\n children: /* @__PURE__ */ new Map(),\n };\n roots.forEach((root) => {\n pseudoRoot.children.set(root, ExpandNewNode(root, nodes));\n });\n return pseudoRoot;\n}\nfunction ExpandNewNode(node, nodes) {\n return ExpandNode(node, MakeNode(node), nodes);\n}\nfunction ExpandNode(path, node, nodes) {\n let input = nodes.get(path);\n if (input) {\n AddDataFromInput(input, node, nodes);\n }\n node.children.forEach((child, name) => {\n ExpandNode(`${path}/${name}`, child, nodes);\n });\n return node;\n}\nfunction AddDataFromInput(input, node, nodes) {\n Object.values(input.inherits).forEach((inherit) => {\n let classNode = ExpandNewNode(GetHead(inherit), nodes);\n let subnode = GetNode(classNode, GetTail(inherit));\n if (!subnode) throw new Error(`Unknown node ${inherit}`);\n subnode.children.forEach((child, childName) => {\n node.children.set(childName, child);\n });\n for (let [attrID, attr] of subnode.attributes) {\n node.attributes.set(attrID, attr);\n }\n });\n Object.entries(input.children).forEach(([childName, child]) => {\n if (child !== null) {\n let classNode = ExpandNewNode(GetHead(child), nodes);\n let subnode = GetNode(classNode, GetTail(child));\n if (!subnode) throw new Error(`Unknown node ${child}`);\n node.children.set(childName, subnode);\n } else {\n node.children.delete(childName);\n }\n });\n Object.entries(input.attributes).forEach(([attrID, attr]) => {\n node.attributes.set(attrID, attr);\n });\n}\n\n// workflow-alpha.ts\nfunction MMSet2(map, key, value) {\n if (map.has(key)) {\n map.get(key)?.push(value);\n } else {\n map.set(key, [value]);\n }\n}\nfunction ToInputNodes(data) {\n let inputNodes = /* @__PURE__ */ new Map();\n data.forEach((ifcxNode) => {\n let node = {\n path: ifcxNode.path,\n children: ifcxNode.children ? ifcxNode.children : {},\n inherits: ifcxNode.inherits ? ifcxNode.inherits : {},\n attributes: ifcxNode.attributes ? ifcxNode.attributes : {},\n };\n MMSet2(inputNodes, node.path, node);\n });\n return inputNodes;\n}\nvar SchemaValidationError = class extends Error {};\nfunction ValidateAttributeValue(desc, value, path, schemas) {\n if (desc.inherits) {\n desc.inherits.forEach((inheritedSchemaID) => {\n let inheritedSchema = schemas[inheritedSchemaID];\n if (!inheritedSchema) {\n throw new SchemaValidationError(`Unknown inherited schema id \"${desc.inherits}\"`);\n }\n ValidateAttributeValue(inheritedSchema.value, value, path, schemas);\n });\n }\n if (desc.dataType === \"Boolean\") {\n if (typeof value !== \"boolean\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type boolean`);\n }\n } else if (desc.dataType === \"String\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n } else if (desc.dataType === \"DateTime\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type date`);\n }\n } else if (desc.dataType === \"Enum\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n let found = desc.enumRestrictions.options.filter((option) => option === value).length === 1;\n if (!found) {\n throw new SchemaValidationError(`Expected \"${value}\" to be one of [${desc.enumRestrictions.options.join(\",\")}]`);\n }\n } else if (desc.dataType === \"Integer\") {\n if (typeof value !== \"number\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type int`);\n }\n } else if (desc.dataType === \"Real\") {\n if (typeof value !== \"number\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type real`);\n }\n } else if (desc.dataType === \"Relation\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n } else if (desc.dataType === \"Object\") {\n if (typeof value !== \"object\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type object`);\n }\n if (desc.objectRestrictions) {\n Object.keys(desc.objectRestrictions.values).forEach((key) => {\n if (!Object.hasOwn(value, key)) {\n throw new SchemaValidationError(`Expected \"${value}\" to have key ${key}`);\n }\n ValidateAttributeValue(desc.objectRestrictions.values[key], value[key], path + \".\" + key, schemas);\n });\n }\n } else if (desc.dataType === \"Array\") {\n if (!Array.isArray(value)) {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type array`);\n }\n value.forEach((entry) => {\n ValidateAttributeValue(desc.arrayRestrictions.value, entry, path + \".<array>.\", schemas);\n });\n } else {\n throw new SchemaValidationError(`Unexpected datatype ${desc.dataType}`);\n }\n}\nfunction Validate(schemas, inputNodes) {\n inputNodes.forEach((node) => {\n Object.keys(node.attributes).forEach((schemaID) => {\n if (!schemas[schemaID]) {\n throw new SchemaValidationError(`Missing schema \"${schemaID}\" referenced by [\"${node.path}\"].attributes`);\n }\n let schema = schemas[schemaID];\n let value = node.attributes[schemaID];\n try {\n ValidateAttributeValue(schema.value, value, \"\", schemas);\n } catch (e) {\n if (e instanceof SchemaValidationError) {\n throw new SchemaValidationError(`Error validating [\"${node.path}\"].attributes[\"${schemaID}\"]: ${e.message}`);\n } else {\n throw e;\n }\n }\n });\n });\n}\nfunction LoadIfcxFile(file, checkSchemas = true, createArtificialRoot = false) {\n let inputNodes = ToInputNodes(file.data);\n let compositionNodes = ConvertNodes(inputNodes);\n try {\n if (checkSchemas) {\n Validate(file.schemas, compositionNodes);\n }\n } catch (e) {\n throw e;\n }\n if (createArtificialRoot) {\n return CreateArtificialRoot(compositionNodes);\n } else {\n return ExpandFirstRootInInput(compositionNodes);\n }\n}\nfunction Federate(files) {\n let result = {\n header: files[0].header,\n schemas: {},\n data: [],\n };\n files.forEach((file) => {\n Object.keys(file.schemas).forEach((schemaID) => (result.schemas[schemaID] = file.schemas[schemaID]));\n });\n files.forEach((file) => {\n file.data.forEach((node) => result.data.push(node));\n });\n return Prune(result);\n}\nfunction Collapse(nodes, deleteEmpty = false) {\n let result = {\n path: nodes[0].path,\n children: {},\n inherits: {},\n attributes: {},\n };\n nodes.forEach((node) => {\n Object.keys(node.children).forEach((name) => {\n result.children[name] = node.children[name];\n });\n Object.keys(node.inherits).forEach((name) => {\n result.inherits[name] = node.inherits[name];\n });\n Object.keys(node.attributes).forEach((name) => {\n result.attributes[name] = node.attributes[name];\n });\n });\n if (deleteEmpty) {\n let empty = true;\n Object.keys(result.children).forEach((name) => {\n if (result.children[name] !== null) empty = false;\n });\n Object.keys(result.inherits).forEach((name) => {\n if (result.inherits[name] !== null) empty = false;\n });\n Object.keys(result.attributes).forEach((name) => {\n if (result.attributes[name] !== null) empty = false;\n });\n if (empty) return null;\n }\n return result;\n}\nfunction Prune(file, deleteEmpty = false) {\n let result = {\n header: file.header,\n schemas: file.schemas,\n data: [],\n };\n let inputNodes = ToInputNodes(file.data);\n inputNodes.forEach((nodes) => {\n let collapsed = Collapse(nodes, deleteEmpty);\n if (collapsed)\n result.data.push({\n path: collapsed.path,\n children: collapsed.children,\n inherits: collapsed.inherits,\n attributes: collapsed.attributes,\n });\n });\n return result;\n}\n\n// compose-flattened.ts\nfunction TreeNodeToComposedObject(path, node, schemas) {\n let co = {\n name: path,\n attributes: {},\n children: [],\n };\n node.children.forEach((childNode, childName) => {\n co.children?.push(TreeNodeToComposedObject(`${path}/${childName}`, childNode, schemas));\n });\n node.attributes.forEach((attr, attrName) => {\n if (attr && typeof attr === \"object\" && !Array.isArray(attr)) {\n Object.keys(attr).forEach((compname) => {\n co.attributes[`${attrName}::${compname}`] = attr[compname];\n });\n } else {\n let schema = schemas[attrName];\n if (schema && schema.value.quantityKind) {\n let postfix = \"\";\n let quantityKind = schema.value.quantityKind;\n if (quantityKind === \"Length\") {\n postfix = \"m\";\n } else if (quantityKind === \"Volume\") {\n postfix = \"m\" + String.fromCodePoint(179);\n }\n co.attributes[attrName] = `${attr} ${postfix}`;\n } else {\n co.attributes[attrName] = attr;\n }\n }\n });\n if (Object.keys(co.attributes).length === 0) delete co.attributes;\n return co;\n}\nfunction compose3(files) {\n let federated = Federate(files);\n let tree = LoadIfcxFile(federated, true, true);\n return TreeNodeToComposedObject(\"\", tree, federated.schemas);\n}\n\n// render.ts\n// var controls;\n// var renderer;\nvar scene;\nvar camera;\nvar datas = [];\nvar autoCamera = true;\n// var THREE = window[\"THREE\"];\nfunction init() {\n scene = new THREE.Scene();\n camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 100);\n camera.up.set(0, 0, 1);\n camera.position.set(50, 50, 50);\n camera.lookAt(0, 0, 0);\n // const nd = document.querySelector(\".viewport\");\n // renderer = new THREE.WebGLRenderer({\n // alpha: true,\n // logarithmicDepthBuffer: true,\n // });\n // renderer.setSize(nd.offsetWidth, nd.offsetHeight);\n // controls = new THREE.OrbitControls(camera, renderer.domElement);\n // controls.enableDamping = true;\n // controls.dampingFactor = 0.25;\n // nd.appendChild(renderer.domElement);\n scene.add(camera);\n return scene;\n}\nfunction HasAttr(node, attrName) {\n if (!node || !node.attributes) return false;\n return !!node.attributes[attrName];\n}\nfunction FindChildWithAttr(node, attrName) {\n if (!node || !node.children) return void 0;\n for (let i = 0; i < node.children.length; i++) {\n if (HasAttr(node.children[i], attrName)) {\n return node.children[i];\n }\n }\n return void 0;\n}\nfunction createMaterialFromParent(parent, root) {\n let reference = parent.attributes[\"usd::usdshade::materialbindingapi::material::binding\"];\n let material = {\n color: new THREE.Color(0.6, 0.6, 0.6),\n transparent: false,\n opacity: 1,\n };\n if (reference) {\n const materialNode = getChildByName(root, reference.ref);\n if (materialNode) {\n let color = materialNode?.attributes[\"bsi::presentation::diffuseColor\"];\n material.color = new THREE.Color(...color);\n if (materialNode?.attributes[\"bsi::presentation::opacity\"]) {\n material.transparent = true;\n material.opacity = materialNode.attributes[\"bsi::presentation::opacity\"];\n }\n }\n }\n return material;\n}\nfunction createCurveFromJson(node, parent, root) {\n let points = new Float32Array(node.attributes[\"usd::usdgeom::basiscurves::points\"].flat());\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(points, 3));\n const material = createMaterialFromParent(parent, root);\n let lineMaterial = new THREE.LineBasicMaterial({ ...material });\n lineMaterial.color.multiplyScalar(0.8);\n return new THREE.Line(geometry, lineMaterial);\n}\nfunction createMeshFromJson(node, parent, root) {\n let points = new Float32Array(node.attributes[\"usd::usdgeom::mesh::points\"].flat());\n let indices = new Uint16Array(node.attributes[\"usd::usdgeom::mesh::faceVertexIndices\"]);\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(points, 3));\n geometry.setIndex(new THREE.BufferAttribute(indices, 1));\n geometry.computeVertexNormals();\n const material = createMaterialFromParent(parent, root);\n let meshMaterial = new THREE.MeshBasicMaterial({ ...material });\n return new THREE.Mesh(geometry, meshMaterial);\n}\nfunction traverseTree(node, parent, root, parentNode = void 0) {\n let elem = new THREE.Group();\n if (HasAttr(node, \"usd::usdgeom::visibility::visibility\")) {\n if (node.attributes[\"usd::usdgeom::visibility::visibility\"] === \"invisible\") {\n return;\n }\n } else if (HasAttr(node, \"usd::usdgeom::mesh::points\")) {\n elem = createMeshFromJson(node, parentNode, root);\n } else if (HasAttr(node, \"usd::usdgeom::basiscurves::points\")) {\n elem = createCurveFromJson(node, parentNode, root);\n }\n parent.add(elem);\n if (node !== root) {\n elem.matrixAutoUpdate = false;\n let matrixNode =\n node.attributes && node.attributes[\"usd::xformop::transform\"]\n ? node.attributes[\"usd::xformop::transform\"].flat()\n : null;\n if (matrixNode) {\n let matrix = new THREE.Matrix4();\n matrix.set(...matrixNode);\n matrix.transpose();\n elem.matrix = matrix;\n }\n }\n (node.children || []).forEach((child) => traverseTree(child, elem || parent, root, node));\n}\n// function encodeHtmlEntities(str) {\n// const div = document.createElement(\"div\");\n// div.textContent = str;\n// return div.innerHTML;\n// }\n// var icons = {\n// \"usd::usdgeom::mesh::points\": \"deployed_code\",\n// \"usd::usdgeom::basiscurves::points\": \"line_curve\",\n// \"usd::usdshade::material::outputs::surface.connect\": \"line_style\",\n// };\n// function buildDomTree(prim, node) {\n// const elem = document.createElement(\"div\");\n// let span;\n// elem.appendChild(document.createTextNode(prim.name ? prim.name.split(\"/\").reverse()[0] : \"root\"));\n// elem.appendChild((span = document.createElement(\"span\")));\n// Object.entries(icons).forEach(([k, v]) => (span.innerText += (prim.attributes || {})[k] ? v : \" \"));\n// span.className = \"material-symbols-outlined\";\n// elem.onclick = (evt) => {\n// let rows = [[\"name\", prim.name]]\n// .concat(Object.entries(prim.attributes))\n// .map(\n// ([k, v]) =>\n// `<tr><td>${encodeHtmlEntities(k)}</td><td>${encodeHtmlEntities(typeof v === \"object\" ? JSON.stringify(v) : v)}</td>`\n// )\n// .join(\"\");\n// document.querySelector(\".attributes .table\").innerHTML = `<table border=\"0\">${rows}</table>`;\n// evt.stopPropagation();\n// };\n// node.appendChild(elem);\n// (prim.children || []).forEach((p) => buildDomTree(p, elem));\n// }\nfunction composeAndRender() {\n if (scene) {\n scene.children = [];\n }\n // document.querySelector(\".tree\").innerHTML = \"\";\n if (datas.length === 0) {\n return;\n }\n let tree = null;\n let dataArray = datas.map((arr) => arr[1]);\n tree = compose3(dataArray);\n if (!tree) {\n console.error(\"No result from composition\");\n return;\n }\n traverseTree(tree, scene || init(), tree);\n if (autoCamera) {\n const boundingBox = new THREE.Box3();\n boundingBox.setFromObject(scene);\n if (!boundingBox.isEmpty()) {\n let avg = boundingBox.min.clone().add(boundingBox.max).multiplyScalar(0.5);\n let ext = boundingBox.max.clone().sub(boundingBox.min).length();\n camera.position.copy(avg.clone().add(new THREE.Vector3(1, 1, 1).normalize().multiplyScalar(ext)));\n camera.far = ext * 3;\n camera.updateProjectionMatrix();\n // controls.target.copy(avg);\n // controls.update();\n autoCamera = false;\n }\n }\n // buildDomTree(tree, document.querySelector(\".tree\"));\n // animate();\n}\n// function createLayerDom() {\n// document.querySelector(\".layers div\").innerHTML = \"\";\n// datas.forEach(([name, _], index) => {\n// const elem = document.createElement(\"div\");\n// elem.appendChild(document.createTextNode(name));\n// [\"\\u25B3\", \"\\u25BD\", \"\\xD7\"].reverse().forEach((lbl, cmd) => {\n// const btn = document.createElement(\"span\");\n// btn.onclick = (evt) => {\n// evt.stopPropagation();\n// if (cmd === 2) {\n// if (index > 0) {\n// [datas[index], datas[index - 1]] = [datas[index - 1], datas[index]];\n// }\n// } else if (cmd === 1) {\n// if (index < datas.length - 1) {\n// [datas[index], datas[index + 1]] = [datas[index + 1], datas[index]];\n// }\n// } else if (cmd === 0) {\n// datas.splice(index, 1);\n// }\n// composeAndRender();\n// createLayerDom();\n// };\n// btn.appendChild(document.createTextNode(lbl));\n// elem.appendChild(btn);\n// });\n// document.querySelector(\".layers div\").appendChild(elem);\n// });\n// }\n// function addModel(name, m) {\n// datas.push([name, m]);\n// createLayerDom();\n// composeAndRender();\n// }\n// function animate() {\n// requestAnimationFrame(animate);\n// controls.update();\n// renderer.render(scene, camera);\n// }\n// export { composeAndRender, addModel as default };\n\nexport function parse(m, name) {\n datas.push([name, m]);\n composeAndRender();\n return scene;\n}\nexport function clear() {\n scene = undefined;\n datas.length = 0;\n autoCamera = true;\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { FileLoader, Loader, Scene } from \"three\";\nimport { parse, clear } from \"./render.js\";\n\nclass IFCXLoader extends Loader<Scene> {\n override load(\n url: string,\n onLoad: (data: Scene) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (err: unknown) => void\n ) {\n const manager = this.manager;\n\n manager.itemStart(url);\n\n const _onLoad = (scene: Scene) => {\n onLoad(scene);\n manager.itemEnd(url);\n };\n\n const _onError = (e: unknown) => {\n if (onError) onError(e);\n else console.error(e);\n manager.itemError(url);\n manager.itemEnd(url);\n };\n\n const loader = new FileLoader(this.manager);\n\n loader.setPath(this.path);\n loader.setResponseType(\"json\");\n loader.setRequestHeader(this.requestHeader);\n loader.setWithCredentials(this.withCredentials);\n\n loader.load(url, (json) => this.parse(json, _onLoad, _onError), onProgress, onError);\n }\n\n parse(json: any, onLoad: (scene: Scene) => void, onError: (err: unknown) => void) {\n try {\n onLoad(parse(json));\n } catch (e) {\n onError(e);\n } finally {\n clear();\n }\n }\n}\n\nexport { IFCXLoader };\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { GLTFLoadingManager, GLTFLoadParams, Loader, ModelImpl, Viewer } from \"@inweb/viewer-three\";\nimport { IFCXLoader } from \"./IFCX/IFCXLoader\";\n\nexport class IFCXFileLoader extends Loader {\n public viewer: Viewer;\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n }\n\n override isSupport(file: any, format?: string): boolean {\n return (\n (typeof file === \"string\" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&\n /(ifcx)$/i.test(format)\n );\n }\n\n override async load(file: any, format?: string, params?: GLTFLoadParams): Promise<this> {\n const manager = new GLTFLoadingManager(file, params);\n\n const loader = new IFCXLoader(manager);\n loader.setPath(manager.path);\n loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);\n loader.setWithCredentials(params.withCredentials || loader.withCredentials);\n\n const progress = (event: ProgressEvent) => {\n const { lengthComputable, loaded, total } = event;\n const progress = lengthComputable ? loaded / total : 1;\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file });\n };\n\n const scene = await loader.loadAsync(manager.fileURL, progress);\n if (!this.viewer.scene) return this;\n\n let handle = 0;\n scene.traverse((object) => {\n object.userData = { handle, ...object.userData };\n handle++;\n });\n\n const modelImpl = new ModelImpl(scene);\n modelImpl.loader = this;\n modelImpl.viewer = this.viewer;\n\n this.viewer.scene.add(modelImpl.scene);\n this.viewer.models.push(modelImpl);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file });\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Loader, ModelImpl, Viewer } from \"@inweb/viewer-three\";\nimport { parse, clear } from \"./IFCX/render.js\";\n\nexport class IFCXCloudLoader extends Loader {\n public viewer: Viewer;\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n }\n\n override isSupport(file: any): boolean {\n return (\n typeof file === \"object\" &&\n typeof file.type === \"string\" &&\n typeof file.download === \"function\" &&\n /.ifcx$/i.test(file.type)\n );\n }\n\n override async load(file: any): Promise<this> {\n const progress = (progress: number) => {\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file });\n };\n\n const arrayBuffer = await file.download(progress, this.abortController.signal);\n if (!this.viewer.scene) return this;\n\n const textDecoder = new TextDecoder();\n const json = JSON.parse(textDecoder.decode(arrayBuffer));\n\n const scene = parse(json);\n clear();\n\n let handle = 0;\n scene.traverse((object: any) => {\n object.userData = { handle, ...object.userData };\n handle++;\n });\n\n const modelImpl = new ModelImpl(scene);\n modelImpl.loader = this;\n modelImpl.viewer = this.viewer;\n\n this.viewer.scene.add(modelImpl.scene);\n this.viewer.models.push(modelImpl);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file });\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { loaders } from \"@inweb/viewer-three\";\n\nimport { IFCXFileLoader } from \"./IFCXFileLoader\";\nimport { IFCXCloudLoader } from \"./IFCXCloudLoader\";\n\nloaders.registerLoader(\"ifcx-file\", (viewer: any) => new IFCXFileLoader(viewer));\nloaders.registerLoader(\"ifcx-cloud\", (viewer: any) => new IFCXCloudLoader(viewer));\n"],"names":["THREE","Box3","BufferAttribute","BufferGeometry","Color","Group","Line","LineBasicMaterial","Matrix4","Mesh","MeshBasicMaterial","PerspectiveCamera","Scene","Vector3","getChildByName","root","childName","skip","fragments","replace","split","i","shift","start","length","children","f","find","name","reverse","GetNode","node","path","parts","child","get","GetTail","GetHead","join","MakeNode","Map","attributes","ConvertToCompositionNode","inputNodes","compositionNode","inherits","forEach","Object","keys","inheritName","ih","attrName","MMSet","map","key","value","has","push","set","FindRootsOrCycles","nodes","dependencies","dependents","paths","perm","temp","visit","Error","deps","dep","roots","Set","indexOf","add","e","ConvertNodes","input","compositionNodes","CycleError","ExpandFirstRootInInput","ExpandNewNode","values","CreateArtificialRoot","pseudoRoot","ExpandNode","AddDataFromInput","inherit","classNode","subnode","attrID","attr","entries","delete","MMSet2","ToInputNodes","data","ifcxNode","SchemaValidationError","ValidateAttributeValue","desc","schemas","inheritedSchemaID","inheritedSchema","dataType","found","enumRestrictions","options","filter","option","objectRestrictions","hasOwn","Array","isArray","entry","arrayRestrictions","Validate","schemaID","schema","message","LoadIfcxFile","file","checkSchemas","createArtificialRoot","Federate","files","result","header","Prune","Collapse","deleteEmpty","empty","collapsed","TreeNodeToComposedObject","co","childNode","compname","quantityKind","postfix","String","fromCodePoint","compose3","federated","tree","scene","camera","datas","autoCamera","init","window","innerWidth","innerHeight","up","position","lookAt","HasAttr","createMaterialFromParent","parent","reference","material","color","transparent","opacity","materialNode","ref","createCurveFromJson","points","Float32Array","flat","geometry","setAttribute","lineMaterial","multiplyScalar","createMeshFromJson","indices","Uint16Array","setIndex","computeVertexNormals","meshMaterial","traverseTree","parentNode","undefined","elem","matrixAutoUpdate","matrixNode","matrix","transpose","composeAndRender","dataArray","arr","console","error","boundingBox","setFromObject","isEmpty","avg","min","clone","max","ext","sub","copy","normalize","far","updateProjectionMatrix","parse","m","clear","IFCXLoader","Loader","load","url","onLoad","onProgress","onError","manager","this","itemStart","_onLoad","itemEnd","_onError","itemError","loader","FileLoader","setPath","setResponseType","setRequestHeader","requestHeader","setWithCredentials","withCredentials","json","IFCXFileLoader","constructor","viewer","super","isSupport","format","globalThis","File","ArrayBuffer","test","params","GLTFLoadingManager","setCrossOrigin","crossOrigin","progress","event","lengthComputable","loaded","total","emitEvent","type","loadAsync","fileURL","handle","traverse","object","userData","modelImpl","ModelImpl","models","syncOptions","syncOverlay","update","IFCXCloudLoader","download","arrayBuffer","abortController","signal","textDecoder","TextDecoder","JSON","decode","loaders","registerLoader"],"mappings":";;;;AAmDA,MAAMA,QAAQ;IACZC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;;;AAIF,SAASC,eAAeC,MAAMC,WAAWC,OAAO;IAC9C,IAAIC,YAAYF,UAAUG,QAAQ,gBAAgB,IAAIC,MAAM;IAC5D,KAAK,IAAIC,IAAI,GAAGA,IAAIJ,QAAQI,GAAG;QAC7BH,UAAUI;AACd;IACE,IAAIC,QAAQR;IACZ,OAAOG,UAAUM,UAAUD,SAASA,MAAME,UAAU;QAElD,IAAIC,IAAIR,UAAUI;QAClBC,QAAQA,MAAME,SAASE,MAAMN,KAAMA,EAAEO,KAAKR,MAAM,KAAKS,UAAU,OAAOH;AAC1E;IACE,IAAIR,UAAUM,UAAU,GAAG;QACzB,OAAOD;AACX;AACA;;AAGA,SAASO,QAAQC,MAAMC;IACrB,IAAIA,SAAS,IAAI,OAAOD;IACxB,IAAIE,QAAQD,KAAKZ,MAAM;IACvB,IAAIc,QAAQH,KAAKN,SAASU,IAAIF,MAAM;IACpC,IAAIC,OAAO;QACT,IAAID,MAAMT,WAAW,GAAG;YACtB,OAAOU;AACb;QACI,OAAOJ,QAAQI,OAAOE,QAAQJ;AAClC,WAAS;QACL,OAAO;AACX;AACA;;AACA,SAASK,QAAQL;IACf,OAAOA,KAAKZ,MAAM,KAAK;AACzB;;AACA,SAASgB,QAAQJ;IACf,IAAIC,QAAQD,KAAKZ,MAAM;IACvBa,MAAMX;IACN,OAAOW,MAAMK,KAAK;AACpB;;AACA,SAASC,SAASR;IAChB,OAAO;QACLA;QACAN,UAA0B,IAAIe;QAC9BC,YAA4B,IAAID;;AAEpC;;AACA,SAASE,yBAAyBV,MAAMW;IACtC,IAAIC,kBAAkB;QACpBZ;QACAP,UAAU,CAAE;QACZoB,UAAU,CAAE;QACZJ,YAAY,CAAE;;IAEhBE,WAAWG,SAASf;QAClBgB,OAAOC,KAAKjB,KAAKN,UAAUqB,SAAS9B;YAClC4B,gBAAgBnB,SAAST,aAAae,KAAKN,SAAST;AAAU;QAEhE+B,OAAOC,KAAKjB,KAAKc,UAAUC,SAASG;YAClC,IAAIC,KAAKnB,KAAKc,SAASI;YACvB,IAAIC,OAAO,MAAM;uBACRN,gBAAgBC,SAASI;AACxC,mBAAa;gBACLL,gBAAgBC,SAASI,eAAeC;AAChD;AAAA;QAEIH,OAAOC,KAAKjB,KAAKU,YAAYK,SAASK;YACpCP,gBAAgBH,WAAWU,YAAYpB,KAAKU,WAAWU;AAAS;AAChE;IAEJ,OAAOP;AACT;;AACA,SAASQ,MAAMC,KAAKC,KAAKC;IACvB,IAAIF,IAAIG,IAAIF,MAAM;QAChBD,IAAIlB,IAAImB,MAAMG,KAAKF;AACvB,WAAS;QACLF,IAAIK,IAAIJ,KAAK,EAACC;AAClB;AACA;;AACA,SAASI,kBAAkBC;IACzB,IAAIC,eAA+B,IAAIrB;IACvC,IAAIsB,aAA6B,IAAItB;IACrCoB,MAAMd,SAAQ,CAACf,MAAMC;QACnBe,OAAOC,KAAKjB,KAAKc,UAAUC,SAASG;YAClCG,MAAMS,cAAc7B,MAAMD,KAAKc,SAASI;YACxCG,MAAMU,YAAY/B,KAAKc,SAASI,cAAcjB;AAAK;QAErDe,OAAOC,KAAKjB,KAAKN,UAAUqB,SAAS9B;YAClCoC,MAAMS,cAAc7B,MAAMD,KAAKN,SAAST;YACxCoC,MAAMU,YAAY/B,KAAKN,SAAST,YAAYgB;AAAK;AACjD;IAEJ,IAAI+B,QAAQ,KAAIH,MAAMZ;IACtB,IAAIgB,OAAO,CAAE;IACb,IAAIC,OAAO,CAAE;IACb,SAASC,MAAMlC;QACb,IAAIgC,KAAKhC,OAAO;QAChB,IAAIiC,KAAKjC,OAAO,MAAM,IAAImC,MAAM;QAChCF,KAAKjC,QAAQ;QACb,IAAIoC,OAAOP,aAAa1B,IAAIH;QAC5B,IAAIoC,MAAM;YACRA,KAAKtB,SAASuB,OAAQH,MAAMG;AAClC;QACIL,KAAKhC,QAAQ;AACjB;IACE,IAAIsC,QAAwB,IAAIC;IAChC;QACER,MAAMjB,SAASd;YACb,KAAK8B,WAAWN,IAAIxB,SAASA,KAAKwC,QAAQ,UAAU,GAAG;gBACrDF,MAAMG,IAAIzC;AAClB;YACMkC,MAAMlC;AAAK;AAEd,MAAC,OAAO0C;QACP,OAAO;AACX;IACE,OAAOJ;AACT;;AACA,SAASK,aAAaC;IACpB,IAAIC,mBAAmC,IAAIrC;IAC3C,KAAK,KAAKR,MAAMW,eAAeiC,OAAO;QACpCC,iBAAiBnB,IAAI1B,MAAMU,yBAAyBV,MAAMW;AAC9D;IACE,OAAOkC;AACT;;AACA,IAAIC,aAAa,cAAcX;;AAC/B,SAASY,uBAAuBnB;IAC9B,IAAIU,QAAQX,kBAAkBC;IAC9B,KAAKU,OAAO;QACV,MAAM,IAAIQ;AACd;IACE,OAAOE,cAAc,KAAIV,MAAMW,WAAU,IAAIrB;AAC/C;;AACA,SAASsB,qBAAqBtB;IAC5B,IAAIU,QAAQX,kBAAkBC;IAC9B,KAAKU,OAAO;QACV,MAAM,IAAIQ;AACd;IACE,IAAIK,aAAa;QACfpD,MAAM;QACNU,YAA4B,IAAID;QAChCf,UAA0B,IAAIe;;IAEhC8B,MAAMxB,SAAS/B;QACboE,WAAW1D,SAASiC,IAAI3C,MAAMiE,cAAcjE,MAAM6C;AAAO;IAE3D,OAAOuB;AACT;;AACA,SAASH,cAAcjD,MAAM6B;IAC3B,OAAOwB,WAAWrD,MAAMQ,SAASR,OAAO6B;AAC1C;;AACA,SAASwB,WAAWpD,MAAMD,MAAM6B;IAC9B,IAAIgB,QAAQhB,MAAMzB,IAAIH;IACtB,IAAI4C,OAAO;QACTS,iBAAiBT,OAAO7C,MAAM6B;AAClC;IACE7B,KAAKN,SAASqB,SAAQ,CAACZ,OAAON;QAC5BwD,WAAW,GAAGpD,QAAQJ,QAAQM,OAAO0B;AAAM;IAE7C,OAAO7B;AACT;;AACA,SAASsD,iBAAiBT,OAAO7C,MAAM6B;IACrCb,OAAOkC,OAAOL,MAAM/B,UAAUC,SAASwC;QACrC,IAAIC,YAAYP,cAAc3C,QAAQiD,UAAU1B;QAChD,IAAI4B,UAAU1D,QAAQyD,WAAWnD,QAAQkD;QACzC,KAAKE,SAAS,MAAM,IAAIrB,MAAM,gBAAgBmB;QAC9CE,QAAQ/D,SAASqB,SAAQ,CAACZ,OAAOlB;YAC/Be,KAAKN,SAASiC,IAAI1C,WAAWkB;AAAM;QAErC,KAAK,KAAKuD,QAAQC,SAASF,QAAQ/C,YAAY;YAC7CV,KAAKU,WAAWiB,IAAI+B,QAAQC;AAClC;AAAA;IAEE3C,OAAO4C,QAAQf,MAAMnD,UAAUqB,SAAQ,EAAE9B,WAAWkB;QAClD,IAAIA,UAAU,MAAM;YAClB,IAAIqD,YAAYP,cAAc3C,QAAQH,QAAQ0B;YAC9C,IAAI4B,UAAU1D,QAAQyD,WAAWnD,QAAQF;YACzC,KAAKsD,SAAS,MAAM,IAAIrB,MAAM,gBAAgBjC;YAC9CH,KAAKN,SAASiC,IAAI1C,WAAWwE;AACnC,eAAW;YACLzD,KAAKN,SAASmE,OAAO5E;AAC3B;AAAA;IAEE+B,OAAO4C,QAAQf,MAAMnC,YAAYK,SAAQ,EAAE2C,QAAQC;QACjD3D,KAAKU,WAAWiB,IAAI+B,QAAQC;AAAK;AAErC;;AAGA,SAASG,OAAOxC,KAAKC,KAAKC;IACxB,IAAIF,IAAIG,IAAIF,MAAM;QAChBD,IAAIlB,IAAImB,MAAMG,KAAKF;AACvB,WAAS;QACLF,IAAIK,IAAIJ,KAAK,EAACC;AAClB;AACA;;AACA,SAASuC,aAAaC;IACpB,IAAIpD,aAA6B,IAAIH;IACrCuD,KAAKjD,SAASkD;QACZ,IAAIjE,OAAO;YACTC,MAAMgE,SAAShE;YACfP,UAAUuE,SAASvE,WAAWuE,SAASvE,WAAW,CAAE;YACpDoB,UAAUmD,SAASnD,WAAWmD,SAASnD,WAAW,CAAE;YACpDJ,YAAYuD,SAASvD,aAAauD,SAASvD,aAAa,CAAE;;QAE5DoD,OAAOlD,YAAYZ,KAAKC,MAAMD;AAAK;IAErC,OAAOY;AACT;;AACA,IAAIsD,wBAAwB,cAAc9B;;AAC1C,SAAS+B,uBAAuBC,MAAM5C,OAAOvB,MAAMoE;IACjD,IAAID,KAAKtD,UAAU;QACjBsD,KAAKtD,SAASC,SAASuD;YACrB,IAAIC,kBAAkBF,QAAQC;YAC9B,KAAKC,iBAAiB;gBACpB,MAAM,IAAIL,sBAAsB,gCAAgCE,KAAKtD;AAC7E;YACMqD,uBAAuBI,gBAAgB/C,OAAOA,OAAOvB,MAAMoE;AAAQ;AAEzE;IACE,IAAID,KAAKI,aAAa,WAAW;QAC/B,WAAWhD,UAAU,WAAW;YAC9B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,UAAU;QACrC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,YAAY;QACvC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,QAAQ;QACnC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;QACI,IAAIiD,QAAQL,KAAKM,iBAAiBC,QAAQC,QAAQC,UAAWA,WAAWrD,QAAO/B,WAAW;QAC1F,KAAKgF,OAAO;YACV,MAAM,IAAIP,sBAAsB,aAAa1C,wBAAwB4C,KAAKM,iBAAiBC,QAAQpE,KAAK;AAC9G;AACA,WAAS,IAAI6D,KAAKI,aAAa,WAAW;QACtC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,QAAQ;QACnC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,YAAY;QACvC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;AACA,WAAS,IAAI4C,KAAKI,aAAa,UAAU;QACrC,WAAWhD,UAAU,UAAU;YAC7B,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;QACI,IAAI4C,KAAKU,oBAAoB;YAC3B9D,OAAOC,KAAKmD,KAAKU,mBAAmB5B,QAAQnC,SAASQ;gBACnD,KAAKP,OAAO+D,OAAOvD,OAAOD,MAAM;oBAC9B,MAAM,IAAI2C,sBAAsB,aAAa1C,sBAAsBD;AAC7E;gBACQ4C,uBAAuBC,KAAKU,mBAAmB5B,OAAO3B,MAAMC,MAAMD,MAAMtB,OAAO,MAAMsB,KAAK8C;AAAQ;AAE1G;AACA,WAAS,IAAID,KAAKI,aAAa,SAAS;QACpC,KAAKQ,MAAMC,QAAQzD,QAAQ;YACzB,MAAM,IAAI0C,sBAAsB,aAAa1C;AACnD;QACIA,MAAMT,SAASmE;YACbf,uBAAuBC,KAAKe,kBAAkB3D,OAAO0D,OAAOjF,OAAO,aAAaoE;AAAQ;AAE9F,WAAS;QACL,MAAM,IAAIH,sBAAsB,uBAAuBE,KAAKI;AAChE;AACA;;AACA,SAASY,SAASf,SAASzD;IACzBA,WAAWG,SAASf;QAClBgB,OAAOC,KAAKjB,KAAKU,YAAYK,SAASsE;YACpC,KAAKhB,QAAQgB,WAAW;gBACtB,MAAM,IAAInB,sBAAsB,mBAAmBmB,6BAA6BrF,KAAKC;AAC7F;YACM,IAAIqF,SAASjB,QAAQgB;YACrB,IAAI7D,QAAQxB,KAAKU,WAAW2E;YAC5B;gBACElB,uBAAuBmB,OAAO9D,OAAOA,OAAO,IAAI6C;AACjD,cAAC,OAAO1B;gBACP,IAAIA,aAAauB,uBAAuB;oBACtC,MAAM,IAAIA,sBAAsB,sBAAsBlE,KAAKC,sBAAsBoF,eAAe1C,EAAE4C;AAC5G,uBAAe;oBACL,MAAM5C;AAChB;AACA;AAAA;AACM;AAEN;;AACA,SAAS6C,aAAaC,MAAMC,eAAe,MAAMC,uBAAuB;IACtE,IAAI/E,aAAamD,aAAa0B,KAAKzB;IACnC,IAAIlB,mBAAmBF,aAAahC;IACpC;QACE,IAAI8E,cAAc;YAChBN,SAASK,KAAKpB,SAASvB;AAC7B;AACG,MAAC,OAAOH;QACP,MAAMA;AACV;IACE,IAAIgD,sBAAsB;QACxB,OAAOxC,qBAAqBL;AAChC,WAAS;QACL,OAAOE,uBAAuBF;AAClC;AACA;;AACA,SAAS8C,SAASC;IAChB,IAAIC,SAAS;QACXC,QAAQF,MAAM,GAAGE;QACjB1B,SAAS,CAAE;QACXL,MAAM;;IAER6B,MAAM9E,SAAS0E;QACbzE,OAAOC,KAAKwE,KAAKpB,SAAStD,SAASsE,YAAcS,OAAOzB,QAAQgB,YAAYI,KAAKpB,QAAQgB;AAAW;IAEtGQ,MAAM9E,SAAS0E;QACbA,KAAKzB,KAAKjD,SAASf,QAAS8F,OAAO9B,KAAKtC,KAAK1B;AAAM;IAErD,OAAOgG,MAAMF;AACf;;AACA,SAASG,SAASpE,OAAOqE,cAAc;IACrC,IAAIJ,SAAS;QACX7F,MAAM4B,MAAM,GAAG5B;QACfP,UAAU,CAAE;QACZoB,UAAU,CAAE;QACZJ,YAAY,CAAE;;IAEhBmB,MAAMd,SAASf;QACbgB,OAAOC,KAAKjB,KAAKN,UAAUqB,SAASlB;YAClCiG,OAAOpG,SAASG,QAAQG,KAAKN,SAASG;AAAK;QAE7CmB,OAAOC,KAAKjB,KAAKc,UAAUC,SAASlB;YAClCiG,OAAOhF,SAASjB,QAAQG,KAAKc,SAASjB;AAAK;QAE7CmB,OAAOC,KAAKjB,KAAKU,YAAYK,SAASlB;YACpCiG,OAAOpF,WAAWb,QAAQG,KAAKU,WAAWb;AAAK;AAC/C;IAEJ,IAAIqG,aAAa;QACf,IAAIC,QAAQ;QACZnF,OAAOC,KAAK6E,OAAOpG,UAAUqB,SAASlB;YACpC,IAAIiG,OAAOpG,SAASG,UAAU,MAAMsG,QAAQ;AAAK;QAEnDnF,OAAOC,KAAK6E,OAAOhF,UAAUC,SAASlB;YACpC,IAAIiG,OAAOhF,SAASjB,UAAU,MAAMsG,QAAQ;AAAK;QAEnDnF,OAAOC,KAAK6E,OAAOpF,YAAYK,SAASlB;YACtC,IAAIiG,OAAOpF,WAAWb,UAAU,MAAMsG,QAAQ;AAAK;QAErD,IAAIA,OAAO,OAAO;AACtB;IACE,OAAOL;AACT;;AACA,SAASE,MAAMP,MAAMS,cAAc;IACjC,IAAIJ,SAAS;QACXC,QAAQN,KAAKM;QACb1B,SAASoB,KAAKpB;QACdL,MAAM;;IAER,IAAIpD,aAAamD,aAAa0B,KAAKzB;IACnCpD,WAAWG,SAASc;QAClB,IAAIuE,YAAYH,SAASpE,OAAOqE;QAChC,IAAIE,WACFN,OAAO9B,KAAKtC,KAAK;YACfzB,MAAMmG,UAAUnG;YAChBP,UAAU0G,UAAU1G;YACpBoB,UAAUsF,UAAUtF;YACpBJ,YAAY0F,UAAU1F;;AACtB;IAEN,OAAOoF;AACT;;AAGA,SAASO,yBAAyBpG,MAAMD,MAAMqE;IAC5C,IAAIiC,KAAK;QACPzG,MAAMI;QACNS,YAAY,CAAE;QACdhB,UAAU;;IAEZM,KAAKN,SAASqB,SAAQ,CAACwF,WAAWtH;QAChCqH,GAAG5G,UAAUgC,KAAK2E,yBAAyB,GAAGpG,QAAQhB,aAAasH,WAAWlC;AAAS;IAEzFrE,KAAKU,WAAWK,SAAQ,CAAC4C,MAAMvC;QAC7B,IAAIuC,eAAeA,SAAS,aAAaqB,MAAMC,QAAQtB,OAAO;YAC5D3C,OAAOC,KAAK0C,MAAM5C,SAASyF;gBACzBF,GAAG5F,WAAW,GAAGU,aAAaoF,cAAc7C,KAAK6C;AAAS;AAElE,eAAW;YACL,IAAIlB,SAASjB,QAAQjD;YACrB,IAAIkE,UAAUA,OAAO9D,MAAMiF,cAAc;gBACvC,IAAIC,UAAU;gBACd,IAAID,eAAenB,OAAO9D,MAAMiF;gBAChC,IAAIA,iBAAiB,UAAU;oBAC7BC,UAAU;AACpB,uBAAe,IAAID,iBAAiB,UAAU;oBACpCC,UAAU,MAAMC,OAAOC,cAAc;AAC/C;gBACQN,GAAG5F,WAAWU,YAAY,GAAGuC,QAAQ+C;AAC7C,mBAAa;gBACLJ,GAAG5F,WAAWU,YAAYuC;AAClC;AACA;AAAA;IAEE,IAAI3C,OAAOC,KAAKqF,GAAG5F,YAAYjB,WAAW,UAAU6G,GAAG5F;IACvD,OAAO4F;AACT;;AACA,SAASO,SAAShB;IAChB,IAAIiB,YAAYlB,SAASC;IACzB,IAAIkB,OAAOvB,aAAasB,WAAW,MAAM;IACzC,OAAOT,yBAAyB,IAAIU,MAAMD,UAAUzC;AACtD;;AAKA,IAAI2C;;AACJ,IAAIC;;AACJ,IAAIC,QAAQ;;AACZ,IAAIC,aAAa;;AAEjB,SAASC;IACPJ,QAAQ,IAAI/I,MAAMY;IAClBoI,SAAS,IAAIhJ,MAAMW,kBAAkB,IAAIyI,OAAOC,aAAaD,OAAOE,aAAa,IAAK;IACtFN,OAAOO,GAAG7F,IAAI,GAAG,GAAG;IACpBsF,OAAOQ,SAAS9F,IAAI,IAAI,IAAI;IAC5BsF,OAAOS,OAAO,GAAG,GAAG;IAWpBV,MAAMtE,IAAIuE;IACV,OAAOD;AACT;;AACA,SAASW,QAAQ3H,MAAMoB;IACrB,KAAKpB,SAASA,KAAKU,YAAY,OAAO;IACtC,SAASV,KAAKU,WAAWU;AAC3B;;AAUA,SAASwG,yBAAyBC,QAAQ7I;IACxC,IAAI8I,YAAYD,OAAOnH,WAAW;IAClC,IAAIqH,WAAW;QACbC,OAAO,IAAI/J,MAAMI,MAAM,IAAK,IAAK;QACjC4J,aAAa;QACbC,SAAS;;IAEX,IAAIJ,WAAW;QACb,MAAMK,eAAepJ,eAAeC,MAAM8I,UAAUM;QACpD,IAAID,cAAc;YAChB,IAAIH,QAAQG,cAAczH,WAAW;YACrCqH,SAASC,QAAQ,IAAI/J,MAAMI,SAAS2J;YACpC,IAAIG,cAAczH,WAAW,+BAA+B;gBAC1DqH,SAASE,cAAc;gBACvBF,SAASG,UAAUC,aAAazH,WAAW;AACnD;AACA;AACA;IACE,OAAOqH;AACT;;AACA,SAASM,oBAAoBrI,MAAM6H,QAAQ7I;IACzC,IAAIsJ,SAAS,IAAIC,aAAavI,KAAKU,WAAW,qCAAqC8H;IACnF,MAAMC,WAAW,IAAIxK,MAAMG;IAC3BqK,SAASC,aAAa,YAAY,IAAIzK,MAAME,gBAAgBmK,QAAQ;IACpE,MAAMP,WAAWH,yBAAyBC,QAAQ7I;IAClD,IAAI2J,eAAe,IAAI1K,MAAMO,kBAAkB;WAAKuJ;;IACpDY,aAAaX,MAAMY,eAAe;IAClC,OAAO,IAAI3K,MAAMM,KAAKkK,UAAUE;AAClC;;AACA,SAASE,mBAAmB7I,MAAM6H,QAAQ7I;IACxC,IAAIsJ,SAAS,IAAIC,aAAavI,KAAKU,WAAW,8BAA8B8H;IAC5E,IAAIM,UAAU,IAAIC,YAAY/I,KAAKU,WAAW;IAC9C,MAAM+H,WAAW,IAAIxK,MAAMG;IAC3BqK,SAASC,aAAa,YAAY,IAAIzK,MAAME,gBAAgBmK,QAAQ;IACpEG,SAASO,SAAS,IAAI/K,MAAME,gBAAgB2K,SAAS;IACrDL,SAASQ;IACT,MAAMlB,WAAWH,yBAAyBC,QAAQ7I;IAClD,IAAIkK,eAAe,IAAIjL,MAAMU,kBAAkB;WAAKoJ;;IACpD,OAAO,IAAI9J,MAAMS,KAAK+J,UAAUS;AAClC;;AACA,SAASC,aAAanJ,MAAM6H,QAAQ7I,MAAMoK,aAAaC;IACrD,IAAIC,OAAO,IAAIrL,MAAMK;IACrB,IAAIqJ,QAAQ3H,MAAM,yCAAyC;QACzD,IAAIA,KAAKU,WAAW,4CAA4C,aAAa;YAC3E;AACN;AACG,WAAM,IAAIiH,QAAQ3H,MAAM,+BAA+B;QACtDsJ,OAAOT,mBAAmB7I,MAAMoJ,YAAYpK;AAC7C,WAAM,IAAI2I,QAAQ3H,MAAM,sCAAsC;QAC7DsJ,OAAOjB,oBAAoBrI,MAAMoJ,YAAYpK;AACjD;IACE6I,OAAOnF,IAAI4G;IACX,IAAItJ,SAAShB,MAAM;QACjBsK,KAAKC,mBAAmB;QACxB,IAAIC,aACFxJ,KAAKU,cAAcV,KAAKU,WAAW,6BAC/BV,KAAKU,WAAW,2BAA2B8H,SAC3C;QACN,IAAIgB,YAAY;YACd,IAAIC,SAAS,IAAIxL,MAAMQ;YACvBgL,OAAO9H,OAAO6H;YACdC,OAAOC;YACPJ,KAAKG,SAASA;AACpB;AACA;KACGzJ,KAAKN,YAAY,IAAIqB,SAASZ,SAAUgJ,aAAahJ,OAAOmJ,QAAQzB,QAAQ7I,MAAMgB;AACrF;;AAgCA,SAAS2J;IACP,IAAI3C,OAAO;QACTA,MAAMtH,WAAW;AACrB;IAEE,IAAIwH,MAAMzH,WAAW,GAAG;QACtB;AACJ;IACE,IAAIsH,OAAO;IACX,IAAI6C,YAAY1C,MAAM5F,KAAKuI,OAAQA,IAAI;IACvC9C,OAAOF,SAAS+C;IAChB,KAAK7C,MAAM;QACT+C,QAAQC,MAAM;QACd;AACJ;IACEZ,aAAapC,MAAMC,SAASI,QAAQL;IACpC,IAAII,YAAY;QACd,MAAM6C,cAAc,IAAI/L,MAAMC;QAC9B8L,YAAYC,cAAcjD;QAC1B,KAAKgD,YAAYE,WAAW;YAC1B,IAAIC,MAAMH,YAAYI,IAAIC,QAAQ3H,IAAIsH,YAAYM,KAAK1B,eAAe;YACtE,IAAI2B,MAAMP,YAAYM,IAAID,QAAQG,IAAIR,YAAYI,KAAK3K;YACvDwH,OAAOQ,SAASgD,KAAKN,IAAIE,QAAQ3H,IAAI,IAAIzE,MAAMa,QAAQ,GAAG,GAAG,GAAG4L,YAAY9B,eAAe2B;YAC3FtD,OAAO0D,MAAMJ,MAAM;YACnBtD,OAAO2D;YAGPzD,aAAa;AACnB;AACA;AAGA;;AA0CO,SAAS0D,MAAMC,GAAGjL;IACvBqH,MAAMxF,KAAK,EAAC7B,MAAMiL;IAClBnB;IACA,OAAO3C;AACT;;AACO,SAAS+D;IACd/D,QAAQqC;IACRnC,MAAMzH,SAAS;IACf0H,aAAa;AACf;;ACvqBA,MAAM6D,mBAAmBC;IACd,IAAAC,CACPC,KACAC,QACAC,YACAC;QAEA,MAAMC,UAAUC,KAAKD;QAErBA,QAAQE,UAAUN;QAElB,MAAMO,UAAW1E;YACfoE,OAAOpE;YACPuE,QAAQI,QAAQR;AAAI;QAGtB,MAAMS,WAAYjJ;YAChB,IAAI2I,SAASA,QAAQ3I,SAChBmH,QAAQC,MAAMpH;YACnB4I,QAAQM,UAAUV;YAClBI,QAAQI,QAAQR;AAAI;QAGtB,MAAMW,SAAS,IAAIC,WAAWP,KAAKD;QAEnCO,OAAOE,QAAQR,KAAKvL;QACpB6L,OAAOG,gBAAgB;QACvBH,OAAOI,iBAAiBV,KAAKW;QAC7BL,OAAOM,mBAAmBZ,KAAKa;QAE/BP,OAAOZ,KAAKC,MAAMmB,QAASd,KAAKX,MAAMyB,MAAMZ,SAASE,YAAWP,YAAYC;;IAG9E,KAAAT,CAAMyB,MAAWlB,QAAgCE;QAC/C;YACEF,OAAOP,MAAMyB;UACb,OAAO3J;YACP2I,QAAQ3I;UACA;YACRoI;;;;;ACvCA,MAAOwB,uBAAuBtB;IAGlC,WAAAuB,CAAYC;QACVC;QACAlB,KAAKiB,SAASA;;IAGP,SAAAE,CAAUlH,MAAWmH;QAC5B,eACUnH,SAAS,YAAYA,gBAAgBoH,WAAWC,QAAQrH,gBAAgBsH,gBAChF,WAAWC,KAAKJ;;IAIX,UAAM1B,CAAKzF,MAAWmH,QAAiBK;QAC9C,MAAM1B,UAAU,IAAI2B,mBAAmBzH,MAAMwH;QAE7C,MAAMnB,SAAS,IAAId,WAAWO;QAC9BO,OAAOE,QAAQT,QAAQtL;QACvB6L,OAAOqB,eAAeF,OAAOG,eAAetB,OAAOsB;QACnDtB,OAAOM,mBAAmBa,OAAOZ,mBAAmBP,OAAOO;QAE3D,MAAMgB,WAAYC;YAChB,OAAMC,kBAAEA,kBAAgBC,QAAEA,QAAMC,OAAEA,SAAUH;YAC5C,MAAMD,WAAWE,mBAAmBC,SAASC,QAAQ;YACrDjC,KAAKiB,OAAOiB,UAAU;gBAAEC,MAAM;gBAAoB3J,MAAMqJ;gBAAU5H;;AAAO;QAG3E,MAAMuB,cAAc8E,OAAO8B,UAAUrC,QAAQsC,SAASR;QACtD,KAAK7B,KAAKiB,OAAOzF,OAAO,OAAOwE;QAE/B,IAAIsC,SAAS;QACb9G,MAAM+G,UAAUC;YACdA,OAAOC,WAAW;gBAAEH;mBAAWE,OAAOC;;YACtCH;AAAQ;QAGV,MAAMI,YAAY,IAAIC,UAAUnH;QAChCkH,UAAUpC,SAASN;QACnB0C,UAAUzB,SAASjB,KAAKiB;QAExBjB,KAAKiB,OAAOzF,MAAMtE,IAAIwL,UAAUlH;QAChCwE,KAAKiB,OAAO2B,OAAO1M,KAAKwM;QAExB1C,KAAKiB,OAAO4B;QACZ7C,KAAKiB,OAAO6B;QACZ9C,KAAKiB,OAAO8B;QAEZ/C,KAAKiB,OAAOiB,UAAU;YAAEC,MAAM;YAAiB3J,MAAMgD;YAAOvB;;QAE5D,OAAO+F;;;;ACnDL,MAAOgD,wBAAwBvD;IAGnC,WAAAuB,CAAYC;QACVC;QACAlB,KAAKiB,SAASA;;IAGP,SAAAE,CAAUlH;QACjB,cACSA,SAAS,mBACTA,KAAKkI,SAAS,mBACdlI,KAAKgJ,aAAa,cACzB,UAAUzB,KAAKvH,KAAKkI;;IAIf,UAAMzC,CAAKzF;QAClB,MAAM4H,WAAYA;YAChB7B,KAAKiB,OAAOiB,UAAU;gBAAEC,MAAM;gBAAoB3J,MAAMqJ;gBAAU5H;;AAAO;QAG3E,MAAMiJ,oBAAoBjJ,KAAKgJ,SAASpB,UAAU7B,KAAKmD,gBAAgBC;QACvE,KAAKpD,KAAKiB,OAAOzF,OAAO,OAAOwE;QAE/B,MAAMqD,cAAc,IAAIC;QACxB,MAAMxC,OAAOyC,KAAKlE,MAAMgE,YAAYG,OAAON;QAE3C,MAAM1H,QAAQ6D,MAAMyB;QACpBvB;QAEA,IAAI+C,SAAS;QACb9G,MAAM+G,UAAUC;YACdA,OAAOC,WAAW;gBAAEH;mBAAWE,OAAOC;;YACtCH;AAAQ;QAGV,MAAMI,YAAY,IAAIC,UAAUnH;QAChCkH,UAAUpC,SAASN;QACnB0C,UAAUzB,SAASjB,KAAKiB;QAExBjB,KAAKiB,OAAOzF,MAAMtE,IAAIwL,UAAUlH;QAChCwE,KAAKiB,OAAO2B,OAAO1M,KAAKwM;QAExB1C,KAAKiB,OAAO4B;QACZ7C,KAAKiB,OAAO6B;QACZ9C,KAAKiB,OAAO8B;QAEZ/C,KAAKiB,OAAOiB,UAAU;YAAEC,MAAM;YAAiB3J,MAAMgD;YAAOvB;;QAE5D,OAAO+F;;;;AChDXyD,QAAQC,eAAe,cAAczC,UAAgB,IAAIF,eAAeE;;AACxEwC,QAAQC,eAAe,eAAezC,UAAgB,IAAI+B,gBAAgB/B"}
1
+ {"version":3,"file":"IFCXLoader.module.js","sources":["../../../plugins/loaders/IFCX/render.js","../../../plugins/loaders/IFCX/IFCXLoader.ts","../../../plugins/loaders/IFCXFileLoader.ts","../../../plugins/loaders/IFCXCloudLoader.ts","../../../plugins/loaders/IFCXLoader.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\n// Repository: https://github.com/buildingSMART/IFC5-development\n// Original File: docs/viewer/render.mjs\n// Commit SHA-1: 83a7ae862232c90065d1bd03fcd538315e7d2563\n// Commit Date: 20.05.2025 21:00:52\n\n// (C) buildingSMART International\n// published under MIT license\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable prefer-const */\n/* eslint-disable no-useless-catch */\n\nimport {\n Box3,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Line,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n PerspectiveCamera,\n Scene,\n Vector3,\n} from \"three\";\n\nconst THREE = {\n Box3,\n BufferAttribute,\n BufferGeometry,\n Color,\n Group,\n Line,\n LineBasicMaterial,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n PerspectiveCamera,\n Scene,\n Vector3,\n};\n\n// composed-object.ts\nfunction getChildByName(root, childName, skip = 0) {\n let fragments = childName.replace(/^<\\/|^\\/|>$/g, \"\").split(\"/\");\n for (let i = 0; i < skip; ++i) {\n fragments.shift();\n }\n let start = root;\n while (fragments.length && start && start.children) {\n // console.log(start, fragments[0]);\n let f = fragments.shift();\n start = start.children.find((i) => i.name.split(\"/\").reverse()[0] === f);\n }\n if (fragments.length == 0) {\n return start;\n }\n}\n\n// compose-alpha.ts\nfunction GetNode(node, path) {\n if (path === \"\") return node;\n let parts = path.split(\"/\");\n let child = node.children.get(parts[0]);\n if (child) {\n if (parts.length === 1) {\n return child;\n }\n return GetNode(child, GetTail(path));\n } else {\n return null;\n }\n}\nfunction GetHead(path) {\n return path.split(\"/\")[0];\n}\nfunction GetTail(path) {\n let parts = path.split(\"/\");\n parts.shift();\n return parts.join(\"/\");\n}\nfunction MakeNode(node) {\n return {\n node,\n children: /* @__PURE__ */ new Map(),\n attributes: /* @__PURE__ */ new Map(),\n };\n}\nfunction ConvertToCompositionNode(path, inputNodes) {\n let compositionNode = {\n path,\n children: {},\n inherits: {},\n attributes: {},\n };\n inputNodes.forEach((node) => {\n Object.keys(node.children).forEach((childName) => {\n compositionNode.children[childName] = node.children[childName];\n });\n Object.keys(node.inherits).forEach((inheritName) => {\n let ih = node.inherits[inheritName];\n if (ih === null) {\n delete compositionNode.inherits[inheritName];\n } else {\n compositionNode.inherits[inheritName] = ih;\n }\n });\n Object.keys(node.attributes).forEach((attrName) => {\n compositionNode.attributes[attrName] = node.attributes[attrName];\n });\n });\n return compositionNode;\n}\nfunction MMSet(map, key, value) {\n if (map.has(key)) {\n map.get(key)?.push(value);\n } else {\n map.set(key, [value]);\n }\n}\nfunction FindRootsOrCycles(nodes) {\n let dependencies = /* @__PURE__ */ new Map();\n let dependents = /* @__PURE__ */ new Map();\n nodes.forEach((node, path) => {\n Object.keys(node.inherits).forEach((inheritName) => {\n MMSet(dependencies, path, node.inherits[inheritName]);\n MMSet(dependents, node.inherits[inheritName], path);\n });\n Object.keys(node.children).forEach((childName) => {\n MMSet(dependencies, path, node.children[childName]);\n MMSet(dependents, node.children[childName], path);\n });\n });\n let paths = [...nodes.keys()];\n let perm = {};\n let temp = {};\n function visit(path) {\n if (perm[path]) return;\n if (temp[path]) throw new Error(`CYCLE!`);\n temp[path] = true;\n let deps = dependencies.get(path);\n if (deps) {\n deps.forEach((dep) => visit(dep));\n }\n perm[path] = true;\n }\n let roots = /* @__PURE__ */ new Set();\n try {\n paths.forEach((path) => {\n if (!dependents.has(path) && path.indexOf(\"/\") === -1) {\n roots.add(path);\n }\n visit(path);\n });\n } catch (e) {\n return null;\n }\n return roots;\n}\nfunction ConvertNodes(input) {\n let compositionNodes = /* @__PURE__ */ new Map();\n for (let [path, inputNodes] of input) {\n compositionNodes.set(path, ConvertToCompositionNode(path, inputNodes));\n }\n return compositionNodes;\n}\nvar CycleError = class extends Error {};\nfunction ExpandFirstRootInInput(nodes) {\n let roots = FindRootsOrCycles(nodes);\n if (!roots) {\n throw new CycleError();\n }\n return ExpandNewNode([...roots.values()][0], nodes);\n}\nfunction CreateArtificialRoot(nodes) {\n let roots = FindRootsOrCycles(nodes);\n if (!roots) {\n throw new CycleError();\n }\n let pseudoRoot = {\n node: \"\",\n attributes: /* @__PURE__ */ new Map(),\n children: /* @__PURE__ */ new Map(),\n };\n roots.forEach((root) => {\n pseudoRoot.children.set(root, ExpandNewNode(root, nodes));\n });\n return pseudoRoot;\n}\nfunction ExpandNewNode(node, nodes) {\n return ExpandNode(node, MakeNode(node), nodes);\n}\nfunction ExpandNode(path, node, nodes) {\n let input = nodes.get(path);\n if (input) {\n AddDataFromInput(input, node, nodes);\n }\n node.children.forEach((child, name) => {\n ExpandNode(`${path}/${name}`, child, nodes);\n });\n return node;\n}\nfunction AddDataFromInput(input, node, nodes) {\n Object.values(input.inherits).forEach((inherit) => {\n let classNode = ExpandNewNode(GetHead(inherit), nodes);\n let subnode = GetNode(classNode, GetTail(inherit));\n if (!subnode) throw new Error(`Unknown node ${inherit}`);\n subnode.children.forEach((child, childName) => {\n node.children.set(childName, child);\n });\n for (let [attrID, attr] of subnode.attributes) {\n node.attributes.set(attrID, attr);\n }\n });\n Object.entries(input.children).forEach(([childName, child]) => {\n if (child !== null) {\n let classNode = ExpandNewNode(GetHead(child), nodes);\n let subnode = GetNode(classNode, GetTail(child));\n if (!subnode) throw new Error(`Unknown node ${child}`);\n node.children.set(childName, subnode);\n } else {\n node.children.delete(childName);\n }\n });\n Object.entries(input.attributes).forEach(([attrID, attr]) => {\n node.attributes.set(attrID, attr);\n });\n}\n\n// workflow-alpha.ts\nfunction MMSet2(map, key, value) {\n if (map.has(key)) {\n map.get(key)?.push(value);\n } else {\n map.set(key, [value]);\n }\n}\nfunction ToInputNodes(data) {\n let inputNodes = /* @__PURE__ */ new Map();\n data.forEach((ifcxNode) => {\n let node = {\n path: ifcxNode.path,\n children: ifcxNode.children ? ifcxNode.children : {},\n inherits: ifcxNode.inherits ? ifcxNode.inherits : {},\n attributes: ifcxNode.attributes ? ifcxNode.attributes : {},\n };\n MMSet2(inputNodes, node.path, node);\n });\n return inputNodes;\n}\nvar SchemaValidationError = class extends Error {};\nfunction ValidateAttributeValue(desc, value, path, schemas) {\n if (desc.inherits) {\n desc.inherits.forEach((inheritedSchemaID) => {\n let inheritedSchema = schemas[inheritedSchemaID];\n if (!inheritedSchema) {\n throw new SchemaValidationError(`Unknown inherited schema id \"${desc.inherits}\"`);\n }\n ValidateAttributeValue(inheritedSchema.value, value, path, schemas);\n });\n }\n if (desc.dataType === \"Boolean\") {\n if (typeof value !== \"boolean\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type boolean`);\n }\n } else if (desc.dataType === \"String\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n } else if (desc.dataType === \"DateTime\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type date`);\n }\n } else if (desc.dataType === \"Enum\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n let found = desc.enumRestrictions.options.filter((option) => option === value).length === 1;\n if (!found) {\n throw new SchemaValidationError(`Expected \"${value}\" to be one of [${desc.enumRestrictions.options.join(\",\")}]`);\n }\n } else if (desc.dataType === \"Integer\") {\n if (typeof value !== \"number\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type int`);\n }\n } else if (desc.dataType === \"Real\") {\n if (typeof value !== \"number\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type real`);\n }\n } else if (desc.dataType === \"Relation\") {\n if (typeof value !== \"string\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type string`);\n }\n } else if (desc.dataType === \"Object\") {\n if (typeof value !== \"object\") {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type object`);\n }\n if (desc.objectRestrictions) {\n Object.keys(desc.objectRestrictions.values).forEach((key) => {\n if (!Object.hasOwn(value, key)) {\n throw new SchemaValidationError(`Expected \"${value}\" to have key ${key}`);\n }\n ValidateAttributeValue(desc.objectRestrictions.values[key], value[key], path + \".\" + key, schemas);\n });\n }\n } else if (desc.dataType === \"Array\") {\n if (!Array.isArray(value)) {\n throw new SchemaValidationError(`Expected \"${value}\" to be of type array`);\n }\n value.forEach((entry) => {\n ValidateAttributeValue(desc.arrayRestrictions.value, entry, path + \".<array>.\", schemas);\n });\n } else {\n throw new SchemaValidationError(`Unexpected datatype ${desc.dataType}`);\n }\n}\nfunction Validate(schemas, inputNodes) {\n inputNodes.forEach((node) => {\n Object.keys(node.attributes).forEach((schemaID) => {\n if (!schemas[schemaID]) {\n throw new SchemaValidationError(`Missing schema \"${schemaID}\" referenced by [\"${node.path}\"].attributes`);\n }\n let schema = schemas[schemaID];\n let value = node.attributes[schemaID];\n try {\n ValidateAttributeValue(schema.value, value, \"\", schemas);\n } catch (e) {\n if (e instanceof SchemaValidationError) {\n throw new SchemaValidationError(`Error validating [\"${node.path}\"].attributes[\"${schemaID}\"]: ${e.message}`);\n } else {\n throw e;\n }\n }\n });\n });\n}\nfunction LoadIfcxFile(file, checkSchemas = true, createArtificialRoot = false) {\n let inputNodes = ToInputNodes(file.data);\n let compositionNodes = ConvertNodes(inputNodes);\n try {\n if (checkSchemas) {\n Validate(file.schemas, compositionNodes);\n }\n } catch (e) {\n throw e;\n }\n if (createArtificialRoot) {\n return CreateArtificialRoot(compositionNodes);\n } else {\n return ExpandFirstRootInInput(compositionNodes);\n }\n}\nfunction Federate(files) {\n let result = {\n header: files[0].header,\n schemas: {},\n data: [],\n };\n files.forEach((file) => {\n Object.keys(file.schemas).forEach((schemaID) => (result.schemas[schemaID] = file.schemas[schemaID]));\n });\n files.forEach((file) => {\n file.data.forEach((node) => result.data.push(node));\n });\n return Prune(result);\n}\nfunction Collapse(nodes, deleteEmpty = false) {\n let result = {\n path: nodes[0].path,\n children: {},\n inherits: {},\n attributes: {},\n };\n nodes.forEach((node) => {\n Object.keys(node.children).forEach((name) => {\n result.children[name] = node.children[name];\n });\n Object.keys(node.inherits).forEach((name) => {\n result.inherits[name] = node.inherits[name];\n });\n Object.keys(node.attributes).forEach((name) => {\n result.attributes[name] = node.attributes[name];\n });\n });\n if (deleteEmpty) {\n let empty = true;\n Object.keys(result.children).forEach((name) => {\n if (result.children[name] !== null) empty = false;\n });\n Object.keys(result.inherits).forEach((name) => {\n if (result.inherits[name] !== null) empty = false;\n });\n Object.keys(result.attributes).forEach((name) => {\n if (result.attributes[name] !== null) empty = false;\n });\n if (empty) return null;\n }\n return result;\n}\nfunction Prune(file, deleteEmpty = false) {\n let result = {\n header: file.header,\n schemas: file.schemas,\n data: [],\n };\n let inputNodes = ToInputNodes(file.data);\n inputNodes.forEach((nodes) => {\n let collapsed = Collapse(nodes, deleteEmpty);\n if (collapsed)\n result.data.push({\n path: collapsed.path,\n children: collapsed.children,\n inherits: collapsed.inherits,\n attributes: collapsed.attributes,\n });\n });\n return result;\n}\n\n// compose-flattened.ts\nfunction TreeNodeToComposedObject(path, node, schemas) {\n let co = {\n name: path,\n attributes: {},\n children: [],\n };\n node.children.forEach((childNode, childName) => {\n co.children?.push(TreeNodeToComposedObject(`${path}/${childName}`, childNode, schemas));\n });\n node.attributes.forEach((attr, attrName) => {\n if (attr && typeof attr === \"object\" && !Array.isArray(attr)) {\n Object.keys(attr).forEach((compname) => {\n co.attributes[`${attrName}::${compname}`] = attr[compname];\n });\n } else {\n let schema = schemas[attrName];\n if (schema && schema.value.quantityKind) {\n let postfix = \"\";\n let quantityKind = schema.value.quantityKind;\n if (quantityKind === \"Length\") {\n postfix = \"m\";\n } else if (quantityKind === \"Volume\") {\n postfix = \"m\" + String.fromCodePoint(179);\n }\n co.attributes[attrName] = `${attr} ${postfix}`;\n } else {\n co.attributes[attrName] = attr;\n }\n }\n });\n if (Object.keys(co.attributes).length === 0) delete co.attributes;\n return co;\n}\nfunction compose3(files) {\n let federated = Federate(files);\n let tree = LoadIfcxFile(federated, true, true);\n return TreeNodeToComposedObject(\"\", tree, federated.schemas);\n}\n\n// render.ts\n// var controls;\n// var renderer;\nvar scene;\nvar camera;\nvar datas = [];\nvar autoCamera = true;\n// var THREE = window[\"THREE\"];\nfunction init() {\n scene = new THREE.Scene();\n camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 100);\n camera.up.set(0, 0, 1);\n camera.position.set(50, 50, 50);\n camera.lookAt(0, 0, 0);\n // const nd = document.querySelector(\".viewport\");\n // renderer = new THREE.WebGLRenderer({\n // alpha: true,\n // logarithmicDepthBuffer: true,\n // });\n // renderer.setSize(nd.offsetWidth, nd.offsetHeight);\n // controls = new THREE.OrbitControls(camera, renderer.domElement);\n // controls.enableDamping = true;\n // controls.dampingFactor = 0.25;\n // nd.appendChild(renderer.domElement);\n scene.add(camera);\n return scene;\n}\nfunction HasAttr(node, attrName) {\n if (!node || !node.attributes) return false;\n return !!node.attributes[attrName];\n}\nfunction FindChildWithAttr(node, attrName) {\n if (!node || !node.children) return void 0;\n for (let i = 0; i < node.children.length; i++) {\n if (HasAttr(node.children[i], attrName)) {\n return node.children[i];\n }\n }\n return void 0;\n}\nfunction createMaterialFromParent(parent, root) {\n let reference = parent.attributes[\"usd::usdshade::materialbindingapi::material::binding\"];\n let material = {\n color: new THREE.Color(0.6, 0.6, 0.6),\n transparent: false,\n opacity: 1,\n };\n if (reference) {\n const materialNode = getChildByName(root, reference.ref);\n if (materialNode) {\n let color = materialNode?.attributes[\"bsi::presentation::diffuseColor\"];\n material.color = new THREE.Color(...color);\n if (materialNode?.attributes[\"bsi::presentation::opacity\"]) {\n material.transparent = true;\n material.opacity = materialNode.attributes[\"bsi::presentation::opacity\"];\n }\n }\n }\n return material;\n}\nfunction createCurveFromJson(node, parent, root) {\n let points = new Float32Array(node.attributes[\"usd::usdgeom::basiscurves::points\"].flat());\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(points, 3));\n const material = createMaterialFromParent(parent, root);\n let lineMaterial = new THREE.LineBasicMaterial({ ...material });\n lineMaterial.color.multiplyScalar(0.8);\n return new THREE.Line(geometry, lineMaterial);\n}\nfunction createMeshFromJson(node, parent, root) {\n let points = new Float32Array(node.attributes[\"usd::usdgeom::mesh::points\"].flat());\n let indices = new Uint16Array(node.attributes[\"usd::usdgeom::mesh::faceVertexIndices\"]);\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute(\"position\", new THREE.BufferAttribute(points, 3));\n geometry.setIndex(new THREE.BufferAttribute(indices, 1));\n geometry.computeVertexNormals();\n const material = createMaterialFromParent(parent, root);\n let meshMaterial = new THREE.MeshBasicMaterial({ ...material });\n return new THREE.Mesh(geometry, meshMaterial);\n}\nfunction traverseTree(node, parent, root, parentNode = void 0) {\n let elem = new THREE.Group();\n if (HasAttr(node, \"usd::usdgeom::visibility::visibility\")) {\n if (node.attributes[\"usd::usdgeom::visibility::visibility\"] === \"invisible\") {\n return;\n }\n } else if (HasAttr(node, \"usd::usdgeom::mesh::points\")) {\n elem = createMeshFromJson(node, parentNode, root);\n } else if (HasAttr(node, \"usd::usdgeom::basiscurves::points\")) {\n elem = createCurveFromJson(node, parentNode, root);\n }\n parent.add(elem);\n if (node !== root) {\n elem.matrixAutoUpdate = false;\n let matrixNode =\n node.attributes && node.attributes[\"usd::xformop::transform\"]\n ? node.attributes[\"usd::xformop::transform\"].flat()\n : null;\n if (matrixNode) {\n let matrix = new THREE.Matrix4();\n matrix.set(...matrixNode);\n matrix.transpose();\n elem.matrix = matrix;\n }\n }\n (node.children || []).forEach((child) => traverseTree(child, elem || parent, root, node));\n}\n// function encodeHtmlEntities(str) {\n// const div = document.createElement(\"div\");\n// div.textContent = str;\n// return div.innerHTML;\n// }\n// var icons = {\n// \"usd::usdgeom::mesh::points\": \"deployed_code\",\n// \"usd::usdgeom::basiscurves::points\": \"line_curve\",\n// \"usd::usdshade::material::outputs::surface.connect\": \"line_style\",\n// };\n// function buildDomTree(prim, node) {\n// const elem = document.createElement(\"div\");\n// let span;\n// elem.appendChild(document.createTextNode(prim.name ? prim.name.split(\"/\").reverse()[0] : \"root\"));\n// elem.appendChild((span = document.createElement(\"span\")));\n// Object.entries(icons).forEach(([k, v]) => (span.innerText += (prim.attributes || {})[k] ? v : \" \"));\n// span.className = \"material-symbols-outlined\";\n// elem.onclick = (evt) => {\n// let rows = [[\"name\", prim.name]]\n// .concat(Object.entries(prim.attributes))\n// .map(\n// ([k, v]) =>\n// `<tr><td>${encodeHtmlEntities(k)}</td><td>${encodeHtmlEntities(typeof v === \"object\" ? JSON.stringify(v) : v)}</td>`\n// )\n// .join(\"\");\n// document.querySelector(\".attributes .table\").innerHTML = `<table border=\"0\">${rows}</table>`;\n// evt.stopPropagation();\n// };\n// node.appendChild(elem);\n// (prim.children || []).forEach((p) => buildDomTree(p, elem));\n// }\nfunction composeAndRender() {\n if (scene) {\n scene.children = [];\n }\n // document.querySelector(\".tree\").innerHTML = \"\";\n if (datas.length === 0) {\n return;\n }\n let tree = null;\n let dataArray = datas.map((arr) => arr[1]);\n tree = compose3(dataArray);\n if (!tree) {\n console.error(\"No result from composition\");\n return;\n }\n traverseTree(tree, scene || init(), tree);\n if (autoCamera) {\n const boundingBox = new THREE.Box3();\n boundingBox.setFromObject(scene);\n if (!boundingBox.isEmpty()) {\n let avg = boundingBox.min.clone().add(boundingBox.max).multiplyScalar(0.5);\n let ext = boundingBox.max.clone().sub(boundingBox.min).length();\n camera.position.copy(avg.clone().add(new THREE.Vector3(1, 1, 1).normalize().multiplyScalar(ext)));\n camera.far = ext * 3;\n camera.updateProjectionMatrix();\n // controls.target.copy(avg);\n // controls.update();\n autoCamera = false;\n }\n }\n // buildDomTree(tree, document.querySelector(\".tree\"));\n // animate();\n}\n// function createLayerDom() {\n// document.querySelector(\".layers div\").innerHTML = \"\";\n// datas.forEach(([name, _], index) => {\n// const elem = document.createElement(\"div\");\n// elem.appendChild(document.createTextNode(name));\n// [\"\\u25B3\", \"\\u25BD\", \"\\xD7\"].reverse().forEach((lbl, cmd) => {\n// const btn = document.createElement(\"span\");\n// btn.onclick = (evt) => {\n// evt.stopPropagation();\n// if (cmd === 2) {\n// if (index > 0) {\n// [datas[index], datas[index - 1]] = [datas[index - 1], datas[index]];\n// }\n// } else if (cmd === 1) {\n// if (index < datas.length - 1) {\n// [datas[index], datas[index + 1]] = [datas[index + 1], datas[index]];\n// }\n// } else if (cmd === 0) {\n// datas.splice(index, 1);\n// }\n// composeAndRender();\n// createLayerDom();\n// };\n// btn.appendChild(document.createTextNode(lbl));\n// elem.appendChild(btn);\n// });\n// document.querySelector(\".layers div\").appendChild(elem);\n// });\n// }\n// function addModel(name, m) {\n// datas.push([name, m]);\n// createLayerDom();\n// composeAndRender();\n// }\n// function animate() {\n// requestAnimationFrame(animate);\n// controls.update();\n// renderer.render(scene, camera);\n// }\n// export { composeAndRender, addModel as default };\n\nexport function parse(m, name) {\n datas.push([name, m]);\n composeAndRender();\n return scene;\n}\nexport function clear() {\n scene = undefined;\n datas.length = 0;\n autoCamera = true;\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2024, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { FileLoader, Loader, Scene } from \"three\";\nimport { parse, clear } from \"./render.js\";\n\nclass IFCXLoader extends Loader<Scene> {\n override load(\n url: string,\n onLoad: (data: Scene) => void,\n onProgress?: (event: ProgressEvent) => void,\n onError?: (err: unknown) => void\n ) {\n const manager = this.manager;\n\n manager.itemStart(url);\n\n const _onLoad = (scene: Scene) => {\n onLoad(scene);\n manager.itemEnd(url);\n };\n\n const _onError = (e: unknown) => {\n if (onError) onError(e);\n else console.error(e);\n manager.itemError(url);\n manager.itemEnd(url);\n };\n\n const loader = new FileLoader(this.manager);\n\n loader.setPath(this.path);\n loader.setResponseType(\"json\");\n loader.setRequestHeader(this.requestHeader);\n loader.setWithCredentials(this.withCredentials);\n\n loader.load(url, (json) => this.parse(json, _onLoad, _onError), onProgress, onError);\n }\n\n parse(json: any, onLoad: (scene: Scene) => void, onError: (err: unknown) => void) {\n try {\n onLoad(parse(json));\n } catch (e) {\n onError(e);\n } finally {\n clear();\n }\n }\n}\n\nexport { IFCXLoader };\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { GLTFLoadingManager, GLTFLoadParams, Loader, ModelImpl, Viewer } from \"@inweb/viewer-three\";\nimport { IFCXLoader } from \"./IFCX/IFCXLoader\";\n\nexport class IFCXFileLoader extends Loader {\n public viewer: Viewer;\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n }\n\n override isSupport(file: any, format?: string): boolean {\n return (\n (typeof file === \"string\" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&\n /(ifcx)$/i.test(format)\n );\n }\n\n override async load(file: any, format?: string, params?: GLTFLoadParams): Promise<this> {\n const manager = new GLTFLoadingManager(file, params);\n\n const loader = new IFCXLoader(manager);\n loader.setPath(manager.path);\n loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);\n loader.setWithCredentials(params.withCredentials || loader.withCredentials);\n\n const progress = (event: ProgressEvent) => {\n const { lengthComputable, loaded, total } = event;\n const progress = lengthComputable ? loaded / total : 1;\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file });\n };\n\n const scene = await loader.loadAsync(manager.fileURL, progress);\n if (!this.viewer.scene) return this;\n\n let handle = 0;\n scene.traverse((object) => {\n object.userData = { handle, ...object.userData };\n handle++;\n });\n\n const modelImpl = new ModelImpl(scene);\n modelImpl.loader = this;\n modelImpl.viewer = this.viewer;\n\n this.viewer.scene.add(scene);\n this.viewer.models.push(modelImpl);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file });\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { Loader, ModelImpl, Viewer } from \"@inweb/viewer-three\";\nimport { parse, clear } from \"./IFCX/render.js\";\n\nexport class IFCXCloudLoader extends Loader {\n public viewer: Viewer;\n\n constructor(viewer: Viewer) {\n super();\n this.viewer = viewer;\n }\n\n override isSupport(file: any): boolean {\n return (\n typeof file === \"object\" &&\n typeof file.type === \"string\" &&\n typeof file.download === \"function\" &&\n /.ifcx$/i.test(file.type)\n );\n }\n\n override async load(file: any): Promise<this> {\n const progress = (progress: number) => {\n this.viewer.emitEvent({ type: \"geometryprogress\", data: progress, file });\n };\n\n const arrayBuffer = await file.download(progress, this.abortController.signal);\n if (!this.viewer.scene) return this;\n\n const textDecoder = new TextDecoder();\n const json = JSON.parse(textDecoder.decode(arrayBuffer));\n\n const scene = parse(json);\n clear();\n\n let handle = 0;\n scene.traverse((object: any) => {\n object.userData = { handle, ...object.userData };\n handle++;\n });\n\n const modelImpl = new ModelImpl(scene);\n modelImpl.loader = this;\n modelImpl.viewer = this.viewer;\n\n this.viewer.scene.add(scene);\n this.viewer.models.push(modelImpl);\n\n this.viewer.syncOptions();\n this.viewer.syncOverlay();\n this.viewer.update();\n\n this.viewer.emitEvent({ type: \"databasechunk\", data: scene, file });\n\n return this;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { loaders } from \"@inweb/viewer-three\";\n\nimport { IFCXFileLoader } from \"./IFCXFileLoader\";\nimport { IFCXCloudLoader } from \"./IFCXCloudLoader\";\n\nloaders.registerLoader(\"ifcx-file\", (viewer: any) => new IFCXFileLoader(viewer));\nloaders.registerLoader(\"ifcx-cloud\", (viewer: any) => new IFCXCloudLoader(viewer));\n"],"names":["THREE","Box3","BufferAttribute","BufferGeometry","Color","Group","Line","LineBasicMaterial","Matrix4","Mesh","MeshBasicMaterial","PerspectiveCamera","Scene","Vector3","getChildByName","root","childName","skip","fragments","replace","split","i","shift","start","length","children","f","find","name","reverse","GetNode","node","path","parts","child","get","GetTail","GetHead","join","MakeNode","Map","attributes","ConvertToCompositionNode","inputNodes","compositionNode","inherits","forEach","Object","keys","inheritName","ih","attrName","MMSet","map","key","value","has","push","set","FindRootsOrCycles","nodes","dependencies","dependents","paths","perm","temp","visit","Error","deps","dep","roots","Set","indexOf","add","e","ConvertNodes","input","compositionNodes","CycleError","ExpandFirstRootInInput","ExpandNewNode","values","CreateArtificialRoot","pseudoRoot","ExpandNode","AddDataFromInput","inherit","classNode","subnode","attrID","attr","entries","delete","MMSet2","ToInputNodes","data","ifcxNode","SchemaValidationError","ValidateAttributeValue","desc","schemas","inheritedSchemaID","inheritedSchema","dataType","found","enumRestrictions","options","filter","option","objectRestrictions","hasOwn","Array","isArray","entry","arrayRestrictions","Validate","schemaID","schema","message","LoadIfcxFile","file","checkSchemas","createArtificialRoot","Federate","files","result","header","Prune","Collapse","deleteEmpty","empty","collapsed","TreeNodeToComposedObject","co","childNode","compname","quantityKind","postfix","String","fromCodePoint","compose3","federated","tree","scene","camera","datas","autoCamera","init","window","innerWidth","innerHeight","up","position","lookAt","HasAttr","createMaterialFromParent","parent","reference","material","color","transparent","opacity","materialNode","ref","createCurveFromJson","points","Float32Array","flat","geometry","setAttribute","lineMaterial","multiplyScalar","createMeshFromJson","indices","Uint16Array","setIndex","computeVertexNormals","meshMaterial","traverseTree","parentNode","undefined","elem","matrixAutoUpdate","matrixNode","matrix","transpose","composeAndRender","dataArray","arr","console","error","boundingBox","setFromObject","isEmpty","avg","min","clone","max","ext","sub","copy","normalize","far","updateProjectionMatrix","parse","m","clear","IFCXLoader","Loader","load","url","onLoad","onProgress","onError","manager","this","itemStart","_onLoad","itemEnd","_onError","itemError","loader","FileLoader","setPath","setResponseType","setRequestHeader","requestHeader","setWithCredentials","withCredentials","json","IFCXFileLoader","constructor","viewer","super","isSupport","format","globalThis","File","ArrayBuffer","test","params","GLTFLoadingManager","setCrossOrigin","crossOrigin","progress","event","lengthComputable","loaded","total","emitEvent","type","loadAsync","fileURL","handle","traverse","object","userData","modelImpl","ModelImpl","models","syncOptions","syncOverlay","update","IFCXCloudLoader","download","arrayBuffer","abortController","signal","textDecoder","TextDecoder","JSON","decode","loaders","registerLoader"],"mappings":"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"}
@@ -60198,7 +60198,7 @@ void main() {
60198
60198
  if (sceneCamera) {
60199
60199
  this.viewer.camera = sceneCamera.clone();
60200
60200
  this.viewer.camera.up.set(0, 0, 1);
60201
- this.viewer.camera.scale.set(1, 1, 1); // <- visualize fix
60201
+ this.viewer.camera.scale.set(1, 1, 1); // <- Visualize fix
60202
60202
  }
60203
60203
  const camera = this.viewer.camera;
60204
60204
  if (camera.isPerspectiveCamera) {
@@ -67046,9 +67046,7 @@ void main() {
67046
67046
  // By use of this software, its documentation or related materials, you
67047
67047
  // acknowledge and accept the above terms.
67048
67048
  ///////////////////////////////////////////////////////////////////////////////
67049
- /**
67050
- * Basic model implementation.
67051
- */
67049
+ // Basic model implementation.
67052
67050
  class ModelImpl {
67053
67051
  constructor(scene) {
67054
67052
  this.handle = "1";
@@ -67256,7 +67254,7 @@ void main() {
67256
67254
  const modelImpl = new ModelImpl(gltf.scene);
67257
67255
  modelImpl.loader = this;
67258
67256
  modelImpl.viewer = this.viewer;
67259
- this.viewer.scene.add(modelImpl.scene);
67257
+ this.viewer.scene.add(gltf.scene);
67260
67258
  this.viewer.models.push(modelImpl);
67261
67259
  this.viewer.syncOptions();
67262
67260
  this.viewer.syncOverlay();
@@ -67288,9 +67286,7 @@ void main() {
67288
67286
  // By use of this software, its documentation or related materials, you
67289
67287
  // acknowledge and accept the above terms.
67290
67288
  ///////////////////////////////////////////////////////////////////////////////
67291
- /**
67292
- * Dynamic model implementation.
67293
- */
67289
+ // Dynamic model implementation.
67294
67290
  class DynamicModelImpl extends ModelImpl {
67295
67291
  getExtents(target) {
67296
67292
  return target.union(this.gltfLoader.getTotalGeometryExtent());
@@ -69517,12 +69513,13 @@ void main() {
69517
69513
  * 1. Define a loader class implements {@link ILoader}.
69518
69514
  * 2. Define a constructor with a `viewer` parameter.
69519
69515
  * 3. Override {@link ILoader.isSupport} and сheck if the loader can load the specified file.
69520
- * 4. Override {@link ILoader.load} and define the logic for loading the model from the file.
69516
+ * 4. Override {@link ILoader.load} and define the logic for loading the scene from the file.
69521
69517
  *
69522
69518
  * The loader should do:
69523
69519
  *
69524
- * - Load model from file. The model must be a Three.js object of type `Object3D` or a descendant of it.
69525
- * - Add model to the viewer `scene` and `models` list.
69520
+ * - Load scene from file. The scene must be a Three.js object of type `Object3D` or a descendant of it.
69521
+ * - Add scene to the viewer `scene`.
69522
+ * - Create `ModelImpl` for the scene and to the viewer `models` list.
69526
69523
  * - Synchronize viewer options and overlay.
69527
69524
  * - Update the viewer.
69528
69525
  *
@@ -69530,15 +69527,14 @@ void main() {
69530
69527
  *
69531
69528
  * - `geometryprogress` - during loading. If progress is not supported, emit it once with a value of 100%
69532
69529
  * after the load is complete.
69533
- * - `databasechunk` - when model is loaded and ready to render.
69530
+ * - `databasechunk` - when scene is loaded and ready to render.
69534
69531
  * 5. Override {@link ILoader.dispose} and release loader resources, if required.
69535
69532
  * 6. Register loader provider in the loaders registry by calling the {@link loaders.registerLoader}.
69536
69533
  *
69537
69534
  * @example Implementing a custom loader.
69538
69535
  *
69539
69536
  * ```javascript
69540
- * import { Loader } from "@inweb/viewer-core";
69541
- * import { loaders, Viewer } from "@inweb/viewer-three";
69537
+ * import { loaders, Loader, ModelImpl, Viewer } from "@inweb/viewer-three";
69542
69538
  *
69543
69539
  * class MyLoader extends Loader {
69544
69540
  * public viewer: Viewer;
@@ -69556,16 +69552,20 @@ void main() {
69556
69552
  * override load(file, format, params): Promise<this> {
69557
69553
  *
69558
69554
  * // place custom loading logic here
69559
- * const model = ...;
69555
+ * const scene = ...;
69560
69556
  *
69561
- * this.viewer.scene.add(model);
69562
- * this.viewer.models.push(model);
69557
+ * const modelImpl = new ModelImpl(scene);
69558
+ * modelImpl.loader = this;
69559
+ * modelImpl.viewer = this.viewer;
69560
+ *
69561
+ * this.viewer.scene.add(scene);
69562
+ * this.viewer.models.push(modelImpl);
69563
69563
  *
69564
69564
  * this.viewer.syncOptions();
69565
69565
  * this.viewer.syncOverlay();
69566
69566
  * this.viewer.update();
69567
69567
  *
69568
- * this.viewer.emitEvent({ type: "databasechunk", data: model, file });
69568
+ * this.viewer.emitEvent({ type: "databasechunk", data: scene, file });
69569
69569
  *
69570
69570
  * return Promise.resove(this);
69571
69571
  * };
@@ -82048,7 +82048,7 @@ void main() {
82048
82048
  getWidth() {
82049
82049
  return this._ref.width();
82050
82050
  }
82051
- getHeigth() {
82051
+ getHeight() {
82052
82052
  return this._ref.height();
82053
82053
  }
82054
82054
  setWidth(w) {
@@ -83071,7 +83071,7 @@ void main() {
83071
83071
  const wcsRightLowerPoint = this._worldTransformer.screenToWorld(rightLowerPoint);
83072
83072
  this._ref.setAttr("wcsEnd", wcsRightLowerPoint);
83073
83073
  }
83074
- getHeigth() {
83074
+ getHeight() {
83075
83075
  return this._ref.height();
83076
83076
  }
83077
83077
  setHeight(h) {
@@ -84160,29 +84160,20 @@ void main() {
84160
84160
  * nothing.
84161
84161
  *
84162
84162
  * This method requires a `Client` instance to be specified to load file from the Open Cloud Server.
84163
- * The file geometry data on the Open Cloud Server must be converted into a format siutable for the
84164
- * viewer, otherwise an exception will be thrown.
84163
+ * The file geometry data on the Open Cloud Server must be converted into a `gltf` format, otherwise an
84164
+ * exception will be thrown.
84165
84165
  *
84166
84166
  * For files from Open Cloud Server, the default model will be loaded. If there is no default model,
84167
84167
  * first availiable model will be loaded. If no models are found in the file, an exception will be
84168
84168
  * thrown.
84169
84169
  *
84170
- * The file extension is used to determine the file format. For a `ArrayBuffer`, `Blob` and `Data URL`,
84171
- * a file format must be specified using `params.format` parameter (see below). If no appropriate
84170
+ * For URLs, the file extension is used to determine the file format. For a `ArrayBuffer` and `Data
84171
+ * URL`, a file format must be specified using `params.format` parameter (see below). If no appropriate
84172
84172
  * loader is found for the specified format, an exception will be thrown.
84173
84173
  *
84174
84174
  * If there was an active dragger before opening the file, it will be deactivated. After opening the
84175
84175
  * file, you must manually activate the required dragger.
84176
84176
  *
84177
- * To open a large files, enable {@link IOptions.enablePartialMode | partial streaming} mode before
84178
- * opening. For example:
84179
- *
84180
- * ```javascript
84181
- * viewer.options.enableStreamingMode = true;
84182
- * viewer.options.enablePartialMode = true;
84183
- * await viewer.open(file);
84184
- * ```
84185
- *
84186
84177
  * Fires:
84187
84178
  *
84188
84179
  * - {@link OpenEvent | open}
@@ -84193,31 +84184,38 @@ void main() {
84193
84184
  * - {@link GeometryEndEvent | geometryend}
84194
84185
  * - {@link GeometryErrorEvent | geometryerror}
84195
84186
  *
84196
- * @param file - File to load.
84187
+ * @param file - File to load. Can be one of:
84188
+ *
84189
+ * - `File`, `Assembly` or `Model` instance from the Open Cloud Server
84190
+ * - File `URL` string
84191
+ * - {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string
84192
+ * - {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object
84193
+ * - {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}
84194
+ * object
84195
+ *
84197
84196
  * @param params - Loading parameters.
84198
- * @param params.format - File format string. Required when loading a file as `ArrayBuffer`, `Blob` or
84199
- * `Data URL`.
84197
+ * @param params.format - File format string. Required when loading a file as `ArrayBuffer` or `Data
84198
+ * URL`.
84200
84199
  * @param params.mode - File opening mode. Can be one of:
84201
84200
  *
84202
84201
  * - `open` - Unloads an open file and opens a new one. This is default mode.
84203
84202
  * - `append` - Appends a file to an already open file.
84204
84203
  *
84205
- * @param params.externalFiles - External resource map such as binary data buffers or textures. Each
84206
- * resource should be represented by a `uri` and a corresponding resource URL, or
84207
- * {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object, or
84208
- * {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer},
84209
- * or {@link https://developer.mozilla.org/docs/Web/API/Blob/Blob | Blob}, or
84210
- * {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string,
84211
- * @param params.path - The base path from which additional resources will be loaded. If not defined,
84212
- * the base path of the file URL will be used.
84213
84204
  * @param params.requestHeader - The
84214
84205
  * {@link https://developer.mozilla.org/docs/Glossary/Request_header | request header} used in HTTP
84215
84206
  * request.
84216
- * @param params.crossOrigin - The crossOrigin string to implement CORS for loading the url from a
84217
- * different domain that allows CORS. Default is `anonymous`.
84218
- * @param params.withCredentials - Whether the XMLHttpRequest uses credentials such as cookies,
84207
+ * @param params.withCredentials - Whether the HTTP request uses credentials such as cookies,
84219
84208
  * authorization headers or TLS client certificates. See
84220
84209
  * {@link https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/withCredentials | XMLHttpRequest.withCredentials}.
84210
+ * @param params.path - The base path from which external resources such as binary data buffers, images
84211
+ * or textures will be loaded. If not defined, the base path of the file URL will be used.
84212
+ * @param params.externalFiles - External resource map. Each resource should be represented by a `uri`
84213
+ * and a corresponding resource URL, or
84214
+ * {@link https://developer.mozilla.org/docs/Web/HTTP/Basics_of_HTTP/Data_URIs | Data URL} string, or
84215
+ * {@link https://developer.mozilla.org/docs/Web/API/File | Web API File} object, or
84216
+ * {@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer | ArrayBuffer}.
84217
+ * @param params.crossOrigin - The crossOrigin string to implement CORS for loading the external
84218
+ * resources from a different domain that allows CORS. Default is `anonymous`.
84221
84219
  */
84222
84220
  async open(file, params = {}) {
84223
84221
  if (!this.renderer)
@@ -84263,6 +84261,7 @@ void main() {
84263
84261
  * @deprecated
84264
84262
  */
84265
84263
  openGltfFile(file, externalFiles, params = {}) {
84264
+ console.warn("Viewer.openGltfFile() has been deprecated since 26.4 and will be removed in a future release, use Viewer.open() instead.");
84266
84265
  return this.open(file, { ...params, format: "gltf", externalFiles });
84267
84266
  }
84268
84267
  /**
@@ -84271,6 +84270,7 @@ void main() {
84271
84270
  * @deprecated
84272
84271
  */
84273
84272
  loadGltfFile(file, externalFiles, params = {}) {
84273
+ console.warn("Viewer.loadGltfFile() has been deprecated since 26.4 and will be removed in a future release, use Viewer.open() instead.");
84274
84274
  return this.open(file, { ...params, format: "gltf", externalFiles, mode: "append" });
84275
84275
  }
84276
84276
  cancel() {