Skip to content

Releases: iamahsanmehmood/openskp

v1.3.0

Choose a tag to compare

@github-actions github-actions released this 18 Sep 05:36
e8b5af6

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:...
Read more

typescript-v1.3.0

Choose a tag to compare

@github-actions github-actions released this 18 Sep 05:47
e8b5af6

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

Choose a tag to compare

@github-actions github-actions released this 18 Sep 05:35
e8b5af6

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

Choose a tag to compare

@github-actions github-actions released this 18 Sep 05:36
e8b5af6

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

Choose a tag to compare

@github-actions github-actions released this 18 Sep 05:37
e8b5af6

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)

Choose a tag to compare

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, and export/instanced_glb.py now include an attribute_dictionaries key alongside the existing properties key, 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_dictionaries is 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)

Choose a tag to compare

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)

Choose a tag to compare

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/fragments runtime 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.layers now 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)

Choose a tag to compare

@iamahsanmehmood iamahsanmehmood released this 09 Sep 10:29
3b148f9

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-generated Group#1/Component#12 placeholders, which are no more meaningful than the index itself.
  • Both carry a new name_is_generated flag, 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_guids carried in Model.metadata, same mechanism as layer_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)

Choose a tag to compare

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.metadata sidecar, 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.