Compare commits
1056 Commits
37d1fd0991
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| aea8c5e029 | |||
| eb04b9d73a | |||
| 8e8ce9e676 | |||
| 9fa569e449 | |||
| b959208ddc | |||
| aeb34cd85a | |||
| a3715cd036 | |||
| 099630ca86 | |||
| 0defdc24cc | |||
| fb25aca5ce | |||
| 901844fcb8 | |||
| a74f7e5e3a | |||
| af957c6ccd | |||
| 6898a37570 | |||
| b72c792850 | |||
| b9a71ae07c | |||
| 8e36935c4e | |||
| 8ad8297bce | |||
| 767883d406 | |||
| b7bbee5429 | |||
| 48c0450fe8 | |||
| cd1af92967 | |||
| 34135bcd28 | |||
| cd318d4c0d | |||
| 7287dad368 | |||
| b39442165e | |||
| ff924b1e51 | |||
| 5b1eb66860 | |||
| de2e49cc96 | |||
| 478469780d | |||
| 70d7149683 | |||
| 9d487dcba1 | |||
| 2af0c72cac | |||
| 76d8829ef5 | |||
| bd951d2dd2 | |||
| 650cfadc71 | |||
| 4c741a0783 | |||
| 2ad5433503 | |||
| 9f339a5495 | |||
| dad82b64f4 | |||
| d5c58a65db | |||
| 0401d26d58 | |||
| 58a70e1358 | |||
| 51828ff7e6 | |||
| de8c5112e0 | |||
| 1e16e4ab43 | |||
| ce007c080a | |||
| 747d08dd27 | |||
| 3bf78f5d33 | |||
| bcb80a7ce2 | |||
| 2315f9fc0b | |||
| b7402fc043 | |||
| 60ca7ee656 | |||
| 8024aebf85 | |||
| 732cb5d042 | |||
| 68d4a074f2 | |||
| 297dcd1a30 | |||
| f5dfec9276 | |||
| d7341f1140 | |||
| 86519f20b3 | |||
| f66a63c4af | |||
| e8d053ed48 | |||
| 91b5e0e5c9 | |||
| 2d239606e9 | |||
| 0ef3ae58ec | |||
| 7eedef7fcc | |||
| 8d9d70f2fc | |||
| ed5b339a45 | |||
| ec89d5e380 | |||
| 76a7b32e1f | |||
| 346f416930 | |||
| 97b78cb909 | |||
| c1b66e0157 | |||
| c705407a33 | |||
| cb0c400963 | |||
| feb059ca8b | |||
| 23e9259873 | |||
| 5f0cbf3c2e | |||
| bbef3d1d1b | |||
| 2cae74a943 | |||
| 6097190079 | |||
| 6167b57a7d | |||
| bb0e9b617f | |||
| 9768ca1fae | |||
| c7968ad6b3 | |||
| dff8bf443c | |||
| 8dc9e4e3b1 | |||
| 1cf705da3b | |||
| 8c9cd0e67c | |||
| d57e9c7895 | |||
| c7855deb06 | |||
| 900632594a | |||
| aa796ed900 | |||
| 25cc46d835 | |||
| 0ebbfabb9d | |||
| 2d56e31911 | |||
| 06b292539b | |||
| 3d07b213eb | |||
| cdb15ee461 | |||
| 58a5597111 | |||
| bb86139e95 | |||
| e74b910ad7 | |||
| b507772587 | |||
| 537b453b4d | |||
| a1bd089b01 | |||
| a9015ade15 | |||
| 56e3358e97 | |||
| 84676b8a06 | |||
| 4964f212d2 | |||
| c84ea82c63 | |||
| 49f7ec689b | |||
| f679ef0d72 | |||
| c44761655b | |||
| 19408c7276 | |||
| 6175027ab9 | |||
| 8c1e98c52e | |||
| 88533a2c34 | |||
| f5691dd341 | |||
| 1b59981cea | |||
| 19207f949d | |||
| cf55ee51c8 | |||
| 6be6076bdd | |||
| cb3e5c7f16 | |||
| 103bd9bea8 | |||
| ce43b868f4 | |||
| 23e3bd1cbe | |||
| 0cf9b6d8e5 | |||
| e0cf0126ae | |||
| e3570d1287 | |||
| 01416077ed | |||
| 6026958a89 | |||
| 70e3f2682b | |||
| be131f6f5c | |||
| e1ba4c9fd1 | |||
| 5090664004 | |||
| ec4bc1974a | |||
| 910dabff77 | |||
| fe7897c699 | |||
| 1fe688241c | |||
| 6a33315163 | |||
| cd47b68bbc | |||
| 5640e4f963 | |||
| b282b9303c | |||
| 8a0d890ef5 | |||
| 77c2c4410d | |||
| 9024483343 | |||
| 4b67b45a18 | |||
| 6da0fed80a | |||
| 3f948874e2 | |||
| 59154a5394 | |||
| 682f8b0067 | |||
| 55bd3aaea5 | |||
| dc57ad918c | |||
| ad9b29d065 | |||
| 897bdb3fe1 | |||
| a17ef5dfce | |||
| 9ec9667a43 | |||
| dfd960ffee | |||
| dce67a6f8e | |||
| b14a5f36f2 | |||
| 8b827ccb7c | |||
| 0e8034b352 | |||
| 9750ff508c | |||
| 8984a4b5e3 | |||
| bf8d17731a | |||
| bbcc736d69 | |||
| 40a5eb9f1c | |||
| 92bb102951 | |||
| 54e1eca9df | |||
| 30e1895541 | |||
| 5a4eb67291 | |||
| 23ffe308cf | |||
| 33c5a18d03 | |||
| fe52ade1d9 | |||
| 0dc84e89cc | |||
| 9391893cc5 | |||
| 92d178a34d | |||
| 4b4a6b03de | |||
| ad87c91311 | |||
| 54ed41842c | |||
| 5cdf43c7c3 | |||
| 930a990e80 | |||
| 5d85fad2b5 | |||
| cf18b3c614 | |||
| c28e9160da | |||
| 75796fdaab | |||
| 3b26e63da5 | |||
| cabf692b4c | |||
| b4f4aebf78 | |||
| 2ffc42fe09 | |||
| aa7a3ca282 | |||
| 8e4e7adc37 | |||
| 1bc051a27c | |||
| 96d6368a98 | |||
| c2e6adb520 | |||
| 29c4491198 | |||
| 8046a9682f | |||
| dcc65587ec | |||
| 8412ec5dec | |||
| 134ed2a8bd | |||
| f15d232413 | |||
| f6d2fe6445 | |||
| 796f83c736 | |||
| 9657d97020 | |||
| 8eafa3766d | |||
| 1053783fdc | |||
| 3f76ab8578 | |||
| 29b4a96365 | |||
| fa4fb95460 | |||
| 8f20178890 | |||
| 1c7f8c28d2 | |||
| c4eed6ff51 | |||
| f03fb4824d | |||
| 6a7aa98517 | |||
| 3ac7ff2975 | |||
| 754d737602 | |||
| 183dca449c | |||
| 584558f2b1 | |||
| c1fec7663a | |||
| 1f56ccbbaa | |||
| 6d29a9eccb | |||
| 51ce51a5a4 | |||
| abadf0dea8 | |||
| c577b24723 | |||
| 89b3018d41 | |||
| 3e7149d5c2 | |||
| 1f890f50fc | |||
| e4f1887caf | |||
| 5eadc53c65 | |||
| 490c2517b2 | |||
| 7cffe4203b | |||
| 49d0bd5a2e | |||
| bbb6b9f40a | |||
| 62e46562fc | |||
| f4043bdc91 | |||
| 9fd11873d5 | |||
| ea678d7a23 | |||
| 8045ffaaa7 | |||
| 9fb6954858 | |||
| 9692ac9efd | |||
| 317fa75e61 | |||
| 409455d826 | |||
| 002bcf95fb | |||
| 49b9ddf3b0 | |||
| 37149c4ab3 | |||
| 3beae2ad8a | |||
| adc6dcc7c7 | |||
| 0407b2d044 | |||
| d5cf186bd5 | |||
| 801ab96e51 | |||
| ad39d3335e | |||
| 7960cb3ef7 | |||
| 81e42aafe0 | |||
| ffad2fbfe3 | |||
| b2609f6570 | |||
| 64858e8a50 | |||
| c5dafdae75 | |||
| 63e6eaf35a | |||
| f766a25b27 | |||
| 922068c854 | |||
| fb52b3860c | |||
| 72b1ce7ae0 | |||
| 26b9b7d7d7 | |||
| b47ea4b95d | |||
| 1f0af5f96f | |||
| a7e28904cf | |||
| b924947159 | |||
| abcaf28b73 | |||
| 5fa2ac42ad | |||
| 69825b3c6d | |||
| 6d80e904da | |||
| 2628a9bba8 | |||
| 0404cbd588 | |||
| 1662af723f | |||
| 6b76f20432 | |||
| 7e2c45d067 | |||
| 1dca0e7d28 | |||
| ae84ae95cf | |||
| 48a7c152be | |||
| bc54ecccfd | |||
| 9394dff2d4 | |||
| 4b04ea0069 | |||
| 1f2ada6fe2 | |||
| 7dacb5891d | |||
| 4319497bf9 | |||
| 1600a52be2 | |||
| 6ed6de4318 | |||
| 87979f5924 | |||
| f57eec1470 | |||
| ee3807e6a3 | |||
| 19c51e8930 | |||
| 3270c1d961 | |||
| ccab1d1e2d | |||
| 97b87a2961 | |||
| e9b3352d4a | |||
| d12d3d05f0 | |||
| dca8640040 | |||
| f03696fe05 | |||
| 1817d904b8 | |||
| 388432362c | |||
| f65aff8094 | |||
| a91fbea612 | |||
| 9a64fbd7f2 | |||
| 352f6b89be | |||
| 100b7dbd6c | |||
| bbad442762 | |||
| 489eaac2c5 | |||
| e695e56ae0 | |||
| 668407ecb9 | |||
| 35b94cdb79 | |||
| d12d52abc0 | |||
| 86b35e6bf4 | |||
| 72164d66cb | |||
| 406590c4a7 | |||
| 44f09f5cb5 | |||
| 5d015c0545 | |||
| 7909e62185 | |||
| 9e06c3504d | |||
| 1910b46ffa | |||
| f7331611fd | |||
| 634a71e26b | |||
| 30ca28179f | |||
| 6b4ffe49ac | |||
| f76ce362d2 | |||
| c969f3aff0 | |||
| 3f5116beae | |||
| cc18fe11c6 | |||
| 8da579a92b | |||
| e760ab7a55 | |||
| c6a8a4a63b | |||
| ed702df774 | |||
| 238a83aefd | |||
| 7501564e5c | |||
| 51001d5ae4 | |||
| a42ad90899 | |||
| a3e2905ac4 | |||
| 190b17f2e0 | |||
| 61f20740ed | |||
| 4fe0ef4936 | |||
| 4e8eeba019 | |||
| d89644308a | |||
| 525ec729ec | |||
| 2b8ee4342b | |||
| 6ad7a5c0e0 | |||
| 97807e3a34 | |||
| 31ef2915f3 | |||
| ed678f8b32 | |||
| 9783ab756b | |||
| f96d7cd31b | |||
| 875ba3738a | |||
| 700fe3449f | |||
| f662cabde0 | |||
| 758cba0026 | |||
| b58ac56bd9 | |||
| 2277f7691a | |||
| ed44f62712 | |||
| 35b022ae55 | |||
| 462a93e684 | |||
| 50a72f338e | |||
| bbbfbf217a | |||
| affea41132 | |||
| a0c300b7d2 | |||
| 174a1e089f | |||
| a9848c757e | |||
| 3c9443ef2d | |||
| 87bd95edfb | |||
| ee8d6e0dfb | |||
| 199915b2ed | |||
| 567ad4100a | |||
| 4f8b1ebfb4 | |||
| 499da6bd1b | |||
| 464dda89ae | |||
| 5b505dfaac | |||
| 31fda171c3 | |||
| 22506e9a02 | |||
| 462b56774b | |||
| 051b649cc0 | |||
| 6c739a778d | |||
| 3852066051 | |||
| 9a0329e409 | |||
| c19cd0efee | |||
| 8e04c8f10f | |||
| 28c47c868c | |||
| d33177363b | |||
| 505c33dac5 | |||
| 21b652f000 | |||
| 6ee4834882 | |||
| 8931df4f23 | |||
| 90cc0eef8d | |||
| 94b46fb00f | |||
| a4b4d8451a | |||
| 3d25368fdc | |||
| cff2e2518c | |||
| 093424cecb | |||
| 89ce9365fd | |||
| d7d5436d66 | |||
| 7d645e506c | |||
| f8a6231295 | |||
| e8f739b8a9 | |||
| da8d023ab3 | |||
| 9117e5c72d | |||
| 05a7a60b72 | |||
| f5ef112f46 | |||
| 4fddc62924 | |||
| 145c204dad | |||
| f3c8d2b987 | |||
| 3826988ff7 | |||
| 45f0ec7378 | |||
| f61df5f21c | |||
| 5400120f6d | |||
| 12bac9ecc6 | |||
| 0967e8dcff | |||
| fd5f173abd | |||
| c0a3006390 | |||
| 9d8a9512ac | |||
| fb93e072c6 | |||
| a4fd519a9e | |||
| 7140e47963 | |||
| b0b88e57c1 | |||
| 8240b7b7de | |||
| 262c4c7509 | |||
| aecfcca4c1 | |||
| bf46c4367d | |||
| cb911323d9 | |||
| ef9d11fc12 | |||
| f02d3db9a0 | |||
| f32748e99c | |||
| d4b7d026cb | |||
| febbfe368e | |||
| 412ac195bb | |||
| b8f8bddafb | |||
| 25df8a1f3d | |||
| 30b71e48ac | |||
| 24facba3d3 | |||
| ad348d6d8c | |||
| ccbac50001 | |||
| b06af25d74 | |||
| 407dd297e5 | |||
| b3714b4865 | |||
| 7d2b431fe4 | |||
| 779e77f0ca | |||
| 2b4ae72370 | |||
| 8d2e45db60 | |||
| 429d8c8f7f | |||
| 39f499494a | |||
| 8ecc1ec875 | |||
| 2c762bca55 | |||
| 37b6456d68 | |||
| e02676fce7 | |||
| 22fc421948 | |||
| 00595122ec | |||
| 37fdd9e281 | |||
| 175994c99e | |||
| 2e0b0531d9 | |||
| b4eefa98a3 | |||
| 9aa1ae36c2 | |||
| d60bf45cb6 | |||
| 546ab0f2f7 | |||
| 6ef45559e3 | |||
| 5c0a581e9a | |||
| 23fafab62f | |||
| aabbe4fd01 | |||
| af14a878bc | |||
| 4c903ba687 | |||
| 25720f40ac | |||
| b7b1fa8f92 | |||
| af1ca890bc | |||
| 3afe7ebaf9 | |||
| a724921117 | |||
| ce5b5d6b89 | |||
| 2c3a1ecd5c | |||
| 1713e7480d | |||
| f88c4a60c1 | |||
| 5ec9648cca | |||
| 748e24e758 | |||
| 99ca70d0e3 | |||
| 7a86213224 | |||
| 0d15536eee | |||
| 9707d3ef78 | |||
| 804c1e8616 | |||
| be1677d4e8 | |||
| fb936b75eb | |||
| 1b584f289e | |||
| d04441f913 | |||
| 965504a53a | |||
| ef1766c807 | |||
| a54f4a051b | |||
| ab122cdc2e | |||
| 0bf97d17f7 | |||
| a05b2f6a2b | |||
| a1dffeb401 | |||
| 88f91b7837 | |||
| c16e680187 | |||
| a29ad1cd0e | |||
| 490fae9e61 | |||
| 1196fcff44 | |||
| ae1b3b2d1e | |||
| 3306710920 | |||
| e8d7471abf | |||
| 10f7b905fa | |||
| 63fbb72946 | |||
| 5ea2b34b26 | |||
| 7b69400ceb | |||
| ec24a91cb1 | |||
| 7ca186d298 | |||
| 334096d51e | |||
| 6417708056 | |||
| 80c8aafaed | |||
| 33fc0da223 | |||
| 6c97fb4648 | |||
| 9163d98497 | |||
| 7a3a925b65 | |||
| 830ed1231c | |||
| 378b606c7d | |||
| e0f7b3a8a6 | |||
| 83d697b162 | |||
| bef540fce6 | |||
| c5d379bda6 | |||
| 510eda0541 | |||
| dfb4ff961b | |||
| a90f129781 | |||
| 11ff11eb5b | |||
| 66252a7253 | |||
| 34aed2d160 | |||
| ba66f849d5 | |||
| 042cff87a0 | |||
| 33ca0848d2 | |||
| 5f61b529ad | |||
| a00c339735 | |||
| b9545fa6e8 | |||
| 463f572097 | |||
| 753cb9984b | |||
| 030bb3e379 | |||
| 12ebb8d51a | |||
| 8b8619a17b | |||
| 9763f56b1b | |||
| 4f02bcd11d | |||
| c1dcd0a0d5 | |||
| ff719f0519 | |||
| e46313431f | |||
| be66ac9233 | |||
| 9561a85207 | |||
| beeb39dc34 | |||
| 9812c5e35a | |||
| 2830940816 | |||
| ab0aa7ded9 | |||
| a27682185e | |||
| 7072ad867e | |||
| ca38825981 | |||
| 926b097f96 | |||
| 188203fa0d | |||
| aa86fe88c2 | |||
| 561692e9be | |||
| dca275d778 | |||
| a1a7b0a9cd | |||
| 9365e5d641 | |||
| ef45c7bd7d | |||
| 378f751939 | |||
| 8b5db4fc1e | |||
| 5af88b05ec | |||
| f55032948e | |||
| 8b6531f964 | |||
| 5f4ea5ad5a | |||
| 088b79b9b1 | |||
| f1e83a22b6 | |||
| 80ea0035e8 | |||
| b2636b2a03 | |||
| 2a98e89dca | |||
| 94ed3c33ce | |||
| e6cbed3b4f | |||
| e21647992e | |||
| b4e743a70b | |||
| b2e5639111 | |||
| d71c6fd59f | |||
| 7b3d44ae44 | |||
| 014d0516d9 | |||
| eaf84b4e5a | |||
| 1c9f359e4e | |||
| 5f5d4f276a | |||
| ed6f4d245e | |||
| 9bd51a37c4 | |||
| aa11ad71b5 | |||
| 86a9246770 | |||
| 20257fc2fd | |||
| 70b784a367 | |||
| 190116fcc6 | |||
| f5b1656830 | |||
| bfab562944 | |||
| 2e0d34c66e | |||
| 3495211b6b | |||
| 468c0c7f7d | |||
| 80226f2f78 | |||
| bd9d2e01c8 | |||
| b53f88236d | |||
| 249d84cb5b | |||
| d13a0255f5 | |||
| 1f20b3ca69 | |||
| f6891db601 | |||
| 1ecfeeb293 | |||
| 642eff2b3b | |||
| 9d9b560e9b | |||
| 173a9bf596 | |||
| c85637abf2 | |||
| 9a9a71ce70 | |||
| eaf366e500 | |||
| 804b572384 | |||
| a86ebc1320 | |||
| 38bb9ef23b | |||
| 8c49bebaca | |||
| 8cf4760dad | |||
| 304e9697f4 | |||
| 5a323f55ae | |||
| f320babaeb | |||
| 1fe5fdbe94 | |||
| f5a5c68dc8 | |||
| 4d2d3786d1 | |||
| 88d808a876 | |||
| c691dce5b0 | |||
| cc6a36fc59 | |||
| 3e4e6d8092 | |||
| 80c8e7ac3d | |||
| 6a02b3574a | |||
| f506cbb162 | |||
| a6ddda5e17 | |||
| c05082fd4c | |||
| d31401e1c5 | |||
| b0474cf67d | |||
| d26c5c98cd | |||
| 2342be7525 | |||
| 5b3d050383 | |||
| 838b59291d | |||
| 3ea329c23f | |||
| 6e33fecce1 | |||
| c32559000d | |||
| d7dccdd0ba | |||
| 56540ebba1 | |||
| 3d69f6d2d6 | |||
| 3dc521f192 | |||
| 69ea3b1e4d | |||
| d896a5fce2 | |||
| ffac49b580 | |||
| 35f03049e6 | |||
| df28bc9f40 | |||
| 8d47435abb | |||
| 7077d47b97 | |||
| b8d495d4be | |||
| 2032a5e722 | |||
| a4548d47fe | |||
| 349fb6c94e | |||
| 6c31891f7e | |||
| add52813ff | |||
| 0d613df418 | |||
| 96434f6ae9 | |||
| 285ea06881 | |||
| 3c0970dd1b | |||
| 41cc659918 | |||
| 4e9db1a69f | |||
| 15df0c8cc2 | |||
| 9bded1d93f | |||
| f9d2327ac9 | |||
| 5385d065dc | |||
| ac4f738ca8 | |||
| 1e8b009915 | |||
| 6792b4b9b1 | |||
| d97f75ce8f | |||
| 2ac6bcd712 | |||
| e69b5abc06 | |||
| 1844fcd6e2 | |||
| 116ed18e86 | |||
| b877b2b48d | |||
| ec2af8caee | |||
| 0df7359731 | |||
| 1a380712b8 | |||
| 0779c33354 | |||
| 0d80cfb113 | |||
| a2249bc53a | |||
| b80f37b6d8 | |||
| 883b2bccf6 | |||
| a8c6150c94 | |||
| ada89fe254 | |||
| 02fef64e5b | |||
| cac4f6c4fe | |||
| e806ccd673 | |||
| b6b5cd9808 | |||
| f389793bc6 | |||
| 6935533418 | |||
| 78fa0664d7 | |||
| fe3301b0bf | |||
| 0923c7d29e | |||
| 9ffb2b442b | |||
| a585ce7986 | |||
| ebd2dd601b | |||
| 5b2e788d0a | |||
| f19421c6eb | |||
| 3de8e82bdf | |||
| 6ba3d32b5b | |||
| c7276bb6d8 | |||
| c614664969 | |||
| 5d81d936df | |||
| 363b5dbce0 | |||
| 61a5ef00c6 | |||
| 37fc508288 | |||
| 3ab020fb64 | |||
| 14bc47d82f | |||
| 52c26994be | |||
| 0cc45f3924 | |||
| ac69785aaf | |||
| b5b1455d66 | |||
| f43780cfdb | |||
| 812077755e | |||
| 62914aaf38 | |||
| cff3dba224 | |||
| 456b3d012c | |||
| 612e27ce0e | |||
| 64ecf34bdc | |||
| 0f2487ade6 | |||
| 895cd87ec2 | |||
| 37f3aed8da | |||
| 030c5766d4 | |||
| 0368a1bb79 | |||
| d3388ba4d6 | |||
| 6e500180ad | |||
| cf9028d398 | |||
| 59f99895c3 | |||
| 5b675f1730 | |||
| 1f5afc71ca | |||
| 3e9aef40e3 | |||
| eb32d69643 | |||
| ebfa673f60 | |||
| b00710ca56 | |||
| f7479a6f38 | |||
| 966c810b4c | |||
| 25be8cff07 | |||
| beb1a2b663 | |||
| 73a7ff7c09 | |||
| 5533df10d1 | |||
| 1e9850b141 | |||
| b57e7fe28d | |||
| 247c83ab2e | |||
| f0f101d310 | |||
| 9da6d4e7ae | |||
| 02a1e4240d | |||
| e42737229f | |||
| d3bc7fd12b | |||
| 2b581684ef | |||
| 0e533764cc | |||
| 16b26e4e59 | |||
| ecf97515c7 | |||
| bb0933f779 | |||
| e4d25e07e9 | |||
| 905a0b754c | |||
| 5d8ba95f0c | |||
| 17faae708e | |||
| b925ed83da | |||
| cc0732acdc | |||
| ede94e76dc | |||
| 7c0c8c045b | |||
| e73e92e62c | |||
| 68197f4fd3 | |||
| 10afb965ea | |||
| e64feea47a | |||
| 7e191f2308 | |||
| df42a1b950 | |||
| 2d6345ef55 | |||
| 1cca7212da | |||
| 0e2dd7bd05 | |||
| 938ca266a7 | |||
| 50bde6b627 | |||
| 9950ddcda8 | |||
| b09407dfc8 | |||
| 5a47de8b17 | |||
| 49e3ef2e35 | |||
| 0b5817191b | |||
| 23be32e980 | |||
| c953ff4430 | |||
| eddbaa7a80 | |||
| e3c2285487 | |||
| 61e2ed0c93 | |||
| 4205429fdf | |||
| c9a042a98c | |||
| f74b439c58 | |||
| ee5aad3a41 | |||
| 3c36193399 | |||
| df8ebf24d4 | |||
| a8494ec737 | |||
| 2483dd2bd1 | |||
| f43cbef281 | |||
| 2776480eb3 | |||
| 9ace6d1f9d | |||
| a1bcc52fe6 | |||
| 8170148f5e | |||
| 81ae3cb081 | |||
| b5796aceb9 | |||
| 9f2b42a872 | |||
| 0946a088a1 | |||
| 3346d232a6 | |||
| f5ffecbc3d | |||
| f0dc4cfd52 | |||
| 8a8b645883 | |||
| 43d648e912 | |||
| d9c1fe320a | |||
| 7dc6980bc6 | |||
| f2e39c9b07 | |||
| bf3fc51920 | |||
| c1220579c6 | |||
| fdc4ad017a | |||
| fd33233cf2 | |||
| 59ba3fb4f4 | |||
| d65fe9b760 | |||
| 25352954bf | |||
| dc9d215496 | |||
| a730bf9c98 | |||
| bf0c36e80d | |||
| 9de80c3532 | |||
| 2149b2c245 | |||
| 7b0eb49879 | |||
| 4495619a45 | |||
| 5b0b7b4f92 | |||
| 19434cc74e | |||
| 66b5057348 | |||
| 1a6c4354bb | |||
| d6d13968ab | |||
| 19f0d66671 | |||
| 4e64071ac9 | |||
| 2f01e1e13f | |||
| 481a1bd960 | |||
| 42a0a03343 | |||
| 4a64fd5384 | |||
| d8e82b32c4 | |||
| 5fe250d032 | |||
| 8816358175 | |||
| adcf668214 | |||
| c3c1be8f85 | |||
| 0769c81464 | |||
| b53f35396a | |||
| 2a16a024ef | |||
| b215332130 | |||
| 0d4f0582d0 | |||
| 5ef825b841 | |||
| b51740bd37 | |||
| 282982206d | |||
| 1488add189 | |||
| dcc1012d9e | |||
| 958ecfdc0a | |||
| 9da04a1767 | |||
| f2ec34a111 | |||
| 3232356a1e | |||
| 89a3e24263 | |||
| 6abb8acc14 | |||
| e17a8c184e | |||
| e5e805a7c4 | |||
| 1333b08a35 | |||
| 12f2b2a843 | |||
| d9b6f60c74 | |||
| e81a502ccc | |||
| 4a15cdb721 | |||
| ca87fea29a | |||
| 4355aaa8c3 | |||
| 06d0f97719 | |||
| d4739af44f | |||
| 0984800878 | |||
| 0f563f0fe1 | |||
| 618c84e809 | |||
| 7090e0a366 | |||
| 0526b7e71e | |||
| 50b87d3f4f | |||
| 092bddb926 | |||
| 2593ef8ab3 | |||
| 248d8051ee | |||
| 7339775eaf | |||
| 82c9543b4c | |||
| ebb482d4e9 | |||
| 0d8bd94f12 | |||
| 9073938198 | |||
| 4fdac82c76 | |||
| 8d6c844bc4 | |||
| 575576dd8e | |||
| a3c4767a5a | |||
| 814eb08d47 | |||
| 0ee5e4aaa2 | |||
| 9a6d5871bc | |||
| d9ad702b7c | |||
| d2928161bb | |||
| 8fdeba8da6 | |||
| bd4028cd04 | |||
| a416c9f44e | |||
| 527fb0e541 | |||
| f42ed85166 | |||
| 89d4e02bd1 | |||
| de26b5e358 | |||
| d8c599fae6 | |||
| ac3482c735 | |||
| dd72b5db0f | |||
| a02b5947ea | |||
| 33f8fdc875 | |||
| 749e4c0724 | |||
| 18e644487b | |||
| a28a07094a | |||
| 5573ea69a1 | |||
| 520101739a | |||
| f3991bcbf5 | |||
| 74024c32d8 | |||
| b05f46010c | |||
| b72978ac15 | |||
| 60bc5d179a | |||
| c876f8090b | |||
| 19a0110650 | |||
| 7cdd09c477 | |||
| e450b86adc | |||
| 3f5d9599fb | |||
| 9707d9585f | |||
| a6cbee050e | |||
| 5a170b0076 | |||
| e2dd2e397d | |||
| 8af1ff9b7b | |||
| b03b7a5af8 | |||
| 5be5bf77ef | |||
| f57913c6bd | |||
| 3e45ca0abb | |||
| e79bf6b7cb | |||
| 2b2c3229bb | |||
| e50b9d2248 | |||
| cc0ec77ea3 | |||
| 67f13f1d80 | |||
| de9d6f2379 | |||
| a0e6292cd9 | |||
| 3497d90ceb | |||
| f5cf4f7eed | |||
| 95cd236ce6 | |||
| f680184d92 | |||
| 5e49448a96 | |||
| 09ab082751 | |||
| f53e60e77d | |||
| 51cf0f36b5 | |||
| fe9facc414 | |||
| 7e8a05da52 | |||
| 03248f5069 | |||
| 530a92c54f | |||
| f8712afd93 | |||
| 42d44ef760 | |||
| 17feca5c4b | |||
| dabb211106 | |||
| 9d48a61514 | |||
| dcb4649117 | |||
| 35eb4909da | |||
| 89ce3f28b2 | |||
| 266996c20b | |||
| f87a49500b | |||
| b636a8f96b | |||
| 02906f5af7 | |||
| 00fc43686a | |||
| 2024d5f305 | |||
| 04a8fe59ac | |||
| 0d70046305 | |||
| fc34e0a2f7 | |||
| 2d475469dc | |||
| 9450f6baf3 | |||
| d0c526c2ef | |||
| 3471280b93 | |||
| be1df4053c | |||
| ab9c991297 | |||
| a4bbef2d8d | |||
| 878b892fd0 | |||
| ccb70df521 | |||
| e875011904 | |||
| 71429d97c4 | |||
| cae013cb0a | |||
| e676711273 | |||
| 3e735eb0a2 | |||
| f35c6f39f8 | |||
| 16efcaa5b6 | |||
| 615ff01faf | |||
| 2f44337ce5 | |||
| a58f302a69 | |||
| 7952502cb2 | |||
| 991f01d48a | |||
| d748829db3 | |||
| d5b2b1508a | |||
| 10b6f3dbae | |||
| 94d7023727 | |||
| d506670b2e | |||
| fb1c073150 | |||
| aa865e63ad | |||
| c4188b94ac | |||
| 14e3fc74b3 | |||
| 5cd0cc82ce | |||
| c65f656e35 | |||
| 9883595eb8 | |||
| 81ddee3abd | |||
| 6ad036f0ba | |||
| ec1f2248a2 | |||
| 137de181d7 | |||
| f796605ebc | |||
| aefbefd8a5 | |||
| 1f9f5e4a99 | |||
| f7be4491b8 | |||
| 044a98e0a3 | |||
| 977935e8d8 | |||
| 0dcbccd5b5 | |||
| 9dfa78af78 | |||
| e4ba92cdfd | |||
| 6dc8c7f27e | |||
| 5a64ba116a | |||
| 554bbacd1a | |||
| 1b2c6b6b21 | |||
| e6761c0c8a | |||
| e4256b550b | |||
| db31d3087b | |||
| ed19298bf9 | |||
| 878531378b | |||
| 6130bbf2df | |||
| 37120d918b | |||
| 332aa3a381 | |||
| 9abcb360f2 | |||
| cabfef7167 | |||
| c5c6f896d5 | |||
| 5022ca1076 | |||
| e3d2ea446d | |||
| 476ee4e3dd | |||
| 32221d2ed1 | |||
| 6d33bd9c0c | |||
| 68067ebafd | |||
| 0ca6473a51 | |||
| 73a1868b12 | |||
| dc6370b2fb | |||
| 1f955e1818 | |||
| 6a5d28eae2 | |||
| a17dfd5a7e | |||
| b9350a74b2 | |||
| e337c355b6 | |||
| 6b288ea6f2 | |||
| d0e333859a | |||
| bdddd71845 | |||
| 8ca26d5193 | |||
| 76e0a57e8c | |||
| 8f128d6f2c | |||
| 1287471834 | |||
| 0007674728 | |||
| ea4987c2f2 | |||
| 5dbe0a42d5 | |||
| 2f73b5e28e | |||
| c6cbf1c149 | |||
| 2ee2483783 | |||
| d96e892485 | |||
| 96057dce7d | |||
| 24592a0249 | |||
| 63db449d9a | |||
| 67f26a3a6f | |||
| da4f619aed | |||
| 378c46ec62 | |||
| 742840b47d | |||
| 41d76ad964 | |||
| 763ba5ac23 | |||
| 63c90b8f90 | |||
| 5cbe1d9c35 | |||
| 37c737dc93 |
@@ -0,0 +1,4 @@
|
||||
Sessions
|
||||
CAD/Code/input
|
||||
CAD/Code/work
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
@echo off
|
||||
setlocal
|
||||
SET "MANAGE=%~dp0manage_interpreter.bat"
|
||||
|
||||
CALL "%MANAGE%" activate
|
||||
if errorlevel 1 (
|
||||
echo ERROR: Failed to activate Python environment
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
pushd "%PROJECT%"
|
||||
|
||||
"%VIRTUAL_ENV%\Scripts\python.exe" -m lib.create_assemblies %*
|
||||
set PYTHON_EXIT=%ERRORLEVEL%
|
||||
|
||||
popd
|
||||
CALL "%MANAGE%" deactivate
|
||||
exit /b %PYTHON_EXIT%
|
||||
@@ -0,0 +1,18 @@
|
||||
@echo off
|
||||
setlocal
|
||||
SET "MANAGE=%~dp0manage_interpreter.bat"
|
||||
|
||||
CALL "%MANAGE%" activate
|
||||
if errorlevel 1 (
|
||||
echo ERROR: Failed to activate Python environment
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
pushd "%PROJECT%"
|
||||
|
||||
"%VIRTUAL_ENV%\Scripts\python.exe" -m lib.diff_dimensions %*
|
||||
set PYTHON_EXIT=%ERRORLEVEL%
|
||||
|
||||
popd
|
||||
CALL "%MANAGE%" deactivate
|
||||
exit /b %PYTHON_EXIT%
|
||||
@@ -0,0 +1,26 @@
|
||||
@echo off
|
||||
REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt
|
||||
|
||||
REM Standardwerte setzen
|
||||
set "DEFAULT_TYPE=WEICHE"
|
||||
set "DEFAULT_JSON2D=omniflo_weichen.json"
|
||||
set "DEFAULT_JSONDIM=dimensions.json"
|
||||
set "DEFAULT_TOLERANCE=0.05"
|
||||
|
||||
echo Mögliche Werte für --type: BOGEN, WEICHE, TEFBOGEN, TEFWEICHE
|
||||
|
||||
REM Benutzereingaben mit Standardwerten
|
||||
set /p TYPE=Gib den Typ ein (Standard: %DEFAULT_TYPE%):
|
||||
if "%TYPE%"=="" set "TYPE=%DEFAULT_TYPE%"
|
||||
|
||||
set /p JSON2D=Gib den Namen der 2D-JSON-Datei ein (Standard: %DEFAULT_JSON2D%):
|
||||
if "%JSON2D%"=="" set "JSON2D=%DEFAULT_JSON2D%"
|
||||
|
||||
set /p JSONDIM=Gib den Namen der Dimensions-JSON-Datei ein (Standard: %DEFAULT_JSONDIM%):
|
||||
if "%JSONDIM%"=="" set "JSONDIM=%DEFAULT_JSONDIM%"
|
||||
|
||||
set /p TOLERANCE=Gib die Toleranz ein (Standard: %DEFAULT_TOLERANCE%):
|
||||
if "%TOLERANCE%"=="" set "TOLERANCE=%DEFAULT_TOLERANCE%"
|
||||
|
||||
REM Aufruf des Skripts mit den eingegebenen oder Standardwerten
|
||||
call "%~dp0diff_dimensions.bat" --type %TYPE% --json_2d %JSON2D% --json_dimensions %JSONDIM% --tolerance %TOLERANCE%
|
||||
@@ -0,0 +1,4 @@
|
||||
@echo off
|
||||
call "%~dp0setenv.bat"
|
||||
start
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
@echo off
|
||||
setlocal
|
||||
SET "MANAGE=%~dp0manage_interpreter.bat"
|
||||
|
||||
CALL "%MANAGE%" activate
|
||||
if errorlevel 1 (
|
||||
echo ERROR: Failed to activate Python environment
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
pushd "%PROJECT%"
|
||||
|
||||
"%VIRTUAL_ENV%\Scripts\python.exe" -m lib.read_variables %*
|
||||
set PYTHON_EXIT=%ERRORLEVEL%
|
||||
|
||||
popd
|
||||
CALL "%MANAGE%" deactivate
|
||||
exit /b %PYTHON_EXIT%
|
||||
@@ -0,0 +1,15 @@
|
||||
call setenv.bat
|
||||
if not exist %PROJECT%\.venv (
|
||||
ECHO Initialisiere Python virtual environment...
|
||||
py -m venv %PROJECT%\.venv --upgrade-deps
|
||||
ECHO Erfolgreich.
|
||||
|
||||
call %PROJECT%\.venv\Scripts\activate.bat
|
||||
ECHO Installiere erforderliche Python Packages...
|
||||
pip install -r %PROJECT_LIB%/requirements.txt -q
|
||||
ECHO Erfolgreich
|
||||
deactivate
|
||||
|
||||
) ELSE (
|
||||
ECHO Erforderliche Python Packages bereits installiert!
|
||||
)
|
||||
@@ -0,0 +1,35 @@
|
||||
@echo off
|
||||
CALL "%~dp0setenv.bat"
|
||||
|
||||
IF /I "%1"=="activate" GOTO activate
|
||||
IF /I "%1"=="deactivate" GOTO deactivate
|
||||
IF /I "%1"=="activate_interpreter" GOTO activate
|
||||
IF /I "%1"=="deactivate_interpreter" GOTO deactivate
|
||||
GOTO :eof
|
||||
|
||||
|
||||
:activate
|
||||
REM Interpreter wählen
|
||||
IF DEFINED NETWORK_PYTHON (
|
||||
SET PYTHON_EXE=%NETWORK_PYTHON%\python.exe
|
||||
) ELSE (
|
||||
SET PYTHON_EXE=python
|
||||
)
|
||||
|
||||
REM venv sicherstellen
|
||||
IF NOT EXIST "%PROJECT%\.venv" (
|
||||
"%PYTHON_EXE%" -m venv "%PROJECT%\.venv"
|
||||
)
|
||||
|
||||
REM venv aktivieren
|
||||
CALL "%PROJECT%\.venv\Scripts\activate.bat"
|
||||
|
||||
REM Interpreter festnageln
|
||||
SET VIRTUAL_ENV_PYTHON=%PYTHON_EXE%
|
||||
GOTO :eof
|
||||
|
||||
|
||||
:deactivate
|
||||
CALL "%PROJECT%\.venv\Scripts\deactivate.bat"
|
||||
SET VIRTUAL_ENV_PYTHON=
|
||||
GOTO :eof
|
||||
@@ -0,0 +1,18 @@
|
||||
@echo off
|
||||
setlocal
|
||||
SET "MANAGE=%~dp0manage_interpreter.bat"
|
||||
|
||||
CALL "%MANAGE%" activate
|
||||
if errorlevel 1 (
|
||||
echo ERROR: Failed to activate Python environment
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
pushd "%PROJECT%"
|
||||
|
||||
"%VIRTUAL_ENV%\Scripts\python.exe" -m lib.save_stl %*
|
||||
set PYTHON_EXIT=%ERRORLEVEL%
|
||||
|
||||
popd
|
||||
CALL "%MANAGE%" deactivate
|
||||
exit /b %PYTHON_EXIT%
|
||||
@@ -0,0 +1,23 @@
|
||||
@echo off
|
||||
REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt
|
||||
pushd %~dp0\..
|
||||
|
||||
set PROJECT=%cd%
|
||||
|
||||
set PROJECT_BIN=%PROJECT%\bin
|
||||
set PROJECT_LIB=%PROJECT%\lib
|
||||
set PROJECT_WORK=%PROJECT%\work
|
||||
set PROJECT_DATA=%PROJECT%\data
|
||||
set PROJECT_INPUT=%PROJECT%\input
|
||||
set PROJECT_TEMPLATE=\\ssg.local\freigaben\RuleDesigner\Templates\CreateAssemblies
|
||||
|
||||
if not exist %PROJECT_WORK% mkdir %PROJECT_WORK%
|
||||
if not exist %PROJECT_INPUT% mkdir %PROJECT_INPUT%
|
||||
|
||||
set PROJECT_JSON_BOGEN=%SSG_RD_DIR%\SVGs\Omniflo\python\OFBogen\json
|
||||
set PROJECT_JSON_WEICHE=%SSG_RD_DIR%\SVGs\Omniflo\python\OFWeiche\json
|
||||
set PROJECT_JSON_TEFBOGEN=%SSG_RD_DIR%\SVGs\Omniflo\python\TEFBogen\json
|
||||
set PROJECT_JSON_TEFWEICHE=%SSG_RD_DIR%\SVGs\Omniflo\python\TEFWeiche\json
|
||||
|
||||
popd
|
||||
goto :eof
|
||||
@@ -0,0 +1,251 @@
|
||||
# Dokumentation: CAD-Automatisierungsskripte
|
||||
|
||||
## Übersicht
|
||||
|
||||
| Skript | Batch-Datei | Zweck |
|
||||
| ------ | ----------- | ----- |
|
||||
| `lib/create_assemblies.py` | `bin/create_assemblies.bat` | Erzeugt .asm-Baugruppen aus .par-Dateien |
|
||||
| `lib/save_stl.py` | `bin/save_stl.bat` | Exportiert .asm-Baugruppen als STL-Dateien |
|
||||
| `lib/read_variables.py` | `bin/get_dimensions.bat` | Liest Maße aus .par-Dateien und speichert als JSON |
|
||||
| `lib/diff_dimensions.py` | `bin/diff_dimensions.bat` | Vergleicht 3D-Maße (JSON) mit 2D-Zeichnungsmaßen |
|
||||
| *(kein Python)* | `bin/get_all_differences.bat` | Interaktiver Wrapper für diff_dimensions |
|
||||
| *(kein Python)* | `bin/get_cmd.bat` | Öffnet Kommandozeile mit gesetzten Umgebungsvariablen |
|
||||
| *(kein Python)* | `bin/setenv.bat` | Setzt alle Umgebungsvariablen für das Projekt |
|
||||
|
||||
---
|
||||
|
||||
## 1. create_assemblies
|
||||
|
||||
### Zweck
|
||||
|
||||
Das Skript erstellt für jede .par-Datei im Eingabeordner eine neue .asm-Baugruppe, indem es eine Platzhalter-Baugruppe (dummy.asm) kopiert und darin die Platzhalter-Komponente (dummy.par) durch die jeweilige .par-Datei ersetzt.
|
||||
|
||||
### Aufrufmöglichkeiten
|
||||
|
||||
**Über die Batch-Datei (empfohlen unter Windows):**
|
||||
|
||||
```bat
|
||||
bin\create_assemblies.bat --in <Eingabeordner> --out <Ausgabeordner>
|
||||
```
|
||||
|
||||
Die Batch-Datei setzt Umgebungsvariablen und ruft das Python-Skript mit den übergebenen Parametern auf.
|
||||
|
||||
**Direkt über die Kommandozeile:**
|
||||
|
||||
```sh
|
||||
python lib/create_assemblies.py --in <Eingabeordner> --out <Ausgabeordner>
|
||||
```
|
||||
|
||||
**Parameter:**
|
||||
|
||||
- `--in`: Pfad zum Ordner mit .par-Dateien (optional, Standard: Umgebungsvariable PROJECT_INPUT oder ./input)
|
||||
- `--out`: Zielordner für die erzeugten .asm-Dateien (optional, Standard: ./work)
|
||||
|
||||
### Input/Output
|
||||
|
||||
- **Input:**
|
||||
- .par-Dateien im angegebenen Eingabeordner
|
||||
- dummy.asm und dummy.par im Netzwerkpfad PROJECT_TEMPLATE (werden als Vorlage und Platzhalter verwendet)
|
||||
- **Output:**
|
||||
- Für jede .par-Datei wird eine .asm-Datei im Ausgabeverzeichnis erzeugt.
|
||||
- Temporäre Dateien (_temp.asm, .cfg) werden nach Verarbeitung gelöscht.
|
||||
|
||||
### Hinweise
|
||||
|
||||
- Solid Edge muss installiert sein, da das Skript über COM darauf zugreift.
|
||||
- Die Platzhalter-Komponente in dummy.asm muss exakt dummy.par heißen.
|
||||
- Die Vorlage (dummy.asm) wird aus dem Netzwerkpfad `PROJECT_TEMPLATE` geladen (Standard: `\\ssg.local\freigaben\RuleDesigner\Templates\CreateAssemblies`).
|
||||
- Fehlerhafte oder fehlende Platzhalter werden übersprungen und führen nicht zum Abbruch des gesamten Prozesses.
|
||||
|
||||
---
|
||||
|
||||
## 2. save_stl
|
||||
|
||||
### Zweck
|
||||
|
||||
Das Skript exportiert alle .asm-Baugruppen in einem Ordner als STL-Dateien. Es dient dazu, die zuvor erzeugten Baugruppen für die Weiterverarbeitung (z.B. 3D-Druck oder Visualisierung) bereitzustellen.
|
||||
|
||||
### Aufrufmöglichkeiten
|
||||
|
||||
**Über die Batch-Datei (empfohlen unter Windows):**
|
||||
|
||||
```bat
|
||||
bin\save_stl.bat --in <Eingabeordner> --out <Ausgabeordner>
|
||||
```
|
||||
|
||||
Die Batch-Datei setzt Umgebungsvariablen und ruft das Python-Skript mit den übergebenen Parametern auf.
|
||||
|
||||
**Direkt über die Kommandozeile:**
|
||||
|
||||
```sh
|
||||
python lib/save_stl.py --in <Eingabeordner> --out <Ausgabeordner>
|
||||
```
|
||||
|
||||
**Parameter:**
|
||||
|
||||
- `--in`: Pfad zum Ordner mit .asm-Dateien (optional, Standard: Umgebungsvariable PROJECT_WORK oder ./work)
|
||||
- `--out`: Zielordner für die STL-Dateien (optional, Standard: ./work/STL_Export)
|
||||
|
||||
### Input/Output
|
||||
|
||||
- **Input:**
|
||||
- .asm-Dateien im angegebenen Eingabeordner (z.B. aus create_assemblies)
|
||||
- **Output:**
|
||||
- Für jede .asm-Datei wird eine .stl-Datei im Ausgabeverzeichnis erzeugt.
|
||||
- Temporäre .cfg- und .log-Dateien werden nach dem Export gelöscht.
|
||||
|
||||
### Hinweise
|
||||
|
||||
- Solid Edge muss installiert sein, da das Skript über COM darauf zugreift.
|
||||
- Das Skript ist robust gegenüber Fehlern beim Export einzelner Dateien (Fehler werden gemeldet, der Prozess läuft weiter).
|
||||
- Nach dem Export werden überflüssige .cfg- und .log-Dateien im Eingabe- und Ausgabeverzeichnis entfernt.
|
||||
|
||||
---
|
||||
|
||||
## 3. read_variables
|
||||
|
||||
### Zweck
|
||||
|
||||
Das Skript liest aus allen .par-Dateien in einem Verzeichnis die benutzerdefinierten Variablen `Mittiges_Koordinatensystem_X_Translation` und `Mittiges_Koordinatensystem_Y_Translation` aus und speichert die Werte als Breite und Höhe in einer JSON-Datei.
|
||||
|
||||
### Aufrufmöglichkeiten
|
||||
|
||||
**Über die Batch-Datei (empfohlen unter Windows):**
|
||||
|
||||
```bat
|
||||
bin\get_dimensions.bat --in <Eingabeordner> --out <Ausgabeordner>
|
||||
```
|
||||
|
||||
**Direkt über die Kommandozeile:**
|
||||
|
||||
```sh
|
||||
python lib/read_variables.py --in <Eingabeordner> --out <Ausgabeordner>
|
||||
```
|
||||
|
||||
**Parameter:**
|
||||
|
||||
- `--in`: Pfad zum Ordner mit .par-Dateien (optional, Standard: Umgebungsvariable PROJECT_INPUT oder ./input)
|
||||
- `--out`: Zielordner für die JSON-Ausgabe (optional, Standard: Umgebungsvariable PROJECT_WORK oder ./work)
|
||||
|
||||
### Input/Output
|
||||
|
||||
- **Input:**
|
||||
- .par-Dateien im angegebenen Eingabeordner
|
||||
- **Output:**
|
||||
- Eine JSON-Datei im Ausgabeverzeichnis, benannt nach dem Eingabeordner (z.B. input.json), mit folgendem Aufbau:
|
||||
|
||||
```json
|
||||
{
|
||||
"Dateiname_ohne_Endung": {
|
||||
"breite": <Wert>,
|
||||
"hoehe": <Wert>
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Hinweise
|
||||
|
||||
- Solid Edge muss installiert sein, da das Skript über COM darauf zugreift.
|
||||
- Die Variablen werden mit 2000 multipliziert und auf drei Nachkommastellen gerundet.
|
||||
- Falls eine .par-Datei die benötigten Variablen nicht enthält, wird sie übersprungen.
|
||||
- Fehlerhafte Dateien führen nicht zum Abbruch des gesamten Prozesses.
|
||||
|
||||
---
|
||||
|
||||
## 4. diff_dimensions
|
||||
|
||||
### Zweck
|
||||
|
||||
Das Skript vergleicht 3D-Bauteilmaße (aus einer JSON-Datei erzeugt von `read_variables`) mit 2D-Zeichnungsmaßen (aus einer JSON-Datei des SVG-Editors). Einträge, bei denen Breite oder Höhe außerhalb der Toleranz abweichen, werden in einer Ausgabe-JSON gespeichert. So lassen sich Inkonsistenzen zwischen 3D-Modell und 2D-Zeichnung schnell identifizieren.
|
||||
|
||||
### Aufrufmöglichkeiten
|
||||
|
||||
**Über die Batch-Datei:**
|
||||
|
||||
```bat
|
||||
bin\diff_dimensions.bat --type <Typ> --json_dimensions <3D-JSON> --json_2d <2D-JSON> [--tolerance <Wert>] [--result <Ausgabedatei>]
|
||||
```
|
||||
|
||||
**Interaktiv (mit Abfragen):**
|
||||
|
||||
```bat
|
||||
bin\get_all_differences.bat
|
||||
```
|
||||
|
||||
Fragt Typ, Dateinamen und Toleranz interaktiv ab und ruft dann `diff_dimensions.bat` auf.
|
||||
|
||||
**Direkt über die Kommandozeile:**
|
||||
|
||||
```sh
|
||||
python lib/diff_dimensions.py --type <Typ> --json_dimensions <3D-JSON> --json_2d <2D-JSON>
|
||||
```
|
||||
|
||||
**Parameter:**
|
||||
|
||||
- `--type`: Art des Bauteils: `BOGEN`, `WEICHE`, `TEFBOGEN` oder `TEFWEICHE` (bestimmt das Eingabeverzeichnis für die 2D-JSON)
|
||||
- `--json_dimensions`: Dateiname der 3D-Maße-JSON (aus `read_variables`, liegt in PROJECT_WORK)
|
||||
- `--json_2d`: Dateiname der 2D-Maße-JSON (liegt im typabhängigen Verzeichnis)
|
||||
- `--tolerance`: Toleranz in Millimetern (optional, Standard: `0.05`)
|
||||
- `--result`: Dateiname der Ausgabedatei (optional, Standard: `Differenzen_2D_3D.json`)
|
||||
- `--output_dir`: Ausgabeverzeichnis (optional, Standard: Umgebungsvariable PROJECT_WORK)
|
||||
|
||||
### Input/Output
|
||||
|
||||
- **Input:**
|
||||
- `--json_dimensions`: JSON-Datei mit 3D-Maßen (Schlüssel: SIVAS-Nummer, Felder: `breite`, `hoehe`)
|
||||
- `--json_2d`: JSON-Datei mit 2D-Maßen (Liste mit Feldern `Sivasnr`, `Objekte_width_mm`, `Objekte_height_mm`)
|
||||
- **Output:**
|
||||
- JSON-Datei mit allen Einträgen, deren Maße außerhalb der Toleranz liegen, inkl. Differenzwerten (`w_diff`, `h_diff`). Bei übereinstimmenden Maßen wird keine Ausgabedatei erzeugt.
|
||||
|
||||
### Beispielaufruf
|
||||
|
||||
```bat
|
||||
bin\diff_dimensions.bat --type BOGEN --json_dimensions Bogen_3D.json --json_2d Bogen_2D.json --tolerance 0.1 --result diff_bogen.json
|
||||
```
|
||||
|
||||
### Hinweise
|
||||
|
||||
- Erfordert kein Solid Edge — reine JSON-Verarbeitung.
|
||||
- Die Umgebungsvariablen `PROJECT_JSON_BOGEN`, `PROJECT_JSON_WEICHE`, `PROJECT_JSON_TEFBOGEN`, `PROJECT_JSON_TEFWEICHE` müssen für den `--type`-Parameter korrekt gesetzt sein (via setenv.bat).
|
||||
|
||||
---
|
||||
|
||||
## 5. Batch-Hilfsskripte
|
||||
|
||||
### setenv.bat
|
||||
|
||||
Setzt alle Projektumgebungsvariablen. Wird von allen anderen Batch-Dateien automatisch aufgerufen.
|
||||
|
||||
| Variable | Standardwert | Bedeutung |
|
||||
| -------- | ------------ | --------- |
|
||||
| `PROJECT_DIR` | Verzeichnis des Code-Ordners | Wurzelverzeichnis des Projekts |
|
||||
| `PROJECT_BIN` | `%PROJECT_DIR%\bin` | Verzeichnis der Batch-Dateien |
|
||||
| `PROJECT_LIB` | `%PROJECT_DIR%\lib` | Verzeichnis der Python-Skripte |
|
||||
| `PROJECT_WORK` | `%PROJECT_DIR%\work` | Arbeitsverzeichnis (Zwischenergebnisse) |
|
||||
| `PROJECT_DATA` | `%PROJECT_DIR%\data` | Datenverzeichnis |
|
||||
| `PROJECT_INPUT` | `%PROJECT_DIR%\input` | Eingabeverzeichnis (.par-Dateien) |
|
||||
| `PROJECT_TEMPLATE` | `\\ssg.local\freigaben\RuleDesigner\Templates\CreateAssemblies` | Netzwerkpfad zur dummy.asm-Vorlage |
|
||||
| `PROJECT_JSON_BOGEN` | `%SSG_RD_DIR%\SVGs\Omniflo\python\OFBogen\json` | 2D-JSON-Verzeichnis für Bögen |
|
||||
| `PROJECT_JSON_WEICHE` | `%SSG_RD_DIR%\SVGs\Omniflo\python\OFWeiche\json` | 2D-JSON-Verzeichnis für Weichen |
|
||||
| `PROJECT_JSON_TEFBOGEN` | `%SSG_RD_DIR%\SVGs\Omniflo\python\TEFBogen\json` | 2D-JSON-Verzeichnis für TEF-Bögen |
|
||||
| `PROJECT_JSON_TEFWEICHE` | `%SSG_RD_DIR%\SVGs\Omniflo\python\TEFWeiche\json` | 2D-JSON-Verzeichnis für TEF-Weichen |
|
||||
|
||||
### get_cmd.bat
|
||||
|
||||
Ruft `setenv.bat` auf und öffnet anschließend eine Kommandozeile mit gesetzten Umgebungsvariablen. Nützlich, um Skripte manuell mit korrekter Umgebung zu testen.
|
||||
|
||||
### get_all_differences.bat
|
||||
|
||||
Interaktiver Wrapper für `diff_dimensions.bat`. Fragt Typ, JSON-Dateinamen und Toleranz per Eingabeaufforderung ab (mit vordefinierten Standardwerten) und startet dann den Vergleich.
|
||||
|
||||
---
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- **Python** mit den Paketen `win32com` (pywin32) und `pythoncom`
|
||||
- **Solid Edge** (für COM-Zugriff bei `create_assemblies`, `save_stl`, `read_variables`)
|
||||
- **Netzwerkzugriff** auf `\\ssg.local\freigaben\RuleDesigner\Templates\CreateAssemblies` (für `create_assemblies`)
|
||||
|
||||
## Fehlerbehandlung
|
||||
|
||||
Fehlerhafte oder fehlende Dateien werden bei allen Skripten übersprungen — der Prozess läuft jeweils weiter und gibt eine Fehlermeldung aus.
|
||||
@@ -0,0 +1,122 @@
|
||||
import os
|
||||
import sys
|
||||
import shutil
|
||||
import argparse
|
||||
import win32com.client
|
||||
|
||||
|
||||
def start_solid_edge():
|
||||
"""Startet Solid Edge über COM."""
|
||||
print("Starting instance of SolidEdge...")
|
||||
se = win32com.client.Dispatch("SolidEdge.Application")
|
||||
se.Visible = True
|
||||
print("done\n")
|
||||
return se.Documents
|
||||
|
||||
|
||||
def find_placeholder_occurrence(occurrences, placeholder_name):
|
||||
"""Sucht die Occurrence mit dem Namen placeholder_name."""
|
||||
for occ in occurrences:
|
||||
filename = os.path.basename(occ.OccurrenceFileName)
|
||||
if filename.lower() == placeholder_name.lower():
|
||||
return occ
|
||||
return None
|
||||
|
||||
|
||||
def process_part(par_name, par_path, dummy_asm_path, placeholder_name, work_dir, output_dir, documents):
|
||||
"""Kopiert Dummy-ASM, ersetzt Platzhalter mit .par, speichert Ergebnis."""
|
||||
temp_asm = os.path.join(work_dir, "_temp.asm")
|
||||
temp_cfg = os.path.splitext(temp_asm)[0] + ".cfg"
|
||||
|
||||
shutil.copyfile(dummy_asm_path, temp_asm)
|
||||
|
||||
asm_doc = documents.Open(temp_asm)
|
||||
occurrences = asm_doc.Occurrences
|
||||
|
||||
target_occ = find_placeholder_occurrence(occurrences, placeholder_name)
|
||||
|
||||
if not target_occ:
|
||||
print(f"[{par_name}] Placeholder '{placeholder_name}' not found in 'dummy.asm'. Skipping.")
|
||||
asm_doc.Close(False)
|
||||
|
||||
# Cleanup bei Fehler
|
||||
if os.path.exists(temp_asm):
|
||||
os.remove(temp_asm)
|
||||
if os.path.exists(temp_cfg):
|
||||
os.remove(temp_cfg)
|
||||
return
|
||||
|
||||
print(f"[{par_name}] Replacing '{placeholder_name}' with '{par_name}'...")
|
||||
target_occ.Replace(par_path, True)
|
||||
|
||||
ziel_name = os.path.splitext(par_name)[0] + ".asm"
|
||||
ziel_path = os.path.join(output_dir, ziel_name)
|
||||
|
||||
asm_doc.SaveAs(ziel_path)
|
||||
print(f"→ Saved: {ziel_path}")
|
||||
|
||||
asm_doc.Close(False)
|
||||
|
||||
# Lösche ggf. erzeugte .cfg-Datei zur Ziel-ASM
|
||||
ziel_cfg = os.path.splitext(ziel_path)[0] + ".cfg"
|
||||
if os.path.exists(ziel_cfg):
|
||||
os.remove(ziel_cfg)
|
||||
|
||||
# Lösche temporäre ASM und deren CFG
|
||||
if os.path.exists(temp_asm):
|
||||
os.remove(temp_asm)
|
||||
if os.path.exists(temp_cfg):
|
||||
os.remove(temp_cfg)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Argumente parsen
|
||||
parser = argparse.ArgumentParser(description="Solid Edge Occurrence-Replacer")
|
||||
parser.add_argument("--in", dest="input_dir", required=False, help="Path to .par files (Standard: INPUT env or ./input)")
|
||||
parser.add_argument("--out", dest="output_dir", required=False, help="Optional target-directory for .asm files (Standard: ./work)")
|
||||
|
||||
if len(sys.argv) == 2 and sys.argv[1] in ("-h", "--help"):
|
||||
parser.print_help()
|
||||
sys.exit(0)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Umgebungsvariablen & Ordner
|
||||
work_dir = os.environ.get("PROJECT_WORK", "../work")
|
||||
data_dir = os.environ.get("PROJECT_DATA", "../data")
|
||||
template_dir = os.environ.get("PROJECT_TEMPLATE", "//ssg.local/freigaben/RuleDesigner/Templates/CreateAssemblies")
|
||||
|
||||
if args.input_dir:
|
||||
input_dir = args.input_dir
|
||||
print("Using provided input directory.")
|
||||
else:
|
||||
input_dir = os.environ.get("PROJECT_INPUT", "../input")
|
||||
print("No input directory provided. Using standard input directory.")
|
||||
|
||||
if args.output_dir:
|
||||
output_dir = args.output_dir
|
||||
else:
|
||||
output_dir = work_dir
|
||||
|
||||
os.makedirs(work_dir, exist_ok=True)
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
dummy_asm_path = os.path.join(template_dir, "dummy.asm")
|
||||
placeholder_name = "dummy.par"
|
||||
|
||||
documents = start_solid_edge()
|
||||
|
||||
par_dateien = [f for f in os.listdir(input_dir) if f.lower().endswith(".par")]
|
||||
|
||||
if not par_dateien:
|
||||
print("No .par-files found in input-directory. Exiting...")
|
||||
exit(1)
|
||||
|
||||
for par_name in par_dateien:
|
||||
par_path = os.path.join(input_dir, par_name)
|
||||
process_part(par_name, par_path, dummy_asm_path, placeholder_name, work_dir, output_dir, documents)
|
||||
|
||||
if output_dir == work_dir:
|
||||
print("\nNo output folder (--out) specified. Files saved into 'work' folder.")
|
||||
else:
|
||||
print("\nAll .par files processed and saved into given target folder.")
|
||||
@@ -0,0 +1,291 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
JSON Integration Script
|
||||
Erzeugt neue JSON Datei mit den SIVAS-Nummern, dessen Maße von 3D (.par) und 2D (.dwg) nicht übereinstimmen.
|
||||
"""
|
||||
|
||||
import json
|
||||
import argparse
|
||||
import sys
|
||||
import os
|
||||
from pathlib import Path
|
||||
import math
|
||||
|
||||
def load_json_file(file_path):
|
||||
"""
|
||||
Lädt eine JSON-Datei und gibt den Inhalt zurück.
|
||||
|
||||
Args:
|
||||
file_path (str): Pfad zur JSON-Datei
|
||||
|
||||
Returns:
|
||||
list: JSON-Daten als Liste
|
||||
|
||||
Raises:
|
||||
FileNotFoundError: Wenn die Datei nicht gefunden wird
|
||||
json.JSONDecodeError: Wenn die JSON-Datei ungültig ist
|
||||
"""
|
||||
try:
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
except FileNotFoundError:
|
||||
print(f"Fehler: Datei '{file_path}' nicht gefunden.")
|
||||
sys.exit(1)
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Fehler beim Parsen der JSON-Datei '{file_path}': {e}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def save_json_file(data, file_path):
|
||||
"""
|
||||
Speichert Daten in eine JSON-Datei.
|
||||
|
||||
Args:
|
||||
data (list): Zu speichernde Daten
|
||||
file_path (str): Pfad zur Ausgabedatei
|
||||
"""
|
||||
try:
|
||||
with open(file_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
print(f"Integrierte Daten erfolgreich in '{file_path}' gespeichert.")
|
||||
except Exception as e:
|
||||
print(f"Fehler beim Speichern der Datei '{file_path}': {e}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def integrate_json_data(json_dimensions_data, json_2d_data, tolerance):
|
||||
"""
|
||||
Integriert Daten aus JSON_1 in JSON_2 über die Sivasnr.
|
||||
Nur Einträge mit NICHT übereinstimmenden Objekt_width_mm und Objekt_height_mm werden integriert.
|
||||
|
||||
Args:
|
||||
json_dimensions_data (dict): Dictionary mit Sivasnr als Key und Dimensionsdaten als Value
|
||||
json_2d_data (list): Daten aus JSON_2
|
||||
tolerance (float): Toleranz für die Übereinstimmung der Objekt-Abmessungen
|
||||
|
||||
Returns:
|
||||
list: Integrierte Daten
|
||||
"""
|
||||
# Erstelle eine Kopie des Dictionary für die Verarbeitung
|
||||
json_dimensions_dict = json_dimensions_data.copy()
|
||||
|
||||
integrated_data = []
|
||||
updated_count = 0
|
||||
new_count = 0
|
||||
skipped_count = 0
|
||||
|
||||
# Durchlaufe JSON_2 und aktualisiere mit Daten aus JSON_1
|
||||
for json_2d_item in json_2d_data:
|
||||
sivasnr = json_2d_item['Sivasnr']
|
||||
# Konvertiere Sivasnr zu String für Dictionary-Lookup
|
||||
sivasnr_str = str(sivasnr)
|
||||
|
||||
if sivasnr_str in json_dimensions_dict:
|
||||
json_dimensions_item = json_dimensions_dict[sivasnr_str]
|
||||
|
||||
# Prüfe Übereinstimmung der Objekt-Abmessungen
|
||||
# Mapping der Attributnamen: 'breite' -> 'Objekt_width_mm', 'hoehe' -> 'Objekt_height_mm'
|
||||
dimensions_width = json_dimensions_item.get('breite', 0)
|
||||
dimensions_height = json_dimensions_item.get('hoehe', 0)
|
||||
|
||||
width_match = round(abs(dimensions_width - json_2d_item.get('Objekte_width_mm', 0)), 3) <= tolerance
|
||||
height_match = round(abs(dimensions_height - json_2d_item.get('Objekte_height_mm', 0)), 3) <= tolerance
|
||||
|
||||
if not (width_match and height_match):
|
||||
# Abmessungen stimmen NICHT überein - Eintrag mit Werten aus json_dimensions_data verwenden
|
||||
width_diff = abs(dimensions_width - json_2d_item.get('Objekte_width_mm', 0))
|
||||
height_diff = abs(dimensions_height - json_2d_item.get('Objekte_height_mm', 0))
|
||||
print(f"Integriere Sivasnr {sivasnr}: Abmessungen stimmen nicht überein (Toleranz: {tolerance})")
|
||||
print(f" Width-Differenz: {width_diff:.3f}mm, Height-Differenz: {height_diff:.3f}mm")
|
||||
print(f" Verwende Werte aus json_dimensions_data")
|
||||
|
||||
# Erstelle einen neuen Eintrag mit den Werten aus json_dimensions_data
|
||||
# und konvertiere die Attributnamen
|
||||
integrated_item = {
|
||||
'Sivasnr': sivasnr, # Verwende die ursprüngliche Sivasnr aus json_2d_data
|
||||
'Objekt_width_mm': dimensions_width,
|
||||
'Objekt_height_mm': dimensions_height,
|
||||
'w_diff': round(width_diff, 3),
|
||||
'h_diff': round(height_diff,3),
|
||||
'tolerance': tolerance
|
||||
}
|
||||
# Weitere Attribute aus json_dimensions_data hinzufügen (falls vorhanden)
|
||||
for key, value in json_dimensions_item.items():
|
||||
if key not in ['breite', 'hoehe']:
|
||||
integrated_item[key] = value
|
||||
integrated_data.append(integrated_item)
|
||||
updated_count += 1
|
||||
else:
|
||||
# Abmessungen stimmen überein - Eintrag überspringen
|
||||
print(f"Überspringe Sivasnr {sivasnr}: Abmessungen stimmen überein, w_diff={abs(dimensions_width-json_2d_item.get('Objekte_width_mm', 0))}, h_diff={abs(dimensions_height-json_2d_item.get('Objekte_height_mm', 0))}, (innerhalb der Toleranz)")
|
||||
skipped_count += 1
|
||||
|
||||
# Entferne das verarbeitete Item aus dem Dictionary
|
||||
del json_dimensions_dict[sivasnr_str]
|
||||
# Wenn Sivasnr nicht in JSON_1 gefunden wird, wird der Eintrag nicht zur Ausgabe hinzugefügt
|
||||
|
||||
# Füge verbleibende Items aus JSON_1 hinzu (die nicht in JSON_2 waren)
|
||||
for sivasnr_str, json_dimensions_item in json_dimensions_dict.items():
|
||||
# Erstelle einen neuen Eintrag mit konvertierten Attributnamen
|
||||
integrated_item = {
|
||||
'Sivasnr': sivasnr_str, # Verwende die String-Version der Sivasnr
|
||||
'Objekt_width_mm': json_dimensions_item.get('breite', 0),
|
||||
'Objekt_height_mm': json_dimensions_item.get('hoehe', 0)
|
||||
}
|
||||
# Weitere Attribute aus json_dimensions_data hinzufügen (falls vorhanden)
|
||||
for key, value in json_dimensions_item.items():
|
||||
if key not in ['breite', 'hoehe']:
|
||||
integrated_item[key] = value
|
||||
|
||||
integrated_data.append(integrated_item)
|
||||
new_count += 1
|
||||
print(f"Neue Sivasnr {sivasnr_str} aus JSON_1 hinzugefügt (nicht in JSON_2 vorhanden).")
|
||||
|
||||
print(f"\nIntegration abgeschlossen:")
|
||||
print(f"- {updated_count} Einträge integriert (Abmessungen stimmen nicht überein)")
|
||||
print(f"- {new_count} neue Einträge hinzugefügt (nur in JSON_1 vorhanden)")
|
||||
print(f"- {skipped_count} Einträge übersprungen (Abmessungen stimmen überein)")
|
||||
print(f"- {len(integrated_data)} Einträge gesamt")
|
||||
|
||||
return integrated_data
|
||||
def main():
|
||||
"""
|
||||
Hauptfunktion des Programms.
|
||||
"""
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Integriert JSON-Daten aus JSON_1 in JSON_2 über die Sivasnr",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog="""
|
||||
Beispiel:
|
||||
python json_integration.py --json_dimensions file1.json --json_2d file2.json --result result.json
|
||||
python json_integration.py --type=BOGEN --output_dir /custom/output --json_dimensions file1.json --json_2d file2.json --result result.json
|
||||
"""
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
'--output_dir',
|
||||
dest='output_dir',
|
||||
required=False,
|
||||
help='Ausgabeverzeichnis für integrierte Daten (Standard: PROJECT_WORK)'
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
'--json_dimensions',
|
||||
required=True,
|
||||
help='Dateiname der ersten JSON-Datei (Quelldaten)',
|
||||
metavar='[Weiche_3D, Bogen_3D, TEFWeiche_3D, TEFBogen_3D].json'
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
'--json_2d',
|
||||
required=True,
|
||||
help='Dateiname der zweiten JSON-Datei (Zieldaten)',
|
||||
metavar='[Weiche_2D, Bogen_2D, TEFWeiche_2D, TEFBogen_2D].json'
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
'--tolerance',
|
||||
type=float,
|
||||
default=0.05,
|
||||
required=False,
|
||||
help='Toleranz in Millimetern, welche als Differenz akzeptiert wird.',
|
||||
metavar='0.05'
|
||||
)
|
||||
|
||||
parser.add_argument(
|
||||
'--result',
|
||||
default='Differenzen_2D_3D.json',
|
||||
required=False,
|
||||
help='Dateiname für die Ausgabedatei mit integrierten Daten'
|
||||
)
|
||||
|
||||
parser.add_argument("--type", type=str, choices=["BOGEN", "WEICHE", "TEFBOGEN", "TEFWEICHE"], help="Art des Exports (BOGEN, WEICHE, TEFBOGEN, TEFWEICHE).")
|
||||
|
||||
if len(sys.argv) == 2 and sys.argv[1] in ("-h", "--help"):
|
||||
parser.print_help()
|
||||
sys.exit(0)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Umgebungsvariablen & Ordner
|
||||
output_dir = args.output_dir or os.environ.get("PROJECT_WORK", "./output")
|
||||
input_3d_dir = os.environ.get("PROJECT_WORK")
|
||||
bogen = os.environ.get("PROJECT_JSON_BOGEN")
|
||||
weiche = os.environ.get("PROJECT_JSON_WEICHE")
|
||||
tefbogen = os.environ.get("PROJECT_JSON_TEFBOGEN")
|
||||
tefweiche = os.environ.get("PROJECT_JSON_TEFWEICHE")
|
||||
tolerance = args.tolerance
|
||||
|
||||
if args.type == "BOGEN":
|
||||
input_dir = bogen
|
||||
elif args.type == "WEICHE":
|
||||
input_dir = weiche
|
||||
elif args.type == "TEFBOGEN":
|
||||
input_dir = tefbogen
|
||||
elif args.type == "TEFWEICHE":
|
||||
input_dir = tefweiche
|
||||
|
||||
|
||||
# Erstelle Verzeichnisse falls sie nicht existieren
|
||||
if not Path(input_dir).exists():
|
||||
print(f"Fehler: Eingabeverzeichnis existiert nicht.")
|
||||
sys.exit(1)
|
||||
|
||||
Path(output_dir).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Vollständige Pfade zu den Dateien
|
||||
json_dimensions_path = Path(input_3d_dir) / args.json_dimensions
|
||||
json_2d_path = Path(input_dir) / args.json_2d
|
||||
output_path = Path(output_dir) / args.result
|
||||
|
||||
# Validiere Eingabedateien
|
||||
if not json_dimensions_path.exists():
|
||||
print(f"Fehler: JSON_1 Datei '{json_dimensions_path}' existiert nicht.")
|
||||
sys.exit(1)
|
||||
|
||||
if not json_2d_path.exists():
|
||||
print(f"Fehler: JSON_2 Datei '{json_2d_path}' existiert nicht.")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
# Lade JSON-Dateien
|
||||
print(f"Lade JSON_1: {json_dimensions_path}")
|
||||
json_dimensions_data = load_json_file(json_dimensions_path)
|
||||
|
||||
print(f"Lade JSON_2: {json_2d_path}")
|
||||
json_2d_data = load_json_file(json_2d_path)
|
||||
|
||||
# # Validiere Datenstruktur
|
||||
# if not isinstance(json_dimensions_data, list) or not isinstance(json_2d_data, list):
|
||||
# print("Fehler: Beide JSON-Dateien müssen Arrays (Listen) enthalten.")
|
||||
# parser.print_help()
|
||||
# sys.exit(1)
|
||||
|
||||
# # Prüfe ob Sivasnr in allen Einträgen vorhanden ist
|
||||
# for i, item in enumerate(json_dimensions_data):
|
||||
# if 'Sivasnr' not in item:
|
||||
# print(f"Fehler: Sivasnr fehlt in JSON_1 Eintrag {i}")
|
||||
# parser.print_help()
|
||||
# sys.exit(1)
|
||||
|
||||
for i, item in enumerate(json_2d_data):
|
||||
if 'Sivasnr' not in item:
|
||||
print(f"Fehler: Sivasnr fehlt in JSON_2 Eintrag {i}")
|
||||
parser.print_help()
|
||||
sys.exit(1)
|
||||
|
||||
print(f"JSON_1 enthält {len(json_dimensions_data)} Einträge")
|
||||
print(f"JSON_2 enthält {len(json_2d_data)} Einträge")
|
||||
|
||||
# Integriere Daten
|
||||
integrated_data = integrate_json_data(json_dimensions_data, json_2d_data, tolerance)
|
||||
|
||||
if len(integrated_data) > 0:
|
||||
# Speichere integrierte Daten
|
||||
save_json_file(integrated_data, output_path)
|
||||
else:
|
||||
print(f"Dateien enthalten keine Unterschiede")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,103 @@
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import argparse
|
||||
import win32com.client
|
||||
|
||||
def read_custom_properties(par_path):
|
||||
"""Liest benutzerdefinierte Variablen 'Mittiges_Koordinatensystem_X/Y_Translation'."""
|
||||
try:
|
||||
app = win32com.client.Dispatch("SolidEdge.Application")
|
||||
app.Visible = False # Optional auf True für Debug
|
||||
|
||||
doc = app.Documents.Open(par_path)
|
||||
variables = doc.Variables
|
||||
|
||||
breite = None
|
||||
hoehe = None
|
||||
|
||||
for i in range(1, variables.Count + 1):
|
||||
variable = variables.Item(i)
|
||||
name = variable.Name
|
||||
value = variable.Value
|
||||
|
||||
if name == 'Mittiges_Koordinatensystem_X_Translation':
|
||||
breite = round(value*2000, 3)
|
||||
elif name == 'Mittiges_Koordinatensystem_Y_Translation':
|
||||
hoehe = round(value*2000, 3)
|
||||
|
||||
doc.Close(False)
|
||||
|
||||
if breite is not None and hoehe is not None:
|
||||
return breite, hoehe
|
||||
else:
|
||||
raise ValueError("Benötigte Variablen nicht gefunden.")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Fehler beim Lesen von {par_path}: {e}")
|
||||
return None, None
|
||||
|
||||
finally:
|
||||
try:
|
||||
if doc:
|
||||
doc.Close(False)
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
def extract_all(input_dir):
|
||||
"""Verarbeitet alle .par Dateien im Verzeichnis."""
|
||||
result = {}
|
||||
|
||||
for file in os.listdir(input_dir):
|
||||
if file.lower().endswith(".par"):
|
||||
par_path = os.path.join(input_dir, file)
|
||||
print(f"Processing: {file}")
|
||||
breite, hoehe = read_custom_properties(par_path)
|
||||
|
||||
if breite is not None and hoehe is not None:
|
||||
key = os.path.splitext(file)[0] # Dateiname ohne .par
|
||||
result[key] = {
|
||||
"breite": breite,
|
||||
"hoehe": hoehe
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Extrahiert 'Breite' und 'Höhe' aus .par-Dateien in JSON.")
|
||||
parser.add_argument("--in", dest="input_dir", required=False, help="Ordner mit .par-Dateien (Standard: PROJECT_INPUT oder ./input)")
|
||||
parser.add_argument("--out", dest="output_dir", required=False, help="Ordner für JSON-Ausgabe (Standard: PROJECT_WORK oder ./work)")
|
||||
|
||||
if len(sys.argv) == 2 and sys.argv[1] in ("-h", "--help"):
|
||||
parser.print_help()
|
||||
sys.exit(0)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
input_dir = args.input_dir or os.environ.get("PROJECT_INPUT", "./input")
|
||||
output_dir = args.output_dir or os.environ.get("PROJECT_WORK", "./work")
|
||||
|
||||
# Hole den Namen des Input-Ordners (ohne Pfad)
|
||||
input_basename = os.path.basename(os.path.normpath(input_dir))
|
||||
output_filename = input_basename + ".json"
|
||||
|
||||
# Pfad zur Zieldatei
|
||||
json_output_path = os.path.join(output_dir, output_filename)
|
||||
|
||||
print(f"Input directory: {input_dir}")
|
||||
print(f"Output JSON will be saved to: {json_output_path}\n")
|
||||
|
||||
if not os.path.exists(input_dir):
|
||||
print(f"Input folder not found: {input_dir}")
|
||||
sys.exit(1)
|
||||
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
data = extract_all(input_dir)
|
||||
|
||||
with open(json_output_path, "w", encoding="utf-8") as f:
|
||||
json.dump(data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print("\nDone! Data saved to:", json_output_path)
|
||||
@@ -0,0 +1 @@
|
||||
pywin32
|
||||
@@ -0,0 +1,108 @@
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
import win32com.client
|
||||
import pythoncom
|
||||
|
||||
def export_assemblies_to_stl(input_dir, output_dir, filter_name=None, minimized=False):
|
||||
pythoncom.CoInitialize()
|
||||
|
||||
try:
|
||||
# Solid Edge starten oder verbinden
|
||||
se_app = win32com.client.Dispatch("SolidEdge.Application")
|
||||
se_app.Visible = True
|
||||
se_app.WindowState = 2 if minimized else 1
|
||||
|
||||
documents = se_app.Documents
|
||||
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
for filename in os.listdir(input_dir):
|
||||
if filename.lower().endswith(".asm"):
|
||||
if filter_name and filter_name.lower() not in filename.lower():
|
||||
continue
|
||||
asm_path = os.path.join(input_dir, filename)
|
||||
stl_filename = os.path.splitext(filename)[0] + ".stl"
|
||||
stl_path = os.path.join(output_dir, stl_filename)
|
||||
|
||||
print(f"Processing: {asm_path}")
|
||||
|
||||
try:
|
||||
# Baugruppe öffnen
|
||||
doc = documents.Open(asm_path)
|
||||
# STL exportieren in den Unterordner
|
||||
doc.SaveAs(stl_path)
|
||||
print(f"-> Exported to: {stl_path}")
|
||||
except Exception as e:
|
||||
print(f"Error processing {filename}: {e}")
|
||||
finally:
|
||||
# Datei schließen
|
||||
doc.Close(False)
|
||||
|
||||
# --- Aufräumen: .cfg und .log im Hauptordner ---
|
||||
print("")
|
||||
for file in os.listdir(input_dir):
|
||||
if file.lower().endswith((".cfg", ".log")):
|
||||
file_path = os.path.join(input_dir, file)
|
||||
try:
|
||||
os.remove(file_path)
|
||||
print(f"Deleted (input): {file}")
|
||||
except Exception as e:
|
||||
print(f"Error deleting {file}: {e}")
|
||||
|
||||
# --- Aufräumen: .log im STL-Unterordner ---
|
||||
for file in os.listdir(output_dir):
|
||||
if file.lower().endswith(".log"):
|
||||
file_path = os.path.join(output_dir, file)
|
||||
try:
|
||||
os.remove(file_path)
|
||||
print(f"Deleted (output): {file}")
|
||||
except Exception as e:
|
||||
print(f"Error deleting {file}: {e}")
|
||||
|
||||
print("\nExport and cleanup completed.")
|
||||
finally:
|
||||
try:
|
||||
if 'doc' in locals():
|
||||
doc.Close(False)
|
||||
except:
|
||||
pass
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Exportiert alle .asm-Dateien in einem Ordner nach STL.")
|
||||
parser.add_argument("--in", dest="input_dir", required=False, help="Ordner mit .asm-Dateien (Standard: WORK oder ../work)")
|
||||
parser.add_argument("--out", dest="output_dir", required=False, help="Zielordner für STL-Dateien (Standard: work/STL_Export)")
|
||||
parser.add_argument("--filter", dest="filter_name", required=False, help="Nur Dateien verarbeiten, deren Name diesen String enthält")
|
||||
parser.add_argument("--se-minimized", dest="minimized", action="store_true", default=False, help="Solid Edge minimiert starten")
|
||||
|
||||
if len(sys.argv) == 2 and sys.argv[1] in ("-h", "--help"):
|
||||
parser.print_help()
|
||||
sys.exit(0)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
work_dir = os.environ.get("PROJECT_WORK", "../work")
|
||||
|
||||
if args.input_dir:
|
||||
input_dir = args.input_dir
|
||||
print("Using provided input directory.\n")
|
||||
else:
|
||||
input_dir = os.environ.get("PROJECT_WORK", "../work")
|
||||
print("No input directory provided. Using 'work' directory as input.\n")
|
||||
|
||||
if args.output_dir:
|
||||
output_dir = args.output_dir
|
||||
print(f"Saving exported STL files to provided output directory.\n")
|
||||
else:
|
||||
output_dir = os.path.join(work_dir, "STL_Export")
|
||||
print(f"No output directory provided. Exporting STL files to 'work'.\n")
|
||||
|
||||
|
||||
if not os.path.exists(input_dir):
|
||||
print(f"Input folder not found: {input_dir}")
|
||||
sys.exit(1)
|
||||
|
||||
if args.filter_name:
|
||||
print(f"Filtering files containing: '{args.filter_name}'\n")
|
||||
|
||||
export_assemblies_to_stl(input_dir, output_dir, args.filter_name, args.minimized)
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user