python-cad-tools 0.1.13__tar.gz → 0.1.17__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.17/.opencode/tools/specrepo-autocommit.py +259 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/CHANGELOG.md +60 -0
- {python_cad_tools-0.1.13/src/python_cad_tools.egg-info → python_cad_tools-0.1.17}/PKG-INFO +7 -1
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/README.md +6 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/docs/neutral-model.md +107 -5
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/docs/project-configuration.md +14 -4
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/docs/public-api.md +10 -1
- python_cad_tools-0.1.17/docs/spikes/curved-geometry-ifc-bounds.md +171 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/_project_loader.py +53 -1
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/_viewer_static/app.webmanifest +2 -2
- python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/asset-manifest.json +1 -0
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/animationGroup-d5_0GqzW.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/animationGroup-CMgMiFPo.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/bakedVertexAnimation-BTnhNnCG.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/bakedVertexAnimation-BlpwZEna.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/basisTextureLoader-B1WedbgE.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/basisTextureLoader-pxgVvwE7.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/brdfTextureTools-DIdTXZSR.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/brdfTextureTools-CL1Nnrm1.js +2 -2
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/bumpFragment-C_S7LReC.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/bumpFragment-BNBjNOnF.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/bumpVertex-9p8w1w7z.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/bumpVertex-BTawYPw8.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/bumpVertexDeclaration-B8rpdm3U.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/bumpVertexDeclaration-B_fffQFY.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/clipPlaneFragment-A-1cS0Wr.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/clipPlaneFragment-D1ZAafqO.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/clipPlaneVertex-B34pEy_z.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/clipPlaneVertex-BC_wnvpq.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/cubemapToSphericalPolynomial-BAw8ctMB.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/cubemapToSphericalPolynomial-DeA9LJ87.js +1 -1
- python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/dds-C5zm4fz8.js +1 -0
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/dds.pure-D_Zw5OEt.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/dds.pure-B_7lJeYI.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/ddsTextureLoader-DeQLZozV.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/ddsTextureLoader-DsS5rL5j.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/default.fragment-BI3GAR2C.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/default.fragment-BUHDudIn.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/default.vertex-CQ4MILUZ.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/default.vertex-B80Wq2Ab.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/defaultUboDeclaration-DOBRS3iS.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/defaultUboDeclaration-DuGcl3VN.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/dumpTools-DCMMRWtL.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/dumpTools-1F1Rx0a0.js +2 -2
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/envTextureLoader-C-7LpDe_.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/envTextureLoader-DqI1ceC5.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/exrTextureLoader-oNqXrLmH.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/exrTextureLoader-DmNwF2B5.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphApplyForceBlock-DUMH2798.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphApplyForceBlock-DmvfeucL.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphApplyImpulseBlock-DUvs7iqs.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphApplyImpulseBlock-ChgIpPqh.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphArrayIndexBlock-B-qeUHG6.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphArrayIndexBlock-_JwXSrlj.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphBezierCurveEasingBlock-Cjm4_L1J.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphBezierCurveEasingBlock-B-T0qVRw.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphBinaryOperationBlock-CXnNy9QR.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphBinaryOperationBlock-TpZm5BfV.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphBranchBlock-DLUVB1dZ.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphBranchBlock-CNwAs8cP.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphCachedOperationBlock-BkfdjQtr.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphCachedOperationBlock-DaEYpjja.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphCancelDelayBlock-DwzbjNTQ.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphCancelDelayBlock-Dc4RKYSf.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphCodeExecutionBlock-CzFaSgik.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphCodeExecutionBlock-DCxeE8wr.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphConditionalDataBlock-DsMUDoGH.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphConditionalDataBlock-TckZ2SGl.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphConsoleLogBlock-CVWywmBY.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphConsoleLogBlock-B5e69wX5.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphConstantBlock-BNIgu4QC.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphConstantBlock-3ktOI1lC.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphContextBlock-DuQCYIgK.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphContextBlock-XTBtETD_.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphCounterBlock-DxCqjQc8.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphCounterBlock-Pb64y9OD.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphDataSwitchBlock-BOncXvGP.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphDataSwitchBlock-DsG4QDCF.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphDebounceBlock-43eNp_3W.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphDebounceBlock-B_XjPDoZ.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphDebugBlock-CYRuaSbJ.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphDebugBlock-CD6lTvpS.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphDoNBlock-Du-7uIwS.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphDoNBlock-0NvER8W0.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphEasingBlock-C6lQQb9c.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphEasingBlock-B6hapywt.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphFlipFlopBlock-Ba-WebLx.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphFlipFlopBlock-D1uyBOpq.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphForLoopBlock-CC4ZykmE.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphForLoopBlock-BYD81Gof.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphFunctionReferenceBlock-Cc8odCYm.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphFunctionReferenceBlock-zABkEq-X.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphGLTFDataProvider-Bs8eI-tc.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphGLTFDataProvider-B0ofoVrD.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphGetAngularVelocityBlock-BR2ioMLJ.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphGetAngularVelocityBlock-DPTUNnTb.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphGetAssetBlock-DD4Eo4N8.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphGetAssetBlock-B8_99mSz.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphGetLinearVelocityBlock-CiXY_22u.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphGetLinearVelocityBlock-DFYXgPrA.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphGetPhysicsMassPropertiesBlock-BFuYrykd.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphGetPhysicsMassPropertiesBlock-DA6AqPR7.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphGetPropertyBlock-yylHk0Tj.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphGetPropertyBlock-Bp4o9QmW.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphGetSoundVolumeBlock-Yoy3NMR4.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphGetSoundVolumeBlock-BAmdegmU.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphGetVariableBlock-DP0lG6uk.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphGetVariableBlock-Cd8Y6leR.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphIndexOfBlock-Dp46lAXL.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphIndexOfBlock-CGYxKZZY.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphInterpolationBlock-DAAojSot.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphInterpolationBlock-CwjeWPr7.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphIsKeyPressedBlock-BzyaFJtY.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphIsKeyPressedBlock-rNAEqrST.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphIsSoundPlayingBlock-4qIsPViO.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphIsSoundPlayingBlock-BTztAQ_0.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphJsonPointerParserBlock-BZG5ehwx.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphJsonPointerParserBlock-DoLWKXUb.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphKeyDownEventBlock-rpKm7KQS.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphKeyDownEventBlock-DPIi37WK.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphKeyUpEventBlock-DZ0cYho3.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphKeyUpEventBlock-ZV1Tim4d.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphKeyboardEventBlock-CiAmYMbH.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphKeyboardEventBlock-ClUSFYDa.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphMathBlocks-CbJDlFUY.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphMathBlocks-BEiYY5fC.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphMathCombineExtractBlocks-DICrYBP4.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphMathCombineExtractBlocks-CVfFjT4m.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphMatrixMathBlocks-ftOIDo5d.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphMatrixMathBlocks-B6l0dCDc.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphMeshPickEventBlock-DTChczhf.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphMeshPickEventBlock-kdpuo1mU.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphMultiGateBlock-DdupWV9J.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphMultiGateBlock-n99NMOON.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphPauseAnimationBlock-DBsgO-6v.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphPauseAnimationBlock-DXKPP4nK.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphPauseSoundBlock-DWcr1ULl.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphPauseSoundBlock-e2k4W8Bc.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphPhysicsCollisionEventBlock-CVKDMyoo.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphPhysicsCollisionEventBlock-ClgKwXfJ.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphPlayAnimationBlock-BXVH0aEG.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphPlayAnimationBlock-BZj6MNgX.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphPlaySoundBlock-LNU38ZaS.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphPlaySoundBlock-BnzlrpjK.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphPointerDownEventBlock-L9Wzp4sm.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphPointerDownEventBlock-CQiX1RZi.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphPointerMoveEventBlock-Cgf9rHw2.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphPointerMoveEventBlock-B_JzBfd9.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOutEventBlock-0bOFbyCB.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOutEventBlock-B-xKCRP6.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOverEventBlock-CJQEfL96.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphPointerOverEventBlock-DPC5GKft.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphPointerUpEventBlock-Dr4yXdtL.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphPointerUpEventBlock-hCR14WZY.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphReceiveCustomEventBlock-DpKjQPwo.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphReceiveCustomEventBlock-EOc5SmbK.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSceneReadyEventBlock-CTK4Ndci.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSceneReadyEventBlock-BAOJ-S5R.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSceneTickEventBlock-CzJbobbg.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSceneTickEventBlock-BJla1nDw.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSendCustomEventBlock-DBQ1n5eJ.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSendCustomEventBlock-CbJzCBSw.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSequenceBlock-oBhLC7Vj.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSequenceBlock-C0E5Vhwk.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSetAngularVelocityBlock-DXlS3umF.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSetAngularVelocityBlock-Crx1sltA.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSetDelayBlock-DhrCI14Z.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSetDelayBlock-t-D4JM8I.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSetLinearVelocityBlock-DdNE9BcN.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSetLinearVelocityBlock-DKNa-lhN.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSetPhysicsMotionTypeBlock-Be7qTZ0l.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSetPhysicsMotionTypeBlock-BIeMWJwi.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSetPropertyBlock-Bx8fCC87.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSetPropertyBlock-CFERwfo5.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSetSoundVolumeBlock-Bmh5show.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSetSoundVolumeBlock-B8fGBso9.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSetVariableBlock-BP87cysh.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSetVariableBlock-D3NUXLsU.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSoundEndedEventBlock-DPK4HFJ5.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSoundEndedEventBlock-BsojQIIQ.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphStopAnimationBlock-9n5l3RYF.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphStopAnimationBlock-Bhvi4mzM.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphStopSoundBlock-BkqUQ3IX.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphStopSoundBlock-BL-vDlPP.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphSwitchBlock-CzYmr0Rg.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphSwitchBlock-q5uox2Ll.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphThrottleBlock-C72DA8Ot.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphThrottleBlock-ZvIobaF-.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphTransformCoordinatesSystemBlock-B57atF6V.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphTransformCoordinatesSystemBlock-DC7IZTrj.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphTypeToTypeBlocks-BwO8ctcl.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphTypeToTypeBlocks-DsmLuQmd.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphUnaryOperationBlock-B5xQ7raL.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphUnaryOperationBlock-CeFOvM8N.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphVectorMathBlocks-BSQ0Jp6s.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphVectorMathBlocks-O_o0PB3R.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphWaitAllBlock-DkjMKncY.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphWaitAllBlock-CS8S_sto.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/flowGraphWhileLoopBlock-DiDLbXDS.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/flowGraphWhileLoopBlock-BogzY-TI.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/fogFragment-QU9YOYuH.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/fogFragment-5iY5mDF9.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-EGwqbpHv.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-CzELCfrg.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-CBvJqSQF.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/gaussianSplatting-Dm4qQcCl.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-CG3O4l2t.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-Dl5Knagi.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-CYV0OcvY.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.fragment-gV6NfBr2.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-s8IsAoDR.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-BU7N8GWm.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-DU77eH5y.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/gaussianSplatting.vertex-BYh0LKwp.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-Bt1AWZNn.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-DGCqlu5B.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-luoOzTyP.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.fragment-DPRpU6I6.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-xDMDxXMl.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-D6831_Db.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-m9aQdgcg.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/gaussianSplattingVoxel.vertex-DVVqYQkj.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/geometry.fragment-C_-6JJr4.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/geometry.fragment-CJ5P29rW.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/geometry.fragment-oisMFtj8.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/geometry.fragment-eMPAGW-C.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/geometry.vertex-CBkXTBVF.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/geometry.vertex-Cfmd-eH1.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/geometry.vertex-DQDqvDk5.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/geometry.vertex-D8aj2PHd.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/glowBlurPostProcess.fragment-QolNMgw6.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/glowBlurPostProcess.fragment-BNUj6Ok4.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.fragment-DRwn6uC2.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.fragment-BMfCbDSO.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.vertex-BPPwu0E9.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/glowMapGeneration.vertex-HFoIGtvW.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/glowMapMerge.fragment-ODjisfEL.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/glowMapMerge.fragment-DcbXX8O5.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/glowMapMerge.vertex-DB7eIwXj.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/glowMapMerge.vertex-C6kfp5Df.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/harmonicsFunctions-B2jlXPLE.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/harmonicsFunctions-B_Rux4W4.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/helperFunctions-B6Z1LJrO.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/helperFunctions-DfEEUVrK.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/iesTextureLoader-8wFKF-ak.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/iesTextureLoader-DRIv8q-c.js +1 -1
- python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/index-Bi_hQlRi.css +1 -0
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/index-BnAaL7KS.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/index-QUv88KPb.js +13 -13
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-DmepFK-C.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-AIxPvzg7.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-C0PAazdd.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/kernelBlur.fragment-B-fzpNXl.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-CQTyg7d5.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-BeCpz_iB.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-C_mnrqaY.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/kernelBlur.vertex-LF_ZsFNn.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-DCLBcYIA.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-0MaBFn29.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-DuoJgAZp.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/kernelBlurVaryingDeclaration-CKf1P4fb.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/ktxTextureLoader-CIypOERT.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/ktxTextureLoader-tKPsUacI.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/lightFragment-BinX63GB.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/lightFragment-k2nRX45x.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/logDepthDeclaration-D8jcsZiW.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/logDepthDeclaration-BGXXcOUJ.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/logDepthVertex-CAoFmcco.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/logDepthVertex-BC72KyzN.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/mainUVVaryingDeclaration-oF31v9Zp.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/mainUVVaryingDeclaration-BCMZuxRE.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/meshUboDeclaration-BXrkHWWW.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/meshUboDeclaration-Cxk75_zo.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/oitFragment-2x3JPdq6.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/oitFragment-BtwWIihL.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-CpT08ThE.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-8rnUKL54.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-B5ZDpeFy.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/openpbr.fragment-C6yWZfQI.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-DAeXubyL.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-DGh-kC4B.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-BaGhkjmV.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/openpbr.vertex-DbnVIs8Y.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/openpbrMaterial.pure-BXY_lClt.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/openpbrMaterial.pure-CFHhabYh.js +3 -3
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/openpbrMaterialLoadingAdapter-MpirTHMd.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/openpbrMaterialLoadingAdapter-BQGAj-f6.js +2 -2
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-CHHhh58w.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-BMK7l2Ba.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-DthxrR9-.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/openpbrTransmissionLayerData-DNsGu5u0.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration-CXcZlREH.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration-Cd1JAAAL.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration--Zhq0q7d.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/openpbrUboDeclaration-rBzbf9n3.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/packingFunctions-Bo_ikKLB.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/packingFunctions-Dji1Rr-b.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/packingFunctions-u3uWRkpF.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/packingFunctions-_goA4OEm.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/pass.fragment-slK02MnO.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/pass.fragment-CgGToehX.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/passCube.fragment-DnuA3v4l.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/passCube.fragment-CqqQ20XF.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/passCube.fragment-C13WHRV7.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/passCube.fragment-D93dlgjG.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/pbr.fragment-8v2GDfO1.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/pbr.fragment-YSvcDJjz.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/pbr.vertex-BuCPFkDX.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/pbr.vertex-BOhSAeHX.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/pbrBRDFFunctions-5nHUuKRr.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/pbrBRDFFunctions-DTEwurLZ.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/pbrDebug-C8fLVEpD.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/pbrDebug-B4IzJZHZ.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/pbrIBLFunctions-BM49sbQB.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/pbrIBLFunctions-gJ0KErMb.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/pbrMaterial.pure-B6n6Ic80.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/pbrMaterial.pure-BRIxFz02.js +2 -2
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/pbrMaterialLoadingAdapter-C0d04FRz.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/pbrMaterialLoadingAdapter--NRrZRBU.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/pbrUboDeclaration-CL7R5LTR.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/pbrUboDeclaration-6dxbcrtA.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/postprocess.vertex-BhCyZbyQ.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/postprocess.vertex-ZxthID8t.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/procedural.vertex-W-IcNTXE.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/procedural.vertex-BSVnGss-.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/procedural.vertex-Cb5DsSFx.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/procedural.vertex-DzIg_d-k.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/reflectionFunction-DYrae64q.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/reflectionFunction-CgKY-0t6.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/rgbdDecode.fragment-CFpIpdxk.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/rgbdDecode.fragment-CAfeJDpQ.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-BIBfrJET.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-D7xEO0B-.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-yPbrkGKz.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/rgbdEncode.fragment-DIzz0LC4.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/sceneUboDeclaration-D5YHSknt.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/sceneUboDeclaration-kGrRDglr.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-GSzJSZKX.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-CgQTw0M7.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-NwUMt_sy.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/textureProcessor.fragment-DnEEx4Gs.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/tgaTextureLoader-Z9HWdnv1.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/tgaTextureLoader-CwaQqeYn.js +1 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/vertexColorMixing-DkZl_JUT.js → python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/assets/vertexColorMixing-C2cK_vck.js +1 -1
- python_cad_tools-0.1.17/src/python_cad_tools/_viewer_static/favicon.svg +43 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/_viewer_static/index.html +4 -4
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/artifacts.py +20 -0
- python_cad_tools-0.1.17/src/python_cad_tools/build-info.json +1 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/cli.py +20 -2
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/elements.py +5 -1
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/ifc.py +187 -17
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/geometry.py +15 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/manifests.py +35 -0
- python_cad_tools-0.1.17/src/python_cad_tools/recipes.py +293 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/validation.py +226 -5
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17/src/python_cad_tools.egg-info}/PKG-INFO +7 -1
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools.egg-info/SOURCES.txt +170 -168
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools.egg-info/scm_file_list.json +172 -168
- python_cad_tools-0.1.17/src/python_cad_tools.egg-info/scm_version.json +8 -0
- python_cad_tools-0.1.13/.opencode/tools/specrepo-autocommit.py +0 -205
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/asset-manifest.json +0 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/dds-BDxArwXs.js +0 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/assets/index-CnrKUEff.css +0 -1
- python_cad_tools-0.1.13/src/python_cad_tools/_viewer_static/favicon.svg +0 -10
- python_cad_tools-0.1.13/src/python_cad_tools/build-info.json +0 -1
- python_cad_tools-0.1.13/src/python_cad_tools.egg-info/scm_version.json +0 -8
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/.gitattributes +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/.githooks/pre-push +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/.github/workflows/ci.yml +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/.github/workflows/downstream-compatibility.yml +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/.github/workflows/release-candidate.yml +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/.github/workflows/release.yml +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/.gitignore +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/.opencode/commands/autocommit.md +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/.opencode/tools/specrepo-autocommit.js +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/AGENTS.md +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/CLAUDE.md +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/LICENSE +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/MANIFEST.in +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/docs/build-semantics.md +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/docs/drawing-extensions.md +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/docs/manifests.md +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/docs/spikes/format-feasibility.md +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/docs/toolchain.md +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/docs/two-tier-contract.md +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/docs/viewer-delivery.md +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/pyproject.toml +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/setup.cfg +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/__init__.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/__main__.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/_locking.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/_project_state.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/_scaffold.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/_transaction.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/_viewer_static/assets/hdrTextureLoader-BGQvgh0h.js +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/_viewer_static/assets/mesh.vertexData.functions-ayNlGC5K.js +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/_viewer_static/sw.js +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/build.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/context.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/determinism.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/drawings/__init__.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/drawings/_catalog.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/drawings/_validation.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exceptions.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/__init__.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/base.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/drawings/__init__.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/drawings/annotations.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/drawings/dxf.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/drawings/model.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/drawings/pdf.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/drawings/primitives.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/drawings/projection.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/drawings/svg.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/glb.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/quantities.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/exporters/step.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/project_config.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/py.typed +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/runtime_sync.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/schemas/build-manifest-1.json +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/schemas/design-manifest-1.json +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/schemas/download-manifest-2.json +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/schemas/drawing-annotations-1.json +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/schemas/glb-manifest-1.json +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/schemas/ifc-validation-1.json +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/schemas/quantities-1.json +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/schemas/run-metadata-1.json +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/schemas/site-metadata-1.json +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/schemas/step-validation-1.json +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/site.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/templates/project/.gitignore +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/templates/project/README.md +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/templates/project/config.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/templates/project/drawing_annotations.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/templates/project/generated/.gitkeep +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/templates/project/model.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/templates/project/pyproject.toml +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools/units.py +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools.egg-info/dependency_links.txt +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools.egg-info/entry_points.txt +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools.egg-info/requires.txt +0 -0
- {python_cad_tools-0.1.13 → python_cad_tools-0.1.17}/src/python_cad_tools.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Run the LangChain AutoCommit CLI for a verified SpecRepo change."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
import shutil
|
|
8
|
+
import site
|
|
9
|
+
import subprocess
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import NoReturn
|
|
13
|
+
|
|
14
|
+
AUTOCOMMIT_REPOSITORY = "git+https://github.com/brandon-benge/langchain_autocommit.git"
|
|
15
|
+
CONFIGURATION_GUIDE = "https://github.com/brandon-benge/langchain_autocommit/blob/main/README.md#config-overrides"
|
|
16
|
+
EX_USAGE = 64
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def print_usage() -> None:
|
|
20
|
+
print(
|
|
21
|
+
'Usage: specrepo-autocommit "<summary of what changed>" [--no-push] '
|
|
22
|
+
"[--config-file <path>] [--env-var-name <NAME>] [--base-url <URL>] "
|
|
23
|
+
"[--model <MODEL>]\n\n"
|
|
24
|
+
"Runs autocommit on the current git branch.\n"
|
|
25
|
+
"--config-file points to the YAML configuration to use; defaults to "
|
|
26
|
+
"AUTOCOMMIT_PARAMS, then to .autoconfig.yaml in this repository.\n"
|
|
27
|
+
"--no-push commits locally without pushing to the remote.\n"
|
|
28
|
+
"--env-var-name, --base-url, and --model override the LLM API key "
|
|
29
|
+
"environment variable, base URL, and model that .autoconfig.yaml "
|
|
30
|
+
"otherwise supplies, e.g. to point at the AI Settings selected in "
|
|
31
|
+
"the Mac app.",
|
|
32
|
+
file=sys.stderr,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def fail(message: str, *, config_path: Path | None = None, code: int = 1) -> NoReturn:
|
|
37
|
+
print(message, file=sys.stderr)
|
|
38
|
+
if config_path is not None:
|
|
39
|
+
print(f"AUTOCOMMIT_PARAMS location: {config_path}", file=sys.stderr)
|
|
40
|
+
print(
|
|
41
|
+
f"Update that file as needed. Configuration guide: {CONFIGURATION_GUIDE}",
|
|
42
|
+
file=sys.stderr,
|
|
43
|
+
)
|
|
44
|
+
raise SystemExit(code)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_config_path(explicit_path: str | None = None) -> Path:
|
|
48
|
+
if explicit_path:
|
|
49
|
+
config_path = Path(os.path.expandvars(explicit_path)).expanduser().resolve()
|
|
50
|
+
print(f"--config-file is set to: {config_path}", flush=True)
|
|
51
|
+
else:
|
|
52
|
+
raw_path = os.environ.get("AUTOCOMMIT_PARAMS", "").strip()
|
|
53
|
+
if raw_path:
|
|
54
|
+
config_path = Path(os.path.expandvars(raw_path)).expanduser().resolve()
|
|
55
|
+
print(f"AUTOCOMMIT_PARAMS is set to: {config_path}", flush=True)
|
|
56
|
+
else:
|
|
57
|
+
config_path = (
|
|
58
|
+
Path(__file__).resolve().parent.parent.parent / ".autoconfig.yaml"
|
|
59
|
+
)
|
|
60
|
+
print(f"AUTOCOMMIT_PARAMS not set, using local fallback: {config_path}", flush=True)
|
|
61
|
+
|
|
62
|
+
if not config_path.is_file():
|
|
63
|
+
fail(
|
|
64
|
+
"Autocommit blocked: the configuration file does not exist or is not a regular file.",
|
|
65
|
+
config_path=config_path,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
return config_path
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def get_current_branch(config_path: Path) -> str:
|
|
72
|
+
try:
|
|
73
|
+
symbolic_ref = subprocess.run(
|
|
74
|
+
["git", "symbolic-ref", "--quiet", "--short", "HEAD"],
|
|
75
|
+
check=False,
|
|
76
|
+
capture_output=True,
|
|
77
|
+
text=True,
|
|
78
|
+
)
|
|
79
|
+
branch = symbolic_ref.stdout.strip()
|
|
80
|
+
|
|
81
|
+
if not branch:
|
|
82
|
+
revision = subprocess.run(
|
|
83
|
+
["git", "rev-parse", "--short", "HEAD"],
|
|
84
|
+
check=False,
|
|
85
|
+
capture_output=True,
|
|
86
|
+
text=True,
|
|
87
|
+
)
|
|
88
|
+
branch = revision.stdout.strip()
|
|
89
|
+
except OSError as error:
|
|
90
|
+
fail(
|
|
91
|
+
f"Autocommit blocked: could not run git: {error}",
|
|
92
|
+
config_path=config_path,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
if not branch:
|
|
96
|
+
fail(
|
|
97
|
+
"Autocommit blocked: could not determine the current git branch.",
|
|
98
|
+
config_path=config_path,
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
return branch
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def find_autocommit() -> str | None:
|
|
105
|
+
executable = shutil.which("autocommit")
|
|
106
|
+
if executable:
|
|
107
|
+
return executable
|
|
108
|
+
|
|
109
|
+
scripts_directory = Path(site.getuserbase()) / ("Scripts" if os.name == "nt" else "bin")
|
|
110
|
+
candidate = scripts_directory / ("autocommit.exe" if os.name == "nt" else "autocommit")
|
|
111
|
+
return str(candidate) if candidate.is_file() else None
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def ensure_autocommit_installed(config_path: Path) -> str:
|
|
115
|
+
executable = find_autocommit()
|
|
116
|
+
if executable:
|
|
117
|
+
return executable
|
|
118
|
+
|
|
119
|
+
print("autocommit CLI not found. Installing it with the current Python...")
|
|
120
|
+
try:
|
|
121
|
+
installation = subprocess.run(
|
|
122
|
+
[
|
|
123
|
+
sys.executable,
|
|
124
|
+
"-m",
|
|
125
|
+
"pip",
|
|
126
|
+
"install",
|
|
127
|
+
"--user",
|
|
128
|
+
AUTOCOMMIT_REPOSITORY,
|
|
129
|
+
],
|
|
130
|
+
check=False,
|
|
131
|
+
)
|
|
132
|
+
except OSError as error:
|
|
133
|
+
fail(
|
|
134
|
+
f"Autocommit installation failed: {error}",
|
|
135
|
+
config_path=config_path,
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
if installation.returncode != 0:
|
|
139
|
+
fail(
|
|
140
|
+
f"Autocommit installation failed with exit code {installation.returncode}.",
|
|
141
|
+
config_path=config_path,
|
|
142
|
+
code=installation.returncode,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
executable = find_autocommit()
|
|
146
|
+
if not executable:
|
|
147
|
+
fail(
|
|
148
|
+
"Autocommit was installed but its executable could not be found.",
|
|
149
|
+
config_path=config_path,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
print("autocommit installed successfully.")
|
|
153
|
+
return executable
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def run_autocommit(
|
|
157
|
+
executable: str,
|
|
158
|
+
config_path: Path,
|
|
159
|
+
summary: str,
|
|
160
|
+
branch: str,
|
|
161
|
+
no_push: bool = False,
|
|
162
|
+
env_var_name: str | None = None,
|
|
163
|
+
base_url: str | None = None,
|
|
164
|
+
model: str | None = None,
|
|
165
|
+
) -> None:
|
|
166
|
+
print(f"Running autocommit on branch {branch}.")
|
|
167
|
+
command = [
|
|
168
|
+
executable,
|
|
169
|
+
"--yes",
|
|
170
|
+
"--config-file",
|
|
171
|
+
str(config_path),
|
|
172
|
+
"-c",
|
|
173
|
+
summary,
|
|
174
|
+
]
|
|
175
|
+
if no_push:
|
|
176
|
+
command.append("--no-push")
|
|
177
|
+
if env_var_name:
|
|
178
|
+
command += ["--env-var", "--env-var-name", env_var_name]
|
|
179
|
+
if base_url:
|
|
180
|
+
command += ["--base-url", base_url]
|
|
181
|
+
if model:
|
|
182
|
+
command += ["--model", model]
|
|
183
|
+
try:
|
|
184
|
+
result = subprocess.run(command, check=False)
|
|
185
|
+
except OSError as error:
|
|
186
|
+
fail(
|
|
187
|
+
f"Autocommit failed to start: {error}",
|
|
188
|
+
config_path=config_path,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
if result.returncode != 0:
|
|
192
|
+
fail(
|
|
193
|
+
f"Autocommit failed with exit code {result.returncode}.",
|
|
194
|
+
config_path=config_path,
|
|
195
|
+
code=result.returncode if result.returncode > 0 else 1,
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def main(argv: list[str]) -> int:
|
|
200
|
+
# Extract --no-push, --config-file <path>, and the LLM override flags
|
|
201
|
+
# before joining the remainder into the summary.
|
|
202
|
+
no_push = False
|
|
203
|
+
config_file: str | None = None
|
|
204
|
+
env_var_name: str | None = None
|
|
205
|
+
base_url: str | None = None
|
|
206
|
+
model: str | None = None
|
|
207
|
+
positional: list[str] = []
|
|
208
|
+
args_iter = iter(argv[1:])
|
|
209
|
+
for arg in args_iter:
|
|
210
|
+
if arg == "--no-push":
|
|
211
|
+
no_push = True
|
|
212
|
+
elif arg in ("--config-file", "--env-var-name", "--base-url", "--model"):
|
|
213
|
+
try:
|
|
214
|
+
value = next(args_iter)
|
|
215
|
+
except StopIteration:
|
|
216
|
+
print_usage()
|
|
217
|
+
fail(
|
|
218
|
+
f"Autocommit blocked: {arg} requires a value argument.",
|
|
219
|
+
code=EX_USAGE,
|
|
220
|
+
)
|
|
221
|
+
if arg == "--config-file":
|
|
222
|
+
config_file = value
|
|
223
|
+
elif arg == "--env-var-name":
|
|
224
|
+
env_var_name = value
|
|
225
|
+
elif arg == "--base-url":
|
|
226
|
+
base_url = value
|
|
227
|
+
else:
|
|
228
|
+
model = value
|
|
229
|
+
else:
|
|
230
|
+
positional.append(arg)
|
|
231
|
+
|
|
232
|
+
config_path = get_config_path(config_file)
|
|
233
|
+
|
|
234
|
+
if not positional or not " ".join(positional).strip():
|
|
235
|
+
print_usage()
|
|
236
|
+
fail(
|
|
237
|
+
"Autocommit blocked: a summary of what changed is required.",
|
|
238
|
+
config_path=config_path,
|
|
239
|
+
code=EX_USAGE,
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
summary = " ".join(positional).strip()
|
|
243
|
+
branch = get_current_branch(config_path)
|
|
244
|
+
executable = ensure_autocommit_installed(config_path)
|
|
245
|
+
run_autocommit(
|
|
246
|
+
executable,
|
|
247
|
+
config_path,
|
|
248
|
+
summary,
|
|
249
|
+
branch,
|
|
250
|
+
no_push=no_push,
|
|
251
|
+
env_var_name=env_var_name,
|
|
252
|
+
base_url=base_url,
|
|
253
|
+
model=model,
|
|
254
|
+
)
|
|
255
|
+
return 0
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
if __name__ == "__main__":
|
|
259
|
+
raise SystemExit(main(sys.argv))
|
|
@@ -7,6 +7,66 @@ stable release is published.
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.1.16] - 2026-09-22
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- `python-cad --version` (and every other CLI invocation) no longer requires
|
|
15
|
+
`build123d`/the rest of the CAD toolchain to be importable: `cli.py`'s
|
|
16
|
+
`ValidationIssue` import — annotation-only, never evaluated at runtime
|
|
17
|
+
under this module's `from __future__ import annotations` — moved behind
|
|
18
|
+
`TYPE_CHECKING`. This was silently blocking every release since 0.1.14:
|
|
19
|
+
`build-publish` requires `tests/packaging` to pass, and its
|
|
20
|
+
clean-install-then-`--version` check installs the wheel with `--no-deps`,
|
|
21
|
+
which cannot satisfy the transitive `build123d` import `--version` didn't
|
|
22
|
+
actually need. 0.1.14 and 0.1.15 were tagged but never reached PyPI as a
|
|
23
|
+
result; 0.1.13 remained the latest published release throughout.
|
|
24
|
+
|
|
25
|
+
## [0.1.15] - 2026-09-22
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- `models/**/*.py` no longer needs an explicit `source-inputs` entry, at any
|
|
30
|
+
package depth and whether or not it has an `__init__.py`. `models/` is the
|
|
31
|
+
one directory a project is expected to keep adding files to over its
|
|
32
|
+
lifetime — one new module per new design object — so requiring a
|
|
33
|
+
`pyproject.toml` edit for each new file added no safety benefit: the build
|
|
34
|
+
manifest's `source_set_hash` already covers every file actually imported,
|
|
35
|
+
declared or not. `config.py`, `model.py`, `drawing_annotations.py`, and
|
|
36
|
+
`pyproject.toml` itself are unaffected and still require explicit
|
|
37
|
+
declaration, as does any other project-root Python file or data file read
|
|
38
|
+
through the public context. See `docs/project-configuration.md`.
|
|
39
|
+
|
|
40
|
+
## [0.1.14] - 2026-08-13
|
|
41
|
+
|
|
42
|
+
### Added
|
|
43
|
+
|
|
44
|
+
- New public `python_cad_tools.recipes` module: an opt-in, declarative
|
|
45
|
+
construction-recipe vocabulary (`RectangleProfile`, `CircleProfile`,
|
|
46
|
+
`ExtrudedProfile`, `DifferenceRecipe`, `evaluate`) that lets Tier 1
|
|
47
|
+
authoring produce parametric BREP IFC geometry
|
|
48
|
+
(`IfcExtrudedAreaSolid`/`SweptSolid`, `IfcBooleanResult`/`CSG`) instead of
|
|
49
|
+
only tessellated meshes. New `DesignElement.recipe` field, appended last;
|
|
50
|
+
`geometry` may now be `None` when a recipe is present. Recipes are
|
|
51
|
+
strictly opt-in per element — a model with no recipes produces IFC output
|
|
52
|
+
byte-identical to before this change, since neither recipe type adds a
|
|
53
|
+
unit-assignment entry. See `docs/neutral-model.md#construction-recipes`.
|
|
54
|
+
- The IFC validation sidecar gains additive `element_representation_types`
|
|
55
|
+
and `element_topology` keys; the design manifest gains additive
|
|
56
|
+
`recipe_kind` and `topology` per-element keys. `schema_version` is
|
|
57
|
+
unchanged on both.
|
|
58
|
+
|
|
59
|
+
### Changed
|
|
60
|
+
|
|
61
|
+
- The IFC sidecar's `bounds_mm` is now the union of tessellation-derived
|
|
62
|
+
bounds and evaluated-solid bounds, so BREP-only and mixed models report
|
|
63
|
+
correct bounds (a BREP element emits no `IfcCartesianPointList3D`, which
|
|
64
|
+
the previous derivation depended on exclusively).
|
|
65
|
+
- `python-cad validate`'s CLI error message now includes each failing
|
|
66
|
+
issue's `element_id` (formatted as `code[element_id]: message`) when the
|
|
67
|
+
issue has one, instead of only `code: message`. Issues without an
|
|
68
|
+
element, such as `model-id`, are unaffected.
|
|
69
|
+
|
|
10
70
|
## [0.1.11] - 2026-08-11
|
|
11
71
|
|
|
12
72
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-cad-tools
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.17
|
|
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
|
|
@@ -187,6 +187,12 @@ Project code should preserve stable semantic IDs, keep geometry parametric, and
|
|
|
187
187
|
create geometry and metadata together. Generated artifacts are outputs, never
|
|
188
188
|
design inputs.
|
|
189
189
|
|
|
190
|
+
`python_cad_tools.recipes` lets an element opt into parametric BREP IFC
|
|
191
|
+
geometry (`IfcExtrudedAreaSolid`/`SweptSolid`, `IfcBooleanResult`/`CSG`)
|
|
192
|
+
instead of the default tessellated mesh, verified by a topology round-trip
|
|
193
|
+
after every build. See
|
|
194
|
+
[`docs/neutral-model.md#construction-recipes`](docs/neutral-model.md#construction-recipes).
|
|
195
|
+
|
|
190
196
|
Project-owned drawing annotations use the typed, renderer-independent boundary
|
|
191
197
|
documented in [`docs/drawing-extensions.md`](docs/drawing-extensions.md). One
|
|
192
198
|
annotation set is validated and rendered consistently to SVG, DXF, and PDF
|
|
@@ -131,6 +131,12 @@ Project code should preserve stable semantic IDs, keep geometry parametric, and
|
|
|
131
131
|
create geometry and metadata together. Generated artifacts are outputs, never
|
|
132
132
|
design inputs.
|
|
133
133
|
|
|
134
|
+
`python_cad_tools.recipes` lets an element opt into parametric BREP IFC
|
|
135
|
+
geometry (`IfcExtrudedAreaSolid`/`SweptSolid`, `IfcBooleanResult`/`CSG`)
|
|
136
|
+
instead of the default tessellated mesh, verified by a topology round-trip
|
|
137
|
+
after every build. See
|
|
138
|
+
[`docs/neutral-model.md#construction-recipes`](docs/neutral-model.md#construction-recipes).
|
|
139
|
+
|
|
134
140
|
Project-owned drawing annotations use the typed, renderer-independent boundary
|
|
135
141
|
documented in [`docs/drawing-extensions.md`](docs/drawing-extensions.md). One
|
|
136
142
|
annotation set is validated and rendered consistently to SVG, DXF, and PDF
|
|
@@ -14,7 +14,7 @@ dimensions), and the validator invocation model. See
|
|
|
14
14
|
| `id` | `str` | Stable, unique identifier. Used to derive every downstream IFC `GlobalId` and to key manifests. |
|
|
15
15
|
| `name` | `str` | Human-readable display name. |
|
|
16
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. |
|
|
17
|
+
| `geometry` | `Any` | A build123d-compatible solid, shell, wire, or edge. Required and opaque — the framework does not restrict how it was built. May be `None` when `recipe` is present; the framework materializes it. |
|
|
18
18
|
| `geometry_kind` | `"solid" \| "shell" \| "wire" \| "edge" \| "reference"` | Declares the geometry's topological kind. Physical elements must be `"solid"`. |
|
|
19
19
|
| `placement` | `Placement` | Translation (mm) and rotation (degrees, XYZ) applied on top of `geometry`'s own coordinates. |
|
|
20
20
|
| `dimensions` | `Dimensions` | Declared, author-stated extents. Independent of the geometry's actual bounds; exported into `Pset_PythonCadDesign`. |
|
|
@@ -31,6 +31,7 @@ dimensions), and the validator invocation model. See
|
|
|
31
31
|
| `physical` | `bool` | Physical elements must be `"solid"` and require a material; non-physical (reference) elements are excluded from IFC, quantities, and mass. |
|
|
32
32
|
| `parent_id` | `str \| None` | Parent element ID, exported as an `IfcRelAggregates` relationship when both ends are IFC-exported. |
|
|
33
33
|
| `openings` | `list[Opening]` | Semantic voids in this host element. See "Openings" below. |
|
|
34
|
+
| `recipe` | `ConstructionRecipe \| None` | Opt-in declarative geometry. See "Construction recipes" below. |
|
|
34
35
|
|
|
35
36
|
## `IfcMapping`
|
|
36
37
|
|
|
@@ -131,8 +132,109 @@ returning a `list[ValidationIssue]`. `fatal_issues(...)` filters to
|
|
|
131
132
|
`severity == "error"`; `python-cad build`/`validate` fail on any fatal issue
|
|
132
133
|
before export begins.
|
|
133
134
|
|
|
134
|
-
## Construction recipes
|
|
135
|
+
## Construction recipes
|
|
135
136
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
`python_cad_tools.recipes` lets Tier 1 authoring produce **parametric BREP**
|
|
138
|
+
IFC geometry instead of only tessellated meshes, for the two shapes
|
|
139
|
+
evidenced as needed by real downstream models: an extruded 2D profile, and
|
|
140
|
+
one extruded profile with a second subtracted from it. Recipes are strictly
|
|
141
|
+
**opt-in per element** — omitting `DesignElement.recipe` preserves today's
|
|
142
|
+
tessellated output byte-for-byte.
|
|
143
|
+
|
|
144
|
+
### Type vocabulary
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
RectangleProfile(x_dim_mm: float, y_dim_mm: float, position: Placement = Placement()) # -> IfcRectangleProfileDef
|
|
148
|
+
CircleProfile(radius_mm: float, position: Placement = Placement()) # -> IfcCircleProfileDef
|
|
149
|
+
Profile = RectangleProfile | CircleProfile
|
|
150
|
+
|
|
151
|
+
ExtrudedProfile(profile: Profile, direction: tuple[float, float, float], depth_mm: float) # -> IfcExtrudedAreaSolid
|
|
152
|
+
DifferenceRecipe(base: ExtrudedProfile, tool: ExtrudedProfile) # -> IfcBooleanResult(Operator=DIFFERENCE)
|
|
153
|
+
ConstructionRecipe = ExtrudedProfile | DifferenceRecipe
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Both profile types are centered at the origin, matching IFC's own
|
|
157
|
+
`IfcRectangleProfileDef`/`IfcCircleProfileDef` semantics. `direction` and
|
|
158
|
+
`depth_mm` are independent fields, mirroring `IfcExtrudedAreaSolid`'s
|
|
159
|
+
`ExtrudedDirection`/`Depth` split — `direction`'s magnitude is ignored, only
|
|
160
|
+
its direction matters. `DifferenceRecipe.base`/`.tool` are typed as
|
|
161
|
+
`ExtrudedProfile`, not `ConstructionRecipe`: nesting is structurally
|
|
162
|
+
impossible, not merely unvalidated. There is no `RevolvedProfile`,
|
|
163
|
+
`PolygonProfile`, or general recursive boolean type — each would be a new
|
|
164
|
+
SpecRepo request; see `specrepo/rejected/2026-08-12-...-brep-recipes/` for
|
|
165
|
+
why the original, broader vocabulary was withdrawn in favor of this one.
|
|
166
|
+
|
|
167
|
+
### Three authoring shapes
|
|
168
|
+
|
|
169
|
+
- **Recipe only** (`recipe` set, `geometry=None`) — the framework evaluates
|
|
170
|
+
the recipe through build123d and assigns the result to `geometry`.
|
|
171
|
+
Recommended: the same solid then feeds STEP, GLB, drawings, quantities,
|
|
172
|
+
bounds, and the tessellated fallback, while IFC additionally gets the
|
|
173
|
+
parametric BREP.
|
|
174
|
+
- **Recipe and geometry** (both set) — the framework evaluates the recipe
|
|
175
|
+
and verifies it against the supplied `geometry` (volume relative
|
|
176
|
+
tolerance `1e-6`, bounds absolute tolerance `1e-6` mm, equal face and
|
|
177
|
+
edge counts). A mismatch is an error-severity
|
|
178
|
+
`ValidationIssue("recipe-geometry-mismatch", ...)`. The supplied
|
|
179
|
+
`geometry` object is kept — only its equivalence is asserted.
|
|
180
|
+
Evaluation for this comparison happens in `validate_model`, not the
|
|
181
|
+
loader, and does not overwrite `geometry`.
|
|
182
|
+
- **No recipe** — today's behavior, unchanged in every respect.
|
|
183
|
+
|
|
184
|
+
### Recipe → IFC entity map
|
|
185
|
+
|
|
186
|
+
| Recipe | IFC entity | `RepresentationType` |
|
|
187
|
+
| --- | --- | --- |
|
|
188
|
+
| `ExtrudedProfile` | `IfcExtrudedAreaSolid` | `"SweptSolid"` |
|
|
189
|
+
| `DifferenceRecipe` | `IfcBooleanResult` (`Operator=DIFFERENCE`) over two `IfcExtrudedAreaSolid` operands | `"CSG"` |
|
|
190
|
+
| *(no recipe)* | `IfcTriangulatedFaceSet` | `"Tessellation"` |
|
|
191
|
+
|
|
192
|
+
Neither recipe type carries an angle measure, so the IFC unit assignment is
|
|
193
|
+
unchanged — no `PLANEANGLEUNIT` entry, and no existing project's IFC hash
|
|
194
|
+
changes, including for projects that adopt a recipe.
|
|
195
|
+
|
|
196
|
+
### Topology round-trip verification
|
|
197
|
+
|
|
198
|
+
After writing the file, for each element with a recipe the exporter
|
|
199
|
+
reloads it, parses the emitted representation item back into a recipe,
|
|
200
|
+
asserts it is structurally equal to the authored recipe (floating-point
|
|
201
|
+
precision, relative/absolute tolerance `1e-9`), re-evaluates the parsed
|
|
202
|
+
recipe, and compares the result against the authored solid
|
|
203
|
+
(`element.geometry`) on face count, edge count, and volume (relative
|
|
204
|
+
tolerance `1e-6`), plus bounds (absolute tolerance `1e-6` mm) as a sanity
|
|
205
|
+
check. Any mismatch raises `BuildExportError` naming the element and the
|
|
206
|
+
differing measure. This parses-and-re-evaluates rather than reading
|
|
207
|
+
topology out of the reloaded BREP directly, because the framework pins
|
|
208
|
+
`cadquery-ocp-novtk` (OCP) rather than pythonocc (OCC); `ifcopenshell.geom`'s
|
|
209
|
+
OCC integration is unavailable and its default iterator path triangulates,
|
|
210
|
+
destroying the topology the check is meant to compare.
|
|
211
|
+
|
|
212
|
+
The IFC validation sidecar records `element_representation_types` (element
|
|
213
|
+
id → `"Tessellation"` / `"SweptSolid"` / `"CSG"`) and `element_topology`
|
|
214
|
+
(element id → face count, edge count, volume, for recipe elements only).
|
|
215
|
+
The design manifest records the same information per element as
|
|
216
|
+
`recipe_kind` (`null` / `"extruded_profile"` / `"difference"`) and, for
|
|
217
|
+
recipe elements, `topology`. `bounds_mm` in the sidecar is the union of
|
|
218
|
+
tessellation-derived bounds and evaluated-solid bounds, since a BREP-only
|
|
219
|
+
element emits no `IfcCartesianPointList3D` for the older derivation to read.
|
|
220
|
+
|
|
221
|
+
### Relationship to `openings`
|
|
222
|
+
|
|
223
|
+
`DesignElement.openings` (see "Openings" above) never subtracts material
|
|
224
|
+
from the host's own geometry — it only declares an `IfcOpeningElement`/
|
|
225
|
+
`IfcRelVoidsElement` semantic relationship on top of whatever geometry the
|
|
226
|
+
host already has. `DifferenceRecipe` is what makes the host's actual solid
|
|
227
|
+
have material missing where a door or window belongs — the two mechanisms
|
|
228
|
+
are complementary, not alternatives. A fully-converted host wall uses both:
|
|
229
|
+
`DifferenceRecipe` for the real notch, `openings` for the semantic
|
|
230
|
+
annotation. A project that only wants the semantic annotation keeps that
|
|
231
|
+
option without adopting a recipe at all.
|
|
232
|
+
|
|
233
|
+
### Display trade-off
|
|
234
|
+
|
|
235
|
+
A single `DifferenceRecipe` is a common, well-supported IFC authoring
|
|
236
|
+
pattern, but any `IfcBooleanResult`/`CSG` representation may still render
|
|
237
|
+
less cleanly in some BIM viewers than a plain `SweptSolid`. Prefer a bare
|
|
238
|
+
`ExtrudedProfile` over `DifferenceRecipe` wherever the notch isn't actually
|
|
239
|
+
needed as real geometry — falling back to `openings` alone for the semantic
|
|
240
|
+
relationship.
|
|
@@ -24,7 +24,15 @@ duplicate inputs fail before project Python runs.
|
|
|
24
24
|
absolute paths, backslashes, traversal components, missing files, and
|
|
25
25
|
directories are rejected. It must include `pyproject.toml`. Every project-root
|
|
26
26
|
Python file imported during an operation and every data file read through the
|
|
27
|
-
public context must be listed
|
|
27
|
+
public context must be listed, with one exception: any `models/**/*.py` file
|
|
28
|
+
is always authoritative and never needs a `source-inputs` entry, at any
|
|
29
|
+
package depth and whether or not it has an `__init__.py`. `models/` is the
|
|
30
|
+
one directory a project is expected to keep adding files to over its
|
|
31
|
+
lifetime -- one new module per new design object -- so it is exempt from
|
|
32
|
+
declaration; everything else still has no recursive source guessing. The
|
|
33
|
+
build manifest's `source_set_hash` still covers every file actually
|
|
34
|
+
imported, declared or not, so this exemption changes only what must be
|
|
35
|
+
declared up front, not what a build's determinism claim is based on.
|
|
28
36
|
|
|
29
37
|
## Entry points
|
|
30
38
|
|
|
@@ -64,9 +72,11 @@ with context.open_source("data/materials.csv") as stream:
|
|
|
64
72
|
materials = stream.read()
|
|
65
73
|
```
|
|
66
74
|
|
|
67
|
-
These paths must also appear in `source-inputs
|
|
68
|
-
|
|
69
|
-
|
|
75
|
+
These paths must also appear in `source-inputs` -- the `models/**/*.py`
|
|
76
|
+
exemption above covers imported Python modules only, not data files read
|
|
77
|
+
through this API, even when the path happens to fall under `models/`.
|
|
78
|
+
`BuildContext` contains only `project_root`, `config`, `source_revision`, and
|
|
79
|
+
`source_dirty`; it has no output or staging path.
|
|
70
80
|
|
|
71
81
|
## Isolation and environment
|
|
72
82
|
|
|
@@ -16,12 +16,21 @@ of optional runtime imports.
|
|
|
16
16
|
`cubic_yards`, `metres`, and `square_metres`.
|
|
17
17
|
- `python_cad_tools.geometry`: `box`, `reference_line`, `cylinder_between`,
|
|
18
18
|
`prism_between`, `sloped_pool`, `bounds`, `combined_bounds`, `tessellate`,
|
|
19
|
-
`is_valid_solid`, and `diagonal`.
|
|
19
|
+
`is_valid_solid`, and `diagonal`. **Curved geometry that must pass the
|
|
20
|
+
build pipeline's `artifact_integrity` IFC/design-bounds check should not
|
|
21
|
+
use `cylinder_between`** -- its tessellated B-rep output cannot exactly
|
|
22
|
+
match analytic design-side bounds. Use `python_cad_tools.recipes`'
|
|
23
|
+
`CircleProfile` + `ExtrudedProfile` instead; see
|
|
24
|
+
[`cylinder_between`'s docstring](../src/python_cad_tools/geometry.py) and
|
|
25
|
+
`docs/spikes/curved-geometry-ifc-bounds.md` for the confirmed mechanism.
|
|
20
26
|
- `python_cad_tools.drawings`: `Point2`, `Direction`, `DrawingStyleToken`,
|
|
21
27
|
`DrawingSheet`, `Line`, `Polyline`, `Text`, `Dimension`, `SectionCallout`,
|
|
22
28
|
`ElevationMarker`, `TableRow`, `Table`, `SheetAnnotations`, and
|
|
23
29
|
`DrawingAnnotationSet`.
|
|
24
30
|
- `python_cad_tools.validation`: `ValidationIssue`.
|
|
31
|
+
- `python_cad_tools.recipes`: `RectangleProfile`, `CircleProfile`, `Profile`,
|
|
32
|
+
`ExtrudedProfile`, `DifferenceRecipe`, `ConstructionRecipe`, and
|
|
33
|
+
`evaluate`. See [Construction recipes](neutral-model.md#construction-recipes).
|
|
25
34
|
- `python_cad_tools.build`: `FormatName`, `BuildOptions`, `ValidationOptions`,
|
|
26
35
|
`BuildResult`, `ValidationReport`, `build_project`, `validate_project`, and
|
|
27
36
|
`clean_project`.
|