@twinfinity/printing 6.0.1-ci.28952-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/sections.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sections.js","sourceRoot":"/","sources":["sections.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n Vec3,\r\n SectionLabel,\r\n SectionPath,\r\n SectionRenderState,\r\n TransformInfo,\r\n ViewWindow\r\n} from '@twinfinity/geometry';\r\n\r\nexport type { SectionLabel, SectionPath, SectionRenderState, TransformInfo, ViewWindow } from '@twinfinity/geometry';\r\n\r\n/** Minimal product interface for section fill matching. */\r\ninterface SectionProduct {\r\n class?: { is(c: unknown): boolean; type?: string; id?: string };\r\n className?: string;\r\n propertySets?: Record<string, unknown>;\r\n properties?: { data?: Record<string, unknown>; sets?: Record<string, unknown> };\r\n}\r\n\r\n/** Local replacement for PlaneSectionEntry (not available in @twinfinity/geometry). */\r\ntype PlaneSectionEntry<TProduct extends SectionProduct = SectionProduct> = {\r\n product: TProduct;\r\n segments: [Vec3, Vec3][];\r\n polylines: { points: Vec3[]; closed: boolean }[];\r\n};\r\n\r\n/**\r\n * Resolve a dotted property path (e.g. \"BIP.spacetype\") against a product.\r\n * Handles both the new T8 API (propertySets → .properties → .value) and\r\n * legacy BimIfcObject (properties.sets / properties.data).\r\n *\r\n * Returns the resolved value, or undefined if not found.\r\n */\r\nexport function resolveProductProperty(product: SectionProduct | unknown, path: string): unknown {\r\n const p = product as SectionProduct;\r\n const parts = path.split('.');\r\n if (parts.length < 2) return undefined;\r\n\r\n const [setName, ...propParts] = parts;\r\n const propName = propParts.join('.');\r\n\r\n // New T8 API: propertySets['BIP'].properties['spacetype'].value\r\n const pset = (p?.propertySets as Record<string, any>)?.[setName];\r\n if (pset) {\r\n const prop = pset.properties?.[propName];\r\n if (prop !== undefined) {\r\n return prop?.value !== undefined ? prop.value : prop;\r\n }\r\n }\r\n\r\n // Legacy: properties.sets['BIP']['spacetype']\r\n const legacyPset = (p?.properties?.sets as Record<string, any>)?.[setName];\r\n if (legacyPset) {\r\n const val = legacyPset[propName];\r\n if (val !== undefined) {\r\n return val?.value !== undefined ? val.value : val;\r\n }\r\n }\r\n\r\n // Fallback: properties.data['BIP']['spacetype'] (old printing code path)\r\n let value: any = p?.properties?.data;\r\n if (value) {\r\n for (const part of parts) {\r\n value = value?.[part];\r\n if (value === undefined) break;\r\n }\r\n if (value !== undefined) {\r\n return value?.value !== undefined ? value.value : value;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Sample the actual rendered color of a product's first mesh.\r\n * Uses BimProductMesh.copyColorTo/getColorComponent for accurate colors\r\n * (includes overrides, highlights). Falls back to style.surfaceColor/color.\r\n */\r\nconst sampleProductColorRgba = (product: unknown): { r: number; g: number; b: number; a: number } | 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 || !meshes.length) return undefined;\r\n\r\n const rgba = new Uint8Array(4);\r\n\r\n for (const mesh of meshes) {\r\n try {\r\n // BimProductMesh: read actual rendered color via copyColorTo or getColorComponent\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); // Red\r\n rgba[1] = mesh.getColorComponent(1); // Green\r\n rgba[2] = mesh.getColorComponent(2); // Blue\r\n rgba[3] = mesh.getColorComponent(3); // Alpha\r\n } else {\r\n // ModelMesh fallback: read from style\r\n const style = mesh.style;\r\n const c = style?.surfaceColor ?? style?.color;\r\n if (c) return { r: c[0], g: c[1], b: c[2], a: (c[3] ?? 255) / 255 };\r\n continue;\r\n }\r\n } catch {\r\n continue;\r\n }\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 { r, g, b, a: a / 255 };\r\n }\r\n\r\n return undefined;\r\n};\r\n\r\n/** Base SVG display width in layout units. */\r\nexport const BASE_WIDTH = 240;\r\n/** Minimum SVG display height in layout units. */\r\nexport const MIN_HEIGHT = 140;\r\n/** Margin ratio applied around section bounds (fraction of world extent). */\r\nexport const SECTION_MARGIN_RATIO = 0.05;\r\n/** Maximum zoom factor for viewport clamping. */\r\nexport const MAX_ZOOM_FACTOR = 12;\r\n/** Multiplicative step for zooming in. */\r\nexport const ZOOM_IN_STEP = 0.8;\r\n/** Multiplicative step for zooming out. */\r\nexport const ZOOM_OUT_STEP = 1 / ZOOM_IN_STEP;\r\nconst OUTLINE_THICKNESS_SCALE = 0.5;\r\n\r\n/** Clamp a number to a min/max range. */\r\nexport function clampValue(value: number, min: number, max: number): number {\r\n return Math.min(max, Math.max(min, value));\r\n}\r\n\r\nexport interface SectionBuildOptions {\r\n /** If true, attach source product metadata to paths/labels for downstream filtering */\r\n includeMeta?: boolean;\r\n /** When true, create fill paths for closed polygons. When false, create only stroke/outline paths. Defaults to true for backward compatibility. */\r\n createFills?: boolean;\r\n /** Plane normal vector for determining 2D projection axes. If omitted, defaults to horizontal plan (Y-up). */\r\n planeNormal?: Vec3;\r\n}\r\n\r\n/**\r\n * Extract product metadata for path/label attribution.\r\n * Casts to `any` once here to avoid scattering `as any` across the codebase.\r\n * BimIfcObject's runtime shape exposes these fields but the public typings\r\n * don't always surface them.\r\n */\r\nfunction extractProductMeta(product: unknown): {\r\n productId: string;\r\n ifcClass: string | null;\r\n ifcClassId: string | null;\r\n properties: unknown;\r\n} {\r\n const p = product as Record<string, any>;\r\n return {\r\n productId: p?.gid ?? p?.id ?? String(product),\r\n ifcClass: p?.class?.type ?? null,\r\n ifcClassId: p?.class?.id ?? null,\r\n properties: p?.properties?.data ?? p?.properties ?? null\r\n };\r\n}\r\n\r\n/** Default fill opacity when a fill rule omits `fillOpacity`. */\r\nexport const DEFAULT_FILL_OPACITY = 0.35;\r\n\r\n/**\r\n * Fill rule controlling which products get visible fills and at what opacity.\r\n * Mirrors the template-level FillRule but kept minimal to avoid circular deps.\r\n */\r\nexport interface SectionFillRule {\r\n /** IFC class filter. When omitted, matches all products. */\r\n class?: string | string[];\r\n /** Property-based filter (e.g. { \"BIP.spacetype\": \"ROOM\" }). */\r\n where?: Record<string, string | number | boolean | Array<string | number>>;\r\n /** Fill opacity (0–1). Default: {@link DEFAULT_FILL_OPACITY}. */\r\n fillOpacity?: number;\r\n /** When true, only apply fill to products whose centroid is inside the clip polygon. @default false */\r\n matchClipFilter?: boolean;\r\n}\r\n\r\nexport interface BuildSectionStateOptions {\r\n viewport?: ViewWindow;\r\n strokeWidth?: number;\r\n labelFontSize?: number;\r\n /**\r\n * Fill rules controlling which products get visible fills and at what opacity.\r\n * Products matching a fill rule are rendered below non-matching products.\r\n * When absent or empty, all products render uniformly (no fill-based reordering).\r\n */\r\n fills?: SectionFillRule[];\r\n includeMeta?: boolean;\r\n /** Enable labels. Requires buildLabels callback. */\r\n includeLabels?: boolean;\r\n /** Callback to build labels for matching products. Required when includeLabels is true. */\r\n buildLabels?: (products: any[], fontSize: number) => SectionLabel[];\r\n /** Clip polygon in world coordinates (x, z). Used when fill.matchClipFilter is true for spatial filtering. */\r\n clipPolygon?: Array<Array<{ x: number; z: number }>>;\r\n /** When true, create fill paths for closed polygons. When false, create only stroke/outline paths. Defaults to true for backward compatibility. */\r\n createFills?: boolean;\r\n /** Plane normal vector for determining 2D projection axes. If omitted, defaults to horizontal plan (Y-up). */\r\n planeNormal?: Vec3;\r\n}\r\n\r\n/** Convert plane section polylines to SVG path data with fill colors and stroke styles. */\r\nexport function createSectionSvg(\r\n perProduct: PlaneSectionEntry[],\r\n viewport?: ViewWindow,\r\n strokeWidthHint?: number,\r\n labels?: SectionLabel[],\r\n options?: SectionBuildOptions\r\n): SectionRenderState | null {\r\n if (!perProduct.length) {\r\n return null;\r\n }\r\n\r\n const polylines = perProduct.flatMap((entry) => entry.polylines);\r\n const hasSegments = perProduct.some((entry) => entry.segments && entry.segments.length > 0);\r\n\r\n if (!polylines.length && !hasSegments) {\r\n return null;\r\n }\r\n\r\n const planeNormal = options?.planeNormal;\r\n const axes = getProjectionAxes(planeNormal);\r\n\r\n let viewMinX: number;\r\n let viewMaxX: number;\r\n let viewMinZ: number;\r\n let viewMaxZ: number;\r\n\r\n if (viewport) {\r\n viewMinX = viewport.viewMinX;\r\n viewMaxX = viewport.viewMaxX;\r\n viewMinZ = viewport.viewMinZ;\r\n viewMaxZ = viewport.viewMaxZ;\r\n } else {\r\n let minU = Number.POSITIVE_INFINITY;\r\n let maxU = Number.NEGATIVE_INFINITY;\r\n let minV = Number.POSITIVE_INFINITY;\r\n let maxV = Number.NEGATIVE_INFINITY;\r\n\r\n polylines.forEach((polyline: { points: Vec3[]; closed: boolean }) => {\r\n polyline.points.forEach((point: Vec3) => {\r\n if (!point) {\r\n return;\r\n }\r\n const u = axes.getU(point);\r\n const v = axes.getV(point);\r\n if (!Number.isFinite(u) || !Number.isFinite(v)) {\r\n return;\r\n }\r\n if (u < minU) minU = u;\r\n if (u > maxU) maxU = u;\r\n if (v < minV) minV = v;\r\n if (v > maxV) maxV = v;\r\n });\r\n });\r\n\r\n // Also include segments in bounding box calculation\r\n perProduct.forEach((entry) => {\r\n if (entry.segments && entry.segments.length) {\r\n entry.segments.forEach((segment) => {\r\n const [p1, p2] = segment;\r\n const u1 = axes.getU(p1);\r\n const v1 = axes.getV(p1);\r\n const u2 = axes.getU(p2);\r\n const v2 = axes.getV(p2);\r\n if (Number.isFinite(u1) && Number.isFinite(v1)) {\r\n if (u1 < minU) minU = u1;\r\n if (u1 > maxU) maxU = u1;\r\n if (v1 < minV) minV = v1;\r\n if (v1 > maxV) maxV = v1;\r\n }\r\n if (Number.isFinite(u2) && Number.isFinite(v2)) {\r\n if (u2 < minU) minU = u2;\r\n if (u2 > maxU) maxU = u2;\r\n if (v2 < minV) minV = v2;\r\n if (v2 > maxV) maxV = v2;\r\n }\r\n });\r\n }\r\n });\r\n\r\n if (!Number.isFinite(minU) || !Number.isFinite(maxU) || !Number.isFinite(minV) || !Number.isFinite(maxV)) {\r\n return null;\r\n }\r\n\r\n if (maxU - minU < 1e-3) {\r\n minU -= 0.5;\r\n maxU += 0.5;\r\n }\r\n if (maxV - minV < 1e-3) {\r\n minV -= 0.5;\r\n maxV += 0.5;\r\n }\r\n\r\n const worldWidth = maxU - minU;\r\n const worldHeight = maxV - minV;\r\n const marginU = Math.max(worldWidth * SECTION_MARGIN_RATIO, 0.5);\r\n const marginV = Math.max(worldHeight * SECTION_MARGIN_RATIO, 0.5);\r\n\r\n viewMinX = minU - marginU;\r\n viewMaxX = maxU + marginU;\r\n viewMinZ = minV - marginV;\r\n viewMaxZ = maxV + marginV;\r\n }\r\n\r\n const viewWidth = viewMaxX - viewMinX;\r\n const viewHeight = viewMaxZ - viewMinZ;\r\n\r\n if (!Number.isFinite(viewWidth) || !Number.isFinite(viewHeight) || viewWidth <= 1e-6 || viewHeight <= 1e-6) {\r\n return null;\r\n }\r\n\r\n const autoStrokeBase = Math.max(Math.min(viewWidth, viewHeight) * 0.008, 0.08);\r\n const autoStroke = Math.max(autoStrokeBase * OUTLINE_THICKNESS_SCALE, 0.02);\r\n const strokeWidth = Math.max(strokeWidthHint ?? autoStroke, 0.02);\r\n const geometryTransform = buildGeometryTransform(viewMinX, viewMaxX, viewMinZ, viewMaxZ);\r\n\r\n const includeMeta = !!options?.includeMeta;\r\n const createFills = options?.createFills !== false; // Default to true for backward compatibility\r\n\r\n const allPaths: SectionPath[] = [];\r\n if (includeMeta) {\r\n perProduct.forEach((entry, idx) => {\r\n // Skip entries with neither polylines nor segments\r\n if (!entry.polylines.length && (!entry.segments || !entry.segments.length)) {\r\n return;\r\n }\r\n const colorInfo = sampleProductColorRgba(entry.product);\r\n const fillColor = colorInfo ? `rgb(${colorInfo.r},${colorInfo.g},${colorInfo.b})` : '#ffffff';\r\n const fillOpacity = colorInfo ? clampValue(colorInfo.a, 0, 1) : 1;\r\n const meta = extractProductMeta(entry.product);\r\n\r\n const closedSubpaths: string[] = [];\r\n const holeSubpaths: string[] = [];\r\n const openSubpaths: string[] = [];\r\n\r\n entry.polylines.forEach((polyline) => {\r\n const pathData = getCachedPolylinePath(polyline, planeNormal);\r\n if (!pathData) {\r\n return;\r\n }\r\n if (pathData.closed) {\r\n if (pathData.hole) {\r\n holeSubpaths.push(pathData.d);\r\n } else {\r\n closedSubpaths.push(pathData.d);\r\n }\r\n } else {\r\n openSubpaths.push(pathData.d);\r\n }\r\n });\r\n\r\n // Only create fill paths if createFills is true\r\n if (createFills && (closedSubpaths.length || holeSubpaths.length)) {\r\n const fillSubpaths = closedSubpaths.length ? closedSubpaths.concat(holeSubpaths) : holeSubpaths;\r\n allPaths.push({\r\n key: `fill-${idx}`,\r\n d: fillSubpaths.join(' '),\r\n fill: fillColor,\r\n fillOpacity: clampValue(fillOpacity, 0, 1),\r\n stroke: '#1f2937',\r\n strokeWidth,\r\n fillRule: 'evenodd',\r\n meta: meta ? { ...meta, isFill: true } : undefined\r\n });\r\n }\r\n\r\n if (openSubpaths.length) {\r\n allPaths.push({\r\n key: `outline-${idx}`,\r\n d: openSubpaths.join(' '),\r\n fill: 'none',\r\n fillOpacity: 1,\r\n stroke: '#1f2937',\r\n strokeWidth,\r\n meta: meta ? { ...meta, isOutline: true } : undefined\r\n });\r\n }\r\n\r\n // Render segments (cut edges) as strokes\r\n if (entry.segments && entry.segments.length) {\r\n const segmentPaths: string[] = [];\r\n for (const segment of entry.segments) {\r\n const path = segmentToPath(segment, planeNormal);\r\n if (path) segmentPaths.push(path);\r\n }\r\n if (segmentPaths.length) {\r\n allPaths.push({\r\n key: `segments-${idx}`,\r\n d: segmentPaths.join(' '),\r\n fill: 'none',\r\n fillOpacity: 1,\r\n stroke: '#1f2937',\r\n strokeWidth,\r\n meta: meta ? { ...meta, isSegment: true } : undefined\r\n });\r\n }\r\n }\r\n });\r\n } else {\r\n const fillGroups = new Map<string, FillGroup>();\r\n const openSubpaths: string[] = [];\r\n const allSegmentPaths: string[] = [];\r\n\r\n perProduct.forEach((entry) => {\r\n // Process segments first (always render, even without polylines)\r\n if (entry.segments && entry.segments.length) {\r\n for (const segment of entry.segments) {\r\n const path = segmentToPath(segment, planeNormal);\r\n if (path) allSegmentPaths.push(path);\r\n }\r\n }\r\n\r\n if (!entry.polylines.length) {\r\n return;\r\n }\r\n\r\n const colorInfo = sampleProductColorRgba(entry.product);\r\n const fillColor = colorInfo ? `rgb(${colorInfo.r},${colorInfo.g},${colorInfo.b})` : '#ffffff';\r\n const fillOpacity = colorInfo ? clampValue(colorInfo.a, 0, 1) : 1;\r\n const groupKey = `${fillColor}|${Math.round(fillOpacity * 1000)}`;\r\n let group = fillGroups.get(groupKey);\r\n if (!group) {\r\n group = {\r\n color: fillColor,\r\n opacity: fillOpacity,\r\n closed: [],\r\n holes: []\r\n };\r\n fillGroups.set(groupKey, group);\r\n }\r\n\r\n entry.polylines.forEach((polyline) => {\r\n const pathData = getCachedPolylinePath(polyline, planeNormal);\r\n if (!pathData) {\r\n return;\r\n }\r\n if (pathData.closed) {\r\n if (pathData.hole) {\r\n group!.holes.push(pathData.d);\r\n } else {\r\n group!.closed.push(pathData.d);\r\n }\r\n return;\r\n }\r\n openSubpaths.push(pathData.d);\r\n });\r\n });\r\n\r\n let groupIndex = 0;\r\n fillGroups.forEach((group) => {\r\n const fillSubpaths = group.closed.length ? group.closed.concat(group.holes) : group.holes;\r\n if (!fillSubpaths.length) {\r\n return;\r\n }\r\n allPaths.push({\r\n key: `fill-${groupIndex++}`,\r\n d: fillSubpaths.join(' '),\r\n fill: group.color,\r\n fillOpacity: clampValue(group.opacity, 0, 1),\r\n stroke: '#1f2937',\r\n strokeWidth,\r\n fillRule: 'evenodd'\r\n });\r\n });\r\n\r\n if (openSubpaths.length) {\r\n allPaths.push({\r\n key: 'outlines',\r\n d: openSubpaths.join(' '),\r\n fill: 'none',\r\n fillOpacity: 1,\r\n stroke: '#1f2937',\r\n strokeWidth\r\n });\r\n }\r\n\r\n // Render all segments (collected above in forEach loop)\r\n if (allSegmentPaths.length) {\r\n allPaths.push({\r\n key: 'segments',\r\n d: allSegmentPaths.join(' '),\r\n fill: 'none',\r\n fillOpacity: 1,\r\n stroke: '#1f2937',\r\n strokeWidth\r\n });\r\n }\r\n }\r\n\r\n if (!allPaths.length) {\r\n return null;\r\n }\r\n\r\n const displayWidth = BASE_WIDTH;\r\n const displayHeight = Math.max(MIN_HEIGHT, (viewHeight / viewWidth) * BASE_WIDTH);\r\n\r\n return {\r\n paths: allPaths,\r\n transform: {\r\n viewMinX,\r\n viewMaxX,\r\n viewMinZ,\r\n viewMaxZ,\r\n viewWidth,\r\n viewHeight,\r\n displayWidth,\r\n displayHeight\r\n },\r\n strokeWidth,\r\n geometryTransform,\r\n labels: labels?.length\r\n ? labels\r\n .filter((label) => {\r\n if (!Number.isFinite(label.x) || !Number.isFinite(label.z)) {\r\n return false;\r\n }\r\n return label.x >= viewMinX && label.x <= viewMaxX && label.z >= viewMinZ && label.z <= viewMaxZ;\r\n })\r\n .map((label) => ({\r\n key: label.key,\r\n text: label.text,\r\n x: label.x,\r\n y: label.y,\r\n z: label.z,\r\n fontSize: label.fontSize,\r\n meta: includeMeta ? (label.meta ?? {}) : undefined\r\n }))\r\n : []\r\n };\r\n}\r\n\r\n/**\r\n * Build a complete SectionRenderState from plane section entries, with optional\r\n * fill-rule-based separation, ordering, and label generation.\r\n *\r\n * When `fills` rules are provided, entries matching a fill rule are rendered\r\n * below non-matching entries, with their fill opacity set by the matching rule.\r\n */\r\nexport function buildSectionStateForEntries(\r\n perProduct: PlaneSectionEntry[],\r\n options: BuildSectionStateOptions\r\n): (SectionRenderState & { rawPaths?: SectionPath[]; rawLabels?: SectionLabel[] }) | null {\r\n if (!perProduct.length) {\r\n return null;\r\n }\r\n\r\n const fills = options.fills;\r\n const includeMeta = !!options?.includeMeta;\r\n const includeLabels = options?.includeLabels ?? false;\r\n const viewport = options?.viewport;\r\n const strokeWidth = options?.strokeWidth;\r\n const labelFontSize = includeLabels && typeof options?.labelFontSize === 'number' ? options.labelFontSize : null;\r\n const buildLabels = options?.buildLabels;\r\n\r\n // Point-in-polygon test (ray casting algorithm)\r\n const pointInPolygon = (polygon: Array<{ x: number; z: number }>, x: number, z: number): boolean => {\r\n let inside = false;\r\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\r\n const xi = polygon[i].x;\r\n const zi = polygon[i].z;\r\n const xj = polygon[j].x;\r\n const zj = polygon[j].z;\r\n const intersect = zi > z !== zj > z && x < ((xj - xi) * (z - zi)) / (zj - zi) + xi;\r\n if (intersect) inside = !inside;\r\n }\r\n return inside;\r\n };\r\n\r\n // Calculate centroid from entry's polylines\r\n const getCentroid = (entry: PlaneSectionEntry): { x: number; z: number } | null => {\r\n const polylines = entry.polylines;\r\n if (!polylines.length) return null;\r\n let sumX = 0;\r\n let sumZ = 0;\r\n let count = 0;\r\n for (const polyline of polylines) {\r\n for (const point of polyline.points) {\r\n sumX += point[0];\r\n sumZ += point[2];\r\n count++;\r\n }\r\n }\r\n if (count === 0) return null;\r\n return { x: sumX / count, z: sumZ / count };\r\n };\r\n\r\n // Spatial matcher for clip filter - checks if product centroid is inside clip polygon\r\n const isInsideClipPolygon = (entry: PlaneSectionEntry): boolean => {\r\n if (!options?.clipPolygon?.length) return true;\r\n const centroid = getCentroid(entry);\r\n if (!centroid) return false;\r\n // Check if centroid is inside any of the clip polygons\r\n return options.clipPolygon.some((polygon) => pointInPolygon(polygon, centroid.x, centroid.z));\r\n };\r\n\r\n // Match an entry against fill rules. Returns the first matching rule, or undefined.\r\n const matchFillRule = (entry: PlaneSectionEntry): SectionFillRule | undefined => {\r\n if (!fills?.length) return undefined;\r\n const product = entry.product;\r\n for (const rule of fills) {\r\n // If rule requires clip filter match, check if product centroid is inside clip polygon\r\n if (rule.matchClipFilter && !isInsideClipPolygon(entry)) {\r\n continue;\r\n }\r\n\r\n // Check class match\r\n let classMatches: boolean;\r\n if (rule.class) {\r\n const classes = Array.isArray(rule.class) ? rule.class : [rule.class];\r\n const cls = product.class;\r\n classMatches = classes.some((c) => {\r\n if (cls?.is) return cls.is(c as string);\r\n const pName = (product.className ?? '').toLowerCase();\r\n return pName === (c as string).toLowerCase() || pName === `ifc${(c as string).toLowerCase()}`;\r\n });\r\n if (!classMatches) continue;\r\n }\r\n\r\n // Check where condition (property-based filter)\r\n if (rule.where && Object.keys(rule.where).length > 0) {\r\n let whereMatches = true;\r\n for (const [path, expected] of Object.entries(rule.where)) {\r\n const actualValue = resolveProductProperty(product, path);\r\n if (actualValue === undefined) {\r\n whereMatches = false;\r\n break;\r\n }\r\n\r\n const normalize = (v: unknown): unknown => (typeof v === 'string' ? v.toLowerCase().trim() : v);\r\n\r\n if (Array.isArray(expected)) {\r\n if (!expected.some((exp) => normalize(exp) === normalize(actualValue))) {\r\n whereMatches = false;\r\n break;\r\n }\r\n } else {\r\n if (normalize(actualValue) !== normalize(expected)) {\r\n whereMatches = false;\r\n break;\r\n }\r\n }\r\n }\r\n if (!whereMatches) continue;\r\n }\r\n\r\n return rule;\r\n }\r\n return undefined;\r\n };\r\n\r\n const hasFills = !!fills?.length;\r\n\r\n // Split entries by fill rule match\r\n const fillEntries: PlaneSectionEntry[] = [];\r\n const fillOpacities: number[] = []; // parallel to fillEntries\r\n const nonFillEntries: PlaneSectionEntry[] = [];\r\n\r\n for (const entry of perProduct) {\r\n const rule = hasFills ? matchFillRule(entry) : undefined;\r\n if (rule) {\r\n const opacity = rule.fillOpacity ?? DEFAULT_FILL_OPACITY;\r\n // Skip entries with zero opacity - don't render them at all\r\n if (opacity > 0) {\r\n fillEntries.push(entry);\r\n fillOpacities.push(opacity);\r\n }\r\n } else {\r\n nonFillEntries.push(entry);\r\n }\r\n }\r\n\r\n // Build labels from fill-matched entries (e.g. spaces)\r\n const fillLabels =\r\n includeLabels && fillEntries.length && labelFontSize !== null && buildLabels\r\n ? (buildLabels(\r\n fillEntries.map((entry) => entry.product),\r\n labelFontSize\r\n ) as SectionLabel[])\r\n : undefined;\r\n\r\n // When fill rules are present, render fill and non-fill groups separately\r\n // so we can adjust opacity and control ordering.\r\n // When no fill rules, render everything in one pass (unchanged behavior).\r\n if (hasFills && (fillEntries.length > 0 || nonFillEntries.length > 0)) {\r\n const nonFillState =\r\n nonFillEntries.length > 0\r\n ? createSectionSvg(nonFillEntries, viewport, strokeWidth, undefined, {\r\n includeMeta,\r\n planeNormal: options.planeNormal\r\n })\r\n : null;\r\n const fillState =\r\n fillEntries.length > 0\r\n ? createSectionSvg(fillEntries, viewport, strokeWidth, includeLabels ? fillLabels : undefined, {\r\n includeMeta,\r\n planeNormal: options.planeNormal\r\n })\r\n : null;\r\n\r\n const baseState = nonFillState ?? fillState ?? null;\r\n if (!baseState) return null;\r\n\r\n // Adjust fill opacity per-entry. When includeMeta is true, each entry has\r\n // its own path, so we can apply per-entry opacity. When false, paths are\r\n // grouped by color — apply the minimum matching opacity.\r\n const adjustedFillPaths =\r\n fillState?.paths.map((path, idx) => {\r\n // When fill rules match, use the rule opacity directly (don't multiply by material alpha).\r\n // Material alpha was useful for auto-coloring, but fill rules should have full control.\r\n const ruleOpacity = idx < fillOpacities.length ? fillOpacities[idx] : (fills![0]?.fillOpacity ?? 0.35);\r\n const finalOpacity = clampValue(ruleOpacity, 0, 1);\r\n return {\r\n ...path,\r\n fillOpacity: finalOpacity\r\n };\r\n }) ?? [];\r\n\r\n const nonFillPaths = nonFillState?.paths ?? [];\r\n // Fill-matched entries always render below non-fill entries\r\n const mergedPaths = [...adjustedFillPaths, ...nonFillPaths];\r\n\r\n const merged: SectionRenderState & { rawPaths?: SectionPath[]; rawLabels?: SectionLabel[] } = {\r\n ...baseState,\r\n paths: mergedPaths,\r\n labels: includeLabels ? (fillState?.labels ?? fillLabels ?? []) : []\r\n };\r\n\r\n return merged;\r\n }\r\n\r\n // No fill rules — create paths with fills for highlight support, but set opacity to 0\r\n const state = createSectionSvg(perProduct, viewport, strokeWidth, includeLabels ? fillLabels : undefined, {\r\n includeMeta,\r\n createFills: true,\r\n planeNormal: options.planeNormal\r\n });\r\n if (!state) return null;\r\n\r\n // Set all fill opacities to 0 when no fill rules exist (but keep paths for highlight support)\r\n const pathsWithZeroFillOpacity = state.paths.map((path) => ({\r\n ...path,\r\n fillOpacity: 0\r\n }));\r\n\r\n return {\r\n ...state,\r\n paths: pathsWithZeroFillOpacity,\r\n labels: includeLabels ? (state.labels ?? []) : []\r\n };\r\n}\r\n\r\n/** Extract the viewport bounding box from a TransformInfo. */\r\nexport function extractViewWindow(transform: TransformInfo): ViewWindow {\r\n return {\r\n viewMinX: transform.viewMinX,\r\n viewMaxX: transform.viewMaxX,\r\n viewMinZ: transform.viewMinZ,\r\n viewMaxZ: transform.viewMaxZ\r\n };\r\n}\r\n\r\n/** Compare two viewport windows for equality within a tolerance. */\r\nexport function windowsEqual(a: ViewWindow, b: ViewWindow, epsilon = 1e-4): boolean {\r\n return (\r\n Math.abs(a.viewMinX - b.viewMinX) <= epsilon &&\r\n Math.abs(a.viewMaxX - b.viewMaxX) <= epsilon &&\r\n Math.abs(a.viewMinZ - b.viewMinZ) <= epsilon &&\r\n Math.abs(a.viewMaxZ - b.viewMaxZ) <= epsilon\r\n );\r\n}\r\n\r\n/** Constrain a viewport window within base bounds, preserving aspect ratio. */\r\nexport function clampViewWindow(base: TransformInfo, candidate: ViewWindow): ViewWindow {\r\n const baseWidth = base.viewWidth;\r\n const baseHeight = base.viewHeight;\r\n const aspect = baseWidth / baseHeight;\r\n\r\n let width = candidate.viewMaxX - candidate.viewMinX;\r\n\r\n if (!Number.isFinite(width) || width <= 1e-6) {\r\n width = baseWidth;\r\n }\r\n width = clampValue(width, baseWidth / MAX_ZOOM_FACTOR, baseWidth);\r\n const height = width / aspect;\r\n\r\n let centerX = (candidate.viewMinX + candidate.viewMaxX) * 0.5;\r\n if (!Number.isFinite(centerX)) {\r\n centerX = (base.viewMinX + base.viewMaxX) * 0.5;\r\n }\r\n\r\n let centerZ = (candidate.viewMinZ + candidate.viewMaxZ) * 0.5;\r\n if (!Number.isFinite(centerZ)) {\r\n centerZ = (base.viewMinZ + base.viewMaxZ) * 0.5;\r\n }\r\n\r\n let minX = centerX - width * 0.5;\r\n let maxX = minX + width;\r\n if (minX < base.viewMinX) {\r\n minX = base.viewMinX;\r\n maxX = minX + width;\r\n }\r\n if (maxX > base.viewMaxX) {\r\n maxX = base.viewMaxX;\r\n minX = maxX - width;\r\n }\r\n\r\n let minZ = centerZ - height * 0.5;\r\n let maxZ = minZ + height;\r\n if (minZ < base.viewMinZ) {\r\n minZ = base.viewMinZ;\r\n maxZ = minZ + height;\r\n }\r\n if (maxZ > base.viewMaxZ) {\r\n maxZ = base.viewMaxZ;\r\n minZ = maxZ - height;\r\n }\r\n\r\n return {\r\n viewMinX: minX,\r\n viewMaxX: maxX,\r\n viewMinZ: minZ,\r\n viewMaxZ: maxZ\r\n };\r\n}\r\n\r\n/** Adjust stroke width proportionally to zoom level. */\r\nexport function strokeWidthForWindow(baseStroke: number, baseTransform: TransformInfo, window: ViewWindow): number {\r\n const baseWidth = baseTransform.viewWidth;\r\n const currentWidth = window.viewMaxX - window.viewMinX;\r\n if (!Number.isFinite(baseWidth) || baseWidth <= 1e-6 || !Number.isFinite(currentWidth) || currentWidth <= 1e-6) {\r\n return baseStroke;\r\n }\r\n const ratio = clampValue(currentWidth / baseWidth, 1 / MAX_ZOOM_FACTOR, 1);\r\n const scaled = baseStroke * ratio;\r\n return Math.max(scaled, baseStroke / (MAX_ZOOM_FACTOR + 1));\r\n}\r\n\r\ninterface SvgPathData {\r\n d: string;\r\n closed: boolean;\r\n hole: boolean;\r\n}\r\n\r\ninterface FillGroup {\r\n color: string;\r\n opacity: number;\r\n closed: string[];\r\n holes: string[];\r\n}\r\n\r\ninterface CachedPolylinePath {\r\n pointsRef: Vec3[];\r\n signature: number;\r\n data: SvgPathData;\r\n}\r\n\r\nconst polylinePathCache = new WeakMap<{ points: Vec3[]; closed: boolean }, CachedPolylinePath>();\r\n\r\n/**\r\n * Determine which axes to use for 2D projection based on plane normal.\r\n * Returns accessor functions for horizontal and vertical SVG coordinates.\r\n */\r\nfunction getProjectionAxes(planeNormal?: Vec3): {\r\n getU: (p: Vec3) => number;\r\n getV: (p: Vec3) => number;\r\n axisNames: string;\r\n} {\r\n if (!planeNormal) {\r\n // Default: horizontal plan (looking down Y axis) -> X,Z\r\n return {\r\n getU: (p) => p[0],\r\n getV: (p) => p[2],\r\n axisNames: 'XZ'\r\n };\r\n }\r\n\r\n // Normalize and find dominant axis\r\n const absX = Math.abs(planeNormal[0]);\r\n const absY = Math.abs(planeNormal[1]);\r\n const absZ = Math.abs(planeNormal[2]);\r\n\r\n if (absY > absX && absY > absZ) {\r\n // Horizontal plan (normal ~ Y axis) -> looking down Y, use X,Z\r\n return {\r\n getU: (p) => p[0],\r\n getV: (p) => p[2],\r\n axisNames: 'XZ'\r\n };\r\n } else if (absZ > absX) {\r\n // Vertical section perpendicular to Z -> looking along Z, use X,Y\r\n return {\r\n getU: (p) => p[0],\r\n getV: (p) => p[1],\r\n axisNames: 'XY'\r\n };\r\n } else {\r\n // Vertical section perpendicular to X -> looking along X, use Z,Y\r\n return {\r\n getU: (p) => p[2],\r\n getV: (p) => p[1],\r\n axisNames: 'ZY'\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Convert a segment (pair of points) to an SVG path string.\r\n */\r\nfunction segmentToPath(segment: [Vec3, Vec3], planeNormal?: Vec3): string {\r\n const [p1, p2] = segment;\r\n const axes = getProjectionAxes(planeNormal);\r\n const u1 = axes.getU(p1);\r\n const v1 = axes.getV(p1);\r\n const u2 = axes.getU(p2);\r\n const v2 = axes.getV(p2);\r\n\r\n if (!Number.isFinite(u1) || !Number.isFinite(v1) || !Number.isFinite(u2) || !Number.isFinite(v2)) {\r\n return '';\r\n }\r\n return `M${formatNumber(u1)} ${formatNumber(v1)} L${formatNumber(u2)} ${formatNumber(v2)}`;\r\n}\r\n\r\nfunction getCachedPolylinePath(polyline: { points: Vec3[]; closed: boolean }, planeNormal?: Vec3): SvgPathData | null {\r\n if (!polyline.points.length) {\r\n return null;\r\n }\r\n\r\n const signature = computePointsSignature(polyline.points, polyline.closed, planeNormal);\r\n const cached = polylinePathCache.get(polyline);\r\n if (cached && cached.pointsRef === polyline.points && cached.signature === signature) {\r\n return cached.data;\r\n }\r\n\r\n const axes = getProjectionAxes(planeNormal);\r\n const commands: string[] = [];\r\n polyline.points.forEach((point: Vec3, index: number) => {\r\n const prefix = index === 0 ? 'M' : 'L';\r\n const u = axes.getU(point);\r\n const v = axes.getV(point);\r\n commands.push(`${prefix}${formatNumber(u)} ${formatNumber(v)}`);\r\n });\r\n\r\n if (commands.length < 2) {\r\n return null;\r\n }\r\n\r\n let closed = false;\r\n let hole = false;\r\n\r\n if (polyline.closed && commands.length > 2) {\r\n const area = signedArea(polyline.points, axes);\r\n hole = area < 0;\r\n closed = true;\r\n commands.push('Z');\r\n }\r\n\r\n const data: SvgPathData = { d: commands.join(' '), closed, hole };\r\n polylinePathCache.set(polyline, { pointsRef: polyline.points, signature, data });\r\n return data;\r\n}\r\n\r\nfunction signedArea(points: Vec3[], axes: { getU: (p: Vec3) => number; getV: (p: Vec3) => number }): number {\r\n if (points.length < 3) {\r\n return 0;\r\n }\r\n\r\n let area = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n const current = points[i];\r\n const next = points[(i + 1) % points.length];\r\n const u1 = axes.getU(current);\r\n const v1 = axes.getV(current);\r\n const u2 = axes.getU(next);\r\n const v2 = axes.getV(next);\r\n area += u1 * v2 - u2 * v1;\r\n }\r\n return area * 0.5;\r\n}\r\n\r\nfunction formatNumber(value: number): string {\r\n if (!Number.isFinite(value)) {\r\n return '0';\r\n }\r\n const formatted = value.toFixed(3);\r\n return formatted.replace(/\\.?0+$/, '');\r\n}\r\n\r\nfunction buildGeometryTransform(viewMinX: number, viewMaxX: number, viewMinZ: number, viewMaxZ: number): string {\r\n const translateX = formatNumber(-viewMinX);\r\n const translateY = formatNumber(viewMaxZ);\r\n return `matrix(1 0 0 -1 ${translateX} ${translateY})`;\r\n}\r\n\r\nfunction computePointsSignature(points: readonly Vec3[], closed: boolean, planeNormal?: Vec3): number {\r\n const axes = getProjectionAxes(planeNormal);\r\n // FNV-1a-inspired hash — compact fixed-size key instead of concatenating all coordinates\r\n let hash = 2166136261 ^ (points.length * 16777619) ^ (closed ? 1 : 0);\r\n for (let i = 0; i < points.length; i++) {\r\n const point = points[i];\r\n if (!point) continue;\r\n const u = axes.getU(point);\r\n const v = axes.getV(point);\r\n // Mix in coordinate bits (multiply by large prime, XOR)\r\n hash = Math.imul(hash ^ ((u * 1e4) | 0), 16777619);\r\n hash = Math.imul(hash ^ ((v * 1e4) | 0), 16777619);\r\n }\r\n return hash;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"sections.js","sourceRoot":"/","sources":["sections.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n Vec3,\n SectionLabel,\n SectionPath,\n SectionRenderState,\n TransformInfo,\n ViewWindow\n} from '@twinfinity/geometry';\n\nexport type { SectionLabel, SectionPath, SectionRenderState, TransformInfo, ViewWindow } from '@twinfinity/geometry';\n\n/** Minimal product interface for section fill matching. */\ninterface SectionProduct {\n class?: { is(c: unknown): boolean; type?: string; id?: string };\n className?: string;\n propertySets?: Record<string, unknown>;\n properties?: { data?: Record<string, unknown>; sets?: Record<string, unknown> };\n}\n\n/** Local replacement for PlaneSectionEntry (not available in @twinfinity/geometry). */\ntype PlaneSectionEntry<TProduct extends SectionProduct = SectionProduct> = {\n product: TProduct;\n segments: [Vec3, Vec3][];\n polylines: { points: Vec3[]; closed: boolean }[];\n};\n\n/**\n * Resolve a dotted property path (e.g. \"BIP.spacetype\") against a product.\n * Handles both the new T8 API (propertySets → .properties → .value) and\n * legacy BimIfcObject (properties.sets / properties.data).\n *\n * Returns the resolved value, or undefined if not found.\n */\nexport function resolveProductProperty(product: SectionProduct | unknown, path: string): unknown {\n const p = product as SectionProduct;\n const parts = path.split('.');\n if (parts.length < 2) return undefined;\n\n const [setName, ...propParts] = parts;\n const propName = propParts.join('.');\n\n // New T8 API: propertySets['BIP'].properties['spacetype'].value\n const pset = (p?.propertySets as Record<string, any>)?.[setName];\n if (pset) {\n const prop = pset.properties?.[propName];\n if (prop !== undefined) {\n return prop?.value !== undefined ? prop.value : prop;\n }\n }\n\n // Legacy: properties.sets['BIP']['spacetype']\n const legacyPset = (p?.properties?.sets as Record<string, any>)?.[setName];\n if (legacyPset) {\n const val = legacyPset[propName];\n if (val !== undefined) {\n return val?.value !== undefined ? val.value : val;\n }\n }\n\n // Fallback: properties.data['BIP']['spacetype'] (old printing code path)\n let value: any = p?.properties?.data;\n if (value) {\n for (const part of parts) {\n value = value?.[part];\n if (value === undefined) break;\n }\n if (value !== undefined) {\n return value?.value !== undefined ? value.value : value;\n }\n }\n\n return undefined;\n}\n\n/**\n * Sample the actual rendered color of a product's first mesh.\n * Uses BimProductMesh.copyColorTo/getColorComponent for accurate colors\n * (includes overrides, highlights). Falls back to style.surfaceColor/color.\n */\nconst sampleProductColorRgba = (product: unknown): { r: number; g: number; b: number; a: number } | 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 || !meshes.length) return undefined;\n\n const rgba = new Uint8Array(4);\n\n for (const mesh of meshes) {\n try {\n // BimProductMesh: read actual rendered color via copyColorTo or getColorComponent\n if (typeof mesh.copyColorTo === 'function') {\n mesh.copyColorTo(rgba, 0);\n } else if (typeof mesh.getColorComponent === 'function') {\n rgba[0] = mesh.getColorComponent(0); // Red\n rgba[1] = mesh.getColorComponent(1); // Green\n rgba[2] = mesh.getColorComponent(2); // Blue\n rgba[3] = mesh.getColorComponent(3); // Alpha\n } else {\n // ModelMesh fallback: read from style\n const style = mesh.style;\n const c = style?.surfaceColor ?? style?.color;\n if (c) return { r: c[0], g: c[1], b: c[2], a: (c[3] ?? 255) / 255 };\n continue;\n }\n } catch {\n continue;\n }\n\n const [r, g, b, a] = rgba;\n if (a === 0 && r === 0 && g === 0 && b === 0) continue;\n return { r, g, b, a: a / 255 };\n }\n\n return undefined;\n};\n\n/** Base SVG display width in layout units. */\nexport const BASE_WIDTH = 240;\n/** Minimum SVG display height in layout units. */\nexport const MIN_HEIGHT = 140;\n/** Margin ratio applied around section bounds (fraction of world extent). */\nexport const SECTION_MARGIN_RATIO = 0.05;\n/** Maximum zoom factor for viewport clamping. */\nexport const MAX_ZOOM_FACTOR = 12;\n/** Multiplicative step for zooming in. */\nexport const ZOOM_IN_STEP = 0.8;\n/** Multiplicative step for zooming out. */\nexport const ZOOM_OUT_STEP = 1 / ZOOM_IN_STEP;\nconst OUTLINE_THICKNESS_SCALE = 0.5;\n\n/** Clamp a number to a min/max range. */\nexport function clampValue(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport interface SectionBuildOptions {\n /** If true, attach source product metadata to paths/labels for downstream filtering */\n includeMeta?: boolean;\n /** When true, create fill paths for closed polygons. When false, create only stroke/outline paths. Defaults to true for backward compatibility. */\n createFills?: boolean;\n /** Plane normal vector for determining 2D projection axes. If omitted, defaults to horizontal plan (Y-up). */\n planeNormal?: Vec3;\n}\n\n/**\n * Extract product metadata for path/label attribution.\n * Casts to `any` once here to avoid scattering `as any` across the codebase.\n * BimIfcObject's runtime shape exposes these fields but the public typings\n * don't always surface them.\n */\nfunction extractProductMeta(product: unknown): {\n productId: string;\n ifcClass: string | null;\n ifcClassId: string | null;\n properties: unknown;\n} {\n const p = product as Record<string, any>;\n return {\n productId: p?.gid ?? p?.id ?? String(product),\n ifcClass: p?.class?.type ?? null,\n ifcClassId: p?.class?.id ?? null,\n properties: p?.properties?.data ?? p?.properties ?? null\n };\n}\n\n/** Default fill opacity when a fill rule omits `fillOpacity`. */\nexport const DEFAULT_FILL_OPACITY = 0.35;\n\n/**\n * Fill rule controlling which products get visible fills and at what opacity.\n * Mirrors the template-level FillRule but kept minimal to avoid circular deps.\n */\nexport interface SectionFillRule {\n /** IFC class filter. When omitted, matches all products. */\n class?: string | string[];\n /** Property-based filter (e.g. { \"BIP.spacetype\": \"ROOM\" }). */\n where?: Record<string, string | number | boolean | Array<string | number>>;\n /** Fill opacity (0–1). Default: {@link DEFAULT_FILL_OPACITY}. */\n fillOpacity?: number;\n /** When true, only apply fill to products whose centroid is inside the clip polygon. @default false */\n matchClipFilter?: boolean;\n}\n\nexport interface BuildSectionStateOptions {\n viewport?: ViewWindow;\n strokeWidth?: number;\n labelFontSize?: number;\n /**\n * Fill rules controlling which products get visible fills and at what opacity.\n * Products matching a fill rule are rendered below non-matching products.\n * When absent or empty, all products render uniformly (no fill-based reordering).\n */\n fills?: SectionFillRule[];\n includeMeta?: boolean;\n /** Enable labels. Requires buildLabels callback. */\n includeLabels?: boolean;\n /** Callback to build labels for matching products. Required when includeLabels is true. */\n buildLabels?: (products: any[], fontSize: number) => SectionLabel[];\n /** Clip polygon in world coordinates (x, z). Used when fill.matchClipFilter is true for spatial filtering. */\n clipPolygon?: Array<Array<{ x: number; z: number }>>;\n /** When true, create fill paths for closed polygons. When false, create only stroke/outline paths. Defaults to true for backward compatibility. */\n createFills?: boolean;\n /** Plane normal vector for determining 2D projection axes. If omitted, defaults to horizontal plan (Y-up). */\n planeNormal?: Vec3;\n}\n\n/** Convert plane section polylines to SVG path data with fill colors and stroke styles. */\nexport function createSectionSvg(\n perProduct: PlaneSectionEntry[],\n viewport?: ViewWindow,\n strokeWidthHint?: number,\n labels?: SectionLabel[],\n options?: SectionBuildOptions\n): SectionRenderState | null {\n if (!perProduct.length) {\n return null;\n }\n\n const polylines = perProduct.flatMap((entry) => entry.polylines);\n const hasSegments = perProduct.some((entry) => entry.segments && entry.segments.length > 0);\n\n if (!polylines.length && !hasSegments) {\n return null;\n }\n\n const planeNormal = options?.planeNormal;\n const axes = getProjectionAxes(planeNormal);\n\n let viewMinX: number;\n let viewMaxX: number;\n let viewMinZ: number;\n let viewMaxZ: number;\n\n if (viewport) {\n viewMinX = viewport.viewMinX;\n viewMaxX = viewport.viewMaxX;\n viewMinZ = viewport.viewMinZ;\n viewMaxZ = viewport.viewMaxZ;\n } else {\n let minU = Number.POSITIVE_INFINITY;\n let maxU = Number.NEGATIVE_INFINITY;\n let minV = Number.POSITIVE_INFINITY;\n let maxV = Number.NEGATIVE_INFINITY;\n\n polylines.forEach((polyline: { points: Vec3[]; closed: boolean }) => {\n polyline.points.forEach((point: Vec3) => {\n if (!point) {\n return;\n }\n const u = axes.getU(point);\n const v = axes.getV(point);\n if (!Number.isFinite(u) || !Number.isFinite(v)) {\n return;\n }\n if (u < minU) minU = u;\n if (u > maxU) maxU = u;\n if (v < minV) minV = v;\n if (v > maxV) maxV = v;\n });\n });\n\n // Also include segments in bounding box calculation\n perProduct.forEach((entry) => {\n if (entry.segments && entry.segments.length) {\n entry.segments.forEach((segment) => {\n const [p1, p2] = segment;\n const u1 = axes.getU(p1);\n const v1 = axes.getV(p1);\n const u2 = axes.getU(p2);\n const v2 = axes.getV(p2);\n if (Number.isFinite(u1) && Number.isFinite(v1)) {\n if (u1 < minU) minU = u1;\n if (u1 > maxU) maxU = u1;\n if (v1 < minV) minV = v1;\n if (v1 > maxV) maxV = v1;\n }\n if (Number.isFinite(u2) && Number.isFinite(v2)) {\n if (u2 < minU) minU = u2;\n if (u2 > maxU) maxU = u2;\n if (v2 < minV) minV = v2;\n if (v2 > maxV) maxV = v2;\n }\n });\n }\n });\n\n if (!Number.isFinite(minU) || !Number.isFinite(maxU) || !Number.isFinite(minV) || !Number.isFinite(maxV)) {\n return null;\n }\n\n if (maxU - minU < 1e-3) {\n minU -= 0.5;\n maxU += 0.5;\n }\n if (maxV - minV < 1e-3) {\n minV -= 0.5;\n maxV += 0.5;\n }\n\n const worldWidth = maxU - minU;\n const worldHeight = maxV - minV;\n const marginU = Math.max(worldWidth * SECTION_MARGIN_RATIO, 0.5);\n const marginV = Math.max(worldHeight * SECTION_MARGIN_RATIO, 0.5);\n\n viewMinX = minU - marginU;\n viewMaxX = maxU + marginU;\n viewMinZ = minV - marginV;\n viewMaxZ = maxV + marginV;\n }\n\n const viewWidth = viewMaxX - viewMinX;\n const viewHeight = viewMaxZ - viewMinZ;\n\n if (!Number.isFinite(viewWidth) || !Number.isFinite(viewHeight) || viewWidth <= 1e-6 || viewHeight <= 1e-6) {\n return null;\n }\n\n const autoStrokeBase = Math.max(Math.min(viewWidth, viewHeight) * 0.008, 0.08);\n const autoStroke = Math.max(autoStrokeBase * OUTLINE_THICKNESS_SCALE, 0.02);\n const strokeWidth = Math.max(strokeWidthHint ?? autoStroke, 0.02);\n const geometryTransform = buildGeometryTransform(viewMinX, viewMaxX, viewMinZ, viewMaxZ);\n\n const includeMeta = !!options?.includeMeta;\n const createFills = options?.createFills !== false; // Default to true for backward compatibility\n\n const allPaths: SectionPath[] = [];\n if (includeMeta) {\n perProduct.forEach((entry, idx) => {\n // Skip entries with neither polylines nor segments\n if (!entry.polylines.length && (!entry.segments || !entry.segments.length)) {\n return;\n }\n const colorInfo = sampleProductColorRgba(entry.product);\n const fillColor = colorInfo ? `rgb(${colorInfo.r},${colorInfo.g},${colorInfo.b})` : '#ffffff';\n const fillOpacity = colorInfo ? clampValue(colorInfo.a, 0, 1) : 1;\n const meta = extractProductMeta(entry.product);\n\n const closedSubpaths: string[] = [];\n const holeSubpaths: string[] = [];\n const openSubpaths: string[] = [];\n\n entry.polylines.forEach((polyline) => {\n const pathData = getCachedPolylinePath(polyline, planeNormal);\n if (!pathData) {\n return;\n }\n if (pathData.closed) {\n if (pathData.hole) {\n holeSubpaths.push(pathData.d);\n } else {\n closedSubpaths.push(pathData.d);\n }\n } else {\n openSubpaths.push(pathData.d);\n }\n });\n\n // Only create fill paths if createFills is true\n if (createFills && (closedSubpaths.length || holeSubpaths.length)) {\n const fillSubpaths = closedSubpaths.length ? closedSubpaths.concat(holeSubpaths) : holeSubpaths;\n allPaths.push({\n key: `fill-${idx}`,\n d: fillSubpaths.join(' '),\n fill: fillColor,\n fillOpacity: clampValue(fillOpacity, 0, 1),\n stroke: '#1f2937',\n strokeWidth,\n fillRule: 'evenodd',\n meta: meta ? { ...meta, isFill: true } : undefined\n });\n }\n\n if (openSubpaths.length) {\n allPaths.push({\n key: `outline-${idx}`,\n d: openSubpaths.join(' '),\n fill: 'none',\n fillOpacity: 1,\n stroke: '#1f2937',\n strokeWidth,\n meta: meta ? { ...meta, isOutline: true } : undefined\n });\n }\n\n // Render segments (cut edges) as strokes\n if (entry.segments && entry.segments.length) {\n const segmentPaths: string[] = [];\n for (const segment of entry.segments) {\n const path = segmentToPath(segment, planeNormal);\n if (path) segmentPaths.push(path);\n }\n if (segmentPaths.length) {\n allPaths.push({\n key: `segments-${idx}`,\n d: segmentPaths.join(' '),\n fill: 'none',\n fillOpacity: 1,\n stroke: '#1f2937',\n strokeWidth,\n meta: meta ? { ...meta, isSegment: true } : undefined\n });\n }\n }\n });\n } else {\n const fillGroups = new Map<string, FillGroup>();\n const openSubpaths: string[] = [];\n const allSegmentPaths: string[] = [];\n\n perProduct.forEach((entry) => {\n // Process segments first (always render, even without polylines)\n if (entry.segments && entry.segments.length) {\n for (const segment of entry.segments) {\n const path = segmentToPath(segment, planeNormal);\n if (path) allSegmentPaths.push(path);\n }\n }\n\n if (!entry.polylines.length) {\n return;\n }\n\n const colorInfo = sampleProductColorRgba(entry.product);\n const fillColor = colorInfo ? `rgb(${colorInfo.r},${colorInfo.g},${colorInfo.b})` : '#ffffff';\n const fillOpacity = colorInfo ? clampValue(colorInfo.a, 0, 1) : 1;\n const groupKey = `${fillColor}|${Math.round(fillOpacity * 1000)}`;\n let group = fillGroups.get(groupKey);\n if (!group) {\n group = {\n color: fillColor,\n opacity: fillOpacity,\n closed: [],\n holes: []\n };\n fillGroups.set(groupKey, group);\n }\n\n entry.polylines.forEach((polyline) => {\n const pathData = getCachedPolylinePath(polyline, planeNormal);\n if (!pathData) {\n return;\n }\n if (pathData.closed) {\n if (pathData.hole) {\n group!.holes.push(pathData.d);\n } else {\n group!.closed.push(pathData.d);\n }\n return;\n }\n openSubpaths.push(pathData.d);\n });\n });\n\n let groupIndex = 0;\n fillGroups.forEach((group) => {\n const fillSubpaths = group.closed.length ? group.closed.concat(group.holes) : group.holes;\n if (!fillSubpaths.length) {\n return;\n }\n allPaths.push({\n key: `fill-${groupIndex++}`,\n d: fillSubpaths.join(' '),\n fill: group.color,\n fillOpacity: clampValue(group.opacity, 0, 1),\n stroke: '#1f2937',\n strokeWidth,\n fillRule: 'evenodd'\n });\n });\n\n if (openSubpaths.length) {\n allPaths.push({\n key: 'outlines',\n d: openSubpaths.join(' '),\n fill: 'none',\n fillOpacity: 1,\n stroke: '#1f2937',\n strokeWidth\n });\n }\n\n // Render all segments (collected above in forEach loop)\n if (allSegmentPaths.length) {\n allPaths.push({\n key: 'segments',\n d: allSegmentPaths.join(' '),\n fill: 'none',\n fillOpacity: 1,\n stroke: '#1f2937',\n strokeWidth\n });\n }\n }\n\n if (!allPaths.length) {\n return null;\n }\n\n const displayWidth = BASE_WIDTH;\n const displayHeight = Math.max(MIN_HEIGHT, (viewHeight / viewWidth) * BASE_WIDTH);\n\n return {\n paths: allPaths,\n transform: {\n viewMinX,\n viewMaxX,\n viewMinZ,\n viewMaxZ,\n viewWidth,\n viewHeight,\n displayWidth,\n displayHeight\n },\n strokeWidth,\n geometryTransform,\n labels: labels?.length\n ? labels\n .filter((label) => {\n if (!Number.isFinite(label.x) || !Number.isFinite(label.z)) {\n return false;\n }\n return label.x >= viewMinX && label.x <= viewMaxX && label.z >= viewMinZ && label.z <= viewMaxZ;\n })\n .map((label) => ({\n key: label.key,\n text: label.text,\n x: label.x,\n y: label.y,\n z: label.z,\n fontSize: label.fontSize,\n meta: includeMeta ? (label.meta ?? {}) : undefined\n }))\n : []\n };\n}\n\n/**\n * Build a complete SectionRenderState from plane section entries, with optional\n * fill-rule-based separation, ordering, and label generation.\n *\n * When `fills` rules are provided, entries matching a fill rule are rendered\n * below non-matching entries, with their fill opacity set by the matching rule.\n */\nexport function buildSectionStateForEntries(\n perProduct: PlaneSectionEntry[],\n options: BuildSectionStateOptions\n): (SectionRenderState & { rawPaths?: SectionPath[]; rawLabels?: SectionLabel[] }) | null {\n if (!perProduct.length) {\n return null;\n }\n\n const fills = options.fills;\n const includeMeta = !!options?.includeMeta;\n const includeLabels = options?.includeLabels ?? false;\n const viewport = options?.viewport;\n const strokeWidth = options?.strokeWidth;\n const labelFontSize = includeLabels && typeof options?.labelFontSize === 'number' ? options.labelFontSize : null;\n const buildLabels = options?.buildLabels;\n\n // Point-in-polygon test (ray casting algorithm)\n const pointInPolygon = (polygon: Array<{ x: number; z: number }>, x: number, z: number): boolean => {\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i].x;\n const zi = polygon[i].z;\n const xj = polygon[j].x;\n const zj = polygon[j].z;\n const intersect = zi > z !== zj > z && x < ((xj - xi) * (z - zi)) / (zj - zi) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n };\n\n // Calculate centroid from entry's polylines\n const getCentroid = (entry: PlaneSectionEntry): { x: number; z: number } | null => {\n const polylines = entry.polylines;\n if (!polylines.length) return null;\n let sumX = 0;\n let sumZ = 0;\n let count = 0;\n for (const polyline of polylines) {\n for (const point of polyline.points) {\n sumX += point[0];\n sumZ += point[2];\n count++;\n }\n }\n if (count === 0) return null;\n return { x: sumX / count, z: sumZ / count };\n };\n\n // Spatial matcher for clip filter - checks if product centroid is inside clip polygon\n const isInsideClipPolygon = (entry: PlaneSectionEntry): boolean => {\n if (!options?.clipPolygon?.length) return true;\n const centroid = getCentroid(entry);\n if (!centroid) return false;\n // Check if centroid is inside any of the clip polygons\n return options.clipPolygon.some((polygon) => pointInPolygon(polygon, centroid.x, centroid.z));\n };\n\n // Match an entry against fill rules. Returns the first matching rule, or undefined.\n const matchFillRule = (entry: PlaneSectionEntry): SectionFillRule | undefined => {\n if (!fills?.length) return undefined;\n const product = entry.product;\n for (const rule of fills) {\n // If rule requires clip filter match, check if product centroid is inside clip polygon\n if (rule.matchClipFilter && !isInsideClipPolygon(entry)) {\n continue;\n }\n\n // Check class match\n let classMatches: boolean;\n if (rule.class) {\n const classes = Array.isArray(rule.class) ? rule.class : [rule.class];\n const cls = product.class;\n classMatches = classes.some((c) => {\n if (cls?.is) return cls.is(c as string);\n const pName = (product.className ?? '').toLowerCase();\n return pName === (c as string).toLowerCase() || pName === `ifc${(c as string).toLowerCase()}`;\n });\n if (!classMatches) continue;\n }\n\n // Check where condition (property-based filter)\n if (rule.where && Object.keys(rule.where).length > 0) {\n let whereMatches = true;\n for (const [path, expected] of Object.entries(rule.where)) {\n const actualValue = resolveProductProperty(product, path);\n if (actualValue === undefined) {\n whereMatches = false;\n break;\n }\n\n const normalize = (v: unknown): unknown => (typeof v === 'string' ? v.toLowerCase().trim() : v);\n\n if (Array.isArray(expected)) {\n if (!expected.some((exp) => normalize(exp) === normalize(actualValue))) {\n whereMatches = false;\n break;\n }\n } else {\n if (normalize(actualValue) !== normalize(expected)) {\n whereMatches = false;\n break;\n }\n }\n }\n if (!whereMatches) continue;\n }\n\n return rule;\n }\n return undefined;\n };\n\n const hasFills = !!fills?.length;\n\n // Split entries by fill rule match\n const fillEntries: PlaneSectionEntry[] = [];\n const fillOpacities: number[] = []; // parallel to fillEntries\n const nonFillEntries: PlaneSectionEntry[] = [];\n\n for (const entry of perProduct) {\n const rule = hasFills ? matchFillRule(entry) : undefined;\n if (rule) {\n const opacity = rule.fillOpacity ?? DEFAULT_FILL_OPACITY;\n // Skip entries with zero opacity - don't render them at all\n if (opacity > 0) {\n fillEntries.push(entry);\n fillOpacities.push(opacity);\n }\n } else {\n nonFillEntries.push(entry);\n }\n }\n\n // Build labels from fill-matched entries (e.g. spaces)\n const fillLabels =\n includeLabels && fillEntries.length && labelFontSize !== null && buildLabels\n ? (buildLabels(\n fillEntries.map((entry) => entry.product),\n labelFontSize\n ) as SectionLabel[])\n : undefined;\n\n // When fill rules are present, render fill and non-fill groups separately\n // so we can adjust opacity and control ordering.\n // When no fill rules, render everything in one pass (unchanged behavior).\n if (hasFills && (fillEntries.length > 0 || nonFillEntries.length > 0)) {\n const nonFillState =\n nonFillEntries.length > 0\n ? createSectionSvg(nonFillEntries, viewport, strokeWidth, undefined, {\n includeMeta,\n planeNormal: options.planeNormal\n })\n : null;\n const fillState =\n fillEntries.length > 0\n ? createSectionSvg(fillEntries, viewport, strokeWidth, includeLabels ? fillLabels : undefined, {\n includeMeta,\n planeNormal: options.planeNormal\n })\n : null;\n\n const baseState = nonFillState ?? fillState ?? null;\n if (!baseState) return null;\n\n // Adjust fill opacity per-entry. When includeMeta is true, each entry has\n // its own path, so we can apply per-entry opacity. When false, paths are\n // grouped by color — apply the minimum matching opacity.\n const adjustedFillPaths =\n fillState?.paths.map((path, idx) => {\n // When fill rules match, use the rule opacity directly (don't multiply by material alpha).\n // Material alpha was useful for auto-coloring, but fill rules should have full control.\n const ruleOpacity = idx < fillOpacities.length ? fillOpacities[idx] : (fills![0]?.fillOpacity ?? 0.35);\n const finalOpacity = clampValue(ruleOpacity, 0, 1);\n return {\n ...path,\n fillOpacity: finalOpacity\n };\n }) ?? [];\n\n const nonFillPaths = nonFillState?.paths ?? [];\n // Fill-matched entries always render below non-fill entries\n const mergedPaths = [...adjustedFillPaths, ...nonFillPaths];\n\n const merged: SectionRenderState & { rawPaths?: SectionPath[]; rawLabels?: SectionLabel[] } = {\n ...baseState,\n paths: mergedPaths,\n labels: includeLabels ? (fillState?.labels ?? fillLabels ?? []) : []\n };\n\n return merged;\n }\n\n // No fill rules — create paths with fills for highlight support, but set opacity to 0\n const state = createSectionSvg(perProduct, viewport, strokeWidth, includeLabels ? fillLabels : undefined, {\n includeMeta,\n createFills: true,\n planeNormal: options.planeNormal\n });\n if (!state) return null;\n\n // Set all fill opacities to 0 when no fill rules exist (but keep paths for highlight support)\n const pathsWithZeroFillOpacity = state.paths.map((path) => ({\n ...path,\n fillOpacity: 0\n }));\n\n return {\n ...state,\n paths: pathsWithZeroFillOpacity,\n labels: includeLabels ? (state.labels ?? []) : []\n };\n}\n\n/** Extract the viewport bounding box from a TransformInfo. */\nexport function extractViewWindow(transform: TransformInfo): ViewWindow {\n return {\n viewMinX: transform.viewMinX,\n viewMaxX: transform.viewMaxX,\n viewMinZ: transform.viewMinZ,\n viewMaxZ: transform.viewMaxZ\n };\n}\n\n/** Compare two viewport windows for equality within a tolerance. */\nexport function windowsEqual(a: ViewWindow, b: ViewWindow, epsilon = 1e-4): boolean {\n return (\n Math.abs(a.viewMinX - b.viewMinX) <= epsilon &&\n Math.abs(a.viewMaxX - b.viewMaxX) <= epsilon &&\n Math.abs(a.viewMinZ - b.viewMinZ) <= epsilon &&\n Math.abs(a.viewMaxZ - b.viewMaxZ) <= epsilon\n );\n}\n\n/** Constrain a viewport window within base bounds, preserving aspect ratio. */\nexport function clampViewWindow(base: TransformInfo, candidate: ViewWindow): ViewWindow {\n const baseWidth = base.viewWidth;\n const baseHeight = base.viewHeight;\n const aspect = baseWidth / baseHeight;\n\n let width = candidate.viewMaxX - candidate.viewMinX;\n\n if (!Number.isFinite(width) || width <= 1e-6) {\n width = baseWidth;\n }\n width = clampValue(width, baseWidth / MAX_ZOOM_FACTOR, baseWidth);\n const height = width / aspect;\n\n let centerX = (candidate.viewMinX + candidate.viewMaxX) * 0.5;\n if (!Number.isFinite(centerX)) {\n centerX = (base.viewMinX + base.viewMaxX) * 0.5;\n }\n\n let centerZ = (candidate.viewMinZ + candidate.viewMaxZ) * 0.5;\n if (!Number.isFinite(centerZ)) {\n centerZ = (base.viewMinZ + base.viewMaxZ) * 0.5;\n }\n\n let minX = centerX - width * 0.5;\n let maxX = minX + width;\n if (minX < base.viewMinX) {\n minX = base.viewMinX;\n maxX = minX + width;\n }\n if (maxX > base.viewMaxX) {\n maxX = base.viewMaxX;\n minX = maxX - width;\n }\n\n let minZ = centerZ - height * 0.5;\n let maxZ = minZ + height;\n if (minZ < base.viewMinZ) {\n minZ = base.viewMinZ;\n maxZ = minZ + height;\n }\n if (maxZ > base.viewMaxZ) {\n maxZ = base.viewMaxZ;\n minZ = maxZ - height;\n }\n\n return {\n viewMinX: minX,\n viewMaxX: maxX,\n viewMinZ: minZ,\n viewMaxZ: maxZ\n };\n}\n\n/** Adjust stroke width proportionally to zoom level. */\nexport function strokeWidthForWindow(baseStroke: number, baseTransform: TransformInfo, window: ViewWindow): number {\n const baseWidth = baseTransform.viewWidth;\n const currentWidth = window.viewMaxX - window.viewMinX;\n if (!Number.isFinite(baseWidth) || baseWidth <= 1e-6 || !Number.isFinite(currentWidth) || currentWidth <= 1e-6) {\n return baseStroke;\n }\n const ratio = clampValue(currentWidth / baseWidth, 1 / MAX_ZOOM_FACTOR, 1);\n const scaled = baseStroke * ratio;\n return Math.max(scaled, baseStroke / (MAX_ZOOM_FACTOR + 1));\n}\n\ninterface SvgPathData {\n d: string;\n closed: boolean;\n hole: boolean;\n}\n\ninterface FillGroup {\n color: string;\n opacity: number;\n closed: string[];\n holes: string[];\n}\n\ninterface CachedPolylinePath {\n pointsRef: Vec3[];\n signature: number;\n data: SvgPathData;\n}\n\nconst polylinePathCache = new WeakMap<{ points: Vec3[]; closed: boolean }, CachedPolylinePath>();\n\n/**\n * Determine which axes to use for 2D projection based on plane normal.\n * Returns accessor functions for horizontal and vertical SVG coordinates.\n */\nfunction getProjectionAxes(planeNormal?: Vec3): {\n getU: (p: Vec3) => number;\n getV: (p: Vec3) => number;\n axisNames: string;\n} {\n if (!planeNormal) {\n // Default: horizontal plan (looking down Y axis) -> X,Z\n return {\n getU: (p) => p[0],\n getV: (p) => p[2],\n axisNames: 'XZ'\n };\n }\n\n // Normalize and find dominant axis\n const absX = Math.abs(planeNormal[0]);\n const absY = Math.abs(planeNormal[1]);\n const absZ = Math.abs(planeNormal[2]);\n\n if (absY > absX && absY > absZ) {\n // Horizontal plan (normal ~ Y axis) -> looking down Y, use X,Z\n return {\n getU: (p) => p[0],\n getV: (p) => p[2],\n axisNames: 'XZ'\n };\n } else if (absZ > absX) {\n // Vertical section perpendicular to Z -> looking along Z, use X,Y\n return {\n getU: (p) => p[0],\n getV: (p) => p[1],\n axisNames: 'XY'\n };\n } else {\n // Vertical section perpendicular to X -> looking along X, use Z,Y\n return {\n getU: (p) => p[2],\n getV: (p) => p[1],\n axisNames: 'ZY'\n };\n }\n}\n\n/**\n * Convert a segment (pair of points) to an SVG path string.\n */\nfunction segmentToPath(segment: [Vec3, Vec3], planeNormal?: Vec3): string {\n const [p1, p2] = segment;\n const axes = getProjectionAxes(planeNormal);\n const u1 = axes.getU(p1);\n const v1 = axes.getV(p1);\n const u2 = axes.getU(p2);\n const v2 = axes.getV(p2);\n\n if (!Number.isFinite(u1) || !Number.isFinite(v1) || !Number.isFinite(u2) || !Number.isFinite(v2)) {\n return '';\n }\n return `M${formatNumber(u1)} ${formatNumber(v1)} L${formatNumber(u2)} ${formatNumber(v2)}`;\n}\n\nfunction getCachedPolylinePath(polyline: { points: Vec3[]; closed: boolean }, planeNormal?: Vec3): SvgPathData | null {\n if (!polyline.points.length) {\n return null;\n }\n\n const signature = computePointsSignature(polyline.points, polyline.closed, planeNormal);\n const cached = polylinePathCache.get(polyline);\n if (cached && cached.pointsRef === polyline.points && cached.signature === signature) {\n return cached.data;\n }\n\n const axes = getProjectionAxes(planeNormal);\n const commands: string[] = [];\n polyline.points.forEach((point: Vec3, index: number) => {\n const prefix = index === 0 ? 'M' : 'L';\n const u = axes.getU(point);\n const v = axes.getV(point);\n commands.push(`${prefix}${formatNumber(u)} ${formatNumber(v)}`);\n });\n\n if (commands.length < 2) {\n return null;\n }\n\n let closed = false;\n let hole = false;\n\n if (polyline.closed && commands.length > 2) {\n const area = signedArea(polyline.points, axes);\n hole = area < 0;\n closed = true;\n commands.push('Z');\n }\n\n const data: SvgPathData = { d: commands.join(' '), closed, hole };\n polylinePathCache.set(polyline, { pointsRef: polyline.points, signature, data });\n return data;\n}\n\nfunction signedArea(points: Vec3[], axes: { getU: (p: Vec3) => number; getV: (p: Vec3) => number }): number {\n if (points.length < 3) {\n return 0;\n }\n\n let area = 0;\n for (let i = 0; i < points.length; i++) {\n const current = points[i];\n const next = points[(i + 1) % points.length];\n const u1 = axes.getU(current);\n const v1 = axes.getV(current);\n const u2 = axes.getU(next);\n const v2 = axes.getV(next);\n area += u1 * v2 - u2 * v1;\n }\n return area * 0.5;\n}\n\nfunction formatNumber(value: number): string {\n if (!Number.isFinite(value)) {\n return '0';\n }\n const formatted = value.toFixed(3);\n return formatted.replace(/\\.?0+$/, '');\n}\n\nfunction buildGeometryTransform(viewMinX: number, viewMaxX: number, viewMinZ: number, viewMaxZ: number): string {\n const translateX = formatNumber(-viewMinX);\n const translateY = formatNumber(viewMaxZ);\n return `matrix(1 0 0 -1 ${translateX} ${translateY})`;\n}\n\nfunction computePointsSignature(points: readonly Vec3[], closed: boolean, planeNormal?: Vec3): number {\n const axes = getProjectionAxes(planeNormal);\n // FNV-1a-inspired hash — compact fixed-size key instead of concatenating all coordinates\n let hash = 2166136261 ^ (points.length * 16777619) ^ (closed ? 1 : 0);\n for (let i = 0; i < points.length; i++) {\n const point = points[i];\n if (!point) continue;\n const u = axes.getU(point);\n const v = axes.getV(point);\n // Mix in coordinate bits (multiply by large prime, XOR)\n hash = Math.imul(hash ^ ((u * 1e4) | 0), 16777619);\n hash = Math.imul(hash ^ ((v * 1e4) | 0), 16777619);\n }\n return hash;\n}\n"]}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"/","sources":["types.ts"],"names":[],"mappings":"AAuCA,MAAM,CAAC,MAAM,kBAAkB,GAA8B;IACzD,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;IAC7E,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IAClF,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE;IAC/G,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IACjF,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IAClF,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IACjF,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IACpF,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,EAAE;CACtH,CAAC","sourcesContent":["/** Line styling options for SVG rendering. */\
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"/","sources":["types.ts"],"names":[],"mappings":"AAuCA,MAAM,CAAC,MAAM,kBAAkB,GAA8B;IACzD,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;IAC7E,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IAClF,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE;IAC/G,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IACjF,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IAClF,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IACjF,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;IACpF,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,EAAE;CACtH,CAAC","sourcesContent":["/** Line styling options for SVG rendering. */\nexport interface SvgLineStyle {\n enabled?: boolean;\n stroke?: string;\n strokeWidth?: number;\n strokeDasharray?: string;\n opacity?: number;\n}\n\n/** Style configuration for different line categories in SVG rendering. */\nexport interface SvgRenderStyles {\n cutLines?: SvgLineStyle;\n visibleLines?: SvgLineStyle;\n hiddenLines?: SvgLineStyle;\n silhouettes?: SvgLineStyle;\n featureEdges?: SvgLineStyle;\n stairArrows?: SvgLineStyle;\n outlineVisible?: SvgLineStyle;\n outlineHidden?: SvgLineStyle;\n}\n\n/** Plane basis for projecting 3D points to 2D. */\nexport interface SvgPlaneBasis {\n origin: { x: number; y: number; z: number };\n right: { x: number; y: number; z: number };\n up: { x: number; y: number; z: number };\n}\n\n/** Options for printToSvg. */\nexport interface PrintToSvgOptions {\n viewBox?: [number, number, number, number];\n styles?: SvgRenderStyles;\n includeXmlDeclaration?: boolean;\n backgroundColor?: string;\n planeBasis?: SvgPlaneBasis;\n bounds?: { minX: number; maxX: number; minY: number; maxY: number };\n boundsPadding?: number;\n}\n\nexport const DEFAULT_SVG_STYLES: Required<SvgRenderStyles> = {\n cutLines: { enabled: true, stroke: '#dc2626', strokeWidth: 0.01, opacity: 1 },\n visibleLines: { enabled: true, stroke: '#111827', strokeWidth: 0.005, opacity: 1 },\n hiddenLines: { enabled: true, stroke: '#6b7280', strokeWidth: 0.004, strokeDasharray: '0.02,0.01', opacity: 1 },\n silhouettes: { enabled: true, stroke: '#000000', strokeWidth: 0.006, opacity: 1 },\n featureEdges: { enabled: true, stroke: '#374151', strokeWidth: 0.005, opacity: 1 },\n stairArrows: { enabled: true, stroke: '#111827', strokeWidth: 0.005, opacity: 1 },\n outlineVisible: { enabled: true, stroke: '#111827', strokeWidth: 0.004, opacity: 1 },\n outlineHidden: { enabled: true, stroke: '#9ca3af', strokeWidth: 0.003, strokeDasharray: '0.015,0.008', opacity: 1 }\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twinfinity/printing",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.2-beta",
|
|
4
4
|
"description": "SVG and PDF output",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"setVersion": "bun run ../scripts/set-version.mts twinfinity-printing beta"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@twinfinity/geometry": "6.0.
|
|
27
|
+
"@twinfinity/geometry": "6.0.2-beta"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"jspdf": "^2.5.1",
|
package/src/BuildInfo.ts
CHANGED
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Represents either production or development build type
|
|
3
|
-
*/
|
|
4
|
-
export type BuildType = 'Dev' | 'Prod';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Contains property metadata for the Twinfinity build
|
|
8
|
-
*/
|
|
9
|
-
export interface BuildInfo {
|
|
10
|
-
/** Major version number */
|
|
11
|
-
readonly major: number;
|
|
12
|
-
/** Minor version number */
|
|
13
|
-
readonly minor: number;
|
|
14
|
-
/** Patch version number */
|
|
15
|
-
readonly patch: number;
|
|
16
|
-
/** Unique build id */
|
|
17
|
-
readonly id: number;
|
|
18
|
-
/** The commit checksum */
|
|
19
|
-
readonly commit: string;
|
|
20
|
-
/** String that uniquely identifies the current version */
|
|
21
|
-
readonly version: string;
|
|
22
|
-
/** The build type */
|
|
23
|
-
readonly buildType: BuildType;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const gBi: BuildInfo = {
|
|
27
|
-
major: 111111,
|
|
28
|
-
minor: 222222,
|
|
29
|
-
patch: 333333,
|
|
30
|
-
id: 444444,
|
|
31
|
-
commit: 'unknownCommit',
|
|
32
|
-
version: '',
|
|
33
|
-
buildType: 'Prod'
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
(gBi.version as string) = `${gBi.major}.${gBi.minor}.${gBi.patch}.${gBi.id}-[${gBi.commit}]`;
|
|
37
|
-
if (gBi.commit === 'unknownCommit') {
|
|
38
|
-
(gBi.buildType as BuildType) = 'Dev';
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export const BUILD_INFO = Object.freeze(gBi);
|
|
1
|
+
/**
|
|
2
|
+
* Represents either production or development build type
|
|
3
|
+
*/
|
|
4
|
+
export type BuildType = 'Dev' | 'Prod';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Contains property metadata for the Twinfinity build
|
|
8
|
+
*/
|
|
9
|
+
export interface BuildInfo {
|
|
10
|
+
/** Major version number */
|
|
11
|
+
readonly major: number;
|
|
12
|
+
/** Minor version number */
|
|
13
|
+
readonly minor: number;
|
|
14
|
+
/** Patch version number */
|
|
15
|
+
readonly patch: number;
|
|
16
|
+
/** Unique build id */
|
|
17
|
+
readonly id: number;
|
|
18
|
+
/** The commit checksum */
|
|
19
|
+
readonly commit: string;
|
|
20
|
+
/** String that uniquely identifies the current version */
|
|
21
|
+
readonly version: string;
|
|
22
|
+
/** The build type */
|
|
23
|
+
readonly buildType: BuildType;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const gBi: BuildInfo = {
|
|
27
|
+
major: 111111,
|
|
28
|
+
minor: 222222,
|
|
29
|
+
patch: 333333,
|
|
30
|
+
id: 444444,
|
|
31
|
+
commit: 'unknownCommit',
|
|
32
|
+
version: '',
|
|
33
|
+
buildType: 'Prod'
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
(gBi.version as string) = `${gBi.major}.${gBi.minor}.${gBi.patch}.${gBi.id}-[${gBi.commit}]`;
|
|
37
|
+
if (gBi.commit === 'unknownCommit') {
|
|
38
|
+
(gBi.buildType as BuildType) = 'Dev';
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const BUILD_INFO = Object.freeze(gBi);
|
package/src/index.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export * from './BuildInfo';
|
|
2
|
-
export * from './types';
|
|
3
|
-
export { printToSvg } from './printToSvg';
|
|
4
|
-
export { printToPdf, printToSvgFile, type PrintToPdfOptions } from './printToPdf';
|
|
5
|
-
|
|
6
|
-
// Print-layout module (template-driven page composition)
|
|
7
|
-
export * from './layout/index';
|
|
8
|
-
|
|
9
|
-
// Sections SVG viewport module
|
|
10
|
-
export * from './sections';
|
|
1
|
+
export * from './BuildInfo';
|
|
2
|
+
export * from './types';
|
|
3
|
+
export { printToSvg } from './printToSvg';
|
|
4
|
+
export { printToPdf, printToSvgFile, type PrintToPdfOptions } from './printToPdf';
|
|
5
|
+
|
|
6
|
+
// Print-layout module (template-driven page composition)
|
|
7
|
+
export * from './layout/index';
|
|
8
|
+
|
|
9
|
+
// Sections SVG viewport module
|
|
10
|
+
export * from './sections';
|