@roomle/web-sdk 3.7.0-alpha.2 → 3.7.0-alpha.3
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.
- package/lib/ConfiguratorKernel.wasm +0 -0
- package/lib/RoomleCore.js +2 -2
- package/lib/RoomleCore.wasm +0 -0
- package/lib/RoomleToolsCore.wasm +0 -0
- package/lib/{api-oYzhcs_W.mjs → api-DgXsyN04.mjs} +2 -2
- package/lib/{api-oYzhcs_W.mjs.map → api-DgXsyN04.mjs.map} +1 -1
- package/lib/asset-loader.worker-A7nEeQB4.mjs.map +1 -1
- package/lib/banana-for-scale-D8t2dmc7.mjs.map +1 -1
- package/lib/budgeteer.sw-CQWYbQSc.mjs.map +1 -1
- package/lib/{configurator-CRMunIq7.mjs → configurator-CmMBHkyd.mjs} +3 -3
- package/lib/{configurator-CRMunIq7.mjs.map → configurator-CmMBHkyd.mjs.map} +1 -1
- package/lib/configurator-DtvX4JqP.mjs +2 -0
- package/lib/{glb-viewer-CXEoIw1b.mjs → glb-viewer-Cs3i0yb8.mjs} +3 -3
- package/lib/{glb-viewer-CXEoIw1b.mjs.map → glb-viewer-Cs3i0yb8.mjs.map} +1 -1
- package/lib/glb-viewer-Dcllu_oG.mjs +2 -0
- package/lib/{homag-intelligence-gb9MqBrz.mjs → homag-intelligence-CBZujG1I.mjs} +3 -3
- package/lib/{homag-intelligence-gb9MqBrz.mjs.map → homag-intelligence-CBZujG1I.mjs.map} +1 -1
- package/lib/kernel-C7YDLxq8.mjs.map +1 -1
- package/lib/{main-BJZ9-cDk.mjs → main-_HtiLIhS.mjs} +52 -39
- package/lib/main-_HtiLIhS.mjs.map +1 -0
- package/lib/{material-viewer-D8Nmpwg0.mjs → material-viewer-BCjg687R.mjs} +3 -3
- package/lib/{material-viewer-D8Nmpwg0.mjs.map → material-viewer-BCjg687R.mjs.map} +1 -1
- package/lib/packages-BhrPUb9k.mjs +4 -0
- package/lib/planner-CDJtTG3g.mjs +2 -0
- package/lib/{planner-5VarJrpy.mjs → planner-OYwMFSWo.mjs} +3 -3
- package/lib/{planner-5VarJrpy.mjs.map → planner-OYwMFSWo.mjs.map} +1 -1
- package/lib/roomle-headless.d.ts +67 -43
- package/lib/roomle-headless.js +18 -15
- package/lib/roomle-headless.js.map +1 -1
- package/lib/roomle-sdk.d.ts +67 -43
- package/lib/roomle-sdk.js +6 -6
- package/lib/{script-loader-gpkcl1h-.mjs → script-loader-X4I-gQl2.mjs} +2 -2
- package/lib/{script-loader-gpkcl1h-.mjs.map → script-loader-X4I-gQl2.mjs.map} +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/package.json +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.d.ts +3 -3
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.js +6 -6
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCoreInterface.d.ts +10 -2
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorUtils.js +12 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorUtils.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreInterface.d.ts +27 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreInterface.js +6 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreInterface.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.d.ts +4 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.js +15 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.js.map +1 -1
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.js +2 -2
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
- package/lib/threejs-utils-Bq4pVWBA.mjs.map +1 -1
- package/lib/{tools-core-DqnhFefF.mjs → tools-core-BRzDdhLJ.mjs} +3 -3
- package/lib/{tools-core-DqnhFefF.mjs.map → tools-core-BRzDdhLJ.mjs.map} +1 -1
- package/package.json +1 -1
- package/lib/configurator-DqiW717d.mjs +0 -2
- package/lib/glb-viewer-IDXgmONx.mjs +0 -2
- package/lib/main-BJZ9-cDk.mjs.map +0 -1
- package/lib/packages-Uv53SHfb.mjs +0 -4
- package/lib/planner-DJcn-iih.mjs +0 -2
package/lib/roomle-headless.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { i as e, t } from "./kernel-C7YDLxq8.mjs";
|
|
2
2
|
import { bi as n } from "./three.core-mM-jZdgg.mjs";
|
|
3
|
-
import { $ as r, A as i, B as a, D as o, E as s, G as c, H as l, M as u, N as d, P as f, R as p, U as m, V as h, _ as g, a as _, at as v, c as y, ct as b, et as x, g as S, i as C, j as w, n as T, ot as E, rt as D, s as O, tt as k, v as A, y as j, z as M } from "./main-
|
|
4
|
-
import { n as N } from "./script-loader-
|
|
5
|
-
import { t as P } from "./configurator-
|
|
6
|
-
import { t as F } from "./planner-
|
|
7
|
-
import { n as I, t as L } from "./glb-viewer-
|
|
8
|
-
import { t as R } from "./api-
|
|
9
|
-
import "./packages-
|
|
3
|
+
import { $ as r, A as i, B as a, D as o, E as s, G as c, H as l, M as u, N as d, P as f, R as p, U as m, V as h, _ as g, a as _, at as v, c as y, ct as b, et as x, g as S, i as C, j as w, n as T, ot as E, rt as D, s as O, tt as k, v as A, y as j, z as M } from "./main-_HtiLIhS.mjs";
|
|
4
|
+
import { n as N } from "./script-loader-X4I-gQl2.mjs";
|
|
5
|
+
import { t as P } from "./configurator-CmMBHkyd.mjs";
|
|
6
|
+
import { t as F } from "./planner-OYwMFSWo.mjs";
|
|
7
|
+
import { n as I, t as L } from "./glb-viewer-Cs3i0yb8.mjs";
|
|
8
|
+
import { t as R } from "./api-DgXsyN04.mjs";
|
|
9
|
+
import "./packages-BhrPUb9k.mjs";
|
|
10
10
|
import "./roomle-headless-setup-LoBO7UJe.mjs";
|
|
11
11
|
import { createRequire as z } from "module";
|
|
12
12
|
//#region packages/headless-core/src/headless-script-loader.ts
|
|
@@ -245,21 +245,24 @@ var B = z(import.meta.url), V = {}, H = [
|
|
|
245
245
|
this._ensureInitialized();
|
|
246
246
|
let n = this._configurator.getSceneManager(), r = t === "glb" ? await n.createExportGLB() : await n.createUSDZExport();
|
|
247
247
|
if (!r) throw Error(`${t.toUpperCase()} export produced no data`);
|
|
248
|
-
|
|
248
|
+
let i = r instanceof ArrayBuffer ? r : r.buffer;
|
|
249
|
+
return e && (await import("fs")).writeFileSync(e, Buffer.from(i)), { buffer: i };
|
|
249
250
|
}
|
|
250
251
|
async exportScreenshot(e, t = {}) {
|
|
251
252
|
this._ensureInitialized();
|
|
252
|
-
let n = t.quality ?? 1, r = t.ssaa ?? 2, i = this._configurator.getSceneManager(), a
|
|
253
|
+
let n = t.quality ?? 1, r = t.ssaa ?? 2, i = this._configurator.getSceneManager(), a = i.getRenderer();
|
|
254
|
+
if (!a) throw Error("HeadlessRoomleSdk: renderer is not available");
|
|
255
|
+
let o, s;
|
|
253
256
|
if (r > 1) {
|
|
254
|
-
let e = i.
|
|
255
|
-
|
|
257
|
+
let e = i.getRoomleRenderer(), t = a.domElement;
|
|
258
|
+
o = t.width, s = t.height, e?.setSize(o * r, s * r);
|
|
256
259
|
}
|
|
257
|
-
let
|
|
258
|
-
if (r > 1 &&
|
|
259
|
-
let t = await import("fs"), n =
|
|
260
|
+
let c = await i.exportCanvasScreenshot(n);
|
|
261
|
+
if (r > 1 && o && s && (i.getRoomleRenderer()?.setSize(o, s), c = await this._ssaaDownscale(c, o, s)), e) {
|
|
262
|
+
let t = await import("fs"), n = c.replace(/^data:image\/\w+;base64,/, "");
|
|
260
263
|
t.writeFileSync(e, Buffer.from(n, "base64"));
|
|
261
264
|
}
|
|
262
|
-
return { dataUrl:
|
|
265
|
+
return { dataUrl: c };
|
|
263
266
|
}
|
|
264
267
|
async exportPerspectiveImage(e, t = {}) {
|
|
265
268
|
this._ensureInitialized();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roomle-headless.js","names":[],"sources":["../../packages/headless-core/src/headless-script-loader.ts","../../packages/headless-core/src/stubs.ts","../../packages/headless-core/src/headless-dom-helper.ts","../../packages/headless-core/src/headless-data-syncer.ts","../../packages/headless-core/src/headless-sdk.ts"],"sourcesContent":["/**\n * Replaces the browser ScriptLoader for headless mode.\n * Instead of injecting <script> tags, directly imports the Emscripten JS modules.\n */\nimport { createRequire } from 'module';\nimport type { Context } from '../../common-core/src/di/context';\nimport { getHeadlessWasmPath } from '../../common-core/src/static-files/roomle-core';\n\n// createRequire is needed because the Emscripten kernel files are CommonJS\n// and must be loaded synchronously\nconst _require = createRequire(import.meta.url);\n\nlet _idCache: { [key: string]: boolean } = {};\n\n// Maps a .wasm filename found in the Emscripten factory's source to its global name.\n// Each Emscripten factory references its own .wasm file (e.g. ConfiguratorKernel.wasm).\nconst WASM_TO_GLOBAL: Array<\n [wasmFile: string, globalName: string, modulePath: string]\n> = [\n [\n 'ConfiguratorKernel.wasm',\n 'ConfiguratorKernel',\n 'roomle-core-hsc/wasm_modern/ConfiguratorKernel.js',\n ],\n [\n 'RoomleCore.wasm',\n 'RoomleCore',\n 'roomle-core-hsc/wasm_modern/RoomleCore.js',\n ],\n [\n 'RoomleToolsCore.wasm',\n 'RoomleToolsCore',\n 'roomle-core-hsc/wasm_modern/RoomleToolsCore.js',\n ],\n];\n\nexport default class HeadlessScriptLoader implements Context {\n public _creator_: string;\n\n constructor(creator: string) {\n this._creator_ = creator;\n }\n\n public async fetch(url: string, options: { id: string }) {\n if (_idCache[options.id]) {\n return;\n }\n\n // In Bun, Vite's ?no-inline?url imports resolve to the module's default\n // export (a function) rather than a URL string. Handle both cases.\n if (typeof url === 'function') {\n this._registerFactory(url);\n _idCache[options.id] = true;\n return;\n }\n\n const entry = this._resolveEntry(url);\n if (entry) {\n const [, globalName, modulePath] = entry;\n // If url is an absolute filesystem path (from getHeadlessWasmPath),\n // require it directly. Otherwise fall back to the module specifier\n // (works from source where roomle-core-hsc is in node_modules).\n const pathToLoad = url.startsWith('/') ? url : modulePath;\n const mod = _require(pathToLoad);\n (globalThis as any)[globalName] = mod.default || mod;\n _idCache[options.id] = true;\n }\n }\n\n // Identify an Emscripten factory function by checking its source for the\n // unique .wasm filename it references, then register it on globalThis\n // under the name the kernel-access classes expect (e.g. window.ConfiguratorKernel).\n private _registerFactory(factory: () => void) {\n const source = factory.toString();\n for (const [wasmFile, globalName] of WASM_TO_GLOBAL) {\n if (source.includes(wasmFile)) {\n (globalThis as any)[globalName] = factory;\n return;\n }\n }\n console.warn(\n 'HeadlessScriptLoader: Could not identify Emscripten factory function',\n );\n }\n\n private _resolveEntry(url: string) {\n for (const entry of WASM_TO_GLOBAL) {\n const [wasmFile, globalName] = entry;\n const baseName = globalName; // e.g. \"ConfiguratorKernel\"\n if (url.includes(baseName) || url.includes(wasmFile)) {\n return entry;\n }\n }\n // Fallback: looser matching for generic URLs\n if (url.includes('configurator')) {\n return WASM_TO_GLOBAL[0];\n }\n if (url.includes('planner')) {\n return WASM_TO_GLOBAL[1];\n }\n if (url.includes('tools')) {\n return WASM_TO_GLOBAL[2];\n }\n console.warn(\n `HeadlessScriptLoader: Could not resolve module for URL: ${url}`,\n );\n return null;\n }\n\n public loadScripts(scripts: Array<{ id: string; name: string }>) {\n const promises = scripts.map((script) =>\n this.fetch(script.name, { id: script.id }),\n );\n return Promise.all(promises);\n }\n\n public resolveKernelPaths(type: 'configurator' | 'planner' | 'tools'): {\n wasm: string;\n loader: string;\n } {\n return getHeadlessWasmPath(type);\n }\n\n public cleanUp() {\n _idCache = {};\n }\n}\n","export const noop = () => {};\n","/**\n * Stub DomHelper for headless mode.\n * Returns fixed dimensions since we don't render to a real canvas.\n */\nimport { Vector2 } from 'three';\nimport { noop } from './stubs';\nimport type {\n LifeCycleCallbacks,\n LifeCycleManager,\n} from '../../common-core/src/life-cycle-manager';\nimport type { Context } from '../../common-core/src/di/context';\n\nexport default class HeadlessDomHelper implements LifeCycleCallbacks, Context {\n public _creator_: string;\n\n // Manual DI lookup instead of @inject decorator (avoids legacy/TC39 decorator mismatch)\n private get _lifeCycleManager(): LifeCycleManager | undefined {\n return (globalThis as any).__RML__DI__?.lookup(\n 'life-cycle-manager',\n this._creator_,\n );\n }\n\n private _width: number;\n private _height: number;\n private _stubElement: any;\n\n get element(): any {\n return this._stubElement;\n }\n\n constructor(creator: string, width = 1024, height = 768) {\n this._creator_ = creator;\n this._width = width;\n this._height = height;\n\n const w = this._width;\n const h = this._height;\n this._stubElement = {\n clientWidth: w,\n clientHeight: h,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: {\n add() {},\n remove() {},\n contains() {\n return false;\n },\n },\n setAttribute() {},\n getAttribute(): string | null {\n return null;\n },\n children: [] as any[],\n getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: w,\n height: h,\n top: 0,\n left: 0,\n bottom: h,\n right: w,\n };\n },\n addEventListener() {},\n removeEventListener() {},\n dispatchEvent() {\n return true;\n },\n offsetWidth: w,\n offsetHeight: h,\n scrollWidth: w,\n scrollHeight: h,\n contains() {\n return false;\n },\n };\n }\n\n public setDomElement(_element: any) {\n noop();\n }\n\n public getClientDimensions() {\n return new Vector2(this._width, this._height);\n }\n\n public getAspectRatio() {\n return this._width / this._height;\n }\n\n public ensureCanvasFocus() {}\n public reset() {}\n public pause() {}\n public resume() {}\n public destroy() {}\n}\n","/**\n * Replaces the Worker-based DataSyncer with a no-op for headless mode.\n * In headless mode, assets are loaded on-demand via RapiAccess rather than\n * being pre-synced with a Web Worker.\n */\nimport type { RapiId } from '@roomle/web-sdk';\nimport { noop } from './stubs';\nimport type { Context } from '../../common-core/src/di/context';\n\nexport default class HeadlessDataSyncer implements Context {\n public _creator_: string;\n\n constructor(creator: string) {\n this._creator_ = creator;\n }\n\n public start(_catalogId: RapiId) {\n return Promise.resolve();\n }\n\n public syncCatalog(_catalogId: RapiId): Promise<void> {\n return Promise.resolve();\n }\n\n public syncFloorTag(_tagId: RapiId) {\n return Promise.resolve();\n }\n\n public syncTypeChangeTag(_tagId: RapiId) {\n return Promise.resolve();\n }\n\n public _syncTypeChangeTag(_tagId: RapiId): Promise<any> {\n return Promise.resolve();\n }\n\n public getIsCatalogSynced(_catalogId: RapiId) {\n return false;\n }\n\n public onCommand(_command: number, _conversationId: number, _data: any) {\n noop();\n }\n\n public requestAsset(url: string, _urlAsFallback: boolean = false): string {\n return url;\n }\n\n public setAlwaysUseCache(_alwaysUseCache: boolean): void {\n noop();\n }\n\n public preFillAssetCache(_key: string, _url: string) {\n noop();\n }\n}\n","/**\n * Main entry point for the headless Roomle SDK.\n * Provides the ability to run the Roomle web-sdk in Node.js/Bun\n * for loading configurations/plans and exporting them to GLB/USDZ.\n */\nimport HeadlessScriptLoader from './headless-script-loader';\nimport HeadlessDomHelper from './headless-dom-helper';\nimport HeadlessDataSyncer from './headless-data-syncer';\nimport CommonKernelAccess from '../../common-core/src/services/common-kernel-access';\nimport type {\n RoomlePlanner,\n Planner,\n RoomleConfigurator,\n Configurator,\n InitDataDefinition,\n GlobalInitDataDefinition,\n RapiId,\n} from '../../index';\nimport { RoomleSdk } from '../../index';\nimport {\n Container,\n DependencyInjectionAssignment,\n DI_TYPE,\n} from '../../common-core/src/di/container';\nimport { INJECTABLES } from '../../common-core/src/di/injectables';\n\nexport interface HeadlessInitData\n extends Partial<InitDataDefinition>,\n Partial<GlobalInitDataDefinition> {\n configuratorId: string;\n /** Canvas width in pixels. Defaults to 1024. */\n width?: number;\n /** Canvas height in pixels. Defaults to 768. */\n height?: number;\n}\n\nexport interface ExportResult {\n buffer: ArrayBuffer;\n}\n\nexport interface ImageExportOptions {\n /** Supersampling anti-aliasing factor. Defaults to 2. */\n ssaa?: number;\n}\n\nexport interface ScreenshotExportOptions extends ImageExportOptions {\n /** JPEG quality (0–1). Defaults to 1. */\n quality?: number;\n}\n\nexport interface PerspectiveImageExportOptions extends ImageExportOptions {\n /** Output image size in pixels. Defaults to 1024. */\n size?: number;\n showDimensions?: boolean;\n rotationY?: number;\n}\n\nexport interface TopImageExportOptions extends ImageExportOptions {\n /** Output image size in pixels. Defaults to 1024. */\n size?: number;\n showDimensions?: boolean;\n}\n\nexport class HeadlessRoomleSdk {\n private _planner: RoomlePlanner;\n private _plannerMain: Planner;\n private _configurator: RoomleConfigurator;\n private _configuratorMain: Configurator;\n private _initialized = false;\n private _width = 1024;\n private _height = 768;\n\n static async create(initData: HeadlessInitData): Promise<HeadlessRoomleSdk> {\n const instance = new HeadlessRoomleSdk();\n await instance._init(initData);\n return instance;\n }\n\n private async _init(initData: HeadlessInitData) {\n this._width = initData.width ?? 1024;\n this._height = initData.height ?? 768;\n\n // Register headless service overrides BEFORE the DI container initializes.\n // This monkey-patches Container so that headless overrides always win,\n // even after boot() re-registers the default INJECTABLES.\n this._registerHeadlessServices(this._width, this._height);\n\n await RoomleSdk.setGlobalInitData({\n configuratorId: initData.configuratorId,\n locale: initData.locale,\n // @ts-ignore -- tenant is untyped, but we still need it.\n tenant: initData.tenant,\n overrideCountry: initData.overrideCountry,\n animateCamera: false,\n });\n\n this._initialized = true;\n }\n\n private _registerHeadlessServices(width: number, height: number) {\n // Create the DI container early. When roomle-dependency-injection.ts is\n // later loaded transitively, its _ensureContainer() checks if __RML__DI__\n // already exists and skips creating a new one — so we must register the\n // full INJECTABLES here ourselves.\n const container = new Container();\n (globalThis as any).__RML__DI__ = container;\n\n // Capture width/height in a subclass so the DI container instantiates\n // HeadlessDomHelper with the correct dimensions (DI only passes `creator`).\n class SizedHeadlessDomHelper extends HeadlessDomHelper {\n constructor(creator: string) {\n super(creator, width, height);\n }\n }\n\n const headlessOverrides = [\n new DependencyInjectionAssignment(\n 'script-loader',\n HeadlessScriptLoader,\n DI_TYPE.CONTEXT,\n ),\n new DependencyInjectionAssignment(\n 'dom-helper',\n SizedHeadlessDomHelper,\n DI_TYPE.CONTEXT,\n ),\n new DependencyInjectionAssignment('data-syncer', HeadlessDataSyncer),\n ];\n\n // Monkey-patch addDependencyInjectionAssignments so that every time\n // the SDK registers its default INJECTABLES (during boot()), our headless\n // overrides are re-applied on top. This ensures headless services always win.\n const originalAdd = Container.prototype.addDependencyInjectionAssignments;\n Container.prototype.addDependencyInjectionAssignments = function (\n injections: DependencyInjectionAssignment[],\n ) {\n originalAdd.call(this, injections);\n originalAdd.call(this, headlessOverrides);\n };\n\n // Wrap kernel callbacks with a safety Proxy so that exceptions thrown\n // from JS callbacks invoked by C++ (via Embind) are caught and logged\n // rather than propagating into C++ which would call std::terminate → abort().\n (CommonKernelAccess.prototype as any)._buildCallbackTarget = function () {\n const target = this;\n return new Proxy(target, {\n get(_, prop) {\n const val = (target as any)[prop];\n if (typeof val === 'function') {\n return function (...args: any[]) {\n try {\n return val.apply(target, args);\n } catch (e) {\n console.error(\n `[Headless] Kernel callback '${String(prop)}' threw:`,\n e,\n );\n }\n };\n }\n return val;\n },\n });\n };\n\n // Register all default INJECTABLES + headless overrides.\n // The monkey-patch ensures headless overrides are applied on top.\n container.addDependencyInjectionAssignments(INJECTABLES);\n }\n\n async loadConfiguration(\n configurationId: RapiId,\n initData?: Partial<InitDataDefinition>,\n ): Promise<void> {\n this._ensureInitialized();\n\n const configuratorModule = await RoomleSdk.getConfigurator(initData);\n await configuratorModule.boot();\n this._configuratorMain = configuratorModule;\n this._configurator = configuratorModule.getApi();\n\n const stubElement = {\n clientWidth: this._width,\n clientHeight: this._height,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: { add() {} },\n };\n await this._configurator.init(stubElement as any);\n\n await this._configurator.loadConfigurableItemById(configurationId);\n }\n\n async loadPlan(\n planId: string,\n initData?: Partial<InitDataDefinition>,\n ): Promise<void> {\n this._ensureInitialized();\n\n const plannerModule = await RoomleSdk.getPlanner(initData);\n await plannerModule.boot();\n this._plannerMain = plannerModule;\n this._planner = plannerModule.getApi();\n\n const stubElement = {\n clientWidth: this._width,\n clientHeight: this._height,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: { add() {} },\n };\n await this._planner.init(stubElement as any);\n\n await this._planner.loadPlan(planId);\n }\n\n async exportGLB(outputPath?: string): Promise<ExportResult> {\n return this._export(outputPath, 'glb');\n }\n\n async exportUSDZ(outputPath?: string): Promise<ExportResult> {\n return this._export(outputPath, 'usdz');\n }\n\n private async _export(\n outputPath: string | undefined,\n type: 'glb' | 'usdz',\n ): Promise<ExportResult> {\n this._ensureInitialized();\n\n const sm = this._configurator.getSceneManager();\n const buffer =\n type === 'glb' ? await sm.createExportGLB() : await sm.createUSDZExport();\n\n if (!buffer) {\n throw new Error(`${type.toUpperCase()} export produced no data`);\n }\n\n if (outputPath) {\n const fs = await import('fs');\n // @ts-ignore -- ts thinks this is a different type of buffer\n fs.writeFileSync(outputPath, Buffer.from(buffer));\n }\n\n return { buffer: buffer instanceof ArrayBuffer ? buffer : buffer.buffer };\n }\n\n async exportScreenshot(\n outputPath?: string,\n options: ScreenshotExportOptions = {},\n ): Promise<{ dataUrl: string }> {\n this._ensureInitialized();\n\n const quality = options.quality ?? 1;\n const ssaa = options.ssaa ?? 2;\n const sm = this._configurator.getSceneManager();\n\n let originalWidth: number | undefined;\n let originalHeight: number | undefined;\n\n // Temporarily resize renderer for SSAA supersampling\n if (ssaa > 1) {\n const renderer = sm.getRenderer();\n const roomleRenderer = sm.getRoomleRenderer();\n const canvas = renderer.domElement;\n originalWidth = canvas.width;\n originalHeight = canvas.height;\n roomleRenderer?.setSize(originalWidth! * ssaa, originalHeight! * ssaa);\n }\n\n let dataUrl: string = await sm.exportCanvasScreenshot(quality);\n\n // Restore original size and downscale\n if (ssaa > 1 && originalWidth && originalHeight) {\n sm.getRoomleRenderer()?.setSize(originalWidth, originalHeight);\n dataUrl = await this._ssaaDownscale(\n dataUrl,\n originalWidth,\n originalHeight,\n );\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = dataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl };\n }\n\n async exportPerspectiveImage(\n outputPath?: string,\n options: PerspectiveImageExportOptions = {},\n ): Promise<{ dataUrl: string; width: number; height: number }> {\n this._ensureInitialized();\n\n const ssaa = options.ssaa ?? 2;\n const targetSize = options.size ?? 1024;\n const renderSize = targetSize * ssaa;\n\n const result = await this._configurator.preparePerspectiveImage({\n ...options,\n size: renderSize,\n });\n\n let finalDataUrl = result.image;\n let finalWidth = result.width;\n let finalHeight = result.height;\n\n // Downscale with SSAA if rendering at higher resolution, achieves antialiasing effect.\n if (ssaa > 1) {\n finalDataUrl = await this._ssaaDownscale(\n finalDataUrl,\n targetSize,\n targetSize,\n );\n finalWidth = targetSize;\n finalHeight = targetSize;\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = finalDataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl: finalDataUrl, width: finalWidth, height: finalHeight };\n }\n\n async exportTopImage(\n outputPath?: string,\n options: TopImageExportOptions = {},\n ): Promise<{ dataUrl: string; width: number; height: number }> {\n this._ensureInitialized();\n\n const ssaa = options.ssaa ?? 2;\n const result = await this._configurator.prepareTopImage({\n ...options,\n size: (options.size ?? 1024) * ssaa,\n showDimensions: options.showDimensions ?? false,\n });\n\n let finalDataUrl = result.image;\n let finalWidth = result.width;\n let finalHeight = result.height;\n\n if (ssaa > 1) {\n const targetWidth = Math.round(finalWidth / ssaa);\n const targetHeight = Math.round(finalHeight / ssaa);\n finalDataUrl = await this._ssaaDownscale(\n finalDataUrl,\n targetWidth,\n targetHeight,\n );\n finalWidth = targetWidth;\n finalHeight = targetHeight;\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = finalDataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl: finalDataUrl, width: finalWidth, height: finalHeight };\n }\n\n /** Downscale a data URL image to target dimensions using high-quality filtering. */\n private async _ssaaDownscale(\n dataUrl: string,\n targetWidth: number,\n targetHeight: number,\n ): Promise<string> {\n const { createCanvas, loadImage } = await import('@napi-rs/canvas');\n const imgBuffer = Buffer.from(\n dataUrl.replace(/^data:image\\/\\w+;base64,/, ''),\n 'base64',\n );\n const img = await loadImage(imgBuffer);\n const outCanvas = createCanvas(targetWidth, targetHeight);\n const ctx = outCanvas.getContext('2d');\n (ctx as any).imageSmoothingEnabled = true;\n (ctx as any).imageSmoothingQuality = 'high';\n ctx.drawImage(img, 0, 0, targetWidth, targetHeight);\n return outCanvas.toDataURL('image/png');\n }\n\n getConfiguratorApi() {\n return this._configurator;\n }\n\n getPlannerApi() {\n return this._planner;\n }\n\n async destroy() {\n if (this._configuratorMain) {\n this._configuratorMain.destroy();\n }\n if (this._plannerMain) {\n this._plannerMain.destroy();\n }\n }\n\n private _ensureInitialized() {\n if (!this._initialized) {\n throw new Error(\n 'HeadlessRoomleSdk not initialized. Call HeadlessRoomleSdk.create() first.',\n );\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"roomle-headless.js","names":[],"sources":["../../packages/headless-core/src/headless-script-loader.ts","../../packages/headless-core/src/stubs.ts","../../packages/headless-core/src/headless-dom-helper.ts","../../packages/headless-core/src/headless-data-syncer.ts","../../packages/headless-core/src/headless-sdk.ts"],"sourcesContent":["/**\n * Replaces the browser ScriptLoader for headless mode.\n * Instead of injecting <script> tags, directly imports the Emscripten JS modules.\n */\nimport { createRequire } from 'module';\nimport type { Context } from '../../common-core/src/di/context';\nimport { getHeadlessWasmPath } from '../../common-core/src/static-files/roomle-core';\n\n// createRequire is needed because the Emscripten kernel files are CommonJS\n// and must be loaded synchronously\nconst _require = createRequire(import.meta.url);\n\nlet _idCache: { [key: string]: boolean } = {};\n\n// Maps a .wasm filename found in the Emscripten factory's source to its global name.\n// Each Emscripten factory references its own .wasm file (e.g. ConfiguratorKernel.wasm).\nconst WASM_TO_GLOBAL: Array<\n [wasmFile: string, globalName: string, modulePath: string]\n> = [\n [\n 'ConfiguratorKernel.wasm',\n 'ConfiguratorKernel',\n 'roomle-core-hsc/wasm_modern/ConfiguratorKernel.js',\n ],\n [\n 'RoomleCore.wasm',\n 'RoomleCore',\n 'roomle-core-hsc/wasm_modern/RoomleCore.js',\n ],\n [\n 'RoomleToolsCore.wasm',\n 'RoomleToolsCore',\n 'roomle-core-hsc/wasm_modern/RoomleToolsCore.js',\n ],\n];\n\nexport default class HeadlessScriptLoader implements Context {\n public _creator_: string;\n\n constructor(creator: string) {\n this._creator_ = creator;\n }\n\n public async fetch(url: string, options: { id: string }) {\n if (_idCache[options.id]) {\n return;\n }\n\n // In Bun, Vite's ?no-inline?url imports resolve to the module's default\n // export (a function) rather than a URL string. Handle both cases.\n if (typeof url === 'function') {\n this._registerFactory(url);\n _idCache[options.id] = true;\n return;\n }\n\n const entry = this._resolveEntry(url);\n if (entry) {\n const [, globalName, modulePath] = entry;\n // If url is an absolute filesystem path (from getHeadlessWasmPath),\n // require it directly. Otherwise fall back to the module specifier\n // (works from source where roomle-core-hsc is in node_modules).\n const pathToLoad = url.startsWith('/') ? url : modulePath;\n const mod = _require(pathToLoad);\n (globalThis as any)[globalName] = mod.default || mod;\n _idCache[options.id] = true;\n }\n }\n\n // Identify an Emscripten factory function by checking its source for the\n // unique .wasm filename it references, then register it on globalThis\n // under the name the kernel-access classes expect (e.g. window.ConfiguratorKernel).\n private _registerFactory(factory: () => void) {\n const source = factory.toString();\n for (const [wasmFile, globalName] of WASM_TO_GLOBAL) {\n if (source.includes(wasmFile)) {\n (globalThis as any)[globalName] = factory;\n return;\n }\n }\n console.warn(\n 'HeadlessScriptLoader: Could not identify Emscripten factory function',\n );\n }\n\n private _resolveEntry(url: string) {\n for (const entry of WASM_TO_GLOBAL) {\n const [wasmFile, globalName] = entry;\n const baseName = globalName; // e.g. \"ConfiguratorKernel\"\n if (url.includes(baseName) || url.includes(wasmFile)) {\n return entry;\n }\n }\n // Fallback: looser matching for generic URLs\n if (url.includes('configurator')) {\n return WASM_TO_GLOBAL[0];\n }\n if (url.includes('planner')) {\n return WASM_TO_GLOBAL[1];\n }\n if (url.includes('tools')) {\n return WASM_TO_GLOBAL[2];\n }\n console.warn(\n `HeadlessScriptLoader: Could not resolve module for URL: ${url}`,\n );\n return null;\n }\n\n public loadScripts(scripts: Array<{ id: string; name: string }>) {\n const promises = scripts.map((script) =>\n this.fetch(script.name, { id: script.id }),\n );\n return Promise.all(promises);\n }\n\n public resolveKernelPaths(type: 'configurator' | 'planner' | 'tools'): {\n wasm: string;\n loader: string;\n } {\n return getHeadlessWasmPath(type);\n }\n\n public cleanUp() {\n _idCache = {};\n }\n}\n","export const noop = () => {};\n","/**\n * Stub DomHelper for headless mode.\n * Returns fixed dimensions since we don't render to a real canvas.\n */\nimport { Vector2 } from 'three';\nimport { noop } from './stubs';\nimport type {\n LifeCycleCallbacks,\n LifeCycleManager,\n} from '../../common-core/src/life-cycle-manager';\nimport type { Context } from '../../common-core/src/di/context';\n\nexport default class HeadlessDomHelper implements LifeCycleCallbacks, Context {\n public _creator_: string;\n\n // Manual DI lookup instead of @inject decorator (avoids legacy/TC39 decorator mismatch)\n private get _lifeCycleManager(): LifeCycleManager | undefined {\n return (globalThis as any).__RML__DI__?.lookup(\n 'life-cycle-manager',\n this._creator_,\n );\n }\n\n private _width: number;\n private _height: number;\n private _stubElement: any;\n\n get element(): any {\n return this._stubElement;\n }\n\n constructor(creator: string, width = 1024, height = 768) {\n this._creator_ = creator;\n this._width = width;\n this._height = height;\n\n const w = this._width;\n const h = this._height;\n this._stubElement = {\n clientWidth: w,\n clientHeight: h,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: {\n add() {},\n remove() {},\n contains() {\n return false;\n },\n },\n setAttribute() {},\n getAttribute(): string | null {\n return null;\n },\n children: [] as any[],\n getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: w,\n height: h,\n top: 0,\n left: 0,\n bottom: h,\n right: w,\n };\n },\n addEventListener() {},\n removeEventListener() {},\n dispatchEvent() {\n return true;\n },\n offsetWidth: w,\n offsetHeight: h,\n scrollWidth: w,\n scrollHeight: h,\n contains() {\n return false;\n },\n };\n }\n\n public setDomElement(_element: any) {\n noop();\n }\n\n public getClientDimensions() {\n return new Vector2(this._width, this._height);\n }\n\n public getAspectRatio() {\n return this._width / this._height;\n }\n\n public ensureCanvasFocus() {}\n public reset() {}\n public pause() {}\n public resume() {}\n public destroy() {}\n}\n","/**\n * Replaces the Worker-based DataSyncer with a no-op for headless mode.\n * In headless mode, assets are loaded on-demand via RapiAccess rather than\n * being pre-synced with a Web Worker.\n */\nimport type { RapiId } from '@roomle/web-sdk';\nimport { noop } from './stubs';\nimport type { Context } from '../../common-core/src/di/context';\n\nexport default class HeadlessDataSyncer implements Context {\n public _creator_: string;\n\n constructor(creator: string) {\n this._creator_ = creator;\n }\n\n public start(_catalogId: RapiId) {\n return Promise.resolve();\n }\n\n public syncCatalog(_catalogId: RapiId): Promise<void> {\n return Promise.resolve();\n }\n\n public syncFloorTag(_tagId: RapiId) {\n return Promise.resolve();\n }\n\n public syncTypeChangeTag(_tagId: RapiId) {\n return Promise.resolve();\n }\n\n public _syncTypeChangeTag(_tagId: RapiId): Promise<any> {\n return Promise.resolve();\n }\n\n public getIsCatalogSynced(_catalogId: RapiId) {\n return false;\n }\n\n public onCommand(_command: number, _conversationId: number, _data: any) {\n noop();\n }\n\n public requestAsset(url: string, _urlAsFallback: boolean = false): string {\n return url;\n }\n\n public setAlwaysUseCache(_alwaysUseCache: boolean): void {\n noop();\n }\n\n public preFillAssetCache(_key: string, _url: string) {\n noop();\n }\n}\n","/**\n * Main entry point for the headless Roomle SDK.\n * Provides the ability to run the Roomle web-sdk in Node.js/Bun\n * for loading configurations/plans and exporting them to GLB/USDZ.\n */\nimport HeadlessScriptLoader from './headless-script-loader';\nimport HeadlessDomHelper from './headless-dom-helper';\nimport HeadlessDataSyncer from './headless-data-syncer';\nimport CommonKernelAccess from '../../common-core/src/services/common-kernel-access';\nimport type {\n RoomlePlanner,\n Planner,\n RoomleConfigurator,\n Configurator,\n InitDataDefinition,\n GlobalInitDataDefinition,\n RapiId,\n} from '../../index';\nimport { RoomleSdk } from '../../index';\nimport {\n Container,\n DependencyInjectionAssignment,\n DI_TYPE,\n} from '../../common-core/src/di/container';\nimport { INJECTABLES } from '../../common-core/src/di/injectables';\n\nexport interface HeadlessInitData\n extends Partial<InitDataDefinition>,\n Partial<GlobalInitDataDefinition> {\n configuratorId: string;\n /** Canvas width in pixels. Defaults to 1024. */\n width?: number;\n /** Canvas height in pixels. Defaults to 768. */\n height?: number;\n}\n\nexport interface ExportResult {\n buffer: ArrayBuffer;\n}\n\nexport interface ImageExportOptions {\n /** Supersampling anti-aliasing factor. Defaults to 2. */\n ssaa?: number;\n}\n\nexport interface ScreenshotExportOptions extends ImageExportOptions {\n /** JPEG quality (0–1). Defaults to 1. */\n quality?: number;\n}\n\nexport interface PerspectiveImageExportOptions extends ImageExportOptions {\n /** Output image size in pixels. Defaults to 1024. */\n size?: number;\n showDimensions?: boolean;\n rotationY?: number;\n}\n\nexport interface TopImageExportOptions extends ImageExportOptions {\n /** Output image size in pixels. Defaults to 1024. */\n size?: number;\n showDimensions?: boolean;\n}\n\nexport class HeadlessRoomleSdk {\n private _planner: RoomlePlanner;\n private _plannerMain: Planner;\n private _configurator: RoomleConfigurator;\n private _configuratorMain: Configurator;\n private _initialized = false;\n private _width = 1024;\n private _height = 768;\n\n static async create(initData: HeadlessInitData): Promise<HeadlessRoomleSdk> {\n const instance = new HeadlessRoomleSdk();\n await instance._init(initData);\n return instance;\n }\n\n private async _init(initData: HeadlessInitData) {\n this._width = initData.width ?? 1024;\n this._height = initData.height ?? 768;\n\n // Register headless service overrides BEFORE the DI container initializes.\n // This monkey-patches Container so that headless overrides always win,\n // even after boot() re-registers the default INJECTABLES.\n this._registerHeadlessServices(this._width, this._height);\n\n await RoomleSdk.setGlobalInitData({\n configuratorId: initData.configuratorId,\n locale: initData.locale,\n // @ts-ignore -- tenant is untyped, but we still need it.\n tenant: initData.tenant,\n overrideCountry: initData.overrideCountry,\n animateCamera: false,\n });\n\n this._initialized = true;\n }\n\n private _registerHeadlessServices(width: number, height: number) {\n // Create the DI container early. When roomle-dependency-injection.ts is\n // later loaded transitively, its _ensureContainer() checks if __RML__DI__\n // already exists and skips creating a new one — so we must register the\n // full INJECTABLES here ourselves.\n const container = new Container();\n (globalThis as any).__RML__DI__ = container;\n\n // Capture width/height in a subclass so the DI container instantiates\n // HeadlessDomHelper with the correct dimensions (DI only passes `creator`).\n class SizedHeadlessDomHelper extends HeadlessDomHelper {\n constructor(creator: string) {\n super(creator, width, height);\n }\n }\n\n const headlessOverrides = [\n new DependencyInjectionAssignment(\n 'script-loader',\n HeadlessScriptLoader,\n DI_TYPE.CONTEXT,\n ),\n new DependencyInjectionAssignment(\n 'dom-helper',\n SizedHeadlessDomHelper,\n DI_TYPE.CONTEXT,\n ),\n new DependencyInjectionAssignment('data-syncer', HeadlessDataSyncer),\n ];\n\n // Monkey-patch addDependencyInjectionAssignments so that every time\n // the SDK registers its default INJECTABLES (during boot()), our headless\n // overrides are re-applied on top. This ensures headless services always win.\n const originalAdd = Container.prototype.addDependencyInjectionAssignments;\n Container.prototype.addDependencyInjectionAssignments = function (\n injections: DependencyInjectionAssignment[],\n ) {\n originalAdd.call(this, injections);\n originalAdd.call(this, headlessOverrides);\n };\n\n // Wrap kernel callbacks with a safety Proxy so that exceptions thrown\n // from JS callbacks invoked by C++ (via Embind) are caught and logged\n // rather than propagating into C++ which would call std::terminate → abort().\n (CommonKernelAccess.prototype as any)._buildCallbackTarget = function () {\n const target = this;\n return new Proxy(target, {\n get(_, prop) {\n const val = (target as any)[prop];\n if (typeof val === 'function') {\n return function (...args: any[]) {\n try {\n return val.apply(target, args);\n } catch (e) {\n console.error(\n `[Headless] Kernel callback '${String(prop)}' threw:`,\n e,\n );\n }\n };\n }\n return val;\n },\n });\n };\n\n // Register all default INJECTABLES + headless overrides.\n // The monkey-patch ensures headless overrides are applied on top.\n container.addDependencyInjectionAssignments(INJECTABLES);\n }\n\n async loadConfiguration(\n configurationId: RapiId,\n initData?: Partial<InitDataDefinition>,\n ): Promise<void> {\n this._ensureInitialized();\n\n const configuratorModule = await RoomleSdk.getConfigurator(initData);\n await configuratorModule.boot();\n this._configuratorMain = configuratorModule;\n this._configurator = configuratorModule.getApi();\n\n const stubElement = {\n clientWidth: this._width,\n clientHeight: this._height,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: { add() {} },\n };\n await this._configurator.init(stubElement as any);\n\n await this._configurator.loadConfigurableItemById(configurationId);\n }\n\n async loadPlan(\n planId: string,\n initData?: Partial<InitDataDefinition>,\n ): Promise<void> {\n this._ensureInitialized();\n\n const plannerModule = await RoomleSdk.getPlanner(initData);\n await plannerModule.boot();\n this._plannerMain = plannerModule;\n this._planner = plannerModule.getApi();\n\n const stubElement = {\n clientWidth: this._width,\n clientHeight: this._height,\n appendChild() {},\n removeChild() {},\n style: {},\n classList: { add() {} },\n };\n await this._planner.init(stubElement as any);\n\n await this._planner.loadPlan(planId);\n }\n\n async exportGLB(outputPath?: string): Promise<ExportResult> {\n return this._export(outputPath, 'glb');\n }\n\n async exportUSDZ(outputPath?: string): Promise<ExportResult> {\n return this._export(outputPath, 'usdz');\n }\n\n private async _export(\n outputPath: string | undefined,\n type: 'glb' | 'usdz',\n ): Promise<ExportResult> {\n this._ensureInitialized();\n\n const sm = this._configurator.getSceneManager();\n const buffer =\n type === 'glb' ? await sm.createExportGLB() : await sm.createUSDZExport();\n\n if (!buffer) {\n throw new Error(`${type.toUpperCase()} export produced no data`);\n }\n\n // The buffer is either ArrayBuffer (GLB) or Uint8Array (USDZ).\n // Extract the underlying ArrayBuffer in both cases.\n const arrayBuffer =\n buffer instanceof ArrayBuffer\n ? buffer\n : ((buffer as Uint8Array).buffer as ArrayBuffer);\n\n if (outputPath) {\n const fs = await import('fs');\n fs.writeFileSync(outputPath, Buffer.from(arrayBuffer));\n }\n\n return { buffer: arrayBuffer };\n }\n\n async exportScreenshot(\n outputPath?: string,\n options: ScreenshotExportOptions = {},\n ): Promise<{ dataUrl: string }> {\n this._ensureInitialized();\n\n const quality = options.quality ?? 1;\n const ssaa = options.ssaa ?? 2;\n const sm = this._configurator.getSceneManager();\n const renderer = sm.getRenderer();\n if (!renderer) {\n throw new Error('HeadlessRoomleSdk: renderer is not available');\n }\n\n let originalWidth: number | undefined;\n let originalHeight: number | undefined;\n\n // Temporarily resize renderer for SSAA supersampling\n if (ssaa > 1) {\n const roomleRenderer = sm.getRoomleRenderer();\n const canvas = renderer.domElement;\n originalWidth = canvas.width;\n originalHeight = canvas.height;\n roomleRenderer?.setSize(originalWidth! * ssaa, originalHeight! * ssaa);\n }\n\n let dataUrl: string = await sm.exportCanvasScreenshot(quality);\n\n // Restore original size and downscale\n if (ssaa > 1 && originalWidth && originalHeight) {\n sm.getRoomleRenderer()?.setSize(originalWidth, originalHeight);\n dataUrl = await this._ssaaDownscale(\n dataUrl,\n originalWidth,\n originalHeight,\n );\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = dataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl };\n }\n\n async exportPerspectiveImage(\n outputPath?: string,\n options: PerspectiveImageExportOptions = {},\n ): Promise<{ dataUrl: string; width: number; height: number }> {\n this._ensureInitialized();\n\n const ssaa = options.ssaa ?? 2;\n const targetSize = options.size ?? 1024;\n const renderSize = targetSize * ssaa;\n\n const result = await this._configurator.preparePerspectiveImage({\n ...options,\n size: renderSize,\n });\n\n let finalDataUrl = result.image;\n let finalWidth = result.width;\n let finalHeight = result.height;\n\n // Downscale with SSAA if rendering at higher resolution, achieves antialiasing effect.\n if (ssaa > 1) {\n finalDataUrl = await this._ssaaDownscale(\n finalDataUrl,\n targetSize,\n targetSize,\n );\n finalWidth = targetSize;\n finalHeight = targetSize;\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = finalDataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl: finalDataUrl, width: finalWidth, height: finalHeight };\n }\n\n async exportTopImage(\n outputPath?: string,\n options: TopImageExportOptions = {},\n ): Promise<{ dataUrl: string; width: number; height: number }> {\n this._ensureInitialized();\n\n const ssaa = options.ssaa ?? 2;\n const result = await this._configurator.prepareTopImage({\n ...options,\n size: (options.size ?? 1024) * ssaa,\n showDimensions: options.showDimensions ?? false,\n });\n\n let finalDataUrl = result.image;\n let finalWidth = result.width;\n let finalHeight = result.height;\n\n if (ssaa > 1) {\n const targetWidth = Math.round(finalWidth / ssaa);\n const targetHeight = Math.round(finalHeight / ssaa);\n finalDataUrl = await this._ssaaDownscale(\n finalDataUrl,\n targetWidth,\n targetHeight,\n );\n finalWidth = targetWidth;\n finalHeight = targetHeight;\n }\n\n if (outputPath) {\n const fs = await import('fs');\n const base64 = finalDataUrl.replace(/^data:image\\/\\w+;base64,/, '');\n fs.writeFileSync(outputPath, Buffer.from(base64, 'base64'));\n }\n\n return { dataUrl: finalDataUrl, width: finalWidth, height: finalHeight };\n }\n\n /** Downscale a data URL image to target dimensions using high-quality filtering. */\n private async _ssaaDownscale(\n dataUrl: string,\n targetWidth: number,\n targetHeight: number,\n ): Promise<string> {\n const { createCanvas, loadImage } = await import('@napi-rs/canvas');\n const imgBuffer = Buffer.from(\n dataUrl.replace(/^data:image\\/\\w+;base64,/, ''),\n 'base64',\n );\n const img = await loadImage(imgBuffer);\n const outCanvas = createCanvas(targetWidth, targetHeight);\n const ctx = outCanvas.getContext('2d');\n (ctx as any).imageSmoothingEnabled = true;\n (ctx as any).imageSmoothingQuality = 'high';\n ctx.drawImage(img, 0, 0, targetWidth, targetHeight);\n return outCanvas.toDataURL('image/png');\n }\n\n getConfiguratorApi() {\n return this._configurator;\n }\n\n getPlannerApi() {\n return this._planner;\n }\n\n async destroy() {\n if (this._configuratorMain) {\n this._configuratorMain.destroy();\n }\n if (this._plannerMain) {\n this._plannerMain.destroy();\n }\n }\n\n private _ensureInitialized() {\n if (!this._initialized) {\n throw new Error(\n 'HeadlessRoomleSdk not initialized. Call HeadlessRoomleSdk.create() first.',\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;AAUA,IAAM,IAAW,EAAc,OAAO,KAAK,IAAI,EAE3C,IAAuC,EAAE,EAIvC,IAEF;CACF;EACE;EACA;EACA;EACD;CACD;EACE;EACA;EACA;EACD;CACD;EACE;EACA;EACA;EACD;CACF,EAEoB,IAArB,MAA6D;CAG3D,YAAY,GAAiB;AAC3B,OAAK,YAAY;;CAGnB,MAAa,MAAM,GAAa,GAAyB;AACvD,MAAI,EAAS,EAAQ,IACnB;AAKF,MAAI,OAAO,KAAQ,YAAY;AAE7B,GADA,KAAK,iBAAiB,EAAI,EAC1B,EAAS,EAAQ,MAAM;AACvB;;EAGF,IAAM,IAAQ,KAAK,cAAc,EAAI;AACrC,MAAI,GAAO;GACT,IAAM,GAAG,GAAY,KAAc,GAK7B,IAAM,EADO,EAAI,WAAW,IAAI,GAAG,IAAM,EACf;AAEhC,GADC,WAAmB,KAAc,EAAI,WAAW,GACjD,EAAS,EAAQ,MAAM;;;CAO3B,iBAAyB,GAAqB;EAC5C,IAAM,IAAS,EAAQ,UAAU;AACjC,OAAK,IAAM,CAAC,GAAU,MAAe,EACnC,KAAI,EAAO,SAAS,EAAS,EAAE;AAC5B,cAAmB,KAAc;AAClC;;AAGJ,UAAQ,KACN,uEACD;;CAGH,cAAsB,GAAa;AACjC,OAAK,IAAM,KAAS,GAAgB;GAClC,IAAM,CAAC,GAAU,KAAc,GACzB,IAAW;AACjB,OAAI,EAAI,SAAS,EAAS,IAAI,EAAI,SAAS,EAAS,CAClD,QAAO;;AAgBX,SAZI,EAAI,SAAS,eAAe,GACvB,EAAe,KAEpB,EAAI,SAAS,UAAU,GAClB,EAAe,KAEpB,EAAI,SAAS,QAAQ,GAChB,EAAe,MAExB,QAAQ,KACN,2DAA2D,IAC5D,EACM;;CAGT,YAAmB,GAA8C;EAC/D,IAAM,IAAW,EAAQ,KAAK,MAC5B,KAAK,MAAM,EAAO,MAAM,EAAE,IAAI,EAAO,IAAI,CAAC,CAC3C;AACD,SAAO,QAAQ,IAAI,EAAS;;CAG9B,mBAA0B,GAGxB;AACA,SAAO,EAAoB,EAAK;;CAGlC,UAAiB;AACf,MAAW,EAAE;;GEhHI,IAArB,MAA8E;CAI5E,IAAY,oBAAkD;AAC5D,SAAQ,WAAmB,aAAa,OACtC,sBACA,KAAK,UACN;;CAOH,IAAI,UAAe;AACjB,SAAO,KAAK;;CAGd,YAAY,GAAiB,IAAQ,MAAM,IAAS,KAAK;AAGvD,EAFA,KAAK,YAAY,GACjB,KAAK,SAAS,GACd,KAAK,UAAU;EAEf,IAAM,IAAI,KAAK,QACT,IAAI,KAAK;AACf,OAAK,eAAe;GAClB,aAAa;GACb,cAAc;GACd,cAAc;GACd,cAAc;GACd,OAAO,EAAE;GACT,WAAW;IACT,MAAM;IACN,SAAS;IACT,WAAW;AACT,YAAO;;IAEV;GACD,eAAe;GACf,eAA8B;AAC5B,WAAO;;GAET,UAAU,EAAE;GACZ,wBAAwB;AACtB,WAAO;KACL,GAAG;KACH,GAAG;KACH,OAAO;KACP,QAAQ;KACR,KAAK;KACL,MAAM;KACN,QAAQ;KACR,OAAO;KACR;;GAEH,mBAAmB;GACnB,sBAAsB;GACtB,gBAAgB;AACd,WAAO;;GAET,aAAa;GACb,cAAc;GACd,aAAa;GACb,cAAc;GACd,WAAW;AACT,WAAO;;GAEV;;CAGH,cAAqB,GAAe;CAIpC,sBAA6B;AAC3B,SAAO,IAAI,EAAQ,KAAK,QAAQ,KAAK,QAAQ;;CAG/C,iBAAwB;AACtB,SAAO,KAAK,SAAS,KAAK;;CAG5B,oBAA2B;CAC3B,QAAe;CACf,QAAe;CACf,SAAgB;CAChB,UAAiB;GC1FE,IAArB,MAA2D;CAGzD,YAAY,GAAiB;AAC3B,OAAK,YAAY;;CAGnB,MAAa,GAAoB;AAC/B,SAAO,QAAQ,SAAS;;CAG1B,YAAmB,GAAmC;AACpD,SAAO,QAAQ,SAAS;;CAG1B,aAAoB,GAAgB;AAClC,SAAO,QAAQ,SAAS;;CAG1B,kBAAyB,GAAgB;AACvC,SAAO,QAAQ,SAAS;;CAG1B,mBAA0B,GAA8B;AACtD,SAAO,QAAQ,SAAS;;CAG1B,mBAA0B,GAAoB;AAC5C,SAAO;;CAGT,UAAiB,GAAkB,GAAyB,GAAY;CAIxE,aAAoB,GAAa,IAA0B,IAAe;AACxE,SAAO;;CAGT,kBAAyB,GAAgC;CAIzD,kBAAyB,GAAc,GAAc;GCW1C,IAAb,MAAa,EAAkB;;sBAKN,kBACN,qBACC;;CAElB,aAAa,OAAO,GAAwD;EAC1E,IAAM,IAAW,IAAI,GAAmB;AAExC,SADA,MAAM,EAAS,MAAM,EAAS,EACvB;;CAGT,MAAc,MAAM,GAA4B;AAkB9C,EAjBA,KAAK,SAAS,EAAS,SAAS,MAChC,KAAK,UAAU,EAAS,UAAU,KAKlC,KAAK,0BAA0B,KAAK,QAAQ,KAAK,QAAQ,EAEzD,MAAM,EAAU,kBAAkB;GAChC,gBAAgB,EAAS;GACzB,QAAQ,EAAS;GAEjB,QAAQ,EAAS;GACjB,iBAAiB,EAAS;GAC1B,eAAe;GAChB,CAAC,EAEF,KAAK,eAAe;;CAGtB,0BAAkC,GAAe,GAAgB;EAK/D,IAAM,IAAY,IAAI,GAAW;AAChC,aAAmB,cAAc;EAIlC,MAAM,UAA+B,EAAkB;GACrD,YAAY,GAAiB;AAC3B,UAAM,GAAS,GAAO,EAAO;;;EAIjC,IAAM,IAAoB;GACxB,IAAI,EACF,iBACA,GACA,EAAQ,QACT;GACD,IAAI,EACF,cACA,GACA,EAAQ,QACT;GACD,IAAI,EAA8B,eAAe,EAAmB;GACrE,EAKK,IAAc,EAAU,UAAU;AAmCxC,EAlCA,EAAU,UAAU,oCAAoC,SACtD,GACA;AAEA,GADA,EAAY,KAAK,MAAM,EAAW,EAClC,EAAY,KAAK,MAAM,EAAkB;KAM1C,EAAmB,UAAkB,uBAAuB,WAAY;GACvE,IAAM,IAAS;AACf,UAAO,IAAI,MAAM,GAAQ,EACvB,IAAI,GAAG,GAAM;IACX,IAAM,IAAO,EAAe;AAa5B,WAZI,OAAO,KAAQ,aACV,SAAU,GAAG,GAAa;AAC/B,SAAI;AACF,aAAO,EAAI,MAAM,GAAQ,EAAK;cACvB,GAAG;AACV,cAAQ,MACN,+BAA+B,OAAO,EAAK,CAAC,WAC5C,EACD;;QAIA;MAEV,CAAC;KAKJ,EAAU,kCAAkC,EAAY;;CAG1D,MAAM,kBACJ,GACA,GACe;AACf,OAAK,oBAAoB;EAEzB,IAAM,IAAqB,MAAM,EAAU,gBAAgB,EAAS;AAGpE,EAFA,MAAM,EAAmB,MAAM,EAC/B,KAAK,oBAAoB,GACzB,KAAK,gBAAgB,EAAmB,QAAQ;EAEhD,IAAM,IAAc;GAClB,aAAa,KAAK;GAClB,cAAc,KAAK;GACnB,cAAc;GACd,cAAc;GACd,OAAO,EAAE;GACT,WAAW,EAAE,MAAM,IAAI;GACxB;AAGD,EAFA,MAAM,KAAK,cAAc,KAAK,EAAmB,EAEjD,MAAM,KAAK,cAAc,yBAAyB,EAAgB;;CAGpE,MAAM,SACJ,GACA,GACe;AACf,OAAK,oBAAoB;EAEzB,IAAM,IAAgB,MAAM,EAAU,WAAW,EAAS;AAG1D,EAFA,MAAM,EAAc,MAAM,EAC1B,KAAK,eAAe,GACpB,KAAK,WAAW,EAAc,QAAQ;EAEtC,IAAM,IAAc;GAClB,aAAa,KAAK;GAClB,cAAc,KAAK;GACnB,cAAc;GACd,cAAc;GACd,OAAO,EAAE;GACT,WAAW,EAAE,MAAM,IAAI;GACxB;AAGD,EAFA,MAAM,KAAK,SAAS,KAAK,EAAmB,EAE5C,MAAM,KAAK,SAAS,SAAS,EAAO;;CAGtC,MAAM,UAAU,GAA4C;AAC1D,SAAO,KAAK,QAAQ,GAAY,MAAM;;CAGxC,MAAM,WAAW,GAA4C;AAC3D,SAAO,KAAK,QAAQ,GAAY,OAAO;;CAGzC,MAAc,QACZ,GACA,GACuB;AACvB,OAAK,oBAAoB;EAEzB,IAAM,IAAK,KAAK,cAAc,iBAAiB,EACzC,IACJ,MAAS,QAAQ,MAAM,EAAG,iBAAiB,GAAG,MAAM,EAAG,kBAAkB;AAE3E,MAAI,CAAC,EACH,OAAU,MAAM,GAAG,EAAK,aAAa,CAAC,0BAA0B;EAKlE,IAAM,IACJ,aAAkB,cACd,IACE,EAAsB;AAO9B,SALI,MACS,MAAM,OAAO,OACrB,cAAc,GAAY,OAAO,KAAK,EAAY,CAAC,EAGjD,EAAE,QAAQ,GAAa;;CAGhC,MAAM,iBACJ,GACA,IAAmC,EAAE,EACP;AAC9B,OAAK,oBAAoB;EAEzB,IAAM,IAAU,EAAQ,WAAW,GAC7B,IAAO,EAAQ,QAAQ,GACvB,IAAK,KAAK,cAAc,iBAAiB,EACzC,IAAW,EAAG,aAAa;AACjC,MAAI,CAAC,EACH,OAAU,MAAM,+CAA+C;EAGjE,IAAI,GACA;AAGJ,MAAI,IAAO,GAAG;GACZ,IAAM,IAAiB,EAAG,mBAAmB,EACvC,IAAS,EAAS;AAGxB,GAFA,IAAgB,EAAO,OACvB,IAAiB,EAAO,QACxB,GAAgB,QAAQ,IAAiB,GAAM,IAAkB,EAAK;;EAGxE,IAAI,IAAkB,MAAM,EAAG,uBAAuB,EAAQ;AAY9D,MATI,IAAO,KAAK,KAAiB,MAC/B,EAAG,mBAAmB,EAAE,QAAQ,GAAe,EAAe,EAC9D,IAAU,MAAM,KAAK,eACnB,GACA,GACA,EACD,GAGC,GAAY;GACd,IAAM,IAAK,MAAM,OAAO,OAClB,IAAS,EAAQ,QAAQ,4BAA4B,GAAG;AAC9D,KAAG,cAAc,GAAY,OAAO,KAAK,GAAQ,SAAS,CAAC;;AAG7D,SAAO,EAAE,YAAS;;CAGpB,MAAM,uBACJ,GACA,IAAyC,EAAE,EACkB;AAC7D,OAAK,oBAAoB;EAEzB,IAAM,IAAO,EAAQ,QAAQ,GACvB,IAAa,EAAQ,QAAQ,MAC7B,IAAa,IAAa,GAE1B,IAAS,MAAM,KAAK,cAAc,wBAAwB;GAC9D,GAAG;GACH,MAAM;GACP,CAAC,EAEE,IAAe,EAAO,OACtB,IAAa,EAAO,OACpB,IAAc,EAAO;AAazB,MAVI,IAAO,MACT,IAAe,MAAM,KAAK,eACxB,GACA,GACA,EACD,EACD,IAAa,GACb,IAAc,IAGZ,GAAY;GACd,IAAM,IAAK,MAAM,OAAO,OAClB,IAAS,EAAa,QAAQ,4BAA4B,GAAG;AACnE,KAAG,cAAc,GAAY,OAAO,KAAK,GAAQ,SAAS,CAAC;;AAG7D,SAAO;GAAE,SAAS;GAAc,OAAO;GAAY,QAAQ;GAAa;;CAG1E,MAAM,eACJ,GACA,IAAiC,EAAE,EAC0B;AAC7D,OAAK,oBAAoB;EAEzB,IAAM,IAAO,EAAQ,QAAQ,GACvB,IAAS,MAAM,KAAK,cAAc,gBAAgB;GACtD,GAAG;GACH,OAAO,EAAQ,QAAQ,QAAQ;GAC/B,gBAAgB,EAAQ,kBAAkB;GAC3C,CAAC,EAEE,IAAe,EAAO,OACtB,IAAa,EAAO,OACpB,IAAc,EAAO;AAEzB,MAAI,IAAO,GAAG;GACZ,IAAM,IAAc,KAAK,MAAM,IAAa,EAAK,EAC3C,IAAe,KAAK,MAAM,IAAc,EAAK;AAOnD,GANA,IAAe,MAAM,KAAK,eACxB,GACA,GACA,EACD,EACD,IAAa,GACb,IAAc;;AAGhB,MAAI,GAAY;GACd,IAAM,IAAK,MAAM,OAAO,OAClB,IAAS,EAAa,QAAQ,4BAA4B,GAAG;AACnE,KAAG,cAAc,GAAY,OAAO,KAAK,GAAQ,SAAS,CAAC;;AAG7D,SAAO;GAAE,SAAS;GAAc,OAAO;GAAY,QAAQ;GAAa;;CAI1E,MAAc,eACZ,GACA,GACA,GACiB;EACjB,IAAM,EAAE,iBAAc,iBAAc,MAAM,OAAO,oBAK3C,IAAM,MAAM,EAJA,OAAO,KACvB,EAAQ,QAAQ,4BAA4B,GAAG,EAC/C,SACD,CACqC,EAChC,IAAY,EAAa,GAAa,EAAa,EACnD,IAAM,EAAU,WAAW,KAAK;AAItC,SAHC,EAAY,wBAAwB,IACpC,EAAY,wBAAwB,QACrC,EAAI,UAAU,GAAK,GAAG,GAAG,GAAa,EAAa,EAC5C,EAAU,UAAU,YAAY;;CAGzC,qBAAqB;AACnB,SAAO,KAAK;;CAGd,gBAAgB;AACd,SAAO,KAAK;;CAGd,MAAM,UAAU;AAId,EAHI,KAAK,qBACP,KAAK,kBAAkB,SAAS,EAE9B,KAAK,gBACP,KAAK,aAAa,SAAS;;CAI/B,qBAA6B;AAC3B,MAAI,CAAC,KAAK,aACR,OAAU,MACR,4EACD"}
|
package/lib/roomle-sdk.d.ts
CHANGED
|
@@ -308,7 +308,7 @@ export declare abstract class CameraBehaviour {
|
|
|
308
308
|
private _cameraChangeListener;
|
|
309
309
|
constructor(cameraControl: CameraControl, state: CameraBehaviourState);
|
|
310
310
|
abstract get cameraControl(): CameraControl;
|
|
311
|
-
protected get state(): CameraBehaviourState;
|
|
311
|
+
protected get state(): CameraBehaviourState | null;
|
|
312
312
|
setCameraChangeListener(callback: () => void): void;
|
|
313
313
|
removeCameraChangeListener(): void;
|
|
314
314
|
protected _onCameraChanged(): void;
|
|
@@ -671,7 +671,7 @@ export declare interface CleanupOptions {
|
|
|
671
671
|
export declare type ColorsIn3dScene = Record<RoomleColors, HexColorString | HexColorNumber>;
|
|
672
672
|
|
|
673
673
|
export declare interface CommonConfiguratorKernelCallbackI {
|
|
674
|
-
Editor3dComponentCreated(
|
|
674
|
+
Editor3dComponentCreated(componentDocking: KernelComponentDocking): void;
|
|
675
675
|
Editor3dAddMesh(runtimeComponentId: number, meshId: number, geometryName: string, environmentGeometry: boolean, meshAttributes: KernelMeshAttributes, meshBuffer: KernelMeshBuffer): void;
|
|
676
676
|
Editor3ChangedMesh(runtimeComponentId: number, meshId: number, geometryName: string, meshAttributes: KernelMeshAttributes): void;
|
|
677
677
|
Editor3dRemoveMesh(runtimeComponentId: number, meshId: number): void;
|
|
@@ -679,7 +679,7 @@ export declare interface CommonConfiguratorKernelCallbackI {
|
|
|
679
679
|
componentConfigurationUpdated(runtimeComponentId: number, geometryChanged: boolean): void;
|
|
680
680
|
Editor3dBeginConstruction(componentId: number, isDeltaUpdate: boolean): void;
|
|
681
681
|
Editor3dEndConstruction(id: number): void;
|
|
682
|
-
Editor3dComponentDocked(
|
|
682
|
+
Editor3dComponentDocked(componentDocking: KernelComponentDocking): void;
|
|
683
683
|
Editor3dGeometryReady(id: number): void;
|
|
684
684
|
Editor3dGeometryNotReady(id: number): void;
|
|
685
685
|
componentDeleted(componentId: number): void;
|
|
@@ -952,8 +952,8 @@ export declare abstract class CommonKernelAccess implements LifeCycleCallbacks,
|
|
|
952
952
|
Editor3dChangedLightSource(runtimeComponentId: number, lightSourceId: number, lightSourceAttributes: KernelLightSourceAttributes): void;
|
|
953
953
|
Editor3dBeginConstruction(id: number, isDeltaUpdate: boolean): void;
|
|
954
954
|
Editor3dEndConstruction(id: number): void;
|
|
955
|
-
Editor3dComponentCreated(
|
|
956
|
-
Editor3dComponentDocked(
|
|
955
|
+
Editor3dComponentCreated(componentDocking: KernelComponentDocking): void;
|
|
956
|
+
Editor3dComponentDocked(componentDocking: KernelComponentDocking): void;
|
|
957
957
|
Editor3dGeometryReady(id: number): void;
|
|
958
958
|
Editor3dGeometryNotReady(id: number): void;
|
|
959
959
|
componentDeleted(componentId: number): void;
|
|
@@ -1329,7 +1329,7 @@ export declare class ConfiguratorKernelAccess extends CommonKernelAccess {
|
|
|
1329
1329
|
meshId: string;
|
|
1330
1330
|
quality: number;
|
|
1331
1331
|
}>): Promise<void>;
|
|
1332
|
-
Editor3dComponentCreated(
|
|
1332
|
+
Editor3dComponentCreated(componentDocking: KernelComponentDocking): void;
|
|
1333
1333
|
Editor3dPlanObjectConstructionDone(planObjectId: number): void;
|
|
1334
1334
|
Editor3dBeginGroup(): void;
|
|
1335
1335
|
Editor3dEndGroup(): void;
|
|
@@ -1392,7 +1392,7 @@ export declare interface ConfiguratorKernelCallbackI extends CommonConfiguratorK
|
|
|
1392
1392
|
Editor3dSetPreviewAssociations(dockPairs: KernelDockPairPreview[], previewId: number): void;
|
|
1393
1393
|
Editor3dPreviewConstructionDone(componentId: number, objectId: number): void;
|
|
1394
1394
|
Editor3dPlanObjectConstructionDone(planObjectId: number): void;
|
|
1395
|
-
Editor3dComponentDocked(
|
|
1395
|
+
Editor3dComponentDocked(componentDocking: KernelComponentDocking): void;
|
|
1396
1396
|
finishParameterChange(resolve: () => void, reject: () => void): void;
|
|
1397
1397
|
updateAnimationParameters(elementId: number | number[], parameters: KernelParameter[]): void;
|
|
1398
1398
|
changeAnimationValue(elementId: number, parameterKey: string, value: string, level: number, animationLevel: AnimationLevelType, animate: boolean): void;
|
|
@@ -1571,7 +1571,7 @@ export declare class ConfiguratorSceneEventHandler extends SceneEventHandler<Sce
|
|
|
1571
1571
|
setCamera(camera: Camera): void;
|
|
1572
1572
|
setObject(object: Object3D): void;
|
|
1573
1573
|
private _findComponentToBeSelected;
|
|
1574
|
-
private
|
|
1574
|
+
private getRootComponent;
|
|
1575
1575
|
}
|
|
1576
1576
|
|
|
1577
1577
|
export declare class ConfiguratorSceneManager extends SceneManager implements ConfiguratorViewModelCallbackI {
|
|
@@ -2059,8 +2059,8 @@ export declare class ConfiguratorViewModel implements ConfiguratorKernelCallback
|
|
|
2059
2059
|
private _removeLightSourceFromComponent;
|
|
2060
2060
|
private _addLightSourceToComponent;
|
|
2061
2061
|
private _changeLightSourceOfComponent;
|
|
2062
|
-
getComponent(componentId: number): RoomleComponent;
|
|
2063
|
-
getNumberOfPossibleChildrenForComponent(componentId: number): number;
|
|
2062
|
+
getComponent(componentId: number): RoomleComponent | null;
|
|
2063
|
+
getNumberOfPossibleChildrenForComponent(componentId: number): number | undefined;
|
|
2064
2064
|
tryToMergeComponents(): void;
|
|
2065
2065
|
private _requestMergeComponents;
|
|
2066
2066
|
private _mergeNextComponent;
|
|
@@ -2079,8 +2079,8 @@ export declare class ConfiguratorViewModel implements ConfiguratorKernelCallback
|
|
|
2079
2079
|
Editor3dAddLightSource(runtimeComponentId: number, lightSourceId: number, lightSourceAttributes: KernelLightSourceAttributes): void;
|
|
2080
2080
|
Editor3dChangedLightSource(runtimeComponentId: number, lightSourceId: number, lightSourceAttributes: KernelLightSourceAttributes): void;
|
|
2081
2081
|
Editor3dBeginConstruction(componentId: number, isDeltaUpdate: boolean): void;
|
|
2082
|
-
Editor3dComponentCreated(
|
|
2083
|
-
Editor3dComponentDocked(
|
|
2082
|
+
Editor3dComponentCreated(componentDocking: KernelComponentDocking): void;
|
|
2083
|
+
Editor3dComponentDocked(componentDocking: KernelComponentDocking): void;
|
|
2084
2084
|
Editor3dEndConstruction(id: number): void;
|
|
2085
2085
|
Editor3dGeometryReady(id: number): void;
|
|
2086
2086
|
Editor3dGeometryNotReady(id: number): void;
|
|
@@ -2114,7 +2114,7 @@ export declare class ConfiguratorViewModel implements ConfiguratorKernelCallback
|
|
|
2114
2114
|
setGeometriesMergedListener(fun: () => void): void;
|
|
2115
2115
|
removeGeometriesMergedListener(): void;
|
|
2116
2116
|
setMergeThreshold(threshold: number): void;
|
|
2117
|
-
protected _generateMesh(runtimeComponentId: number, geometryId: string | null, materialId: string | null, vertices: Float32Array, indices: Int32Array, uvCoords: Float32Array, normals: Float32Array, _type?: KernelEnum, _newGeometryInstance?: boolean, materialAttributes?: Record<string, string>): Mesh;
|
|
2117
|
+
protected _generateMesh(runtimeComponentId: number | undefined, geometryId: string | null | undefined, materialId: string | null, vertices: Float32Array, indices: Int32Array, uvCoords: Float32Array, normals: Float32Array, _type?: KernelEnum, _newGeometryInstance?: boolean, materialAttributes?: Record<string, string>): Mesh;
|
|
2118
2118
|
protected _setMaterial(mesh: Mesh, material: any, _type?: KernelEnum): void;
|
|
2119
2119
|
constructComponents(planObjectId: number): void;
|
|
2120
2120
|
requestSubPartConstruction(partId: number): Promise<Mesh>;
|
|
@@ -2259,6 +2259,12 @@ export declare const CORE_PLAN_COMPONENT_TYPE: {
|
|
|
2259
2259
|
readonly SUB_ARTICLE: 4;
|
|
2260
2260
|
};
|
|
2261
2261
|
|
|
2262
|
+
export declare const CORE_SNAP_STATE: {
|
|
2263
|
+
readonly DEFAULT: 0;
|
|
2264
|
+
readonly DOCKING: 1;
|
|
2265
|
+
readonly COLLISION: 2;
|
|
2266
|
+
};
|
|
2267
|
+
|
|
2262
2268
|
export declare const CORE_TYPE_OF_CORE_ID: {
|
|
2263
2269
|
readonly CONFIGURATOR: 0;
|
|
2264
2270
|
readonly PLANNER: 1;
|
|
@@ -3614,7 +3620,7 @@ export declare class ImageRenderer implements Context {
|
|
|
3614
3620
|
*/
|
|
3615
3621
|
private _renderImageFrameWithCleanScene;
|
|
3616
3622
|
private _compositeWithDimensions;
|
|
3617
|
-
prepareThumbnailImage(scene: Scene, viewModel: PlanViewModel, cameraBehaviour: CameraBehaviour, perspectiveOffsetCamera: PerspectiveCamera, options: PrepareImageOptionsPlanner, onAfterRender: () => void): Promise<Base64Image>;
|
|
3623
|
+
prepareThumbnailImage(scene: Scene, viewModel: PlanViewModel, cameraBehaviour: CameraBehaviour, perspectiveOffsetCamera: PerspectiveCamera, options: PrepareImageOptionsPlanner | undefined, onAfterRender: () => void): Promise<Base64Image>;
|
|
3618
3624
|
private _renderImageFrame;
|
|
3619
3625
|
}
|
|
3620
3626
|
|
|
@@ -3963,6 +3969,15 @@ export declare interface KernelComponent {
|
|
|
3963
3969
|
childAnimationTransformations: ComponentAnimationTransformation[];
|
|
3964
3970
|
}
|
|
3965
3971
|
|
|
3972
|
+
export declare interface KernelComponentDocking {
|
|
3973
|
+
componentId: number;
|
|
3974
|
+
isRootComponent: boolean;
|
|
3975
|
+
parentId: number;
|
|
3976
|
+
position: KernelVector3;
|
|
3977
|
+
rotation: KernelVector3;
|
|
3978
|
+
type: KernelComponentType;
|
|
3979
|
+
}
|
|
3980
|
+
|
|
3966
3981
|
export declare interface KernelComponentType {
|
|
3967
3982
|
value: Enumify<typeof CORE_PLAN_COMPONENT_TYPE>;
|
|
3968
3983
|
}
|
|
@@ -4310,7 +4325,7 @@ export declare class KernelViewModel {
|
|
|
4310
4325
|
protected _coreReference: KernelObject | null;
|
|
4311
4326
|
constructor(reference: KernelObject);
|
|
4312
4327
|
clearReference(): void;
|
|
4313
|
-
getKernelObject(): KernelObject;
|
|
4328
|
+
getKernelObject(): KernelObject | null;
|
|
4314
4329
|
}
|
|
4315
4330
|
|
|
4316
4331
|
export declare interface KernelViewType {
|
|
@@ -4385,7 +4400,7 @@ export declare class LightCache {
|
|
|
4385
4400
|
allowedToSpawnMoreLights(): boolean;
|
|
4386
4401
|
addActiveLight(light: Light): void;
|
|
4387
4402
|
cacheLight(light: Light): void;
|
|
4388
|
-
getLightFromCache(type: KernelLightSourceType): Light;
|
|
4403
|
+
getLightFromCache(type: KernelLightSourceType): Light | null;
|
|
4389
4404
|
clear(): void;
|
|
4390
4405
|
private _setMaximumLights;
|
|
4391
4406
|
}
|
|
@@ -4867,6 +4882,11 @@ export declare interface ObjectMeasurementsTransferable {
|
|
|
4867
4882
|
objectToWallsMeasurements: ObjectToWallDimensionTransferable[];
|
|
4868
4883
|
}
|
|
4869
4884
|
|
|
4885
|
+
export declare interface ObjectSnapInformation {
|
|
4886
|
+
geometryHelpLines: GeometryHelpLineArray;
|
|
4887
|
+
snapState: SnapState;
|
|
4888
|
+
}
|
|
4889
|
+
|
|
4870
4890
|
export declare type ObjectToWallDimensionTransferable = DimensionDefinition<Position2, Position3>;
|
|
4871
4891
|
|
|
4872
4892
|
export declare interface ObjectToWallLine {
|
|
@@ -5243,7 +5263,7 @@ export declare interface PlanModelViewHelper_2 {
|
|
|
5243
5263
|
getExternalObjectGroups(plan: Plan_2): KernelObjectConfigurationArray;
|
|
5244
5264
|
getExternalRoomInformation(plan: Plan_2): RoomInformation;
|
|
5245
5265
|
calculateLightSourceDistribution(plan: Plan_2, lightSourceConfiguration: LightSourceConfiguration): RoomLightSourceDistributionArray;
|
|
5246
|
-
|
|
5266
|
+
getObjectSnapInformation(anObject: PlanObject, debugHelpLines: boolean): ObjectSnapInformation;
|
|
5247
5267
|
}
|
|
5248
5268
|
|
|
5249
5269
|
export declare class Planner<P extends readonly PluginName[] = readonly []> extends Main {
|
|
@@ -5352,7 +5372,7 @@ export declare class PlannerKernelAccess extends ConfiguratorKernelAccess {
|
|
|
5352
5372
|
constructor(creator: string);
|
|
5353
5373
|
protected _loadSuccess(): void;
|
|
5354
5374
|
protected _loadError(): void;
|
|
5355
|
-
get homagIntelligence(): HomagIntelligence;
|
|
5375
|
+
get homagIntelligence(): HomagIntelligence | null;
|
|
5356
5376
|
setHomagIntelligence(homagIntelligence: HomagIntelligence | null): void;
|
|
5357
5377
|
private _createPlanInteractionHandler;
|
|
5358
5378
|
addPlannerListener(listener: PlannerKernelCallbackI): void;
|
|
@@ -5563,7 +5583,7 @@ export declare class PlannerSceneEventHandler extends SceneEventHandler<SceneEve
|
|
|
5563
5583
|
disable(): void;
|
|
5564
5584
|
get planInteractionHandler(): PlanInteractionHandler;
|
|
5565
5585
|
get planModelViewHelper(): PlanModelViewHelper_2;
|
|
5566
|
-
get hoveredObjectId(): number;
|
|
5586
|
+
get hoveredObjectId(): number | null;
|
|
5567
5587
|
get isCurrentlyDrawing(): boolean;
|
|
5568
5588
|
enable(): void;
|
|
5569
5589
|
enableConstructionEvents(enable: boolean): void;
|
|
@@ -5809,8 +5829,8 @@ export declare class PlannerSceneManager extends ConfiguratorSceneManager implem
|
|
|
5809
5829
|
enableAdvancedDocking(): void;
|
|
5810
5830
|
disableAdvancedDocking(): void;
|
|
5811
5831
|
isEnabledChildObjectMode(planElementViewModel: PlanElementViewModel): boolean;
|
|
5812
|
-
enableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject;
|
|
5813
|
-
disableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject;
|
|
5832
|
+
enableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject | null;
|
|
5833
|
+
disableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject | null;
|
|
5814
5834
|
dragIn(dragEvent: DragEvent): void;
|
|
5815
5835
|
getPositionForDragEvent(dragEvent: DragEvent | TouchEvent): Vector3 | null;
|
|
5816
5836
|
getPlannerSceneEventHandler(): PlannerSceneEventHandler;
|
|
@@ -6113,9 +6133,9 @@ export declare class PlanViewModel extends ConfiguratorViewModel implements Plan
|
|
|
6113
6133
|
getFloorPlanObjectViewModels(): FloorPlanElementViewModel[];
|
|
6114
6134
|
getMeasurementLineObjectViewModels(): MeasurementLinePlanElementViewModel[];
|
|
6115
6135
|
getWallAtticsObjectViewModels(): WallAtticPlanElementViewModel[];
|
|
6116
|
-
protected _generateMesh(runtimeComponentId: number, geometryId: string | null, material: any, vertices: Float32Array, indices: Int32Array, uvCoords: Float32Array, normals: Float32Array, type?: KernelEnum, newGeometryInstance?: boolean, materialAttributes?: Record<string, string>): Mesh;
|
|
6136
|
+
protected _generateMesh(runtimeComponentId: number | undefined, geometryId: string | null | undefined, material: any, vertices: Float32Array, indices: Int32Array, uvCoords: Float32Array, normals: Float32Array, type?: KernelEnum, newGeometryInstance?: boolean, materialAttributes?: Record<string, string>): Mesh;
|
|
6117
6137
|
protected _setMaterial(mesh: Mesh, material: any, _type?: KernelEnum, materialAttributes?: Record<string, string>): void;
|
|
6118
|
-
Editor3dComponentCreated(
|
|
6138
|
+
Editor3dComponentCreated(componentDocking: KernelComponentDocking): void;
|
|
6119
6139
|
addPlanObjectToScene(_planViewModel: PlanObjectViewModel | null): void;
|
|
6120
6140
|
handlerSwitchedPlans(_fromPlan: Plan_2, _toPlan: Plan_2): void;
|
|
6121
6141
|
planCompletelyLoaded(_plan: Plan_2): void;
|
|
@@ -6725,7 +6745,7 @@ export declare class RapiAccess implements Context {
|
|
|
6725
6745
|
updateCache(rapiPath: RAPI_PATHS, data: RapiJson & {
|
|
6726
6746
|
id: RapiId;
|
|
6727
6747
|
}): void;
|
|
6728
|
-
getExternalObjects(externalObjectIds: Array<`__ext__obj__#${string}`>): Promise<
|
|
6748
|
+
getExternalObjects(externalObjectIds: Array<`__ext__obj__#${string}`>): Promise<ExternalDataResponse<ExternalConfiguration>[] | undefined>;
|
|
6729
6749
|
}
|
|
6730
6750
|
|
|
6731
6751
|
export declare interface RapiAdditionalContent extends RapiJson {
|
|
@@ -7235,7 +7255,7 @@ export declare class RaycastHelper extends EventDispatcher<Record<RAYCAST_EVENT,
|
|
|
7235
7255
|
setCamera(camera: Camera): void;
|
|
7236
7256
|
setObject(object: Object3D): void;
|
|
7237
7257
|
setMode(mode: INTERSECTION_MODE): void;
|
|
7238
|
-
intersectMouseOnScene(event: Pick<PointerInputEvent, 'positionRelative'>): KernelVector3;
|
|
7258
|
+
intersectMouseOnScene(event: Pick<PointerInputEvent, 'positionRelative'>): KernelVector3 | null;
|
|
7239
7259
|
enableOnWallSnapping(): void;
|
|
7240
7260
|
disableOnWallSnapping(): void;
|
|
7241
7261
|
getCameraPosition(): Vector3;
|
|
@@ -7291,7 +7311,7 @@ export declare class RoomDesignerApi implements RoomDesignerRequests {
|
|
|
7291
7311
|
deleteRootModule(rootModuleId: string): void;
|
|
7292
7312
|
getPosDataOfAllGroups(): Promise<PosGroup[]>;
|
|
7293
7313
|
getRoomInformation(): Promise<ExternalRoomInformation>;
|
|
7294
|
-
saveExternalObjectSnapshot(): Promise<ExternalObjectSnapshotSaveResult>;
|
|
7314
|
+
saveExternalObjectSnapshot(): Promise<ExternalObjectSnapshotSaveResult | null>;
|
|
7295
7315
|
saveCurrentPlanSnapshot(): Promise<RapiPlanSnapshotGetData>;
|
|
7296
7316
|
renderPosDataImage(posDataJson: object): Promise<void>;
|
|
7297
7317
|
}
|
|
@@ -7654,7 +7674,7 @@ export declare class RoomleConfigurator<P extends readonly PluginName[] = readon
|
|
|
7654
7674
|
* @param value
|
|
7655
7675
|
* @param parameter
|
|
7656
7676
|
*/
|
|
7657
|
-
formatValueToUnitString(value: number, parameter: KernelParameter): string | number;
|
|
7677
|
+
formatValueToUnitString(value: number, parameter: KernelParameter): string | number | null;
|
|
7658
7678
|
/**
|
|
7659
7679
|
* Get tag for a given tag id
|
|
7660
7680
|
*
|
|
@@ -7999,8 +8019,8 @@ export declare class RoomleConfigurator<P extends readonly PluginName[] = readon
|
|
|
7999
8019
|
*/
|
|
8000
8020
|
getChildrenOfPlanComponent(componentRuntimeId: number, onlyPossible?: boolean, onlyVisible?: boolean): Promise<{
|
|
8001
8021
|
tags: UiPossibleChildTag[];
|
|
8002
|
-
defaultChild: UiPossibleChild;
|
|
8003
|
-
}>;
|
|
8022
|
+
defaultChild: UiPossibleChild | undefined;
|
|
8023
|
+
} | null>;
|
|
8004
8024
|
/**
|
|
8005
8025
|
* Returns all possible children and the default child for the plan object
|
|
8006
8026
|
* @param onlyPossible: boolean true if you only want possibleChildren
|
|
@@ -8008,8 +8028,8 @@ export declare class RoomleConfigurator<P extends readonly PluginName[] = readon
|
|
|
8008
8028
|
*/
|
|
8009
8029
|
getChildrenOfPlanObject(onlyPossible?: boolean, onlyVisible?: boolean): Promise<{
|
|
8010
8030
|
tags: UiPossibleChildTag[];
|
|
8011
|
-
defaultChild: UiPossibleChild;
|
|
8012
|
-
}>;
|
|
8031
|
+
defaultChild: UiPossibleChild | undefined;
|
|
8032
|
+
} | null>;
|
|
8013
8033
|
private _addAdditionalInfoToPossibleChildren;
|
|
8014
8034
|
private _getPossibleChildrenForKernelPossibleChildren;
|
|
8015
8035
|
private _addPossibleChildren;
|
|
@@ -8547,11 +8567,11 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
|
|
|
8547
8567
|
/**
|
|
8548
8568
|
* enable interaction with child components of configurable objects in the plan
|
|
8549
8569
|
*/
|
|
8550
|
-
enableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject;
|
|
8570
|
+
enableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject | null;
|
|
8551
8571
|
/**
|
|
8552
8572
|
* disable interaction with child components of configurable objects in the plan
|
|
8553
8573
|
*/
|
|
8554
|
-
disableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject;
|
|
8574
|
+
disableChildObjects(planElementViewModel: PlanElementViewModel): KernelObject | null;
|
|
8555
8575
|
/**
|
|
8556
8576
|
* get the Partlist of certain runtimeID
|
|
8557
8577
|
* can be used if partlist of a selected Item is needed
|
|
@@ -8565,7 +8585,7 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
|
|
|
8565
8585
|
* @param value
|
|
8566
8586
|
* @param parameter
|
|
8567
8587
|
*/
|
|
8568
|
-
formatValueToUnitString(value: number, parameter: KernelParameter): string | number;
|
|
8588
|
+
formatValueToUnitString(value: number, parameter: KernelParameter): string | number | null;
|
|
8569
8589
|
/**
|
|
8570
8590
|
* Draws walls according to the wall definitions
|
|
8571
8591
|
* this can be used to create a room on the fly
|
|
@@ -8801,24 +8821,24 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
|
|
|
8801
8821
|
redo(): Promise<void>;
|
|
8802
8822
|
setHomagIntelligence(homagIntelligence: HomagIntelligence): void;
|
|
8803
8823
|
private _getSubArticleId;
|
|
8804
|
-
newPosDataFromId(id: string): Promise<PosGroup
|
|
8824
|
+
newPosDataFromId(id: string): Promise<PosGroup | undefined> | undefined;
|
|
8805
8825
|
/**
|
|
8806
8826
|
* deprecated, use placeOrder() instead
|
|
8807
8827
|
*/
|
|
8808
|
-
sendToOM(withPrice?: boolean): Promise<void
|
|
8828
|
+
sendToOM(withPrice?: boolean): Promise<void> | undefined;
|
|
8809
8829
|
/**
|
|
8810
8830
|
* Places an order via Homag Intelligence module
|
|
8811
8831
|
* @param withPrice whether to include price information in the order
|
|
8812
8832
|
* @param orderHeader optional order header information
|
|
8813
8833
|
*/
|
|
8814
|
-
placeOrder(withPrice?: boolean, orderHeader?: HiOrderHeader): Promise<void
|
|
8834
|
+
placeOrder(withPrice?: boolean, orderHeader?: HiOrderHeader): Promise<void> | undefined;
|
|
8815
8835
|
/**
|
|
8816
8836
|
* Fetches the price for the current plan via Homag Intelligence module
|
|
8817
8837
|
* @param planId optional plan ID to fetch the price for
|
|
8818
8838
|
* @param orderHeader optional order header information
|
|
8819
8839
|
*/
|
|
8820
8840
|
fetchPrice(planId?: string, orderHeader?: HiOrderHeader): Promise<any>;
|
|
8821
|
-
getOrderManagerGroupData(planId?: string): Promise<HiOrderData>;
|
|
8841
|
+
getOrderManagerGroupData(planId?: string): Promise<HiOrderData | null | undefined>;
|
|
8822
8842
|
getRapiAccess(): RapiAccess;
|
|
8823
8843
|
getElementOpenCloseAnimation(planElement: PlanElementViewModel, componentIds?: number[]): AnimationKeyAndValue | null;
|
|
8824
8844
|
/**
|
|
@@ -9256,7 +9276,7 @@ export declare abstract class SceneManager implements Context, LifeCycleCallback
|
|
|
9256
9276
|
addEventListener(_listener: LifeCycleCallbacks): void;
|
|
9257
9277
|
removeEventListener(_listener: LifeCycleCallbacks): void;
|
|
9258
9278
|
get lightCache(): LightCache | null;
|
|
9259
|
-
getRoomleRenderer(): GenericRoomleRenderer;
|
|
9279
|
+
getRoomleRenderer(): GenericRoomleRenderer | null;
|
|
9260
9280
|
getRenderer(): WebGLRenderer | WebGPURenderer | null;
|
|
9261
9281
|
protected _changeCameraBehaviour(cameraBehaviour: CameraBehaviour): void;
|
|
9262
9282
|
protected onCameraChanged(): void;
|
|
@@ -9330,7 +9350,7 @@ export declare abstract class SceneManager implements Context, LifeCycleCallback
|
|
|
9330
9350
|
protected _hasCameraControl2D(): boolean;
|
|
9331
9351
|
protected _getCameraControl2D(): CameraControl2D;
|
|
9332
9352
|
protected _getCameraControlFirstPerson(): CameraControlFirstPerson;
|
|
9333
|
-
createUSDZExport(): Promise<Uint8Array<ArrayBuffer
|
|
9353
|
+
createUSDZExport(): Promise<Uint8Array<ArrayBuffer> | undefined>;
|
|
9334
9354
|
exportUSDZ(): Promise<void>;
|
|
9335
9355
|
createExportGLB(objectFilter?: (object: Object3D) => boolean): Promise<ArrayBuffer | null>;
|
|
9336
9356
|
exportGLB(): Promise<void>;
|
|
@@ -9424,6 +9444,10 @@ export declare const enum SnapMode {
|
|
|
9424
9444
|
WITHIN_SNAP_DISTANCE = 3
|
|
9425
9445
|
}
|
|
9426
9446
|
|
|
9447
|
+
export declare interface SnapState {
|
|
9448
|
+
value: Enumify<typeof CORE_SNAP_STATE>;
|
|
9449
|
+
}
|
|
9450
|
+
|
|
9427
9451
|
export declare interface StaticComponent extends RoomleComponent {
|
|
9428
9452
|
glbUrl: string;
|
|
9429
9453
|
}
|
|
@@ -9436,7 +9460,7 @@ export declare class StaticPlanObjectViewModel extends PlanObjectViewModel {
|
|
|
9436
9460
|
constructor(planObject: PlanObject);
|
|
9437
9461
|
setRapiItem(rapiItem: RapiItem): Promise<void>;
|
|
9438
9462
|
private _addStaticItem;
|
|
9439
|
-
getRapiItem(): RapiItem;
|
|
9463
|
+
getRapiItem(): RapiItem | null;
|
|
9440
9464
|
needsRapiItem(): boolean;
|
|
9441
9465
|
getGLBUrl(): string | null;
|
|
9442
9466
|
update(): void;
|
|
@@ -9592,8 +9616,8 @@ export declare class UnitFormatter implements Context {
|
|
|
9592
9616
|
private _initActualUnitStringType;
|
|
9593
9617
|
formatAngleValueToUnitString(value: number, parameter: KernelParameter): string;
|
|
9594
9618
|
parseAngleValueFromUnitString(rotation: string): string;
|
|
9595
|
-
parseValue(value: string, parameter: KernelParameter): string | number;
|
|
9596
|
-
formatValueToUnitString(value: number, parameter: KernelParameter): string | number;
|
|
9619
|
+
parseValue(value: string, parameter: KernelParameter): string | number | null;
|
|
9620
|
+
formatValueToUnitString(value: number, parameter: KernelParameter): string | number | null;
|
|
9597
9621
|
isParseableNumber(aString: string): boolean | null;
|
|
9598
9622
|
isParseableUnitString(aString: string, parameter: KernelParameter): boolean | null;
|
|
9599
9623
|
parseMMValueFromUnitString(aString: string, unitType: string): number | null;
|
package/lib/roomle-sdk.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { i as e, t } from "./kernel-C7YDLxq8.mjs";
|
|
2
|
-
import { A as n, B as r, E as i, G as a, H as o, M as s, N as c, P as l, R as u, U as d, V as f, _ as p, a as m, at as h, c as g, ct as _, g as v, j as y, n as b, ot as x, rt as S, s as C, v as w, y as T, z as E } from "./main-
|
|
3
|
-
import { t as D } from "./configurator-
|
|
4
|
-
import { t as O } from "./planner-
|
|
5
|
-
import { n as k, t as A } from "./glb-viewer-
|
|
6
|
-
import { t as j } from "./api-
|
|
7
|
-
import "./packages-
|
|
2
|
+
import { A as n, B as r, E as i, G as a, H as o, M as s, N as c, P as l, R as u, U as d, V as f, _ as p, a as m, at as h, c as g, ct as _, g as v, j as y, n as b, ot as x, rt as S, s as C, v as w, y as T, z as E } from "./main-_HtiLIhS.mjs";
|
|
3
|
+
import { t as D } from "./configurator-CmMBHkyd.mjs";
|
|
4
|
+
import { t as O } from "./planner-OYwMFSWo.mjs";
|
|
5
|
+
import { n as k, t as A } from "./glb-viewer-Cs3i0yb8.mjs";
|
|
6
|
+
import { t as j } from "./api-DgXsyN04.mjs";
|
|
7
|
+
import "./packages-BhrPUb9k.mjs";
|
|
8
8
|
export { t as CONFIGURATION_TYPE, e as CORE_PERMISSION_TO_DELETE, D as Configurator, m as ConfiguratorUiCallbacks, n as FloorPlanElementViewModel, A as GlbViewer, a as GlobalCallback, u as HI_CONTEXT_ACTION, h as IdbManager, b as Main, T as MeasurementLinePlanElementViewModel, v as PLAN_ELEMENT_CHANGE_TYPES, l as PlanElementViewModel, c as PlanObjectViewModel, O as Planner, S as RapiAccess, j as RoomDesignerApi, i as RoomleConfigurator, k as RoomleGLBViewer, _ as RoomleLightSource, C as RoomlePlanner, p as RoomlePlannerUiCallback, g as RoomleSdk, s as StaticPlanObjectViewModel, y as WallPlanElementViewModel, E as createExtObj, d as createExtObjId, x as getCatalogIdFromConfigurationHash, r as isExtObjId, f as isExternalObject, w as isSafari, o as removeExtObjIdPrefix };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as e, r as t, t as n } from "./decorate-BAtqSPNS.mjs";
|
|
2
|
-
import { Q as r, k as i } from "./main-
|
|
2
|
+
import { Q as r, k as i } from "./main-_HtiLIhS.mjs";
|
|
3
3
|
//#region ../../node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm?no-inline?url
|
|
4
4
|
var a = "" + new URL("ConfiguratorKernel.wasm", import.meta.url).href, o = "" + new URL("ConfiguratorKernel.js", import.meta.url).href, s = "" + new URL("RoomleCore.wasm", import.meta.url).href, c = "" + new URL("RoomleCore.js", import.meta.url).href, l = "" + new URL("RoomleToolsCore.wasm", import.meta.url).href, u = "" + new URL("RoomleToolsCore.js", import.meta.url).href, d = {
|
|
5
5
|
configurator: {
|
|
@@ -83,4 +83,4 @@ n([t, e("design:type", Object)], _.prototype, "_singlePromiseFactory", void 0);
|
|
|
83
83
|
//#endregion
|
|
84
84
|
export { p as n, _ as t };
|
|
85
85
|
|
|
86
|
-
//# sourceMappingURL=script-loader-
|
|
86
|
+
//# sourceMappingURL=script-loader-X4I-gQl2.mjs.map
|