Releases: iamahsanmehmood/openskp
Release list
v1.3.0
What's Changed
- fix: large-file parser memory blowup and O(V^2) triangulation stall by @iamahsanmehmood in #265
- fix(writer): SketchUp can save our files (persistent IDs in one sequence); front_uv pins in SketchUp's basis and scaled by applied size; reader vertical tolerance; face-me flag by @tuxiasumari in #266
- build(deps-dev): bump typescript-eslint from 8.68.0 to 8.69.0 in /packages/typescript by @dependabot[bot] in #267
- feat: read and write construction lines/points (Python) by @iamahsanmehmood in #268
- feat: write section planes (Python) by @iamahsanmehmood in #269
- feat: read pages/scenes (legacy, narrow scope) (Python) by @iamahsanmehmood in #270
- fix: correct IFC export units and axis convention (Python) by @iamahsanmehmood in #271
- fix: preserve real instance names and layer visibility in IFC export (Python) by @iamahsanmehmood in #272
- feat: opt-in full-path keyword classification for IFC export (Python) by @iamahsanmehmood in #273
- Surface third-party plugin attribute dictionaries as element names and IFC properties by @iamahsanmehmood in #274
- Read the real per-layer hidden flag from VFF (2021+) files by @iamahsanmehmood in #275
- Add direct SketchUp -> Fragments (.frag) export by @iamahsanmehmood in #277
- Include layer_hidden in both GLB exporters' metadata sidecar by @iamahsanmehmood in #278
- perf: skip Shapely entirely for convex, hole-free face triangulation by @iamahsanmehmood in #279
- perf+fix: replace Shapely with earcut for face triangulation by @iamahsanmehmood in #280
- fix: write real per-item GUIDs in Fragments export by @iamahsanmehmood in #281
- fix: preserve real names for organizational wrappers with no geometry of their own by @iamahsanmehmood in #286
- python: give named organizational wrappers real IfcElementAssembly grouping by @iamahsanmehmood in #287
- python: make the plugin-name-override key vocabulary configurable by @iamahsanmehmood in #288
- docs: fix incorrect build_instanced_scene() call pattern by @iamahsanmehmood in #289
- python: disambiguate duplicate source GUIDs in Fragments export by @iamahsanmehmood in #291
- feat(cpp): direct SketchUp -> Fragments (.frag) export by @iamahsanmehmood in #293
- fix(cpp): port 4 IFC export correctness fixes from Python by @iamahsanmehmood in #294
- feat(cpp): read the real per-layer hidden flag from VFF (2021+) files by @iamahsanmehmood in #295
- fix(cpp): model.layers now in source-file order, not alphabetical by @iamahsanmehmood in #296
- feat(cpp): read pages/scenes for legacy (pre-2021) files by @iamahsanmehmood in #297
- feat(cpp): read construction lines/points (legacy only) by @iamahsanmehmood in #298
- perf(typescript): keep the writer's archive in a typed array, not a number[] by @tdurand in #292
- fix: attribute_dictionaries never reached GLB/JSON metadata export (Python, C++) by @iamahsanmehmood in #299
- feat(python): read a .frag file back (from_fragments/read) by @iamahsanmehmood in #301
- fix(python): .frag reader must follow Representation.Id(), not its vector position by @iamahsanmehmood in #302
- fix(python): legacy parser - CCamera class-ref can precede this scan's own visit to its declaration by @iamahsanmehmood in #303
- fix(codegen): preserve applied_width and opacity for textured materials by @metehn in #304
- feat(cpp): add WebAssembly build target and streaming definition parser (#264) by @nooraliqureshi in #300
- fix(cpp): restore explicit WASM memory ceiling to prevent internal OOM well below the browser's own limit by @iamahsanmehmood in #306
- fix(cpp): to_instanced_glb() was accidentally quadratic in mesh-resource count by @iamahsanmehmood in #307
- feat(web-viewer): WASM fast-preview path for files too large for the pure-JS parser by @iamahsanmehmood in #308
- fix(web-viewer): scale camera clipping planes and zoom limits to the loaded model by @iamahsanmehmood in #309
- fix(python): gate legacy instance/group GUID read on file version, not schema (#284) by @iamahsanmehmood in #310
- feat(ts): add toFragments() exporter for Fragments (.frag) binary 3D/BIM streaming by @nooraliqureshi in #276
- Revert direct push to main (docs sync) by @iamahsanmehmood in #312
- docs: sync README/ROADMAP/LANGUAGE_PARITY/DEVELOPER_GUIDE with #276 and #310 by @iamahsanmehmood in #313
- test(dotnet): implement SdkOracleFact to dynamically skip oracle tests in xUnit v2 by @metehn in #311
- fix(python): merge overlapping face holes before triangulating (#285) by @iamahsanmehmood in #314
- fix(dotnet,python): port overlapping-hole fix to .NET; fix a real bug in the Python fix itself by @iamahsanmehmood in #315
- docs: add Future ideas section to ROADMAP.md by @iamahsanmehmood in #317
- feat(python): loose-edge curve sets and analytic arcs, with four IFC4 conformance fixes by @gsuiaoll in #316
- chore(deps-dev): bump eslint from 10.9.1 to 10.10.0 in /packages/typescript by @dependabot[bot] in #318
- chore(deps-dev): bump typescript-eslint from 8.69.0 to 8.70.0 in /packages/typescript by @dependabot[bot] in #319
- fix(python): correct Instance.matrix docstring + VFF attribute-type parity claim by @iamahsanmehmood in #320
- fix(typescript): bump vitest to 4.1.11, force esbuild 0.28.1+, drop Node 18 by @iamahsanmehmood in #321
- docs: link the FreeCAD and Blender addons from the main README by @iamahsanmehmood in #322
- feat(python): loose-edge/curve support in build_instanced_scene() by @iamahsanmehmood in #323
- fix(python): create()'s scaffold loader hardcoded the top-level package name by @iamahsanmehmood in #324
- feat(python): expose loose-edge layer/curve grouping on the public typed model by @iamahsanmehmood in #325
- docs: fix stale Layer.hidden docstring by @iamahsanmehmood in #326
- Add .NET Fragments (.frag) export - port from Python/TypeScript (openskp#285) by @iamahsanmehmood in #327
- dotnet: real GUID/name-resolution/layer-hidden, Fragments export at full Python/C++ parity by @iamahsanmehmood in #328
- typescript: real GUID/name-resolution/layer-hidden, Fragments export at full Python/C++ parity by @iamahsanmehmood in #329
- dart: add Fragments (.frag) export - new package, full Python/C++ parity from the start by @iamahsanmehmood in #330
- .NET: full VFF attribute value-type decoding by @iamahsanmehmood in #331
- TypeScript: full VFF attribute value-type decoding by @iamahsanmehmood in #332
- Dart: full VFF attribute value-type decoding by @iamahsanmehmood in #333
- .NET: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #334
- TypeScript: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #335
- Dart: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #336
- .NET: read VFF per-layer-hidden flag by @iamahsanmehmood in #337
- TypeScript: read VFF per-layer-hidden flag by @iamahsanmehmood in https:...
typescript-v1.3.0
What's Changed
- feat(python): read a .frag file back (from_fragments/read) by @iamahsanmehmood in #301
- fix(python): .frag reader must follow Representation.Id(), not its vector position by @iamahsanmehmood in #302
- fix(python): legacy parser - CCamera class-ref can precede this scan's own visit to its declaration by @iamahsanmehmood in #303
- fix(codegen): preserve applied_width and opacity for textured materials by @metehn in #304
- feat(cpp): add WebAssembly build target and streaming definition parser (#264) by @nooraliqureshi in #300
- fix(cpp): restore explicit WASM memory ceiling to prevent internal OOM well below the browser's own limit by @iamahsanmehmood in #306
- fix(cpp): to_instanced_glb() was accidentally quadratic in mesh-resource count by @iamahsanmehmood in #307
- feat(web-viewer): WASM fast-preview path for files too large for the pure-JS parser by @iamahsanmehmood in #308
- fix(web-viewer): scale camera clipping planes and zoom limits to the loaded model by @iamahsanmehmood in #309
- fix(python): gate legacy instance/group GUID read on file version, not schema (#284) by @iamahsanmehmood in #310
- feat(ts): add toFragments() exporter for Fragments (.frag) binary 3D/BIM streaming by @nooraliqureshi in #276
- Revert direct push to main (docs sync) by @iamahsanmehmood in #312
- docs: sync README/ROADMAP/LANGUAGE_PARITY/DEVELOPER_GUIDE with #276 and #310 by @iamahsanmehmood in #313
- test(dotnet): implement SdkOracleFact to dynamically skip oracle tests in xUnit v2 by @metehn in #311
- fix(python): merge overlapping face holes before triangulating (#285) by @iamahsanmehmood in #314
- fix(dotnet,python): port overlapping-hole fix to .NET; fix a real bug in the Python fix itself by @iamahsanmehmood in #315
- docs: add Future ideas section to ROADMAP.md by @iamahsanmehmood in #317
- feat(python): loose-edge curve sets and analytic arcs, with four IFC4 conformance fixes by @gsuiaoll in #316
- chore(deps-dev): bump eslint from 10.9.1 to 10.10.0 in /packages/typescript by @dependabot[bot] in #318
- chore(deps-dev): bump typescript-eslint from 8.69.0 to 8.70.0 in /packages/typescript by @dependabot[bot] in #319
- fix(python): correct Instance.matrix docstring + VFF attribute-type parity claim by @iamahsanmehmood in #320
- fix(typescript): bump vitest to 4.1.11, force esbuild 0.28.1+, drop Node 18 by @iamahsanmehmood in #321
- docs: link the FreeCAD and Blender addons from the main README by @iamahsanmehmood in #322
- feat(python): loose-edge/curve support in build_instanced_scene() by @iamahsanmehmood in #323
- fix(python): create()'s scaffold loader hardcoded the top-level package name by @iamahsanmehmood in #324
- feat(python): expose loose-edge layer/curve grouping on the public typed model by @iamahsanmehmood in #325
- docs: fix stale Layer.hidden docstring by @iamahsanmehmood in #326
- Add .NET Fragments (.frag) export - port from Python/TypeScript (openskp#285) by @iamahsanmehmood in #327
- dotnet: real GUID/name-resolution/layer-hidden, Fragments export at full Python/C++ parity by @iamahsanmehmood in #328
- typescript: real GUID/name-resolution/layer-hidden, Fragments export at full Python/C++ parity by @iamahsanmehmood in #329
- dart: add Fragments (.frag) export - new package, full Python/C++ parity from the start by @iamahsanmehmood in #330
- .NET: full VFF attribute value-type decoding by @iamahsanmehmood in #331
- TypeScript: full VFF attribute value-type decoding by @iamahsanmehmood in #332
- Dart: full VFF attribute value-type decoding by @iamahsanmehmood in #333
- .NET: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #334
- TypeScript: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #335
- Dart: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #336
- .NET: read VFF per-layer-hidden flag by @iamahsanmehmood in #337
- TypeScript: read VFF per-layer-hidden flag by @iamahsanmehmood in #338
- Dart: read VFF per-layer-hidden flag by @iamahsanmehmood in #339
- TypeScript: fix overlapping-hole triangulation by @iamahsanmehmood in #340
- Dart: fix overlapping-hole triangulation by @iamahsanmehmood in #341
- C++: full VFF attribute value-type decoding by @iamahsanmehmood in #342
- C++: fix overlapping-hole triangulation by @iamahsanmehmood in #343
- C++: verify and regression-test layer order + mesh_index properties by @iamahsanmehmood in #344
- .NET: fix legacy SectionPlanes/Texts/Dimensions silently dropped by ToGeometryBuilder by @iamahsanmehmood in #345
- TypeScript: fix readSectionPlane discarding plane/name/label/drawbase entirely by @iamahsanmehmood in #346
- cpp: add regression test for legacy section plane/text/dimension reading by @iamahsanmehmood in #347
- dotnet: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #348
- typescript: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #349
- dart: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #350
- cpp: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #351
- dotnet: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #352
- typescript: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #353
- dart: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #354
- python: fix Fragments export crash on shells with more than 65535 triangles by @iamahsanmehmood in #355
- dotnet: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #356
- typescript: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #357
- dart: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #358
- cpp: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #359
- chore: synchronize all 5 languages at v1.3.0 by @iamahsanmehmood in #360
New Contributors
Full Changelog: preview-cpp-v1.3.1...typescript-v1.3.0
python-v1.3.0
What's Changed
- feat(python): read a .frag file back (from_fragments/read) by @iamahsanmehmood in #301
- fix(python): .frag reader must follow Representation.Id(), not its vector position by @iamahsanmehmood in #302
- fix(python): legacy parser - CCamera class-ref can precede this scan's own visit to its declaration by @iamahsanmehmood in #303
- fix(codegen): preserve applied_width and opacity for textured materials by @metehn in #304
- feat(cpp): add WebAssembly build target and streaming definition parser (#264) by @nooraliqureshi in #300
- fix(cpp): restore explicit WASM memory ceiling to prevent internal OOM well below the browser's own limit by @iamahsanmehmood in #306
- fix(cpp): to_instanced_glb() was accidentally quadratic in mesh-resource count by @iamahsanmehmood in #307
- feat(web-viewer): WASM fast-preview path for files too large for the pure-JS parser by @iamahsanmehmood in #308
- fix(web-viewer): scale camera clipping planes and zoom limits to the loaded model by @iamahsanmehmood in #309
- fix(python): gate legacy instance/group GUID read on file version, not schema (#284) by @iamahsanmehmood in #310
- feat(ts): add toFragments() exporter for Fragments (.frag) binary 3D/BIM streaming by @nooraliqureshi in #276
- Revert direct push to main (docs sync) by @iamahsanmehmood in #312
- docs: sync README/ROADMAP/LANGUAGE_PARITY/DEVELOPER_GUIDE with #276 and #310 by @iamahsanmehmood in #313
- test(dotnet): implement SdkOracleFact to dynamically skip oracle tests in xUnit v2 by @metehn in #311
- fix(python): merge overlapping face holes before triangulating (#285) by @iamahsanmehmood in #314
- fix(dotnet,python): port overlapping-hole fix to .NET; fix a real bug in the Python fix itself by @iamahsanmehmood in #315
- docs: add Future ideas section to ROADMAP.md by @iamahsanmehmood in #317
- feat(python): loose-edge curve sets and analytic arcs, with four IFC4 conformance fixes by @gsuiaoll in #316
- chore(deps-dev): bump eslint from 10.9.1 to 10.10.0 in /packages/typescript by @dependabot[bot] in #318
- chore(deps-dev): bump typescript-eslint from 8.69.0 to 8.70.0 in /packages/typescript by @dependabot[bot] in #319
- fix(python): correct Instance.matrix docstring + VFF attribute-type parity claim by @iamahsanmehmood in #320
- fix(typescript): bump vitest to 4.1.11, force esbuild 0.28.1+, drop Node 18 by @iamahsanmehmood in #321
- docs: link the FreeCAD and Blender addons from the main README by @iamahsanmehmood in #322
- feat(python): loose-edge/curve support in build_instanced_scene() by @iamahsanmehmood in #323
- fix(python): create()'s scaffold loader hardcoded the top-level package name by @iamahsanmehmood in #324
- feat(python): expose loose-edge layer/curve grouping on the public typed model by @iamahsanmehmood in #325
- docs: fix stale Layer.hidden docstring by @iamahsanmehmood in #326
- Add .NET Fragments (.frag) export - port from Python/TypeScript (openskp#285) by @iamahsanmehmood in #327
- dotnet: real GUID/name-resolution/layer-hidden, Fragments export at full Python/C++ parity by @iamahsanmehmood in #328
- typescript: real GUID/name-resolution/layer-hidden, Fragments export at full Python/C++ parity by @iamahsanmehmood in #329
- dart: add Fragments (.frag) export - new package, full Python/C++ parity from the start by @iamahsanmehmood in #330
- .NET: full VFF attribute value-type decoding by @iamahsanmehmood in #331
- TypeScript: full VFF attribute value-type decoding by @iamahsanmehmood in #332
- Dart: full VFF attribute value-type decoding by @iamahsanmehmood in #333
- .NET: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #334
- TypeScript: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #335
- Dart: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #336
- .NET: read VFF per-layer-hidden flag by @iamahsanmehmood in #337
- TypeScript: read VFF per-layer-hidden flag by @iamahsanmehmood in #338
- Dart: read VFF per-layer-hidden flag by @iamahsanmehmood in #339
- TypeScript: fix overlapping-hole triangulation by @iamahsanmehmood in #340
- Dart: fix overlapping-hole triangulation by @iamahsanmehmood in #341
- C++: full VFF attribute value-type decoding by @iamahsanmehmood in #342
- C++: fix overlapping-hole triangulation by @iamahsanmehmood in #343
- C++: verify and regression-test layer order + mesh_index properties by @iamahsanmehmood in #344
- .NET: fix legacy SectionPlanes/Texts/Dimensions silently dropped by ToGeometryBuilder by @iamahsanmehmood in #345
- TypeScript: fix readSectionPlane discarding plane/name/label/drawbase entirely by @iamahsanmehmood in #346
- cpp: add regression test for legacy section plane/text/dimension reading by @iamahsanmehmood in #347
- dotnet: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #348
- typescript: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #349
- dart: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #350
- cpp: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #351
- dotnet: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #352
- typescript: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #353
- dart: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #354
- python: fix Fragments export crash on shells with more than 65535 triangles by @iamahsanmehmood in #355
- dotnet: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #356
- typescript: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #357
- dart: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #358
- cpp: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #359
- chore: synchronize all 5 languages at v1.3.0 by @iamahsanmehmood in #360
New Contributors
Full Changelog: preview-cpp-v1.3.1...python-v1.3.0
nuget-v1.3.0
What's Changed
- feat(python): read a .frag file back (from_fragments/read) by @iamahsanmehmood in #301
- fix(python): .frag reader must follow Representation.Id(), not its vector position by @iamahsanmehmood in #302
- fix(python): legacy parser - CCamera class-ref can precede this scan's own visit to its declaration by @iamahsanmehmood in #303
- fix(codegen): preserve applied_width and opacity for textured materials by @metehn in #304
- feat(cpp): add WebAssembly build target and streaming definition parser (#264) by @nooraliqureshi in #300
- fix(cpp): restore explicit WASM memory ceiling to prevent internal OOM well below the browser's own limit by @iamahsanmehmood in #306
- fix(cpp): to_instanced_glb() was accidentally quadratic in mesh-resource count by @iamahsanmehmood in #307
- feat(web-viewer): WASM fast-preview path for files too large for the pure-JS parser by @iamahsanmehmood in #308
- fix(web-viewer): scale camera clipping planes and zoom limits to the loaded model by @iamahsanmehmood in #309
- fix(python): gate legacy instance/group GUID read on file version, not schema (#284) by @iamahsanmehmood in #310
- feat(ts): add toFragments() exporter for Fragments (.frag) binary 3D/BIM streaming by @nooraliqureshi in #276
- Revert direct push to main (docs sync) by @iamahsanmehmood in #312
- docs: sync README/ROADMAP/LANGUAGE_PARITY/DEVELOPER_GUIDE with #276 and #310 by @iamahsanmehmood in #313
- test(dotnet): implement SdkOracleFact to dynamically skip oracle tests in xUnit v2 by @metehn in #311
- fix(python): merge overlapping face holes before triangulating (#285) by @iamahsanmehmood in #314
- fix(dotnet,python): port overlapping-hole fix to .NET; fix a real bug in the Python fix itself by @iamahsanmehmood in #315
- docs: add Future ideas section to ROADMAP.md by @iamahsanmehmood in #317
- feat(python): loose-edge curve sets and analytic arcs, with four IFC4 conformance fixes by @gsuiaoll in #316
- chore(deps-dev): bump eslint from 10.9.1 to 10.10.0 in /packages/typescript by @dependabot[bot] in #318
- chore(deps-dev): bump typescript-eslint from 8.69.0 to 8.70.0 in /packages/typescript by @dependabot[bot] in #319
- fix(python): correct Instance.matrix docstring + VFF attribute-type parity claim by @iamahsanmehmood in #320
- fix(typescript): bump vitest to 4.1.11, force esbuild 0.28.1+, drop Node 18 by @iamahsanmehmood in #321
- docs: link the FreeCAD and Blender addons from the main README by @iamahsanmehmood in #322
- feat(python): loose-edge/curve support in build_instanced_scene() by @iamahsanmehmood in #323
- fix(python): create()'s scaffold loader hardcoded the top-level package name by @iamahsanmehmood in #324
- feat(python): expose loose-edge layer/curve grouping on the public typed model by @iamahsanmehmood in #325
- docs: fix stale Layer.hidden docstring by @iamahsanmehmood in #326
- Add .NET Fragments (.frag) export - port from Python/TypeScript (openskp#285) by @iamahsanmehmood in #327
- dotnet: real GUID/name-resolution/layer-hidden, Fragments export at full Python/C++ parity by @iamahsanmehmood in #328
- typescript: real GUID/name-resolution/layer-hidden, Fragments export at full Python/C++ parity by @iamahsanmehmood in #329
- dart: add Fragments (.frag) export - new package, full Python/C++ parity from the start by @iamahsanmehmood in #330
- .NET: full VFF attribute value-type decoding by @iamahsanmehmood in #331
- TypeScript: full VFF attribute value-type decoding by @iamahsanmehmood in #332
- Dart: full VFF attribute value-type decoding by @iamahsanmehmood in #333
- .NET: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #334
- TypeScript: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #335
- Dart: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #336
- .NET: read VFF per-layer-hidden flag by @iamahsanmehmood in #337
- TypeScript: read VFF per-layer-hidden flag by @iamahsanmehmood in #338
- Dart: read VFF per-layer-hidden flag by @iamahsanmehmood in #339
- TypeScript: fix overlapping-hole triangulation by @iamahsanmehmood in #340
- Dart: fix overlapping-hole triangulation by @iamahsanmehmood in #341
- C++: full VFF attribute value-type decoding by @iamahsanmehmood in #342
- C++: fix overlapping-hole triangulation by @iamahsanmehmood in #343
- C++: verify and regression-test layer order + mesh_index properties by @iamahsanmehmood in #344
- .NET: fix legacy SectionPlanes/Texts/Dimensions silently dropped by ToGeometryBuilder by @iamahsanmehmood in #345
- TypeScript: fix readSectionPlane discarding plane/name/label/drawbase entirely by @iamahsanmehmood in #346
- cpp: add regression test for legacy section plane/text/dimension reading by @iamahsanmehmood in #347
- dotnet: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #348
- typescript: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #349
- dart: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #350
- cpp: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #351
- dotnet: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #352
- typescript: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #353
- dart: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #354
- python: fix Fragments export crash on shells with more than 65535 triangles by @iamahsanmehmood in #355
- dotnet: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #356
- typescript: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #357
- dart: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #358
- cpp: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #359
- chore: synchronize all 5 languages at v1.3.0 by @iamahsanmehmood in #360
New Contributors
Full Changelog: preview-cpp-v1.3.1...nuget-v1.3.0
cpp-v1.3.0
What's Changed
- feat(python): read a .frag file back (from_fragments/read) by @iamahsanmehmood in #301
- fix(python): .frag reader must follow Representation.Id(), not its vector position by @iamahsanmehmood in #302
- fix(python): legacy parser - CCamera class-ref can precede this scan's own visit to its declaration by @iamahsanmehmood in #303
- fix(codegen): preserve applied_width and opacity for textured materials by @metehn in #304
- feat(cpp): add WebAssembly build target and streaming definition parser (#264) by @nooraliqureshi in #300
- fix(cpp): restore explicit WASM memory ceiling to prevent internal OOM well below the browser's own limit by @iamahsanmehmood in #306
- fix(cpp): to_instanced_glb() was accidentally quadratic in mesh-resource count by @iamahsanmehmood in #307
- feat(web-viewer): WASM fast-preview path for files too large for the pure-JS parser by @iamahsanmehmood in #308
- fix(web-viewer): scale camera clipping planes and zoom limits to the loaded model by @iamahsanmehmood in #309
- fix(python): gate legacy instance/group GUID read on file version, not schema (#284) by @iamahsanmehmood in #310
- feat(ts): add toFragments() exporter for Fragments (.frag) binary 3D/BIM streaming by @nooraliqureshi in #276
- Revert direct push to main (docs sync) by @iamahsanmehmood in #312
- docs: sync README/ROADMAP/LANGUAGE_PARITY/DEVELOPER_GUIDE with #276 and #310 by @iamahsanmehmood in #313
- test(dotnet): implement SdkOracleFact to dynamically skip oracle tests in xUnit v2 by @metehn in #311
- fix(python): merge overlapping face holes before triangulating (#285) by @iamahsanmehmood in #314
- fix(dotnet,python): port overlapping-hole fix to .NET; fix a real bug in the Python fix itself by @iamahsanmehmood in #315
- docs: add Future ideas section to ROADMAP.md by @iamahsanmehmood in #317
- feat(python): loose-edge curve sets and analytic arcs, with four IFC4 conformance fixes by @gsuiaoll in #316
- chore(deps-dev): bump eslint from 10.9.1 to 10.10.0 in /packages/typescript by @dependabot[bot] in #318
- chore(deps-dev): bump typescript-eslint from 8.69.0 to 8.70.0 in /packages/typescript by @dependabot[bot] in #319
- fix(python): correct Instance.matrix docstring + VFF attribute-type parity claim by @iamahsanmehmood in #320
- fix(typescript): bump vitest to 4.1.11, force esbuild 0.28.1+, drop Node 18 by @iamahsanmehmood in #321
- docs: link the FreeCAD and Blender addons from the main README by @iamahsanmehmood in #322
- feat(python): loose-edge/curve support in build_instanced_scene() by @iamahsanmehmood in #323
- fix(python): create()'s scaffold loader hardcoded the top-level package name by @iamahsanmehmood in #324
- feat(python): expose loose-edge layer/curve grouping on the public typed model by @iamahsanmehmood in #325
- docs: fix stale Layer.hidden docstring by @iamahsanmehmood in #326
- Add .NET Fragments (.frag) export - port from Python/TypeScript (openskp#285) by @iamahsanmehmood in #327
- dotnet: real GUID/name-resolution/layer-hidden, Fragments export at full Python/C++ parity by @iamahsanmehmood in #328
- typescript: real GUID/name-resolution/layer-hidden, Fragments export at full Python/C++ parity by @iamahsanmehmood in #329
- dart: add Fragments (.frag) export - new package, full Python/C++ parity from the start by @iamahsanmehmood in #330
- .NET: full VFF attribute value-type decoding by @iamahsanmehmood in #331
- TypeScript: full VFF attribute value-type decoding by @iamahsanmehmood in #332
- Dart: full VFF attribute value-type decoding by @iamahsanmehmood in #333
- .NET: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #334
- TypeScript: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #335
- Dart: expose every attribute dictionary on InstanceNode/InstancedNode by @iamahsanmehmood in #336
- .NET: read VFF per-layer-hidden flag by @iamahsanmehmood in #337
- TypeScript: read VFF per-layer-hidden flag by @iamahsanmehmood in #338
- Dart: read VFF per-layer-hidden flag by @iamahsanmehmood in #339
- TypeScript: fix overlapping-hole triangulation by @iamahsanmehmood in #340
- Dart: fix overlapping-hole triangulation by @iamahsanmehmood in #341
- C++: full VFF attribute value-type decoding by @iamahsanmehmood in #342
- C++: fix overlapping-hole triangulation by @iamahsanmehmood in #343
- C++: verify and regression-test layer order + mesh_index properties by @iamahsanmehmood in #344
- .NET: fix legacy SectionPlanes/Texts/Dimensions silently dropped by ToGeometryBuilder by @iamahsanmehmood in #345
- TypeScript: fix readSectionPlane discarding plane/name/label/drawbase entirely by @iamahsanmehmood in #346
- cpp: add regression test for legacy section plane/text/dimension reading by @iamahsanmehmood in #347
- dotnet: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #348
- typescript: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #349
- dart: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #350
- cpp: add writer support for section planes, dimensions, text, construction lines/points by @iamahsanmehmood in #351
- dotnet: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #352
- typescript: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #353
- dart: fix construction line/point reader discarding parsed geometry by @iamahsanmehmood in #354
- python: fix Fragments export crash on shells with more than 65535 triangles by @iamahsanmehmood in #355
- dotnet: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #356
- typescript: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #357
- dart: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #358
- cpp: fix Fragments export writing wrong face ids on shells with more than 65535 triangles by @iamahsanmehmood in #359
- chore: synchronize all 5 languages at v1.3.0 by @iamahsanmehmood in #360
New Contributors
Full Changelog: preview-cpp-v1.3.1...cpp-v1.3.0
openskp Python 1.3.2 (GitHub-only, not on PyPI)
Not published to PyPI - a real, tested, tagged release (538 tests passing). Install by pinning this tag:
pip install "openskp[fragments] @ git+https://github.com/iamahsanmehmood/openskp.git@preview-python-v1.3.2#subdirectory=packages/python"
What's new since preview-python-v1.3.1
attribute_dictionaries now reaches GLB/JSON metadata export. build_scene()/build_instanced_scene() already correctly resolved every attribute dictionary an instance carries (not just SketchUp's own dynamic_attributes, which properties covers exclusively per #254), but no JSON-producing export path ever serialized it - only the IFC exporter surfaced this data, as Pset_<dict-name> properties. A consumer reading GLB/JSON metadata instead of the derived .ifc (e.g. a third-party plugin's own named dictionary, such as a steel-detailing tool's own dict) silently never saw it.
export/glb.py,export/json_export.py, andexport/instanced_glb.pynow include anattribute_dictionarieskey alongside the existingpropertieskey, keyed by each dictionary's own declared name.- Verified against real plugin data on a production file (
steelframer-dict, 45 entries); no output shape change for models with no extra dictionaries (attribute_dictionariesis simply{}). - Same fix ported to C++, see
preview-cpp-v1.3.1.
See CHANGELOG.md § 1.3.0 for full details.
openskp C++ 1.3.1 (GitHub-only, not the numbered release)
This release is not the numbered cpp-v1.3.0 release yet. It's a real, fully tested preview tag — build it by checking out this tag directly and following DEVELOPER_GUIDE.md's C++ install steps, or download the source archive attached below.
217 tests passing (in Release config, verified against this exact packaged archive from a fresh extraction, not just the working tree).
What's new since preview-cpp-v1.3.0
attribute_dictionaries now reaches JSON metadata export. json_export.cpp already had access to every attribute dictionary an instance carries (correctly resolved by build_scene(), added earlier in this same preview phase), but never wrote it into instance_node_to_json/mesh_metadata_to_json output — only the IFC exporter surfaced this data, as Pset_<dict-name> properties. Both functions now include an attribute_dictionaries key alongside properties, matching the same fix shipped to Python's preview-python-v1.3.2. Verified against real plugin data on a production file (steelframer-dict, 45 entries).
See CHANGELOG.md § preview-cpp-v1.3.0 for full details, and docs/LANGUAGE_PARITY.md for known gaps stated honestly.
openskp C++ 1.3.0 (GitHub-only, not the numbered release)
This release is not the numbered cpp-v1.3.0 release yet. It's a real, fully tested preview tag — build it by checking out this tag directly and following DEVELOPER_GUIDE.md's C++ install steps (build/install packages/cpp, then find_package(OpenSkp CONFIG REQUIRED)), or download the source archive attached below.
It will fold into a proper numbered cpp-v1.3.0 release once the known gaps below are closed and cross-language parity work catches up — tracked publicly in docs/LANGUAGE_PARITY.md and issue #285.
216 tests passing (in Release config, verified against this exact packaged archive from a fresh extraction, not just the working tree).
See CHANGELOG.md#preview-cpp-v130--2026-09-10--c-only-github-only-pre-release for full details. Headline additions:
- Direct SketchUp → Fragments (.frag) export — verified against the real
@thatopen/fragmentsruntime on two production files, roughly 5-9x faster end to end than the equivalent Python pipeline on the same real files. - 4 IFC export correctness fixes — units/axis, real instance names + layer visibility, plugin-attribute Psets, opt-in full-path classification.
- Multi-dictionary attribute extraction — every attribute dictionary an instance carries is now exposed by name, not just SketchUp's own
dynamic_attributes. - Real per-layer hidden-flag reading from VFF files,
model.layersnow in source-file order (not alphabetical), legacy pages/scenes reading, and construction lines/points reading (legacy only).
Known gaps are stated honestly rather than glossed over — see docs/LANGUAGE_PARITY.md for the full C++-vs-other-languages picture. The two worth calling out directly:
- Attribute dictionary values decode as strings only — no
Point3d/Vector3d/Length/nested-list support yet. - The legacy pages/scenes reader and the construction-line read path (as opposed to construction-points, which are verified byte-for-byte against a real fixture) have not been exercised against a real file that actually exhibits them — only synthetic byte-level tests mirroring Python's own ground-truthed test cases, plus real-file smoke testing (no crash, no false positives) on real production files that happen not to contain either.
openskp Python 1.3.1 (GitHub-only, not on PyPI)
Not published to PyPI - a real, tested, tagged release (531 tests passing, lint clean). Install by pinning this tag:
pip install "openskp[fragments] @ git+https://github.com/iamahsanmehmood/openskp.git@preview-python-v1.3.1#subdirectory=packages/python"
What's new since preview-python-v1.3.0
Real names for named organizational wrappers with no geometry of their own (PR #286) - found via a real FrameBuilder-authored steel-framing file. A wall like "W-2" is often a pure SketchUp group with a real name, wrapping several separately-meshed parts (studs, plates, cladding) rather than having any geometry of its own. Previously such a node never got a local_id, so its real name had nowhere to attach in the Fragments/IFC export - a viewer's tree showed only the wall's category repeated for every wall, never which one was which.
build_scene()/build_instanced_scene()'s name-resolution fallback now tries the definition's own name before falling back to the internal index - skipping SketchUp's own auto-generatedGroup#1/Component#12placeholders, which are no more meaningful than the index itself.- Both carry a new
name_is_generatedflag, so a consumer can tell a real name from a generated placeholder instead of presenting the latter as if it were real data. - The Fragments exporter now tracks any node with a real name as its own item (gets a
local_id, Name, GUID) even with zero geometry of its own.generated_name_guidscarried inModel.metadata, same mechanism aslayer_hidden.
Verified against a real production file and the real @thatopen/fragments runtime, not just this project's own reader.
openskp Python 1.3.0 (GitHub-only, not on PyPI)
This release is not published to PyPI yet. It's a real, fully tested, tagged release — install it directly from this tag:
pip install "openskp[fragments] @ git+https://github.com/iamahsanmehmood/openskp.git@preview-python-v1.3.0#subdirectory=packages/python"
It will fold into a proper python-v1.3.0 PyPI release once cross-language parity work catches up across TypeScript/.NET/Dart/C++ — tracked publicly in ROADMAP.md and issue #285.
530 tests passing, ruff check clean, package builds cleanly (python -m build).
See CHANGELOG.md#130—2026-09-09 for full details, or docs/DEVELOPER_GUIDE.md#fragments-export for the Fragments API reference. Headline additions:
- Direct SketchUp → Fragments (.frag) export — Python-only, no other language has this yet (an open TypeScript port, PR #276, is not yet mergeable). Fragments visibility is carried via a
Model.metadatasidecar, not the public schema; legacy files get synthetic per-item GUIDs, not real ones. - Triangulation: Shapely replaced with earcut — faster, and fixes a real concave-face undercoverage bug.
- 4 IFC export correctness fixes — units/axis, real instance names + layer visibility, plugin-attribute Psets, opt-in full-path classification.
- Real per-layer hidden-flag reading from VFF files, legacy pages/scenes reading, section-plane writer, construction line/point read+write, and a fix for a large real file (359MB/95k definitions) that previously exhausted all available memory.
Known gaps are stated honestly rather than glossed over — see docs/LANGUAGE_PARITY.md for the full Python-vs-other-languages picture, and issue #284 for the known legacy-format parsing gap (6/14 real old-format test files) unrelated to this release but tracked at the same time.