@bldrs-ai/conway 1.389.1221 → 1.394.1504
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 +36 -22
- package/compiled/Dist/ConwayGeomWasmNode.js +0 -0
- package/compiled/Dist/ConwayGeomWasmNodeMT.js +0 -0
- package/compiled/Dist/ConwayGeomWasmWeb.js +0 -0
- package/compiled/Dist/ConwayGeomWasmWebMT.js +1 -1
- package/compiled/Dist/ConwayGeomWasmWebMT.wasm +0 -0
- package/compiled/dependencies/conway-geom/Dist/ConwayGeomWasmNode.js +0 -0
- package/compiled/dependencies/conway-geom/Dist/ConwayGeomWasmNodeMT.js +0 -0
- package/compiled/dependencies/conway-geom/Dist/ConwayGeomWasmWeb.js +0 -0
- package/compiled/dependencies/conway-geom/Dist/ConwayGeomWasmWebMT.js +1 -1
- package/compiled/dependencies/conway-geom/Dist/ConwayGeomWasmWebMT.wasm +0 -0
- package/compiled/dependencies/conway-geom/interface/conway_geometry.d.ts +19 -0
- package/compiled/dependencies/conway-geom/interface/conway_geometry.d.ts.map +1 -1
- package/compiled/dependencies/conway-geom/interface/conway_geometry.js +17 -0
- package/compiled/dependencies/conway-geom/interface/parameters/surface_object.d.ts +6 -0
- package/compiled/dependencies/conway-geom/interface/parameters/surface_object.d.ts.map +1 -1
- package/compiled/examples/browser-bundled.cjs +1569 -51
- package/compiled/examples/cli-bundled.cjs +2790 -436
- package/compiled/examples/cli-step-bundled.cjs +1904 -229
- package/compiled/examples/validator-bundled.cjs +1569 -51
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_curve.gen.d.ts +2 -2
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_curve.gen.d.ts.map +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_curve.gen.js +2 -2
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_surface.gen.d.ts +3 -3
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_surface.gen.d.ts.map +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/b_spline_surface.gen.js +3 -3
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/composite_curve.gen.d.ts +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/composite_curve.gen.d.ts.map +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/composite_curve.gen.js +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_2d.gen.d.ts +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_2d.gen.d.ts.map +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_2d.gen.js +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_3d.gen.d.ts +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_3d.gen.d.ts.map +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_curve_3d.gen.js +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_surface.gen.d.ts +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_surface.gen.d.ts.map +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/offset_surface.gen.js +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/presentation_style_assignment.gen.d.ts.map +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/presentation_style_assignment.gen.js +2 -2
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/schema_ap214.gen.js +11 -11
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/shape_aspect.gen.d.ts +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/shape_aspect.gen.d.ts.map +1 -1
- package/compiled/src/AP214E3_2010/AP214E3_2010_gen/shape_aspect.gen.js +1 -1
- package/compiled/src/AP214E3_2010/ap214_command_line_main.js +7 -3
- package/compiled/src/AP214E3_2010/ap214_geometry_extraction.d.ts +181 -7
- package/compiled/src/AP214E3_2010/ap214_geometry_extraction.d.ts.map +1 -1
- package/compiled/src/AP214E3_2010/ap214_geometry_extraction.js +906 -137
- package/compiled/src/AP214E3_2010/ap214_geometry_extraction.test.js +10 -2
- package/compiled/src/AP214E3_2010/ap214_logical_attribute.test.d.ts +2 -0
- package/compiled/src/AP214E3_2010/ap214_logical_attribute.test.d.ts.map +1 -0
- package/compiled/src/AP214E3_2010/ap214_logical_attribute.test.js +114 -0
- package/compiled/src/AP214E3_2010/ap214_model_geometry.d.ts +6 -0
- package/compiled/src/AP214E3_2010/ap214_model_geometry.d.ts.map +1 -1
- package/compiled/src/AP214E3_2010/ap214_model_geometry.js +9 -0
- package/compiled/src/AP214E3_2010/ap214_pcurve_basis_surfaces.test.d.ts +2 -0
- package/compiled/src/AP214E3_2010/ap214_pcurve_basis_surfaces.test.d.ts.map +1 -0
- package/compiled/src/AP214E3_2010/ap214_pcurve_basis_surfaces.test.js +233 -0
- package/compiled/src/AP214E3_2010/ap214_sphere_vertex_loop.test.d.ts +2 -0
- package/compiled/src/AP214E3_2010/ap214_sphere_vertex_loop.test.d.ts.map +1 -0
- package/compiled/src/AP214E3_2010/ap214_sphere_vertex_loop.test.js +147 -0
- package/compiled/src/AP214E3_2010/ap214_step_model.d.ts +2 -1
- package/compiled/src/AP214E3_2010/ap214_step_model.d.ts.map +1 -1
- package/compiled/src/AP214E3_2010/ap214_step_model.js +1 -1
- package/compiled/src/AP214E3_2010/ap214_typed_select_enum.test.d.ts +2 -0
- package/compiled/src/AP214E3_2010/ap214_typed_select_enum.test.d.ts.map +1 -0
- package/compiled/src/AP214E3_2010/ap214_typed_select_enum.test.js +65 -0
- package/compiled/src/AP214E3_2010/ap214_unit_scale.test.d.ts +2 -0
- package/compiled/src/AP214E3_2010/ap214_unit_scale.test.d.ts.map +1 -0
- package/compiled/src/AP214E3_2010/ap214_unit_scale.test.js +111 -0
- package/compiled/src/compat/web-ifc/ap214_streamed_open.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/ap214_streamed_open.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/ap214_streamed_open.test.js +190 -0
- package/compiled/src/compat/web-ifc/coordination_export_order.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/coordination_export_order.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/coordination_export_order.test.js +110 -0
- package/compiled/src/compat/web-ifc/coordination_f64.d.ts +165 -0
- package/compiled/src/compat/web-ifc/coordination_f64.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/coordination_f64.js +286 -0
- package/compiled/src/compat/web-ifc/coordination_f64.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/coordination_f64.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/coordination_f64.test.js +225 -0
- package/compiled/src/compat/web-ifc/ifc_api.d.ts +154 -0
- package/compiled/src/compat/web-ifc/ifc_api.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api.js +211 -3
- package/compiled/src/compat/web-ifc/ifc_api_deferred_open.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/ifc_api_deferred_open.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/ifc_api_deferred_open.test.js +288 -0
- package/compiled/src/compat/web-ifc/ifc_api_model_passthrough.d.ts +39 -0
- package/compiled/src/compat/web-ifc/ifc_api_model_passthrough.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api_model_passthrough_factory.d.ts +30 -0
- package/compiled/src/compat/web-ifc/ifc_api_model_passthrough_factory.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api_model_passthrough_factory.js +83 -0
- package/compiled/src/compat/web-ifc/ifc_api_preview_channel.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/ifc_api_preview_channel.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/ifc_api_preview_channel.test.js +383 -0
- package/compiled/src/compat/web-ifc/ifc_api_preview_coordination.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/ifc_api_preview_coordination.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/ifc_api_preview_coordination.test.js +124 -0
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ap214.d.ts +132 -0
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ap214.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ap214.js +488 -92
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts +268 -0
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.js +996 -149
- package/compiled/src/compat/web-ifc/ifc_api_streamed_open.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/ifc_api_streamed_open.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/ifc_api_streamed_open.test.js +129 -0
- package/compiled/src/compat/web-ifc/spatial_imposter.d.ts +134 -0
- package/compiled/src/compat/web-ifc/spatial_imposter.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/spatial_imposter.js +933 -0
- package/compiled/src/compat/web-ifc/spatial_imposter.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/spatial_imposter.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/spatial_imposter.test.js +467 -0
- package/compiled/src/compat/web-ifc/store_preview_channel.d.ts +187 -0
- package/compiled/src/compat/web-ifc/store_preview_channel.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/store_preview_channel.js +524 -0
- package/compiled/src/compat/web-ifc/store_preview_channel.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/store_preview_channel.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/store_preview_channel.test.js +234 -0
- package/compiled/src/compat/web-ifc/streamed_preview_channel.d.ts +306 -0
- package/compiled/src/compat/web-ifc/streamed_preview_channel.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/streamed_preview_channel.js +580 -0
- package/compiled/src/compat/web-ifc/web_wasm_directory.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/web_wasm_directory.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/web_wasm_directory.test.js +22 -0
- package/compiled/src/core/composed_model_skeleton.d.ts +63 -0
- package/compiled/src/core/composed_model_skeleton.d.ts.map +1 -0
- package/compiled/src/core/composed_model_skeleton.js +66 -0
- package/compiled/src/core/composed_model_skeleton.test.d.ts +2 -0
- package/compiled/src/core/composed_model_skeleton.test.d.ts.map +1 -0
- package/compiled/src/core/composed_model_skeleton.test.js +69 -0
- package/compiled/src/core/demand_geometry_queue.d.ts +147 -0
- package/compiled/src/core/demand_geometry_queue.d.ts.map +1 -0
- package/compiled/src/core/demand_geometry_queue.js +223 -0
- package/compiled/src/core/demand_geometry_queue.test.d.ts +2 -0
- package/compiled/src/core/demand_geometry_queue.test.d.ts.map +1 -0
- package/compiled/src/core/demand_geometry_queue.test.js +133 -0
- package/compiled/src/core/demand_residency_pump.d.ts +93 -0
- package/compiled/src/core/demand_residency_pump.d.ts.map +1 -0
- package/compiled/src/core/demand_residency_pump.js +120 -0
- package/compiled/src/core/demand_residency_pump.test.d.ts +2 -0
- package/compiled/src/core/demand_residency_pump.test.d.ts.map +1 -0
- package/compiled/src/core/demand_residency_pump.test.js +148 -0
- package/compiled/src/core/geometry_tile_bindings.d.ts +110 -0
- package/compiled/src/core/geometry_tile_bindings.d.ts.map +1 -0
- package/compiled/src/core/geometry_tile_bindings.js +76 -0
- package/compiled/src/core/geometry_tile_bindings.test.d.ts +2 -0
- package/compiled/src/core/geometry_tile_bindings.test.d.ts.map +1 -0
- package/compiled/src/core/geometry_tile_bindings.test.js +211 -0
- package/compiled/src/core/geometry_tile_pool.d.ts +99 -0
- package/compiled/src/core/geometry_tile_pool.d.ts.map +1 -0
- package/compiled/src/core/geometry_tile_pool.js +104 -0
- package/compiled/src/core/geometry_tile_pool.test.d.ts +2 -0
- package/compiled/src/core/geometry_tile_pool.test.d.ts.map +1 -0
- package/compiled/src/core/geometry_tile_pool.test.js +180 -0
- package/compiled/src/core/mem/chunked_pool.d.ts +116 -0
- package/compiled/src/core/mem/chunked_pool.d.ts.map +1 -0
- package/compiled/src/core/mem/chunked_pool.js +149 -0
- package/compiled/src/core/mem/chunked_pool.test.d.ts +2 -0
- package/compiled/src/core/mem/chunked_pool.test.d.ts.map +1 -0
- package/compiled/src/core/mem/chunked_pool.test.js +63 -0
- package/compiled/src/core/mem/shared_asset_pool.d.ts +82 -0
- package/compiled/src/core/mem/shared_asset_pool.d.ts.map +1 -0
- package/compiled/src/core/mem/shared_asset_pool.js +113 -0
- package/compiled/src/core/mem/shared_asset_pool.test.d.ts +2 -0
- package/compiled/src/core/mem/shared_asset_pool.test.d.ts.map +1 -0
- package/compiled/src/core/mem/shared_asset_pool.test.js +49 -0
- package/compiled/src/core/model_registry.d.ts +87 -0
- package/compiled/src/core/model_registry.d.ts.map +1 -0
- package/compiled/src/core/model_registry.js +101 -0
- package/compiled/src/core/model_registry.test.d.ts +2 -0
- package/compiled/src/core/model_registry.test.d.ts.map +1 -0
- package/compiled/src/core/model_registry.test.js +60 -0
- package/compiled/src/core/model_uri.d.ts +57 -0
- package/compiled/src/core/model_uri.d.ts.map +1 -0
- package/compiled/src/core/model_uri.js +101 -0
- package/compiled/src/core/model_uri.test.d.ts +2 -0
- package/compiled/src/core/model_uri.test.d.ts.map +1 -0
- package/compiled/src/core/model_uri.test.js +49 -0
- package/compiled/src/core/progress.d.ts +16 -2
- package/compiled/src/core/progress.d.ts.map +1 -1
- package/compiled/src/core/progress.js +31 -5
- package/compiled/src/core/progress.test.js +11 -2
- package/compiled/src/core/progress_log.d.ts +1 -0
- package/compiled/src/core/progress_log.d.ts.map +1 -1
- package/compiled/src/core/progress_log.js +7 -2
- package/compiled/src/core/progress_log.test.js +21 -0
- package/compiled/src/core/shared_byte_budget.d.ts +60 -0
- package/compiled/src/core/shared_byte_budget.d.ts.map +1 -0
- package/compiled/src/core/shared_byte_budget.js +85 -0
- package/compiled/src/core/shared_byte_budget.test.d.ts +2 -0
- package/compiled/src/core/shared_byte_budget.test.d.ts.map +1 -0
- package/compiled/src/core/shared_byte_budget.test.js +55 -0
- package/compiled/src/core/wasm_heap.d.ts +208 -0
- package/compiled/src/core/wasm_heap.d.ts.map +1 -0
- package/compiled/src/core/wasm_heap.js +417 -0
- package/compiled/src/core/wasm_heap.test.d.ts +2 -0
- package/compiled/src/core/wasm_heap.test.d.ts.map +1 -0
- package/compiled/src/core/wasm_heap.test.js +546 -0
- package/compiled/src/demand/index.d.ts +23 -0
- package/compiled/src/demand/index.d.ts.map +1 -0
- package/compiled/src/demand/index.js +22 -0
- package/compiled/src/ifc/ifc4_gen/IfcLogical.gen.d.ts +1 -1
- package/compiled/src/ifc/ifc4_gen/IfcLogical.gen.d.ts.map +1 -1
- package/compiled/src/ifc/ifc4_gen/IfcLogical.gen.js +1 -1
- package/compiled/src/ifc/ifc4_gen/IfcPresentationStyleAssignment.gen.d.ts.map +1 -1
- package/compiled/src/ifc/ifc4_gen/IfcPresentationStyleAssignment.gen.js +2 -2
- package/compiled/src/ifc/ifc4_gen/IfcRelInterferesElements.gen.d.ts +1 -1
- package/compiled/src/ifc/ifc4_gen/IfcRelInterferesElements.gen.d.ts.map +1 -1
- package/compiled/src/ifc/ifc4_gen/IfcRelInterferesElements.gen.js +1 -1
- package/compiled/src/ifc/ifc4_gen/schema_ifc.gen.js +2 -2
- package/compiled/src/ifc/ifc_demand_extraction.test.d.ts +2 -0
- package/compiled/src/ifc/ifc_demand_extraction.test.d.ts.map +1 -0
- package/compiled/src/ifc/ifc_demand_extraction.test.js +251 -0
- package/compiled/src/ifc/ifc_geometry_extraction.d.ts +367 -6
- package/compiled/src/ifc/ifc_geometry_extraction.d.ts.map +1 -1
- package/compiled/src/ifc/ifc_geometry_extraction.js +1322 -389
- package/compiled/src/ifc/ifc_grid_placement.test.d.ts +2 -0
- package/compiled/src/ifc/ifc_grid_placement.test.d.ts.map +1 -0
- package/compiled/src/ifc/ifc_grid_placement.test.js +261 -0
- package/compiled/src/ifc/ifc_model_geometry.d.ts +12 -0
- package/compiled/src/ifc/ifc_model_geometry.d.ts.map +1 -1
- package/compiled/src/ifc/ifc_model_geometry.js +15 -0
- package/compiled/src/ifc/ifc_regression_batch_main.js +210 -12
- package/compiled/src/ifc/ifc_spatial_skeleton.d.ts +145 -0
- package/compiled/src/ifc/ifc_spatial_skeleton.d.ts.map +1 -0
- package/compiled/src/ifc/ifc_spatial_skeleton.js +266 -0
- package/compiled/src/ifc/ifc_spatial_skeleton.test.d.ts +2 -0
- package/compiled/src/ifc/ifc_spatial_skeleton.test.d.ts.map +1 -0
- package/compiled/src/ifc/ifc_spatial_skeleton.test.js +199 -0
- package/compiled/src/ifc/ifc_step_model.d.ts +6 -2
- package/compiled/src/ifc/ifc_step_model.d.ts.map +1 -1
- package/compiled/src/ifc/ifc_step_model.js +6 -4
- package/compiled/src/ifc/ifc_step_parser.d.ts +58 -0
- package/compiled/src/ifc/ifc_step_parser.d.ts.map +1 -1
- package/compiled/src/ifc/ifc_step_parser.js +64 -0
- package/compiled/src/ifc/ifc_stream_model.test.d.ts +2 -0
- package/compiled/src/ifc/ifc_stream_model.test.d.ts.map +1 -0
- package/compiled/src/ifc/ifc_stream_model.test.js +70 -0
- package/compiled/src/ifc/ifc_stream_open.d.ts +131 -0
- package/compiled/src/ifc/ifc_stream_open.d.ts.map +1 -0
- package/compiled/src/ifc/ifc_stream_open.js +116 -0
- package/compiled/src/ifc/ifc_stream_open.test.d.ts +2 -0
- package/compiled/src/ifc/ifc_stream_open.test.d.ts.map +1 -0
- package/compiled/src/ifc/ifc_stream_open.test.js +230 -0
- package/compiled/src/ifc/ifc_tile_extractor.d.ts +84 -0
- package/compiled/src/ifc/ifc_tile_extractor.d.ts.map +1 -0
- package/compiled/src/ifc/ifc_tile_extractor.js +134 -0
- package/compiled/src/ifc/ifc_tile_extractor.test.d.ts +2 -0
- package/compiled/src/ifc/ifc_tile_extractor.test.d.ts.map +1 -0
- package/compiled/src/ifc/ifc_tile_extractor.test.js +118 -0
- package/compiled/src/ifc/ifc_typed_select_enum.test.d.ts +2 -0
- package/compiled/src/ifc/ifc_typed_select_enum.test.d.ts.map +1 -0
- package/compiled/src/ifc/ifc_typed_select_enum.test.js +60 -0
- package/compiled/src/index.d.ts +21 -1
- package/compiled/src/index.d.ts.map +1 -1
- package/compiled/src/index.js +28 -1
- package/compiled/src/logging/logger.d.ts +16 -2
- package/compiled/src/logging/logger.d.ts.map +1 -1
- package/compiled/src/logging/logger.js +34 -7
- package/compiled/src/logging/logger.test.js +30 -0
- package/compiled/src/mem/index.d.ts +17 -0
- package/compiled/src/mem/index.d.ts.map +1 -0
- package/compiled/src/mem/index.js +16 -0
- package/compiled/src/namespace_surface.test.d.ts +2 -0
- package/compiled/src/namespace_surface.test.d.ts.map +1 -0
- package/compiled/src/namespace_surface.test.js +43 -0
- package/compiled/src/parsing/parsing_buffer.d.ts +23 -0
- package/compiled/src/parsing/parsing_buffer.d.ts.map +1 -1
- package/compiled/src/parsing/parsing_buffer.js +31 -0
- package/compiled/src/scripts/model_report_displacement.test.d.ts +2 -0
- package/compiled/src/scripts/model_report_displacement.test.d.ts.map +1 -0
- package/compiled/src/scripts/model_report_displacement.test.js +104 -0
- package/compiled/src/scripts/render_glb_paths.test.d.ts +2 -0
- package/compiled/src/scripts/render_glb_paths.test.d.ts.map +1 -0
- package/compiled/src/scripts/render_glb_paths.test.js +115 -0
- package/compiled/src/step/indexing/step_type_indexer.d.ts +20 -0
- package/compiled/src/step/indexing/step_type_indexer.d.ts.map +1 -1
- package/compiled/src/step/indexing/step_type_indexer.js +67 -0
- package/compiled/src/step/parsing/byte_source.d.ts +153 -0
- package/compiled/src/step/parsing/byte_source.d.ts.map +1 -0
- package/compiled/src/step/parsing/byte_source.js +106 -0
- package/compiled/src/step/parsing/byte_source.test.d.ts +2 -0
- package/compiled/src/step/parsing/byte_source.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/byte_source.test.js +47 -0
- package/compiled/src/step/parsing/byte_source_node.d.ts +41 -0
- package/compiled/src/step/parsing/byte_source_node.d.ts.map +1 -0
- package/compiled/src/step/parsing/byte_source_node.js +54 -0
- package/compiled/src/step/parsing/columnar_index.d.ts +103 -0
- package/compiled/src/step/parsing/columnar_index.d.ts.map +1 -0
- package/compiled/src/step/parsing/columnar_index.js +224 -0
- package/compiled/src/step/parsing/columnar_index.test.d.ts +2 -0
- package/compiled/src/step/parsing/columnar_index.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/columnar_index.test.js +155 -0
- package/compiled/src/step/parsing/cross_reference_registry.d.ts +95 -0
- package/compiled/src/step/parsing/cross_reference_registry.d.ts.map +1 -0
- package/compiled/src/step/parsing/cross_reference_registry.js +91 -0
- package/compiled/src/step/parsing/cross_reference_registry.test.d.ts +2 -0
- package/compiled/src/step/parsing/cross_reference_registry.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/cross_reference_registry.test.js +66 -0
- package/compiled/src/step/parsing/decode_utf8.d.ts +15 -0
- package/compiled/src/step/parsing/decode_utf8.d.ts.map +1 -1
- package/compiled/src/step/parsing/decode_utf8.js +28 -0
- package/compiled/src/step/parsing/express_ref_scan.d.ts +20 -0
- package/compiled/src/step/parsing/express_ref_scan.d.ts.map +1 -0
- package/compiled/src/step/parsing/express_ref_scan.js +91 -0
- package/compiled/src/step/parsing/express_ref_scan.test.d.ts +2 -0
- package/compiled/src/step/parsing/express_ref_scan.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/express_ref_scan.test.js +28 -0
- package/compiled/src/step/parsing/index_sidecar.d.ts +81 -0
- package/compiled/src/step/parsing/index_sidecar.d.ts.map +1 -0
- package/compiled/src/step/parsing/index_sidecar.js +283 -0
- package/compiled/src/step/parsing/index_sidecar.test.d.ts +2 -0
- package/compiled/src/step/parsing/index_sidecar.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/index_sidecar.test.js +122 -0
- package/compiled/src/step/parsing/inf_recovery_index.test.d.ts +2 -0
- package/compiled/src/step/parsing/inf_recovery_index.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/inf_recovery_index.test.js +108 -0
- package/compiled/src/step/parsing/prefix_type_index.d.ts +124 -0
- package/compiled/src/step/parsing/prefix_type_index.d.ts.map +1 -0
- package/compiled/src/step/parsing/prefix_type_index.js +207 -0
- package/compiled/src/step/parsing/prefix_type_index.test.d.ts +2 -0
- package/compiled/src/step/parsing/prefix_type_index.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/prefix_type_index.test.js +298 -0
- package/compiled/src/step/parsing/range_byte_source.d.ts +69 -0
- package/compiled/src/step/parsing/range_byte_source.d.ts.map +1 -0
- package/compiled/src/step/parsing/range_byte_source.js +78 -0
- package/compiled/src/step/parsing/range_byte_source.test.d.ts +2 -0
- package/compiled/src/step/parsing/range_byte_source.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/range_byte_source.test.js +70 -0
- package/compiled/src/step/parsing/record_event.d.ts +23 -0
- package/compiled/src/step/parsing/record_event.d.ts.map +1 -0
- package/compiled/src/step/parsing/record_event.js +1 -0
- package/compiled/src/step/parsing/record_field_cursor.d.ts +94 -0
- package/compiled/src/step/parsing/record_field_cursor.d.ts.map +1 -0
- package/compiled/src/step/parsing/record_field_cursor.js +189 -0
- package/compiled/src/step/parsing/step_deserialization_functions.d.ts +29 -0
- package/compiled/src/step/parsing/step_deserialization_functions.d.ts.map +1 -1
- package/compiled/src/step/parsing/step_deserialization_functions.js +45 -0
- package/compiled/src/step/parsing/step_deserialization_functions.test.js +59 -1
- package/compiled/src/step/parsing/step_parser.d.ts +66 -1
- package/compiled/src/step/parsing/step_parser.d.ts.map +1 -1
- package/compiled/src/step/parsing/step_parser.js +164 -10
- package/compiled/src/step/parsing/step_string_parser.js +8 -8
- package/compiled/src/step/parsing/streaming_index_builder.d.ts +141 -0
- package/compiled/src/step/parsing/streaming_index_builder.d.ts.map +1 -0
- package/compiled/src/step/parsing/streaming_index_builder.js +280 -0
- package/compiled/src/step/parsing/streaming_index_builder.test.d.ts +2 -0
- package/compiled/src/step/parsing/streaming_index_builder.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/streaming_index_builder.test.js +107 -0
- package/compiled/src/step/parsing/streaming_index_builder_async.test.d.ts +2 -0
- package/compiled/src/step/parsing/streaming_index_builder_async.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/streaming_index_builder_async.test.js +109 -0
- package/compiled/src/step/parsing/streaming_record_dispatcher.d.ts +71 -0
- package/compiled/src/step/parsing/streaming_record_dispatcher.d.ts.map +1 -0
- package/compiled/src/step/parsing/streaming_record_dispatcher.js +88 -0
- package/compiled/src/step/parsing/streaming_record_dispatcher.test.d.ts +2 -0
- package/compiled/src/step/parsing/streaming_record_dispatcher.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/streaming_record_dispatcher.test.js +66 -0
- package/compiled/src/step/parsing/uint32_sink.d.ts +72 -0
- package/compiled/src/step/parsing/uint32_sink.d.ts.map +1 -0
- package/compiled/src/step/parsing/uint32_sink.js +180 -0
- package/compiled/src/step/parsing/uint32_sink.test.d.ts +2 -0
- package/compiled/src/step/parsing/uint32_sink.test.d.ts.map +1 -0
- package/compiled/src/step/parsing/uint32_sink.test.js +199 -0
- package/compiled/src/step/step_buffer_provider.d.ts +48 -3
- package/compiled/src/step/step_buffer_provider.d.ts.map +1 -1
- package/compiled/src/step/step_buffer_provider.js +60 -11
- package/compiled/src/step/step_buffer_provider.test.js +14 -0
- package/compiled/src/step/step_entity_base.d.ts +65 -3
- package/compiled/src/step/step_entity_base.d.ts.map +1 -1
- package/compiled/src/step/step_entity_base.js +135 -3
- package/compiled/src/step/step_model_base.d.ts +221 -8
- package/compiled/src/step/step_model_base.d.ts.map +1 -1
- package/compiled/src/step/step_model_base.js +542 -7
- package/compiled/src/stream/index.d.ts +34 -0
- package/compiled/src/stream/index.d.ts.map +1 -0
- package/compiled/src/stream/index.js +32 -0
- package/compiled/src/version/version.js +1 -1
- package/compiled/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spatial_imposter.test.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/spatial_imposter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
/* eslint-disable no-magic-numbers */
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import { describe, expect, test } from "@jest/globals";
|
|
4
|
+
import { openStreamedIfcModelFromStore } from "../../ifc/ifc_stream_open.js";
|
|
5
|
+
import { InMemoryStepByteStore } from "../../step/step_buffer_provider.js";
|
|
6
|
+
import EntityTypesIfc from "../../ifc/ifc4_gen/entity_types_ifc.gen.js";
|
|
7
|
+
import { deriveCoordinationF64, mat4MultiplyF64, NORMALIZE_MAT_F64, } from "./coordination_f64.js";
|
|
8
|
+
import { aabbBoxMatrix, aabbMostlyEqual, emitSpatialStructureImposters, shouldEmitSpatialNode, spatialImposterDepthCap, SPATIAL_IMPOSTER_COLOR, unionAabb, } from "./spatial_imposter.js";
|
|
9
|
+
/**
|
|
10
|
+
* The axes an IfcAxis2Placement3D needs to state a rotation, as
|
|
11
|
+
* `[Axis (local +Z), RefDirection (local +X)]`.
|
|
12
|
+
*
|
|
13
|
+
* @param rotation The fixture's rotation knob.
|
|
14
|
+
* @return {PlacementAxes | undefined} The two direction ratios, or
|
|
15
|
+
* undefined for no rotation.
|
|
16
|
+
*/
|
|
17
|
+
function rotationAxes(rotation) {
|
|
18
|
+
if (rotation === void 0) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const radians = rotation.degrees * Math.PI / 180;
|
|
22
|
+
const cos = Math.cos(radians);
|
|
23
|
+
const sin = Math.sin(radians);
|
|
24
|
+
// Columns of the rotation matrix: Axis is its third (local +Z),
|
|
25
|
+
// RefDirection its first (local +X).
|
|
26
|
+
return rotation.axis === "z" ?
|
|
27
|
+
[[0, 0, 1], [cos, sin, 0]] :
|
|
28
|
+
[[0, -sin, cos], [1, 0, 0]];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Transform a point by the fixture's site rotation — what the composed
|
|
32
|
+
* placement chain must reproduce.
|
|
33
|
+
*
|
|
34
|
+
* @param rotation The fixture's rotation knob.
|
|
35
|
+
* @param point A point in the site's local frame.
|
|
36
|
+
* @return {[number, number, number]} The rotated point.
|
|
37
|
+
*/
|
|
38
|
+
function rotatePoint(rotation, point) {
|
|
39
|
+
if (rotation === void 0) {
|
|
40
|
+
return point;
|
|
41
|
+
}
|
|
42
|
+
const radians = rotation.degrees * Math.PI / 180;
|
|
43
|
+
const cos = Math.cos(radians);
|
|
44
|
+
const sin = Math.sin(radians);
|
|
45
|
+
const [x, y, z] = point;
|
|
46
|
+
return rotation.axis === "z" ?
|
|
47
|
+
[x * cos - y * sin, x * sin + y * cos, z] :
|
|
48
|
+
[x, y * cos - z * sin, y * sin + z * cos];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A minimal but schema-valid IFC4 spatial structure —
|
|
52
|
+
* Project/Site/Building/2 Storeys, two placed walls contained in each
|
|
53
|
+
* storey — with every placement and elevation a caller-chosen number.
|
|
54
|
+
* Carries no units and no geometry: the imposter walk reads placement
|
|
55
|
+
* chains only, and takes its scaling factor as an argument.
|
|
56
|
+
*
|
|
57
|
+
* @param fixture Placement/elevation knobs.
|
|
58
|
+
* @return {Uint8Array} The file bytes.
|
|
59
|
+
*/
|
|
60
|
+
function syntheticSpatialIfc(fixture) {
|
|
61
|
+
const lines = [];
|
|
62
|
+
let next = 1;
|
|
63
|
+
const push = (body) => {
|
|
64
|
+
const id = next++;
|
|
65
|
+
lines.push(`#${id}=${body};`);
|
|
66
|
+
return id;
|
|
67
|
+
};
|
|
68
|
+
const num = (value) => value.toFixed(4);
|
|
69
|
+
const guid = (seed) => `3vB2${String(seed).padStart(18, "0")}`;
|
|
70
|
+
// Direction ratios get more decimals than `num`'s four: they are
|
|
71
|
+
// trigonometric, and rounding cos(30 deg) at four places moves a
|
|
72
|
+
// sampled origin by ~1e-4 source units — enough to break assertions
|
|
73
|
+
// that compare a composed plate against the same rotation applied in
|
|
74
|
+
// double precision.
|
|
75
|
+
const direction = (ratios) => push(`IFCDIRECTION((${ratios.map((r) => r.toFixed(12)).join(",")}))`);
|
|
76
|
+
const ref = (ratios) => ratios !== void 0 ? `#${direction(ratios)}` : "$";
|
|
77
|
+
const placement = (relTo, x, y, z, axes, twoDimensional = false) => {
|
|
78
|
+
// A 2D placement's Location is a 2D point, and its only direction
|
|
79
|
+
// field is RefDirection — there is no Axis to state.
|
|
80
|
+
const point = twoDimensional ?
|
|
81
|
+
push(`IFCCARTESIANPOINT((${num(x)},${num(y)}))`) :
|
|
82
|
+
push(`IFCCARTESIANPOINT((${num(x)},${num(y)},${num(z)}))`);
|
|
83
|
+
const axis = twoDimensional ?
|
|
84
|
+
push(`IFCAXIS2PLACEMENT2D(#${point},$)`) :
|
|
85
|
+
push(`IFCAXIS2PLACEMENT3D(#${point},` +
|
|
86
|
+
`${ref(axes?.[0])},${ref(axes?.[1])})`);
|
|
87
|
+
return push(`IFCLOCALPLACEMENT(${relTo === void 0 ? "$" : `#${relTo}`},#${axis})`);
|
|
88
|
+
};
|
|
89
|
+
const sitePlacement = placement(void 0, ...fixture.siteOrigin, fixture.siteAxes ?? rotationAxes(fixture.siteRotation), fixture.sitePlacement2D === true);
|
|
90
|
+
const buildingPlacement = placement(sitePlacement, 0, 0, fixture.buildingZ);
|
|
91
|
+
const project = push(`IFCPROJECT('${guid(1)}',$,'P',$,$,$,$,$,$)`);
|
|
92
|
+
const site = push(`IFCSITE('${guid(2)}',$,'S',$,$,#${sitePlacement},$,$,.ELEMENT.,$,$,$,$,$)`);
|
|
93
|
+
const building = push(`IFCBUILDING('${guid(3)}',$,'B',$,$,#${buildingPlacement},$,$,.ELEMENT.,$,$,$)`);
|
|
94
|
+
const storeys = fixture.storeyElevations.map((elevation, index) => {
|
|
95
|
+
// Under the default the storey's own placement carries the same
|
|
96
|
+
// offset from the building datum that Elevation states — the
|
|
97
|
+
// ordinary authoring — so the two only disagree once the BUILDING is
|
|
98
|
+
// off world zero. Under 'datum' the placement says nothing and
|
|
99
|
+
// Elevation is the only record of the height.
|
|
100
|
+
const storeyPlacement = placement(buildingPlacement, 0, 0, fixture.storeyPlacementZ === "datum" ? 0 : elevation);
|
|
101
|
+
return push(`IFCBUILDINGSTOREY('${guid(10 + index)}',$,'L${index}',$,$,` +
|
|
102
|
+
`#${storeyPlacement},$,$,.ELEMENT.,${num(elevation)})`);
|
|
103
|
+
});
|
|
104
|
+
push(`IFCRELAGGREGATES('${guid(20)}',$,$,$,#${project},(#${site}))`);
|
|
105
|
+
push(`IFCRELAGGREGATES('${guid(21)}',$,$,$,#${site},(#${building}))`);
|
|
106
|
+
push(`IFCRELAGGREGATES('${guid(22)}',$,$,$,#${building},` +
|
|
107
|
+
`(${storeys.map((id) => `#${id}`).join(",")}))`);
|
|
108
|
+
storeys.forEach((storey, index) => {
|
|
109
|
+
const storeyPlacement = storey - 1;
|
|
110
|
+
// Whatever the storey placement does not say about the height, the
|
|
111
|
+
// contained walls have to say themselves — otherwise every storey's
|
|
112
|
+
// contents would pile up at the building datum, which is not a file
|
|
113
|
+
// any exporter produces.
|
|
114
|
+
const wallZ = fixture.storeyPlacementZ === "datum" ?
|
|
115
|
+
fixture.storeyElevations[index] : 0;
|
|
116
|
+
const wallA = push(`IFCWALL('${guid(30 + index * 2)}',$,$,$,$,` +
|
|
117
|
+
`#${placement(storeyPlacement, 0, 0, wallZ)},$,$,$)`);
|
|
118
|
+
const wallB = push(`IFCWALL('${guid(31 + index * 2)}',$,$,$,$,` +
|
|
119
|
+
`#${placement(storeyPlacement, ...fixture.wallOffset, wallZ)},$,$,$)`);
|
|
120
|
+
push(`IFCRELCONTAINEDINSPATIALSTRUCTURE('${guid(40 + index)}',$,$,$,` +
|
|
121
|
+
`(#${wallA},#${wallB}),#${storey})`);
|
|
122
|
+
});
|
|
123
|
+
const text = "ISO-10303-21;\n" +
|
|
124
|
+
"HEADER;\n" +
|
|
125
|
+
"FILE_DESCRIPTION((''),'2;1');\n" +
|
|
126
|
+
"FILE_NAME('synthetic.ifc','2026-01-01T00:00:00',(''),(''),'','','');\n" +
|
|
127
|
+
"FILE_SCHEMA(('IFC4'));\n" +
|
|
128
|
+
"ENDSEC;\n" +
|
|
129
|
+
"DATA;\n" +
|
|
130
|
+
`${lines.join("\n")}\n` +
|
|
131
|
+
"ENDSEC;\n" +
|
|
132
|
+
"END-ISO-10303-21;\n";
|
|
133
|
+
return new TextEncoder().encode(text);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Emit imposters for a synthetic fixture.
|
|
137
|
+
*
|
|
138
|
+
* @param fixture Placement/elevation knobs.
|
|
139
|
+
* @param linearScalingFactor Source units -> metres.
|
|
140
|
+
* @param coordinationMatrix Latched preview frame, or undefined to
|
|
141
|
+
* exercise the walk's own fallback derivation.
|
|
142
|
+
* @return {Promise<[PreviewMeshPayload[], IfcStepModel]>} Payloads and model.
|
|
143
|
+
*/
|
|
144
|
+
async function emitForFixture(fixture, linearScalingFactor, coordinationMatrix) {
|
|
145
|
+
const open = await openStreamedIfcModelFromStore(new InMemoryStepByteStore(syntheticSpatialIfc(fixture)), { pool: 4 * 1024 });
|
|
146
|
+
expect(open.model).toBeDefined();
|
|
147
|
+
const payloads = [];
|
|
148
|
+
await emitSpatialStructureImposters(open.model, (mesh) => payloads.push(mesh), coordinationMatrix, linearScalingFactor);
|
|
149
|
+
expect(payloads.length).toBeGreaterThan(0);
|
|
150
|
+
return [payloads, open.model];
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* @param payloads Emitted imposters.
|
|
154
|
+
* @param model The model they came from.
|
|
155
|
+
* @return {PreviewMeshPayload[]} Only the IfcBuildingStorey plates,
|
|
156
|
+
* ordered bottom-up.
|
|
157
|
+
*/
|
|
158
|
+
function storeyPlates(payloads, model) {
|
|
159
|
+
return payloads
|
|
160
|
+
.filter((payload) => model.typeIDOf(model.resolveExpressID(payload.expressID)) ===
|
|
161
|
+
EntityTypesIfc.IFCBUILDINGSTOREY)
|
|
162
|
+
.sort((a, b) => a.aabb.min[2] - b.aabb.min[2]);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* @param actual A 16-element matrix.
|
|
166
|
+
* @param expected A 16-element matrix.
|
|
167
|
+
* @param digits Decimal places (jest's toBeCloseTo semantics).
|
|
168
|
+
*/
|
|
169
|
+
function expectMatrixClose(actual, expected, digits = 6) {
|
|
170
|
+
expect(actual).toHaveLength(16);
|
|
171
|
+
for (let where = 0; where < 16; ++where) {
|
|
172
|
+
expect(actual[where]).toBeCloseTo(expected[where], digits);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
describe("spatial_imposter policy", () => {
|
|
176
|
+
test("depth cap is half the tree, rounded up", () => {
|
|
177
|
+
expect(spatialImposterDepthCap(0)).toBe(0);
|
|
178
|
+
expect(spatialImposterDepthCap(1)).toBe(1);
|
|
179
|
+
expect(spatialImposterDepthCap(4)).toBe(2);
|
|
180
|
+
expect(spatialImposterDepthCap(5)).toBe(3);
|
|
181
|
+
});
|
|
182
|
+
test("never emits spaces; always emits storeys; half-depth otherwise", () => {
|
|
183
|
+
expect(shouldEmitSpatialNode(4, 4, EntityTypesIfc.IFCSPACE)).toBe(false);
|
|
184
|
+
expect(shouldEmitSpatialNode(3, 4, EntityTypesIfc.IFCBUILDINGSTOREY)).toBe(true);
|
|
185
|
+
expect(shouldEmitSpatialNode(2, 4, EntityTypesIfc.IFCBUILDING)).toBe(true);
|
|
186
|
+
expect(shouldEmitSpatialNode(3, 4, EntityTypesIfc.IFCBUILDING)).toBe(false);
|
|
187
|
+
expect(shouldEmitSpatialNode(0, 4, EntityTypesIfc.IFCPROJECT)).toBe(true);
|
|
188
|
+
});
|
|
189
|
+
test("unionAabb and aabbMostlyEqual", () => {
|
|
190
|
+
const a = { min: [0, 0, 0], max: [10, 10, 4] };
|
|
191
|
+
const b = { min: [8, 8, 0], max: [12, 12, 4] };
|
|
192
|
+
const u = unionAabb(a, b);
|
|
193
|
+
expect(u.min).toEqual([0, 0, 0]);
|
|
194
|
+
expect(u.max).toEqual([12, 12, 4]);
|
|
195
|
+
expect(aabbMostlyEqual(a, a)).toBe(true);
|
|
196
|
+
expect(aabbMostlyEqual(a, b)).toBe(false);
|
|
197
|
+
});
|
|
198
|
+
test("imposter colour is black at 0.3 opacity", () => {
|
|
199
|
+
expect(SPATIAL_IMPOSTER_COLOR).toEqual({ x: 0, y: 0, z: 0, w: 0.3 });
|
|
200
|
+
});
|
|
201
|
+
test("aabbBoxMatrix stays in raw IFC space \u2014 no axis flip", () => {
|
|
202
|
+
const matrix = aabbBoxMatrix({ min: [0, 0, 0], max: [2, 4, 6] });
|
|
203
|
+
// translate(centre) * scale(size), column-major, Z-up preserved.
|
|
204
|
+
expect(matrix).toEqual([
|
|
205
|
+
2,
|
|
206
|
+
0,
|
|
207
|
+
0,
|
|
208
|
+
0,
|
|
209
|
+
0,
|
|
210
|
+
4,
|
|
211
|
+
0,
|
|
212
|
+
0,
|
|
213
|
+
0,
|
|
214
|
+
0,
|
|
215
|
+
6,
|
|
216
|
+
0,
|
|
217
|
+
1,
|
|
218
|
+
2,
|
|
219
|
+
3,
|
|
220
|
+
1,
|
|
221
|
+
]);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
describe("emitSpatialStructureImposters", () => {
|
|
225
|
+
test("index.ifc emits storey-scale wireframe boxes, not spaces", async () => {
|
|
226
|
+
const bytes = new Uint8Array(fs.readFileSync("data/index.ifc"));
|
|
227
|
+
const open = await openStreamedIfcModelFromStore(new InMemoryStepByteStore(bytes), { pool: 4 * 1024 });
|
|
228
|
+
const payloads = [];
|
|
229
|
+
const emitted = await emitSpatialStructureImposters(open.model, (mesh) => payloads.push(mesh));
|
|
230
|
+
expect(emitted).toBeGreaterThan(0);
|
|
231
|
+
expect(payloads).toHaveLength(emitted);
|
|
232
|
+
for (const payload of payloads) {
|
|
233
|
+
// Wireframe by request — `solid` stays in the payload contract but
|
|
234
|
+
// nothing sets it any more.
|
|
235
|
+
expect(payload.solid).toBeUndefined();
|
|
236
|
+
expect("solid" in payload).toBe(false);
|
|
237
|
+
expect(payload.aabb).toBeDefined();
|
|
238
|
+
expect(payload.geometryExpressID).toBe(-1);
|
|
239
|
+
expect(payload.color).toEqual(SPATIAL_IMPOSTER_COLOR);
|
|
240
|
+
expect(payload.flatTransformation).toHaveLength(16);
|
|
241
|
+
}
|
|
242
|
+
const types = new Set(payloads.map((p) => open.model.typeIDOf(open.model.resolveExpressID(p.expressID))));
|
|
243
|
+
expect(types.has(EntityTypesIfc.IFCSPACE)).toBe(false);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
// conway#515: the plates used to be emitted in raw source units with a
|
|
247
|
+
// locally baked Z-up -> Y-up flip and no coordination at all, so on a
|
|
248
|
+
// millimetre model they came out 1000x oversized and on a georeferenced
|
|
249
|
+
// one they sat a site-offset away from the meshes they were previewing.
|
|
250
|
+
describe("emitSpatialStructureImposters coordination frame", () => {
|
|
251
|
+
/** Millimetres, 50km east / 30km north — well past the recentre budget. */
|
|
252
|
+
const MILLIMETRE_GEOREFERENCED = {
|
|
253
|
+
siteOrigin: [50000000, 30000000, 0],
|
|
254
|
+
buildingZ: 0,
|
|
255
|
+
storeyElevations: [0, 3000],
|
|
256
|
+
wallOffset: [8000, 6000],
|
|
257
|
+
};
|
|
258
|
+
const MM_TO_M = 0.001;
|
|
259
|
+
test("millimetre georeferenced plates compose under the latched frame", async () => {
|
|
260
|
+
// What the preview channel latches from a first geometry sitting on
|
|
261
|
+
// the site origin: identity placement, that point as the anchor.
|
|
262
|
+
const coordination = deriveCoordinationF64(void 0, { x: 50000000, y: 30000000, z: 0 }, NORMALIZE_MAT_F64, MM_TO_M);
|
|
263
|
+
const [payloads] = await emitForFixture(MILLIMETRE_GEOREFERENCED, MM_TO_M, coordination);
|
|
264
|
+
for (const payload of payloads) {
|
|
265
|
+
expectMatrixClose(payload.flatTransformation, mat4MultiplyF64(coordination, aabbBoxMatrix(payload.aabb)));
|
|
266
|
+
// In metres and near the origin, not 5e7 source units out.
|
|
267
|
+
expect(Math.abs(payload.flatTransformation[12])).toBeLessThan(100);
|
|
268
|
+
expect(Math.abs(payload.flatTransformation[13])).toBeLessThan(100);
|
|
269
|
+
expect(Math.abs(payload.flatTransformation[14])).toBeLessThan(100);
|
|
270
|
+
// Scale columns are metres too — the mm-oversize bug put these at
|
|
271
|
+
// 8000 x 6000 rather than 8 x 6.
|
|
272
|
+
for (let column = 0; column < 3; ++column) {
|
|
273
|
+
expect(Math.hypot(payload.flatTransformation[column * 4], payload.flatTransformation[column * 4 + 1], payload.flatTransformation[column * 4 + 2])).toBeLessThan(100);
|
|
274
|
+
}
|
|
275
|
+
// The reported box stays in raw IFC space for the consumer.
|
|
276
|
+
expect(payload.aabb.min[0]).toBeGreaterThan(10000000);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
test("no latched frame: the fallback derivation recentres the same way", async () => {
|
|
280
|
+
const [payloads] = await emitForFixture(MILLIMETRE_GEOREFERENCED, MM_TO_M);
|
|
281
|
+
// Anchored on the spatial root's centre rather than a first
|
|
282
|
+
// geometry, but the same quantized policy: the 1km grid (1e6 source
|
|
283
|
+
// units here) puts the model back within a cell of the origin.
|
|
284
|
+
for (const payload of payloads) {
|
|
285
|
+
expect(Math.hypot(payload.flatTransformation[12], payload.flatTransformation[13], payload.flatTransformation[14])).toBeLessThan(1000);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
test("near-origin metres model is not recentred (model-zero policy)", async () => {
|
|
289
|
+
const [payloads] = await emitForFixture({
|
|
290
|
+
siteOrigin: [10, 20, 0],
|
|
291
|
+
buildingZ: 0,
|
|
292
|
+
storeyElevations: [0, 3.5],
|
|
293
|
+
wallOffset: [8, 6],
|
|
294
|
+
}, 1);
|
|
295
|
+
for (const payload of payloads) {
|
|
296
|
+
// Inside LARGE_COORDINATE_BUDGET_M the policy recentres nothing,
|
|
297
|
+
// so the whole frame collapses to the Z-up -> Y-up normalize —
|
|
298
|
+
// which is exactly where the durable walk would put these.
|
|
299
|
+
expectMatrixClose(payload.flatTransformation, mat4MultiplyF64(NORMALIZE_MAT_F64, aabbBoxMatrix(payload.aabb)));
|
|
300
|
+
const centreX = (payload.aabb.min[0] + payload.aabb.max[0]) * 0.5;
|
|
301
|
+
expect(payload.flatTransformation[12]).toBeCloseTo(centreX, 9);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
test("storey plates band on the building datum, not on bare elevation", async () => {
|
|
305
|
+
// Building datum 100m above world zero: Elevation says 0 and
|
|
306
|
+
// 3.5, but the plates belong at 100 and 103.5.
|
|
307
|
+
const [payloads, model] = await emitForFixture({
|
|
308
|
+
siteOrigin: [0, 0, 0],
|
|
309
|
+
buildingZ: 100,
|
|
310
|
+
storeyElevations: [0, 3.5],
|
|
311
|
+
wallOffset: [8, 6],
|
|
312
|
+
}, 1);
|
|
313
|
+
const plates = storeyPlates(payloads, model);
|
|
314
|
+
expect(plates).toHaveLength(2);
|
|
315
|
+
// Lower storey: floor at the placement, ceiling at the next
|
|
316
|
+
// storey's elevation delta above it.
|
|
317
|
+
expect(plates[0].aabb.min[2]).toBeCloseTo(100, 6);
|
|
318
|
+
expect(plates[0].aabb.max[2]).toBeCloseTo(103.5, 6);
|
|
319
|
+
// Upper storey: no next elevation, so MIN_EDGE thick.
|
|
320
|
+
expect(plates[1].aabb.min[2]).toBeCloseTo(103.5, 6);
|
|
321
|
+
expect(plates[1].aabb.max[2]).toBeCloseTo(104.5, 6);
|
|
322
|
+
});
|
|
323
|
+
test("storey plates keep their spacing when only Elevation states it", async () => {
|
|
324
|
+
// Every storey placement parked on the building datum, so the
|
|
325
|
+
// placement chain reports the same Z for both and Elevation is
|
|
326
|
+
// the only thing that separates them. Reading placement Z
|
|
327
|
+
// INSTEAD of elevation stacks both plates on 100; reading it as
|
|
328
|
+
// the datum elevation is measured from keeps them apart.
|
|
329
|
+
const [payloads, model] = await emitForFixture({
|
|
330
|
+
siteOrigin: [0, 0, 0],
|
|
331
|
+
buildingZ: 100,
|
|
332
|
+
storeyElevations: [0, 3.5],
|
|
333
|
+
wallOffset: [8, 6],
|
|
334
|
+
storeyPlacementZ: "datum",
|
|
335
|
+
}, 1);
|
|
336
|
+
const plates = storeyPlates(payloads, model);
|
|
337
|
+
expect(plates).toHaveLength(2);
|
|
338
|
+
expect(plates[0].aabb.min[2]).toBeCloseTo(100, 6);
|
|
339
|
+
expect(plates[1].aabb.min[2]).toBeCloseTo(103.5, 6);
|
|
340
|
+
});
|
|
341
|
+
// conway#517: the placement chain used to SUM Location translations
|
|
342
|
+
// and ignore rotation outright, so on a Revit export rotated to true
|
|
343
|
+
// north every sampled origin landed unrotated in raw model space while
|
|
344
|
+
// the durable meshes did not — the plate cloud read as a rotated ghost
|
|
345
|
+
// of the building. Both fixtures below fail against that composition.
|
|
346
|
+
describe("rotation-aware placement composition", () => {
|
|
347
|
+
/** Site rotated 30 deg about Z — Revit's true-north plan rotation. */
|
|
348
|
+
const ROTATED_SITE = {
|
|
349
|
+
siteOrigin: [0, 0, 0],
|
|
350
|
+
buildingZ: 0,
|
|
351
|
+
storeyElevations: [0, 3.5],
|
|
352
|
+
wallOffset: [8, 6],
|
|
353
|
+
siteRotation: { axis: "z", degrees: 30 },
|
|
354
|
+
};
|
|
355
|
+
/** Site tipped 30 deg about X, with the building datum 100 up. */
|
|
356
|
+
const TILTED_SITE = {
|
|
357
|
+
siteOrigin: [0, 0, 0],
|
|
358
|
+
buildingZ: 100,
|
|
359
|
+
storeyElevations: [0, 3.5],
|
|
360
|
+
wallOffset: [8, 6],
|
|
361
|
+
siteRotation: { axis: "x", degrees: 30 },
|
|
362
|
+
};
|
|
363
|
+
test("plan rotation: plate XY is the AABB of the ROTATED samples", async () => {
|
|
364
|
+
const [payloads, model] = await emitForFixture(ROTATED_SITE, 1);
|
|
365
|
+
const plates = storeyPlates(payloads, model);
|
|
366
|
+
expect(plates).toHaveLength(2);
|
|
367
|
+
// The two walls each storey contains, composed through the
|
|
368
|
+
// rotated site placement.
|
|
369
|
+
const cornerA = rotatePoint(ROTATED_SITE.siteRotation, [0, 0, 0]);
|
|
370
|
+
const cornerB = rotatePoint(ROTATED_SITE.siteRotation, [...ROTATED_SITE.wallOffset, 0]);
|
|
371
|
+
for (const plate of plates) {
|
|
372
|
+
expect(plate.aabb.min[0])
|
|
373
|
+
.toBeCloseTo(Math.min(cornerA[0], cornerB[0]), 6);
|
|
374
|
+
expect(plate.aabb.max[0])
|
|
375
|
+
.toBeCloseTo(Math.max(cornerA[0], cornerB[0]), 6);
|
|
376
|
+
expect(plate.aabb.min[1])
|
|
377
|
+
.toBeCloseTo(Math.min(cornerA[1], cornerB[1]), 6);
|
|
378
|
+
expect(plate.aabb.max[1])
|
|
379
|
+
.toBeCloseTo(Math.max(cornerA[1], cornerB[1]), 6);
|
|
380
|
+
}
|
|
381
|
+
// And specifically NOT the unrotated offset the translation-sum
|
|
382
|
+
// implementation produced: 6 m north instead of 9.2 m.
|
|
383
|
+
expect(plates[0].aabb.max[1])
|
|
384
|
+
.not.toBeCloseTo(ROTATED_SITE.wallOffset[1], 3);
|
|
385
|
+
});
|
|
386
|
+
test("tilt about X: storey floors band on the DATUM's world Z", async () => {
|
|
387
|
+
const [payloads, model] = await emitForFixture(TILTED_SITE, 1);
|
|
388
|
+
const plates = storeyPlates(payloads, model);
|
|
389
|
+
expect(plates).toHaveLength(2);
|
|
390
|
+
const rotation = TILTED_SITE.siteRotation;
|
|
391
|
+
const floorA = rotatePoint(rotation, [0, 0, 100]);
|
|
392
|
+
const floorB = rotatePoint(rotation, [...TILTED_SITE.wallOffset, 100]);
|
|
393
|
+
// Elevation is a length along the datum's own +Z, so a tilted
|
|
394
|
+
// datum puts the floor at cos(30) * the elevation, not at it.
|
|
395
|
+
expect(plates[0].aabb.min[2]).toBeCloseTo(floorA[2], 6);
|
|
396
|
+
expect(plates[1].aabb.min[2])
|
|
397
|
+
.toBeCloseTo(rotatePoint(rotation, [0, 0, 103.5])[2], 6);
|
|
398
|
+
// A Z-only fixture leaves the third matrix column at the
|
|
399
|
+
// identity; this one does not, so an Axis/RefDirection mixup
|
|
400
|
+
// shows up as Y bounds that never left zero.
|
|
401
|
+
expect(plates[0].aabb.min[1])
|
|
402
|
+
.toBeCloseTo(Math.min(floorA[1], floorB[1]), 6);
|
|
403
|
+
expect(plates[0].aabb.max[1])
|
|
404
|
+
.toBeCloseTo(Math.max(floorA[1], floorB[1]), 6);
|
|
405
|
+
// The translation-sum implementation put both floors at the
|
|
406
|
+
// bare elevations, 100 and 103.5.
|
|
407
|
+
expect(plates[0].aabb.min[2]).not.toBeCloseTo(100, 3);
|
|
408
|
+
expect(plates[1].aabb.min[2]).not.toBeCloseTo(103.5, 3);
|
|
409
|
+
});
|
|
410
|
+
test("an Axis with no RefDirection still yields a frame", async () => {
|
|
411
|
+
// Axis = world +X with RefDirection omitted: the IFC default
|
|
412
|
+
// RefDirection (1,0,0) is parallel to it, so a naive build finds a
|
|
413
|
+
// zero cross product. Falling all the way back to world axes there
|
|
414
|
+
// discards a perfectly good rotation; IFC's IfcFirstProjAxis
|
|
415
|
+
// substitutes a perpendicular reference instead, which sends local
|
|
416
|
+
// (a,b,c) to world (c,a,b).
|
|
417
|
+
const [payloads, model] = await emitForFixture({
|
|
418
|
+
siteOrigin: [0, 0, 0],
|
|
419
|
+
buildingZ: 0,
|
|
420
|
+
storeyElevations: [0, 3.5],
|
|
421
|
+
wallOffset: [8, 6],
|
|
422
|
+
siteAxes: [[1, 0, 0], void 0],
|
|
423
|
+
}, 1);
|
|
424
|
+
const plates = storeyPlates(payloads, model);
|
|
425
|
+
expect(plates).toHaveLength(2);
|
|
426
|
+
// Lower storey's walls: local (0,0,0) and (8,6,0) -> (0,0,0) and
|
|
427
|
+
// (0,8,6). X collapses, so the plate is MIN_EDGE thick about
|
|
428
|
+
// zero there; the identity fallback would have spanned 0..8.
|
|
429
|
+
const plate = plates[0].aabb;
|
|
430
|
+
expect((plate.min[0] + plate.max[0]) * 0.5).toBeCloseTo(0, 6);
|
|
431
|
+
expect(plate.max[0] - plate.min[0]).toBeCloseTo(1, 6);
|
|
432
|
+
expect(plate.max[1]).toBeCloseTo(8, 6);
|
|
433
|
+
expect(plate.max[2]).toBeCloseTo(6, 6);
|
|
434
|
+
});
|
|
435
|
+
test("a 2D relative placement does not break the chain", async () => {
|
|
436
|
+
// IfcLocalPlacement.RelativePlacement admits IfcAxis2Placement2D,
|
|
437
|
+
// whose field 1 is RefDirection (not Axis) and which has no field
|
|
438
|
+
// 2 at all. Reading the 3D direction fields unconditionally throws
|
|
439
|
+
// "too few fields in record"; that throw memoizes an undefined
|
|
440
|
+
// placement, and every DESCENDANT then composes in local
|
|
441
|
+
// coordinates — the site translation below silently disappears.
|
|
442
|
+
const [payloads, model] = await emitForFixture({
|
|
443
|
+
siteOrigin: [10, 20, 0],
|
|
444
|
+
buildingZ: 100,
|
|
445
|
+
storeyElevations: [0, 3.5],
|
|
446
|
+
wallOffset: [8, 6],
|
|
447
|
+
sitePlacement2D: true,
|
|
448
|
+
}, 1);
|
|
449
|
+
const plates = storeyPlates(payloads, model);
|
|
450
|
+
expect(plates).toHaveLength(2);
|
|
451
|
+
// The site's XY still reaches the storeys...
|
|
452
|
+
expect(plates[0].aabb.min[0]).toBeCloseTo(10, 6);
|
|
453
|
+
expect(plates[0].aabb.max[0]).toBeCloseTo(18, 6);
|
|
454
|
+
expect(plates[0].aabb.min[1]).toBeCloseTo(20, 6);
|
|
455
|
+
expect(plates[0].aabb.max[1]).toBeCloseTo(26, 6);
|
|
456
|
+
// ...and so does the building datum the elevations band on.
|
|
457
|
+
expect(plates[0].aabb.min[2]).toBeCloseTo(100, 6);
|
|
458
|
+
expect(plates[1].aabb.min[2]).toBeCloseTo(103.5, 6);
|
|
459
|
+
});
|
|
460
|
+
});
|
|
461
|
+
test("nothing emits `solid`", async () => {
|
|
462
|
+
const [payloads] = await emitForFixture(MILLIMETRE_GEOREFERENCED, MM_TO_M);
|
|
463
|
+
for (const payload of payloads) {
|
|
464
|
+
expect("solid" in payload).toBe(false);
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
});
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { ConwayGeometry } from "../../index.js";
|
|
2
|
+
import { ColumnarIndexSink } from "../../step/parsing/columnar_index.js";
|
|
3
|
+
import type { StepExternalByteStore } from "../../step/step_buffer_provider.js";
|
|
4
|
+
import { PreviewMeshPayload } from "./streamed_preview_channel.js";
|
|
5
|
+
/**
|
|
6
|
+
* Parse-time placed-mesh preview for a windowed (store-backed) open.
|
|
7
|
+
*
|
|
8
|
+
* Twin of {@link StreamedPreviewChannel}: same capture math and
|
|
9
|
+
* COORDINATE_TO_ORIGIN frame, same time-budgeted tick, but the prefix
|
|
10
|
+
* model pages product closures from `store` instead of a resident
|
|
11
|
+
* buffer. After each product the pins drop, so peak source residency
|
|
12
|
+
* stays the windowed LRU — not the file.
|
|
13
|
+
*
|
|
14
|
+
* It also runs the spatial-structure walk off its own prefix
|
|
15
|
+
* generations, so the building's skeleton goes up in the first seconds
|
|
16
|
+
* of a long parse rather than after it — see
|
|
17
|
+
* {@link maybeEmitEarlySpatialPlates_}.
|
|
18
|
+
*/
|
|
19
|
+
export declare class StorePreviewChannel {
|
|
20
|
+
private readonly store_;
|
|
21
|
+
private readonly sink_;
|
|
22
|
+
private readonly conwaywasm_;
|
|
23
|
+
private readonly coordinateToOrigin_;
|
|
24
|
+
private readonly onMesh_;
|
|
25
|
+
private readonly maxUnits;
|
|
26
|
+
private readonly maxBytes;
|
|
27
|
+
private readonly firstGenerationMinRecords;
|
|
28
|
+
coordinationMatrix?: number[];
|
|
29
|
+
private stopped_;
|
|
30
|
+
private emittedUnits_;
|
|
31
|
+
private emittedBytes_;
|
|
32
|
+
private unitOrdinal_;
|
|
33
|
+
private lastInlineTick_;
|
|
34
|
+
private tickIntervalMs_;
|
|
35
|
+
private lastSnapshotRecords_;
|
|
36
|
+
private lastFailedSnapshotRecords_;
|
|
37
|
+
lastFailReason?: string;
|
|
38
|
+
private tickBudgetMs_;
|
|
39
|
+
private tickMaxAttempts_;
|
|
40
|
+
/** Set once a prefix-generation spatial walk has emitted a plate. */
|
|
41
|
+
private earlyPlatesEmitted_;
|
|
42
|
+
/**
|
|
43
|
+
* Whether those plates were composed under the walk's own fallback
|
|
44
|
+
* frame because no preview instance had latched one yet. They get one
|
|
45
|
+
* re-emission on a later generation once a real frame exists — see
|
|
46
|
+
* {@link maybeEmitEarlySpatialPlates_}.
|
|
47
|
+
*/
|
|
48
|
+
private earlyPlatesUsedFallbackFrame_;
|
|
49
|
+
private readonly emittedGeometry_;
|
|
50
|
+
private generation_?;
|
|
51
|
+
/**
|
|
52
|
+
* @param store_ External source (OPFS / file).
|
|
53
|
+
* @param sink_ Live columnar sink the parse is filling.
|
|
54
|
+
* @param conwaywasm_ Shared wasm wrapper.
|
|
55
|
+
* @param coordinateToOrigin_ Open COORDINATE_TO_ORIGIN.
|
|
56
|
+
* @param onMesh_ Preview consumer.
|
|
57
|
+
* @param maxUnits Cap on products preview-extracted.
|
|
58
|
+
* @param maxBytes Cap on copied payload bytes.
|
|
59
|
+
* @param firstGenerationMinRecords Records before the first snapshot.
|
|
60
|
+
*/
|
|
61
|
+
constructor(store_: StepExternalByteStore, sink_: ColumnarIndexSink<number>, conwaywasm_: ConwayGeometry, coordinateToOrigin_: boolean, onMesh_: (mesh: PreviewMeshPayload) => void, maxUnits?: number, maxBytes?: number, firstGenerationMinRecords?: number);
|
|
62
|
+
get capped(): boolean;
|
|
63
|
+
get emittedUnits(): number;
|
|
64
|
+
/** Products the current generation would run (test seam). */
|
|
65
|
+
get productCount(): number;
|
|
66
|
+
/**
|
|
67
|
+
* Plates the prefix-generation spatial walk emitted, 0 while it has
|
|
68
|
+
* not succeeded (see {@link maybeEmitEarlySpatialPlates_}).
|
|
69
|
+
*/
|
|
70
|
+
get earlyPlateCount(): number;
|
|
71
|
+
/**
|
|
72
|
+
* One cadence-gated, time-budgeted tick. No-op until the interval
|
|
73
|
+
* elapses or the index can support a generation. Safe to call from
|
|
74
|
+
* parse progress.
|
|
75
|
+
*
|
|
76
|
+
* **Cadence and budget interact once, not twice.** The interval is
|
|
77
|
+
* measured tick-start to tick-start (`lastInlineTick_` is stamped
|
|
78
|
+
* before the work, as on the streamed channel), so a tick that spends
|
|
79
|
+
* its whole budget shortens the gap to the next one by that budget
|
|
80
|
+
* rather than adding to it. And the decay is charged only to ticks
|
|
81
|
+
* that actually attempted a product: a tick that found no generation —
|
|
82
|
+
* which is every tick through the opening seconds of a big parse, when
|
|
83
|
+
* the index has not yet reached FIRST_GENERATION_MIN_RECORDS — used to
|
|
84
|
+
* decay the interval anyway, so by the time there was anything to
|
|
85
|
+
* extract the cadence had already cooled toward
|
|
86
|
+
* TICK_INTERVAL_MAX_MS. Deliberately divergent from
|
|
87
|
+
* {@link StreamedPreviewChannel}, which decays unconditionally; the
|
|
88
|
+
* cost is that a channel which never finds a generation keeps probing
|
|
89
|
+
* at TICK_INTERVAL_MS, and a probe that finds nothing is a record
|
|
90
|
+
* count compared against two thresholds.
|
|
91
|
+
*
|
|
92
|
+
* @return {Promise<void>} Settles when this tick's products (if any)
|
|
93
|
+
* are captured.
|
|
94
|
+
*/
|
|
95
|
+
maybeTickAsync(): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Attempt products until the time budget or the attempt cap runs out,
|
|
98
|
+
* whichever comes first.
|
|
99
|
+
*
|
|
100
|
+
* @return {Promise<number>} Products attempted this tick.
|
|
101
|
+
*/
|
|
102
|
+
private tickBudgeted_;
|
|
103
|
+
/**
|
|
104
|
+
* After parse: extract a short burst so small files (and prefixes
|
|
105
|
+
* that never crossed a progress tick) still emit placed meshes
|
|
106
|
+
* before open returns.
|
|
107
|
+
*
|
|
108
|
+
* @return {Promise<void>} Settles when the burst ends.
|
|
109
|
+
*/
|
|
110
|
+
flushAsync(): Promise<void>;
|
|
111
|
+
/** Drop the throwaway prefix generation. Idempotent. */
|
|
112
|
+
stop(): void;
|
|
113
|
+
/**
|
|
114
|
+
* Test seam: drain until the current sink is exhausted or a cap hits.
|
|
115
|
+
*
|
|
116
|
+
* @return {Promise<void>} Settles when idle.
|
|
117
|
+
*/
|
|
118
|
+
drainForTest(): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* @return {Promise<boolean>} True when a product was attempted.
|
|
121
|
+
*/
|
|
122
|
+
private tickOnce_;
|
|
123
|
+
/**
|
|
124
|
+
* @return {Promise<boolean>} True when a generation with pending units exists.
|
|
125
|
+
*/
|
|
126
|
+
private ensureGeneration_;
|
|
127
|
+
/**
|
|
128
|
+
* Put the spatial skeleton up from a PREFIX generation, seconds into
|
|
129
|
+
* the parse instead of after it (conway#518).
|
|
130
|
+
*
|
|
131
|
+
* The spatial records sit at the file head on Revit exports — on PSB
|
|
132
|
+
* `IFCSITE` is record #211 — and a prefix generation is already
|
|
133
|
+
* everything the walk needs: a columns snapshot over a windowed
|
|
134
|
+
* provider, with `prepareDemandExtraction(true)` done, which is what
|
|
135
|
+
* makes `getLinearScalingFactor()` report real units rather than 1.
|
|
136
|
+
* So the plates can lead the first extracted product rather than
|
|
137
|
+
* trailing the whole parse, which is what the store path's three
|
|
138
|
+
* stacked latency gates (one product per tick, early products
|
|
139
|
+
* deferring on late placements, the walk waiting for the full index)
|
|
140
|
+
* added up to: a blank screen through the first ~60% of a 16.7 s
|
|
141
|
+
* parse.
|
|
142
|
+
*
|
|
143
|
+
* **Runs at most once successfully, on the parse's cooperative path.**
|
|
144
|
+
* The walk is reused as-is, with no internal budget: it awaits a
|
|
145
|
+
* residency ensure per spatial node and per sampled product placement
|
|
146
|
+
* (PRODUCT_SAMPLE per node), so its cost tracks the prefix's spatial
|
|
147
|
+
* tree, not the file. On the first qualifying generation that tree is
|
|
148
|
+
* small by construction — the storeys exist but few
|
|
149
|
+
* `IfcRelContainedInSpatialStructure` do — which is the same property
|
|
150
|
+
* that makes these early plates coarse. Retries are bounded without a
|
|
151
|
+
* counter: generations only rebuild on a GENERATION_GROWTH_FACTOR
|
|
152
|
+
* doubling of the index, so there are O(log records) of them.
|
|
153
|
+
*
|
|
154
|
+
* **The end-of-parse walk in the proxy is the refresh, not a
|
|
155
|
+
* duplicate.** It re-emits the same expressIDs with contained-product
|
|
156
|
+
* samples the prefix did not hold and under the frame the channel
|
|
157
|
+
* latched, and the consumer contract is that an `aabb` payload
|
|
158
|
+
* REPLACES the prior plate for its expressID. Double emission is the
|
|
159
|
+
* design; see PreviewMeshPayload.
|
|
160
|
+
*
|
|
161
|
+
* **Known gap in that contract, and it is a gap, not a subtlety.**
|
|
162
|
+
* Replacement only reaches nodes the final walk still emits, and the
|
|
163
|
+
* emit set is not stable between the two: `aabbMostlyEqual` collapses
|
|
164
|
+
* a single-child wrapper (Project over Site over Building) once its
|
|
165
|
+
* box matches its child's, which a prefix generation's degenerate
|
|
166
|
+
* boxes may not yet do. A wrapper emitted here and collapsed there is
|
|
167
|
+
* never replaced and never removed — the payload contract has no
|
|
168
|
+
* delete — so its early box lingers as one small plate until Share
|
|
169
|
+
* tears the preview scenery down at load end. Bounded (the wrapper
|
|
170
|
+
* chain is a handful of nodes, and the collapse needs exactly one
|
|
171
|
+
* child), but real. Closing it properly needs either a delete/
|
|
172
|
+
* generation channel in the payload contract or an emit set the two
|
|
173
|
+
* walks agree on, and both are consumer-side changes.
|
|
174
|
+
*
|
|
175
|
+
* @param model The prefix model.
|
|
176
|
+
* @param extraction Its prepared extraction.
|
|
177
|
+
* @return {Promise<void>} Settles when the walk has run or been skipped.
|
|
178
|
+
*/
|
|
179
|
+
private maybeEmitEarlySpatialPlates_;
|
|
180
|
+
private disposeGeneration_;
|
|
181
|
+
/**
|
|
182
|
+
* Copy newly extracted instances out of wasm — same placement math
|
|
183
|
+
* as {@link StreamedPreviewChannel}.
|
|
184
|
+
*/
|
|
185
|
+
private captureNewInstances_;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=store_preview_channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store_preview_channel.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/store_preview_channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAY5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAGrE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAU5E,OAAO,EACL,kBAAkB,EAEnB,MAAM,4BAA4B,CAAA;AAuCnC;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAmB;IAoD1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAzDvC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAEpC,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,0BAA0B,CAAI;IACtC,cAAc,CAAC,EAAE,MAAM,CAAA;IAMvB,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,gBAAgB,CAAoB;IAE5C,qEAAqE;IACrE,OAAO,CAAC,mBAAmB,CAAI;IAE/B;;;;;OAKG;IACH,OAAO,CAAC,6BAA6B,CAAQ;IAE7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsB;IAEvD,OAAO,CAAC,WAAW,CAAC,CAKnB;IAED;;;;;;;;;OASG;gBAEkB,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,iBAAiB,CAAE,MAAM,CAAE,EAClC,WAAW,EAAE,cAAc,EAC3B,mBAAmB,EAAE,OAAO,EAC5B,OAAO,EAAE,CAAE,IAAI,EAAE,kBAAkB,KAAM,IAAI,EAC7C,QAAQ,GAAE,MAAkC,EAC5C,QAAQ,GAAE,MAAkC,EAC5C,yBAAyB,GAAE,MAChB;IAGhC,IAAW,MAAM,IAAI,OAAO,CAG3B;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,6DAA6D;IAC7D,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED;;;OAGG;IACH,IAAW,eAAe,IAAI,MAAM,CAEnC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACU,cAAc,IAAI,OAAO,CAAE,IAAI,CAAE;IAyB9C;;;;;OAKG;YACW,aAAa;IAmB3B;;;;;;OAMG;IACU,UAAU,IAAI,OAAO,CAAE,IAAI,CAAE;IAuB1C,wDAAwD;IACjD,IAAI,IAAI,IAAI;IAMnB;;;;OAIG;IACU,YAAY,IAAI,OAAO,CAAE,IAAI,CAAE;IAmB5C;;OAEG;YACW,SAAS;IAyCvB;;OAEG;YACW,iBAAiB;IAgF/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmDG;YACW,4BAA4B;IAsE1C,OAAO,CAAC,kBAAkB;IAiB1B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CA+H7B"}
|