@twinfinity/printing 6.0.1-ci.28782-beta → 6.0.2-beta
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/README.md +3 -3
- package/dist/BuildInfo.js +3 -3
- package/dist/BuildInfo.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/analyzeTemplate.js.map +1 -1
- package/dist/layout/clipUtils.js.map +1 -1
- package/dist/layout/colorConstants.js.map +1 -1
- package/dist/layout/elementKinds.js.map +1 -1
- package/dist/layout/exportDrawing.js.map +1 -1
- package/dist/layout/filters.js.map +1 -1
- package/dist/layout/geometryConstants.js.map +1 -1
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/itemBuilders.js.map +1 -1
- package/dist/layout/labelsRender.js.map +1 -1
- package/dist/layout/legendConstants.js.map +1 -1
- package/dist/layout/legendRender.js.map +1 -1
- package/dist/layout/legendRows.js.map +1 -1
- package/dist/layout/legendUtils.js.map +1 -1
- package/dist/layout/metadata.js.map +1 -1
- package/dist/layout/model.js.map +1 -1
- package/dist/layout/options.js.map +1 -1
- package/dist/layout/presets.js.map +1 -1
- package/dist/layout/qrRender.js.map +1 -1
- package/dist/layout/renderDrawing.js.map +1 -1
- package/dist/layout/renderUtils.js.map +1 -1
- package/dist/layout/sectionValidation.js.map +1 -1
- package/dist/layout/templateVariables.js.map +1 -1
- package/dist/layout/typeGuards.js.map +1 -1
- package/dist/layout/types.js.map +1 -1
- package/dist/layout/utils.js.map +1 -1
- package/dist/layout/validation.js.map +1 -1
- package/dist/layout/validationHelpers.js.map +1 -1
- package/dist/layout/validationUtils.js.map +1 -1
- package/dist/layout/viewportPrep.js.map +1 -1
- package/dist/layout/viewportRender.js.map +1 -1
- package/dist/layout/viewportUtils.js.map +1 -1
- package/dist/layout/warnings.js.map +1 -1
- package/dist/printToPdf.js.map +1 -1
- package/dist/printToSvg.js.map +1 -1
- package/dist/sections.js.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/src/BuildInfo.ts +41 -41
- package/src/index.ts +10 -10
- package/src/layout/analyzeTemplate.ts +218 -218
- package/src/layout/clipUtils.ts +193 -193
- package/src/layout/colorConstants.ts +16 -16
- package/src/layout/elementKinds.ts +35 -35
- package/src/layout/exportDrawing.ts +206 -206
- package/src/layout/filters.ts +80 -80
- package/src/layout/geometryConstants.ts +11 -11
- package/src/layout/index.ts +671 -671
- package/src/layout/itemBuilders.ts +159 -159
- package/src/layout/labelsRender.ts +170 -170
- package/src/layout/legendConstants.ts +11 -11
- package/src/layout/legendRender.ts +543 -543
- package/src/layout/legendRows.ts +62 -62
- package/src/layout/legendUtils.ts +144 -144
- package/src/layout/metadata.ts +210 -210
- package/src/layout/model.ts +372 -372
- package/src/layout/options.ts +17 -17
- package/src/layout/presets.ts +51 -51
- package/src/layout/qrRender.ts +126 -126
- package/src/layout/qrcode.d.ts +2 -2
- package/src/layout/renderDrawing.ts +710 -710
- package/src/layout/renderUtils.ts +138 -138
- package/src/layout/sectionValidation.ts +2 -2
- package/src/layout/templateVariables.ts +317 -317
- package/src/layout/typeGuards.ts +9 -9
- package/src/layout/types.ts +835 -835
- package/src/layout/utils.ts +85 -85
- package/src/layout/validation.ts +392 -392
- package/src/layout/validationHelpers.ts +59 -59
- package/src/layout/validationUtils.ts +6 -6
- package/src/layout/viewportPrep.ts +351 -351
- package/src/layout/viewportRender.ts +442 -442
- package/src/layout/viewportUtils.ts +50 -50
- package/src/layout/warnings.ts +3 -3
- package/src/printToPdf.ts +108 -108
- package/src/printToSvg.ts +188 -188
- package/src/sections.ts +1019 -1019
- package/src/types.ts +49 -49
package/dist/layout/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"/","sources":["layout/model.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SectionPath, SectionLabel } from '@twinfinity/geometry';\r\nimport type { SvgModelView, ViewportElement, LabelStyle, ResolvedIncludeFilter } from './types';\r\nimport type { ModelMetadata } from './metadata';\r\nimport { resolveIncludeClasses, resolveMeta } from './metadata';\r\nimport { normalizeClass, matchesWhere } from './filters';\r\nimport { escapeAttr, escapeText } from './renderUtils';\r\nimport { BUILTIN_LABEL_DEFAULTS } from './renderDrawing';\r\n\r\nimport { getProp, isRecord } from './typeGuards';\r\n\r\nexport const buildModelViewFromRaw = (\r\n rawPaths: SectionPath[] | undefined,\r\n rawLabels: SectionLabel[] | undefined,\r\n transform: SvgModelView['transform'] | undefined,\r\n geometryTransform?: string,\r\n labelStyle?: LabelStyle\r\n): SvgModelView | null => {\r\n if (!rawPaths || !transform || !geometryTransform) {\r\n return null;\r\n }\r\n const labelFill = labelStyle?.fill ?? BUILTIN_LABEL_DEFAULTS.fill;\r\n const labelFontFamily = labelStyle?.fontFamily ?? BUILTIN_LABEL_DEFAULTS.fontFamily;\r\n const labelFontWeight = labelStyle?.fontWeight ?? BUILTIN_LABEL_DEFAULTS.fontWeight;\r\n const escapedFontFamily = escapeAttr(labelFontFamily);\r\n\r\n const parts: string[] = [];\r\n parts.push(`<g transform=\"${escapeAttr(geometryTransform)}\">`);\r\n rawPaths.forEach((path) => {\r\n parts.push(\r\n `<path d=\"${escapeAttr(path.d)}\"` +\r\n (path.fill ? ` fill=\"${escapeAttr(path.fill)}\"` : ' fill=\"none\"') +\r\n (path.fillOpacity !== undefined ? ` fill-opacity=\"${path.fillOpacity}\"` : '') +\r\n (path.stroke ? ` stroke=\"${escapeAttr(path.stroke)}\"` : '') +\r\n (path.strokeWidth ? ` stroke-width=\"${path.strokeWidth}\"` : '') +\r\n (path.strokeOpacity !== undefined ? ` stroke-opacity=\"${path.strokeOpacity}\"` : '') +\r\n (path.fillRule ? ` fill-rule=\"${escapeAttr(path.fillRule)}\"` : '') +\r\n ` stroke-linejoin=\"round\" stroke-linecap=\"round\"` +\r\n ` />`\r\n );\r\n });\r\n parts.push(`</g>`);\r\n if (rawLabels && rawLabels.length) {\r\n parts.push(`<g pointer-events=\"none\">`);\r\n rawLabels.forEach((label) => {\r\n const viewX = label.x - transform.viewMinX;\r\n const viewY = transform.viewMaxZ - label.z;\r\n if (!Number.isFinite(viewX) || !Number.isFinite(viewY)) {\r\n return;\r\n }\r\n parts.push(\r\n `<text x=\"${viewX}\" y=\"${viewY}\" font-size=\"${label.fontSize}\" text-anchor=\"middle\" dominant-baseline=\"middle\" fill=\"${escapeAttr(labelFill)}\" font-family=\"${escapedFontFamily}\" font-weight=\"${labelFontWeight}\">${escapeText(label.text)}</text>`\r\n );\r\n });\r\n parts.push(`</g>`);\r\n }\r\n const svg = `<g>${parts.join('')}</g>`;\r\n return {\r\n groupSvg: svg,\r\n widthModel: transform.viewWidth,\r\n heightModel: transform.viewHeight,\r\n transform,\r\n geometryTransform,\r\n rawPaths,\r\n rawLabels,\r\n labelStyle\r\n };\r\n};\r\n\r\n/**\r\n * Check whether a path's resolved class matches any of the filter classes.\r\n * Used to determine which SVG paths are subject to GID-based include/exclude.\r\n */\r\nconst matchesFilterClass = (\r\n cls: string | null,\r\n clsId: unknown,\r\n clsFromMap: string | null,\r\n filterClasses: Set<string>\r\n): boolean => {\r\n if (!filterClasses.size) return false;\r\n if (cls && filterClasses.has(cls)) return true;\r\n if (clsFromMap && filterClasses.has(clsFromMap)) return true;\r\n if (clsId && typeof clsId === 'string') {\r\n const normalized = normalizeClass(clsId);\r\n if (normalized && filterClasses.has(normalized)) return true;\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Check if an item matches any of the include filters.\r\n *\r\n * @param includeFilters - Array of filters (strings or class+where objects)\r\n * @param cls - Normalized IFC class name\r\n * @param clsId - Predefined IFC class ID\r\n * @param meta - Item metadata (for property matching)\r\n * @returns true if the item matches any filter, false otherwise\r\n */\r\nconst matchesIncludeFilter = (\r\n includeFilters: ResolvedIncludeFilter[],\r\n cls: string | null,\r\n clsId: unknown,\r\n meta: unknown\r\n): boolean => {\r\n for (const filter of includeFilters) {\r\n // String filter: class name only\r\n if (typeof filter === 'string') {\r\n const normalizedFilter = normalizeClass(filter);\r\n if (cls && normalizedFilter === cls) return true;\r\n if (clsId && typeof clsId === 'string') {\r\n const normalizedId = normalizeClass(clsId);\r\n if (normalizedId === normalizedFilter) return true;\r\n }\r\n continue;\r\n }\r\n\r\n // Object filter: class + where\r\n if (isRecord(filter)) {\r\n const filterClass = filter.class;\r\n const filterWhere = filter.where;\r\n\r\n // Check class match (if specified)\r\n let classMatches = true;\r\n if (filterClass !== undefined) {\r\n const classes = Array.isArray(filterClass) ? filterClass : [filterClass];\r\n classMatches = false;\r\n for (const c of classes) {\r\n const normalizedC = normalizeClass(c);\r\n if (normalizedC && cls === normalizedC) {\r\n classMatches = true;\r\n break;\r\n }\r\n if (clsId && typeof clsId === 'string') {\r\n const normalizedId = normalizeClass(clsId);\r\n if (normalizedId === normalizedC) {\r\n classMatches = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Check where condition (if specified)\r\n let whereMatches = true;\r\n if (filterWhere && Object.keys(filterWhere).length > 0) {\r\n whereMatches = matchesWhere(meta, filterWhere);\r\n }\r\n\r\n if (classMatches && whereMatches) return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const filterModelForViewport = (\r\n model: SvgModelView,\r\n vp: ViewportElement,\r\n metadataById?: ModelMetadata,\r\n includePresets?: Record<string, string[]>,\r\n allowedGids?: Set<string> | null,\r\n highlight?: {\r\n gids: Set<string> | null;\r\n styles?: {\r\n stroke?: string;\r\n strokeWidthMm?: number;\r\n strokeOpacity?: number;\r\n fill?: string;\r\n fillOpacity?: number;\r\n };\r\n },\r\n filterClasses?: Set<string> | null\r\n): SvgModelView => {\r\n const resolvedIncludeClasses = resolveIncludeClasses(vp.includeClasses as unknown, includePresets ?? {});\r\n const includeFilters = resolvedIncludeClasses ?? null;\r\n // Classes subject to GID-based filtering (highlight/clip include/exclude).\r\n // Derived from template highlight.class and clip.class by the caller.\r\n const effectiveFilterClasses = filterClasses ?? new Set<string>();\r\n let styleMutated = false;\r\n if (!model.rawPaths || !model.geometryTransform || !model.transform) {\r\n return model;\r\n }\r\n const filteredPaths: SectionPath[] = [];\r\n model.rawPaths.forEach((p: SectionPath) => {\r\n const rawMeta = getProp(p, 'meta');\r\n const meta = resolveMeta(rawMeta, metadataById);\r\n const metaFromMap = (() => {\r\n const pid =\r\n getProp(meta, 'productId') ??\r\n getProp(meta, 'gid') ??\r\n getProp(meta, 'id') ??\r\n getProp(rawMeta, 'gid') ??\r\n getProp(rawMeta, 'id');\r\n return pid && metadataById ? metadataById[String(pid)] : null;\r\n })();\r\n const productIdForMeta =\r\n getProp(meta, 'productId') ??\r\n getProp(meta, 'gid') ??\r\n getProp(meta, 'id') ??\r\n getProp(rawMeta, 'gid') ??\r\n getProp(rawMeta, 'id') ??\r\n metaFromMap?.productId ??\r\n metaFromMap?.gid ??\r\n null;\r\n const pid = productIdForMeta ? String(productIdForMeta) : null;\r\n const cls = normalizeClass(getProp(meta, 'ifcClass') ?? getProp(rawMeta, 'ifcClass') ?? metaFromMap?.ifcClass);\r\n const clsId = getProp(meta, 'ifcClassId') ?? getProp(rawMeta, 'ifcClassId') ?? metaFromMap?.ifcClassId ?? null;\r\n const clsFromMap = normalizeClass(metaFromMap?.ifcClass);\r\n const isFilterable = matchesFilterClass(cls, clsId, clsFromMap, effectiveFilterClasses);\r\n const shouldHighlight = !!highlight?.gids && highlight.gids.size > 0 && !!pid && highlight.gids.has(pid);\r\n if (includeFilters && includeFilters.length > 0) {\r\n if (isFilterable) {\r\n // Highlight/clip class: only check includeClasses if no GID filtering will be applied\r\n const hasGidFiltering =\r\n (highlight?.gids && highlight.gids.size > 0) || (allowedGids && allowedGids.size > 0);\r\n if (!hasGidFiltering) {\r\n // No GID filtering active, so apply includeClasses filter\r\n const matches = matchesIncludeFilter(includeFilters, cls, clsId, meta);\r\n if (!matches) {\r\n return;\r\n }\r\n }\r\n } else {\r\n // Not a highlight/clip class: always apply includeClasses filter\r\n const matches = matchesIncludeFilter(includeFilters, cls, clsId, meta);\r\n if (!matches) {\r\n return;\r\n }\r\n }\r\n }\r\n if (isFilterable) {\r\n if (highlight?.gids && highlight.gids.size > 0) {\r\n if (!pid || !highlight.gids.has(pid)) {\r\n return;\r\n }\r\n }\r\n // Clip filtering logic: null means no filtering, empty Set means filtering active but no matches\r\n const allowed =\r\n !allowedGids || (allowedGids.size > 0 && !!(pid && allowedGids.has(pid))) || shouldHighlight;\r\n if (!allowed) return;\r\n }\r\n // CRITICAL: Exclude space fills from model - buildFillSvg will handle them with matchClipFilter support\r\n // Only keep space segments (outlines) in the model\r\n // EXCEPT: Keep highlighted space fills so they can be styled with highlight colors\r\n const isFill = getProp(meta, 'isFill') ?? getProp(rawMeta, 'isFill');\r\n if (isFilterable && isFill && !shouldHighlight) {\r\n return;\r\n }\r\n // Apply highlight styling when requested\r\n if (shouldHighlight) {\r\n const styledPath: SectionPath = { ...p };\r\n if (highlight?.styles?.stroke !== undefined) {\r\n styledPath.stroke = highlight.styles.stroke;\r\n }\r\n if (highlight?.styles?.strokeWidthMm !== undefined) {\r\n styledPath.strokeWidth = highlight.styles.strokeWidthMm;\r\n }\r\n if (highlight?.styles?.strokeOpacity !== undefined) {\r\n styledPath.strokeOpacity = highlight.styles.strokeOpacity;\r\n }\r\n if (highlight?.styles?.fill !== undefined) {\r\n styledPath.fill = highlight.styles.fill;\r\n }\r\n if (highlight?.styles?.fillOpacity !== undefined) {\r\n styledPath.fillOpacity = highlight.styles.fillOpacity;\r\n }\r\n styleMutated = true;\r\n filteredPaths.push(styledPath);\r\n } else {\r\n filteredPaths.push(p);\r\n }\r\n });\r\n\r\n const filteredLabels: SectionLabel[] = [];\r\n (model.rawLabels ?? []).forEach((l: SectionLabel) => {\r\n const rawMeta = getProp(l, 'meta');\r\n const meta = resolveMeta(rawMeta, metadataById);\r\n const cls = normalizeClass(getProp(meta, 'ifcClass'));\r\n const clsId = getProp(meta, 'ifcClassId') ?? getProp(rawMeta, 'ifcClassId') ?? null;\r\n const productIdForMeta =\r\n getProp(meta, 'productId') ??\r\n getProp(meta, 'gid') ??\r\n getProp(meta, 'id') ??\r\n getProp(rawMeta, 'gid') ??\r\n getProp(rawMeta, 'id') ??\r\n null;\r\n if (includeFilters && includeFilters.length > 0) {\r\n if (!matchesIncludeFilter(includeFilters, cls, clsId, meta)) {\r\n return;\r\n }\r\n }\r\n if (matchesFilterClass(cls, clsId, null, effectiveFilterClasses)) {\r\n const pid = productIdForMeta ? String(productIdForMeta) : null;\r\n if (highlight?.gids && highlight.gids.size > 0) {\r\n if (!pid || !highlight.gids.has(pid)) {\r\n return;\r\n }\r\n }\r\n if (allowedGids && allowedGids.size > 0) {\r\n if (!pid || !allowedGids.has(pid)) {\r\n return;\r\n }\r\n }\r\n }\r\n filteredLabels.push(l);\r\n });\r\n\r\n // Count paths by IFC class before and after filtering\r\n const classCountsBefore = new Map<string, number>();\r\n const classCountsAfter = new Map<string, number>();\r\n const excluded: Array<{ cls: string | null; clsId: unknown }> = [];\r\n\r\n model.rawPaths.forEach((p: SectionPath) => {\r\n const rawMeta = getProp(p, 'meta');\r\n const meta = resolveMeta(rawMeta, metadataById);\r\n const metaFromMap = (() => {\r\n const pid =\r\n getProp(meta, 'productId') ??\r\n getProp(meta, 'gid') ??\r\n getProp(meta, 'id') ??\r\n getProp(rawMeta, 'gid') ??\r\n getProp(rawMeta, 'id');\r\n return pid && metadataById ? metadataById[String(pid)] : null;\r\n })();\r\n const cls = normalizeClass(getProp(meta, 'ifcClass') ?? getProp(rawMeta, 'ifcClass') ?? metaFromMap?.ifcClass);\r\n const clsId = getProp(meta, 'ifcClassId') ?? getProp(rawMeta, 'ifcClassId') ?? metaFromMap?.ifcClassId ?? null;\r\n const key = cls ?? String(clsId) ?? 'unknown';\r\n classCountsBefore.set(key, (classCountsBefore.get(key) ?? 0) + 1);\r\n });\r\n\r\n filteredPaths.forEach((p: SectionPath) => {\r\n const rawMeta = getProp(p, 'meta');\r\n const meta = resolveMeta(rawMeta, metadataById);\r\n const metaFromMap = (() => {\r\n const pid =\r\n getProp(meta, 'productId') ??\r\n getProp(meta, 'gid') ??\r\n getProp(meta, 'id') ??\r\n getProp(rawMeta, 'gid') ??\r\n getProp(rawMeta, 'id');\r\n return pid && metadataById ? metadataById[String(pid)] : null;\r\n })();\r\n const cls = normalizeClass(getProp(meta, 'ifcClass') ?? getProp(rawMeta, 'ifcClass') ?? metaFromMap?.ifcClass);\r\n const clsId = getProp(meta, 'ifcClassId') ?? getProp(rawMeta, 'ifcClassId') ?? metaFromMap?.ifcClassId ?? null;\r\n const key = cls ?? String(clsId) ?? 'unknown';\r\n classCountsAfter.set(key, (classCountsAfter.get(key) ?? 0) + 1);\r\n });\r\n\r\n // Find excluded classes\r\n classCountsBefore.forEach((countBefore, cls) => {\r\n const countAfter = classCountsAfter.get(cls) ?? 0;\r\n if (countAfter < countBefore) {\r\n excluded.push({ cls, clsId: `${countBefore - countAfter} paths removed` });\r\n }\r\n });\r\n\r\n if (\r\n !styleMutated &&\r\n filteredPaths.length === model.rawPaths.length &&\r\n filteredLabels.length === (model.rawLabels?.length ?? 0)\r\n ) {\r\n return model;\r\n }\r\n\r\n const rebuilt = buildModelViewFromRaw(\r\n filteredPaths,\r\n filteredLabels,\r\n model.transform,\r\n model.geometryTransform,\r\n model.labelStyle\r\n );\r\n return rebuilt ?? model;\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"/","sources":["layout/model.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SectionPath, SectionLabel } from '@twinfinity/geometry';\nimport type { SvgModelView, ViewportElement, LabelStyle, ResolvedIncludeFilter } from './types';\nimport type { ModelMetadata } from './metadata';\nimport { resolveIncludeClasses, resolveMeta } from './metadata';\nimport { normalizeClass, matchesWhere } from './filters';\nimport { escapeAttr, escapeText } from './renderUtils';\nimport { BUILTIN_LABEL_DEFAULTS } from './renderDrawing';\n\nimport { getProp, isRecord } from './typeGuards';\n\nexport const buildModelViewFromRaw = (\n rawPaths: SectionPath[] | undefined,\n rawLabels: SectionLabel[] | undefined,\n transform: SvgModelView['transform'] | undefined,\n geometryTransform?: string,\n labelStyle?: LabelStyle\n): SvgModelView | null => {\n if (!rawPaths || !transform || !geometryTransform) {\n return null;\n }\n const labelFill = labelStyle?.fill ?? BUILTIN_LABEL_DEFAULTS.fill;\n const labelFontFamily = labelStyle?.fontFamily ?? BUILTIN_LABEL_DEFAULTS.fontFamily;\n const labelFontWeight = labelStyle?.fontWeight ?? BUILTIN_LABEL_DEFAULTS.fontWeight;\n const escapedFontFamily = escapeAttr(labelFontFamily);\n\n const parts: string[] = [];\n parts.push(`<g transform=\"${escapeAttr(geometryTransform)}\">`);\n rawPaths.forEach((path) => {\n parts.push(\n `<path d=\"${escapeAttr(path.d)}\"` +\n (path.fill ? ` fill=\"${escapeAttr(path.fill)}\"` : ' fill=\"none\"') +\n (path.fillOpacity !== undefined ? ` fill-opacity=\"${path.fillOpacity}\"` : '') +\n (path.stroke ? ` stroke=\"${escapeAttr(path.stroke)}\"` : '') +\n (path.strokeWidth ? ` stroke-width=\"${path.strokeWidth}\"` : '') +\n (path.strokeOpacity !== undefined ? ` stroke-opacity=\"${path.strokeOpacity}\"` : '') +\n (path.fillRule ? ` fill-rule=\"${escapeAttr(path.fillRule)}\"` : '') +\n ` stroke-linejoin=\"round\" stroke-linecap=\"round\"` +\n ` />`\n );\n });\n parts.push(`</g>`);\n if (rawLabels && rawLabels.length) {\n parts.push(`<g pointer-events=\"none\">`);\n rawLabels.forEach((label) => {\n const viewX = label.x - transform.viewMinX;\n const viewY = transform.viewMaxZ - label.z;\n if (!Number.isFinite(viewX) || !Number.isFinite(viewY)) {\n return;\n }\n parts.push(\n `<text x=\"${viewX}\" y=\"${viewY}\" font-size=\"${label.fontSize}\" text-anchor=\"middle\" dominant-baseline=\"middle\" fill=\"${escapeAttr(labelFill)}\" font-family=\"${escapedFontFamily}\" font-weight=\"${labelFontWeight}\">${escapeText(label.text)}</text>`\n );\n });\n parts.push(`</g>`);\n }\n const svg = `<g>${parts.join('')}</g>`;\n return {\n groupSvg: svg,\n widthModel: transform.viewWidth,\n heightModel: transform.viewHeight,\n transform,\n geometryTransform,\n rawPaths,\n rawLabels,\n labelStyle\n };\n};\n\n/**\n * Check whether a path's resolved class matches any of the filter classes.\n * Used to determine which SVG paths are subject to GID-based include/exclude.\n */\nconst matchesFilterClass = (\n cls: string | null,\n clsId: unknown,\n clsFromMap: string | null,\n filterClasses: Set<string>\n): boolean => {\n if (!filterClasses.size) return false;\n if (cls && filterClasses.has(cls)) return true;\n if (clsFromMap && filterClasses.has(clsFromMap)) return true;\n if (clsId && typeof clsId === 'string') {\n const normalized = normalizeClass(clsId);\n if (normalized && filterClasses.has(normalized)) return true;\n }\n return false;\n};\n\n/**\n * Check if an item matches any of the include filters.\n *\n * @param includeFilters - Array of filters (strings or class+where objects)\n * @param cls - Normalized IFC class name\n * @param clsId - Predefined IFC class ID\n * @param meta - Item metadata (for property matching)\n * @returns true if the item matches any filter, false otherwise\n */\nconst matchesIncludeFilter = (\n includeFilters: ResolvedIncludeFilter[],\n cls: string | null,\n clsId: unknown,\n meta: unknown\n): boolean => {\n for (const filter of includeFilters) {\n // String filter: class name only\n if (typeof filter === 'string') {\n const normalizedFilter = normalizeClass(filter);\n if (cls && normalizedFilter === cls) return true;\n if (clsId && typeof clsId === 'string') {\n const normalizedId = normalizeClass(clsId);\n if (normalizedId === normalizedFilter) return true;\n }\n continue;\n }\n\n // Object filter: class + where\n if (isRecord(filter)) {\n const filterClass = filter.class;\n const filterWhere = filter.where;\n\n // Check class match (if specified)\n let classMatches = true;\n if (filterClass !== undefined) {\n const classes = Array.isArray(filterClass) ? filterClass : [filterClass];\n classMatches = false;\n for (const c of classes) {\n const normalizedC = normalizeClass(c);\n if (normalizedC && cls === normalizedC) {\n classMatches = true;\n break;\n }\n if (clsId && typeof clsId === 'string') {\n const normalizedId = normalizeClass(clsId);\n if (normalizedId === normalizedC) {\n classMatches = true;\n break;\n }\n }\n }\n }\n\n // Check where condition (if specified)\n let whereMatches = true;\n if (filterWhere && Object.keys(filterWhere).length > 0) {\n whereMatches = matchesWhere(meta, filterWhere);\n }\n\n if (classMatches && whereMatches) return true;\n }\n }\n\n return false;\n};\n\nexport const filterModelForViewport = (\n model: SvgModelView,\n vp: ViewportElement,\n metadataById?: ModelMetadata,\n includePresets?: Record<string, string[]>,\n allowedGids?: Set<string> | null,\n highlight?: {\n gids: Set<string> | null;\n styles?: {\n stroke?: string;\n strokeWidthMm?: number;\n strokeOpacity?: number;\n fill?: string;\n fillOpacity?: number;\n };\n },\n filterClasses?: Set<string> | null\n): SvgModelView => {\n const resolvedIncludeClasses = resolveIncludeClasses(vp.includeClasses as unknown, includePresets ?? {});\n const includeFilters = resolvedIncludeClasses ?? null;\n // Classes subject to GID-based filtering (highlight/clip include/exclude).\n // Derived from template highlight.class and clip.class by the caller.\n const effectiveFilterClasses = filterClasses ?? new Set<string>();\n let styleMutated = false;\n if (!model.rawPaths || !model.geometryTransform || !model.transform) {\n return model;\n }\n const filteredPaths: SectionPath[] = [];\n model.rawPaths.forEach((p: SectionPath) => {\n const rawMeta = getProp(p, 'meta');\n const meta = resolveMeta(rawMeta, metadataById);\n const metaFromMap = (() => {\n const pid =\n getProp(meta, 'productId') ??\n getProp(meta, 'gid') ??\n getProp(meta, 'id') ??\n getProp(rawMeta, 'gid') ??\n getProp(rawMeta, 'id');\n return pid && metadataById ? metadataById[String(pid)] : null;\n })();\n const productIdForMeta =\n getProp(meta, 'productId') ??\n getProp(meta, 'gid') ??\n getProp(meta, 'id') ??\n getProp(rawMeta, 'gid') ??\n getProp(rawMeta, 'id') ??\n metaFromMap?.productId ??\n metaFromMap?.gid ??\n null;\n const pid = productIdForMeta ? String(productIdForMeta) : null;\n const cls = normalizeClass(getProp(meta, 'ifcClass') ?? getProp(rawMeta, 'ifcClass') ?? metaFromMap?.ifcClass);\n const clsId = getProp(meta, 'ifcClassId') ?? getProp(rawMeta, 'ifcClassId') ?? metaFromMap?.ifcClassId ?? null;\n const clsFromMap = normalizeClass(metaFromMap?.ifcClass);\n const isFilterable = matchesFilterClass(cls, clsId, clsFromMap, effectiveFilterClasses);\n const shouldHighlight = !!highlight?.gids && highlight.gids.size > 0 && !!pid && highlight.gids.has(pid);\n if (includeFilters && includeFilters.length > 0) {\n if (isFilterable) {\n // Highlight/clip class: only check includeClasses if no GID filtering will be applied\n const hasGidFiltering =\n (highlight?.gids && highlight.gids.size > 0) || (allowedGids && allowedGids.size > 0);\n if (!hasGidFiltering) {\n // No GID filtering active, so apply includeClasses filter\n const matches = matchesIncludeFilter(includeFilters, cls, clsId, meta);\n if (!matches) {\n return;\n }\n }\n } else {\n // Not a highlight/clip class: always apply includeClasses filter\n const matches = matchesIncludeFilter(includeFilters, cls, clsId, meta);\n if (!matches) {\n return;\n }\n }\n }\n if (isFilterable) {\n if (highlight?.gids && highlight.gids.size > 0) {\n if (!pid || !highlight.gids.has(pid)) {\n return;\n }\n }\n // Clip filtering logic: null means no filtering, empty Set means filtering active but no matches\n const allowed =\n !allowedGids || (allowedGids.size > 0 && !!(pid && allowedGids.has(pid))) || shouldHighlight;\n if (!allowed) return;\n }\n // CRITICAL: Exclude space fills from model - buildFillSvg will handle them with matchClipFilter support\n // Only keep space segments (outlines) in the model\n // EXCEPT: Keep highlighted space fills so they can be styled with highlight colors\n const isFill = getProp(meta, 'isFill') ?? getProp(rawMeta, 'isFill');\n if (isFilterable && isFill && !shouldHighlight) {\n return;\n }\n // Apply highlight styling when requested\n if (shouldHighlight) {\n const styledPath: SectionPath = { ...p };\n if (highlight?.styles?.stroke !== undefined) {\n styledPath.stroke = highlight.styles.stroke;\n }\n if (highlight?.styles?.strokeWidthMm !== undefined) {\n styledPath.strokeWidth = highlight.styles.strokeWidthMm;\n }\n if (highlight?.styles?.strokeOpacity !== undefined) {\n styledPath.strokeOpacity = highlight.styles.strokeOpacity;\n }\n if (highlight?.styles?.fill !== undefined) {\n styledPath.fill = highlight.styles.fill;\n }\n if (highlight?.styles?.fillOpacity !== undefined) {\n styledPath.fillOpacity = highlight.styles.fillOpacity;\n }\n styleMutated = true;\n filteredPaths.push(styledPath);\n } else {\n filteredPaths.push(p);\n }\n });\n\n const filteredLabels: SectionLabel[] = [];\n (model.rawLabels ?? []).forEach((l: SectionLabel) => {\n const rawMeta = getProp(l, 'meta');\n const meta = resolveMeta(rawMeta, metadataById);\n const cls = normalizeClass(getProp(meta, 'ifcClass'));\n const clsId = getProp(meta, 'ifcClassId') ?? getProp(rawMeta, 'ifcClassId') ?? null;\n const productIdForMeta =\n getProp(meta, 'productId') ??\n getProp(meta, 'gid') ??\n getProp(meta, 'id') ??\n getProp(rawMeta, 'gid') ??\n getProp(rawMeta, 'id') ??\n null;\n if (includeFilters && includeFilters.length > 0) {\n if (!matchesIncludeFilter(includeFilters, cls, clsId, meta)) {\n return;\n }\n }\n if (matchesFilterClass(cls, clsId, null, effectiveFilterClasses)) {\n const pid = productIdForMeta ? String(productIdForMeta) : null;\n if (highlight?.gids && highlight.gids.size > 0) {\n if (!pid || !highlight.gids.has(pid)) {\n return;\n }\n }\n if (allowedGids && allowedGids.size > 0) {\n if (!pid || !allowedGids.has(pid)) {\n return;\n }\n }\n }\n filteredLabels.push(l);\n });\n\n // Count paths by IFC class before and after filtering\n const classCountsBefore = new Map<string, number>();\n const classCountsAfter = new Map<string, number>();\n const excluded: Array<{ cls: string | null; clsId: unknown }> = [];\n\n model.rawPaths.forEach((p: SectionPath) => {\n const rawMeta = getProp(p, 'meta');\n const meta = resolveMeta(rawMeta, metadataById);\n const metaFromMap = (() => {\n const pid =\n getProp(meta, 'productId') ??\n getProp(meta, 'gid') ??\n getProp(meta, 'id') ??\n getProp(rawMeta, 'gid') ??\n getProp(rawMeta, 'id');\n return pid && metadataById ? metadataById[String(pid)] : null;\n })();\n const cls = normalizeClass(getProp(meta, 'ifcClass') ?? getProp(rawMeta, 'ifcClass') ?? metaFromMap?.ifcClass);\n const clsId = getProp(meta, 'ifcClassId') ?? getProp(rawMeta, 'ifcClassId') ?? metaFromMap?.ifcClassId ?? null;\n const key = cls ?? String(clsId) ?? 'unknown';\n classCountsBefore.set(key, (classCountsBefore.get(key) ?? 0) + 1);\n });\n\n filteredPaths.forEach((p: SectionPath) => {\n const rawMeta = getProp(p, 'meta');\n const meta = resolveMeta(rawMeta, metadataById);\n const metaFromMap = (() => {\n const pid =\n getProp(meta, 'productId') ??\n getProp(meta, 'gid') ??\n getProp(meta, 'id') ??\n getProp(rawMeta, 'gid') ??\n getProp(rawMeta, 'id');\n return pid && metadataById ? metadataById[String(pid)] : null;\n })();\n const cls = normalizeClass(getProp(meta, 'ifcClass') ?? getProp(rawMeta, 'ifcClass') ?? metaFromMap?.ifcClass);\n const clsId = getProp(meta, 'ifcClassId') ?? getProp(rawMeta, 'ifcClassId') ?? metaFromMap?.ifcClassId ?? null;\n const key = cls ?? String(clsId) ?? 'unknown';\n classCountsAfter.set(key, (classCountsAfter.get(key) ?? 0) + 1);\n });\n\n // Find excluded classes\n classCountsBefore.forEach((countBefore, cls) => {\n const countAfter = classCountsAfter.get(cls) ?? 0;\n if (countAfter < countBefore) {\n excluded.push({ cls, clsId: `${countBefore - countAfter} paths removed` });\n }\n });\n\n if (\n !styleMutated &&\n filteredPaths.length === model.rawPaths.length &&\n filteredLabels.length === (model.rawLabels?.length ?? 0)\n ) {\n return model;\n }\n\n const rebuilt = buildModelViewFromRaw(\n filteredPaths,\n filteredLabels,\n model.transform,\n model.geometryTransform,\n model.labelStyle\n );\n return rebuilt ?? model;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"/","sources":["layout/options.ts"],"names":[],"mappings":"","sourcesContent":["import { ModelMetadata } from './metadata';\
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"/","sources":["layout/options.ts"],"names":[],"mappings":"","sourcesContent":["import { ModelMetadata } from './metadata';\n\nexport interface RenderLayoutOptions {\n scaleDenominators?: number[];\n maxViewports?: number;\n allowRemoteAssets?: boolean;\n allowDataUrls?: boolean;\n qrContext?: {\n host?: string | null;\n containerName?: string | null;\n floorName?: string | null;\n planeHeight?: number | null;\n };\n legendSources?: Record<string, any[]>;\n /** Optional metadata map keyed by productId referenced from path/label meta */\n metadataById?: ModelMetadata;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.js","sourceRoot":"/","sources":["layout/presets.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAExF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAa;IAC9C,OAAO;IACP,UAAU;IACV,MAAM;IACN,OAAO;IACP,SAAS;IACT,qBAAqB;IACrB,QAAQ;IACR,SAAS;IACT,WAAW;IACX,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,SAAS;IACT,QAAQ;IACR,SAAS;IACT,WAAW;IACX,OAAO;IACP,QAAQ;IACR,UAAU;IACV,MAAM;IACN,SAAS;CACZ,CAAC;AAEF,MAAM,mBAAmB,GAAmD;IACxE,OAAO,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE;CACjE,CAAC;AAOF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAG9B,EAAmB,EAAE,CAAC,CAAC;IACpB,cAAc,EAAE,OAAO,EAAE,cAAc,IAAI,EAAE;IAC7C,MAAM,EAAE,EAAE,GAAG,mBAAmB,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE;CACjE,CAAC,CAAC","sourcesContent":["export const DEFAULT_SCALE_DENOMS = [2, 10, 25, 50, 100, 250, 500, 1000, 2500] as const;\
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"/","sources":["layout/presets.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAExF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAa;IAC9C,OAAO;IACP,UAAU;IACV,MAAM;IACN,OAAO;IACP,SAAS;IACT,qBAAqB;IACrB,QAAQ;IACR,SAAS;IACT,WAAW;IACX,MAAM;IACN,OAAO;IACP,SAAS;IACT,MAAM;IACN,SAAS;IACT,QAAQ;IACR,SAAS;IACT,WAAW;IACX,OAAO;IACP,QAAQ;IACR,UAAU;IACV,MAAM;IACN,SAAS;CACZ,CAAC;AAEF,MAAM,mBAAmB,GAAmD;IACxE,OAAO,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE;CACjE,CAAC;AAOF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAG9B,EAAmB,EAAE,CAAC,CAAC;IACpB,cAAc,EAAE,OAAO,EAAE,cAAc,IAAI,EAAE;IAC7C,MAAM,EAAE,EAAE,GAAG,mBAAmB,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE;CACjE,CAAC,CAAC","sourcesContent":["export const DEFAULT_SCALE_DENOMS = [2, 10, 25, 50, 100, 250, 500, 1000, 2500] as const;\n\n/**\n * Example building class preset. Not auto-applied — consumers must include it\n * in their template's `presets.includeClasses` if they want to use it.\n *\n * ```json\n * { \"presets\": { \"includeClasses\": { \"defaultBuilding\": [...] } } }\n * ```\n */\nexport const EXAMPLE_BUILDING_CLASSES: string[] = [\n 'space',\n 'ifcspace',\n 'wall',\n 'walls',\n 'ifcwall',\n 'ifcwallstandardcase',\n 'window',\n 'windows',\n 'ifcwindow',\n 'door',\n 'doors',\n 'ifcdoor',\n 'beam',\n 'ifcbeam',\n 'column',\n 'columns',\n 'ifccolumn',\n 'stair',\n 'stairs',\n 'ifcstair',\n 'slab',\n 'ifcslab'\n];\n\nconst defaultScalePresets: Record<string, { preferredScales?: number[] }> = {\n default: { preferredScales: Array.from(DEFAULT_SCALE_DENOMS) }\n};\n\nexport interface ResolvedPresets {\n includeClasses: Record<string, string[]>;\n scales: Record<string, { preferredScales?: number[] }>;\n}\n\nexport const resolvePresets = (presets?: {\n includeClasses?: Record<string, string[]>;\n scales?: Record<string, { preferredScales?: number[] }>;\n}): ResolvedPresets => ({\n includeClasses: presets?.includeClasses ?? {},\n scales: { ...defaultScalePresets, ...(presets?.scales ?? {}) }\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qrRender.js","sourceRoot":"/","sources":["layout/qrRender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,KAAK,UAAU,SAAS;IACpB,IAAI,CAAC;QACD,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC5F,CAAC;AACL,CAAC;AASD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACjC,UAAuB,EACvB,SAAgB,EAChB,cAA0D,EAC1D,MAAgD,EAChD,OAAkC,EAClC,gBAAqB,EACrB,QAAkB,EACD,EAAE;IACnB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC1B,MAAM,eAAe,GAAG,EAAE,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;QAChE,MAAM,aAAa,GAAG,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,MAAM,gBAAgB,GAAG,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClG,sCAAsC;QACtC,MAAM,UAAU,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEnF,IAAI,UAAU,GAA+C,IAAI,CAAC;QAClE,IAAI,gBAAgB,IAAI,aAAa,IAAI,UAAU,EAAE,SAAS,IAAI,CAAC,gBAAgB,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1G,MAAM,UAAU,GAAG,aAAa,CAAC,cAAc,CAAC;YAChD,MAAM,cAAc,GAAG,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC;YAC1D,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,GAAG,UAAU,CAAC;YAC5D,MAAM,OAAO,GACT,gBAAgB,CAAC,KAAK,KAAK,SAAS;gBAChC,CAAC,CAAC,gBAAgB,CAAC,GAAG,GAAG,cAAc,GAAG,GAAG;gBAC7C,CAAC,CAAC,gBAAgB,CAAC,GAAG,GAAG,gBAAgB,CAAC,OAAO,GAAG,GAAG,CAAC;YAChE,MAAM,OAAO,GACT,gBAAgB,CAAC,KAAK,KAAK,SAAS;gBAChC,CAAC,CAAC,gBAAgB,CAAC,GAAG,GAAG,eAAe,GAAG,GAAG;gBAC9C,CAAC,CAAC,gBAAgB,CAAC,GAAG,GAAG,gBAAgB,CAAC,QAAQ,GAAG,GAAG,CAAC;YAEjE,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC;YAC1C,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC;YAE1C,MAAM,MAAM,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC;YAC/E,MAAM,MAAM,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC,WAAW,GAAG,GAAG,CAAC;YAEhF,MAAM,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC;YAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC;YACnC,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC;YACnC,MAAM,WAAW,GAAG,OAAO,EAAE,SAAS,EAAE,WAAW,IAAI,CAAC,CAAC;YACzD,UAAU,GAAG,EAAE,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACzG,CAAC;QAED,IAAI,OAAO,GAAY,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/F,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC1C,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,EAAE,CAAC;gBACrC,MAAM,MAAM,GACR,EAAE,CAAC,YAAY,KAAK,aAAa;oBAC7B,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,EAAE,CAAC,YAAY,KAAK,cAAc;wBAClC,CAAC,CAAC,IAAI;wBACN,CAAC,CAAC,EAAE,CAAC,YAAY,KAAK,UAAU;4BAC9B,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,EAAE,CAAC,YAAY,KAAK,WAAW;gCAC/B,CAAC,CAAC,IAAI;gCACN,CAAC,CAAC,IAAI,CAAC;gBACrB,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;YACjD,CAAC;iBAAM,IAAI,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5B,MAAM,WAAW,GACb,EAAE,CAAC,YAAY,KAAK,aAAa;oBAC7B,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,EAAE,CAAC,YAAY,KAAK,cAAc;wBAClC,CAAC,CAAC,IAAI;wBACN,CAAC,CAAC,EAAE,CAAC,YAAY,KAAK,UAAU;4BAC9B,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,EAAE,CAAC,YAAY,KAAK,WAAW;gCAC/B,CAAC,CAAC,IAAI;gCACN,CAAC,CAAC,IAAI,CAAC;gBACrB,OAAO,GAAG;oBACN,CAAC,EAAE,CAAC;oBACJ,CAAC,EAAE,WAAW;oBACd,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,IAAI;oBACnC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,IAAI,IAAI;oBAC5C,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI;oBACzC,CAAC,EAAE,UAAU;iBAChB,CAAC;YACN,CAAC;QACL,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,mBAAmB,CAAC,CAAC;YAC/C,SAAS;QACb,CAAC;QAED,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;gBACpG,MAAM,EAAE,CAAC;gBACT,oBAAoB,EAAE,GAAG;aAC5B,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CACN,gBAAgB,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,MAAM,aAAa,EAAE,CAAC,MAAM,MAAM,CACnH,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,EAAE,MAAO,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE;IAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC","sourcesContent":["import { escapeAttr } from './renderUtils';\r\nimport { interpolate } from './renderUtils';\r\nimport { QrElement, SvgModelView } from './types';\r\n\r\nasync function getQRCode(): Promise<typeof import('qrcode')> {\r\n try {\r\n return await import('qrcode');\r\n } catch {\r\n throw new Error('qrcode is required for QR code rendering. Install it: bun add qrcode');\r\n }\r\n}\r\n\r\nexport interface QrContext {\r\n host?: string | null;\r\n containerName?: string | null;\r\n floorName?: string | null;\r\n planeHeight?: number | null;\r\n}\r\n\r\nexport const renderQrElements = async (\r\n qrElements: QrElement[],\r\n viewports: any[],\r\n viewportScales: Record<string, { mmPerModelUnit: number }>,\r\n models: Record<string, SvgModelView | undefined>,\r\n options: { qrContext?: QrContext },\r\n dataWithViewport: any,\r\n warnings: string[]\r\n): Promise<string[]> => {\r\n const parts: string[] = [];\r\n\r\n for (const qr of qrElements) {\r\n const boundViewportId = qr.viewport ?? viewports[0]?.id ?? null;\r\n const viewportScale = boundViewportId ? viewportScales[boundViewportId] : null;\r\n const boundViewportDef = boundViewportId ? viewports.find((v) => v.id === boundViewportId) : null;\r\n // In v2, viewport id IS the model key\r\n const boundModel = boundViewportDef ? (models[boundViewportDef.id] ?? null) : null;\r\n\r\n let coordinate: { x: number; y: number; z: number } | null = null;\r\n if (boundViewportDef && viewportScale && boundModel?.transform && (boundViewportDef.rotationDeg ?? 0) === 0) {\r\n const mmPerModel = viewportScale.mmPerModelUnit;\r\n const contentWidthMm = boundModel.widthModel * mmPerModel;\r\n const contentHeightMm = boundModel.heightModel * mmPerModel;\r\n const centerX =\r\n boundViewportDef.align === 'topLeft'\r\n ? boundViewportDef.xMm + contentWidthMm * 0.5\r\n : boundViewportDef.xMm + boundViewportDef.widthMm * 0.5;\r\n const centerY =\r\n boundViewportDef.align === 'topLeft'\r\n ? boundViewportDef.yMm + contentHeightMm * 0.5\r\n : boundViewportDef.yMm + boundViewportDef.heightMm * 0.5;\r\n\r\n const pointMmX = qr.xMm + qr.sizeMm * 0.5;\r\n const pointMmY = qr.yMm + qr.sizeMm * 0.5;\r\n\r\n const modelX = (pointMmX - centerX) / mmPerModel + boundModel.widthModel * 0.5;\r\n const modelY = (pointMmY - centerY) / mmPerModel + boundModel.heightModel * 0.5;\r\n\r\n const t = boundModel.transform;\r\n const worldX = t.viewMinX + modelX;\r\n const worldZ = t.viewMaxZ - modelY;\r\n const planeHeight = options?.qrContext?.planeHeight ?? 0;\r\n coordinate = { x: formatNumber(worldX), y: formatNumber(planeHeight ?? 0), z: formatNumber(worldZ) };\r\n }\r\n\r\n let payload: unknown = qr.dataTemplate ? interpolate(qr.dataTemplate, dataWithViewport) : null;\r\n if (!payload || typeof payload === 'string') {\r\n if (qr.role === 'anchor' && coordinate) {\r\n const corner =\r\n qr.anchorCorner === 'bottom-left'\r\n ? 'bl'\r\n : qr.anchorCorner === 'bottom-right'\r\n ? 'br'\r\n : qr.anchorCorner === 'top-left'\r\n ? 'tl'\r\n : qr.anchorCorner === 'top-right'\r\n ? 'tr'\r\n : 'na';\r\n payload = { v: 1, c: corner, p: coordinate };\r\n } else if (qr.role === 'main') {\r\n const cornerShort =\r\n qr.anchorCorner === 'bottom-left'\r\n ? 'bl'\r\n : qr.anchorCorner === 'bottom-right'\r\n ? 'br'\r\n : qr.anchorCorner === 'top-left'\r\n ? 'tl'\r\n : qr.anchorCorner === 'top-right'\r\n ? 'tr'\r\n : 'bl';\r\n payload = {\r\n v: 1,\r\n c: cornerShort,\r\n h: options?.qrContext?.host ?? null,\r\n a: options?.qrContext?.containerName ?? null,\r\n fn: options?.qrContext?.floorName ?? null,\r\n p: coordinate\r\n };\r\n }\r\n }\r\n\r\n if (!payload) {\r\n warnings.push(`QR '${qr.id}' has no payload.`);\r\n continue;\r\n }\r\n\r\n try {\r\n const QRCode = await getQRCode();\r\n const dataUrl = await QRCode.toDataURL(typeof payload === 'string' ? payload : JSON.stringify(payload), {\r\n margin: 0,\r\n errorCorrectionLevel: 'M'\r\n });\r\n parts.push(\r\n `<image href=\"${escapeAttr(dataUrl)}\" x=\"${qr.xMm}\" y=\"${qr.yMm}\" width=\"${qr.sizeMm}\" height=\"${qr.sizeMm}\" />`\r\n );\r\n } catch (error) {\r\n warnings.push(`Failed to generate QR '${qr.id}': ${(error as Error).message}`);\r\n }\r\n }\r\n\r\n return parts;\r\n};\r\n\r\nconst formatNumber = (value: number): number => {\r\n if (!Number.isFinite(value)) return 0;\r\n return Number.parseFloat(value.toFixed(3));\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"qrRender.js","sourceRoot":"/","sources":["layout/qrRender.ts"],"names":[],"mappings":"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","sourcesContent":["import { escapeAttr } from './renderUtils';\nimport { interpolate } from './renderUtils';\nimport { QrElement, SvgModelView } from './types';\n\nasync function getQRCode(): Promise<typeof import('qrcode')> {\n try {\n return await import('qrcode');\n } catch {\n throw new Error('qrcode is required for QR code rendering. Install it: bun add qrcode');\n }\n}\n\nexport interface QrContext {\n host?: string | null;\n containerName?: string | null;\n floorName?: string | null;\n planeHeight?: number | null;\n}\n\nexport const renderQrElements = async (\n qrElements: QrElement[],\n viewports: any[],\n viewportScales: Record<string, { mmPerModelUnit: number }>,\n models: Record<string, SvgModelView | undefined>,\n options: { qrContext?: QrContext },\n dataWithViewport: any,\n warnings: string[]\n): Promise<string[]> => {\n const parts: string[] = [];\n\n for (const qr of qrElements) {\n const boundViewportId = qr.viewport ?? viewports[0]?.id ?? null;\n const viewportScale = boundViewportId ? viewportScales[boundViewportId] : null;\n const boundViewportDef = boundViewportId ? viewports.find((v) => v.id === boundViewportId) : null;\n // In v2, viewport id IS the model key\n const boundModel = boundViewportDef ? (models[boundViewportDef.id] ?? null) : null;\n\n let coordinate: { x: number; y: number; z: number } | null = null;\n if (boundViewportDef && viewportScale && boundModel?.transform && (boundViewportDef.rotationDeg ?? 0) === 0) {\n const mmPerModel = viewportScale.mmPerModelUnit;\n const contentWidthMm = boundModel.widthModel * mmPerModel;\n const contentHeightMm = boundModel.heightModel * mmPerModel;\n const centerX =\n boundViewportDef.align === 'topLeft'\n ? boundViewportDef.xMm + contentWidthMm * 0.5\n : boundViewportDef.xMm + boundViewportDef.widthMm * 0.5;\n const centerY =\n boundViewportDef.align === 'topLeft'\n ? boundViewportDef.yMm + contentHeightMm * 0.5\n : boundViewportDef.yMm + boundViewportDef.heightMm * 0.5;\n\n const pointMmX = qr.xMm + qr.sizeMm * 0.5;\n const pointMmY = qr.yMm + qr.sizeMm * 0.5;\n\n const modelX = (pointMmX - centerX) / mmPerModel + boundModel.widthModel * 0.5;\n const modelY = (pointMmY - centerY) / mmPerModel + boundModel.heightModel * 0.5;\n\n const t = boundModel.transform;\n const worldX = t.viewMinX + modelX;\n const worldZ = t.viewMaxZ - modelY;\n const planeHeight = options?.qrContext?.planeHeight ?? 0;\n coordinate = { x: formatNumber(worldX), y: formatNumber(planeHeight ?? 0), z: formatNumber(worldZ) };\n }\n\n let payload: unknown = qr.dataTemplate ? interpolate(qr.dataTemplate, dataWithViewport) : null;\n if (!payload || typeof payload === 'string') {\n if (qr.role === 'anchor' && coordinate) {\n const corner =\n qr.anchorCorner === 'bottom-left'\n ? 'bl'\n : qr.anchorCorner === 'bottom-right'\n ? 'br'\n : qr.anchorCorner === 'top-left'\n ? 'tl'\n : qr.anchorCorner === 'top-right'\n ? 'tr'\n : 'na';\n payload = { v: 1, c: corner, p: coordinate };\n } else if (qr.role === 'main') {\n const cornerShort =\n qr.anchorCorner === 'bottom-left'\n ? 'bl'\n : qr.anchorCorner === 'bottom-right'\n ? 'br'\n : qr.anchorCorner === 'top-left'\n ? 'tl'\n : qr.anchorCorner === 'top-right'\n ? 'tr'\n : 'bl';\n payload = {\n v: 1,\n c: cornerShort,\n h: options?.qrContext?.host ?? null,\n a: options?.qrContext?.containerName ?? null,\n fn: options?.qrContext?.floorName ?? null,\n p: coordinate\n };\n }\n }\n\n if (!payload) {\n warnings.push(`QR '${qr.id}' has no payload.`);\n continue;\n }\n\n try {\n const QRCode = await getQRCode();\n const dataUrl = await QRCode.toDataURL(typeof payload === 'string' ? payload : JSON.stringify(payload), {\n margin: 0,\n errorCorrectionLevel: 'M'\n });\n parts.push(\n `<image href=\"${escapeAttr(dataUrl)}\" x=\"${qr.xMm}\" y=\"${qr.yMm}\" width=\"${qr.sizeMm}\" height=\"${qr.sizeMm}\" />`\n );\n } catch (error) {\n warnings.push(`Failed to generate QR '${qr.id}': ${(error as Error).message}`);\n }\n }\n\n return parts;\n};\n\nconst formatNumber = (value: number): number => {\n if (!Number.isFinite(value)) return 0;\n return Number.parseFloat(value.toFixed(3));\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderDrawing.js","sourceRoot":"/","sources":["layout/renderDrawing.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SectionRenderState, SectionPath, SectionLabel } from '@twinfinity/geometry';\r\nimport { sectionStateToModelView, computePolylinesCenter } from './itemBuilders';\r\nimport { buildMetadataMap, normalizePropertySets, resolveIfcClassName, resolveIfcClassId } from './metadata';\r\nimport { applyLineStyleToPaths } from './utils';\r\nimport { analyzeTemplate } from './analyzeTemplate';\r\nimport { matchesV2Filter } from './filters';\r\nimport type {\r\n LayoutTemplate,\r\n ViewportElement,\r\n ViewportLineStyle,\r\n FillRule,\r\n SvgModelView,\r\n SectionResult,\r\n RenderDrawingInput,\r\n RenderDrawingResult,\r\n NormalizedProductItem,\r\n LabelStyle\r\n} from './types';\r\nimport { getProp } from './typeGuards';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Local type declarations for optional peer-dependency APIs.\r\n// Declared inline to avoid pulling @babylonjs/core and @twinfinity/core into\r\n// print-layout's compile-time dependency graph.\r\n// ---------------------------------------------------------------------------\r\n\r\ninterface SampledColor {\r\n color: { r: number; g: number; b: number };\r\n alpha: number;\r\n}\r\n\r\ninterface ExternalSections {\r\n buildSectionStateForEntries: (\r\n perProduct: unknown[],\r\n options: {\r\n viewport?: { viewMinX: number; viewMaxX: number; viewMinZ: number; viewMaxZ: number };\r\n strokeWidth?: number;\r\n labelFontSize?: number;\r\n fills?: Array<{ class?: string | string[]; fillOpacity?: number; matchClipFilter?: boolean }>;\r\n includeMeta?: boolean;\r\n includeLabels?: boolean;\r\n buildLabels?: (products: unknown[], fontSize: number) => unknown[];\r\n clipPolygon?: Array<Array<{ x: number; z: number }>>;\r\n planeNormal?: unknown;\r\n }\r\n ) => (SectionRenderState & { rawPaths?: SectionPath[]; rawLabels?: SectionLabel[] }) | null;\r\n}\r\n\r\ninterface ExternalGeometry {\r\n sampleProductColorRgba: (product: unknown) => SampledColor | undefined;\r\n buildRoomLabels: (\r\n entries: unknown[],\r\n fontSize: number,\r\n options: { labelPath: string; classFilter?: string }\r\n ) => SectionLabel[];\r\n}\r\n\r\n// These were previously lazy-loaded via require() from @measurement-tools/* packages.\r\n// Now they are part of @twinfinity/printing (this package) and @twinfinity/geometry.\r\nimport { buildSectionStateForEntries, resolveProductProperty } from '../sections';\r\n\r\n// Wrap into the ExternalSections shape for backward compat with the rest of this file.\r\nconst _sections: ExternalSections = {\r\n buildSectionStateForEntries: (perProduct, options) => {\r\n type Entries = Parameters<typeof buildSectionStateForEntries>[0];\r\n type Opts = Parameters<typeof buildSectionStateForEntries>[1];\r\n return buildSectionStateForEntries(perProduct as Entries, {\r\n ...options,\r\n fills: options.fills as Opts['fills'],\r\n buildLabels: options.buildLabels as Opts['buildLabels'],\r\n planeNormal: options.planeNormal as Opts['planeNormal']\r\n });\r\n }\r\n};\r\nfunction getSections(): ExternalSections {\r\n return _sections;\r\n}\r\n\r\n// sampleProductColorRgba: duck-type access to product mesh style color.\r\n// buildRoomLabels: requires product-geometry which this package can't depend on.\r\n// Consumers must provide buildRoomLabels via options if room labels are needed.\r\nconst _geometry: ExternalGeometry = {\r\n sampleProductColorRgba: (product: unknown): SampledColor | undefined => {\r\n /** Duck-typed mesh with optional color-access methods. */\r\n interface DuckMesh {\r\n copyColorTo?: (out: Uint8Array, offset: number) => void;\r\n getColorComponent?: (index: number) => number;\r\n style?: { surfaceColor?: readonly number[]; color?: readonly number[] };\r\n }\r\n const p = product as Record<string, unknown>;\r\n const meshes = (p?.meshes ?? p?.productMeshes) as DuckMesh[] | undefined;\r\n if (!meshes?.length) return undefined;\r\n\r\n const rgba = new Uint8Array(4);\r\n for (const mesh of meshes) {\r\n try {\r\n if (typeof mesh.copyColorTo === 'function') {\r\n mesh.copyColorTo(rgba, 0);\r\n } else if (typeof mesh.getColorComponent === 'function') {\r\n rgba[0] = mesh.getColorComponent(0);\r\n rgba[1] = mesh.getColorComponent(1);\r\n rgba[2] = mesh.getColorComponent(2);\r\n rgba[3] = mesh.getColorComponent(3);\r\n } else {\r\n const style = mesh.style;\r\n const c = style?.surfaceColor ?? style?.color;\r\n if (c) {\r\n // surfaceColor values may be 0–1 or 0–255; normalize to 0–1\r\n const maxVal = Math.max(c[0], c[1], c[2]);\r\n const scale = maxVal > 1 ? 1 / 255 : 1;\r\n return {\r\n color: { r: c[0] * scale, g: c[1] * scale, b: c[2] * scale },\r\n alpha: (c[3] ?? (maxVal > 1 ? 255 : 1)) * scale\r\n };\r\n }\r\n continue;\r\n }\r\n } catch {\r\n continue;\r\n }\r\n const [r, g, b, a] = rgba;\r\n if (a === 0 && r === 0 && g === 0 && b === 0) continue;\r\n return { color: { r: r / 255, g: g / 255, b: b / 255 }, alpha: a / 255 };\r\n }\r\n return undefined;\r\n },\r\n buildRoomLabels: () => [] // Requires product-geometry — consumer provides via options\r\n};\r\nfunction getGeometry(): ExternalGeometry {\r\n return _geometry;\r\n}\r\nfunction getSampleColor(): (product: unknown) => SampledColor | undefined {\r\n return _geometry.sampleProductColorRgba;\r\n}\r\n\r\n// Late-binding for renderLayout to break circular dependency.\r\n// renderDrawing is imported by index.ts which defines renderLayout.\r\n// The binding is set by index.ts after definition via setRenderLayoutBinding().\r\nlet _renderLayout:\r\n | ((\r\n template: LayoutTemplate,\r\n data: any,\r\n models: Record<string, SvgModelView>,\r\n options?: any\r\n ) => Promise<{ svg: string; viewportScales: any; warnings: string[] }>)\r\n | null = null;\r\n\r\n/** Called by index.ts to register renderLayout without a circular import. */\r\nexport function setRenderLayoutBinding(fn: NonNullable<typeof _renderLayout>): void {\r\n _renderLayout = fn;\r\n}\r\n\r\nfunction getRenderLayout(): NonNullable<typeof _renderLayout> {\r\n if (!_renderLayout) {\r\n throw new Error(\r\n 'renderLayout not initialized. Ensure @twinfinity/printing index is imported before calling renderDrawing.'\r\n );\r\n }\r\n return _renderLayout;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Public API\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * High-level entry point that converts raw plane-section results and a layout\r\n * template into a ready-to-print SVG string.\r\n *\r\n * Internalizes all data wiring (section → SVG, item extraction, color sampling,\r\n * metadata building, legend/label data) that previously required ~350 lines of\r\n * app-side boilerplate.\r\n *\r\n * ```ts\r\n * const section = computePlaneSectionsForProducts(products, plane, { includeInvisible: true });\r\n * const { svg, warnings } = await renderDrawing({\r\n * template,\r\n * sections: { main: section },\r\n * options: {\r\n * allowRemoteAssets: true,\r\n * qrContext: { host, containerName, planeHeight },\r\n * productFields: { idPath: \"propertySets.BIP.spacenumber.value\", ... },\r\n * roomLabels: { labelPath: \"BIP.spacename\", classFilter: \"space\" },\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport async function renderDrawing(input: RenderDrawingInput): Promise<RenderDrawingResult> {\r\n const { options } = input;\r\n const warnings: string[] = [];\r\n\r\n // ---- Resolve template variables (if present) ----\r\n // This happens FIRST to ensure all {{vars.*}} references are resolved before validation/rendering\r\n let template = input.template;\r\n if (template.variables) {\r\n const { resolveTemplateValues, applyTemplateVariables } = await import('./templateVariables');\r\n const { values, warnings: varWarnings } = resolveTemplateValues(template, options?.variables);\r\n\r\n // Add variable resolution warnings to output\r\n varWarnings.forEach((w) => warnings.push(`[Variables] ${w}`));\r\n\r\n // Apply variables to template (substitute {{vars.*}} references)\r\n template = applyTemplateVariables(template, values);\r\n }\r\n\r\n const renderLayout = getRenderLayout();\r\n\r\n // ---- Collect viewport elements from template ----\r\n const viewports = template.elements.filter((el) => el.kind === 'viewport') as ViewportElement[];\r\n if (!viewports.length) {\r\n return { svg: '', warnings: ['No viewport elements in template.'] };\r\n }\r\n\r\n // ---- Fast path: pre-built models provided directly ----\r\n if (input.models) {\r\n // Build items: explicit viewportItems take priority, then auto-build from productEntries\r\n let viewportsData: Record<string, { items: NormalizedProductItem[] }>;\r\n\r\n if (options?.viewportItems) {\r\n const emptyDefaults = Object.fromEntries(\r\n viewports.map((vp) => [vp.id, { items: [] as NormalizedProductItem[] }])\r\n );\r\n viewportsData = { ...emptyDefaults, ...options.viewportItems };\r\n } else if (options?.productEntries?.length) {\r\n // Auto-build items per viewport from raw product entries\r\n const sampleColor = getSampleColor();\r\n viewportsData = {};\r\n for (const vp of viewports) {\r\n viewportsData[vp.id] = {\r\n items: buildItemsFromEntries(options.productEntries, vp.fills, sampleColor)\r\n };\r\n }\r\n } else {\r\n viewportsData = Object.fromEntries(\r\n viewports.map((vp) => [vp.id, { items: [] as NormalizedProductItem[] }])\r\n );\r\n }\r\n\r\n const layoutData = { viewports: viewportsData };\r\n\r\n // Early input analysis: warn about mismatches between template and provided data\r\n const reqs = analyzeTemplate(template);\r\n\r\n for (const vpId of reqs.viewportIds) {\r\n if (!input.models[vpId]) {\r\n warnings.push(`Template viewport '${vpId}' has no model — it will render empty.`);\r\n }\r\n }\r\n\r\n const allItems = Object.values(viewportsData).flatMap((v) => v.items);\r\n if (allItems.length > 0) {\r\n for (const path of reqs.propertyPaths) {\r\n const parts = path.split('.');\r\n if (parts.length < 2) continue;\r\n const [setName, propName] = parts;\r\n const hasIt = allItems.some((item) => item.propertySets?.[setName]?.[propName]?.value !== undefined);\r\n if (!hasIt) {\r\n warnings.push(`Template references property '${path}' but no items provide it.`);\r\n }\r\n }\r\n }\r\n\r\n if (reqs.usesRemoteAssets && !template.allowRemoteAssets && !options?.allowRemoteAssets) {\r\n warnings.push('Template uses remote assets but allowRemoteAssets is not enabled.');\r\n }\r\n\r\n // Build metadata from product entries (same as standard path)\r\n const metadataEntries = options?.productEntries ?? [];\r\n const metadataById = buildMetadataMap(metadataEntries);\r\n\r\n const result = await renderLayout(template, layoutData, input.models, {\r\n allowRemoteAssets: template.allowRemoteAssets ?? options?.allowRemoteAssets,\r\n qrContext: options?.qrContext,\r\n metadataById\r\n });\r\n\r\n return {\r\n svg: result.svg,\r\n warnings: [...warnings, ...result.warnings]\r\n };\r\n }\r\n\r\n // ---- Standard path: build models from section results ----\r\n if (!input.sections) {\r\n return { svg: '', warnings: ['Either sections or models must be provided.'] };\r\n }\r\n\r\n const { buildSectionStateForEntries } = getSections();\r\n const { sampleProductColorRgba, buildRoomLabels } = getGeometry();\r\n\r\n // Normalize sections: single SectionResult → map to all viewports\r\n const isSingle = !!(input.sections as SectionResult).perProduct;\r\n const sections: Record<string, SectionResult> = isSingle\r\n ? Object.fromEntries(viewports.map((vp) => [vp.id, input.sections as SectionResult]))\r\n : (input.sections as Record<string, SectionResult>);\r\n\r\n // Auto-detect whether the template has its own labels elements.\r\n // If so, do NOT embed labels in the section SVG (would cause duplicates).\r\n const hasTemplateLabelElements = template.elements.some((el) => el.kind === 'labels');\r\n const roomLabelCfg = hasTemplateLabelElements ? undefined : options?.roomLabels;\r\n\r\n // ---- Build section state + model view per viewport ----\r\n const models: Record<string, SvgModelView> = {};\r\n const entriesByViewport: Record<string, SectionResult['perProduct']> = {};\r\n const sectionStateCache = new Map<string, SectionRenderState | null>();\r\n\r\n for (const vp of viewports) {\r\n const sectionResult = sections[vp.id];\r\n if (!sectionResult?.perProduct?.length) {\r\n warnings.push(`No section data for viewport '${vp.id}'.`);\r\n continue;\r\n }\r\n\r\n entriesByViewport[vp.id] = sectionResult.perProduct;\r\n\r\n // Dedup: skip if already built for this viewport key\r\n if (sectionStateCache.has(vp.id)) {\r\n const cached = sectionStateCache.get(vp.id);\r\n if (cached) {\r\n models[vp.id] = sectionStateToModelView(cached);\r\n }\r\n continue;\r\n }\r\n\r\n const resolved = resolveLineStyles(vp);\r\n\r\n // Estimate label font size from template style and section bounds\r\n const labelFontSize = estimateLabelFontSize(template, vp, sectionResult.perProduct);\r\n\r\n // Extract clip polygon from section results if clip config is present\r\n let clipPolygon: Array<Array<{ x: number; z: number }>> | undefined;\r\n if (vp.clip?.where && vp.clip.class) {\r\n const clipClass = Array.isArray(vp.clip.class) ? vp.clip.class : [vp.clip.class];\r\n const clipEntries = sectionResult.perProduct.filter((entry: any) => {\r\n const product = entry.product;\r\n const matchesClass = clipClass.some((c: string) => product.class?.is?.(c));\r\n if (!matchesClass) return false;\r\n // Match where condition using T8-aware property resolution\r\n for (const [path, expected] of Object.entries(vp.clip!.where!)) {\r\n const actualValue = resolveProductProperty(product, path);\r\n if (actualValue === undefined) return false;\r\n if (actualValue !== expected) return false;\r\n }\r\n return true;\r\n });\r\n if (clipEntries.length) {\r\n clipPolygon = clipEntries.flatMap((entry: any) =>\r\n (entry.polylines || []).map((pl: any) => (pl.points || []).map((p: any) => ({ x: p.x, z: p.z })))\r\n );\r\n }\r\n }\r\n\r\n // Convert planeNormal array to object with x, y, z if present\r\n let planeNormal: unknown = undefined;\r\n if (vp.planeNormal && Array.isArray(vp.planeNormal) && vp.planeNormal.length === 3) {\r\n planeNormal = { x: vp.planeNormal[0], y: vp.planeNormal[1], z: vp.planeNormal[2] };\r\n }\r\n\r\n type SectionStateWithRaw = SectionRenderState & { rawPaths?: SectionPath[]; rawLabels?: SectionLabel[] };\r\n const state: SectionStateWithRaw | null = buildSectionStateForEntries(sectionResult.perProduct, {\r\n strokeWidth: resolved.default.widthMm,\r\n labelFontSize,\r\n fills: vp.fills,\r\n includeMeta: true,\r\n includeLabels: !!roomLabelCfg,\r\n buildLabels: roomLabelCfg\r\n ? (products, fontSize) =>\r\n buildRoomLabels(products, fontSize, {\r\n labelPath: roomLabelCfg.labelPath,\r\n classFilter: roomLabelCfg.classFilter\r\n })\r\n : undefined,\r\n clipPolygon,\r\n planeNormal\r\n });\r\n\r\n sectionStateCache.set(vp.id, state);\r\n\r\n if (!state) {\r\n warnings.push(`No geometry for viewport '${vp.id}'.`);\r\n continue;\r\n }\r\n\r\n // Apply line style overrides from viewport config\r\n let finalState: SectionStateWithRaw = state;\r\n const defaultStyle = resolved.default;\r\n if (defaultStyle.color || defaultStyle.widthMm) {\r\n const style: { stroke?: string; strokeWidth?: number } = {};\r\n if (defaultStyle.color) style.stroke = defaultStyle.color;\r\n if (defaultStyle.widthMm) style.strokeWidth = defaultStyle.widthMm;\r\n finalState = {\r\n ...state,\r\n paths: applyLineStyleToPaths(state.paths, style)\r\n };\r\n if (state.rawPaths) {\r\n finalState.rawPaths = applyLineStyleToPaths(state.rawPaths, style);\r\n }\r\n }\r\n\r\n const labelStyle: LabelStyle | undefined = template.styles?.body\r\n ? {\r\n fill: template.styles.body.color ?? BUILTIN_LABEL_DEFAULTS.fill,\r\n fontFamily: template.styles.body.fontFamily ?? BUILTIN_LABEL_DEFAULTS.fontFamily,\r\n fontWeight: template.styles.body.fontWeight ?? BUILTIN_LABEL_DEFAULTS.fontWeight\r\n }\r\n : undefined;\r\n\r\n models[vp.id] = sectionStateToModelView(finalState, labelStyle);\r\n }\r\n\r\n // ---- Build items per viewport ----\r\n const viewportsData: Record<string, { items: NormalizedProductItem[] }> = {};\r\n\r\n for (const vp of viewports) {\r\n const entries = entriesByViewport[vp.id];\r\n if (!entries) {\r\n viewportsData[vp.id] = { items: [] };\r\n continue;\r\n }\r\n\r\n viewportsData[vp.id] = { items: buildItemsFromEntries(entries, vp.fills, sampleProductColorRgba) };\r\n }\r\n\r\n // ---- Build metadata from all section entries ----\r\n const allEntries = Object.values(entriesByViewport).flat();\r\n const metadataById = buildMetadataMap(allEntries);\r\n\r\n // ---- Assemble layout data ----\r\n const layoutData = {\r\n viewports: viewportsData\r\n };\r\n\r\n // ---- Render ----\r\n const result = await renderLayout(template, layoutData, models, {\r\n allowRemoteAssets: template.allowRemoteAssets ?? options?.allowRemoteAssets,\r\n qrContext: options?.qrContext,\r\n metadataById\r\n });\r\n\r\n return {\r\n svg: result.svg,\r\n warnings: [...warnings, ...result.warnings]\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Build NormalizedProductItems from per-product entries.\r\n *\r\n * Shared between the standard path (plane sections) and the models path\r\n * (slab sections / pre-built models with productEntries).\r\n */\r\nfunction buildItemsFromEntries(\r\n entries: Array<{ product: unknown; polylines: unknown }>,\r\n fills: FillRule[] | undefined,\r\n sampleColor: ((product: unknown) => SampledColor | undefined) | undefined\r\n): NormalizedProductItem[] {\r\n return entries.map((entry) => {\r\n const product = entry.product;\r\n const propertySets = normalizePropertySets(product);\r\n const gid = getProp(product, 'gid') ?? getProp(product, 'id');\r\n const center = computePolylinesCenter(entry);\r\n const name = getProp(product, 'name') as string | undefined;\r\n const displayName = typeof name === 'string' && name.trim().length ? name.trim() : gid ? String(gid) : '-';\r\n const item: NormalizedProductItem = {\r\n gid: gid ? String(gid) : undefined,\r\n ifcClass: resolveIfcClassName(product),\r\n ifcClassId: resolveIfcClassId(product),\r\n propertySets,\r\n productId: gid ? String(gid) : '-',\r\n productName: displayName,\r\n area: null,\r\n x: center.x,\r\n z: center.z,\r\n text: displayName,\r\n polylines: entry.polylines as Array<{ points?: Array<{ x: number; z: number }> }>\r\n };\r\n\r\n if (fills?.length && sampleColor) {\r\n const color = resolveFillColor(item, product, fills, sampleColor);\r\n if (color) {\r\n item.color = color;\r\n }\r\n }\r\n\r\n return item;\r\n });\r\n}\r\n\r\n/**\r\n * Estimate label font size in model units from the template body style and the\r\n * approximate viewport-to-world scale ratio.\r\n */\r\nfunction estimateLabelFontSize(\r\n template: LayoutTemplate,\r\n vp: ViewportElement,\r\n perProduct: SectionResult['perProduct']\r\n): number {\r\n const templateFontSizeMm = template.styles?.body?.fontSizeMm ?? 3.5;\r\n\r\n // Quick world-bounds scan\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minZ = Infinity;\r\n let maxZ = -Infinity;\r\n for (const entry of perProduct) {\r\n if (!entry.polylines) continue;\r\n for (const polyline of entry.polylines) {\r\n if (!polyline.points) continue;\r\n for (const pt of polyline.points) {\r\n const px = getProp(pt, 'x');\r\n const pz = getProp(pt, 'z');\r\n if (Number.isFinite(px) && Number.isFinite(pz)) {\r\n if ((px as number) < minX) minX = px as number;\r\n if ((px as number) > maxX) maxX = px as number;\r\n if ((pz as number) < minZ) minZ = pz as number;\r\n if ((pz as number) > maxZ) maxZ = pz as number;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const worldWidth = maxX - minX;\r\n const worldHeight = maxZ - minZ;\r\n if (!Number.isFinite(worldWidth) || worldWidth <= 0 || !Number.isFinite(worldHeight) || worldHeight <= 0) {\r\n return templateFontSizeMm; // Fallback: 1:1 estimate\r\n }\r\n\r\n // Approximate mm-per-model-unit from the viewport dimensions\r\n const scaleX = vp.widthMm / worldWidth;\r\n const scaleY = vp.heightMm / worldHeight;\r\n const mmPerModelUnit = Math.min(scaleX, scaleY);\r\n\r\n if (!Number.isFinite(mmPerModelUnit) || mmPerModelUnit <= 0) {\r\n return templateFontSizeMm;\r\n }\r\n\r\n return templateFontSizeMm / mmPerModelUnit;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Label style defaults\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Built-in label style defaults when template body styles are partially set. */\r\nexport const BUILTIN_LABEL_DEFAULTS = {\r\n fill: '#374151',\r\n fontFamily: '\"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif',\r\n fontWeight: '300'\r\n} as const;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Line style defaults & resolution\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Built-in defaults when neither lineStyles nor lineWidthMm/lineColor are set. */\r\nexport const BUILTIN_LINE_DEFAULTS: Required<ViewportLineStyle> = {\r\n widthMm: 0.35, // Reasonable default: 0.35mm line width (was 0.01mm - too thin!)\r\n color: '#1f2937',\r\n dash: '',\r\n enabled: true\r\n};\r\n\r\nexport const BUILTIN_HIDDEN_DEFAULTS: Required<ViewportLineStyle> = {\r\n widthMm: 0.005,\r\n color: '#9ca3af',\r\n dash: '4 2',\r\n enabled: true\r\n};\r\n\r\ntype LineCategory =\r\n | 'cutLines'\r\n | 'visibleLines'\r\n | 'hiddenLines'\r\n | 'silhouettes'\r\n | 'featureEdges'\r\n | 'stairArrows'\r\n | 'outlineVisible'\r\n | 'outlineHidden';\r\n\r\n/** Category-specific built-in defaults (merged over the global default). */\r\nexport const CATEGORY_BUILTIN_OVERRIDES: Partial<Record<LineCategory, Partial<ViewportLineStyle>>> = {\r\n cutLines: { widthMm: 0.02 },\r\n hiddenLines: BUILTIN_HIDDEN_DEFAULTS,\r\n outlineHidden: BUILTIN_HIDDEN_DEFAULTS\r\n};\r\n\r\nexport interface ResolvedLineStyles {\r\n default: Required<ViewportLineStyle>;\r\n byCategory: Record<LineCategory, Required<ViewportLineStyle>>;\r\n}\r\n\r\n/**\r\n * Resolve the effective line style for every category.\r\n *\r\n * Priority: category entry in `lineStyles` → `lineStyles.default`\r\n * → `lineWidthMm`/`lineColor` shorthand → built-in defaults.\r\n */\r\nfunction resolveLineStyles(vp: ViewportElement): ResolvedLineStyles {\r\n const ls = vp.lineStyles;\r\n\r\n // Base default: lineStyles.default → shorthand → built-in\r\n const base: Required<ViewportLineStyle> = {\r\n ...BUILTIN_LINE_DEFAULTS,\r\n ...(vp.lineWidthMm !== undefined ? { widthMm: vp.lineWidthMm } : {}),\r\n ...(vp.lineColor !== undefined ? { color: vp.lineColor } : {}),\r\n ...(ls?.default ?? {})\r\n } as Required<ViewportLineStyle>;\r\n\r\n const categories: LineCategory[] = [\r\n 'cutLines',\r\n 'visibleLines',\r\n 'hiddenLines',\r\n 'silhouettes',\r\n 'featureEdges',\r\n 'stairArrows',\r\n 'outlineVisible',\r\n 'outlineHidden'\r\n ];\r\n\r\n // Category group mapping: individual categories inherit from their group style\r\n const categoryGroups: Record<LineCategory, LineCategory> = {\r\n cutLines: 'visibleLines',\r\n visibleLines: 'visibleLines',\r\n silhouettes: 'visibleLines',\r\n featureEdges: 'visibleLines',\r\n outlineVisible: 'visibleLines',\r\n hiddenLines: 'hiddenLines',\r\n outlineHidden: 'hiddenLines',\r\n stairArrows: 'stairArrows'\r\n };\r\n\r\n const byCategory = {} as Record<LineCategory, Required<ViewportLineStyle>>;\r\n for (const cat of categories) {\r\n const builtinOverride = CATEGORY_BUILTIN_OVERRIDES[cat];\r\n const groupName = categoryGroups[cat];\r\n const groupStyle = ls?.[groupName]; // Group style (visibleLines, hiddenLines, stairArrows)\r\n const categoryOverride = ls?.[cat]; // Individual category settings (enable/disable)\r\n\r\n byCategory[cat] = {\r\n ...base,\r\n ...(builtinOverride ?? {}),\r\n ...(groupStyle ?? {}), // Apply group style first\r\n ...(categoryOverride ?? {}) // Then individual overrides (enable/disable)\r\n } as Required<ViewportLineStyle>;\r\n }\r\n\r\n return { default: base, byCategory };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Fill rule helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Resolve fill color for an item based on viewport fill rules.\r\n * Returns an RGBA tuple [r, g, b, a] (0–255) or undefined if no rule matches.\r\n */\r\nexport function resolveFillColor(\r\n item: NormalizedProductItem,\r\n product: unknown,\r\n fills: FillRule[] | undefined,\r\n sampleColor: (product: unknown) => SampledColor | undefined\r\n): [number, number, number, number] | undefined {\r\n if (!fills?.length) return undefined;\r\n for (const rule of fills) {\r\n if (!matchesV2Filter(item, rule.class, rule.where)) continue;\r\n if (rule.fill === 'sample') {\r\n const sampled = sampleColor(product);\r\n if (sampled) {\r\n return [\r\n Math.round(sampled.color.r * 255),\r\n Math.round(sampled.color.g * 255),\r\n Math.round(sampled.color.b * 255),\r\n Math.round(sampled.alpha * 255)\r\n ];\r\n }\r\n } else {\r\n return parseHexToRgba(rule.fill);\r\n }\r\n break; // first matching rule wins\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Parse a CSS hex color string to an RGBA tuple (0–255).\r\n */\r\nfunction parseHexToRgba(hex: string): [number, number, number, number] {\r\n const h = hex.replace(/^#/, '');\r\n if (h.length === 3) {\r\n return [parseInt(h[0] + h[0], 16), parseInt(h[1] + h[1], 16), parseInt(h[2] + h[2], 16), 255];\r\n }\r\n if (h.length === 6) {\r\n return [parseInt(h.substring(0, 2), 16), parseInt(h.substring(2, 4), 16), parseInt(h.substring(4, 6), 16), 255];\r\n }\r\n if (h.length === 8) {\r\n return [\r\n parseInt(h.substring(0, 2), 16),\r\n parseInt(h.substring(2, 4), 16),\r\n parseInt(h.substring(4, 6), 16),\r\n parseInt(h.substring(6, 8), 16)\r\n ];\r\n }\r\n // Fallback: opaque black\r\n return [0, 0, 0, 255];\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"renderDrawing.js","sourceRoot":"/","sources":["layout/renderDrawing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC7G,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAa5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAuCvC,sFAAsF;AACtF,qFAAqF;AACrF,OAAO,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAElF,uFAAuF;AACvF,MAAM,SAAS,GAAqB;IAChC,2BAA2B,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE;QAGjD,OAAO,2BAA2B,CAAC,UAAqB,EAAE;YACtD,GAAG,OAAO;YACV,KAAK,EAAE,OAAO,CAAC,KAAsB;YACrC,WAAW,EAAE,OAAO,CAAC,WAAkC;YACvD,WAAW,EAAE,OAAO,CAAC,WAAkC;SAC1D,CAAC,CAAC;IACP,CAAC;CACJ,CAAC;AACF,SAAS,WAAW;IAChB,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,wEAAwE;AACxE,iFAAiF;AACjF,gFAAgF;AAChF,MAAM,SAAS,GAAqB;IAChC,sBAAsB,EAAE,CAAC,OAAgB,EAA4B,EAAE;QAOnE,MAAM,CAAC,GAAG,OAAkC,CAAC;QAC7C,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,aAAa,CAA2B,CAAC;QACzE,IAAI,CAAC,MAAM,EAAE,MAAM;YAAE,OAAO,SAAS,CAAC;QAEtC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC;gBACD,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;oBACzC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC9B,CAAC;qBAAM,IAAI,OAAO,IAAI,CAAC,iBAAiB,KAAK,UAAU,EAAE,CAAC;oBACtD,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;oBACpC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;oBACpC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;oBACpC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;gBACxC,CAAC;qBAAM,CAAC;oBACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;oBACzB,MAAM,CAAC,GAAG,KAAK,EAAE,YAAY,IAAI,KAAK,EAAE,KAAK,CAAC;oBAC9C,IAAI,CAAC,EAAE,CAAC;wBACJ,4DAA4D;wBAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC1C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBACvC,OAAO;4BACH,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE;4BAC5D,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;yBAClD,CAAC;oBACN,CAAC;oBACD,SAAS;gBACb,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,SAAS;YACb,CAAC;YACD,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAS;YACvD,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,4DAA4D;CACzF,CAAC;AACF,SAAS,WAAW;IAChB,OAAO,SAAS,CAAC;AACrB,CAAC;AACD,SAAS,cAAc;IACnB,OAAO,SAAS,CAAC,sBAAsB,CAAC;AAC5C,CAAC;AAED,8DAA8D;AAC9D,oEAAoE;AACpE,gFAAgF;AAChF,IAAI,aAAa,GAOJ,IAAI,CAAC;AAElB,6EAA6E;AAC7E,MAAM,UAAU,sBAAsB,CAAC,EAAqC;IACxE,aAAa,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,eAAe;IACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACX,2GAA2G,CAC9G,CAAC;IACN,CAAC;IACD,OAAO,aAAa,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAyB;IACzD,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,oDAAoD;IACpD,kGAAkG;IAClG,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC9B,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC9F,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,qBAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAE9F,6CAA6C;QAC7C,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;QAE9D,iEAAiE;QACjE,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IAEvC,oDAAoD;IACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,UAAU,CAAsB,CAAC;IAChG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,mCAAmC,CAAC,EAAE,CAAC;IACxE,CAAC;IAED,0DAA0D;IAC1D,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,yFAAyF;QACzF,IAAI,aAAiE,CAAC;QAEtE,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YACzB,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CACpC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAA6B,EAAE,CAAC,CAAC,CAC3E,CAAC;YACF,aAAa,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QACnE,CAAC;aAAM,IAAI,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;YACzC,yDAAyD;YACzD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;YACrC,aAAa,GAAG,EAAE,CAAC;YACnB,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;gBACzB,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;oBACnB,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC;iBAC9E,CAAC;YACN,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,aAAa,GAAG,MAAM,CAAC,WAAW,CAC9B,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAA6B,EAAE,CAAC,CAAC,CAC3E,CAAC;QACN,CAAC;QAED,MAAM,UAAU,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;QAEhD,iFAAiF;QACjF,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEvC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,sBAAsB,IAAI,wCAAwC,CAAC,CAAC;YACtF,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,SAAS;gBAC/B,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;gBAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC;gBACrG,IAAI,CAAC,KAAK,EAAE,CAAC;oBACT,QAAQ,CAAC,IAAI,CAAC,iCAAiC,IAAI,4BAA4B,CAAC,CAAC;gBACrF,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,QAAQ,CAAC,iBAAiB,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC;YACtF,QAAQ,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QAED,8DAA8D;QAC9D,MAAM,eAAe,GAAG,OAAO,EAAE,cAAc,IAAI,EAAE,CAAC;QACtD,MAAM,YAAY,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE;YAClE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,IAAI,OAAO,EAAE,iBAAiB;YAC3E,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,YAAY;SACf,CAAC,CAAC;QAEH,OAAO;YACH,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;SAC9C,CAAC;IACN,CAAC;IAED,6DAA6D;IAC7D,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,6CAA6C,CAAC,EAAE,CAAC;IAClF,CAAC;IAED,MAAM,EAAE,2BAA2B,EAAE,GAAG,WAAW,EAAE,CAAC;IACtD,MAAM,EAAE,sBAAsB,EAAE,eAAe,EAAE,GAAG,WAAW,EAAE,CAAC;IAElE,kEAAkE;IAClE,MAAM,QAAQ,GAAG,CAAC,CAAE,KAAK,CAAC,QAA0B,CAAC,UAAU,CAAC;IAChE,MAAM,QAAQ,GAAkC,QAAQ;QACpD,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,QAAyB,CAAC,CAAC,CAAC;QACrF,CAAC,CAAE,KAAK,CAAC,QAA0C,CAAC;IAExD,gEAAgE;IAChE,0EAA0E;IAC1E,MAAM,wBAAwB,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACtF,MAAM,YAAY,GAAG,wBAAwB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC;IAEhF,0DAA0D;IAC1D,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,MAAM,iBAAiB,GAAgD,EAAE,CAAC;IAC1E,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAqC,CAAC;IAEvE,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC,iCAAiC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAC1D,SAAS;QACb,CAAC;QAED,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC;QAEpD,qDAAqD;QACrD,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,MAAM,EAAE,CAAC;gBACT,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACpD,CAAC;YACD,SAAS;QACb,CAAC;QAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAEvC,kEAAkE;QAClE,MAAM,aAAa,GAAG,qBAAqB,CAAC,QAAQ,EAAE,EAAE,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;QAEpF,sEAAsE;QACtE,IAAI,WAA+D,CAAC;QACpE,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjF,MAAM,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE;gBAC/D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC9B,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3E,IAAI,CAAC,YAAY;oBAAE,OAAO,KAAK,CAAC;gBAChC,2DAA2D;gBAC3D,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,IAAK,CAAC,KAAM,CAAC,EAAE,CAAC;oBAC7D,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBAC1D,IAAI,WAAW,KAAK,SAAS;wBAAE,OAAO,KAAK,CAAC;oBAC5C,IAAI,WAAW,KAAK,QAAQ;wBAAE,OAAO,KAAK,CAAC;gBAC/C,CAAC;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBACrB,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,EAAE,CAC7C,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACpG,CAAC;YACN,CAAC;QACL,CAAC;QAED,8DAA8D;QAC9D,IAAI,WAAW,GAAY,SAAS,CAAC;QACrC,IAAI,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjF,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,CAAC;QAGD,MAAM,KAAK,GAA+B,2BAA2B,CAAC,aAAa,CAAC,UAAU,EAAE;YAC5F,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO;YACrC,aAAa;YACb,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,CAAC,CAAC,YAAY;YAC7B,WAAW,EAAE,YAAY;gBACrB,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CACnB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE;oBAChC,SAAS,EAAE,YAAY,CAAC,SAAS;oBACjC,WAAW,EAAE,YAAY,CAAC,WAAW;iBACxC,CAAC;gBACR,CAAC,CAAC,SAAS;YACf,WAAW;YACX,WAAW;SACd,CAAC,CAAC;QAEH,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAEpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YACtD,SAAS;QACb,CAAC;QAED,kDAAkD;QAClD,IAAI,UAAU,GAAwB,KAAK,CAAC;QAC5C,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC;QACtC,IAAI,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YAC7C,MAAM,KAAK,GAA8C,EAAE,CAAC;YAC5D,IAAI,YAAY,CAAC,KAAK;gBAAE,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;YAC1D,IAAI,YAAY,CAAC,OAAO;gBAAE,KAAK,CAAC,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC;YACnE,UAAU,GAAG;gBACT,GAAG,KAAK;gBACR,KAAK,EAAE,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;aACnD,CAAC;YACF,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjB,UAAU,CAAC,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACvE,CAAC;QACL,CAAC;QAED,MAAM,UAAU,GAA2B,QAAQ,CAAC,MAAM,EAAE,IAAI;YAC5D,CAAC,CAAC;gBACI,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,sBAAsB,CAAC,IAAI;gBAC/D,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,sBAAsB,CAAC,UAAU;gBAChF,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,sBAAsB,CAAC,UAAU;aACnF;YACH,CAAC,CAAC,SAAS,CAAC;QAEhB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,uBAAuB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACpE,CAAC;IAED,qCAAqC;IACrC,MAAM,aAAa,GAAuD,EAAE,CAAC;IAE7E,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACrC,SAAS;QACb,CAAC;QAED,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,EAAE,CAAC;IACvG,CAAC;IAED,oDAAoD;IACpD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAElD,iCAAiC;IACjC,MAAM,UAAU,GAAG;QACf,SAAS,EAAE,aAAa;KAC3B,CAAC;IAEF,mBAAmB;IACnB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE;QAC5D,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,IAAI,OAAO,EAAE,iBAAiB;QAC3E,SAAS,EAAE,OAAO,EAAE,SAAS;QAC7B,YAAY;KACf,CAAC,CAAC;IAEH,OAAO;QACH,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;KAC9C,CAAC;AACN,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAS,qBAAqB,CAC1B,OAAwD,EACxD,KAA6B,EAC7B,WAAyE;IAEzE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,MAAM,YAAY,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAuB,CAAC;QAC5D,MAAM,WAAW,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC3G,MAAM,IAAI,GAA0B;YAChC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YAClC,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC;YACtC,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC;YACtC,YAAY;YACZ,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG;YAClC,WAAW,EAAE,WAAW;YACxB,IAAI,EAAE,IAAI;YACV,CAAC,EAAE,MAAM,CAAC,CAAC;YACX,CAAC,EAAE,MAAM,CAAC,CAAC;YACX,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,KAAK,CAAC,SAAgE;SACpF,CAAC;QAEF,IAAI,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YAClE,IAAI,KAAK,EAAE,CAAC;gBACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACvB,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB,CAC1B,QAAwB,EACxB,EAAmB,EACnB,UAAuC;IAEvC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,IAAI,GAAG,CAAC;IAEpE,0BAA0B;IAC1B,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;IACrB,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,SAAS;QAC/B,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,MAAM;gBAAE,SAAS;YAC/B,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC5B,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC7C,IAAK,EAAa,GAAG,IAAI;wBAAE,IAAI,GAAG,EAAY,CAAC;oBAC/C,IAAK,EAAa,GAAG,IAAI;wBAAE,IAAI,GAAG,EAAY,CAAC;oBAC/C,IAAK,EAAa,GAAG,IAAI;wBAAE,IAAI,GAAG,EAAY,CAAC;oBAC/C,IAAK,EAAa,GAAG,IAAI;wBAAE,IAAI,GAAG,EAAY,CAAC;gBACnD,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;IAC/B,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACvG,OAAO,kBAAkB,CAAC,CAAC,yBAAyB;IACxD,CAAC;IAED,6DAA6D;IAC7D,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,GAAG,UAAU,CAAC;IACvC,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,GAAG,WAAW,CAAC;IACzC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QAC1D,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAED,OAAO,kBAAkB,GAAG,cAAc,CAAC;AAC/C,CAAC;AAED,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,iFAAiF;AACjF,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,IAAI,EAAE,SAAS;IACf,UAAU,EAAE,iDAAiD;IAC7D,UAAU,EAAE,KAAK;CACX,CAAC;AAEX,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAE9E,mFAAmF;AACnF,MAAM,CAAC,MAAM,qBAAqB,GAAgC;IAC9D,OAAO,EAAE,IAAI,EAAE,iEAAiE;IAChF,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,IAAI;CAChB,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAgC;IAChE,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,IAAI;CAChB,CAAC;AAYF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GAA8D;IACjG,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;IAC3B,WAAW,EAAE,uBAAuB;IACpC,aAAa,EAAE,uBAAuB;CACzC,CAAC;AAOF;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,EAAmB;IAC1C,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC;IAEzB,0DAA0D;IAC1D,MAAM,IAAI,GAAgC;QACtC,GAAG,qBAAqB;QACxB,GAAG,CAAC,EAAE,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC;KACM,CAAC;IAEjC,MAAM,UAAU,GAAmB;QAC/B,UAAU;QACV,cAAc;QACd,aAAa;QACb,aAAa;QACb,cAAc;QACd,aAAa;QACb,gBAAgB;QAChB,eAAe;KAClB,CAAC;IAEF,+EAA+E;IAC/E,MAAM,cAAc,GAAuC;QACvD,QAAQ,EAAE,cAAc;QACxB,YAAY,EAAE,cAAc;QAC5B,WAAW,EAAE,cAAc;QAC3B,YAAY,EAAE,cAAc;QAC5B,cAAc,EAAE,cAAc;QAC9B,WAAW,EAAE,aAAa;QAC1B,aAAa,EAAE,aAAa;QAC5B,WAAW,EAAE,aAAa;KAC7B,CAAC;IAEF,MAAM,UAAU,GAAG,EAAuD,CAAC;IAC3E,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,eAAe,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,UAAU,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,uDAAuD;QAC3F,MAAM,gBAAgB,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,gDAAgD;QAEpF,UAAU,CAAC,GAAG,CAAC,GAAG;YACd,GAAG,IAAI;YACP,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;YAC1B,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,0BAA0B;YACjD,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,6CAA6C;SAC7C,CAAC;IACrC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACzC,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC5B,IAA2B,EAC3B,OAAgB,EAChB,KAA6B,EAC7B,WAA2D;IAE3D,IAAI,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,SAAS,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS;QAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO;oBACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;oBACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;oBACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;oBACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC;iBAClC,CAAC;YACN,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,CAAC,2BAA2B;IACtC,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAW;IAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACpH,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO;YACH,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/B,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/B,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/B,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;SAClC,CAAC;IACN,CAAC;IACD,yBAAyB;IACzB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC","sourcesContent":["import type { SectionRenderState, SectionPath, SectionLabel } from '@twinfinity/geometry';\nimport { sectionStateToModelView, computePolylinesCenter } from './itemBuilders';\nimport { buildMetadataMap, normalizePropertySets, resolveIfcClassName, resolveIfcClassId } from './metadata';\nimport { applyLineStyleToPaths } from './utils';\nimport { analyzeTemplate } from './analyzeTemplate';\nimport { matchesV2Filter } from './filters';\nimport type {\n LayoutTemplate,\n ViewportElement,\n ViewportLineStyle,\n FillRule,\n SvgModelView,\n SectionResult,\n RenderDrawingInput,\n RenderDrawingResult,\n NormalizedProductItem,\n LabelStyle\n} from './types';\nimport { getProp } from './typeGuards';\n\n// ---------------------------------------------------------------------------\n// Local type declarations for optional peer-dependency APIs.\n// Declared inline to avoid pulling @babylonjs/core and @twinfinity/core into\n// print-layout's compile-time dependency graph.\n// ---------------------------------------------------------------------------\n\ninterface SampledColor {\n color: { r: number; g: number; b: number };\n alpha: number;\n}\n\ninterface ExternalSections {\n buildSectionStateForEntries: (\n perProduct: unknown[],\n options: {\n viewport?: { viewMinX: number; viewMaxX: number; viewMinZ: number; viewMaxZ: number };\n strokeWidth?: number;\n labelFontSize?: number;\n fills?: Array<{ class?: string | string[]; fillOpacity?: number; matchClipFilter?: boolean }>;\n includeMeta?: boolean;\n includeLabels?: boolean;\n buildLabels?: (products: unknown[], fontSize: number) => unknown[];\n clipPolygon?: Array<Array<{ x: number; z: number }>>;\n planeNormal?: unknown;\n }\n ) => (SectionRenderState & { rawPaths?: SectionPath[]; rawLabels?: SectionLabel[] }) | null;\n}\n\ninterface ExternalGeometry {\n sampleProductColorRgba: (product: unknown) => SampledColor | undefined;\n buildRoomLabels: (\n entries: unknown[],\n fontSize: number,\n options: { labelPath: string; classFilter?: string }\n ) => SectionLabel[];\n}\n\n// These were previously lazy-loaded via require() from @measurement-tools/* packages.\n// Now they are part of @twinfinity/printing (this package) and @twinfinity/geometry.\nimport { buildSectionStateForEntries, resolveProductProperty } from '../sections';\n\n// Wrap into the ExternalSections shape for backward compat with the rest of this file.\nconst _sections: ExternalSections = {\n buildSectionStateForEntries: (perProduct, options) => {\n type Entries = Parameters<typeof buildSectionStateForEntries>[0];\n type Opts = Parameters<typeof buildSectionStateForEntries>[1];\n return buildSectionStateForEntries(perProduct as Entries, {\n ...options,\n fills: options.fills as Opts['fills'],\n buildLabels: options.buildLabels as Opts['buildLabels'],\n planeNormal: options.planeNormal as Opts['planeNormal']\n });\n }\n};\nfunction getSections(): ExternalSections {\n return _sections;\n}\n\n// sampleProductColorRgba: duck-type access to product mesh style color.\n// buildRoomLabels: requires product-geometry which this package can't depend on.\n// Consumers must provide buildRoomLabels via options if room labels are needed.\nconst _geometry: ExternalGeometry = {\n sampleProductColorRgba: (product: unknown): SampledColor | undefined => {\n /** Duck-typed mesh with optional color-access methods. */\n interface DuckMesh {\n copyColorTo?: (out: Uint8Array, offset: number) => void;\n getColorComponent?: (index: number) => number;\n style?: { surfaceColor?: readonly number[]; color?: readonly number[] };\n }\n const p = product as Record<string, unknown>;\n const meshes = (p?.meshes ?? p?.productMeshes) as DuckMesh[] | undefined;\n if (!meshes?.length) return undefined;\n\n const rgba = new Uint8Array(4);\n for (const mesh of meshes) {\n try {\n if (typeof mesh.copyColorTo === 'function') {\n mesh.copyColorTo(rgba, 0);\n } else if (typeof mesh.getColorComponent === 'function') {\n rgba[0] = mesh.getColorComponent(0);\n rgba[1] = mesh.getColorComponent(1);\n rgba[2] = mesh.getColorComponent(2);\n rgba[3] = mesh.getColorComponent(3);\n } else {\n const style = mesh.style;\n const c = style?.surfaceColor ?? style?.color;\n if (c) {\n // surfaceColor values may be 0–1 or 0–255; normalize to 0–1\n const maxVal = Math.max(c[0], c[1], c[2]);\n const scale = maxVal > 1 ? 1 / 255 : 1;\n return {\n color: { r: c[0] * scale, g: c[1] * scale, b: c[2] * scale },\n alpha: (c[3] ?? (maxVal > 1 ? 255 : 1)) * scale\n };\n }\n continue;\n }\n } catch {\n continue;\n }\n const [r, g, b, a] = rgba;\n if (a === 0 && r === 0 && g === 0 && b === 0) continue;\n return { color: { r: r / 255, g: g / 255, b: b / 255 }, alpha: a / 255 };\n }\n return undefined;\n },\n buildRoomLabels: () => [] // Requires product-geometry — consumer provides via options\n};\nfunction getGeometry(): ExternalGeometry {\n return _geometry;\n}\nfunction getSampleColor(): (product: unknown) => SampledColor | undefined {\n return _geometry.sampleProductColorRgba;\n}\n\n// Late-binding for renderLayout to break circular dependency.\n// renderDrawing is imported by index.ts which defines renderLayout.\n// The binding is set by index.ts after definition via setRenderLayoutBinding().\nlet _renderLayout:\n | ((\n template: LayoutTemplate,\n data: any,\n models: Record<string, SvgModelView>,\n options?: any\n ) => Promise<{ svg: string; viewportScales: any; warnings: string[] }>)\n | null = null;\n\n/** Called by index.ts to register renderLayout without a circular import. */\nexport function setRenderLayoutBinding(fn: NonNullable<typeof _renderLayout>): void {\n _renderLayout = fn;\n}\n\nfunction getRenderLayout(): NonNullable<typeof _renderLayout> {\n if (!_renderLayout) {\n throw new Error(\n 'renderLayout not initialized. Ensure @twinfinity/printing index is imported before calling renderDrawing.'\n );\n }\n return _renderLayout;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * High-level entry point that converts raw plane-section results and a layout\n * template into a ready-to-print SVG string.\n *\n * Internalizes all data wiring (section → SVG, item extraction, color sampling,\n * metadata building, legend/label data) that previously required ~350 lines of\n * app-side boilerplate.\n *\n * ```ts\n * const section = computePlaneSectionsForProducts(products, plane, { includeInvisible: true });\n * const { svg, warnings } = await renderDrawing({\n * template,\n * sections: { main: section },\n * options: {\n * allowRemoteAssets: true,\n * qrContext: { host, containerName, planeHeight },\n * productFields: { idPath: \"propertySets.BIP.spacenumber.value\", ... },\n * roomLabels: { labelPath: \"BIP.spacename\", classFilter: \"space\" },\n * },\n * });\n * ```\n */\nexport async function renderDrawing(input: RenderDrawingInput): Promise<RenderDrawingResult> {\n const { options } = input;\n const warnings: string[] = [];\n\n // ---- Resolve template variables (if present) ----\n // This happens FIRST to ensure all {{vars.*}} references are resolved before validation/rendering\n let template = input.template;\n if (template.variables) {\n const { resolveTemplateValues, applyTemplateVariables } = await import('./templateVariables');\n const { values, warnings: varWarnings } = resolveTemplateValues(template, options?.variables);\n\n // Add variable resolution warnings to output\n varWarnings.forEach((w) => warnings.push(`[Variables] ${w}`));\n\n // Apply variables to template (substitute {{vars.*}} references)\n template = applyTemplateVariables(template, values);\n }\n\n const renderLayout = getRenderLayout();\n\n // ---- Collect viewport elements from template ----\n const viewports = template.elements.filter((el) => el.kind === 'viewport') as ViewportElement[];\n if (!viewports.length) {\n return { svg: '', warnings: ['No viewport elements in template.'] };\n }\n\n // ---- Fast path: pre-built models provided directly ----\n if (input.models) {\n // Build items: explicit viewportItems take priority, then auto-build from productEntries\n let viewportsData: Record<string, { items: NormalizedProductItem[] }>;\n\n if (options?.viewportItems) {\n const emptyDefaults = Object.fromEntries(\n viewports.map((vp) => [vp.id, { items: [] as NormalizedProductItem[] }])\n );\n viewportsData = { ...emptyDefaults, ...options.viewportItems };\n } else if (options?.productEntries?.length) {\n // Auto-build items per viewport from raw product entries\n const sampleColor = getSampleColor();\n viewportsData = {};\n for (const vp of viewports) {\n viewportsData[vp.id] = {\n items: buildItemsFromEntries(options.productEntries, vp.fills, sampleColor)\n };\n }\n } else {\n viewportsData = Object.fromEntries(\n viewports.map((vp) => [vp.id, { items: [] as NormalizedProductItem[] }])\n );\n }\n\n const layoutData = { viewports: viewportsData };\n\n // Early input analysis: warn about mismatches between template and provided data\n const reqs = analyzeTemplate(template);\n\n for (const vpId of reqs.viewportIds) {\n if (!input.models[vpId]) {\n warnings.push(`Template viewport '${vpId}' has no model — it will render empty.`);\n }\n }\n\n const allItems = Object.values(viewportsData).flatMap((v) => v.items);\n if (allItems.length > 0) {\n for (const path of reqs.propertyPaths) {\n const parts = path.split('.');\n if (parts.length < 2) continue;\n const [setName, propName] = parts;\n const hasIt = allItems.some((item) => item.propertySets?.[setName]?.[propName]?.value !== undefined);\n if (!hasIt) {\n warnings.push(`Template references property '${path}' but no items provide it.`);\n }\n }\n }\n\n if (reqs.usesRemoteAssets && !template.allowRemoteAssets && !options?.allowRemoteAssets) {\n warnings.push('Template uses remote assets but allowRemoteAssets is not enabled.');\n }\n\n // Build metadata from product entries (same as standard path)\n const metadataEntries = options?.productEntries ?? [];\n const metadataById = buildMetadataMap(metadataEntries);\n\n const result = await renderLayout(template, layoutData, input.models, {\n allowRemoteAssets: template.allowRemoteAssets ?? options?.allowRemoteAssets,\n qrContext: options?.qrContext,\n metadataById\n });\n\n return {\n svg: result.svg,\n warnings: [...warnings, ...result.warnings]\n };\n }\n\n // ---- Standard path: build models from section results ----\n if (!input.sections) {\n return { svg: '', warnings: ['Either sections or models must be provided.'] };\n }\n\n const { buildSectionStateForEntries } = getSections();\n const { sampleProductColorRgba, buildRoomLabels } = getGeometry();\n\n // Normalize sections: single SectionResult → map to all viewports\n const isSingle = !!(input.sections as SectionResult).perProduct;\n const sections: Record<string, SectionResult> = isSingle\n ? Object.fromEntries(viewports.map((vp) => [vp.id, input.sections as SectionResult]))\n : (input.sections as Record<string, SectionResult>);\n\n // Auto-detect whether the template has its own labels elements.\n // If so, do NOT embed labels in the section SVG (would cause duplicates).\n const hasTemplateLabelElements = template.elements.some((el) => el.kind === 'labels');\n const roomLabelCfg = hasTemplateLabelElements ? undefined : options?.roomLabels;\n\n // ---- Build section state + model view per viewport ----\n const models: Record<string, SvgModelView> = {};\n const entriesByViewport: Record<string, SectionResult['perProduct']> = {};\n const sectionStateCache = new Map<string, SectionRenderState | null>();\n\n for (const vp of viewports) {\n const sectionResult = sections[vp.id];\n if (!sectionResult?.perProduct?.length) {\n warnings.push(`No section data for viewport '${vp.id}'.`);\n continue;\n }\n\n entriesByViewport[vp.id] = sectionResult.perProduct;\n\n // Dedup: skip if already built for this viewport key\n if (sectionStateCache.has(vp.id)) {\n const cached = sectionStateCache.get(vp.id);\n if (cached) {\n models[vp.id] = sectionStateToModelView(cached);\n }\n continue;\n }\n\n const resolved = resolveLineStyles(vp);\n\n // Estimate label font size from template style and section bounds\n const labelFontSize = estimateLabelFontSize(template, vp, sectionResult.perProduct);\n\n // Extract clip polygon from section results if clip config is present\n let clipPolygon: Array<Array<{ x: number; z: number }>> | undefined;\n if (vp.clip?.where && vp.clip.class) {\n const clipClass = Array.isArray(vp.clip.class) ? vp.clip.class : [vp.clip.class];\n const clipEntries = sectionResult.perProduct.filter((entry: any) => {\n const product = entry.product;\n const matchesClass = clipClass.some((c: string) => product.class?.is?.(c));\n if (!matchesClass) return false;\n // Match where condition using T8-aware property resolution\n for (const [path, expected] of Object.entries(vp.clip!.where!)) {\n const actualValue = resolveProductProperty(product, path);\n if (actualValue === undefined) return false;\n if (actualValue !== expected) return false;\n }\n return true;\n });\n if (clipEntries.length) {\n clipPolygon = clipEntries.flatMap((entry: any) =>\n (entry.polylines || []).map((pl: any) => (pl.points || []).map((p: any) => ({ x: p.x, z: p.z })))\n );\n }\n }\n\n // Convert planeNormal array to object with x, y, z if present\n let planeNormal: unknown = undefined;\n if (vp.planeNormal && Array.isArray(vp.planeNormal) && vp.planeNormal.length === 3) {\n planeNormal = { x: vp.planeNormal[0], y: vp.planeNormal[1], z: vp.planeNormal[2] };\n }\n\n type SectionStateWithRaw = SectionRenderState & { rawPaths?: SectionPath[]; rawLabels?: SectionLabel[] };\n const state: SectionStateWithRaw | null = buildSectionStateForEntries(sectionResult.perProduct, {\n strokeWidth: resolved.default.widthMm,\n labelFontSize,\n fills: vp.fills,\n includeMeta: true,\n includeLabels: !!roomLabelCfg,\n buildLabels: roomLabelCfg\n ? (products, fontSize) =>\n buildRoomLabels(products, fontSize, {\n labelPath: roomLabelCfg.labelPath,\n classFilter: roomLabelCfg.classFilter\n })\n : undefined,\n clipPolygon,\n planeNormal\n });\n\n sectionStateCache.set(vp.id, state);\n\n if (!state) {\n warnings.push(`No geometry for viewport '${vp.id}'.`);\n continue;\n }\n\n // Apply line style overrides from viewport config\n let finalState: SectionStateWithRaw = state;\n const defaultStyle = resolved.default;\n if (defaultStyle.color || defaultStyle.widthMm) {\n const style: { stroke?: string; strokeWidth?: number } = {};\n if (defaultStyle.color) style.stroke = defaultStyle.color;\n if (defaultStyle.widthMm) style.strokeWidth = defaultStyle.widthMm;\n finalState = {\n ...state,\n paths: applyLineStyleToPaths(state.paths, style)\n };\n if (state.rawPaths) {\n finalState.rawPaths = applyLineStyleToPaths(state.rawPaths, style);\n }\n }\n\n const labelStyle: LabelStyle | undefined = template.styles?.body\n ? {\n fill: template.styles.body.color ?? BUILTIN_LABEL_DEFAULTS.fill,\n fontFamily: template.styles.body.fontFamily ?? BUILTIN_LABEL_DEFAULTS.fontFamily,\n fontWeight: template.styles.body.fontWeight ?? BUILTIN_LABEL_DEFAULTS.fontWeight\n }\n : undefined;\n\n models[vp.id] = sectionStateToModelView(finalState, labelStyle);\n }\n\n // ---- Build items per viewport ----\n const viewportsData: Record<string, { items: NormalizedProductItem[] }> = {};\n\n for (const vp of viewports) {\n const entries = entriesByViewport[vp.id];\n if (!entries) {\n viewportsData[vp.id] = { items: [] };\n continue;\n }\n\n viewportsData[vp.id] = { items: buildItemsFromEntries(entries, vp.fills, sampleProductColorRgba) };\n }\n\n // ---- Build metadata from all section entries ----\n const allEntries = Object.values(entriesByViewport).flat();\n const metadataById = buildMetadataMap(allEntries);\n\n // ---- Assemble layout data ----\n const layoutData = {\n viewports: viewportsData\n };\n\n // ---- Render ----\n const result = await renderLayout(template, layoutData, models, {\n allowRemoteAssets: template.allowRemoteAssets ?? options?.allowRemoteAssets,\n qrContext: options?.qrContext,\n metadataById\n });\n\n return {\n svg: result.svg,\n warnings: [...warnings, ...result.warnings]\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build NormalizedProductItems from per-product entries.\n *\n * Shared between the standard path (plane sections) and the models path\n * (slab sections / pre-built models with productEntries).\n */\nfunction buildItemsFromEntries(\n entries: Array<{ product: unknown; polylines: unknown }>,\n fills: FillRule[] | undefined,\n sampleColor: ((product: unknown) => SampledColor | undefined) | undefined\n): NormalizedProductItem[] {\n return entries.map((entry) => {\n const product = entry.product;\n const propertySets = normalizePropertySets(product);\n const gid = getProp(product, 'gid') ?? getProp(product, 'id');\n const center = computePolylinesCenter(entry);\n const name = getProp(product, 'name') as string | undefined;\n const displayName = typeof name === 'string' && name.trim().length ? name.trim() : gid ? String(gid) : '-';\n const item: NormalizedProductItem = {\n gid: gid ? String(gid) : undefined,\n ifcClass: resolveIfcClassName(product),\n ifcClassId: resolveIfcClassId(product),\n propertySets,\n productId: gid ? String(gid) : '-',\n productName: displayName,\n area: null,\n x: center.x,\n z: center.z,\n text: displayName,\n polylines: entry.polylines as Array<{ points?: Array<{ x: number; z: number }> }>\n };\n\n if (fills?.length && sampleColor) {\n const color = resolveFillColor(item, product, fills, sampleColor);\n if (color) {\n item.color = color;\n }\n }\n\n return item;\n });\n}\n\n/**\n * Estimate label font size in model units from the template body style and the\n * approximate viewport-to-world scale ratio.\n */\nfunction estimateLabelFontSize(\n template: LayoutTemplate,\n vp: ViewportElement,\n perProduct: SectionResult['perProduct']\n): number {\n const templateFontSizeMm = template.styles?.body?.fontSizeMm ?? 3.5;\n\n // Quick world-bounds scan\n let minX = Infinity;\n let maxX = -Infinity;\n let minZ = Infinity;\n let maxZ = -Infinity;\n for (const entry of perProduct) {\n if (!entry.polylines) continue;\n for (const polyline of entry.polylines) {\n if (!polyline.points) continue;\n for (const pt of polyline.points) {\n const px = getProp(pt, 'x');\n const pz = getProp(pt, 'z');\n if (Number.isFinite(px) && Number.isFinite(pz)) {\n if ((px as number) < minX) minX = px as number;\n if ((px as number) > maxX) maxX = px as number;\n if ((pz as number) < minZ) minZ = pz as number;\n if ((pz as number) > maxZ) maxZ = pz as number;\n }\n }\n }\n }\n\n const worldWidth = maxX - minX;\n const worldHeight = maxZ - minZ;\n if (!Number.isFinite(worldWidth) || worldWidth <= 0 || !Number.isFinite(worldHeight) || worldHeight <= 0) {\n return templateFontSizeMm; // Fallback: 1:1 estimate\n }\n\n // Approximate mm-per-model-unit from the viewport dimensions\n const scaleX = vp.widthMm / worldWidth;\n const scaleY = vp.heightMm / worldHeight;\n const mmPerModelUnit = Math.min(scaleX, scaleY);\n\n if (!Number.isFinite(mmPerModelUnit) || mmPerModelUnit <= 0) {\n return templateFontSizeMm;\n }\n\n return templateFontSizeMm / mmPerModelUnit;\n}\n\n// ---------------------------------------------------------------------------\n// Label style defaults\n// ---------------------------------------------------------------------------\n\n/** Built-in label style defaults when template body styles are partially set. */\nexport const BUILTIN_LABEL_DEFAULTS = {\n fill: '#374151',\n fontFamily: '\"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif',\n fontWeight: '300'\n} as const;\n\n// ---------------------------------------------------------------------------\n// Line style defaults & resolution\n// ---------------------------------------------------------------------------\n\n/** Built-in defaults when neither lineStyles nor lineWidthMm/lineColor are set. */\nexport const BUILTIN_LINE_DEFAULTS: Required<ViewportLineStyle> = {\n widthMm: 0.35, // Reasonable default: 0.35mm line width (was 0.01mm - too thin!)\n color: '#1f2937',\n dash: '',\n enabled: true\n};\n\nexport const BUILTIN_HIDDEN_DEFAULTS: Required<ViewportLineStyle> = {\n widthMm: 0.005,\n color: '#9ca3af',\n dash: '4 2',\n enabled: true\n};\n\ntype LineCategory =\n | 'cutLines'\n | 'visibleLines'\n | 'hiddenLines'\n | 'silhouettes'\n | 'featureEdges'\n | 'stairArrows'\n | 'outlineVisible'\n | 'outlineHidden';\n\n/** Category-specific built-in defaults (merged over the global default). */\nexport const CATEGORY_BUILTIN_OVERRIDES: Partial<Record<LineCategory, Partial<ViewportLineStyle>>> = {\n cutLines: { widthMm: 0.02 },\n hiddenLines: BUILTIN_HIDDEN_DEFAULTS,\n outlineHidden: BUILTIN_HIDDEN_DEFAULTS\n};\n\nexport interface ResolvedLineStyles {\n default: Required<ViewportLineStyle>;\n byCategory: Record<LineCategory, Required<ViewportLineStyle>>;\n}\n\n/**\n * Resolve the effective line style for every category.\n *\n * Priority: category entry in `lineStyles` → `lineStyles.default`\n * → `lineWidthMm`/`lineColor` shorthand → built-in defaults.\n */\nfunction resolveLineStyles(vp: ViewportElement): ResolvedLineStyles {\n const ls = vp.lineStyles;\n\n // Base default: lineStyles.default → shorthand → built-in\n const base: Required<ViewportLineStyle> = {\n ...BUILTIN_LINE_DEFAULTS,\n ...(vp.lineWidthMm !== undefined ? { widthMm: vp.lineWidthMm } : {}),\n ...(vp.lineColor !== undefined ? { color: vp.lineColor } : {}),\n ...(ls?.default ?? {})\n } as Required<ViewportLineStyle>;\n\n const categories: LineCategory[] = [\n 'cutLines',\n 'visibleLines',\n 'hiddenLines',\n 'silhouettes',\n 'featureEdges',\n 'stairArrows',\n 'outlineVisible',\n 'outlineHidden'\n ];\n\n // Category group mapping: individual categories inherit from their group style\n const categoryGroups: Record<LineCategory, LineCategory> = {\n cutLines: 'visibleLines',\n visibleLines: 'visibleLines',\n silhouettes: 'visibleLines',\n featureEdges: 'visibleLines',\n outlineVisible: 'visibleLines',\n hiddenLines: 'hiddenLines',\n outlineHidden: 'hiddenLines',\n stairArrows: 'stairArrows'\n };\n\n const byCategory = {} as Record<LineCategory, Required<ViewportLineStyle>>;\n for (const cat of categories) {\n const builtinOverride = CATEGORY_BUILTIN_OVERRIDES[cat];\n const groupName = categoryGroups[cat];\n const groupStyle = ls?.[groupName]; // Group style (visibleLines, hiddenLines, stairArrows)\n const categoryOverride = ls?.[cat]; // Individual category settings (enable/disable)\n\n byCategory[cat] = {\n ...base,\n ...(builtinOverride ?? {}),\n ...(groupStyle ?? {}), // Apply group style first\n ...(categoryOverride ?? {}) // Then individual overrides (enable/disable)\n } as Required<ViewportLineStyle>;\n }\n\n return { default: base, byCategory };\n}\n\n// ---------------------------------------------------------------------------\n// Fill rule helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve fill color for an item based on viewport fill rules.\n * Returns an RGBA tuple [r, g, b, a] (0–255) or undefined if no rule matches.\n */\nexport function resolveFillColor(\n item: NormalizedProductItem,\n product: unknown,\n fills: FillRule[] | undefined,\n sampleColor: (product: unknown) => SampledColor | undefined\n): [number, number, number, number] | undefined {\n if (!fills?.length) return undefined;\n for (const rule of fills) {\n if (!matchesV2Filter(item, rule.class, rule.where)) continue;\n if (rule.fill === 'sample') {\n const sampled = sampleColor(product);\n if (sampled) {\n return [\n Math.round(sampled.color.r * 255),\n Math.round(sampled.color.g * 255),\n Math.round(sampled.color.b * 255),\n Math.round(sampled.alpha * 255)\n ];\n }\n } else {\n return parseHexToRgba(rule.fill);\n }\n break; // first matching rule wins\n }\n return undefined;\n}\n\n/**\n * Parse a CSS hex color string to an RGBA tuple (0–255).\n */\nfunction parseHexToRgba(hex: string): [number, number, number, number] {\n const h = hex.replace(/^#/, '');\n if (h.length === 3) {\n return [parseInt(h[0] + h[0], 16), parseInt(h[1] + h[1], 16), parseInt(h[2] + h[2], 16), 255];\n }\n if (h.length === 6) {\n return [parseInt(h.substring(0, 2), 16), parseInt(h.substring(2, 4), 16), parseInt(h.substring(4, 6), 16), 255];\n }\n if (h.length === 8) {\n return [\n parseInt(h.substring(0, 2), 16),\n parseInt(h.substring(2, 4), 16),\n parseInt(h.substring(4, 6), 16),\n parseInt(h.substring(6, 8), 16)\n ];\n }\n // Fallback: opaque black\n return [0, 0, 0, 255];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderUtils.js","sourceRoot":"/","sources":["layout/renderUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecord } from './typeGuards';\
|
|
1
|
+
{"version":3,"file":"renderUtils.js","sourceRoot":"/","sources":["layout/renderUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecord } from './typeGuards';\n\nexport const escapeAttr = (value: unknown): string =>\n String(value).replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');\n\nexport const escapeText = (value: unknown): string =>\n String(value).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n\nexport const getPathValue = (source: unknown, path: string): unknown => {\n const parts = path\n .split('.')\n .map((p) => p.trim())\n .filter(Boolean);\n let current: unknown = source;\n for (const part of parts) {\n if (!isRecord(current)) {\n return undefined;\n }\n current = current[part];\n }\n return current;\n};\n\nexport const interpolate = (template: string, data: any, warnings?: string[]): string =>\n template.replace(/\\{\\{\\s*([^}]+?)\\s*\\}\\}/g, (match, path) => {\n const value = getPathValue(data, path);\n if (value === undefined || value === null) {\n if (warnings) {\n warnings.push(`Unresolved template variable '${path}' in \"${template}\".`);\n }\n return '';\n }\n if (typeof value === 'object') {\n if (warnings) {\n warnings.push(\n `Template variable '${path}' resolved to an object instead of a string in \"${template}\".`\n );\n }\n return '';\n }\n return String(value);\n });\n\nexport const interpolateWithSources = (template: string, sources: any[]): string =>\n template.replace(/\\{\\{\\s*([^}]+?)\\s*\\}\\}/g, (_match, path) => {\n for (const source of sources) {\n const value = getPathValue(source, path);\n if (value !== undefined && value !== null && typeof value !== 'object') {\n return String(value);\n }\n }\n return '';\n });\n\n// colorFromString moved to utils.ts to avoid duplication\n// Import from utils.ts if needed: import { colorFromString } from './utils';\n\n/**\n * Resolve a short property path from an item's propertySets.\n *\n * Template paths use the format: SetName.propertyName\n * Example: \"SetName.propName\" resolves to item.propertySets.SetName.propName.value\n *\n * @param item - An object with propertySets structure\n * @param shortPath - Short path like \"SetName.propName\"\n * @returns The property value, or undefined if not found\n */\nexport const resolveProperty = (item: unknown, shortPath: string): unknown => {\n if (!shortPath || !isRecord(item)) return undefined;\n\n const propertySets = (item as Record<string, unknown>).propertySets;\n if (!isRecord(propertySets)) return undefined;\n\n const parts = shortPath.split('.');\n if (parts.length < 2) return undefined;\n\n const [setName, ...propParts] = parts;\n const propName = propParts.join('.');\n\n const propSet = propertySets[setName];\n if (!isRecord(propSet)) return undefined;\n\n // New T8 API: T8PropertySet has .properties sub-record\n const innerProps = propSet['properties'];\n const prop = (isRecord(innerProps) ? innerProps[propName] : undefined) ?? propSet[propName];\n\n // Handle both wrapped {value} and raw values\n if (isRecord(prop) && 'value' in prop) {\n return prop.value;\n }\n return prop;\n};\n\n/**\n * Resolve a property value using either short or full path.\n * Short path: \"SetName.propName\" → resolves via propertySets\n * Full path: \"propertySets.SetName.propName.value\" → resolves via direct traversal\n * Also handles top-level properties like \"color\".\n */\nexport const resolvePath = (obj: unknown, path: string): unknown => {\n if (path.startsWith('propertySets.')) {\n return getPathValue(obj, path);\n }\n const direct = getPathValue(obj, path);\n if (direct !== undefined) return direct;\n return resolveProperty(obj, path);\n};\n\n/**\n * Check if an item matches a filter condition using short property paths.\n *\n * @param item - An object with propertySets structure\n * @param filter - Filter with path (short format), equals, or in conditions\n * @returns true if item matches the filter\n */\nexport const matchesPropertyFilter = (\n item: unknown,\n filter: { path?: string; equals?: unknown; in?: unknown[] } | undefined\n): boolean => {\n if (!filter || !filter.path) return true;\n\n const value = resolveProperty(item, filter.path);\n const normalizedValue = typeof value === 'string' ? value.toLowerCase().trim() : value;\n\n if (filter.equals !== undefined) {\n const normalizedEquals = typeof filter.equals === 'string' ? filter.equals.toLowerCase().trim() : filter.equals;\n return normalizedValue === normalizedEquals;\n }\n\n if (Array.isArray(filter.in)) {\n return filter.in.some((v) => {\n const normalizedV = typeof v === 'string' ? v.toLowerCase().trim() : v;\n return normalizedValue === normalizedV;\n });\n }\n\n return true;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sectionValidation.js","sourceRoot":"/","sources":["layout/sectionValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export { validateSectionState } from '@twinfinity/geometry';\
|
|
1
|
+
{"version":3,"file":"sectionValidation.js","sourceRoot":"/","sources":["layout/sectionValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export { validateSectionState } from '@twinfinity/geometry';\nexport type { SectionStateValidationResult } from '@twinfinity/geometry';\n"]}
|