@twinfinity/printing 6.1.0-beta → 6.1.2-ci.30738-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/dist/BuildInfo.js +3 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/analyzeTemplate.d.ts +4 -4
- package/dist/layout/analyzeTemplate.d.ts.map +1 -1
- package/dist/layout/analyzeTemplate.js +18 -16
- package/dist/layout/analyzeTemplate.js.map +1 -1
- package/dist/layout/classClosure.d.ts +41 -0
- package/dist/layout/classClosure.d.ts.map +1 -0
- package/dist/layout/classClosure.js +143 -0
- package/dist/layout/classClosure.js.map +1 -0
- package/dist/layout/clipUtils.d.ts +11 -0
- package/dist/layout/clipUtils.d.ts.map +1 -1
- package/dist/layout/clipUtils.js +67 -6
- package/dist/layout/clipUtils.js.map +1 -1
- package/dist/layout/filters.d.ts +14 -8
- package/dist/layout/filters.d.ts.map +1 -1
- package/dist/layout/filters.js +28 -3
- package/dist/layout/filters.js.map +1 -1
- package/dist/layout/index.d.ts +24 -57
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +20 -337
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/itemBuilders.d.ts +11 -0
- package/dist/layout/itemBuilders.d.ts.map +1 -1
- package/dist/layout/itemBuilders.js +17 -3
- package/dist/layout/itemBuilders.js.map +1 -1
- package/dist/layout/labelsRender.d.ts.map +1 -1
- package/dist/layout/labelsRender.js +15 -27
- package/dist/layout/labelsRender.js.map +1 -1
- package/dist/layout/legendRender.d.ts +18 -6
- package/dist/layout/legendRender.d.ts.map +1 -1
- package/dist/layout/legendRender.js +49 -79
- package/dist/layout/legendRender.js.map +1 -1
- package/dist/layout/metadata.d.ts.map +1 -1
- package/dist/layout/metadata.js +26 -5
- package/dist/layout/metadata.js.map +1 -1
- package/dist/layout/model.d.ts +4 -3
- package/dist/layout/model.d.ts.map +1 -1
- package/dist/layout/model.js +17 -57
- package/dist/layout/model.js.map +1 -1
- package/dist/layout/options.d.ts +1 -2
- package/dist/layout/options.d.ts.map +1 -1
- package/dist/layout/options.js.map +1 -1
- package/dist/layout/preflight.d.ts +32 -0
- package/dist/layout/preflight.d.ts.map +1 -0
- package/dist/layout/preflight.js +69 -0
- package/dist/layout/preflight.js.map +1 -0
- package/dist/layout/qrRender.d.ts.map +1 -1
- package/dist/layout/qrRender.js +11 -10
- package/dist/layout/qrRender.js.map +1 -1
- package/dist/layout/renderDrawing.d.ts +28 -17
- package/dist/layout/renderDrawing.d.ts.map +1 -1
- package/dist/layout/renderDrawing.js +107 -88
- package/dist/layout/renderDrawing.js.map +1 -1
- package/dist/layout/renderLayout.d.ts +25 -0
- package/dist/layout/renderLayout.d.ts.map +1 -0
- package/dist/layout/renderLayout.js +315 -0
- package/dist/layout/renderLayout.js.map +1 -0
- package/dist/layout/renderTemplateSheet.d.ts +99 -0
- package/dist/layout/renderTemplateSheet.d.ts.map +1 -0
- package/dist/layout/renderTemplateSheet.js +296 -0
- package/dist/layout/renderTemplateSheet.js.map +1 -0
- package/dist/layout/renderUtils.d.ts +19 -0
- package/dist/layout/renderUtils.d.ts.map +1 -1
- package/dist/layout/renderUtils.js +47 -4
- package/dist/layout/renderUtils.js.map +1 -1
- package/dist/layout/sectionDefs.d.ts +65 -0
- package/dist/layout/sectionDefs.d.ts.map +1 -0
- package/dist/layout/sectionDefs.js +88 -0
- package/dist/layout/sectionDefs.js.map +1 -0
- package/dist/layout/slabModelView.d.ts +34 -0
- package/dist/layout/slabModelView.d.ts.map +1 -0
- package/dist/layout/slabModelView.js +175 -0
- package/dist/layout/slabModelView.js.map +1 -0
- package/dist/layout/templateVariables.d.ts +1 -1
- package/dist/layout/templateVariables.d.ts.map +1 -1
- package/dist/layout/templateVariables.js +21 -9
- package/dist/layout/templateVariables.js.map +1 -1
- package/dist/layout/types.d.ts +164 -83
- package/dist/layout/types.d.ts.map +1 -1
- package/dist/layout/types.js.map +1 -1
- package/dist/layout/validation.d.ts.map +1 -1
- package/dist/layout/validation.js +78 -33
- package/dist/layout/validation.js.map +1 -1
- package/dist/layout/viewportPrep.d.ts +8 -6
- package/dist/layout/viewportPrep.d.ts.map +1 -1
- package/dist/layout/viewportPrep.js +35 -23
- package/dist/layout/viewportPrep.js.map +1 -1
- package/dist/layout/viewportRender.d.ts +9 -7
- package/dist/layout/viewportRender.d.ts.map +1 -1
- package/dist/layout/viewportRender.js +93 -126
- package/dist/layout/viewportRender.js.map +1 -1
- package/dist/layout/viewportUtils.d.ts +20 -0
- package/dist/layout/viewportUtils.d.ts.map +1 -1
- package/dist/layout/viewportUtils.js +107 -4
- package/dist/layout/viewportUtils.js.map +1 -1
- package/dist/printToPdf.d.ts +7 -1
- package/dist/printToPdf.d.ts.map +1 -1
- package/dist/printToPdf.js +81 -14
- package/dist/printToPdf.js.map +1 -1
- package/dist/printToSvg.d.ts.map +1 -1
- package/dist/printToSvg.js +7 -3
- package/dist/printToSvg.js.map +1 -1
- package/dist/schemaUtils.d.ts +9 -0
- package/dist/schemaUtils.d.ts.map +1 -0
- package/dist/schemaUtils.js +14 -0
- package/dist/schemaUtils.js.map +1 -0
- package/dist/templates/default-template.json +30 -8
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -1
- package/dist/types.js.map +1 -1
- package/package.json +8 -3
- package/src/index.ts +4 -0
- package/src/layout/analyzeTemplate.ts +21 -19
- package/src/layout/classClosure.ts +142 -0
- package/src/layout/clipUtils.ts +65 -6
- package/src/layout/filters.ts +31 -3
- package/src/layout/index.ts +61 -571
- package/src/layout/itemBuilders.ts +20 -5
- package/src/layout/labelsRender.ts +23 -40
- package/src/layout/legendRender.ts +64 -84
- package/src/layout/metadata.ts +26 -5
- package/src/layout/model.ts +21 -66
- package/src/layout/options.ts +1 -2
- package/src/layout/preflight.ts +96 -0
- package/src/layout/qrRender.ts +11 -10
- package/src/layout/renderDrawing.ts +132 -110
- package/src/layout/renderLayout.ts +483 -0
- package/src/layout/renderTemplateSheet.ts +435 -0
- package/src/layout/renderUtils.ts +53 -4
- package/src/layout/sectionDefs.ts +131 -0
- package/src/layout/slabModelView.ts +196 -0
- package/src/layout/templateVariables.ts +25 -9
- package/src/layout/types.ts +160 -70
- package/src/layout/validation.ts +98 -32
- package/src/layout/viewportPrep.ts +47 -29
- package/src/layout/viewportRender.ts +114 -141
- package/src/layout/viewportUtils.ts +118 -5
- package/src/printToPdf.ts +84 -15
- package/src/printToSvg.ts +7 -3
- package/src/schemaUtils.ts +13 -0
- package/src/templates/default-template.json +30 -8
- package/src/types.ts +12 -2
- package/templates/default-a0-landscape.json +171 -66
- package/templates/default-a0-portrait.json +159 -60
- package/templates/default-a1-landscape.json +135 -48
- package/templates/default-a1-portrait.json +123 -42
- package/templates/default-a3-landscape.json +87 -24
- package/templates/default-a3-portrait.json +99 -30
- package/templates/default-a4-landscape.json +75 -18
- package/templates/default-a4-portrait.json +75 -18
- package/templates/llm-authoring-guide.md +247 -0
- package/templates/template-schema.json +295 -120
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clipUtils.js","sourceRoot":"/","sources":["layout/clipUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SvgModelView } from './types';\nimport { EPSILON_DIVISION_SAFETY, CENTER_FRACTION } from './geometryConstants';\n\nexport type Point = { x: number; y: number };\nexport type Polygon = Point[];\n\nimport { isRecord, getProp } from './typeGuards';\n\nexport const pointInPolygon = (polygon: Polygon, x: number, y: 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 yi = polygon[i].y;\n const xj = polygon[j].x,\n yj = polygon[j].y;\n const intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n};\n\nexport const filterItemsInPolygons = (\n items: unknown[],\n polygons: Polygon[],\n xField = 'x',\n yField = 'z',\n getPathValue: (obj: unknown, path: string) => unknown\n): unknown[] => {\n if (!Array.isArray(items) || !Array.isArray(polygons) || polygons.length === 0) return items ?? [];\n return items.filter((item) => {\n const xVal = getPathValue(item, xField);\n const yVal = getPathValue(item, yField);\n if (!Number.isFinite(xVal) || !Number.isFinite(yVal)) return false;\n const x = Number(xVal);\n const y = Number(yVal);\n return polygons.some((poly) => pointInPolygon(poly, x, y));\n });\n};\n\nexport const filterEntriesByClip = (\n entries: unknown[],\n polygons: Array<Array<{ x: number; z: number }>>\n): unknown[] => {\n if (!Array.isArray(entries) || !Array.isArray(polygons) || polygons.length === 0) return entries ?? [];\n\n const getCenter = (entry: unknown): { x: number | null; z: number | null } => {\n const product = getProp(entry, 'product') ?? entry;\n try {\n const boundingInfoFn = getProp(product, 'boundingInfo');\n const boundingInfo = typeof boundingInfoFn === 'function' ? boundingInfoFn() : null;\n const bbox = isRecord(boundingInfo) ? getProp(boundingInfo, 'boundingBox') : null;\n const min = isRecord(bbox) ? (getProp(bbox, 'minimumWorld') ?? getProp(bbox, 'minimum')) : null;\n const max = isRecord(bbox) ? (getProp(bbox, 'maximumWorld') ?? getProp(bbox, 'maximum')) : null;\n const minX = isRecord(min) ? getProp(min, 'x') : null;\n const maxX = isRecord(max) ? getProp(max, 'x') : null;\n const minZ = isRecord(min) ? getProp(min, 'z') : null;\n const maxZ = isRecord(max) ? getProp(max, 'z') : null;\n if (Number.isFinite(minX) && Number.isFinite(maxX) && Number.isFinite(minZ) && Number.isFinite(maxZ)) {\n return {\n x: (Number(minX) + Number(maxX)) * CENTER_FRACTION,\n z: (Number(minZ) + Number(maxZ)) * CENTER_FRACTION\n };\n }\n } catch {\n // Bounding info access may fail for products without geometry or with malformed data structures.\n // This is expected behavior - we fall back to entry.x/z properties below.\n }\n const x = getProp(entry, 'x');\n const z = getProp(entry, 'z');\n return { x: typeof x === 'number' ? x : null, z: typeof z === 'number' ? z : null };\n };\n\n return entries.filter((entry) => {\n const center = getCenter(entry);\n if (!Number.isFinite(center.x) || !Number.isFinite(center.z)) return false;\n const x = Number(center.x);\n const z = Number(center.z);\n return polygons.some((poly) =>\n pointInPolygon(\n poly.map((p) => ({ x: p.x, y: p.z })),\n x,\n z\n )\n );\n });\n};\n\nexport const offsetPolygons = (polys: Polygon[], delta: number): Polygon[] => {\n if (!Array.isArray(polys) || !polys.length || !Number.isFinite(delta) || delta === 0) return polys ?? [];\n const intersectLines = (p: Point, r: Point, q: Point, s: Point): Point | null => {\n const rxs = r.x * s.y - r.y * s.x;\n if (Math.abs(rxs) < EPSILON_DIVISION_SAFETY) return null; // parallel\n const t = ((q.x - p.x) * s.y - (q.y - p.y) * s.x) / rxs;\n return { x: p.x + t * r.x, y: p.y + t * r.y };\n };\n const offsetPoly = (poly: Polygon): Polygon => {\n const n = poly.length;\n if (n < 3) return poly;\n const area = poly.reduce((sum, p, i) => {\n const q = poly[(i + 1) % n];\n return sum + p.x * q.y - q.x * p.y;\n }, 0);\n const orient = area >= 0 ? 1 : -1; // ccw => outward is right normal\n const out: Polygon = [];\n for (let i = 0; i < n; i++) {\n const p0 = poly[(i + n - 1) % n];\n const p1 = poly[i];\n const p2 = poly[(i + 1) % n];\n const e1x = p1.x - p0.x;\n const e1y = p1.y - p0.y;\n const e2x = p2.x - p1.x;\n const e2y = p2.y - p1.y;\n const len1 = Math.hypot(e1x, e1y) || EPSILON_DIVISION_SAFETY;\n const len2 = Math.hypot(e2x, e2y) || EPSILON_DIVISION_SAFETY;\n const n1x = (orient * e1y) / len1;\n const n1y = (orient * -e1x) / len1;\n const n2x = (orient * e2y) / len2;\n const n2y = (orient * -e2x) / len2;\n const line1Point = { x: p1.x + n1x * delta, y: p1.y + n1y * delta };\n const line2Point = { x: p1.x + n2x * delta, y: p1.y + n2y * delta };\n const inter = intersectLines(line1Point, { x: e1x, y: e1y }, line2Point, { x: e2x, y: e2y });\n out.push(inter ?? line2Point);\n }\n return out;\n };\n return polys.map(offsetPoly);\n};\n\nexport const projectPolygonsToLocal = (\n polygonsSource: unknown,\n xField: string,\n yField: string,\n model: SvgModelView,\n rotationDeg: number,\n contentOffsetX: number,\n contentOffsetY: number,\n mmPerModel: number\n): { local: Polygon[]; page: Polygon[] } => {\n const cosA = Math.cos((rotationDeg * Math.PI) / 180);\n const sinA = Math.sin((rotationDeg * Math.PI) / 180);\n const toLocal = (px: number, py: number): Point => {\n const viewX = px - model.transform!.viewMinX;\n const viewY = model.transform!.viewMaxZ - py;\n const x0 = viewX - model.widthModel / 2;\n const y0 = viewY - model.heightModel / 2;\n const x1 = x0 * cosA - y0 * sinA;\n const y1 = x0 * sinA + y0 * cosA;\n return { x: x1, y: y1 };\n };\n const toPage = (px: number, py: number): Point => {\n const viewX = px - model.transform!.viewMinX;\n const viewY = model.transform!.viewMaxZ - py;\n const x0 = viewX - model.widthModel / 2;\n const y0 = viewY - model.heightModel / 2;\n const x1 = x0 * cosA - y0 * sinA;\n const y1 = x0 * sinA + y0 * cosA;\n return { x: contentOffsetX + x1 * mmPerModel, y: contentOffsetY + y1 * mmPerModel };\n };\n const projectPolyLocal = (poly: unknown[]): Polygon =>\n poly\n .map((pt: unknown) => {\n const px = Number(getProp(pt, xField));\n const py = Number(getProp(pt, yField));\n if (!Number.isFinite(px) || !Number.isFinite(py)) return null;\n return toLocal(px, py);\n })\n .filter(Boolean) as Polygon;\n const projectPoly = (poly: unknown[]): Polygon =>\n poly\n .map((pt: unknown) => {\n const px = Number(getProp(pt, xField));\n const py = Number(getProp(pt, yField));\n if (!Number.isFinite(px) || !Number.isFinite(py)) return null;\n return toPage(px, py);\n })\n .filter(Boolean) as Polygon;\n\n const local: Polygon[] = [];\n const page: Polygon[] = [];\n if (Array.isArray(polygonsSource)) {\n polygonsSource.forEach((poly: unknown) => {\n const points = getProp(poly, 'points');\n const pl = Array.isArray(points) ? points : Array.isArray(poly) ? poly : null;\n if (!pl || pl.length < 3) return;\n const projectedLocal = projectPolyLocal(pl);\n if (projectedLocal.length >= 3) {\n local.push(projectedLocal);\n page.push(projectPoly(pl));\n }\n });\n }\n return { local, page };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"clipUtils.js","sourceRoot":"/","sources":["layout/clipUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import polygonClipping from 'polygon-clipping';\nimport type { SvgModelView } from './types';\nimport { EPSILON_DIVISION_SAFETY, CENTER_FRACTION } from './geometryConstants';\n\nexport type Point = { x: number; y: number };\nexport type Polygon = Point[];\n\nimport { isRecord, getProp } from './typeGuards';\n\nexport const pointInPolygon = (polygon: Polygon, x: number, y: 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 yi = polygon[i].y;\n const xj = polygon[j].x,\n yj = polygon[j].y;\n const intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;\n if (intersect) inside = !inside;\n }\n return inside;\n};\n\nexport const filterItemsInPolygons = (\n items: unknown[],\n polygons: Polygon[],\n xField = 'x',\n yField = 'z',\n getPathValue: (obj: unknown, path: string) => unknown\n): unknown[] => {\n if (!Array.isArray(items) || !Array.isArray(polygons) || polygons.length === 0) return items ?? [];\n return items.filter((item) => {\n const xVal = getPathValue(item, xField);\n const yVal = getPathValue(item, yField);\n if (!Number.isFinite(xVal) || !Number.isFinite(yVal)) return false;\n const x = Number(xVal);\n const y = Number(yVal);\n return polygons.some((poly) => pointInPolygon(poly, x, y));\n });\n};\n\nexport const filterEntriesByClip = (\n entries: unknown[],\n polygons: Array<Array<{ x: number; z: number }>>\n): unknown[] => {\n if (!Array.isArray(entries) || !Array.isArray(polygons) || polygons.length === 0) return entries ?? [];\n\n const getCenter = (entry: unknown): { x: number | null; z: number | null } => {\n const product = getProp(entry, 'product') ?? entry;\n try {\n const boundingInfoFn = getProp(product, 'boundingInfo');\n const boundingInfo = typeof boundingInfoFn === 'function' ? boundingInfoFn() : null;\n const bbox = isRecord(boundingInfo) ? getProp(boundingInfo, 'boundingBox') : null;\n const min = isRecord(bbox) ? (getProp(bbox, 'minimumWorld') ?? getProp(bbox, 'minimum')) : null;\n const max = isRecord(bbox) ? (getProp(bbox, 'maximumWorld') ?? getProp(bbox, 'maximum')) : null;\n const minX = isRecord(min) ? getProp(min, 'x') : null;\n const maxX = isRecord(max) ? getProp(max, 'x') : null;\n const minZ = isRecord(min) ? getProp(min, 'z') : null;\n const maxZ = isRecord(max) ? getProp(max, 'z') : null;\n if (Number.isFinite(minX) && Number.isFinite(maxX) && Number.isFinite(minZ) && Number.isFinite(maxZ)) {\n return {\n x: (Number(minX) + Number(maxX)) * CENTER_FRACTION,\n z: (Number(minZ) + Number(maxZ)) * CENTER_FRACTION\n };\n }\n } catch {\n // Bounding info access may fail for products without geometry or with malformed data structures.\n // This is expected behavior - we fall back to entry.x/z properties below.\n }\n const x = getProp(entry, 'x');\n const z = getProp(entry, 'z');\n return { x: typeof x === 'number' ? x : null, z: typeof z === 'number' ? z : null };\n };\n\n return entries.filter((entry) => {\n const center = getCenter(entry);\n if (!Number.isFinite(center.x) || !Number.isFinite(center.z)) return false;\n const x = Number(center.x);\n const z = Number(center.z);\n return polygons.some((poly) =>\n pointInPolygon(\n poly.map((p) => ({ x: p.x, y: p.z })),\n x,\n z\n )\n );\n });\n};\n\n/**\n * Union polygons so overlapping ones merge into a single outline (disjoint\n * polygons pass through unchanged). Used on expanded clip polygons — two\n * adjacent clip targets whose expansions overlap should read as one region,\n * not as outlines crossing through each other.\n *\n * The result is a flat ring list that may include hole rings (e.g. several\n * regions enclosing a courtyard) — consumers rendering fills or clip paths\n * from these rings must use even-odd semantics.\n */\nexport const unionPolygons = (polys: Polygon[]): Polygon[] => {\n if (!Array.isArray(polys) || polys.length < 2) return polys ?? [];\n try {\n const input = polys\n .filter((p) => p.length >= 3)\n .map((p): [number, number][][] => [[...p.map((pt): [number, number] => [pt.x, pt.y]), [p[0].x, p[0].y]]]);\n if (input.length < 2) return polys;\n const result = polygonClipping.union(input[0], ...input.slice(1));\n const rings: Polygon[] = [];\n for (const poly of result) {\n for (const ring of poly) {\n const r: Polygon = ring.map(([x, y]) => ({ x, y }));\n // Drop the duplicated closing point the library emits.\n if (r.length > 1 && r[0].x === r[r.length - 1].x && r[0].y === r[r.length - 1].y) {\n r.pop();\n }\n if (r.length >= 3) rings.push(r);\n }\n }\n return rings.length ? rings : polys;\n } catch {\n // Boolean ops can throw on degenerate input — fall back to the\n // un-unioned polygons rather than losing the clip entirely.\n return polys;\n }\n};\n\nexport const offsetPolygons = (polys: Polygon[], delta: number): Polygon[] => {\n if (!Array.isArray(polys) || !polys.length || !Number.isFinite(delta) || delta === 0) return polys ?? [];\n const intersectLines = (p: Point, r: Point, q: Point, s: Point): Point | null => {\n const rxs = r.x * s.y - r.y * s.x;\n if (Math.abs(rxs) < EPSILON_DIVISION_SAFETY) return null; // parallel\n const t = ((q.x - p.x) * s.y - (q.y - p.y) * s.x) / rxs;\n return { x: p.x + t * r.x, y: p.y + t * r.y };\n };\n // Vertices closer than this are treated as duplicates (coordinates are in\n // model metres, so 0.1 mm is far below anything architectural).\n const DUPLICATE_EPS = 1e-4;\n const offsetPoly = (poly: Polygon): Polygon => {\n // Sanitize the ring first: cut polylines usually repeat the first point\n // as a closing point, and mesh cutting can emit consecutive\n // near-duplicates. A zero-length edge has a zero normal, which\n // degenerates the miter intersection and leaves that vertex unoffset —\n // visible as a collapsed/distorted corner in the expanded outline.\n const pts: Polygon = [];\n for (const p of poly) {\n const last = pts[pts.length - 1];\n if (last && Math.abs(last.x - p.x) < DUPLICATE_EPS && Math.abs(last.y - p.y) < DUPLICATE_EPS) continue;\n pts.push(p);\n }\n while (\n pts.length > 1 &&\n Math.abs(pts[0].x - pts[pts.length - 1].x) < DUPLICATE_EPS &&\n Math.abs(pts[0].y - pts[pts.length - 1].y) < DUPLICATE_EPS\n ) {\n pts.pop();\n }\n const n = pts.length;\n if (n < 3) return poly;\n const area = pts.reduce((sum, p, i) => {\n const q = pts[(i + 1) % n];\n return sum + p.x * q.y - q.x * p.y;\n }, 0);\n const orient = area >= 0 ? 1 : -1; // ccw => outward is right normal\n const out: Polygon = [];\n for (let i = 0; i < n; i++) {\n const p0 = pts[(i + n - 1) % n];\n const p1 = pts[i];\n const p2 = pts[(i + 1) % n];\n const e1x = p1.x - p0.x;\n const e1y = p1.y - p0.y;\n const e2x = p2.x - p1.x;\n const e2y = p2.y - p1.y;\n const len1 = Math.hypot(e1x, e1y) || EPSILON_DIVISION_SAFETY;\n const len2 = Math.hypot(e2x, e2y) || EPSILON_DIVISION_SAFETY;\n const n1x = (orient * e1y) / len1;\n const n1y = (orient * -e1x) / len1;\n const n2x = (orient * e2y) / len2;\n const n2y = (orient * -e2x) / len2;\n const line1Point = { x: p1.x + n1x * delta, y: p1.y + n1y * delta };\n const line2Point = { x: p1.x + n2x * delta, y: p1.y + n2y * delta };\n const inter = intersectLines(line1Point, { x: e1x, y: e1y }, line2Point, { x: e2x, y: e2y });\n out.push(inter ?? line2Point);\n }\n return out;\n };\n return polys.map(offsetPoly);\n};\n\nexport const projectPolygonsToLocal = (\n polygonsSource: unknown,\n xField: string,\n yField: string,\n model: SvgModelView,\n rotationDeg: number,\n contentOffsetX: number,\n contentOffsetY: number,\n mmPerModel: number\n): { local: Polygon[]; page: Polygon[] } => {\n const cosA = Math.cos((rotationDeg * Math.PI) / 180);\n const sinA = Math.sin((rotationDeg * Math.PI) / 180);\n const toLocal = (px: number, py: number): Point => {\n const viewX = px - model.transform!.viewMinX;\n const viewY = model.transform!.viewMaxZ - py;\n const x0 = viewX - model.widthModel / 2;\n const y0 = viewY - model.heightModel / 2;\n const x1 = x0 * cosA - y0 * sinA;\n const y1 = x0 * sinA + y0 * cosA;\n return { x: x1, y: y1 };\n };\n const toPage = (px: number, py: number): Point => {\n const viewX = px - model.transform!.viewMinX;\n const viewY = model.transform!.viewMaxZ - py;\n const x0 = viewX - model.widthModel / 2;\n const y0 = viewY - model.heightModel / 2;\n const x1 = x0 * cosA - y0 * sinA;\n const y1 = x0 * sinA + y0 * cosA;\n return { x: contentOffsetX + x1 * mmPerModel, y: contentOffsetY + y1 * mmPerModel };\n };\n const projectPolyLocal = (poly: unknown[]): Polygon =>\n poly\n .map((pt: unknown) => {\n const px = Number(getProp(pt, xField));\n const py = Number(getProp(pt, yField));\n if (!Number.isFinite(px) || !Number.isFinite(py)) return null;\n return toLocal(px, py);\n })\n .filter(Boolean) as Polygon;\n const projectPoly = (poly: unknown[]): Polygon =>\n poly\n .map((pt: unknown) => {\n const px = Number(getProp(pt, xField));\n const py = Number(getProp(pt, yField));\n if (!Number.isFinite(px) || !Number.isFinite(py)) return null;\n return toPage(px, py);\n })\n .filter(Boolean) as Polygon;\n\n const local: Polygon[] = [];\n const page: Polygon[] = [];\n if (Array.isArray(polygonsSource)) {\n polygonsSource.forEach((poly: unknown) => {\n const points = getProp(poly, 'points');\n const pl = Array.isArray(points) ? points : Array.isArray(poly) ? poly : null;\n if (!pl || pl.length < 3) return;\n const projectedLocal = projectPolyLocal(pl);\n if (projectedLocal.length >= 3) {\n local.push(projectedLocal);\n page.push(projectPoly(pl));\n }\n });\n }\n return { local, page };\n};\n"]}
|
package/dist/layout/filters.d.ts
CHANGED
|
@@ -13,6 +13,17 @@ declare const normalizeValue: (v: unknown) => unknown;
|
|
|
13
13
|
* For live products, the caller should use product.class.is() directly.
|
|
14
14
|
*/
|
|
15
15
|
declare const matchesClass: (itemClass: unknown, classFilter: string | string[] | undefined) => boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Check whether a *live* product's class matches a filter, with the same semantics extracted items
|
|
18
|
+
* get from {@link matchesClass}: case-insensitive, `Ifc` prefix optional, arrays mean any-of.
|
|
19
|
+
*
|
|
20
|
+
* Live products carry a `ModelProductClass` rather than a string, and its `is()` compares with
|
|
21
|
+
* `===`. That rejects `SPACE` and `IFCWALL` — values every other filter in the same template
|
|
22
|
+
* accepts — and its own `Ifc` handling is case-sensitive too (`'IFCWALL'.startsWith('Ifc')` is
|
|
23
|
+
* false). Comparing the class's own `id`/`type` through `matchesClass` keeps product selection
|
|
24
|
+
* identical to the rest of the template rather than subtly stricter.
|
|
25
|
+
*/
|
|
26
|
+
declare const matchesProductClass: (product: unknown, classFilter: string | string[] | undefined) => boolean;
|
|
16
27
|
/**
|
|
17
28
|
* Check whether an item matches a `where` condition.
|
|
18
29
|
*
|
|
@@ -21,13 +32,8 @@ declare const matchesClass: (itemClass: unknown, classFilter: string | string[]
|
|
|
21
32
|
* Multiple keys = AND. String comparison is case-insensitive.
|
|
22
33
|
*/
|
|
23
34
|
declare const matchesWhere: (item: unknown, where: WhereCondition | undefined) => boolean;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
*
|
|
27
|
-
* @param item - An object with ifcClass and propertySets
|
|
28
|
-
* @param classFilter - IFC class name(s) to match, or undefined for any
|
|
29
|
-
* @param where - Property conditions (short paths), or undefined for no conditions
|
|
30
|
-
*/
|
|
35
|
+
export declare const matchesFilter: (item: unknown, classFilter: string | string[] | undefined, where: WhereCondition | undefined) => boolean;
|
|
36
|
+
/** @deprecated Use {@link matchesFilter} — there never was a V1; the name was noise. */
|
|
31
37
|
export declare const matchesV2Filter: (item: unknown, classFilter: string | string[] | undefined, where: WhereCondition | undefined) => boolean;
|
|
32
|
-
export { normalizeClass, classEquals, normalizeValue, matchesClass, matchesWhere };
|
|
38
|
+
export { normalizeClass, classEquals, normalizeValue, matchesClass, matchesProductClass, matchesWhere };
|
|
33
39
|
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.d.ts","sourceRoot":"/","sources":["layout/filters.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,QAAA,MAAM,cAAc,GAAI,KAAK,OAAO,KAAG,MAAM,GAAG,IAAmE,CAAC;AAEpH;gEACgE;AAChE,QAAA,MAAM,WAAW,GAAI,GAAG,MAAM,GAAG,IAAI,EAAE,GAAG,MAAM,GAAG,IAAI,KAAG,OAMzD,CAAC;AACF,QAAA,MAAM,cAAc,GAAI,GAAG,OAAO,KAAG,OAA+D,CAAC;AAErG;;;;;;;GAOG;AACH,QAAA,MAAM,YAAY,GAAI,WAAW,OAAO,EAAE,aAAa,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,KAAG,OAMtF,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"/","sources":["layout/filters.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,QAAA,MAAM,cAAc,GAAI,KAAK,OAAO,KAAG,MAAM,GAAG,IAAmE,CAAC;AAEpH;gEACgE;AAChE,QAAA,MAAM,WAAW,GAAI,GAAG,MAAM,GAAG,IAAI,EAAE,GAAG,MAAM,GAAG,IAAI,KAAG,OAMzD,CAAC;AACF,QAAA,MAAM,cAAc,GAAI,GAAG,OAAO,KAAG,OAA+D,CAAC;AAErG;;;;;;;GAOG;AACH,QAAA,MAAM,YAAY,GAAI,WAAW,OAAO,EAAE,aAAa,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,KAAG,OAMtF,CAAC;AAEF;;;;;;;;;GASG;AACH,QAAA,MAAM,mBAAmB,GAAI,SAAS,OAAO,EAAE,aAAa,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,KAAG,OAW3F,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,YAAY,GAAI,MAAM,OAAO,EAAE,OAAO,cAAc,GAAG,SAAS,KAAG,OAYxE,CAAC;AAyBF,eAAO,MAAM,aAAa,SAfhB,OAAO,eACA,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,SACnC,cAAc,GAAG,SAAS,KAClC,OAY2C,CAAC;AAE/C,wFAAwF;AACxF,eAAO,MAAM,eAAe,SAlBlB,OAAO,eACA,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,SACnC,cAAc,GAAG,SAAS,KAClC,OAe6C,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,CAAC"}
|
package/dist/layout/filters.js
CHANGED
|
@@ -30,6 +30,28 @@ const matchesClass = (itemClass, classFilter) => {
|
|
|
30
30
|
return false;
|
|
31
31
|
return classes.some((c) => classEquals(normalizeClass(c), normalized));
|
|
32
32
|
};
|
|
33
|
+
/**
|
|
34
|
+
* Check whether a *live* product's class matches a filter, with the same semantics extracted items
|
|
35
|
+
* get from {@link matchesClass}: case-insensitive, `Ifc` prefix optional, arrays mean any-of.
|
|
36
|
+
*
|
|
37
|
+
* Live products carry a `ModelProductClass` rather than a string, and its `is()` compares with
|
|
38
|
+
* `===`. That rejects `SPACE` and `IFCWALL` — values every other filter in the same template
|
|
39
|
+
* accepts — and its own `Ifc` handling is case-sensitive too (`'IFCWALL'.startsWith('Ifc')` is
|
|
40
|
+
* false). Comparing the class's own `id`/`type` through `matchesClass` keeps product selection
|
|
41
|
+
* identical to the rest of the template rather than subtly stricter.
|
|
42
|
+
*/
|
|
43
|
+
const matchesProductClass = (product, classFilter) => {
|
|
44
|
+
if (classFilter === undefined)
|
|
45
|
+
return true;
|
|
46
|
+
if (!isRecord(product))
|
|
47
|
+
return false;
|
|
48
|
+
const cls = getProp(product, 'class');
|
|
49
|
+
const id = isRecord(cls) ? getProp(cls, 'id') : undefined;
|
|
50
|
+
const type = isRecord(cls) ? getProp(cls, 'type') : undefined;
|
|
51
|
+
return (matchesClass(id, classFilter) ||
|
|
52
|
+
matchesClass(type, classFilter) ||
|
|
53
|
+
matchesClass(getProp(product, 'className'), classFilter));
|
|
54
|
+
};
|
|
33
55
|
/**
|
|
34
56
|
* Check whether an item matches a `where` condition.
|
|
35
57
|
*
|
|
@@ -55,13 +77,13 @@ const matchesWhere = (item, where) => {
|
|
|
55
77
|
return true;
|
|
56
78
|
};
|
|
57
79
|
/**
|
|
58
|
-
*
|
|
80
|
+
* Match items by class + where conditions.
|
|
59
81
|
*
|
|
60
82
|
* @param item - An object with ifcClass and propertySets
|
|
61
83
|
* @param classFilter - IFC class name(s) to match, or undefined for any
|
|
62
84
|
* @param where - Property conditions (short paths), or undefined for no conditions
|
|
63
85
|
*/
|
|
64
|
-
|
|
86
|
+
const matchesFilterImpl = (item, classFilter, where) => {
|
|
65
87
|
if (classFilter !== undefined && isRecord(item)) {
|
|
66
88
|
const itemClass = getProp(item, 'ifcClass');
|
|
67
89
|
const itemClassId = getProp(item, 'ifcClassId');
|
|
@@ -73,5 +95,8 @@ export const matchesV2Filter = (item, classFilter, where) => {
|
|
|
73
95
|
return false;
|
|
74
96
|
return true;
|
|
75
97
|
};
|
|
76
|
-
export
|
|
98
|
+
export const matchesFilter = matchesFilterImpl;
|
|
99
|
+
/** @deprecated Use {@link matchesFilter} — there never was a V1; the name was noise. */
|
|
100
|
+
export const matchesV2Filter = matchesFilterImpl;
|
|
101
|
+
export { normalizeClass, classEquals, normalizeValue, matchesClass, matchesProductClass, matchesWhere };
|
|
77
102
|
//# sourceMappingURL=filters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.js","sourceRoot":"/","sources":["layout/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAIjD,MAAM,cAAc,GAAG,CAAC,GAAY,EAAiB,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAEpH;gEACgE;AAChE,MAAM,WAAW,GAAG,CAAC,CAAgB,EAAE,CAAgB,EAAW,EAAE;IAChE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,iDAAiD;IACjD,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC;AACF,MAAM,cAAc,GAAG,CAAC,CAAU,EAAW,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAErG;;;;;;;GAOG;AACH,MAAM,YAAY,GAAG,CAAC,SAAkB,EAAE,WAA0C,EAAW,EAAE;IAC7F,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,YAAY,GAAG,CAAC,IAAa,EAAE,KAAiC,EAAW,EAAE;IAC/E,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC1E,CAAC;aAAM,CAAC;YACJ,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC,QAAQ,CAAC;gBAAE,OAAO,KAAK,CAAC;QACzE,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,
|
|
1
|
+
{"version":3,"file":"filters.js","sourceRoot":"/","sources":["layout/filters.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolveProperty } from './renderUtils';\n\nimport { isRecord, getProp } from './typeGuards';\n\nimport type { WhereCondition } from './types';\n\nconst normalizeClass = (cls: unknown): string | null => (typeof cls === 'string' ? cls.trim().toLowerCase() : null);\n\n/** Compare two class strings, treating the 'Ifc' prefix as optional.\n * e.g. \"IfcSpace\" matches \"Space\", \"space\", and \"IfcSpace\". */\nconst classEquals = (a: string | null, b: string | null): boolean => {\n if (a === null || b === null) return false;\n if (a === b) return true;\n // Try with/without Ifc prefix in both directions\n const stripIfc = (s: string): string => (s.startsWith('ifc') ? s.slice(3) : s);\n return stripIfc(a) === stripIfc(b);\n};\nconst normalizeValue = (v: unknown): unknown => (typeof v === 'string' ? v.toLowerCase().trim() : v);\n\n/**\n * Check whether an item's ifcClass matches the given class filter.\n *\n * Uses normalizeClass() for string comparison — works for extracted items\n * where we have a normalized ifcClass string (not a live product).\n *\n * For live products, the caller should use product.class.is() directly.\n */\nconst matchesClass = (itemClass: unknown, classFilter: string | string[] | undefined): boolean => {\n if (classFilter === undefined) return true;\n const classes = Array.isArray(classFilter) ? classFilter : [classFilter];\n const normalized = normalizeClass(itemClass);\n if (normalized === null) return false;\n return classes.some((c) => classEquals(normalizeClass(c), normalized));\n};\n\n/**\n * Check whether a *live* product's class matches a filter, with the same semantics extracted items\n * get from {@link matchesClass}: case-insensitive, `Ifc` prefix optional, arrays mean any-of.\n *\n * Live products carry a `ModelProductClass` rather than a string, and its `is()` compares with\n * `===`. That rejects `SPACE` and `IFCWALL` — values every other filter in the same template\n * accepts — and its own `Ifc` handling is case-sensitive too (`'IFCWALL'.startsWith('Ifc')` is\n * false). Comparing the class's own `id`/`type` through `matchesClass` keeps product selection\n * identical to the rest of the template rather than subtly stricter.\n */\nconst matchesProductClass = (product: unknown, classFilter: string | string[] | undefined): boolean => {\n if (classFilter === undefined) return true;\n if (!isRecord(product)) return false;\n const cls = getProp(product, 'class');\n const id = isRecord(cls) ? getProp(cls, 'id') : undefined;\n const type = isRecord(cls) ? getProp(cls, 'type') : undefined;\n return (\n matchesClass(id, classFilter) ||\n matchesClass(type, classFilter) ||\n matchesClass(getProp(product, 'className'), classFilter)\n );\n};\n\n/**\n * Check whether an item matches a `where` condition.\n *\n * Each key in `where` is a short property path (e.g. \"BIP.spacetype\").\n * Each value is either a scalar (equality check) or an array (any-of check).\n * Multiple keys = AND. String comparison is case-insensitive.\n */\nconst matchesWhere = (item: unknown, where: WhereCondition | undefined): boolean => {\n if (!where) return true;\n for (const [path, expected] of Object.entries(where)) {\n const value = resolveProperty(item, path);\n if (Array.isArray(expected)) {\n const target = normalizeValue(value);\n if (!expected.some((v) => normalizeValue(v) === target)) return false;\n } else {\n if (normalizeValue(value) !== normalizeValue(expected)) return false;\n }\n }\n return true;\n};\n\n/**\n * Match items by class + where conditions.\n *\n * @param item - An object with ifcClass and propertySets\n * @param classFilter - IFC class name(s) to match, or undefined for any\n * @param where - Property conditions (short paths), or undefined for no conditions\n */\nconst matchesFilterImpl = (\n item: unknown,\n classFilter: string | string[] | undefined,\n where: WhereCondition | undefined\n): boolean => {\n if (classFilter !== undefined && isRecord(item)) {\n const itemClass = getProp(item, 'ifcClass');\n const itemClassId = getProp(item, 'ifcClassId');\n if (!matchesClass(itemClass, classFilter) && !matchesClass(itemClassId, classFilter)) {\n return false;\n }\n }\n if (!matchesWhere(item, where)) return false;\n return true;\n};\n\nexport const matchesFilter = matchesFilterImpl;\n\n/** @deprecated Use {@link matchesFilter} — there never was a V1; the name was noise. */\nexport const matchesV2Filter = matchesFilterImpl;\n\nexport { normalizeClass, classEquals, normalizeValue, matchesClass, matchesProductClass, matchesWhere };\n"]}
|
package/dist/layout/index.d.ts
CHANGED
|
@@ -1,43 +1,38 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { LayoutTemplate, ModelContext, LayoutData, ValidationIssue, ComputedViewportScale } from './types';
|
|
5
|
-
export type LayoutDataValidationResult = {
|
|
6
|
-
ok: true;
|
|
7
|
-
} | {
|
|
8
|
-
ok: false;
|
|
9
|
-
errors: string[];
|
|
10
|
-
};
|
|
11
|
-
export type PreflightResult = {
|
|
12
|
-
ok: true;
|
|
13
|
-
} | {
|
|
14
|
-
ok: false;
|
|
15
|
-
templateErrors?: ValidationIssue[];
|
|
16
|
-
dataErrors?: string[];
|
|
17
|
-
sectionErrors?: string[];
|
|
18
|
-
};
|
|
1
|
+
import type { LayoutTemplate } from './types';
|
|
2
|
+
export type { PageSpec, TextStyle, StyleMap, ResourceSpec, LayoutElement, BaseElement, ViewportElement, TextElement, ImageElement, LineElement, RectElement, CircleElement, PolylineElement, PolygonElement, PointMm, ScaleBarElement, QrElement, LabelsElement, LegendElement, LegendLineStyle, GroupElement, LayoutTemplate, LegendAnchor, LegendColumn, SvgModelView, ModelContext, LayoutData, LayoutDataViewports, ViewportItemsMap, PagePresetKey, PageOrientation, ValidationOptions, ValidationIssue, ValidationResult, ComputedViewportScale, NormalizedProductItem, SectionStateValidationResult, LabelStyle, WhereCondition, VariableBinding, ClipConfig, HighlightConfig, ViewportLineStyle, ViewportLineStyles, ViewportStairArrowOptions, SectionResult, FillRule, RenderDrawingInput, RenderDrawingResult, IncludeClassesFilter, ResolvedIncludeFilter, TemplateVariableDef, TemplateVariableInfo } from './types';
|
|
3
|
+
export type { RenderLayoutOptions } from './options';
|
|
19
4
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
5
|
+
* High-level facade: renders a complete drawing from a template + section
|
|
6
|
+
* geometry or pre-built models. Start here.
|
|
22
7
|
*/
|
|
23
|
-
export
|
|
8
|
+
export { renderDrawing, resolveFillColor, BUILTIN_LINE_DEFAULTS, BUILTIN_HIDDEN_DEFAULTS, BUILTIN_LABEL_DEFAULTS, CATEGORY_BUILTIN_OVERRIDES } from './renderDrawing';
|
|
9
|
+
export type { ResolvedLineStyles } from './renderDrawing';
|
|
10
|
+
/** Low-level template renderer (prefer {@link renderDrawing}). */
|
|
11
|
+
export { renderLayout, type RenderLayoutResult } from './renderLayout';
|
|
24
12
|
/**
|
|
25
|
-
*
|
|
13
|
+
* Full orchestration: products + template → rendered sheet. Resolves each
|
|
14
|
+
* viewport's section definition, computes SlabSection/plane sections with a
|
|
15
|
+
* def-keyed cache, and renders. The one-call path for template consumers.
|
|
26
16
|
*/
|
|
27
|
-
export
|
|
28
|
-
|
|
29
|
-
export type
|
|
30
|
-
|
|
17
|
+
export { renderTemplateSheet, SectionCache, type RenderTemplateSheetInput, type RenderedTemplateSheet, type ComputedSection } from './renderTemplateSheet';
|
|
18
|
+
/** Pre-render validation: template + layout data + section state in one call. */
|
|
19
|
+
export { preflight, validateLayoutData, type PreflightResult, type LayoutDataValidationResult } from './preflight';
|
|
20
|
+
/** Validate a layout template JSON structure. Returns `{ ok } | { ok: false, errors }`. */
|
|
21
|
+
export { validateLayoutTemplate } from './validation';
|
|
22
|
+
/** @deprecated Use {@link validateLayoutTemplate} — same function, historical alias. */
|
|
23
|
+
export { validateLayoutTemplate as validateLayoutTemplateExternal } from './validation';
|
|
31
24
|
/** Normalize IFC class names to lowercase for consistent matching. */
|
|
32
25
|
export { normalizeClass } from './filters';
|
|
33
26
|
/** Test whether an item matches a class + where filter (used by clip, highlight, labels, legend). */
|
|
34
|
-
export { matchesV2Filter } from './filters';
|
|
27
|
+
export { matchesFilter, matchesV2Filter } from './filters';
|
|
35
28
|
/** Metadata utilities: build lookup maps, resolve IFC class includes, and merge metadata sources. */
|
|
36
29
|
export { buildMetadataMap, normalizePropertySets, resolveIfcClassName, resolveIfcClassId, resolveIncludeClasses, resolveAllowedClasses, resolveMeta } from './metadata';
|
|
37
|
-
/** Validate a layout template JSON structure. Returns `{ ok, errors }` or `{ ok, template }`. */
|
|
38
|
-
export { validateLayoutTemplate as validateLayoutTemplateExternal } from './validation';
|
|
39
30
|
/** Layout utility functions: scale denominators, label sizing, color parsing, and line style application. */
|
|
40
31
|
export { uniquePositiveDenoms, computeLabelFontSize, colorFromString, applyLineStyleToPaths } from './utils';
|
|
32
|
+
/** SlabSection → SvgModelView adapter (per-product rawPaths for gid features) + productEntries builder. */
|
|
33
|
+
export { slabSectionToModelView, slabPerProductToEntries, type SlabPerProductEntry } from './slabModelView';
|
|
34
|
+
/** The template format's per-viewport section contract: one reader/writer for cutHeight/planeNormal/planePosition/depth. */
|
|
35
|
+
export { resolveViewportSection, writeViewportSection, sectionDefKey, isVariableBinding, sectionUsesVariables, DEFAULT_SECTION_DEPTH, type ResolvedSectionDef, type SectionDefaults } from './sectionDefs';
|
|
41
36
|
/** Property resolution: traverse nested objects with dot-path strings like `"BIP.spacename"`. */
|
|
42
37
|
export { getPathValue, resolveProperty, resolvePath, matchesPropertyFilter } from './renderUtils';
|
|
43
38
|
/** Build legend table rows from product items with property formatting. */
|
|
@@ -45,12 +40,6 @@ export { buildLegendRows, type LegendRow, type LegendRowOptions } from './legend
|
|
|
45
40
|
/** Product normalization, viewport item builders, and section-state-to-SVG-model conversion. */
|
|
46
41
|
export type { ProductLike, BuildViewportItemsOptions } from './itemBuilders';
|
|
47
42
|
export { normalizeProductEntry, buildViewportItems, sectionStateToModelView } from './itemBuilders';
|
|
48
|
-
/**
|
|
49
|
-
* High-level facade: renders a complete drawing from a template + section geometry.
|
|
50
|
-
* Internalizes all data wiring (items, colors, labels, metadata) that `renderLayout` requires manually.
|
|
51
|
-
*/
|
|
52
|
-
export { renderDrawing, resolveFillColor, BUILTIN_LINE_DEFAULTS, BUILTIN_HIDDEN_DEFAULTS, BUILTIN_LABEL_DEFAULTS, CATEGORY_BUILTIN_OVERRIDES, setRenderLayoutBinding } from './renderDrawing';
|
|
53
|
-
export type { ResolvedLineStyles } from './renderDrawing';
|
|
54
43
|
export { EXAMPLE_BUILDING_CLASSES } from './presets';
|
|
55
44
|
export { analyzeTemplate } from './analyzeTemplate';
|
|
56
45
|
export type { TemplateRequirements } from './analyzeTemplate';
|
|
@@ -59,28 +48,6 @@ export { exportToPdf, exportToSvg } from './exportDrawing';
|
|
|
59
48
|
export type { ExportPdfOptions, ExportSvgOptions } from './exportDrawing';
|
|
60
49
|
/** Template variable utilities: extract, validate, and resolve template parameters. */
|
|
61
50
|
export { getTemplateVariables, getTemplateDefaults, resolveTemplateValues, applyTemplateVariables } from './templateVariables';
|
|
62
|
-
/** Result of {@link renderLayout}: the final SVG markup, per-viewport scale info, and any warnings. */
|
|
63
|
-
export interface RenderLayoutResult {
|
|
64
|
-
/** Complete SVG markup string ready for embedding or PDF conversion. */
|
|
65
|
-
svg: string;
|
|
66
|
-
/** Per-viewport computed scale information (denominator, mm-per-model-unit, fit status). */
|
|
67
|
-
viewportScales: Record<string, ComputedViewportScale>;
|
|
68
|
-
/** Non-fatal issues encountered during rendering (missing assets, unresolved styles, etc.). */
|
|
69
|
-
warnings: string[];
|
|
70
|
-
}
|
|
71
51
|
/** Built-in default layout template (A3 landscape with a single viewport). */
|
|
72
52
|
export declare const DEFAULT_LAYOUT_TEMPLATE: LayoutTemplate;
|
|
73
|
-
/**
|
|
74
|
-
* Render a layout template to SVG.
|
|
75
|
-
*
|
|
76
|
-
* This is the low-level rendering function. For most use cases, prefer {@link renderDrawing}
|
|
77
|
-
* which handles all data wiring automatically.
|
|
78
|
-
*
|
|
79
|
-
* @param template - Validated layout template (page, elements, styles, presets).
|
|
80
|
-
* @param data - Layout data with viewport items, template variables, and legend rows.
|
|
81
|
-
* @param models - Per-viewport SVG model views (geometry + transforms).
|
|
82
|
-
* @param options - Optional rendering settings (remote assets, scale overrides, metadata).
|
|
83
|
-
* @returns SVG markup string, computed viewport scales, and any warnings.
|
|
84
|
-
*/
|
|
85
|
-
export declare function renderLayout(template: LayoutTemplate, data: LayoutData, models: ModelContext, options?: RenderLayoutOptions): Promise<RenderLayoutResult>;
|
|
86
53
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["layout/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["layout/index.ts"],"names":[],"mappings":"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"}
|