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.
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.github/workflows/ci.yml +118 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/CHANGELOG.md +27 -0
- {python_cad_tools-0.1.9/src/python_cad_tools.egg-info → python_cad_tools-0.1.10}/PKG-INFO +40 -1
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/README.md +20 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/drawing-extensions.md +16 -3
- python_cad_tools-0.1.10/docs/neutral-model.md +138 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/public-api.md +9 -2
- python_cad_tools-0.1.10/docs/toolchain.md +102 -0
- python_cad_tools-0.1.10/docs/two-tier-contract.md +51 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/pyproject.toml +34 -0
- python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/asset-manifest.json +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/dds-0RTqNYDh.js +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- python_cad_tools-0.1.10/src/python_cad_tools/_viewer_static/assets/index-CnrKUEff.css +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/index.html +2 -2
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/artifacts.py +44 -0
- python_cad_tools-0.1.10/src/python_cad_tools/build-info.json +1 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/drawings/__init__.py +14 -1
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/drawings/_validation.py +15 -1
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/elements.py +17 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/base.py +1 -10
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/annotations.py +58 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/dxf.py +1 -0
- python_cad_tools-0.1.10/src/python_cad_tools/exporters/ifc.py +547 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/manifests.py +17 -1
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/model.py +2 -2
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/units.py +0 -7
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/validation.py +115 -1
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10/src/python_cad_tools.egg-info}/PKG-INFO +40 -1
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/SOURCES.txt +171 -168
- python_cad_tools-0.1.10/src/python_cad_tools.egg-info/requires.txt +42 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/scm_file_list.json +286 -281
- python_cad_tools-0.1.10/src/python_cad_tools.egg-info/scm_version.json +8 -0
- python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/asset-manifest.json +0 -1
- python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/dds-IzBU48fT.js +0 -1
- python_cad_tools-0.1.9/src/python_cad_tools/_viewer_static/assets/index-BE2-nPmV.css +0 -1
- python_cad_tools-0.1.9/src/python_cad_tools/build-info.json +0 -1
- python_cad_tools-0.1.9/src/python_cad_tools/exporters/ifc.py +0 -296
- python_cad_tools-0.1.9/src/python_cad_tools.egg-info/requires.txt +0 -16
- python_cad_tools-0.1.9/src/python_cad_tools.egg-info/scm_version.json +0 -8
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.gitattributes +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.githooks/pre-push +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.github/workflows/downstream-compatibility.yml +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.github/workflows/release-candidate.yml +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.github/workflows/release.yml +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.gitignore +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.opencode/commands/autocommit.md +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.opencode/tools/specrepo-autocommit.js +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/.opencode/tools/specrepo-autocommit.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/AGENTS.md +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/CLAUDE.md +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/LICENSE +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/MANIFEST.in +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/build-semantics.md +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/manifests.md +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/project-configuration.md +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/spikes/format-feasibility.md +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/docs/viewer-delivery.md +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/setup.cfg +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/__init__.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/__main__.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_locking.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_project_loader.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_project_state.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_scaffold.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_transaction.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/app.webmanifest +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/assets/hdrTextureLoader-BGQvgh0h.js +0 -0
- {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
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/favicon.svg +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/_viewer_static/sw.js +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/build.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/cli.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/context.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/determinism.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/drawings/_catalog.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exceptions.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/__init__.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/__init__.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/model.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/pdf.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/primitives.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/projection.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/drawings/svg.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/glb.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/quantities.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/exporters/step.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/geometry.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/project_config.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/py.typed +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/runtime_sync.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/build-manifest-1.json +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/design-manifest-1.json +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/download-manifest-2.json +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/drawing-annotations-1.json +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/glb-manifest-1.json +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/ifc-validation-1.json +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/quantities-1.json +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/run-metadata-1.json +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/site-metadata-1.json +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/schemas/step-validation-1.json +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/site.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/.gitignore +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/README.md +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/config.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/drawing_annotations.py +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/generated/.gitkeep +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools/templates/project/pyproject.toml +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/dependency_links.txt +0 -0
- {python_cad_tools-0.1.9 → python_cad_tools-0.1.10}/src/python_cad_tools.egg-info/entry_points.txt +0 -0
- {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.
|
|
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`,
|
|
46
|
-
and `DrawingAnnotationSet`. The dataclass fields and
|
|
47
|
-
contract; there is no dictionary or
|
|
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
|
|
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.
|