python-cad-tools 0.1.9__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 (276) hide show
  1. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.github/workflows/ci.yml +118 -0
  2. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/CHANGELOG.md +27 -0
  3. {python_cad_tools-0.1.9/src/python_cad_tools.egg-info → python_cad_tools-0.1.10}/PKG-INFO +40 -1
  4. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/README.md +20 -0
  5. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/drawing-extensions.md +16 -3
  6. python_cad_tools-0.1.10/docs/neutral-model.md +138 -0
  7. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/public-api.md +9 -2
  8. python_cad_tools-0.1.10/docs/toolchain.md +102 -0
  9. python_cad_tools-0.1.10/docs/two-tier-contract.md +51 -0
  10. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/pyproject.toml +34 -0
  11. python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/asset-manifest.json +1 -0
  12. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/animationGroup-D8JiTQ-4.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/animationGroup-BFpCrP0o.js +1 -1
  13. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/bakedVertexAnimation-BXUoW_dN.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/bakedVertexAnimation-DKIsxzCh.js +1 -1
  14. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/basisTextureLoader-CVHGuBLP.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/basisTextureLoader-BWlCMZKU.js +1 -1
  15. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/brdfTextureTools-D96Uxpg7.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/brdfTextureTools-CpZi6QbK.js +2 -2
  16. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/bumpFragment-ZSaaIjlj.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/bumpFragment-ChvT23CB.js +1 -1
  17. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/bumpVertex-B77JU1YW.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/bumpVertex-nEs2VPot.js +1 -1
  18. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/bumpVertexDeclaration-Ia7fxSn9.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/bumpVertexDeclaration-BBNawFh8.js +1 -1
  19. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/clipPlaneFragment-B6DPyYvd.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/clipPlaneFragment-C77PAFKo.js +1 -1
  20. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/clipPlaneVertex-BszU5pg9.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/clipPlaneVertex-CBvbot7K.js +1 -1
  21. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/cubemapToSphericalPolynomial-DtS_e4_4.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/cubemapToSphericalPolynomial-BCMcxsAF.js +1 -1
  22. python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/dds-0RTqNYDh.js +1 -0
  23. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/dds.pure-CMQrALY8.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/dds.pure-OdUDHE0G.js +1 -1
  24. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/ddsTextureLoader-CdJp2uRL.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/ddsTextureLoader-1l_GkUW1.js +1 -1
  25. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/default.fragment-Bd74LdsD.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/default.fragment-DJkWvM0e.js +1 -1
  26. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/default.vertex-BbLzFbSI.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/default.vertex-CMrXZjYP.js +1 -1
  27. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/defaultUboDeclaration-CWmXZelY.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/defaultUboDeclaration-Da9s8wLf.js +1 -1
  28. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/dumpTools-C1GV3tke.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/dumpTools-BfBU44JR.js +2 -2
  29. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/envTextureLoader-D8Rc9mej.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/envTextureLoader-CUgicy-i.js +1 -1
  30. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/exrTextureLoader-dLKMUCnE.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/exrTextureLoader-4Fy-_N6F.js +1 -1
  31. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphApplyForceBlock-BdJfphn5.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphApplyForceBlock-UxcpUOb4.js +1 -1
  32. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphApplyImpulseBlock-BjNZz3lY.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphApplyImpulseBlock-8doxumAC.js +1 -1
  33. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphArrayIndexBlock-BO3TRmH0.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphArrayIndexBlock-q8W2FV-w.js +1 -1
  34. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphBezierCurveEasingBlock-CvNkMyMS.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphBezierCurveEasingBlock-3ZEqX4ZJ.js +1 -1
  35. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphBinaryOperationBlock-C0zTSypA.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphBinaryOperationBlock-D3ayisoN.js +1 -1
  36. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphBranchBlock-ghEzHTJ0.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphBranchBlock-BR9ohqut.js +1 -1
  37. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphCachedOperationBlock-Befmlymg.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphCachedOperationBlock-DKeQ8sZI.js +1 -1
  38. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphCancelDelayBlock-CZ4x2OHC.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphCancelDelayBlock-DzimG9bV.js +1 -1
  39. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphCodeExecutionBlock-Bg7iuKLe.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphCodeExecutionBlock-BDp2kDKe.js +1 -1
  40. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphConditionalDataBlock-CgsD1XIc.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphConditionalDataBlock-DUy-bdD8.js +1 -1
  41. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphConsoleLogBlock-CXGmEPz3.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphConsoleLogBlock-CZsZDCqO.js +1 -1
  42. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphConstantBlock-Cvo5vmPt.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphConstantBlock-D4jP5Zis.js +1 -1
  43. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphContextBlock-7js8GLy5.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphContextBlock-iDbQUT2i.js +1 -1
  44. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphCounterBlock-Dnhmin9r.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphCounterBlock-fNm-N_rD.js +1 -1
  45. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphDataSwitchBlock-DNcKLFOn.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphDataSwitchBlock-a2hfmRfA.js +1 -1
  46. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphDebounceBlock-CwMpsIku.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphDebounceBlock-B-ua6-rc.js +1 -1
  47. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphDebugBlock-CNETXCb0.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphDebugBlock-CFvv9NT9.js +1 -1
  48. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphDoNBlock-VouTILkP.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphDoNBlock-QrVeUF7s.js +1 -1
  49. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphEasingBlock-C6rQIu-I.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphEasingBlock-BL-amui0.js +1 -1
  50. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphFlipFlopBlock-C7KNITdq.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphFlipFlopBlock-DGNR6aQc.js +1 -1
  51. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphForLoopBlock-C_Tl0qXF.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphForLoopBlock-CGGzIxtA.js +1 -1
  52. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphFunctionReferenceBlock-ChzhGELd.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphFunctionReferenceBlock-BbPKAgEi.js +1 -1
  53. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphGLTFDataProvider-BdE0stdX.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGLTFDataProvider-5JE9USOH.js +1 -1
  54. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphGetAngularVelocityBlock-Ct28X64C.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetAngularVelocityBlock-DIu658Lh.js +1 -1
  55. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphGetAssetBlock-D_HtxKVI.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetAssetBlock-DTCqvYE6.js +1 -1
  56. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphGetLinearVelocityBlock-3udqCAK3.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetLinearVelocityBlock-RW4Yofih.js +1 -1
  57. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphGetPhysicsMassPropertiesBlock-CmnYGepx.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetPhysicsMassPropertiesBlock-aiF5BOL9.js +1 -1
  58. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphGetPropertyBlock-BO9H9c3L.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetPropertyBlock-D15fpxe7.js +1 -1
  59. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphGetSoundVolumeBlock-CeKonax7.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetSoundVolumeBlock-CwR7xfkj.js +1 -1
  60. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphGetVariableBlock-ugd43AvH.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphGetVariableBlock-eTZrs7GE.js +1 -1
  61. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphIndexOfBlock-CeAOzH23.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphIndexOfBlock-DPZf_95j.js +1 -1
  62. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphInterpolationBlock-DTh4fL6t.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphInterpolationBlock-DiAJzLOE.js +1 -1
  63. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphIsKeyPressedBlock-CE5OhwqS.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphIsKeyPressedBlock-CADmRrDd.js +1 -1
  64. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphIsSoundPlayingBlock-D5gv9QIZ.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphIsSoundPlayingBlock-D8B4F2Z5.js +1 -1
  65. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphJsonPointerParserBlock-Cy-XDvh9.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphJsonPointerParserBlock-Xfl-dDJk.js +1 -1
  66. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphKeyDownEventBlock-B91rxqkv.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphKeyDownEventBlock-Cm2zaYXU.js +1 -1
  67. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphKeyUpEventBlock-DPYtdWaj.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphKeyUpEventBlock-C_BP5Hf5.js +1 -1
  68. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphKeyboardEventBlock-BApSnOZE.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphKeyboardEventBlock-C05IFCUh.js +1 -1
  69. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphMathBlocks-D3CK-Hy2.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphMathBlocks-DlWMU189.js +1 -1
  70. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphMathCombineExtractBlocks-B6nBNvbo.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphMathCombineExtractBlocks-qSe8QChR.js +1 -1
  71. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphMatrixMathBlocks-ofjzAxQF.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphMatrixMathBlocks-DbzURNpp.js +1 -1
  72. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphMeshPickEventBlock-BvF2vaZi.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphMeshPickEventBlock-DxJxxG3S.js +1 -1
  73. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphMultiGateBlock-DpHnJiIf.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphMultiGateBlock-BPZd8mbK.js +1 -1
  74. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphPauseAnimationBlock-BrrymuG6.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPauseAnimationBlock-C3c7bzsQ.js +1 -1
  75. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphPauseSoundBlock-CHSeaOnB.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPauseSoundBlock-DJvpN7CX.js +1 -1
  76. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphPhysicsCollisionEventBlock-syMr1OJN.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPhysicsCollisionEventBlock-CNunrdNk.js +1 -1
  77. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphPlayAnimationBlock-BXnW30FY.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPlayAnimationBlock-ByRpWDZ5.js +1 -1
  78. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphPlaySoundBlock-CsSTQ880.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPlaySoundBlock-D5G_NhMs.js +1 -1
  79. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphPointerDownEventBlock-Ct0SkI9l.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPointerDownEventBlock-pWyOiXvU.js +1 -1
  80. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphPointerMoveEventBlock-3Oxamq4b.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPointerMoveEventBlock-BIgzBvv9.js +1 -1
  81. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOutEventBlock-B4SYh7i0.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOutEventBlock-DaEitrdC.js +1 -1
  82. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOverEventBlock-CVt4drqm.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOverEventBlock-Bwc4ooou.js +1 -1
  83. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphPointerUpEventBlock-Q5eFYPWa.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphPointerUpEventBlock-BtmDICq5.js +1 -1
  84. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphReceiveCustomEventBlock-S8K7qYF_.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphReceiveCustomEventBlock-BKnkEvuu.js +1 -1
  85. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSceneReadyEventBlock-Dg_340c-.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSceneReadyEventBlock-CawN6pQ_.js +1 -1
  86. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSceneTickEventBlock-C_0s6vFz.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSceneTickEventBlock-zXyWDNoE.js +1 -1
  87. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSendCustomEventBlock-BXzvdSwL.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSendCustomEventBlock-C4QwZQD_.js +1 -1
  88. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSequenceBlock-DTjRGM0i.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSequenceBlock-C2DrAckq.js +1 -1
  89. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSetAngularVelocityBlock-CVc5809-.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetAngularVelocityBlock-B2_GCxnR.js +1 -1
  90. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSetDelayBlock-3NJrJ4Fn.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetDelayBlock-CoxLB_JO.js +1 -1
  91. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSetLinearVelocityBlock-D4V0HEJW.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetLinearVelocityBlock-Dcl_TlE4.js +1 -1
  92. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSetPhysicsMotionTypeBlock-CIFAGZ4N.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetPhysicsMotionTypeBlock-VH0XyIek.js +1 -1
  93. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSetPropertyBlock-DW9lz25w.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetPropertyBlock-BMVB2YpZ.js +1 -1
  94. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSetSoundVolumeBlock-CBI-hqde.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetSoundVolumeBlock-B3LlN1_P.js +1 -1
  95. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSetVariableBlock-9g1tFmrf.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSetVariableBlock-DjPcD-uk.js +1 -1
  96. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSoundEndedEventBlock-DOoVnrgC.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSoundEndedEventBlock-B3BPhieu.js +1 -1
  97. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphStopAnimationBlock-CNxA_doq.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphStopAnimationBlock-DB-YMsd0.js +1 -1
  98. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphStopSoundBlock-Ds7-OqyY.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphStopSoundBlock-rkBjhxoU.js +1 -1
  99. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphSwitchBlock-C6WWFd5D.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphSwitchBlock-zgP4JU9F.js +1 -1
  100. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphThrottleBlock-DJymGlzE.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphThrottleBlock-BFCejhG2.js +1 -1
  101. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphTransformCoordinatesSystemBlock-CGbRuDff.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphTransformCoordinatesSystemBlock-B5sXEjm6.js +1 -1
  102. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphTypeToTypeBlocks-GrXGV2Lk.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphTypeToTypeBlocks-GWfI6VCP.js +1 -1
  103. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphUnaryOperationBlock-PD8fnplX.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphUnaryOperationBlock-C3x4cBoo.js +1 -1
  104. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphVectorMathBlocks-CDqG4e7V.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphVectorMathBlocks-DHmbwNwJ.js +1 -1
  105. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphWaitAllBlock-BRbmMhsz.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphWaitAllBlock-D2S-o8ta.js +1 -1
  106. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/flowGraphWhileLoopBlock-COJV6l5s.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/flowGraphWhileLoopBlock-BIaIe1G3.js +1 -1
  107. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/fogFragment-Choi4dwf.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/fogFragment-lpu2fSrY.js +1 -1
  108. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-B2ibIxZi.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-C3mITXca.js +1 -1
  109. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-O05Ige7q.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-r2QTVyrX.js +1 -1
  110. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-CRSXtFZA.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-BRSDLsfp.js +1 -1
  111. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-lp1mUJ81.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-BTuradYo.js +1 -1
  112. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-C4vLDHOC.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-WPP1vXOl.js +1 -1
  113. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-CtzXFKDF.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-s39KAVkx.js +1 -1
  114. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-DOXOYFhX.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-BMmjNFoS.js +1 -1
  115. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-DwBcuLEK.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-egtcopGg.js +1 -1
  116. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-Da9modjG.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-6Odgg2pj.js +1 -1
  117. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-kSk7jCdX.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-Bo8-VkdD.js +1 -1
  118. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/geometry.fragment-D5AHElrd.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/geometry.fragment-CuLpqUUk.js +1 -1
  119. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/geometry.fragment-GHxvGIuO.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/geometry.fragment-DHXfK03n.js +1 -1
  120. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/geometry.vertex-BekW6jCs.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/geometry.vertex-Bm0A4YY1.js +1 -1
  121. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/geometry.vertex-m038PJYK.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/geometry.vertex-DSbpeedB.js +1 -1
  122. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/glowBlurPostProcess.fragment-BuYnbp24.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/glowBlurPostProcess.fragment-Qbdz4gLu.js +1 -1
  123. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.fragment-C5l-Afa5.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.fragment-1hOZT_4N.js +1 -1
  124. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.vertex-BdNNoSRh.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.vertex-Cg1UfAtC.js +1 -1
  125. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/glowMapMerge.fragment-DEm5Wwpu.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/glowMapMerge.fragment-BoiNEY2n.js +1 -1
  126. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/glowMapMerge.vertex-D3FjaVt0.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/glowMapMerge.vertex-CpWKznSe.js +1 -1
  127. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/harmonicsFunctions-DVbiWL12.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/harmonicsFunctions-DIzIowqF.js +1 -1
  128. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/helperFunctions-BMWamdZI.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/helperFunctions-7oODcxNt.js +1 -1
  129. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/iesTextureLoader-NWNyOmSO.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/iesTextureLoader-wAQEvbfd.js +1 -1
  130. python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/index-CnrKUEff.css +1 -0
  131. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/index-CxvyL8J4.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/index-D6uexFRQ.js +149 -164
  132. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-dEQEa5jL.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-Bt6sD8qx.js +1 -1
  133. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-DQG_CTu1.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-DGSh46Om.js +1 -1
  134. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-I35OVoE5.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-BlhNG48F.js +1 -1
  135. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-BbT8O5z2.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-C1fudmM_.js +1 -1
  136. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-b3uALS8k.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-BWYB4Ycu.js +1 -1
  137. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-Cqh5-5OF.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-DFH4bO-3.js +1 -1
  138. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/ktxTextureLoader-Dx4kAPwU.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/ktxTextureLoader-DsFCeiiH.js +1 -1
  139. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/lightFragment-CcjS-1Qr.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/lightFragment-CHOWnPK9.js +1 -1
  140. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/logDepthDeclaration-ChnhQwTH.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/logDepthDeclaration-k15gEJ3y.js +1 -1
  141. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/logDepthVertex-msVogzTr.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/logDepthVertex-CHajYpMu.js +1 -1
  142. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/mainUVVaryingDeclaration-pZFlArh_.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/mainUVVaryingDeclaration-BGrReuHo.js +1 -1
  143. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/meshUboDeclaration-CdWlDODa.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/meshUboDeclaration-DJwUrZx2.js +1 -1
  144. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/oitFragment-szDk6UZR.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/oitFragment-BsvP7q4R.js +1 -1
  145. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-BBn02yR9.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-B8VN-IrQ.js +1 -1
  146. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-D7RcvfXo.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-C06kkVuL.js +1 -1
  147. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-DwOLixI7.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-A4s3IgoK.js +1 -1
  148. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-CQy-TMKU.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-DJCYXObK.js +1 -1
  149. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/openpbrMaterial.pure-DPMfMSFE.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrMaterial.pure-Bs5DC-y9.js +3 -3
  150. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/openpbrMaterialLoadingAdapter-CugNxYOx.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrMaterialLoadingAdapter-C_c5atIs.js +2 -2
  151. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-DMxPgLDn.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-CYdsV_SL.js +1 -1
  152. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-B4uZGKm6.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-DaaAXfx7.js +1 -1
  153. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration-BLspgBan.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration-3JPIOWr0.js +1 -1
  154. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration-CWOev382.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration-rQewqvT4.js +1 -1
  155. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/packingFunctions-B1rNimSD.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/packingFunctions-Bn1t67wx.js +1 -1
  156. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/packingFunctions-ChisQShT.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/packingFunctions-DMIYB28m.js +1 -1
  157. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/pass.fragment-I6r_kdFj.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pass.fragment-DYkGKBSd.js +1 -1
  158. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/passCube.fragment-C6HrkIks.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/passCube.fragment-D3u4_FLI.js +1 -1
  159. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/passCube.fragment-Bl-fmIsm.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/passCube.fragment-DNC6H8VG.js +1 -1
  160. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/pbr.fragment-uJU14vU_.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbr.fragment-BiEI1YfJ.js +1 -1
  161. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/pbr.vertex-DKhVew6J.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbr.vertex-A6knpQsw.js +1 -1
  162. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/pbrBRDFFunctions-m4lTGetO.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrBRDFFunctions-BeK39hzl.js +1 -1
  163. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/pbrDebug-7fIy0dbE.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrDebug-mLga6xKt.js +1 -1
  164. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/pbrIBLFunctions-BPaegWsp.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrIBLFunctions-Db54NySa.js +1 -1
  165. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/pbrMaterial.pure-BFEhyw--.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrMaterial.pure-Dp6NmN9w.js +2 -2
  166. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/pbrMaterialLoadingAdapter-DK-tM7hi.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrMaterialLoadingAdapter-CvXJgU4i.js +1 -1
  167. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/pbrUboDeclaration-DAx5uXah.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/pbrUboDeclaration-BW-aS_Fc.js +1 -1
  168. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/postprocess.vertex-C5aIR2Ui.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/postprocess.vertex-BIWUhm9k.js +1 -1
  169. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/procedural.vertex-B3PgdJzj.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/procedural.vertex-DGnTrHzl.js +1 -1
  170. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/procedural.vertex-CLdneMyi.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/procedural.vertex-WXmVjrA9.js +1 -1
  171. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/reflectionFunction-CjSeFDi0.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/reflectionFunction-DrJ5CgYG.js +1 -1
  172. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/rgbdDecode.fragment-C9uqNnbi.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/rgbdDecode.fragment-7H1BkSqs.js +1 -1
  173. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-VdvQq4-z.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-CTyiKQCb.js +1 -1
  174. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-vn_uEJcl.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-CoVaziaW.js +1 -1
  175. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/sceneUboDeclaration-ymh6-q5s.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/sceneUboDeclaration-Ck43xulU.js +1 -1
  176. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-Cf1C-AMd.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-Bspm0dPH.js +1 -1
  177. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-D1P19Mcp.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-CD-iXyeA.js +1 -1
  178. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/tgaTextureLoader-DEFImEV4.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/tgaTextureLoader-DrtUlmLD.js +1 -1
  179. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/vertexColorMixing-Dd7cVESy.js → python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/vertexColorMixing-7aNKbB6k.js +1 -1
  180. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/index.html +2 -2
  181. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/artifacts.py +44 -0
  182. python_cad_tools-0.1.10/src/python_cad_tools/build-info.json +1 -0
  183. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/drawings/__init__.py +14 -1
  184. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/drawings/_validation.py +15 -1
  185. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/elements.py +17 -0
  186. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/base.py +1 -10
  187. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/annotations.py +58 -0
  188. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/dxf.py +1 -0
  189. python_cad_tools-0.1.10/src/python_cad_tools/exporters/ifc.py +547 -0
  190. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/manifests.py +17 -1
  191. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/model.py +2 -2
  192. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/units.py +0 -7
  193. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/validation.py +115 -1
  194. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10/src/python_cad_tools.egg-info}/PKG-INFO +40 -1
  195. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/SOURCES.txt +171 -168
  196. python_cad_tools-0.1.10/src/python_cad_tools.egg-info/requires.txt +42 -0
  197. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/scm_file_list.json +286 -281
  198. python_cad_tools-0.1.10/src/python_cad_tools.egg-info/scm_version.json +8 -0
  199. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/asset-manifest.json +0 -1
  200. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/dds-IzBU48fT.js +0 -1
  201. python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/index-BE2-nPmV.css +0 -1
  202. python_cad_tools-0.1.9/src/python_cad_tools/build-info.json +0 -1
  203. python_cad_tools-0.1.9/src/python_cad_tools/exporters/ifc.py +0 -296
  204. python_cad_tools-0.1.9/src/python_cad_tools.egg-info/requires.txt +0 -16
  205. python_cad_tools-0.1.9/src/python_cad_tools.egg-info/scm_version.json +0 -8
  206. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.gitattributes +0 -0
  207. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.githooks/pre-push +0 -0
  208. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.github/workflows/downstream-compatibility.yml +0 -0
  209. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.github/workflows/release-candidate.yml +0 -0
  210. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.github/workflows/release.yml +0 -0
  211. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.gitignore +0 -0
  212. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.opencode/commands/autocommit.md +0 -0
  213. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.opencode/tools/specrepo-autocommit.js +0 -0
  214. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.opencode/tools/specrepo-autocommit.py +0 -0
  215. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/AGENTS.md +0 -0
  216. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/CLAUDE.md +0 -0
  217. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/LICENSE +0 -0
  218. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/MANIFEST.in +0 -0
  219. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/build-semantics.md +0 -0
  220. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/manifests.md +0 -0
  221. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/project-configuration.md +0 -0
  222. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/spikes/format-feasibility.md +0 -0
  223. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/viewer-delivery.md +0 -0
  224. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/setup.cfg +0 -0
  225. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/__init__.py +0 -0
  226. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/__main__.py +0 -0
  227. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_locking.py +0 -0
  228. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_project_loader.py +0 -0
  229. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_project_state.py +0 -0
  230. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_scaffold.py +0 -0
  231. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_transaction.py +0 -0
  232. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/app.webmanifest +0 -0
  233. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/assets/hdrTextureLoader-BGQvgh0h.js +0 -0
  234. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/assets/mesh.vertexData.functions-ayNlGC5K.js +0 -0
  235. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/favicon.svg +0 -0
  236. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/sw.js +0 -0
  237. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/build.py +0 -0
  238. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/cli.py +0 -0
  239. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/context.py +0 -0
  240. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/determinism.py +0 -0
  241. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/drawings/_catalog.py +0 -0
  242. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exceptions.py +0 -0
  243. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/__init__.py +0 -0
  244. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/__init__.py +0 -0
  245. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/model.py +0 -0
  246. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/pdf.py +0 -0
  247. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/primitives.py +0 -0
  248. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/projection.py +0 -0
  249. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/svg.py +0 -0
  250. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/glb.py +0 -0
  251. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/quantities.py +0 -0
  252. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/step.py +0 -0
  253. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/geometry.py +0 -0
  254. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/project_config.py +0 -0
  255. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/py.typed +0 -0
  256. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/runtime_sync.py +0 -0
  257. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/build-manifest-1.json +0 -0
  258. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/design-manifest-1.json +0 -0
  259. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/download-manifest-2.json +0 -0
  260. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/drawing-annotations-1.json +0 -0
  261. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/glb-manifest-1.json +0 -0
  262. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/ifc-validation-1.json +0 -0
  263. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/quantities-1.json +0 -0
  264. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/run-metadata-1.json +0 -0
  265. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/site-metadata-1.json +0 -0
  266. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/step-validation-1.json +0 -0
  267. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/site.py +0 -0
  268. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/.gitignore +0 -0
  269. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/README.md +0 -0
  270. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/config.py +0 -0
  271. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/drawing_annotations.py +0 -0
  272. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/generated/.gitkeep +0 -0
  273. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/pyproject.toml +0 -0
  274. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/dependency_links.txt +0 -0
  275. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/entry_points.txt +0 -0
  276. {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/top_level.txt +0 -0
@@ -250,6 +250,124 @@ 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
373
  if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
@@ -7,6 +7,33 @@ 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
+
10
37
  ## [0.1.9] - 2026-08-03
11
38
 
12
39
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-cad-tools
3
- Version: 0.1.9
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.
@@ -162,6 +192,14 @@ documented in [`docs/drawing-extensions.md`](docs/drawing-extensions.md). One
162
192
  annotation set is validated and rendered consistently to SVG, DXF, and PDF
163
193
  before artifact hashes are recorded.
164
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
+
165
203
  ## Verification
166
204
 
167
205
  ```bash
@@ -175,6 +213,7 @@ before artifact hashes are recorded.
175
213
  .venv/bin/python -m twine check dist/*
176
214
  ```
177
215
 
216
+
178
217
  The default pytest command runs the fast unit suite. Integration, packaging,
179
218
  and external typing suites are explicit release gates. Packaging tests inspect wheel and sdist inventories, install the wheel
180
219
  non-editably into an isolated environment outside the checkout, prove the
@@ -13,6 +13,17 @@ The canonical project identities are:
13
13
 
14
14
  Licensed under [AGPL-3.0-only](LICENSE). Published on [PyPI](https://pypi.org/project/python-cad-tools/).
15
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
+
16
27
  ## Install for development
17
28
 
18
29
  Python 3.12 or 3.13 is required.
@@ -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
@@ -0,0 +1,102 @@
1
+ # Curated toolchain
2
+
3
+ Python CAD Tools curates a validated engineering ecosystem rather than
4
+ recreating the APIs of mature open-source CAD, BIM, geometry, and mesh
5
+ libraries. This document is the supported-library reference and the
6
+ dependency license policy. `tests/packaging/test_toolchain.py` asserts this
7
+ table against `pyproject.toml` metadata, so a pin change without a matching
8
+ doc change fails the test suite.
9
+
10
+ ## Install
11
+
12
+ ```
13
+ pip install "python-cad-tools[all]"
14
+ ```
15
+
16
+ Capability-based extras install only the libraries a project needs:
17
+
18
+ ```
19
+ python-cad-tools[cad] # build123d, cadquery-ocp-novtk
20
+ python-cad-tools[bim] # ifcopenshell
21
+ python-cad-tools[mesh] # trimesh, numpy
22
+ python-cad-tools[drawings] # ezdxf, reportlab, pypdf
23
+ python-cad-tools[engineering] # shapely, manifold3d, meshio
24
+ python-cad-tools[visualization] # reserved; see below
25
+ python-cad-tools[all] # every capability group
26
+ ```
27
+
28
+ **The Tier 1 verified stack (`cad`, `bim`, `mesh`, `drawings`) stays in
29
+ `[project.dependencies]`.** A plain `pip install python-cad-tools` already
30
+ installs those eight packages; the four extras restate the same pins so the
31
+ capability-to-library map is explicit and testable. This keeps the
32
+ `build_project` multi-format-consistency guarantee (STEP, IFC, GLB, drawings,
33
+ quantities from one model, cross-verified) unconditional on install shape.
34
+ `engineering` and `visualization` add libraries beyond what `build_project`
35
+ itself uses today; they exist for Tier 2 (direct library) use. A future major
36
+ version may move the core Tier 1 packages behind extras as a metadata-only
37
+ change — the extras names would not change.
38
+
39
+ See `docs/two-tier-contract.md` for what "Tier 1" and "Tier 2" mean.
40
+
41
+ ## Supported libraries
42
+
43
+ | Library | Version range | Capability group | License | Notes |
44
+ | --- | --- | --- | --- | --- |
45
+ | `build123d` | `>=0.11.1,<0.12` | `cad` | Apache-2.0 | Tier 1 solid modeling kernel API. |
46
+ | `cadquery-ocp-novtk` | `>=7.9.3.1.1,<7.10` | `cad` | Apache-2.0 | OCCT/OCP bindings built without VTK, to keep the default build GUI-free. |
47
+ | `ifcopenshell` | `>=0.8.5,<0.9` | `bim` | LGPL-3.0-or-later | IFC4 authoring, schema validation, and round-trip reload. |
48
+ | `trimesh` | `>=4.12,<5` | `mesh` | MIT | GLB export and mesh inspection. |
49
+ | `numpy` | `>=2.3,<3` | `mesh` | BSD-3-Clause | Numeric array support for geometry and mesh code. |
50
+ | `ezdxf` | `>=1.4,<2` | `drawings` | MIT | DXF authoring and round-trip reload. |
51
+ | `reportlab` | `>=4.4,<5` | `drawings` | BSD (ReportLab license) | PDF authoring. |
52
+ | `pypdf` | `>=6,<7` | `drawings` | BSD-3-Clause | PDF page-count and text-extraction verification. |
53
+ | `shapely` | `>=2.1,<3` | `engineering` | BSD-3-Clause | 2D geometry and topology for Tier 2 post-processing. |
54
+ | `manifold3d` | `>=3,<4` | `engineering` | Apache-2.0 | Robust mesh boolean operations for Tier 2 post-processing. |
55
+ | `meshio` | `>=5.3,<6` | `engineering` | MIT | Mesh format interchange for Tier 2 post-processing. |
56
+
57
+ `visualization` currently ships with no packages (see below).
58
+
59
+ ## License policy
60
+
61
+ - **Allowed** in any shipped capability group, including `all`: Apache-2.0,
62
+ MIT, BSD-2/3-Clause, ISC, PSF, and LGPL where the dependency is consumed as
63
+ a separately-distributed library (as `ifcopenshell` is here).
64
+ - **Not allowed** as a required dependency of any shipped group: GPL-only and
65
+ AGPL-only distributions. Such a library may still be documented as usable at
66
+ Tier 2 by a downstream project that chooses to depend on it directly, but
67
+ the framework never installs it.
68
+ - The framework's own license is **AGPL-3.0-only** and is unaffected by this
69
+ policy — the policy governs dependencies only.
70
+ - Adding a supported library requires, in the same change: a row in the table
71
+ above, coverage in the CI compatibility matrix (`toolchain-matrix` in
72
+ `.github/workflows/ci.yml`), and an import/interop assertion.
73
+
74
+ ## Evaluated and deferred
75
+
76
+ - **CadQuery.** CadQuery depends on `cadquery-ocp`, which conflicts with the
77
+ deliberately VTK-free `cadquery-ocp-novtk` build this framework pins for
78
+ `cad`. Admitting CadQuery would duplicate or displace the pinned OCCT
79
+ distribution. Not added.
80
+ - **PyVista (the `visualization` group).** PyVista (MIT) and VTK (BSD-3) are
81
+ license-compatible, but two constraints apply: the framework pins
82
+ `cadquery-ocp-novtk` specifically to avoid VTK, and the default build must
83
+ never import or invoke a GUI. `visualization` ships only once the CI
84
+ compatibility matrix proves `pip install '.[all]'` resolves, `pip check`
85
+ passes, and a full `build_project` completes with no `vtk*`/`pyvista`
86
+ module present in `sys.modules`. Until then, `visualization` is a
87
+ documented empty placeholder group — the name is reserved so no downstream
88
+ install command has to change if it is admitted later.
89
+
90
+ ## Compatibility verification
91
+
92
+ The `toolchain-matrix` CI job (`.github/workflows/ci.yml`) installs every
93
+ capability group across `{ubuntu-latest, macos-latest} × {3.12, 3.13}`, runs
94
+ `pip check`, imports every library the group declares, and — for `all` — runs
95
+ a Tier-2 interop smoke (a shape crosses build123d → `geometry.tessellate` →
96
+ trimesh → ifcopenshell read-back → ezdxf) plus the no-GUI assertion. It
97
+ publishes `toolchain-compatibility.json` as a CI artifact recording resolved
98
+ versions and pass/fail per library and cell.
99
+
100
+ This job answers the "does it install and interoperate" question for Tier 2.
101
+ It does not verify artifact determinism — that is a Tier 1 guarantee proven by
102
+ `build_project` and `verify_build_output`, not by the toolchain matrix.
@@ -0,0 +1,51 @@
1
+ # The two-tier authoring contract
2
+
3
+ Python CAD Tools is a curated engineering platform, not a wrapper around every
4
+ API of every supported library. It defines a clear boundary between two ways a
5
+ downstream project can use it.
6
+
7
+ ## Tier 1 — verified authoring
8
+
9
+ A project authors a `DesignModel` of `DesignElement` values using documented
10
+ fields (see `docs/neutral-model.md`) and builds through `build_project`. The
11
+ framework guarantees, for the selected formats:
12
+
13
+ - **Deterministic output.** The same model produces byte-identical artifacts.
14
+ - **Manifest hashing.** Every build emits a schema-versioned design manifest
15
+ with a `semantic_hash` and a build manifest with an `artifact_set_hash`.
16
+ - **Round-trip verification.** Every exported format is reloaded and checked
17
+ against the model it was built from (stable IDs, storeys, user properties,
18
+ quantities, openings, drawing annotation identity — see the exporter-specific
19
+ sections of `docs/neutral-model.md`).
20
+ - **Multi-format consistency.** STEP, IFC, GLB, drawings, and quantities all
21
+ derive from one model and are cross-reconciled by `verify_build_output`.
22
+
23
+ ## Tier 2 — supported, unverified direct library access
24
+
25
+ A project directly imports a supported library (`ifcopenshell`, `trimesh`,
26
+ `ezdxf`, `build123d`, `shapely`, etc. — see `docs/toolchain.md`) to read,
27
+ query, validate, or post-process. The framework guarantees the library
28
+ installs, imports, and interoperates with the rest of the pinned stack on
29
+ every supported platform/Python combination (verified by the
30
+ `toolchain-matrix` CI job). It guarantees **nothing** about artifacts a project
31
+ authors outside `build_project`: no determinism, no manifest coverage, no
32
+ round-trip, no multi-format consistency.
33
+
34
+ This is already the lived pattern for consumption — downstream projects
35
+ already `import ifcopenshell` to read and assert on generated IFC. This
36
+ document makes it explicit and names its boundary.
37
+
38
+ ## The extension rule
39
+
40
+ When Tier 1 lacks a capability a project needs, the path is a SpecRepo request
41
+ against the neutral model — not a silent bypass to Tier 2 for an artifact that
42
+ needs verification. Tier 2 is for reading, querying, validating, and
43
+ post-processing; it is not a substitute authoring path for artifacts that need
44
+ Tier 1 guarantees.
45
+
46
+ ## Downstream agent governance
47
+
48
+ Downstream project agent governance (`AGENTS.md`, `opencode.jsonc`) states
49
+ which tier each agent's responsibilities fall into, so an agent understands
50
+ its boundary without re-deriving it from source. See each sister repository's
51
+ `AGENTS.md` "Authoring tiers" section.