python-cad-tools 0.1.7__tar.gz → 0.1.10__tar.gz

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.
Files changed (277) hide show
  1. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/.github/workflows/ci.yml +120 -6
  2. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/.gitignore +1 -0
  3. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/CHANGELOG.md +43 -0
  4. {python_cad_tools-0.1.7/src/python_cad_tools.egg-info → python_cad_tools-0.1.10}/PKG-INFO +77 -1
  5. python_cad_tools-0.1.7/PKG-INFO → python_cad_tools-0.1.10/README.md +57 -37
  6. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/docs/drawing-extensions.md +16 -3
  7. python_cad_tools-0.1.10/docs/neutral-model.md +138 -0
  8. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/docs/public-api.md +9 -2
  9. python_cad_tools-0.1.10/docs/toolchain.md +102 -0
  10. python_cad_tools-0.1.10/docs/two-tier-contract.md +51 -0
  11. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/pyproject.toml +34 -0
  12. python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/asset-manifest.json +1 -0
  13. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/animationGroup-CkBwZBaC.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/animationGroup-BFpCrP0o.js +1 -1
  14. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/bakedVertexAnimation-BRwXBaR8.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/bakedVertexAnimation-DKIsxzCh.js +1 -1
  15. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/basisTextureLoader-BRWOHjz-.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/basisTextureLoader-BWlCMZKU.js +1 -1
  16. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/brdfTextureTools-_z9j6IDT.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/brdfTextureTools-CpZi6QbK.js +2 -2
  17. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/bumpFragment-D1ib6sWk.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/bumpFragment-ChvT23CB.js +1 -1
  18. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/bumpVertex-rRJFggby.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/bumpVertex-nEs2VPot.js +1 -1
  19. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/bumpVertexDeclaration-DpYJme-Y.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/bumpVertexDeclaration-BBNawFh8.js +1 -1
  20. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/clipPlaneFragment-8V4Sc9NG.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/clipPlaneFragment-C77PAFKo.js +1 -1
  21. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/clipPlaneVertex-05ivX8eb.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/clipPlaneVertex-CBvbot7K.js +1 -1
  22. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/cubemapToSphericalPolynomial-BOak-Hxf.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/cubemapToSphericalPolynomial-BCMcxsAF.js +1 -1
  23. python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/dds-0RTqNYDh.js +1 -0
  24. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/dds.pure-Ce-RwcPa.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/dds.pure-OdUDHE0G.js +1 -1
  25. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/ddsTextureLoader-DmqLHZsO.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/ddsTextureLoader-1l_GkUW1.js +1 -1
  26. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/default.fragment-skPC2PC5.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/default.fragment-DJkWvM0e.js +1 -1
  27. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/default.vertex-Bf7EZhGi.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/default.vertex-CMrXZjYP.js +1 -1
  28. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/defaultUboDeclaration-DveD0pj_.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/defaultUboDeclaration-Da9s8wLf.js +1 -1
  29. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/dumpTools-E15xCOlX.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/dumpTools-BfBU44JR.js +2 -2
  30. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/envTextureLoader-Bw7xWacU.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/envTextureLoader-CUgicy-i.js +1 -1
  31. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/exrTextureLoader-DdM34m4d.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/exrTextureLoader-4Fy-_N6F.js +1 -1
  32. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphApplyForceBlock-C2CCzJfK.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphApplyForceBlock-UxcpUOb4.js +1 -1
  33. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphApplyImpulseBlock-DaQNBsAi.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphApplyImpulseBlock-8doxumAC.js +1 -1
  34. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphArrayIndexBlock-Bm_uAgA1.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphArrayIndexBlock-q8W2FV-w.js +1 -1
  35. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphBezierCurveEasingBlock-BIRe7y9_.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphBezierCurveEasingBlock-3ZEqX4ZJ.js +1 -1
  36. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphBinaryOperationBlock-DMJBYgfr.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphBinaryOperationBlock-D3ayisoN.js +1 -1
  37. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphBranchBlock-QxXghWCp.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphBranchBlock-BR9ohqut.js +1 -1
  38. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphCachedOperationBlock-I8EAYjjd.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphCachedOperationBlock-DKeQ8sZI.js +1 -1
  39. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphCancelDelayBlock-BzNEnhY9.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphCancelDelayBlock-DzimG9bV.js +1 -1
  40. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphCodeExecutionBlock-B7ItpxKe.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphCodeExecutionBlock-BDp2kDKe.js +1 -1
  41. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphConditionalDataBlock-BhbDYfGS.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphConditionalDataBlock-DUy-bdD8.js +1 -1
  42. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphConsoleLogBlock-DXpJ7TNt.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphConsoleLogBlock-CZsZDCqO.js +1 -1
  43. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphConstantBlock-DNvjca7m.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphConstantBlock-D4jP5Zis.js +1 -1
  44. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphContextBlock-aSW2fQMB.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphContextBlock-iDbQUT2i.js +1 -1
  45. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphCounterBlock-CQB87ocL.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphCounterBlock-fNm-N_rD.js +1 -1
  46. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphDataSwitchBlock-DuoW5gn_.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphDataSwitchBlock-a2hfmRfA.js +1 -1
  47. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphDebounceBlock-CKgVrKHO.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphDebounceBlock-B-ua6-rc.js +1 -1
  48. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphDebugBlock-DoCK3CbK.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphDebugBlock-CFvv9NT9.js +1 -1
  49. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphDoNBlock-BGQscpK_.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphDoNBlock-QrVeUF7s.js +1 -1
  50. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphEasingBlock-C8ByegaL.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphEasingBlock-BL-amui0.js +1 -1
  51. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphFlipFlopBlock-DZZ6IZdT.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphFlipFlopBlock-DGNR6aQc.js +1 -1
  52. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphForLoopBlock-jnLx7y5R.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphForLoopBlock-CGGzIxtA.js +1 -1
  53. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphFunctionReferenceBlock-DVCyAPqf.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphFunctionReferenceBlock-BbPKAgEi.js +1 -1
  54. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphGLTFDataProvider-Co3We5bN.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGLTFDataProvider-5JE9USOH.js +1 -1
  55. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphGetAngularVelocityBlock-6xyNjSA6.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetAngularVelocityBlock-DIu658Lh.js +1 -1
  56. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphGetAssetBlock-Cmz2b6ZC.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetAssetBlock-DTCqvYE6.js +1 -1
  57. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphGetLinearVelocityBlock-DAEGIqYD.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetLinearVelocityBlock-RW4Yofih.js +1 -1
  58. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphGetPhysicsMassPropertiesBlock-BjCZBRGe.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetPhysicsMassPropertiesBlock-aiF5BOL9.js +1 -1
  59. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphGetPropertyBlock-1qAsVO8r.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetPropertyBlock-D15fpxe7.js +1 -1
  60. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphGetSoundVolumeBlock-CjzseaZ_.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetSoundVolumeBlock-CwR7xfkj.js +1 -1
  61. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphGetVariableBlock-BIHX5QMz.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetVariableBlock-eTZrs7GE.js +1 -1
  62. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphIndexOfBlock-CiQsoigA.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphIndexOfBlock-DPZf_95j.js +1 -1
  63. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphInterpolationBlock-Bw0KkJ0e.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphInterpolationBlock-DiAJzLOE.js +1 -1
  64. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphIsKeyPressedBlock-DndaXIf-.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphIsKeyPressedBlock-CADmRrDd.js +1 -1
  65. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphIsSoundPlayingBlock-B6Qttnxj.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphIsSoundPlayingBlock-D8B4F2Z5.js +1 -1
  66. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphJsonPointerParserBlock-DNYimm79.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphJsonPointerParserBlock-Xfl-dDJk.js +1 -1
  67. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphKeyDownEventBlock-C4bd_Uk_.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphKeyDownEventBlock-Cm2zaYXU.js +1 -1
  68. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphKeyUpEventBlock-BbiC-9yS.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphKeyUpEventBlock-C_BP5Hf5.js +1 -1
  69. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphKeyboardEventBlock-8jNrKia4.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphKeyboardEventBlock-C05IFCUh.js +1 -1
  70. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphMathBlocks-Bp9VLo95.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphMathBlocks-DlWMU189.js +1 -1
  71. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphMathCombineExtractBlocks-RBcvT17x.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphMathCombineExtractBlocks-qSe8QChR.js +1 -1
  72. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphMatrixMathBlocks-CDMmeteR.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphMatrixMathBlocks-DbzURNpp.js +1 -1
  73. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphMeshPickEventBlock-BLD5qZLm.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphMeshPickEventBlock-DxJxxG3S.js +1 -1
  74. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphMultiGateBlock-Bp_x5hf9.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphMultiGateBlock-BPZd8mbK.js +1 -1
  75. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphPauseAnimationBlock-BJEgts2P.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPauseAnimationBlock-C3c7bzsQ.js +1 -1
  76. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphPauseSoundBlock-mB4vOhyw.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPauseSoundBlock-DJvpN7CX.js +1 -1
  77. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphPhysicsCollisionEventBlock-DHywozhh.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPhysicsCollisionEventBlock-CNunrdNk.js +1 -1
  78. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphPlayAnimationBlock-db7Y-Q7u.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPlayAnimationBlock-ByRpWDZ5.js +1 -1
  79. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphPlaySoundBlock-CxsvloFb.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPlaySoundBlock-D5G_NhMs.js +1 -1
  80. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphPointerDownEventBlock-CVZzeLa6.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPointerDownEventBlock-pWyOiXvU.js +1 -1
  81. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphPointerMoveEventBlock-kgytqAo-.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPointerMoveEventBlock-BIgzBvv9.js +1 -1
  82. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOutEventBlock-DIiGO9Sz.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOutEventBlock-DaEitrdC.js +1 -1
  83. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOverEventBlock-yJsL04S3.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOverEventBlock-Bwc4ooou.js +1 -1
  84. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphPointerUpEventBlock-oGalI3fw.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPointerUpEventBlock-BtmDICq5.js +1 -1
  85. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphReceiveCustomEventBlock-CGU30qtJ.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphReceiveCustomEventBlock-BKnkEvuu.js +1 -1
  86. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSceneReadyEventBlock-CxumRn2U.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSceneReadyEventBlock-CawN6pQ_.js +1 -1
  87. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSceneTickEventBlock-_hKXW4nX.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSceneTickEventBlock-zXyWDNoE.js +1 -1
  88. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSendCustomEventBlock-BadQ6Fmt.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSendCustomEventBlock-C4QwZQD_.js +1 -1
  89. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSequenceBlock-ZX23Dn7h.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSequenceBlock-C2DrAckq.js +1 -1
  90. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSetAngularVelocityBlock-DaDY5MFY.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetAngularVelocityBlock-B2_GCxnR.js +1 -1
  91. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSetDelayBlock-ClLunIUZ.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetDelayBlock-CoxLB_JO.js +1 -1
  92. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSetLinearVelocityBlock-Cdu7nMQr.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetLinearVelocityBlock-Dcl_TlE4.js +1 -1
  93. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSetPhysicsMotionTypeBlock-BXRAhWUV.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetPhysicsMotionTypeBlock-VH0XyIek.js +1 -1
  94. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSetPropertyBlock-BzUyWEvj.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetPropertyBlock-BMVB2YpZ.js +1 -1
  95. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSetSoundVolumeBlock-D_eRVaRX.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetSoundVolumeBlock-B3LlN1_P.js +1 -1
  96. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSetVariableBlock-C48wCF3K.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetVariableBlock-DjPcD-uk.js +1 -1
  97. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSoundEndedEventBlock-JilA8K68.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSoundEndedEventBlock-B3BPhieu.js +1 -1
  98. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphStopAnimationBlock-DVVhNH2l.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphStopAnimationBlock-DB-YMsd0.js +1 -1
  99. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphStopSoundBlock-MkvXT-pz.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphStopSoundBlock-rkBjhxoU.js +1 -1
  100. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphSwitchBlock-BA1OpeUq.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSwitchBlock-zgP4JU9F.js +1 -1
  101. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphThrottleBlock-aR7ATriv.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphThrottleBlock-BFCejhG2.js +1 -1
  102. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphTransformCoordinatesSystemBlock-_Z_XQ1KU.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphTransformCoordinatesSystemBlock-B5sXEjm6.js +1 -1
  103. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphTypeToTypeBlocks-CbmOuO1Y.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphTypeToTypeBlocks-GWfI6VCP.js +1 -1
  104. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphUnaryOperationBlock-BMYbqqlw.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphUnaryOperationBlock-C3x4cBoo.js +1 -1
  105. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphVectorMathBlocks-IvfUhMXD.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphVectorMathBlocks-DHmbwNwJ.js +1 -1
  106. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphWaitAllBlock-XXcp6Uu_.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphWaitAllBlock-D2S-o8ta.js +1 -1
  107. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/flowGraphWhileLoopBlock-CiCB0FD8.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphWhileLoopBlock-BIaIe1G3.js +1 -1
  108. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/fogFragment-Dzpo6VdR.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/fogFragment-lpu2fSrY.js +1 -1
  109. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-DyyJ3SmK.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-C3mITXca.js +1 -1
  110. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-eKQ5MVB9.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-r2QTVyrX.js +1 -1
  111. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-BA9M7qMm.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-BRSDLsfp.js +1 -1
  112. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-BL60TTsE.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-BTuradYo.js +1 -1
  113. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-CKsJZAkY.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-WPP1vXOl.js +1 -1
  114. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-Bo6VgkDg.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-s39KAVkx.js +1 -1
  115. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-BKNvofx9.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-BMmjNFoS.js +1 -1
  116. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-CwwM4G1X.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-egtcopGg.js +1 -1
  117. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-CRzxSOuN.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-6Odgg2pj.js +1 -1
  118. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-CzPcN15t.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-Bo8-VkdD.js +1 -1
  119. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/geometry.fragment-D7dB1cPB.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/geometry.fragment-CuLpqUUk.js +1 -1
  120. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/geometry.fragment-D6FSJnnh.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/geometry.fragment-DHXfK03n.js +1 -1
  121. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/geometry.vertex-B30SEDfq.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/geometry.vertex-Bm0A4YY1.js +1 -1
  122. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/geometry.vertex-CEqGE1RP.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/geometry.vertex-DSbpeedB.js +1 -1
  123. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/glowBlurPostProcess.fragment-qbxgPsfh.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/glowBlurPostProcess.fragment-Qbdz4gLu.js +1 -1
  124. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.fragment-pr52K7ES.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.fragment-1hOZT_4N.js +1 -1
  125. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.vertex-Bu7wD6_v.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.vertex-Cg1UfAtC.js +1 -1
  126. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/glowMapMerge.fragment-DQIuOzG_.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/glowMapMerge.fragment-BoiNEY2n.js +1 -1
  127. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/glowMapMerge.vertex--Gv__zWj.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/glowMapMerge.vertex-CpWKznSe.js +1 -1
  128. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/harmonicsFunctions-KdJGOHc6.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/harmonicsFunctions-DIzIowqF.js +1 -1
  129. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/helperFunctions-DgEuNo6U.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/helperFunctions-7oODcxNt.js +1 -1
  130. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/iesTextureLoader-CtVX46fM.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/iesTextureLoader-wAQEvbfd.js +1 -1
  131. python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/index-CnrKUEff.css +1 -0
  132. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/index-BlqB2_Pr.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/index-D6uexFRQ.js +153 -155
  133. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-BX7Lt7ea.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-Bt6sD8qx.js +1 -1
  134. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-DYsyjXaA.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-DGSh46Om.js +1 -1
  135. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-ClVvwFB7.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-BlhNG48F.js +1 -1
  136. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-DPBXY9JC.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-C1fudmM_.js +1 -1
  137. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-Dug6rT1B.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-BWYB4Ycu.js +1 -1
  138. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-BYwqlIXx.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-DFH4bO-3.js +1 -1
  139. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/ktxTextureLoader-BIXHU16K.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/ktxTextureLoader-DsFCeiiH.js +1 -1
  140. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/lightFragment-DHmrE5GX.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/lightFragment-CHOWnPK9.js +1 -1
  141. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/logDepthDeclaration-DYQ6buM5.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/logDepthDeclaration-k15gEJ3y.js +1 -1
  142. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/logDepthVertex-N8cjnWeq.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/logDepthVertex-CHajYpMu.js +1 -1
  143. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/mainUVVaryingDeclaration-04-YeMcZ.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/mainUVVaryingDeclaration-BGrReuHo.js +1 -1
  144. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/meshUboDeclaration-Cxie7MAJ.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/meshUboDeclaration-DJwUrZx2.js +1 -1
  145. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/oitFragment-Yqa_2p-U.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/oitFragment-BsvP7q4R.js +1 -1
  146. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-B-ILUybs.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-B8VN-IrQ.js +1 -1
  147. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-CYJW19wI.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-C06kkVuL.js +1 -1
  148. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-CZ4PwccK.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-A4s3IgoK.js +1 -1
  149. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-6zrdkvEg.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-DJCYXObK.js +1 -1
  150. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/openpbrMaterial.pure-BsEUy5d2.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrMaterial.pure-Bs5DC-y9.js +3 -3
  151. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/openpbrMaterialLoadingAdapter-BqYCxfaV.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrMaterialLoadingAdapter-C_c5atIs.js +2 -2
  152. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-Bi8t7k_g.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-CYdsV_SL.js +1 -1
  153. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-DlDoA2Eg.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-DaaAXfx7.js +1 -1
  154. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration-Cq9kCjmQ.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration-3JPIOWr0.js +1 -1
  155. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration-SB6Z4wg9.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration-rQewqvT4.js +1 -1
  156. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/packingFunctions-BPvmjixW.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/packingFunctions-Bn1t67wx.js +1 -1
  157. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/packingFunctions-BPDUaRnj.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/packingFunctions-DMIYB28m.js +1 -1
  158. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/pass.fragment-CGW86Knk.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pass.fragment-DYkGKBSd.js +1 -1
  159. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/passCube.fragment-BXLbB-Q5.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/passCube.fragment-D3u4_FLI.js +1 -1
  160. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/passCube.fragment-CagZgpfr.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/passCube.fragment-DNC6H8VG.js +1 -1
  161. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/pbr.fragment-CMmf0u9q.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbr.fragment-BiEI1YfJ.js +1 -1
  162. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/pbr.vertex-SKsjk5Pj.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbr.vertex-A6knpQsw.js +1 -1
  163. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/pbrBRDFFunctions-DNsUN6qQ.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrBRDFFunctions-BeK39hzl.js +1 -1
  164. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/pbrDebug-Dw9FHwdO.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrDebug-mLga6xKt.js +1 -1
  165. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/pbrIBLFunctions-ynQ9EJMa.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrIBLFunctions-Db54NySa.js +1 -1
  166. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/pbrMaterial.pure-DD-Qp64W.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrMaterial.pure-Dp6NmN9w.js +2 -2
  167. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/pbrMaterialLoadingAdapter-BbrOLlOF.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrMaterialLoadingAdapter-CvXJgU4i.js +1 -1
  168. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/pbrUboDeclaration-Bqvz9xQU.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrUboDeclaration-BW-aS_Fc.js +1 -1
  169. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/postprocess.vertex-BMFYhnff.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/postprocess.vertex-BIWUhm9k.js +1 -1
  170. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/procedural.vertex-pqGGkP1-.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/procedural.vertex-DGnTrHzl.js +1 -1
  171. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/procedural.vertex-BfaBXzj0.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/procedural.vertex-WXmVjrA9.js +1 -1
  172. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/reflectionFunction-BCniWKEL.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/reflectionFunction-DrJ5CgYG.js +1 -1
  173. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/rgbdDecode.fragment-DCuzC7q7.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/rgbdDecode.fragment-7H1BkSqs.js +1 -1
  174. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-b49hhC5d.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-CTyiKQCb.js +1 -1
  175. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-BAhasmlV.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-CoVaziaW.js +1 -1
  176. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/sceneUboDeclaration-DPddq9hQ.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/sceneUboDeclaration-Ck43xulU.js +1 -1
  177. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-C5g8djMT.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-Bspm0dPH.js +1 -1
  178. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-CbjSik1W.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-CD-iXyeA.js +1 -1
  179. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/tgaTextureLoader-DqTGNNaJ.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/tgaTextureLoader-DrtUlmLD.js +1 -1
  180. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/vertexColorMixing-Bp9_JGdC.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/vertexColorMixing-7aNKbB6k.js +1 -1
  181. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/index.html +2 -2
  182. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/artifacts.py +50 -3
  183. python_cad_tools-0.1.10/src/python_cad_tools/build-info.json +1 -0
  184. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/drawings/__init__.py +14 -1
  185. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/drawings/_validation.py +15 -1
  186. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/elements.py +17 -0
  187. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/base.py +1 -10
  188. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/annotations.py +58 -0
  189. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/dxf.py +1 -0
  190. python_cad_tools-0.1.10/src/python_cad_tools/exporters/ifc.py +547 -0
  191. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/manifests.py +17 -1
  192. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/model.py +2 -2
  193. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/units.py +0 -7
  194. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/validation.py +115 -1
  195. python_cad_tools-0.1.10/src/python_cad_tools.egg-info/PKG-INFO +229 -0
  196. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/SOURCES.txt +171 -168
  197. python_cad_tools-0.1.10/src/python_cad_tools.egg-info/requires.txt +42 -0
  198. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/scm_file_list.json +275 -270
  199. python_cad_tools-0.1.10/src/python_cad_tools.egg-info/scm_version.json +8 -0
  200. python_cad_tools-0.1.7/README.md +0 -116
  201. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/asset-manifest.json +0 -1
  202. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/dds-Wp2qLmYy.js +0 -1
  203. python_cad_tools-0.1.7/src/python_cad_tools/_viewer_static/assets/index-DcTTrc-8.css +0 -1
  204. python_cad_tools-0.1.7/src/python_cad_tools/build-info.json +0 -1
  205. python_cad_tools-0.1.7/src/python_cad_tools/exporters/ifc.py +0 -229
  206. python_cad_tools-0.1.7/src/python_cad_tools.egg-info/requires.txt +0 -16
  207. python_cad_tools-0.1.7/src/python_cad_tools.egg-info/scm_version.json +0 -8
  208. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/.gitattributes +0 -0
  209. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/.githooks/pre-push +0 -0
  210. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/.github/workflows/downstream-compatibility.yml +0 -0
  211. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/.github/workflows/release-candidate.yml +0 -0
  212. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/.github/workflows/release.yml +0 -0
  213. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/.opencode/commands/autocommit.md +0 -0
  214. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/.opencode/tools/specrepo-autocommit.js +0 -0
  215. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/.opencode/tools/specrepo-autocommit.py +0 -0
  216. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/AGENTS.md +0 -0
  217. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/CLAUDE.md +0 -0
  218. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/LICENSE +0 -0
  219. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/MANIFEST.in +0 -0
  220. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/docs/build-semantics.md +0 -0
  221. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/docs/manifests.md +0 -0
  222. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/docs/project-configuration.md +0 -0
  223. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/docs/spikes/format-feasibility.md +0 -0
  224. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/docs/viewer-delivery.md +0 -0
  225. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/setup.cfg +0 -0
  226. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/__init__.py +0 -0
  227. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/__main__.py +0 -0
  228. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/_locking.py +0 -0
  229. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/_project_loader.py +0 -0
  230. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/_project_state.py +0 -0
  231. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/_scaffold.py +0 -0
  232. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/_transaction.py +0 -0
  233. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/app.webmanifest +0 -0
  234. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/assets/hdrTextureLoader-BGQvgh0h.js +0 -0
  235. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/assets/mesh.vertexData.functions-ayNlGC5K.js +0 -0
  236. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/favicon.svg +0 -0
  237. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/sw.js +0 -0
  238. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/build.py +0 -0
  239. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/cli.py +0 -0
  240. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/context.py +0 -0
  241. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/determinism.py +0 -0
  242. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/drawings/_catalog.py +0 -0
  243. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exceptions.py +0 -0
  244. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/__init__.py +0 -0
  245. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/__init__.py +0 -0
  246. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/model.py +0 -0
  247. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/pdf.py +0 -0
  248. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/primitives.py +0 -0
  249. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/projection.py +0 -0
  250. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/svg.py +0 -0
  251. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/glb.py +0 -0
  252. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/quantities.py +0 -0
  253. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/step.py +0 -0
  254. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/geometry.py +0 -0
  255. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/project_config.py +0 -0
  256. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/py.typed +0 -0
  257. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/runtime_sync.py +0 -0
  258. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/build-manifest-1.json +0 -0
  259. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/design-manifest-1.json +0 -0
  260. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/download-manifest-2.json +0 -0
  261. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/drawing-annotations-1.json +0 -0
  262. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/glb-manifest-1.json +0 -0
  263. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/ifc-validation-1.json +0 -0
  264. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/quantities-1.json +0 -0
  265. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/run-metadata-1.json +0 -0
  266. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/site-metadata-1.json +0 -0
  267. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/step-validation-1.json +0 -0
  268. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/site.py +0 -0
  269. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/.gitignore +0 -0
  270. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/README.md +0 -0
  271. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/config.py +0 -0
  272. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/drawing_annotations.py +0 -0
  273. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/generated/.gitkeep +0 -0
  274. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/pyproject.toml +0 -0
  275. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/dependency_links.txt +0 -0
  276. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/entry_points.txt +0 -0
  277. {python_cad_tools-0.1.7 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/top_level.txt +0 -0
@@ -250,11 +250,127 @@ jobs:
250
250
  name: ${{ matrix.lock }}
251
251
  path: ${{ matrix.lock }}
252
252
 
253
+ toolchain-matrix:
254
+ name: Toolchain matrix (${{ matrix.os }}, py${{ matrix.python }}, ${{ matrix.group }})
255
+ strategy:
256
+ fail-fast: false
257
+ matrix:
258
+ os: [ubuntu-latest, macos-latest]
259
+ python: ["3.12", "3.13"]
260
+ group: [core, cad, bim, mesh, drawings, engineering, visualization, all]
261
+ runs-on: ${{ matrix.os }}
262
+ steps:
263
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
264
+ # Full matrix on main/tags/release-candidates; a fast core+all subset on pull requests.
265
+ - name: Determine whether this matrix cell runs
266
+ id: gate
267
+ run: |
268
+ if [ "${{ github.event_name }}" = "pull_request" ] && \
269
+ ! { [ "${{ matrix.os }}" = "ubuntu-latest" ] && [ "${{ matrix.python }}" = "3.13" ] && \
270
+ { [ "${{ matrix.group }}" = "core" ] || [ "${{ matrix.group }}" = "all" ]; }; }; then
271
+ echo "run=false" >> "$GITHUB_OUTPUT"
272
+ else
273
+ echo "run=true" >> "$GITHUB_OUTPUT"
274
+ fi
275
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
276
+ if: steps.gate.outputs.run == 'true'
277
+ with:
278
+ python-version: ${{ matrix.python }}
279
+ cache: pip
280
+ - run: python -m pip install --upgrade pip
281
+ if: steps.gate.outputs.run == 'true'
282
+ - name: Install capability group
283
+ if: steps.gate.outputs.run == 'true'
284
+ run: |
285
+ if [ "${{ matrix.group }}" = "core" ]; then
286
+ pip install -e .
287
+ else
288
+ pip install -e ".[${{ matrix.group }}]"
289
+ fi
290
+ - run: pip check
291
+ if: steps.gate.outputs.run == 'true'
292
+ - name: Import declared libraries for this group
293
+ if: steps.gate.outputs.run == 'true'
294
+ run: |
295
+ python - <<'PY'
296
+ import importlib
297
+ import json
298
+ import sys
299
+
300
+ GROUPS = {
301
+ "core": ["build123d", "OCP", "ifcopenshell", "trimesh", "numpy", "ezdxf", "reportlab", "pypdf"],
302
+ "cad": ["build123d", "OCP"],
303
+ "bim": ["ifcopenshell"],
304
+ "mesh": ["trimesh", "numpy"],
305
+ "drawings": ["ezdxf", "reportlab", "pypdf"],
306
+ "engineering": ["shapely", "manifold3d", "meshio"],
307
+ "visualization": [],
308
+ "all": [
309
+ "build123d", "OCP", "ifcopenshell", "trimesh", "numpy", "ezdxf", "reportlab", "pypdf",
310
+ "shapely", "manifold3d", "meshio",
311
+ ],
312
+ }
313
+ group = "${{ matrix.group }}"
314
+ modules = GROUPS[group]
315
+ results = {}
316
+ for name in modules:
317
+ try:
318
+ module = importlib.import_module(name)
319
+ results[name] = getattr(module, "__version__", "unknown")
320
+ except ImportError as error:
321
+ print(f"::error::failed to import {name!r} for group {group!r}: {error}", file=sys.stderr)
322
+ sys.exit(1)
323
+ report = {
324
+ "schema_id": "urn:python-cad-tools:schema:toolchain-compatibility:1",
325
+ "schema_version": 1,
326
+ "os": "${{ matrix.os }}",
327
+ "python": "${{ matrix.python }}",
328
+ "group": group,
329
+ "resolved_versions": results,
330
+ "ok": True,
331
+ }
332
+ with open("toolchain-compatibility.json", "w", encoding="utf-8") as stream:
333
+ json.dump(report, stream, indent=2, sort_keys=True)
334
+ print(json.dumps(report, indent=2, sort_keys=True))
335
+ PY
336
+ - name: Tier-2 interop smoke and no-GUI assertion
337
+ if: steps.gate.outputs.run == 'true' && matrix.group == 'all'
338
+ run: |
339
+ python - <<'PY'
340
+ import sys
341
+
342
+ from build123d import Box
343
+ from python_cad_tools.geometry import tessellate
344
+
345
+ solid = Box(10, 10, 10)
346
+ vertices, triangles = tessellate(solid, 0.5, 0.25)
347
+ assert vertices and triangles, "tessellation produced no geometry"
348
+
349
+ import trimesh
350
+ mesh = trimesh.Trimesh(vertices=vertices, faces=triangles, process=False)
351
+ assert mesh.is_watertight or len(mesh.faces) > 0, "trimesh failed to load the tessellated shape"
352
+
353
+ import ifcopenshell
354
+ file = ifcopenshell.file(schema="IFC4")
355
+ file.createIfcCartesianPoint((0.0, 0.0, 0.0))
356
+
357
+ import ezdxf
358
+ document = ezdxf.new("R2018")
359
+ document.modelspace().add_line((0, 0), (1, 1))
360
+
361
+ forbidden = [name for name in sys.modules if name.startswith(("vtk", "pyvista", "PyQt", "PySide", "tkinter"))]
362
+ assert not forbidden, f"GUI/visualization modules present after Tier-2 interop smoke: {forbidden}"
363
+ print("Tier-2 interop smoke and no-GUI assertion passed.")
364
+ PY
365
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
366
+ if: steps.gate.outputs.run == 'true'
367
+ with:
368
+ name: toolchain-compatibility-${{ matrix.os }}-py${{ matrix.python }}-${{ matrix.group }}
369
+ path: toolchain-compatibility.json
370
+
253
371
  build-publish:
254
372
  name: Build and publish to PyPI
255
- if: |
256
- (github.event_name == 'push' && github.ref == 'refs/heads/main') ||
257
- (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v'))
373
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
258
374
  needs:
259
375
  - lint-type-unit
260
376
  - exporter-integration
@@ -298,9 +414,7 @@ jobs:
298
414
 
299
415
  provenance:
300
416
  name: Generate SLSA provenance
301
- if: |
302
- (github.event_name == 'push' && github.ref == 'refs/heads/main') ||
303
- (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v'))
417
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
304
418
  needs: [build-publish]
305
419
  permissions:
306
420
  actions: read
@@ -9,6 +9,7 @@ htmlcov/
9
9
  build/
10
10
  dist/
11
11
  *.egg-info/
12
+ build-local.sh
12
13
 
13
14
  generated/*
14
15
  !generated/.gitkeep
@@ -7,6 +7,49 @@ stable release is published.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.10] - 2026-08-11
11
+
12
+ ### Added
13
+
14
+ - Capability-based dependency extras (`cad`, `bim`, `mesh`, `drawings`,
15
+ `engineering`, `visualization`, `all`); the Tier 1 verified stack stays
16
+ required in `[project.dependencies]`. See `docs/toolchain.md`.
17
+ - A documented two-tier authoring contract (`docs/two-tier-contract.md`) and a
18
+ neutral-model field reference (`docs/neutral-model.md`).
19
+ - `DesignElement.properties` now exports as `Pset_PythonCadUser` on IFC-exported
20
+ elements; property values must be `str`, `bool`, `int`, or `float`.
21
+ - Computed quantities now export as an `IfcElementQuantity` named
22
+ `Qto_PythonCadDesign` on IFC-exported elements with a quantity record.
23
+ - `DesignElement.storey` now drives on-demand `IfcBuildingStorey` creation; a
24
+ model with no declared storey is unaffected.
25
+ - New `DesignElement.openings: list[Opening]` field; each opening exports an
26
+ `IfcOpeningElement` + `IfcRelVoidsElement` on its host. Openings add IFC
27
+ semantics only — geometry in every other format is unaffected.
28
+ - New public `python_cad_tools.drawings.Dimension` annotation primitive,
29
+ rendered through the verified annotation pipeline in SVG, DXF, and PDF.
30
+
31
+ ### Changed
32
+
33
+ - The IFC unit assignment gains a `MASSUNIT` (`KILO`/`GRAM`) entry. This
34
+ changes the emitted IFC file, and therefore its artifact hash, for every
35
+ project — a one-time change from this release.
36
+
37
+ ## [0.1.9] - 2026-08-03
38
+
39
+ ### Fixed
40
+
41
+ - Made iPhone panning substantially faster and added visible, press-and-hold pan and zoom controls for reliable touch navigation when browser gestures are inconsistent.
42
+ - Added a selectable 1×–100× navigation speed that adjusts drag, wheel, pinch, and on-screen pan/zoom controls, with the previous speed retained as the minimum.
43
+
44
+ ## [0.1.8] - 2026-07-21
45
+
46
+ ### Fixed
47
+ - Made CI publish to PyPI and generate release provenance only for version-tag
48
+ pushes, preventing the following `main` push from attempting to upload the
49
+ same immutable distribution files a second time.
50
+ - Corrected Pan mode to replace Babylon's higher-priority primary-touch Rotate
51
+ mapping on iPhone instead of only adding a buttonless-touch fallback.
52
+
10
53
  ## [0.1.7] - 2026-07-21
11
54
 
12
55
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-cad-tools
3
- Version: 0.1.7
3
+ Version: 0.1.10
4
4
  Summary: Typed, headless Python tooling for CAD/BIM models and artifacts
5
5
  Author: Brandon Benge
6
6
  License: AGPL-3.0-only
@@ -26,6 +26,25 @@ Requires-Dist: numpy<3,>=2.3
26
26
  Requires-Dist: ezdxf<2,>=1.4
27
27
  Requires-Dist: reportlab<5,>=4.4
28
28
  Requires-Dist: pypdf<7,>=6
29
+ Provides-Extra: cad
30
+ Requires-Dist: build123d<0.12,>=0.11.1; extra == "cad"
31
+ Requires-Dist: cadquery-ocp-novtk<7.10,>=7.9.3.1.1; extra == "cad"
32
+ Provides-Extra: bim
33
+ Requires-Dist: ifcopenshell<0.9,>=0.8.5; extra == "bim"
34
+ Provides-Extra: mesh
35
+ Requires-Dist: trimesh<5,>=4.12; extra == "mesh"
36
+ Requires-Dist: numpy<3,>=2.3; extra == "mesh"
37
+ Provides-Extra: drawings
38
+ Requires-Dist: ezdxf<2,>=1.4; extra == "drawings"
39
+ Requires-Dist: reportlab<5,>=4.4; extra == "drawings"
40
+ Requires-Dist: pypdf<7,>=6; extra == "drawings"
41
+ Provides-Extra: engineering
42
+ Requires-Dist: shapely<3,>=2.1; extra == "engineering"
43
+ Requires-Dist: manifold3d<4,>=3; extra == "engineering"
44
+ Requires-Dist: meshio<6,>=5.3; extra == "engineering"
45
+ Provides-Extra: visualization
46
+ Provides-Extra: all
47
+ Requires-Dist: python-cad-tools[bim,cad,drawings,engineering,mesh,visualization]; extra == "all"
29
48
  Provides-Extra: dev
30
49
  Requires-Dist: build<2,>=1.2; extra == "dev"
31
50
  Requires-Dist: twine<7,>=6; extra == "dev"
@@ -50,6 +69,17 @@ The canonical project identities are:
50
69
 
51
70
  Licensed under [AGPL-3.0-only](LICENSE). Published on [PyPI](https://pypi.org/project/python-cad-tools/).
52
71
 
72
+ ## Install
73
+
74
+ ```bash
75
+ pip install "python-cad-tools[all]"
76
+ ```
77
+
78
+ Capability-based extras (`cad`, `bim`, `mesh`, `drawings`, `engineering`,
79
+ `visualization`) install a subset of the curated, version-tested toolchain.
80
+ See [`docs/toolchain.md`](docs/toolchain.md) for the supported-library table,
81
+ the dependency license policy, and the compatibility verification matrix.
82
+
53
83
  ## Install for development
54
84
 
55
85
  Python 3.12 or 3.13 is required.
@@ -66,6 +96,43 @@ python3 -m pip install ./dist/python_cad_tools-*.whl
66
96
  python-cad --version
67
97
  ```
68
98
 
99
+ ## Build locally
100
+
101
+ Building the complete distribution requires Python 3.12 or 3.13 and Node.js
102
+ 22.15.0. From a fresh checkout, create and activate the Python environment
103
+ before building the viewer. Activation is important because the viewer staging
104
+ script reads the installed `python-cad-tools` version from that environment.
105
+
106
+ ```bash
107
+ python3 -m venv .venv
108
+ source .venv/bin/activate
109
+ python -m pip install --upgrade pip
110
+ python -m pip install -e '.[dev]'
111
+
112
+ cd viewer
113
+ npm ci
114
+ npm test
115
+ npm run build
116
+ cd ..
117
+
118
+ python -m build --wheel --sdist --outdir dist .
119
+ python -m twine check dist/*
120
+ ```
121
+
122
+ The viewer build compiles the private TypeScript source and stages its verified,
123
+ model-free static shell under `src/python_cad_tools/_viewer_static/`. The final
124
+ wheel and source archive are written to `dist/`. To inspect the viewer while
125
+ developing its source, run `npm run preview` from `viewer/` after
126
+ `npm run build` and open the local URL printed by Vite.
127
+
128
+ To build and serve an actual CAD project with the locally installed editable
129
+ package, change to that project's directory and run:
130
+
131
+ ```bash
132
+ python-cad build
133
+ python-cad serve
134
+ ```
135
+
69
136
  ## Create a new project
70
137
 
71
138
  ```bash
@@ -125,6 +192,14 @@ documented in [`docs/drawing-extensions.md`](docs/drawing-extensions.md). One
125
192
  annotation set is validated and rendered consistently to SVG, DXF, and PDF
126
193
  before artifact hashes are recorded.
127
194
 
195
+ Python CAD Tools is a curated engineering platform with a two-tier authoring
196
+ contract: verified authoring through the neutral model (Tier 1), and
197
+ supported-but-unverified direct use of a pinned library such as
198
+ `ifcopenshell` or `trimesh` (Tier 2). See
199
+ [`docs/two-tier-contract.md`](docs/two-tier-contract.md),
200
+ [`docs/neutral-model.md`](docs/neutral-model.md), and
201
+ [`docs/toolchain.md`](docs/toolchain.md).
202
+
128
203
  ## Verification
129
204
 
130
205
  ```bash
@@ -138,6 +213,7 @@ before artifact hashes are recorded.
138
213
  .venv/bin/python -m twine check dist/*
139
214
  ```
140
215
 
216
+
141
217
  The default pytest command runs the fast unit suite. Integration, packaging,
142
218
  and external typing suites are explicit release gates. Packaging tests inspect wheel and sdist inventories, install the wheel
143
219
  non-editably into an isolated environment outside the checkout, prove the
@@ -1,40 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: python-cad-tools
3
- Version: 0.1.7
4
- Summary: Typed, headless Python tooling for CAD/BIM models and artifacts
5
- Author: Brandon Benge
6
- License: AGPL-3.0-only
7
- Project-URL: Homepage, https://github.com/brandon-benge/python-cad-tools
8
- Project-URL: Repository, https://github.com/brandon-benge/python-cad-tools
9
- Project-URL: Issues, https://github.com/brandon-benge/python-cad-tools/issues
10
- Classifier: Development Status :: 3 - Alpha
11
- Classifier: Environment :: Console
12
- Classifier: Intended Audience :: Developers
13
- Classifier: License :: OSI Approved :: GNU Affero General Public License v3
14
- Classifier: Programming Language :: Python :: 3
15
- Classifier: Programming Language :: Python :: 3.12
16
- Classifier: Programming Language :: Python :: 3.13
17
- Classifier: Typing :: Typed
18
- Requires-Python: <3.14,>=3.12
19
- Description-Content-Type: text/markdown
20
- License-File: LICENSE
21
- Requires-Dist: build123d<0.12,>=0.11.1
22
- Requires-Dist: cadquery-ocp-novtk<7.10,>=7.9.3.1.1
23
- Requires-Dist: ifcopenshell<0.9,>=0.8.5
24
- Requires-Dist: trimesh<5,>=4.12
25
- Requires-Dist: numpy<3,>=2.3
26
- Requires-Dist: ezdxf<2,>=1.4
27
- Requires-Dist: reportlab<5,>=4.4
28
- Requires-Dist: pypdf<7,>=6
29
- Provides-Extra: dev
30
- Requires-Dist: build<2,>=1.2; extra == "dev"
31
- Requires-Dist: twine<7,>=6; extra == "dev"
32
- Requires-Dist: pytest<9,>=8.4; extra == "dev"
33
- Requires-Dist: pytest-cov<8,>=7; extra == "dev"
34
- Requires-Dist: ruff<0.15,>=0.14; extra == "dev"
35
- Requires-Dist: mypy<2,>=1.18; extra == "dev"
36
- Dynamic: license-file
37
-
38
1
  # Python CAD Tools
39
2
 
40
3
  Python CAD Tools is an installable, typed Python package for defining shared
@@ -50,6 +13,17 @@ The canonical project identities are:
50
13
 
51
14
  Licensed under [AGPL-3.0-only](LICENSE). Published on [PyPI](https://pypi.org/project/python-cad-tools/).
52
15
 
16
+ ## Install
17
+
18
+ ```bash
19
+ pip install "python-cad-tools[all]"
20
+ ```
21
+
22
+ Capability-based extras (`cad`, `bim`, `mesh`, `drawings`, `engineering`,
23
+ `visualization`) install a subset of the curated, version-tested toolchain.
24
+ See [`docs/toolchain.md`](docs/toolchain.md) for the supported-library table,
25
+ the dependency license policy, and the compatibility verification matrix.
26
+
53
27
  ## Install for development
54
28
 
55
29
  Python 3.12 or 3.13 is required.
@@ -66,6 +40,43 @@ python3 -m pip install ./dist/python_cad_tools-*.whl
66
40
  python-cad --version
67
41
  ```
68
42
 
43
+ ## Build locally
44
+
45
+ Building the complete distribution requires Python 3.12 or 3.13 and Node.js
46
+ 22.15.0. From a fresh checkout, create and activate the Python environment
47
+ before building the viewer. Activation is important because the viewer staging
48
+ script reads the installed `python-cad-tools` version from that environment.
49
+
50
+ ```bash
51
+ python3 -m venv .venv
52
+ source .venv/bin/activate
53
+ python -m pip install --upgrade pip
54
+ python -m pip install -e '.[dev]'
55
+
56
+ cd viewer
57
+ npm ci
58
+ npm test
59
+ npm run build
60
+ cd ..
61
+
62
+ python -m build --wheel --sdist --outdir dist .
63
+ python -m twine check dist/*
64
+ ```
65
+
66
+ The viewer build compiles the private TypeScript source and stages its verified,
67
+ model-free static shell under `src/python_cad_tools/_viewer_static/`. The final
68
+ wheel and source archive are written to `dist/`. To inspect the viewer while
69
+ developing its source, run `npm run preview` from `viewer/` after
70
+ `npm run build` and open the local URL printed by Vite.
71
+
72
+ To build and serve an actual CAD project with the locally installed editable
73
+ package, change to that project's directory and run:
74
+
75
+ ```bash
76
+ python-cad build
77
+ python-cad serve
78
+ ```
79
+
69
80
  ## Create a new project
70
81
 
71
82
  ```bash
@@ -125,6 +136,14 @@ documented in [`docs/drawing-extensions.md`](docs/drawing-extensions.md). One
125
136
  annotation set is validated and rendered consistently to SVG, DXF, and PDF
126
137
  before artifact hashes are recorded.
127
138
 
139
+ Python CAD Tools is a curated engineering platform with a two-tier authoring
140
+ contract: verified authoring through the neutral model (Tier 1), and
141
+ supported-but-unverified direct use of a pinned library such as
142
+ `ifcopenshell` or `trimesh` (Tier 2). See
143
+ [`docs/two-tier-contract.md`](docs/two-tier-contract.md),
144
+ [`docs/neutral-model.md`](docs/neutral-model.md), and
145
+ [`docs/toolchain.md`](docs/toolchain.md).
146
+
128
147
  ## Verification
129
148
 
130
149
  ```bash
@@ -138,6 +157,7 @@ before artifact hashes are recorded.
138
157
  .venv/bin/python -m twine check dist/*
139
158
  ```
140
159
 
160
+
141
161
  The default pytest command runs the fast unit suite. Integration, packaging,
142
162
  and external typing suites are explicit release gates. Packaging tests inspect wheel and sdist inventories, install the wheel
143
163
  non-editably into an isolated environment outside the checkout, prove the
@@ -42,9 +42,20 @@ so the prior generated tree and its recorded hashes remain unchanged.
42
42
 
43
43
  The stable home module `python_cad_tools.drawings` exports `Point2`,
44
44
  `Direction`, `DrawingStyleToken`, `DrawingSheet`, `Line`, `Polyline`, `Text`,
45
- `SectionCallout`, `ElevationMarker`, `TableRow`, `Table`, `SheetAnnotations`,
46
- and `DrawingAnnotationSet`. The dataclass fields and literal tokens are the v1
47
- contract; there is no dictionary or renderer-specific alternate form.
45
+ `Dimension`, `SectionCallout`, `ElevationMarker`, `TableRow`, `Table`,
46
+ `SheetAnnotations`, and `DrawingAnnotationSet`. The dataclass fields and
47
+ literal tokens are the v1 contract; there is no dictionary or
48
+ renderer-specific alternate form.
49
+
50
+ `Dimension(id, sheet_id, start, end, offset_mm, label, style)` draws a
51
+ measurement: a dimension line offset from the measured segment (in Y for a
52
+ predominantly horizontal segment, in X otherwise), extension/witness lines
53
+ back to `start`/`end`, arrowheads at both ends, and a centred label. It uses
54
+ the `"annotation-dimension"` style token. The rendered DXF output is tagged
55
+ geometry (lines, arrowheads, and text with `PYTHON_CAD_TOOLS` XDATA), not a
56
+ native associative `DIMENSION` entity — a project needing an editable CAD
57
+ dimension should treat the drawing as conceptual, consistent with every other
58
+ Python CAD Tools drawing output.
48
59
 
49
60
  `DrawingContext.sheets` contains these standard sheets:
50
61
 
@@ -125,6 +136,8 @@ direction.
125
136
 
126
137
  Compound IDs are deterministic:
127
138
 
139
+ - dimension: `.line`, `.extension.start`, `.extension.end`, `.arrow.start`,
140
+ `.arrow.end`, and `.label`;
128
141
  - section callout: `.line`, `.arrow.start`, `.arrow.end`, `.label.start`, and
129
142
  `.label.end`;
130
143
  - elevation marker: `.outline`, `.pointer`, and `.label`;
@@ -0,0 +1,138 @@
1
+ # Neutral model reference
2
+
3
+ This is the Tier 1 authoring reference: the `DesignElement`/`DesignModel`
4
+ field semantics, the `IfcMapping` contract, the new Phase 1 capabilities
5
+ (user properties, computed quantities, multiple storeys, openings, drawing
6
+ dimensions), and the validator invocation model. See
7
+ `docs/two-tier-contract.md` for what "Tier 1" means and
8
+ `docs/public-api.md` for the full module allowlist.
9
+
10
+ ## `DesignElement` fields
11
+
12
+ | Field | Type | Semantics |
13
+ | --- | --- | --- |
14
+ | `id` | `str` | Stable, unique identifier. Used to derive every downstream IFC `GlobalId` and to key manifests. |
15
+ | `name` | `str` | Human-readable display name. |
16
+ | `category` | `str` | Free-text classification, exported as `ObjectType` in IFC. |
17
+ | `geometry` | `Any` | A build123d-compatible solid, shell, wire, or edge. Required and opaque — the framework does not restrict how it was built. |
18
+ | `geometry_kind` | `"solid" \| "shell" \| "wire" \| "edge" \| "reference"` | Declares the geometry's topological kind. Physical elements must be `"solid"`. |
19
+ | `placement` | `Placement` | Translation (mm) and rotation (degrees, XYZ) applied on top of `geometry`'s own coordinates. |
20
+ | `dimensions` | `Dimensions` | Declared, author-stated extents. Independent of the geometry's actual bounds; exported into `Pset_PythonCadDesign`. |
21
+ | `material` | `MaterialSpec \| None` | Required for physical elements. Drives IFC material association and quantity mass calculation (`density_kg_m3`). |
22
+ | `color_rgb` | `Color \| None` | Overrides the material color for this element's rendering/styling. |
23
+ | `ifc_mapping` | `IfcMapping` | See below. |
24
+ | `storey` | `str \| None` | The `IfcBuildingStorey` this element belongs to. `None` means the framework's implicit "Default Storey". |
25
+ | `tags` | `set[str]` | Free-text classification tags; not exported to any format. |
26
+ | `properties` | `dict[str, Any]` | User properties. Exported to IFC as `Pset_PythonCadUser` for IFC-exported elements (see below). Values must be `str`, `bool`, `int`, or `float`. |
27
+ | `children` | `list[DesignElement]` | Nested elements, walked depth-first by `DesignModel.walk()`. |
28
+ | `visible` | `bool` | Excludes the element from every exporter when `False`. |
29
+ | `export_formats` | `set[str]` | Which exporters (`step`, `ifc`, `glb`, `drawings`, `quantities`) include this element. |
30
+ | `source_module` | `str` | Free-text provenance, exported into `Pset_PythonCadDesign`. |
31
+ | `physical` | `bool` | Physical elements must be `"solid"` and require a material; non-physical (reference) elements are excluded from IFC, quantities, and mass. |
32
+ | `parent_id` | `str \| None` | Parent element ID, exported as an `IfcRelAggregates` relationship when both ends are IFC-exported. |
33
+ | `openings` | `list[Opening]` | Semantic voids in this host element. See "Openings" below. |
34
+
35
+ ## `IfcMapping`
36
+
37
+ ```python
38
+ IfcMapping(ifc_class: str | None, predefined_type: str | None = None, exclude_reason: str | None = None)
39
+ ```
40
+
41
+ Exactly one of `ifc_class` or `exclude_reason` must be set (enforced at
42
+ `validate` time). `ifc_class` is validated live against the installed
43
+ `ifcopenshell` IFC4 schema at export time: it must name a concrete (non-
44
+ abstract) subtype of `IfcElement`, and `predefined_type` (default
45
+ `"NOTDEFINED"`) must be a member of that class's declared `PredefinedType`
46
+ enumeration. Any concrete `IfcElement` subtype is accepted — the framework
47
+ does not restrict the mapping to a fixed list.
48
+
49
+ ## Openings
50
+
51
+ ```python
52
+ Opening(id: str, geometry: Any, name: str | None = None, predefined_type: str | None = None)
53
+ ```
54
+
55
+ An `Opening` on `DesignElement.openings` produces one `IfcOpeningElement` and
56
+ one `IfcRelVoidsElement` per opening when the host is IFC-exported.
57
+ `predefined_type` maps to `IfcOpeningElementTypeEnum` (`"OPENING"` or
58
+ `"RECESS"`; defaults to `"OPENING"`).
59
+
60
+ **Openings add IFC semantics only.** The host element's `geometry` stays
61
+ authoritative for STEP, GLB, drawings, quantities, and bounds — the framework
62
+ does not boolean-subtract an opening from the host tessellation. The
63
+ supported authoring pattern is to cut the void from the host solid directly
64
+ (`host_solid.cut(opening_solid)`, as `benge-property-cad/model.py` already
65
+ does) and declare the same void as an `Opening` so IFC also carries the
66
+ `IfcOpeningElement`/`IfcRelVoidsElement` pair. Declaring an opening without
67
+ cutting the host geometry produces an IFC void that other formats do not
68
+ reflect — do not do this for artifacts that need Tier 1 multi-format
69
+ consistency.
70
+
71
+ ## IFC property sets and quantities
72
+
73
+ Every IFC-exported element carries `Pset_PythonCadDesign`
74
+ (`StableId`, `Category`, `SourceModule`, `GeometryKind`, and any declared
75
+ dimensions) — unchanged from before this document existed, and the sole
76
+ anchor the framework uses to identify its own authored elements.
77
+
78
+ - **`Pset_PythonCadUser`** — present when `element.properties` is non-empty.
79
+ One `IfcPropertySingleValue` per entry, typed by Python type:
80
+ `bool → IfcBoolean`, `int → IfcInteger`, `float → IfcReal`,
81
+ `str → IfcLabel`. Any other value type is a `validate`-time error.
82
+ - **`Qto_PythonCadDesign`** — an `IfcElementQuantity` present when the
83
+ element has a computed quantity record (the same records
84
+ `python-cad build`'s `quantities` exporter produces). Contains `Count`
85
+ (`IfcQuantityCount`), `NetSurfaceArea` (`IfcQuantityArea`, m²), `NetVolume`
86
+ (`IfcQuantityVolume`, m³), and — only when the element's material has a
87
+ density — `NetWeight` (`IfcQuantityWeight`, kg). Units convert from the
88
+ neutral model's mm/mm²/mm³ into the file's declared unit assignment, which
89
+ includes an explicit `MASSUNIT` (`KILO`/`GRAM`).
90
+
91
+ `IfcOpeningElement` entities carry `Pset_PythonCadOpening`
92
+ (`StableId`, `HostId`) instead of `Pset_PythonCadDesign`, so they are never
93
+ mistaken for an authored design element by `_design_products` or by any
94
+ sidecar reconciliation.
95
+
96
+ ## Storeys
97
+
98
+ An element with `storey=None` is placed in the implicit "Default Storey"
99
+ (stable ID `<model.id>.ifc.storey` — unchanged from before multi-storey
100
+ support existed). An element with `storey="Some Name"` is placed in an
101
+ `IfcBuildingStorey` named `"Some Name"`, created on demand, one per distinct
102
+ declared name among IFC-exported elements. A model that declares no storey on
103
+ any element produces byte-identical spatial structure to a single-storey
104
+ model. Storey names must be non-empty text (validated).
105
+
106
+ ## Drawing dimensions
107
+
108
+ `python_cad_tools.drawings.Dimension` is a public annotation primitive:
109
+
110
+ ```python
111
+ Dimension(id: str, sheet_id: str, start: Point2, end: Point2, offset_mm: float, label: str, style: DrawingStyleToken)
112
+ ```
113
+
114
+ It renders through the same verified annotation-entity pipeline as every
115
+ other annotation primitive (`Line`, `Text`, `Table`, ...): it flattens into
116
+ six identified child entities (dimension line, two extension/witness lines,
117
+ two arrowheads, and a label), each carrying an `SVG data-annotation-id`, a DXF
118
+ `PYTHON_CAD_TOOLS` XDATA tag, and an annotation-manifest record, so it
119
+ round-trip verifies in SVG, DXF, and PDF like any other Tier 1 drawing
120
+ annotation. The dimension line offsets perpendicular to the measured segment:
121
+ in Y for a predominantly horizontal measurement, in X otherwise. The rendered
122
+ DXF output is tagged geometry, not a native associative `DIMENSION` entity.
123
+
124
+ ## Validator invocation
125
+
126
+ `validate_model(model)` runs the built-in element/model rules (stable IDs,
127
+ geometry validity, material requirements, IFC mapping intent, storey names,
128
+ user property types, opening identity/geometry) and then every callable in
129
+ `DesignModel.validators` in list order, each receiving the model and
130
+ returning a `list[ValidationIssue]`. `fatal_issues(...)` filters to
131
+ `severity == "error"`; `python-cad build`/`validate` fail on any fatal issue
132
+ before export begins.
133
+
134
+ ## Construction recipes (Phase 2)
135
+
136
+ Parametric BREP/SweptSolid IFC representation via a construction-recipe model
137
+ (`python_cad_tools.recipes`) is scoped as a separate SpecRepo proposal and is
138
+ not yet implemented. This section will be extended when that proposal ships.
@@ -9,7 +9,8 @@ of optional runtime imports.
9
9
 
10
10
  - `python_cad_tools.context`: `BuildContext` and `DrawingContext`.
11
11
  - `python_cad_tools.elements`: `Color`, `GeometryKind`, `DesignElement`,
12
- `DesignModel`, `Dimensions`, `IfcMapping`, `MaterialSpec`, and `Placement`.
12
+ `DesignModel`, `Dimensions`, `IfcMapping`, `MaterialSpec`, `Opening`, and
13
+ `Placement`.
13
14
  - `python_cad_tools.units`: `Length`, `Area`, `Volume`, `MM`, `INCH`, `FOOT`,
14
15
  `mm`, `inches`, `feet`, `feet_inches`, `to_mm`, `square_feet`, `cubic_feet`,
15
16
  `cubic_yards`, `metres`, and `square_metres`.
@@ -17,7 +18,7 @@ of optional runtime imports.
17
18
  `prism_between`, `sloped_pool`, `bounds`, `combined_bounds`, `tessellate`,
18
19
  `is_valid_solid`, and `diagonal`.
19
20
  - `python_cad_tools.drawings`: `Point2`, `Direction`, `DrawingStyleToken`,
20
- `DrawingSheet`, `Line`, `Polyline`, `Text`, `SectionCallout`,
21
+ `DrawingSheet`, `Line`, `Polyline`, `Text`, `Dimension`, `SectionCallout`,
21
22
  `ElevationMarker`, `TableRow`, `Table`, `SheetAnnotations`, and
22
23
  `DrawingAnnotationSet`.
23
24
  - `python_cad_tools.validation`: `ValidationIssue`.
@@ -35,6 +36,12 @@ of optional runtime imports.
35
36
  flattened compound entities, file writers, and drawing validators remain
36
37
  private. See [Format-neutral drawing extensions](drawing-extensions.md).
37
38
 
39
+ Python CAD Tools distinguishes Tier 1 (verified authoring through this public
40
+ API) from Tier 2 (supported, unverified direct use of a library named in
41
+ `docs/toolchain.md`). See [The two-tier authoring
42
+ contract](two-tier-contract.md) and the full field reference in
43
+ [Neutral model reference](neutral-model.md).
44
+
38
45
  Every public type is inline-typed and the wheel includes `py.typed`. Public
39
46
  module `__all__` values are tested as allowlists. Exporter implementations,
40
47
  `_project_loader`, `_project_state`, renderer code, staging helpers, and other