Compare commits
859 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 22c6303167 | |||
| a8cc4cebc7 | |||
| 678ba417d2 | |||
| bc9fbe3cf7 | |||
| b09f085f07 | |||
| 539ae1fc78 | |||
| cc47dfaac6 | |||
| 691235a7ac | |||
| deff607bcb | |||
| cfb8aba55f | |||
| 4bcc0d83a9 | |||
| 605d6faf42 | |||
| 28c5f1276a | |||
| e80fe30acb | |||
| 034e1dcef8 | |||
| dd34625acb | |||
| 3090b5f5bb | |||
| 7c609c93ae | |||
| 36a6572483 | |||
| ce04d2fd55 | |||
| 4dbe4dd9a0 | |||
| 6f72402b76 | |||
| a7b3ae8780 | |||
| 5da534aeb7 | |||
| 93ede98135 | |||
| 03cffcdf4c | |||
| c533d0922a | |||
| c24fb7eaa0 | |||
| 0b246cf95c | |||
| 003e310089 | |||
| 5917530761 | |||
| 349009314b | |||
| 659a29a294 | |||
| 1ffeddbc2c | |||
| 9d9a27d9cb | |||
| b2a885c193 | |||
| 60c1811fa6 | |||
| 5365809172 | |||
| 3876f7d220 | |||
| d4ee1f2a55 | |||
| 4f960cc670 | |||
| 1f63c1f8b3 | |||
| 2ed9ffbca7 | |||
| d87b862e2b | |||
| 3ad3ad2f01 | |||
| 6db7e46401 | |||
| 13fc24c7c7 | |||
| cf86158b83 | |||
| 25eb955636 | |||
| 7862a858ae | |||
| bc18d3b494 | |||
| fd34f22028 | |||
| 958c9e5e94 | |||
| 7c7260c603 | |||
| bae9e3e0f1 | |||
| 26b0394613 | |||
| 689ef0bcbe | |||
| 461585b782 | |||
| ea33f35a7d | |||
| 7427f1a2f3 | |||
| b7984bf97e | |||
| 9b24a45b6e | |||
| 4ace81a422 | |||
| a60790c92c | |||
| fd0d00cac3 | |||
| 498396e611 | |||
| 5444377398 | |||
| 9d981f9800 | |||
| 14e17fb67d | |||
| 0ffa7685fd | |||
| dc7d4671e4 | |||
| 10cb5cd66f | |||
| cb15d9f77a | |||
| da74faef9b | |||
| 4368833c7e | |||
| a20df41316 | |||
| ccf48dbad1 | |||
| 6700aa27bc | |||
| df525eab63 | |||
| 275901626f | |||
| fac0dc31b2 | |||
| 8696eca1f0 | |||
| d647c71cf5 | |||
| 9b218dd808 | |||
| 9f39dc521d | |||
| 112093f914 | |||
| d174597770 | |||
| d9289787b7 | |||
| 77c1c3b511 | |||
| 5a1c542832 | |||
| 091d7cc897 | |||
| 21f4fb52a8 | |||
| 656ed709f3 | |||
| 868ca8db66 | |||
| a9360e5fac | |||
| 3414599f72 | |||
| 84e92aa8a8 | |||
| edd842763f | |||
| 867ee0f928 | |||
| 29ee648d7f | |||
| 5b9c610856 | |||
| 769ddf6407 | |||
| dd7205f855 | |||
| 30ee410309 | |||
| 2d0b1a3a24 | |||
| 2cdf036172 | |||
| c14aa28e76 | |||
| 0e7d2554f8 | |||
| cdfc618bab | |||
| 1005edb609 | |||
| 3b4da8de52 | |||
| 58c6370cda | |||
| 0e72adba36 | |||
| d5084dc334 | |||
| 0aeecfd00a | |||
| 9ceb5621bc | |||
| 94c1d4921e | |||
| a4ff20106c | |||
| 289e25be6c | |||
| edebc8e98f | |||
| 8c21e2362b | |||
| 5d40645aef | |||
| b5ad4ac32f | |||
| 2a2801eced | |||
| 6289565f66 | |||
| 8ed6eebc2c | |||
| 58afaecce2 | |||
| 93c6df41fd | |||
| f3bcb55d8a | |||
| 0f32cb3c6d | |||
| f948417e31 | |||
| 2ddd96ebea | |||
| 06fd46a7e3 | |||
| 333ef4bb71 | |||
| 2c13c4ff79 | |||
| 4bf7fc9ce1 | |||
| 7e0014bdcc | |||
| b695a95032 | |||
| fa1a6d0ac2 | |||
| a42c8bd825 | |||
| 9ef3768845 | |||
| 94f04c9aeb | |||
| 0dcd9b2626 | |||
| 475a76f765 | |||
| b79c547027 | |||
| f09e60fe02 | |||
| b708d2d265 | |||
| 66302f5ab3 | |||
| 7f343596fc | |||
| 3f74a7aa3e | |||
| d63b6604fc | |||
| 66c73e17bf | |||
| f03c4c00a3 | |||
| 607c5dc58d | |||
| dc94724800 | |||
| 62835613e6 | |||
| 6f88da92bb | |||
| 083548b33c | |||
| 20bc675ad2 | |||
| fe3d4e5544 | |||
| ff5cdf47df | |||
| c04cdacef9 | |||
| ee32f320ee | |||
| 57ede4cabd | |||
| dc575a9f78 | |||
| 41e1faf655 | |||
| e4b26c92fd | |||
| 12ea8a4597 | |||
| 0023ab1622 | |||
| c5a6208f7e | |||
| 35a185c65f | |||
| 1796cacee6 | |||
| 9f99cb593f | |||
| df4c065dfe | |||
| edb022f7c5 | |||
| 27a7d72de3 | |||
| 678f113d05 | |||
| 92da66bbbb | |||
| 79a5228899 | |||
| 4d9411de42 | |||
| 3780747992 | |||
| 4514b1b831 | |||
| 2bbbbf6204 | |||
| e1b5dea3f7 | |||
| 2d2c274030 | |||
| 81dd72a281 | |||
| b82349478c | |||
| 7d0690f7a0 | |||
| 62a0cb895d | |||
| f28ce73d33 | |||
| 15425c5328 | |||
| 7c645e3c51 | |||
| 795d068175 | |||
| 90c2bd2873 | |||
| bd7a3c7c43 | |||
| ea976309bc | |||
| 1b5787274a | |||
| 7e595deabc | |||
| 66091b2b73 | |||
| 4f8d8d4f07 | |||
| 4fba12f966 | |||
| 348975c33d | |||
| cd6888868e | |||
| f2d4e64005 | |||
| a92b88f6d3 | |||
| abfdbdeffa | |||
| efe66e7e98 | |||
| c3fa1bb0dc | |||
| e487981e5b | |||
| 9a6dda629b | |||
| 46e7d6e432 | |||
| b9f4845fa7 | |||
| 36863efc5a | |||
| a0ce883a3f | |||
| bc0fe17d08 | |||
| 2e52409db6 | |||
| f434cde7b3 | |||
| 3e596cac29 | |||
| 876d5c1bfe | |||
| 3424de9130 | |||
| 279e900105 | |||
| ac7398be49 | |||
| 0bfeef637b | |||
| 0b5984b410 | |||
| ad1b6fd74c | |||
| f1f17eea3d | |||
| 642607acad | |||
| 7f3b23e71e | |||
| d2ed8d3ea9 | |||
| 1d8f9dd97f | |||
| a7c82c4958 | |||
| 81555d1657 | |||
| 9b0a6c3202 | |||
| 2aee54e8c7 | |||
| e3248efeb4 | |||
| 35bbf2d6c9 | |||
| 4129b1a579 | |||
| ef90a94c34 | |||
| 71df86750c | |||
| 7f2649a5dd | |||
| de662e4a2b | |||
| 2cb7211734 | |||
| 82c84bee97 | |||
| 3e6ceb3546 | |||
| 2d13849b2c | |||
| 952d95851a | |||
| 84fc2801ef | |||
| 07f272f453 | |||
| 8085065027 | |||
| 31e26ca9d0 | |||
| 088cbb3b97 | |||
| 57fd7de027 | |||
| 85fc828036 | |||
| c288ea0088 | |||
| 81924e2027 | |||
| c9b637b92e | |||
| 4779d406b8 | |||
| a945e35a2a | |||
| 509d3275af | |||
| c562190973 | |||
| e7ee172f90 | |||
| d49b1eea33 | |||
| d8afd74171 | |||
| b88f50ced6 | |||
| e130045930 | |||
| ae72cc3adb | |||
| 816539ce18 | |||
| c6cdb0d893 | |||
| dd026e24a3 | |||
| 76015ed30c | |||
| b9fbf60df5 | |||
| 50d69a0f0e | |||
| 2f8477e072 | |||
| 973a91ac5a | |||
| 60a39b775c | |||
| f84b5e7c90 | |||
| 5e93f23d06 | |||
| 471613a77f | |||
| 778ddf4b47 | |||
| 180c1d8345 | |||
| ae847d8625 | |||
| a4ba43a632 | |||
| b7d23aea8d | |||
| bb8634f650 | |||
| 34c56e7c41 | |||
| a92986c1ce | |||
| 831e5c0a82 | |||
| 2adfee6f49 | |||
| 4bb67318a8 | |||
| dadf07a3c3 | |||
| 7f6c8bb1a3 | |||
| eb8db87d9f | |||
| bf91a8d6a3 | |||
| bce949951c | |||
| 744b185cfe | |||
| 8919ba2491 | |||
| fc82dda558 | |||
| d70fe9df73 | |||
| d2c78695fe | |||
| 4aa087e38d | |||
| a3cbb1bcb6 | |||
| 60823dda97 | |||
| 40650bfed2 | |||
| b0423af14b | |||
| 636af5c7c2 | |||
| efc532fce0 | |||
| 4bf54550aa | |||
| 43773c63eb | |||
| d34d615c3b | |||
| 9be0cd8c6e | |||
| a7e323b026 | |||
| 42529443bd | |||
| 16b1f8317c | |||
| abe0105095 | |||
| 1b2b3e6718 | |||
| cb2916ae39 | |||
| 993555b72c | |||
| ddac586795 | |||
| f92c01e34c | |||
| 69e63cc815 | |||
| 81ad00c4d6 | |||
| ca498889dc | |||
| 6ad3606091 | |||
| aae52bdddd | |||
| 5e6d1ce5bc | |||
| 9fe28fccd2 | |||
| e7e148497d | |||
| 2d2fd086d5 | |||
| 067c1440d1 | |||
| 70e189fa1f | |||
| d91b24d645 | |||
| 538abbcb3c | |||
| 6a99a38b2a | |||
| afbeeef32f | |||
| 315db9e19c | |||
| 183e150466 | |||
| 39735ca0cb | |||
| 9d6d56ca2a | |||
| 22c6b23d7a | |||
| 21b70ec241 | |||
| 72cfc8289a | |||
| 75117aa8d3 | |||
| 0361e5ea10 | |||
| cfac52801f | |||
| 39a6fb3c50 | |||
| 6a39635162 | |||
| c671b151b4 | |||
| 44d2419042 | |||
| 3cb50a7187 | |||
| 600c361d9a | |||
| 90d83eee41 | |||
| e8cff89433 | |||
| 2a4647a1b7 | |||
| bf97d8c029 | |||
| 8f51f4832d | |||
| c496bbe817 | |||
| 6584163911 | |||
| b670510da4 | |||
| 73927de454 | |||
| a65cf42ccf | |||
| 679f5bafb7 | |||
| 1f35ee0101 | |||
| 63c99d3086 | |||
| 7a0acd6c07 | |||
| 6853fa79e8 | |||
| 94c04f67b0 | |||
| f15612034e | |||
| 7c5a3cba60 | |||
| 0cec4095e2 | |||
| 46ab7d6110 | |||
| afcc5c91db | |||
| 65cf7a762a | |||
| 658e3d5c25 | |||
| 0e5ee6632f | |||
| 193a7375ae | |||
| 46cd0f8f15 | |||
| 169cfd6123 | |||
| 389395c5b5 | |||
| a24e9f575b | |||
| 2f8bda5484 | |||
| ead151bec0 | |||
| 83b7280758 | |||
| 98c4c33acc | |||
| 30cbd1dead | |||
| 789962f50c | |||
| 30ea9858c6 | |||
| 6ff458a0b6 | |||
| ceb02df1b4 | |||
| ce3e6ef5fa | |||
| 53e6a84f7f | |||
| 602889d1e3 | |||
| ec22e6ca39 | |||
| 532b5157d0 | |||
| 74cd1b3e2c | |||
| bd3e20a082 | |||
| f319e0dc1d | |||
| bdd1e61b6d | |||
| c8ceeab2d9 | |||
| 81f2ed0a75 | |||
| 2232227a8b | |||
| 871359738c | |||
| ea2cb90b2e | |||
| 248c96d9c2 | |||
| a71a9ef32c | |||
| ed7b6abe72 | |||
| c7e439b9a4 | |||
| 817a8c0910 | |||
| 6f5456e082 | |||
| 46a5243b2b | |||
| f35ddfa7af | |||
| 5a43e8c165 | |||
| 0b136663e4 | |||
| 47ac752065 | |||
| 84f6f3fbe6 | |||
| 05c84c92f2 | |||
| ac85dc652d | |||
| b6f18b72fa | |||
| 5080d2878c | |||
| 485325c800 | |||
| a62600f342 | |||
| 21174c809f | |||
| 68a0ed3334 | |||
| bee0030e42 | |||
| 85abaafba3 | |||
| 4e85a6cccc | |||
| 8c4bc75a69 | |||
| 44920f7727 | |||
| 87b81c4201 | |||
| 882c938729 | |||
| b42aa1d7fb | |||
| bed7376982 | |||
| 3b6623e51a | |||
| e55b936863 | |||
| 3b4cdc8897 | |||
| 8bedc9dd97 | |||
| eaa783cc1f | |||
| 8c2ded58b2 | |||
| c384c0fa15 | |||
| cfcf68daa8 | |||
| 1116f8d16d | |||
| 84a445eba8 | |||
| da13a90a4e | |||
| d0ab0494d9 | |||
| b0f6f86c53 | |||
| 71eeb1bcef | |||
| d31a48c27a | |||
| 2d06bdf0ce | |||
| 414702bba1 | |||
| 512ab1104e | |||
| f1e0ca8631 | |||
| b509948061 | |||
| ea9c5ad1c5 | |||
| 62b6e873c4 | |||
| bdd7ad96b8 | |||
| 8ce4573169 | |||
| 0d2201328b | |||
| a7101a5227 | |||
| 87dc15a3f3 | |||
| 830ec5dd80 | |||
| 288f344036 | |||
| 88969d2cc6 | |||
| 29952926ad | |||
| 92ba334728 | |||
| 9cb6aa8cdc | |||
| 0f3103c779 | |||
| 7c7692b472 | |||
| d49a673722 | |||
| eeb7ab6810 | |||
| 932ca98666 | |||
| 0a828d6a89 | |||
| e843f3570d | |||
| d87adfdcee | |||
| b86a5d8902 | |||
| c14997e70f | |||
| e65bf42dda | |||
| 938c1c7371 | |||
| ecabf4ba92 | |||
| 0483815f7e | |||
| c958157f17 | |||
| e3656394d0 | |||
| b6b3e4514f | |||
| cd29d08f0b | |||
| d15d170b7c | |||
| 4e5a415ae6 | |||
| 2b63125018 | |||
| 3e3246d1af | |||
| a51e20ae39 | |||
| d449938b7f | |||
| e98f3364aa | |||
| 5063d26f86 | |||
| f225e53806 | |||
| 25d2a2b02e | |||
| 1231b62ea7 | |||
| 1852838897 | |||
| 655f922e38 | |||
| 4c89b86f2a | |||
| c48e3bee36 | |||
| 5f08a784ff | |||
| 3c831646b1 | |||
| e80d67c0b5 | |||
| 27a1d50a78 | |||
| 9e28c95a3c | |||
| b1973b561f | |||
| 5e61a35c53 | |||
| bfe390ef80 | |||
| 43685aff56 | |||
| bf2168b149 | |||
| ed45b876c1 | |||
| c1d29f3269 | |||
| 4a8bde2ed6 | |||
| a405d2fb2e | |||
| 3430fde41b | |||
| f70b2a77d5 | |||
| dfaf374847 | |||
| d270be3ef9 | |||
| d75c4d1f66 | |||
| fa904f5302 | |||
| 4dd0280534 | |||
| 9f04750c26 | |||
| d3ad8e828c | |||
| b9f474decf | |||
| 4d31a91a6a | |||
| 891e032f8e | |||
| 8b7c127e93 | |||
| 48c94db489 | |||
| 74982e025b | |||
| 7047be0aff | |||
| afab68c27f | |||
| 1323c336c7 | |||
| c5ff149bb6 | |||
| 8bcc70cced | |||
| de9b56bf18 | |||
| c10c03637a | |||
| c4f734329a | |||
| 2f8f0d0f6f | |||
| c60e8d6feb | |||
| 2ae80cc7ba | |||
| 67a8592a8a | |||
| 91579a69f0 | |||
| b5e697ad0e | |||
| 6f11d50445 | |||
| 2590d96178 | |||
| 5a9e202899 | |||
| bfd741e707 | |||
| a9206fbb81 | |||
| 52edfd3b85 | |||
| 0b9c170fc7 | |||
| dfbfc1c722 | |||
| 344b8b2dde | |||
| 6652f7534c | |||
| 7b092ec5e4 | |||
| 175454bda2 | |||
| cb94ea011a | |||
| 998cb452f9 | |||
| 828e9b7ba1 | |||
| 33bba6ebd0 | |||
| 99fb2cc072 | |||
| eaa62804da | |||
| 0c7abc9263 | |||
| e54a816a0d | |||
| 00d59913c2 | |||
| 373b0e5397 | |||
| e9ebe65775 | |||
| 249fc40105 | |||
| a81261a0e3 | |||
| 6e4894d3bc | |||
| e4f1ef8564 | |||
| 2cd7f4f905 | |||
| 865bda4de6 | |||
| 33b53abc73 | |||
| c6d06fbda1 | |||
| 207630c330 | |||
| 6337a9e220 | |||
| b3e0af9b22 | |||
| 65f97b4f4a | |||
| 0498794fa1 | |||
| 16e5ca691a | |||
| cf570342d2 | |||
| 33e4008e4b | |||
| bcefe3b4c4 | |||
| dd770e61ee | |||
| eb752fe381 | |||
| 4bdb107954 | |||
| 64d1091b79 | |||
| a411aaa3f0 | |||
| 13f3bb8ae5 | |||
| d31cb47a85 | |||
| 640cc92641 | |||
| ef9c23f7de | |||
| 04bd151da3 | |||
| 378438f1bc | |||
| b485a4ff6f | |||
| 5697afc292 | |||
| 03c1d4ed32 | |||
| 07a681eda7 | |||
| b17f4b02aa | |||
| 03a780ffd5 | |||
| b1240cfbe8 | |||
| fed185fbed | |||
| 4ec45d3cd5 | |||
| 939c710bf2 | |||
| ac1345bbaf | |||
| 95a7bdb81f | |||
| b1a5824bcd | |||
| 09f9b1ee51 | |||
| 11212c946a | |||
| 2eee9561b4 | |||
| b221a69f76 | |||
| 6b0ed5c075 | |||
| 1a687fb188 | |||
| 30e050fff2 | |||
| 30ab3b108e | |||
| da31864192 | |||
| f6239d279f | |||
| 1f3ac7a5ad | |||
| 7aff696bae | |||
| 371722f28c | |||
| d25c40bcd6 | |||
| 913acc7707 | |||
| 1d83c98077 | |||
| 2c2a7929bf | |||
| 5335329719 | |||
| cc010c8cc8 | |||
| 80b136b934 | |||
| e8f61f8dbf | |||
| bf2099f8a6 | |||
| f7f31263a6 | |||
| 33e515efb6 | |||
| b8f65d4ade | |||
| 4a5c91231d | |||
| 97a8df93d9 | |||
| 96b2eb1832 | |||
| b972a2f8bd | |||
| c504848e0b | |||
| 7d88e39272 | |||
| 82adf0e20e | |||
| 66de3f978a | |||
| 0106befa7d | |||
| ef87d5838b | |||
| 295162127a | |||
| 6d336fbac4 | |||
| 6b2078fadb | |||
| bfd465449a | |||
| a9a4893bdb | |||
| 21066eebbb | |||
| 9d5ff85cff | |||
| 64befa758d | |||
| d9a0cbb4bf | |||
| 50807b1e88 | |||
| 7780071073 | |||
| be63b4ab55 | |||
| 63c5bb26cb | |||
| f7a1d98d8a | |||
| a14de5bdde | |||
| 9031950868 | |||
| a89407ae3c | |||
| 4cef9efd51 | |||
| a40e9495e5 | |||
| a3285a4f67 | |||
| afd59df48a | |||
| ae4b1b0ab5 | |||
| ed9d81d206 | |||
| a2fc846613 | |||
| 184953f5f0 | |||
| d71b36c2f7 | |||
| f152cff619 | |||
| 4aed602089 | |||
| 63c4d31467 | |||
| b807be35ff | |||
| 32ea041c5e | |||
| 950c8373d9 | |||
| 9d5faa92e8 | |||
| fd88fc2eeb | |||
| 9d2ae1ca55 | |||
| 670a562d48 | |||
| e6d983302c | |||
| fe5b77e766 | |||
| 663fe445bf | |||
| 74d2d2860c | |||
| 2e405b2f28 | |||
| 331c631b35 | |||
| ddd6039722 | |||
| 835e3ba005 | |||
| af548ba626 | |||
| 3ff40757e0 | |||
| a8571fdd61 | |||
| f8a6d27c6d | |||
| 4e1604f77e | |||
| 00af4ad338 | |||
| 7fed9e03e9 | |||
| e9c2c85a7f | |||
| 82c7877425 | |||
| 2338be46c2 | |||
| 8f72eb35d3 | |||
| a3f7069c37 | |||
| 3842e109b6 | |||
| 4ae2106608 | |||
| 3656587081 | |||
| b315cebf3a | |||
| fb18466aba | |||
| b721c2fb31 | |||
| 76aa953210 | |||
| 52d15dc827 | |||
| dbbc4f7fcd | |||
| 85b4a88407 | |||
| 65a2e674bb | |||
| 9a84e4469e | |||
| b8a49d5fed | |||
| 12dcf471d3 | |||
| 42e45affbd | |||
| fcce4e3f63 | |||
| 370c5b2064 | |||
| 39dfb0f426 | |||
| 1c62fbbe99 | |||
| 6f03aa8678 | |||
| f882b0f5bd | |||
| 4ffe9fe4b0 | |||
| d50b095683 | |||
| daebbbef1c | |||
| b43631e46b | |||
| ea9768b1f2 | |||
| 2756555eb9 | |||
| 1f1422900e | |||
| 45a76eada4 | |||
| 0e65b6aa57 | |||
| 5c2c0ff303 | |||
| a6fd4547ea | |||
| 0d27eadfeb | |||
| 0b26e021cd | |||
| a0d5e3b2d4 | |||
| 1ebc32f07e | |||
| a3b1cd52ad | |||
| c7cfb8c6c7 | |||
| 93246157c7 | |||
| 18499bdc69 | |||
| feaae9e5ee | |||
| 4ee48bdfae | |||
| 1c11e4a6c5 | |||
| 413c1ad562 | |||
| d9adca0154 | |||
| 74870a6a8e | |||
| cba391081c | |||
| ccc3187e78 | |||
| 1e8ad93dbe | |||
| a2b01c0bbb | |||
| a70a894089 | |||
| 65baf4221d | |||
| 2a4b5f7218 | |||
| cfa723d164 | |||
| 143da829d8 | |||
| a8a98fe824 | |||
| efadfdc479 | |||
| f7ee2555f4 | |||
| 286a1c070c | |||
| 4af90950ff | |||
| a23f9c1ffa | |||
| 64dfa44692 | |||
| 573c63fa62 | |||
| 52aeb36f19 | |||
| 593f95daf6 | |||
| e5e02bdab1 | |||
| e9f3701a86 | |||
| 3a7baf0659 | |||
| 24bff4b1ce | |||
| 184c53c3a2 | |||
| 16ce6ac09f | |||
| f379996f31 | |||
| 48e66f9084 | |||
| f2249356d8 | |||
| f4765b9e82 | |||
| e4a29085f3 | |||
| 462d01a3b2 | |||
| 8ca43a1ad5 | |||
| bb252a5115 | |||
| 4d7225fab4 | |||
| 9219cdfc53 | |||
| 03f0b1fc56 | |||
| 9e18134c5e | |||
| 67c7ddbf0a | |||
| 79a6062923 | |||
| 81c3c420a7 | |||
| 315a0cbf5e | |||
| d753ea47e2 | |||
| da5caa8319 | |||
| ca7714a8a3 | |||
| 4b5f3981d3 | |||
| 7eb1de4709 | |||
| e52df074a1 | |||
| 9846817c7f | |||
| c9ca1c0a25 | |||
| fd2dd9a165 | |||
| 83efebfed9 | |||
| 00669ea3c5 | |||
| f02bf2630a | |||
| db4d2f7eb0 | |||
| b9d2f376d6 | |||
| 49baeae780 | |||
| d76865e621 | |||
| bedf363810 | |||
| 48670c4030 | |||
| ba0cdd307f | |||
| 2a508e6302 | |||
| 9d70579c40 | |||
| e4ac573631 | |||
| 11327cf544 | |||
| 029e10b661 | |||
| c1c8b645e0 | |||
| 49ef7d1353 | |||
| 745886e9dd | |||
| 825945a547 | |||
| e9556170f5 | |||
| 87ffe5b5f8 | |||
| 9466d8b883 | |||
| 25e37e257e | |||
| 165c0c9f0d | |||
| 98cfebf5bc | |||
| 1d910bfc45 | |||
| 94104c2365 | |||
| c5d37a1250 | |||
| 5812e1c976 | |||
| 01bc8bf929 | |||
| dbefb1b290 | |||
| b5b9d061ef | |||
| 20e08bba76 | |||
| 23710ee3fb | |||
| 9b5cc21aa4 | |||
| 1016c9b82b | |||
| c6b9651d08 | |||
| 73302f101a | |||
| 516b4d785f | |||
| a9850c2eec | |||
| 64c5503637 | |||
| d15ea4310a | |||
| 9fa3ef83e5 | |||
| 724e8fe029 | |||
| 3ea5677497 | |||
| a1e3e509fd | |||
| 95b3731df2 | |||
| dcc29f3461 | |||
| 13740de72f | |||
| f2f11c3f2b | |||
| 42c3ca1ec3 | |||
| 44105d7d75 | |||
| 2aad40bd0a | |||
| d0058d7ee5 | |||
| 38c9077831 | |||
| 904e7ece88 | |||
| 267799d916 | |||
| 2eb872b5e5 | |||
| ce9a2c8807 | |||
| 729d1a4698 | |||
| 4f74328ffc | |||
| 54370f3188 | |||
| 4a51eae628 | |||
| 34241385f9 | |||
| 7ec01ed39f | |||
| 1ff861f9db | |||
| 4c125afd7b | |||
| e561980e7f |
@@ -9,10 +9,10 @@
|
|||||||
],
|
],
|
||||||
"rollForward": false
|
"rollForward": false
|
||||||
},
|
},
|
||||||
"gitversion.tool": {
|
"dotnet-affected": {
|
||||||
"version": "6.0.2",
|
"version": "5.0.0",
|
||||||
"commands": [
|
"commands": [
|
||||||
"dotnet-gitversion"
|
"dotnet-affected"
|
||||||
],
|
],
|
||||||
"rollForward": false
|
"rollForward": false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -254,6 +254,9 @@ dotnet_diagnostic.ca1508.severity = warning # Avoid dead conditional code
|
|||||||
dotnet_diagnostic.ca1509.severity = warning # Invalid entry in code metrics configuration file
|
dotnet_diagnostic.ca1509.severity = warning # Invalid entry in code metrics configuration file
|
||||||
dotnet_diagnostic.ca1861.severity = none # Prefer 'static readonly' fields over constant array arguments if the called method is called repeatedly and is not mutating the passed array (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1861)
|
dotnet_diagnostic.ca1861.severity = none # Prefer 'static readonly' fields over constant array arguments if the called method is called repeatedly and is not mutating the passed array (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1861)
|
||||||
|
|
||||||
|
# CA2007: Consider calling ConfigureAwait on the awaited task (this is not needed for application code, in fact we don't want to call anything but ConfigureAwait(true) which is the default)
|
||||||
|
dotnet_diagnostic.CA2007.severity = none
|
||||||
|
|
||||||
dotnet_diagnostic.cs8618.severity = suggestion # nullable problem
|
dotnet_diagnostic.cs8618.severity = suggestion # nullable problem
|
||||||
|
|
||||||
|
|
||||||
@@ -311,6 +314,9 @@ dotnet_diagnostic.NUnit2037.severity = warning # Consider using Assert.That(coll
|
|||||||
dotnet_diagnostic.NUnit2038.severity = warning # Consider using Assert.That(actual, Is.InstanceOf(expected)) instead of Assert.IsInstanceOf(expected, actual)
|
dotnet_diagnostic.NUnit2038.severity = warning # Consider using Assert.That(actual, Is.InstanceOf(expected)) instead of Assert.IsInstanceOf(expected, actual)
|
||||||
dotnet_diagnostic.NUnit2039.severity = warning # Consider using Assert.That(actual, Is.Not.InstanceOf(expected)) instead of Assert.IsNotInstanceOf(expected, actual)
|
dotnet_diagnostic.NUnit2039.severity = warning # Consider using Assert.That(actual, Is.Not.InstanceOf(expected)) instead of Assert.IsNotInstanceOf(expected, actual)
|
||||||
|
|
||||||
|
# note: added to allow the copy paste from rhino inside of the ValueSet component
|
||||||
|
dotnet_diagnostic.CA1033.severity = none
|
||||||
|
|
||||||
[*.{appxmanifest,asax,ascx,aspx,axaml,build,c,c++,cc,cginc,compute,cp,cpp,cs,cshtml,cu,cuh,cxx,dtd,fs,fsi,fsscript,fsx,fx,fxh,h,hh,hlsl,hlsli,hlslinc,hpp,hxx,inc,inl,ino,ipp,ixx,master,ml,mli,mpp,mq4,mq5,mqh,nuspec,paml,razor,resw,resx,shader,skin,tpp,usf,ush,vb,xaml,xamlx,xoml,xsd}]
|
[*.{appxmanifest,asax,ascx,aspx,axaml,build,c,c++,cc,cginc,compute,cp,cpp,cs,cshtml,cu,cuh,cxx,dtd,fs,fsi,fsscript,fsx,fx,fxh,h,hh,hlsl,hlsli,hlslinc,hpp,hxx,inc,inl,ino,ipp,ixx,master,ml,mli,mpp,mq4,mq5,mqh,nuspec,paml,razor,resw,resx,shader,skin,tpp,usf,ush,vb,xaml,xamlx,xoml,xsd}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
|
|||||||
@@ -4,33 +4,36 @@
|
|||||||
|
|
||||||
# * @specklesystems/connectors
|
# * @specklesystems/connectors
|
||||||
|
|
||||||
# Core
|
|
||||||
# Not needed, falls back on team approval
|
|
||||||
|
|
||||||
# Objects
|
|
||||||
# Converters require product owner approval, anything else falls back to team approval
|
|
||||||
|
|
||||||
Objects/ConverterAutocadCivil/* @clairekuang @connorivy
|
|
||||||
Objects/ConverterCSI/* @connorivy
|
|
||||||
Objects/ConverterDynamo/* @teocomi @alanrynne
|
|
||||||
Objects/ConverterMicrostation/* @connorivy
|
|
||||||
Objects/ConverterRevit/* @connorivy @teocomi
|
|
||||||
Objects/ConverterRhinoGh/* @alanrynne @clairekuang
|
|
||||||
Objects/ConverterTeklaStructures/* @connorivy
|
|
||||||
Objects/StructuralUtilities/PolygonMesher/* @connorivy
|
|
||||||
|
|
||||||
# Connectors
|
# Connectors
|
||||||
|
|
||||||
ConnectorAutocadCivil/* @clairekuang
|
/Connectors/ArcGIS/* @KatKatKateryna
|
||||||
ConnectorArchicad/* @jozseflkiss
|
/Connectors/Autocad/* @clairekuang @oguzhankoral @didimitrie
|
||||||
ConnectorCSI/* @connorivy
|
/Connectors/Civil3d/* @clairekuang @oguzhankoral @didimitrie
|
||||||
ConnectorDynamo/* @teocomi @alanrynne
|
/Connectors/CSi/* @bjoernsteinhagen @dogukankaratas
|
||||||
ConnectorGrasshopper/* @alanrynne @clairekuang
|
/Connectors/Navisworks/* @jsdbroughton
|
||||||
ConnectorMicrostation/* @clairekuang
|
/Connectors/Revit/* @clairekuang @oguzhankoral @didimitrie
|
||||||
ConnectorRevit/* @teocomi @connorivy
|
/Connectors/Rhino/* @clairekuang @oguzhankoral @didimitrie
|
||||||
ConnectorRhino/* @clairekuang @alanrynne
|
/Connectors/Tekla/* @bjoernsteinhagen @dogukankaratas
|
||||||
ConnectorTeklaStructures/* @connorivy
|
|
||||||
|
|
||||||
# DesktopUI
|
# Converters
|
||||||
|
/Convertors/ArcGIS/* @KatKatKateryna
|
||||||
|
/Convertors/Autocad/* @clairekuang @oguzhankoral @didimitrie
|
||||||
|
/Convertors/Civil3d/* @clairekuang @oguzhankoral @didimitrie
|
||||||
|
/Convertors/CSi/* @bjoernsteinhagen @dogukankaratas
|
||||||
|
/Convertors/Navisworks/* @jsdbroughton
|
||||||
|
/Convertors/Revit/* @clairekuang @oguzhankoral @didimitrie
|
||||||
|
/Convertors/Rhino/* @clairekuang @oguzhankoral @didimitrie
|
||||||
|
/Convertors/Tekla/* @bjoernsteinhagen @dogukankaratas
|
||||||
|
|
||||||
DesktopUI2/* @teocomi @clairekuang
|
# DUI
|
||||||
|
|
||||||
|
/DUI3/* @clairekuang @oguzhankoral @didimitrie
|
||||||
|
|
||||||
|
# Importers
|
||||||
|
/Importers/* @JR-Morgan @didimitrie @oguzhankoral @adamhathcock
|
||||||
|
|
||||||
|
# SDK
|
||||||
|
/SDK/* @JR-Morgan @clairekuang @didimitrie @oguzhankoral @adamhathcock
|
||||||
|
|
||||||
|
# Build
|
||||||
|
/Build/* @JR-Morgan @oguzhankoral @adamhathcock
|
||||||
|
|||||||
@@ -1,30 +1,46 @@
|
|||||||
<!---
|
<!---
|
||||||
|
|
||||||
Provide a short summary in the Title above. Examples of good PR titles:
|
Provide a short summary in the Title above. Use the following template:
|
||||||
|
|
||||||
* "Feature: adds metrics to component"
|
category(project): summary
|
||||||
|
|
||||||
* "Fix: resolves duplication in comment thread"
|
Categories:
|
||||||
|
|
||||||
* "Update: apollo v2.34.0"
|
* feat: (new feature for the user, not a new feature for build script)
|
||||||
|
* fix: (bug fix for the user, not a fix to a build script)
|
||||||
|
* docs: (changes to the documentation)
|
||||||
|
* style: (formatting, missing semi colons, etc; no production code change)
|
||||||
|
* refactor: (refactoring production code, eg. renaming a variable)
|
||||||
|
* test: (adding missing tests, refactoring tests; no production code change)
|
||||||
|
* chore: (updating grunt tasks etc; no production code change)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
feat(revit): added category filter to send
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## Description & motivation
|
## Description
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
|
|
||||||
Describe your changes, and why you're making them. What benefit will this have to others?
|
Describe your changes, and why you're making them.
|
||||||
|
|
||||||
Is this linked to an open Github issue, a thread in Speckle community,
|
Link related github issues here ->
|
||||||
or another pull request? Link it here.
|
Fixes #85, Fixes #22, Connects #123
|
||||||
|
|
||||||
If it is related to a Github issue, and resolves it, please link to the issue number, e.g.:
|
|
||||||
Fixes #85, Fixes #22, Fixes username/repo#123
|
|
||||||
Connects #123
|
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
## User Value
|
||||||
|
|
||||||
|
<!---
|
||||||
|
|
||||||
|
Describe in 1 sentence the user value.
|
||||||
|
|
||||||
|
This can also be a link to the relevant thread in Speckle community, or a link to the Linear issue.
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
## Changes:
|
## Changes:
|
||||||
|
|
||||||
<!---
|
<!---
|
||||||
@@ -68,35 +84,10 @@ Describe what tests have been added or amended, and why these demonstrate it wor
|
|||||||
|
|
||||||
<!---
|
<!---
|
||||||
|
|
||||||
This checklist is mostly useful as a reminder of small things that can easily be
|
This checklist is a useful reminder of related tasks to uphold our repo quality. Amend this list as needed for the pr.
|
||||||
|
|
||||||
forgotten – it is meant as a helpful tool rather than hoops to jump through.
|
|
||||||
|
|
||||||
Put an `x` between the square brackets, e.g. [x], for all the items that apply,
|
|
||||||
|
|
||||||
make notes next to any that haven't been addressed, and remove any items that are not relevant to this PR.
|
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
- [ ] My pull request follows the guidelines in the [Contributing guide](https://github.com/specklesystems/speckle-server/blob/main/CONTRIBUTING.md)?
|
|
||||||
- [ ] My pull request does not duplicate any other open [Pull Requests](../../pulls) for the same update/change?
|
|
||||||
- [ ] My commits are related to the pull request and do not amend unrelated code or documentation.
|
- [ ] My commits are related to the pull request and do not amend unrelated code or documentation.
|
||||||
- [ ] My code follows a similar style to existing code.
|
|
||||||
- [ ] I have added appropriate tests.
|
- [ ] I have added appropriate tests.
|
||||||
- [ ] I have updated or added relevant documentation.
|
- [ ] I have updated or added relevant documentation.
|
||||||
|
|
||||||
## References
|
|
||||||
|
|
||||||
<!---
|
|
||||||
|
|
||||||
(Optional -- remove this section if not needed )
|
|
||||||
|
|
||||||
Include **important** links regarding the implementation of this PR.
|
|
||||||
|
|
||||||
This usually includes a RFC or an aggregation of issues and/or individual conversations
|
|
||||||
|
|
||||||
that helped put this solution together. This helps ensure we retain and share knowledge
|
|
||||||
|
|
||||||
regarding the implementation, and may help others understand motivation and design decisions etc..
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
name: .NET Build
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request: # Run build on every pull request that is not to main
|
|
||||||
branches-ignore:
|
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: windows-latest
|
|
||||||
outputs:
|
|
||||||
version: ${{ steps.set-version.outputs.version }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Setup .NET
|
|
||||||
uses: actions/setup-dotnet@v4
|
|
||||||
with:
|
|
||||||
dotnet-version: 8.0.4xx # Align with global.json (including roll forward rules)
|
|
||||||
|
|
||||||
- name: Cache Nuget
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ~/.nuget/packages
|
|
||||||
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
|
|
||||||
|
|
||||||
- name: ⚒️ Run build
|
|
||||||
run: ./build.ps1 test
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup .NET
|
|
||||||
uses: actions/setup-dotnet@v4
|
|
||||||
with:
|
|
||||||
dotnet-version: 8.0.4xx # Align with global.json (including roll forward rules)
|
|
||||||
|
|
||||||
- name: Cache Nuget
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ~/.nuget/packages
|
|
||||||
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
|
|
||||||
|
|
||||||
- name: ⚒️ Run build
|
|
||||||
run: ./build.sh test-only
|
|
||||||
|
|
||||||
- name: Upload coverage reports to Codecov with GitHub Action
|
|
||||||
uses: codecov/codecov-action@v5
|
|
||||||
with:
|
|
||||||
file: Converters/**/coverage.xml
|
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
name: .NET Build and Publish
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: ["main", "dev", "release/*"] # Continuous delivery on every long-lived branch
|
|
||||||
tags: ["v3.*"] # Manual delivery on every 3.x tag
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: windows-latest
|
|
||||||
outputs:
|
|
||||||
version: ${{ steps.set-version.outputs.version }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Setup .NET
|
|
||||||
uses: actions/setup-dotnet@v4
|
|
||||||
with:
|
|
||||||
dotnet-version: 8.0.4xx # Align with global.json (including roll forward rules)
|
|
||||||
|
|
||||||
- name: Cache Nuget
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ~/.nuget/packages
|
|
||||||
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
|
|
||||||
|
|
||||||
- name: ⚒️ Run GitVersion
|
|
||||||
run: ./build.ps1 build-server-version
|
|
||||||
|
|
||||||
- name: ⚒️ Run build
|
|
||||||
run: ./build.ps1
|
|
||||||
|
|
||||||
- name: ⬆️ Upload artifacts
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: output-${{ env.GitVersion_FullSemVer }}
|
|
||||||
path: output/*.*
|
|
||||||
compression-level: 0 # no compression
|
|
||||||
|
|
||||||
- id: set-version
|
|
||||||
name: Set version to output
|
|
||||||
run: echo "version=${{ env.GitVersion_FullSemVer }}" >> "$Env:GITHUB_OUTPUT"
|
|
||||||
|
|
||||||
deploy-installers:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
env:
|
|
||||||
IS_TAG_BUILD: ${{ github.ref_type == 'tag' }}
|
|
||||||
IS_RELEASE_BRANCH: ${{ startsWith(github.ref_name, 'release/') || github.ref_name == 'main'}}
|
|
||||||
steps:
|
|
||||||
- name: 🔫 Trigger Build Installers
|
|
||||||
uses: ALEEF02/workflow-dispatch@v3.0.0
|
|
||||||
continue-on-error: true
|
|
||||||
with:
|
|
||||||
workflow: Build Installers
|
|
||||||
repo: specklesystems/connector-installers
|
|
||||||
token: ${{ secrets.CONNECTORS_GH_TOKEN }}
|
|
||||||
inputs: '{ "run_id": "${{ github.run_id }}", "version": "${{ needs.build.outputs.version }}", "public_release": ${{ env.IS_TAG_BUILD }}, "store_artifacts": ${{ env.IS_RELEASE_BRANCH }} }'
|
|
||||||
ref: main
|
|
||||||
wait-for-completion: true
|
|
||||||
wait-for-completion-interval: 10s
|
|
||||||
wait-for-completion-timeout: 10m
|
|
||||||
display-workflow-run-url: true
|
|
||||||
display-workflow-run-url-interval: 10s
|
|
||||||
|
|
||||||
- uses: geekyeggo/delete-artifact@v5
|
|
||||||
with:
|
|
||||||
name: output-*
|
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup .NET
|
|
||||||
uses: actions/setup-dotnet@v4
|
|
||||||
with:
|
|
||||||
dotnet-version: 8.0.4xx # Align with global.json (including roll forward rules)
|
|
||||||
|
|
||||||
- name: Cache Nuget
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ~/.nuget/packages
|
|
||||||
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
|
|
||||||
|
|
||||||
- name: ⚒️ Run build
|
|
||||||
run: ./build.sh test-only
|
|
||||||
|
|
||||||
- name: Upload coverage reports to Codecov with GitHub Action
|
|
||||||
uses: codecov/codecov-action@v5
|
|
||||||
with:
|
|
||||||
file: Converters/**/coverage.xml
|
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
name: .NET Test
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request: {}
|
||||||
|
push:
|
||||||
|
branches: ["main"]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v5
|
||||||
|
with:
|
||||||
|
dotnet-version: 8.0.4xx # Align with global.json (including roll forward rules)
|
||||||
|
|
||||||
|
- name: Cache Nuget
|
||||||
|
uses: actions/cache@v5
|
||||||
|
with:
|
||||||
|
path: ~/.nuget/packages
|
||||||
|
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
|
||||||
|
|
||||||
|
- name: ⚒️ Run Test
|
||||||
|
run: ./build.sh test-and-pack
|
||||||
|
|
||||||
|
- name: Upload coverage reports to Codecov with GitHub Action
|
||||||
|
uses: codecov/codecov-action@v5
|
||||||
|
with:
|
||||||
|
files: Converters/**/coverage.xml
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
|
||||||
|
# Disabling this code for now, since we no longer need to publish nugets from this repo
|
||||||
|
# But keeping it around incase we ever need in the future.
|
||||||
|
# Ideally, I'd also like to move the nuget token to be an environment secret, and to have tight package scopes
|
||||||
|
# - name: Push to nuget.org
|
||||||
|
# if: ${{ inputs.deployNugets }}
|
||||||
|
# run: dotnet nuget push output/*.nupkg --source "https://api.nuget.org/v3/index.json" --api-key ${{ secrets.CONNECTORS_NUGET_TOKEN }}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
name: .NET Build and Publish
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ["main", "installer-test/**"]
|
||||||
|
tags: ["v3.*.*"] # Manual delivery on every 3.x tag
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-connectors:
|
||||||
|
runs-on: windows-latest # Keeping on windows for now, for cross platform building of exe projects, we need to use dotnet publish
|
||||||
|
env:
|
||||||
|
SEMVER: "unset"
|
||||||
|
FILE_VERSION: "unset"
|
||||||
|
outputs:
|
||||||
|
semver: ${{ steps.set-version.outputs.semver }}
|
||||||
|
file_version: ${{ steps.set-version.outputs.file_version }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Setup .NET
|
||||||
|
uses: actions/setup-dotnet@v5
|
||||||
|
with:
|
||||||
|
dotnet-version: 8.0.4xx # Align with global.json (including roll forward rules)
|
||||||
|
|
||||||
|
- name: Cache Nuget
|
||||||
|
uses: actions/cache@v5
|
||||||
|
with:
|
||||||
|
path: ~/.nuget/packages
|
||||||
|
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
|
||||||
|
|
||||||
|
- name: ⚒️ Run build and zip connectors
|
||||||
|
run: ./build.ps1 zip
|
||||||
|
|
||||||
|
- name: ⬆️ Upload artifacts
|
||||||
|
uses: actions/upload-artifact@v6
|
||||||
|
with:
|
||||||
|
name: output-${{ env.SEMVER }}
|
||||||
|
path: output/*.*
|
||||||
|
if-no-files-found: error
|
||||||
|
retention-days: 1
|
||||||
|
compression-level: 0 # no compression
|
||||||
|
|
||||||
|
- id: set-version
|
||||||
|
name: Set version to output
|
||||||
|
run: |
|
||||||
|
echo "semver=${{ env.SEMVER }}" >> "$Env:GITHUB_OUTPUT"
|
||||||
|
echo "file_version=${{ env.FILE_VERSION }}" >> "$Env:GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
deploy-installers:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: build-connectors
|
||||||
|
env:
|
||||||
|
IS_PUBLIC_RELEASE: ${{ github.ref_type == 'tag' }}
|
||||||
|
steps:
|
||||||
|
- name: 🔫 Trigger Build Installers
|
||||||
|
uses: the-actions-org/workflow-dispatch@v4.0.0
|
||||||
|
with:
|
||||||
|
workflow: Build Installers
|
||||||
|
repo: specklesystems/connector-installers
|
||||||
|
token: ${{ secrets.CONNECTORS_GH_TOKEN }}
|
||||||
|
inputs: '{
|
||||||
|
"run_id": "${{ github.run_id }}",
|
||||||
|
"semver": "${{ needs.build-connectors.outputs.semver }}",
|
||||||
|
"file_version": "${{ needs.build-connectors.outputs.file_version }}",
|
||||||
|
"repo": "${{ github.repository }}",
|
||||||
|
"is_public_release": ${{ env.IS_PUBLIC_RELEASE }}
|
||||||
|
}'
|
||||||
|
ref: main
|
||||||
|
wait-for-completion: true
|
||||||
|
wait-for-completion-interval: 10s
|
||||||
|
wait-for-completion-timeout: 10m
|
||||||
|
display-workflow-run-url: true
|
||||||
|
display-workflow-run-url-interval: 10s
|
||||||
|
|
||||||
|
# Allows us to inspect the artifacts of failed builds, since this below step will be skipped if the above step fails
|
||||||
|
- uses: geekyeggo/delete-artifact@v5
|
||||||
|
with:
|
||||||
|
name: output-*
|
||||||
@@ -1,424 +0,0 @@
|
|||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio Version 17
|
|
||||||
VisualStudioVersion = 17.10.35027.167
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Config", "Config", "{85A13E25-EB29-4F31-8853-B9EE83275B3D}"
|
|
||||||
ProjectSection(SolutionItems) = preProject
|
|
||||||
.csharpierrc.yaml = .csharpierrc.yaml
|
|
||||||
.editorconfig = .editorconfig
|
|
||||||
codecov.yml = codecov.yml
|
|
||||||
Directory.Build.props = Directory.Build.props
|
|
||||||
Directory.Build.targets = Directory.Build.targets
|
|
||||||
Directory.Packages.props = Directory.Packages.props
|
|
||||||
global.json = global.json
|
|
||||||
README.md = README.md
|
|
||||||
CodeMetricsConfig.txt = CodeMetricsConfig.txt
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DUI3", "DUI3", "{FD4D6594-D81E-456F-8F2E-35B09E04A755}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Revit", "Revit", "{D92751C8-1039-4005-90B2-913E55E0B8BD}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sdk", "Sdk", "{2E00592E-558D-492D-88F9-3ECEE4C0C7DA}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Connectors.Revit2023", "Connectors\Revit\Speckle.Connectors.Revit2023\Speckle.Connectors.Revit2023.csproj", "{01F98733-7352-47AD-A594-537D979DE3DE}"
|
|
||||||
EndProject
|
|
||||||
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Speckle.Connectors.RevitShared", "Connectors\Revit\Speckle.Connectors.RevitShared\Speckle.Connectors.RevitShared.shproj", "{DC570FFF-6FE5-47BD-8BC1-B471A6067786}"
|
|
||||||
EndProject
|
|
||||||
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Speckle.Converters.RevitShared", "Converters\Revit\Speckle.Converters.RevitShared\Speckle.Converters.RevitShared.shproj", "{E1C43415-3200-45F4-8BF9-A4DD7D7F2ED6}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Revit2023.DependencyInjection", "Converters\Revit\Speckle.Converters.Revit2023.DependencyInjection\Speckle.Converters.Revit2023.DependencyInjection.csproj", "{83EAD6F0-3CB3-456A-AD81-072127D0DE0E}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Revit2023", "Converters\Revit\Speckle.Converters.Revit2023\Speckle.Converters.Revit2023.csproj", "{26391930-F86F-47E0-A5F6-B89919E38CE1}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Connectors.DUI", "DUI3\Speckle.Connectors.DUI\Speckle.Connectors.DUI.csproj", "{D81C0B87-F0C1-4297-A147-02F001FB7E1E}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Autofac", "Sdk\Speckle.Autofac\Speckle.Autofac.csproj", "{C9D4CA21-182B-4ED2-81BB-280A6FD713F6}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Connectors.Utils", "Sdk\Speckle.Connectors.Utils\Speckle.Connectors.Utils.csproj", "{7291B93C-615D-42DE-B8C1-3F9DF643E0FC}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Common", "Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj", "{8AEF06C0-CA5C-4460-BC2D-ADE5F35D0434}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Rhino", "Rhino", "{9584AEE5-CD59-46E6-93E6-2DC2B5285B75}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Connectors.Rhino7", "Connectors\Rhino\Speckle.Connectors.Rhino7\Speckle.Connectors.Rhino7.csproj", "{1E2644A9-6B31-4350-8772-CEAAD6EE0B21}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Rhino7", "Converters\Rhino\Speckle.Converters.Rhino7\Speckle.Converters.Rhino7.csproj", "{65A2F556-F14A-49F3-8A92-7F2E1E7ED3B5}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Rhino7.DependencyInjection", "Converters\Rhino\Speckle.Converters.Rhino7.DependencyInjection\Speckle.Converters.Rhino7.DependencyInjection.csproj", "{9C1ECA1D-DE98-4FB7-92D0-FC45BB308E5D}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Connectors.ArcGIS3", "Connectors\ArcGIS\Speckle.Connectors.ArcGIS3\Speckle.Connectors.ArcGIS3.csproj", "{A97F7177-86C7-4B38-A6ED-DA51BF762471}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.ArcGIS3", "Converters\ArcGIS\Speckle.Converters.ArcGIS3\Speckle.Converters.ArcGIS3.csproj", "{139F7A79-69E4-4B8A-B2A5-6A30A66C495C}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.ArcGIS3.DependencyInjection", "Converters\ArcGIS\Speckle.Converters.ArcGIS3.DependencyInjection\Speckle.Converters.ArcGIS3.DependencyInjection.csproj", "{7DFF1591-237D-499E-A767-EE37B93FB958}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ArcGIS", "ArcGIS", "{CCF48B65-33D1-4E8B-A57B-E03394730B21}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Connectors.Autocad2023", "Connectors\Autocad\Speckle.Connectors.Autocad2023\Speckle.Connectors.Autocad2023.csproj", "{89C4CBC7-1606-40DE-B6DA-FBE3AAC98395}"
|
|
||||||
EndProject
|
|
||||||
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Speckle.Connectors.AutocadShared", "Connectors\Autocad\Speckle.Connectors.AutocadShared\Speckle.Connectors.AutocadShared.shproj", "{41BC679F-887F-44CF-971D-A5502EE87DB0}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Common.DependencyInjection", "Sdk\Speckle.Converters.Common.DependencyInjection\Speckle.Converters.Common.DependencyInjection.csproj", "{11F7D41B-AFCA-4D29-BC08-285A14BF3A3B}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Autocad", "Autocad", "{804E065F-914C-414A-AF84-009312C3CFF6}"
|
|
||||||
EndProject
|
|
||||||
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Speckle.Converters.AutocadShared", "Converters\Autocad\Speckle.Converters.AutocadShared\Speckle.Converters.AutocadShared.shproj", "{9ADD1B7A-6401-4202-8613-F668E2FBC0A4}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Autocad2023", "Converters\Autocad\Speckle.Converters.Autocad2023\Speckle.Converters.Autocad2023.csproj", "{631C295A-7CCF-4B42-8686-7034E31469E7}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Autocad2023.DependencyInjection", "Converters\Autocad\Speckle.Converters.Autocad2023.DependencyInjection\Speckle.Converters.Autocad2023.DependencyInjection.csproj", "{D940853C-003A-482C-BDB0-665367F274A0}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Connectors.DUI.WebView", "DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj", "{7420652C-3046-4F38-BE64-9B9E69D76FA2}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Build", "Build\Build.csproj", "{C50AA3E3-8C31-4131-9DEC-1D8B377D5A89}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "HostApps", "HostApps", "{42826721-9A18-4762-8BA9-F1429DD5C5B1}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{59E8E8F3-4E42-4E92-83B3-B1C2AB901D18}"
|
|
||||||
ProjectSection(SolutionItems) = preProject
|
|
||||||
.github\workflows\ci.yml = .github\workflows\ci.yml
|
|
||||||
.github\workflows\main.yml = .github\workflows\main.yml
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Connectors.Civil3d2024", "Connectors\Autocad\Speckle.Connectors.Civil3d2024\Speckle.Connectors.Civil3d2024.csproj", "{CA8EAE01-AB9F-4EC1-B6F3-73721487E9E1}"
|
|
||||||
EndProject
|
|
||||||
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Speckle.Converters.Civil3dShared", "Converters\Civil3d\Speckle.Converters.Civil3dShared\Speckle.Converters.Civil3dShared.shproj", "{35175682-DA83-4C0A-A49D-B191F5885D8E}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Civil3d2024.DependencyInjection", "Converters\Civil3d\Speckle.Converters.Civil3d2024.DependencyInjection\Speckle.Converters.Civil3d2024.DependencyInjection.csproj", "{80F965C4-E2A8-4F54-985D-73D06E45F9CE}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Autocad2024", "Converters\Autocad\Speckle.Converters.Autocad2024\Speckle.Converters.Autocad2024.csproj", "{C2DE264A-AA87-4012-B954-17E3F403A237}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Autocad2024.DependencyInjection", "Converters\Autocad\Speckle.Converters.Autocad2024.DependencyInjection\Speckle.Converters.Autocad2024.DependencyInjection.csproj", "{AF507D61-6766-4C20-9F58-23DC29508219}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Civil3d2024", "Converters\Civil3d\Speckle.Converters.Civil3d2024\Speckle.Converters.Civil3d2024.csproj", "{25172C49-7AA4-4739-BB07-69785094C379}"
|
|
||||||
EndProject
|
|
||||||
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Speckle.Converters.RhinoShared", "Converters\Rhino\Speckle.Converters.RhinoShared\Speckle.Converters.RhinoShared.shproj", "{E1C43415-3200-45F4-8BF9-A4DD7D7F2ED9}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Rhino7.Tests", "Converters\Rhino\Speckle.Converters.Rhino7.Tests\Speckle.Converters.Rhino7.Tests.csproj", "{AC2DB416-F05C-4296-9040-56D6AD4FCD27}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Revit2023.Tests", "Converters\Revit\Speckle.Converters.Revit2023.Tests\Speckle.Converters.Revit2023.Tests.csproj", "{68CF9BDF-94AC-4D2D-A7BD-D1C064F97051}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Testing", "Sdk\Speckle.Testing\Speckle.Testing.csproj", "{A3869243-B462-4986-914B-94E407D8D20F}"
|
|
||||||
EndProject
|
|
||||||
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Speckle.Converters.RevitShared.DependencyInjection", "Converters\Revit\Speckle.Converters.RevitShared.DependencyInjection\Speckle.Converters.RevitShared.DependencyInjection.shproj", "{6067BA60-D279-4156-8AE1-6B44E2D19187}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Connectors.Revit2024", "Connectors\Revit\Speckle.Connectors.Revit2024\Speckle.Connectors.Revit2024.csproj", "{617BD3C7-87D9-4D28-8AC9-4910945BB9FC}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Revit2024", "Converters\Revit\Speckle.Converters.Revit2024\Speckle.Converters.Revit2024.csproj", "{67B888D9-C6C4-49F1-883C-5B964151D889}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Revit2024.DependencyInjection", "Converters\Revit\Speckle.Converters.Revit2024.DependencyInjection\Speckle.Converters.Revit2024.DependencyInjection.csproj", "{7F3055BA-70AA-424C-8748-345AF35127E9}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2023", "2023", "{E9DEBA00-50A4-485D-BA65-D8AB3E3467AB}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2024", "2024", "{57F59C0C-5687-4AF9-AE1C-1933B539F0E4}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{FC224610-32D3-454E-9BC1-1219FE8ACD5F}"
|
|
||||||
EndProject
|
|
||||||
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Speckle.Converters.RevitShared.Tests", "Converters\Revit\Speckle.Converters.RevitShared.Tests\Speckle.Converters.RevitShared.Tests.shproj", "{E1C43415-3202-45F4-8BF9-A4DD7D7F2ED6}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Revit2024.Tests", "Converters\Revit\Speckle.Converters.Revit2024.Tests\Speckle.Converters.Revit2024.Tests.csproj", "{C32274D9-1B66-4D5C-82F9-EB3F10F46752}"
|
|
||||||
EndProject
|
|
||||||
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Speckle.Connectors.RevitShared.Cef", "Connectors\Revit\Speckle.Connectors.RevitShared.Cef\Speckle.Connectors.RevitShared.Cef.shproj", "{6A40CBE4-ECAB-4CED-9917-5C64CBF75DA6}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2025", "2025", "{8AC2AD6D-6C74-4B24-8DF6-42717FC9B804}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Connectors.Revit2025", "Connectors\Revit\Speckle.Connectors.Revit2025\Speckle.Connectors.Revit2025.csproj", "{A6DE3DA0-B242-4F49-AEF0-4E26AF92D16C}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Revit2025", "Converters\Revit\Speckle.Converters.Revit2025\Speckle.Converters.Revit2025.csproj", "{4D40A101-07E6-4FF2-8934-83434932591D}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Revit2025.DependencyInjection", "Converters\Revit\Speckle.Converters.Revit2025.DependencyInjection\Speckle.Converters.Revit2025.DependencyInjection.csproj", "{20751904-0DFC-4126-BF2A-834B53841010}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Connectors.Revit2022", "Connectors\Revit\Speckle.Connectors.Revit2022\Speckle.Connectors.Revit2022.csproj", "{7F1FDCF2-0CE8-4119-B3C1-F2CC6D7E1C36}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Revit2022", "Converters\Revit\Speckle.Converters.Revit2022\Speckle.Converters.Revit2022.csproj", "{19424B55-058C-4E9C-B86F-700AEF9EAEC3}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Revit2022.DependencyInjection", "Converters\Revit\Speckle.Converters.Revit2022.DependencyInjection\Speckle.Converters.Revit2022.DependencyInjection.csproj", "{881D71A3-D276-4108-98C6-0FFD32129B9C}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2022", "2022", "{0AF38BA3-65A0-481B-8CBB-B82E406E1575}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Speckle.Connectors.DUI.Tests", "DUI3\Speckle.Connectors.DUI.Tests\Speckle.Connectors.DUI.Tests.csproj", "{EB83A3A3-F9B6-4281-8EBF-F7289FB5D885}"
|
|
||||||
EndProject
|
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speckle.Converters.Revit2022.Tests", "Converters\Revit\Speckle.Converters.Revit2022.Tests\Speckle.Converters.Revit2022.Tests.csproj", "{D8069A23-AD2E-4C9E-8574-7E8C45296A46}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2023", "2023", "{2D5AE63D-85C0-43D1-84BF-04418ED93F63}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "2024", "2024", "{2F45036E-D817-41E9-B82F-DBE013EC95D0}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Civil3d", "Civil3d", "{91D70DE1-DC8E-4AE1-B100-0671D6263FC5}"
|
|
||||||
EndProject
|
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{4721AA15-AF6E-4A62-A2C3-65564DC563E6}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{01F98733-7352-47AD-A594-537D979DE3DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{01F98733-7352-47AD-A594-537D979DE3DE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{01F98733-7352-47AD-A594-537D979DE3DE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{01F98733-7352-47AD-A594-537D979DE3DE}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{83EAD6F0-3CB3-456A-AD81-072127D0DE0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{83EAD6F0-3CB3-456A-AD81-072127D0DE0E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{83EAD6F0-3CB3-456A-AD81-072127D0DE0E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{83EAD6F0-3CB3-456A-AD81-072127D0DE0E}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{26391930-F86F-47E0-A5F6-B89919E38CE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{26391930-F86F-47E0-A5F6-B89919E38CE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{26391930-F86F-47E0-A5F6-B89919E38CE1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{26391930-F86F-47E0-A5F6-B89919E38CE1}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{D81C0B87-F0C1-4297-A147-02F001FB7E1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{D81C0B87-F0C1-4297-A147-02F001FB7E1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{D81C0B87-F0C1-4297-A147-02F001FB7E1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{D81C0B87-F0C1-4297-A147-02F001FB7E1E}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{C9D4CA21-182B-4ED2-81BB-280A6FD713F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{C9D4CA21-182B-4ED2-81BB-280A6FD713F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{C9D4CA21-182B-4ED2-81BB-280A6FD713F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{C9D4CA21-182B-4ED2-81BB-280A6FD713F6}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7291B93C-615D-42DE-B8C1-3F9DF643E0FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{7291B93C-615D-42DE-B8C1-3F9DF643E0FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{7291B93C-615D-42DE-B8C1-3F9DF643E0FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7291B93C-615D-42DE-B8C1-3F9DF643E0FC}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{8AEF06C0-CA5C-4460-BC2D-ADE5F35D0434}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{8AEF06C0-CA5C-4460-BC2D-ADE5F35D0434}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{8AEF06C0-CA5C-4460-BC2D-ADE5F35D0434}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{8AEF06C0-CA5C-4460-BC2D-ADE5F35D0434}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{1E2644A9-6B31-4350-8772-CEAAD6EE0B21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{1E2644A9-6B31-4350-8772-CEAAD6EE0B21}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{1E2644A9-6B31-4350-8772-CEAAD6EE0B21}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{1E2644A9-6B31-4350-8772-CEAAD6EE0B21}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{65A2F556-F14A-49F3-8A92-7F2E1E7ED3B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{65A2F556-F14A-49F3-8A92-7F2E1E7ED3B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{65A2F556-F14A-49F3-8A92-7F2E1E7ED3B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{65A2F556-F14A-49F3-8A92-7F2E1E7ED3B5}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{9C1ECA1D-DE98-4FB7-92D0-FC45BB308E5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{9C1ECA1D-DE98-4FB7-92D0-FC45BB308E5D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{9C1ECA1D-DE98-4FB7-92D0-FC45BB308E5D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{9C1ECA1D-DE98-4FB7-92D0-FC45BB308E5D}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{A97F7177-86C7-4B38-A6ED-DA51BF762471}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{A97F7177-86C7-4B38-A6ED-DA51BF762471}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{A97F7177-86C7-4B38-A6ED-DA51BF762471}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{A97F7177-86C7-4B38-A6ED-DA51BF762471}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{139F7A79-69E4-4B8A-B2A5-6A30A66C495C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{139F7A79-69E4-4B8A-B2A5-6A30A66C495C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{139F7A79-69E4-4B8A-B2A5-6A30A66C495C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{139F7A79-69E4-4B8A-B2A5-6A30A66C495C}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7DFF1591-237D-499E-A767-EE37B93FB958}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{7DFF1591-237D-499E-A767-EE37B93FB958}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{7DFF1591-237D-499E-A767-EE37B93FB958}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7DFF1591-237D-499E-A767-EE37B93FB958}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{89C4CBC7-1606-40DE-B6DA-FBE3AAC98395}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{89C4CBC7-1606-40DE-B6DA-FBE3AAC98395}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{89C4CBC7-1606-40DE-B6DA-FBE3AAC98395}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{89C4CBC7-1606-40DE-B6DA-FBE3AAC98395}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{11F7D41B-AFCA-4D29-BC08-285A14BF3A3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{11F7D41B-AFCA-4D29-BC08-285A14BF3A3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{11F7D41B-AFCA-4D29-BC08-285A14BF3A3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{11F7D41B-AFCA-4D29-BC08-285A14BF3A3B}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{631C295A-7CCF-4B42-8686-7034E31469E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{631C295A-7CCF-4B42-8686-7034E31469E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{631C295A-7CCF-4B42-8686-7034E31469E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{631C295A-7CCF-4B42-8686-7034E31469E7}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{D940853C-003A-482C-BDB0-665367F274A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{D940853C-003A-482C-BDB0-665367F274A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{D940853C-003A-482C-BDB0-665367F274A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{D940853C-003A-482C-BDB0-665367F274A0}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7420652C-3046-4F38-BE64-9B9E69D76FA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{7420652C-3046-4F38-BE64-9B9E69D76FA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{7420652C-3046-4F38-BE64-9B9E69D76FA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7420652C-3046-4F38-BE64-9B9E69D76FA2}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{C50AA3E3-8C31-4131-9DEC-1D8B377D5A89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{C50AA3E3-8C31-4131-9DEC-1D8B377D5A89}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{C50AA3E3-8C31-4131-9DEC-1D8B377D5A89}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{C50AA3E3-8C31-4131-9DEC-1D8B377D5A89}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{CA8EAE01-AB9F-4EC1-B6F3-73721487E9E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{CA8EAE01-AB9F-4EC1-B6F3-73721487E9E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{CA8EAE01-AB9F-4EC1-B6F3-73721487E9E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{CA8EAE01-AB9F-4EC1-B6F3-73721487E9E1}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{80F965C4-E2A8-4F54-985D-73D06E45F9CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{80F965C4-E2A8-4F54-985D-73D06E45F9CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{80F965C4-E2A8-4F54-985D-73D06E45F9CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{80F965C4-E2A8-4F54-985D-73D06E45F9CE}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{C2DE264A-AA87-4012-B954-17E3F403A237}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{C2DE264A-AA87-4012-B954-17E3F403A237}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{C2DE264A-AA87-4012-B954-17E3F403A237}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{C2DE264A-AA87-4012-B954-17E3F403A237}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{AF507D61-6766-4C20-9F58-23DC29508219}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{AF507D61-6766-4C20-9F58-23DC29508219}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{AF507D61-6766-4C20-9F58-23DC29508219}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{AF507D61-6766-4C20-9F58-23DC29508219}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{25172C49-7AA4-4739-BB07-69785094C379}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{25172C49-7AA4-4739-BB07-69785094C379}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{25172C49-7AA4-4739-BB07-69785094C379}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{25172C49-7AA4-4739-BB07-69785094C379}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{AC2DB416-F05C-4296-9040-56D6AD4FCD27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{AC2DB416-F05C-4296-9040-56D6AD4FCD27}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{AC2DB416-F05C-4296-9040-56D6AD4FCD27}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{AC2DB416-F05C-4296-9040-56D6AD4FCD27}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{68CF9BDF-94AC-4D2D-A7BD-D1C064F97051}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{68CF9BDF-94AC-4D2D-A7BD-D1C064F97051}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{68CF9BDF-94AC-4D2D-A7BD-D1C064F97051}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{68CF9BDF-94AC-4D2D-A7BD-D1C064F97051}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{A3869243-B462-4986-914B-94E407D8D20F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{A3869243-B462-4986-914B-94E407D8D20F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{A3869243-B462-4986-914B-94E407D8D20F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{A3869243-B462-4986-914B-94E407D8D20F}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{617BD3C7-87D9-4D28-8AC9-4910945BB9FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{617BD3C7-87D9-4D28-8AC9-4910945BB9FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{617BD3C7-87D9-4D28-8AC9-4910945BB9FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{617BD3C7-87D9-4D28-8AC9-4910945BB9FC}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{67B888D9-C6C4-49F1-883C-5B964151D889}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{67B888D9-C6C4-49F1-883C-5B964151D889}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{67B888D9-C6C4-49F1-883C-5B964151D889}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{67B888D9-C6C4-49F1-883C-5B964151D889}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7F3055BA-70AA-424C-8748-345AF35127E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{7F3055BA-70AA-424C-8748-345AF35127E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{7F3055BA-70AA-424C-8748-345AF35127E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{7F3055BA-70AA-424C-8748-345AF35127E9}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{C32274D9-1B66-4D5C-82F9-EB3F10F46752}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{C32274D9-1B66-4D5C-82F9-EB3F10F46752}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{C32274D9-1B66-4D5C-82F9-EB3F10F46752}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{C32274D9-1B66-4D5C-82F9-EB3F10F46752}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{A6DE3DA0-B242-4F49-AEF0-4E26AF92D16C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{A6DE3DA0-B242-4F49-AEF0-4E26AF92D16C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{A6DE3DA0-B242-4F49-AEF0-4E26AF92D16C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{A6DE3DA0-B242-4F49-AEF0-4E26AF92D16C}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{4D40A101-07E6-4FF2-8934-83434932591D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{4D40A101-07E6-4FF2-8934-83434932591D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{4D40A101-07E6-4FF2-8934-83434932591D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{4D40A101-07E6-4FF2-8934-83434932591D}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{20751904-0DFC-4126-BF2A-834B53841010}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{20751904-0DFC-4126-BF2A-834B53841010}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{20751904-0DFC-4126-BF2A-834B53841010}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{20751904-0DFC-4126-BF2A-834B53841010}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{7F1FDCF2-0CE8-4119-B3C1-F2CC6D7E1C36}.Debug|Any CPU.ActiveCfg = Debug|x64
|
|
||||||
{7F1FDCF2-0CE8-4119-B3C1-F2CC6D7E1C36}.Debug|Any CPU.Build.0 = Debug|x64
|
|
||||||
{7F1FDCF2-0CE8-4119-B3C1-F2CC6D7E1C36}.Release|Any CPU.ActiveCfg = Debug|x64
|
|
||||||
{7F1FDCF2-0CE8-4119-B3C1-F2CC6D7E1C36}.Release|Any CPU.Build.0 = Debug|x64
|
|
||||||
{19424B55-058C-4E9C-B86F-700AEF9EAEC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{19424B55-058C-4E9C-B86F-700AEF9EAEC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{19424B55-058C-4E9C-B86F-700AEF9EAEC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{19424B55-058C-4E9C-B86F-700AEF9EAEC3}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{881D71A3-D276-4108-98C6-0FFD32129B9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{881D71A3-D276-4108-98C6-0FFD32129B9C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{881D71A3-D276-4108-98C6-0FFD32129B9C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{881D71A3-D276-4108-98C6-0FFD32129B9C}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{EB83A3A3-F9B6-4281-8EBF-F7289FB5D885}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{EB83A3A3-F9B6-4281-8EBF-F7289FB5D885}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{EB83A3A3-F9B6-4281-8EBF-F7289FB5D885}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{EB83A3A3-F9B6-4281-8EBF-F7289FB5D885}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{D8069A23-AD2E-4C9E-8574-7E8C45296A46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{D8069A23-AD2E-4C9E-8574-7E8C45296A46}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{D8069A23-AD2E-4C9E-8574-7E8C45296A46}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{D8069A23-AD2E-4C9E-8574-7E8C45296A46}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(NestedProjects) = preSolution
|
|
||||||
{D92751C8-1039-4005-90B2-913E55E0B8BD} = {42826721-9A18-4762-8BA9-F1429DD5C5B1}
|
|
||||||
{01F98733-7352-47AD-A594-537D979DE3DE} = {E9DEBA00-50A4-485D-BA65-D8AB3E3467AB}
|
|
||||||
{DC570FFF-6FE5-47BD-8BC1-B471A6067786} = {FC224610-32D3-454E-9BC1-1219FE8ACD5F}
|
|
||||||
{E1C43415-3200-45F4-8BF9-A4DD7D7F2ED6} = {FC224610-32D3-454E-9BC1-1219FE8ACD5F}
|
|
||||||
{83EAD6F0-3CB3-456A-AD81-072127D0DE0E} = {E9DEBA00-50A4-485D-BA65-D8AB3E3467AB}
|
|
||||||
{26391930-F86F-47E0-A5F6-B89919E38CE1} = {E9DEBA00-50A4-485D-BA65-D8AB3E3467AB}
|
|
||||||
{D81C0B87-F0C1-4297-A147-02F001FB7E1E} = {FD4D6594-D81E-456F-8F2E-35B09E04A755}
|
|
||||||
{C9D4CA21-182B-4ED2-81BB-280A6FD713F6} = {2E00592E-558D-492D-88F9-3ECEE4C0C7DA}
|
|
||||||
{7291B93C-615D-42DE-B8C1-3F9DF643E0FC} = {2E00592E-558D-492D-88F9-3ECEE4C0C7DA}
|
|
||||||
{8AEF06C0-CA5C-4460-BC2D-ADE5F35D0434} = {2E00592E-558D-492D-88F9-3ECEE4C0C7DA}
|
|
||||||
{9584AEE5-CD59-46E6-93E6-2DC2B5285B75} = {42826721-9A18-4762-8BA9-F1429DD5C5B1}
|
|
||||||
{1E2644A9-6B31-4350-8772-CEAAD6EE0B21} = {9584AEE5-CD59-46E6-93E6-2DC2B5285B75}
|
|
||||||
{65A2F556-F14A-49F3-8A92-7F2E1E7ED3B5} = {9584AEE5-CD59-46E6-93E6-2DC2B5285B75}
|
|
||||||
{9C1ECA1D-DE98-4FB7-92D0-FC45BB308E5D} = {9584AEE5-CD59-46E6-93E6-2DC2B5285B75}
|
|
||||||
{A97F7177-86C7-4B38-A6ED-DA51BF762471} = {CCF48B65-33D1-4E8B-A57B-E03394730B21}
|
|
||||||
{139F7A79-69E4-4B8A-B2A5-6A30A66C495C} = {CCF48B65-33D1-4E8B-A57B-E03394730B21}
|
|
||||||
{7DFF1591-237D-499E-A767-EE37B93FB958} = {CCF48B65-33D1-4E8B-A57B-E03394730B21}
|
|
||||||
{CCF48B65-33D1-4E8B-A57B-E03394730B21} = {42826721-9A18-4762-8BA9-F1429DD5C5B1}
|
|
||||||
{11F7D41B-AFCA-4D29-BC08-285A14BF3A3B} = {2E00592E-558D-492D-88F9-3ECEE4C0C7DA}
|
|
||||||
{804E065F-914C-414A-AF84-009312C3CFF6} = {42826721-9A18-4762-8BA9-F1429DD5C5B1}
|
|
||||||
{7420652C-3046-4F38-BE64-9B9E69D76FA2} = {FD4D6594-D81E-456F-8F2E-35B09E04A755}
|
|
||||||
{C50AA3E3-8C31-4131-9DEC-1D8B377D5A89} = {59E8E8F3-4E42-4E92-83B3-B1C2AB901D18}
|
|
||||||
{E1C43415-3200-45F4-8BF9-A4DD7D7F2ED9} = {9584AEE5-CD59-46E6-93E6-2DC2B5285B75}
|
|
||||||
{AC2DB416-F05C-4296-9040-56D6AD4FCD27} = {9584AEE5-CD59-46E6-93E6-2DC2B5285B75}
|
|
||||||
{68CF9BDF-94AC-4D2D-A7BD-D1C064F97051} = {E9DEBA00-50A4-485D-BA65-D8AB3E3467AB}
|
|
||||||
{A3869243-B462-4986-914B-94E407D8D20F} = {2E00592E-558D-492D-88F9-3ECEE4C0C7DA}
|
|
||||||
{6067BA60-D279-4156-8AE1-6B44E2D19187} = {FC224610-32D3-454E-9BC1-1219FE8ACD5F}
|
|
||||||
{617BD3C7-87D9-4D28-8AC9-4910945BB9FC} = {57F59C0C-5687-4AF9-AE1C-1933B539F0E4}
|
|
||||||
{67B888D9-C6C4-49F1-883C-5B964151D889} = {57F59C0C-5687-4AF9-AE1C-1933B539F0E4}
|
|
||||||
{7F3055BA-70AA-424C-8748-345AF35127E9} = {57F59C0C-5687-4AF9-AE1C-1933B539F0E4}
|
|
||||||
{E9DEBA00-50A4-485D-BA65-D8AB3E3467AB} = {D92751C8-1039-4005-90B2-913E55E0B8BD}
|
|
||||||
{57F59C0C-5687-4AF9-AE1C-1933B539F0E4} = {D92751C8-1039-4005-90B2-913E55E0B8BD}
|
|
||||||
{FC224610-32D3-454E-9BC1-1219FE8ACD5F} = {D92751C8-1039-4005-90B2-913E55E0B8BD}
|
|
||||||
{E1C43415-3202-45F4-8BF9-A4DD7D7F2ED6} = {FC224610-32D3-454E-9BC1-1219FE8ACD5F}
|
|
||||||
{C32274D9-1B66-4D5C-82F9-EB3F10F46752} = {57F59C0C-5687-4AF9-AE1C-1933B539F0E4}
|
|
||||||
{6A40CBE4-ECAB-4CED-9917-5C64CBF75DA6} = {FC224610-32D3-454E-9BC1-1219FE8ACD5F}
|
|
||||||
{8AC2AD6D-6C74-4B24-8DF6-42717FC9B804} = {D92751C8-1039-4005-90B2-913E55E0B8BD}
|
|
||||||
{A6DE3DA0-B242-4F49-AEF0-4E26AF92D16C} = {8AC2AD6D-6C74-4B24-8DF6-42717FC9B804}
|
|
||||||
{4D40A101-07E6-4FF2-8934-83434932591D} = {8AC2AD6D-6C74-4B24-8DF6-42717FC9B804}
|
|
||||||
{20751904-0DFC-4126-BF2A-834B53841010} = {8AC2AD6D-6C74-4B24-8DF6-42717FC9B804}
|
|
||||||
{7F1FDCF2-0CE8-4119-B3C1-F2CC6D7E1C36} = {0AF38BA3-65A0-481B-8CBB-B82E406E1575}
|
|
||||||
{19424B55-058C-4E9C-B86F-700AEF9EAEC3} = {0AF38BA3-65A0-481B-8CBB-B82E406E1575}
|
|
||||||
{881D71A3-D276-4108-98C6-0FFD32129B9C} = {0AF38BA3-65A0-481B-8CBB-B82E406E1575}
|
|
||||||
{0AF38BA3-65A0-481B-8CBB-B82E406E1575} = {D92751C8-1039-4005-90B2-913E55E0B8BD}
|
|
||||||
{EB83A3A3-F9B6-4281-8EBF-F7289FB5D885} = {FD4D6594-D81E-456F-8F2E-35B09E04A755}
|
|
||||||
{D8069A23-AD2E-4C9E-8574-7E8C45296A46} = {0AF38BA3-65A0-481B-8CBB-B82E406E1575}
|
|
||||||
{2D5AE63D-85C0-43D1-84BF-04418ED93F63} = {804E065F-914C-414A-AF84-009312C3CFF6}
|
|
||||||
{89C4CBC7-1606-40DE-B6DA-FBE3AAC98395} = {2D5AE63D-85C0-43D1-84BF-04418ED93F63}
|
|
||||||
{631C295A-7CCF-4B42-8686-7034E31469E7} = {2D5AE63D-85C0-43D1-84BF-04418ED93F63}
|
|
||||||
{D940853C-003A-482C-BDB0-665367F274A0} = {2D5AE63D-85C0-43D1-84BF-04418ED93F63}
|
|
||||||
{2F45036E-D817-41E9-B82F-DBE013EC95D0} = {804E065F-914C-414A-AF84-009312C3CFF6}
|
|
||||||
{C2DE264A-AA87-4012-B954-17E3F403A237} = {2F45036E-D817-41E9-B82F-DBE013EC95D0}
|
|
||||||
{AF507D61-6766-4C20-9F58-23DC29508219} = {2F45036E-D817-41E9-B82F-DBE013EC95D0}
|
|
||||||
{91D70DE1-DC8E-4AE1-B100-0671D6263FC5} = {804E065F-914C-414A-AF84-009312C3CFF6}
|
|
||||||
{CA8EAE01-AB9F-4EC1-B6F3-73721487E9E1} = {91D70DE1-DC8E-4AE1-B100-0671D6263FC5}
|
|
||||||
{25172C49-7AA4-4739-BB07-69785094C379} = {91D70DE1-DC8E-4AE1-B100-0671D6263FC5}
|
|
||||||
{80F965C4-E2A8-4F54-985D-73D06E45F9CE} = {91D70DE1-DC8E-4AE1-B100-0671D6263FC5}
|
|
||||||
{35175682-DA83-4C0A-A49D-B191F5885D8E} = {91D70DE1-DC8E-4AE1-B100-0671D6263FC5}
|
|
||||||
{4721AA15-AF6E-4A62-A2C3-65564DC563E6} = {804E065F-914C-414A-AF84-009312C3CFF6}
|
|
||||||
{41BC679F-887F-44CF-971D-A5502EE87DB0} = {4721AA15-AF6E-4A62-A2C3-65564DC563E6}
|
|
||||||
{9ADD1B7A-6401-4202-8613-F668E2FBC0A4} = {4721AA15-AF6E-4A62-A2C3-65564DC563E6}
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
SolutionGuid = {EE253116-7070-4E9A-BCE8-2911C251B8C8}
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SharedMSBuildProjectFiles) = preSolution
|
|
||||||
Connectors\Revit\Speckle.Connectors.RevitShared.Cef\Speckle.Connectors.RevitShared.Cef.projitems*{01f98733-7352-47ad-a594-537d979de3de}*SharedItemsImports = 5
|
|
||||||
Connectors\Revit\Speckle.Connectors.RevitShared\Speckle.Connectors.RevitShared.projitems*{01f98733-7352-47ad-a594-537d979de3de}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared\Speckle.Converters.RevitShared.projitems*{19424b55-058c-4e9c-b86f-700aef9eaec3}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared.DependencyInjection\Speckle.Converters.RevitShared.DependencyInjection.projitems*{20751904-0dfc-4126-bf2a-834b53841010}*SharedItemsImports = 5
|
|
||||||
Converters\Autocad\Speckle.Converters.AutocadShared\Speckle.Converters.AutocadShared.projitems*{25172c49-7aa4-4739-bb07-69785094c379}*SharedItemsImports = 5
|
|
||||||
Converters\Civil3d\Speckle.Converters.Civil3dShared\Speckle.Converters.Civil3dShared.projitems*{25172c49-7aa4-4739-bb07-69785094c379}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared\Speckle.Converters.RevitShared.projitems*{26391930-f86f-47e0-a5f6-b89919e38ce1}*SharedItemsImports = 5
|
|
||||||
Converters\Civil3d\Speckle.Converters.Civil3dShared\Speckle.Converters.Civil3dShared.projitems*{35175682-da83-4c0a-a49d-b191f5885d8e}*SharedItemsImports = 13
|
|
||||||
Connectors\Autocad\Speckle.Connectors.AutocadShared\Speckle.Connectors.AutocadShared.projitems*{41bc679f-887f-44cf-971d-a5502ee87db0}*SharedItemsImports = 13
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared\Speckle.Converters.RevitShared.projitems*{4d40a101-07e6-4ff2-8934-83434932591d}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared.DependencyInjection\Speckle.Converters.RevitShared.DependencyInjection.projitems*{6067ba60-d279-4156-8ae1-6b44e2d19187}*SharedItemsImports = 13
|
|
||||||
Connectors\Revit\Speckle.Connectors.RevitShared.Cef\Speckle.Connectors.RevitShared.Cef.projitems*{617bd3c7-87d9-4d28-8ac9-4910945bb9fc}*SharedItemsImports = 5
|
|
||||||
Connectors\Revit\Speckle.Connectors.RevitShared\Speckle.Connectors.RevitShared.projitems*{617bd3c7-87d9-4d28-8ac9-4910945bb9fc}*SharedItemsImports = 5
|
|
||||||
Converters\Autocad\Speckle.Converters.AutocadShared\Speckle.Converters.AutocadShared.projitems*{631c295a-7ccf-4b42-8686-7034e31469e7}*SharedItemsImports = 5
|
|
||||||
Converters\Rhino\Speckle.Converters.RhinoShared\Speckle.Converters.RhinoShared.projitems*{65a2f556-f14a-49f3-8a92-7f2e1e7ed3b5}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared\Speckle.Converters.RevitShared.projitems*{67b888d9-c6c4-49f1-883c-5b964151d889}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared.Tests\Speckle.Converters.RevitShared.Tests.projitems*{68cf9bdf-94ac-4d2d-a7bd-d1c064f97051}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared\Speckle.Converters.RevitShared.projitems*{68cf9bdf-94ac-4d2d-a7bd-d1c064f97051}*SharedItemsImports = 5
|
|
||||||
Connectors\Revit\Speckle.Connectors.RevitShared.Cef\Speckle.Connectors.RevitShared.Cef.projitems*{6a40cbe4-ecab-4ced-9917-5c64cbf75da6}*SharedItemsImports = 13
|
|
||||||
Connectors\Revit\Speckle.Connectors.RevitShared.Cef\Speckle.Connectors.RevitShared.Cef.projitems*{7f1fdcf2-0ce8-4119-b3c1-f2cc6d7e1c36}*SharedItemsImports = 5
|
|
||||||
Connectors\Revit\Speckle.Connectors.RevitShared\Speckle.Connectors.RevitShared.projitems*{7f1fdcf2-0ce8-4119-b3c1-f2cc6d7e1c36}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared.DependencyInjection\Speckle.Converters.RevitShared.DependencyInjection.projitems*{7f3055ba-70aa-424c-8748-345af35127e9}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared.DependencyInjection\Speckle.Converters.RevitShared.DependencyInjection.projitems*{83ead6f0-3cb3-456a-ad81-072127d0de0e}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared.DependencyInjection\Speckle.Converters.RevitShared.DependencyInjection.projitems*{881d71a3-d276-4108-98c6-0ffd32129b9c}*SharedItemsImports = 5
|
|
||||||
Connectors\Autocad\Speckle.Connectors.AutocadShared\Speckle.Connectors.AutocadShared.projitems*{89c4cbc7-1606-40de-b6da-fbe3aac98395}*SharedItemsImports = 5
|
|
||||||
Converters\Autocad\Speckle.Converters.AutocadShared\Speckle.Converters.AutocadShared.projitems*{9add1b7a-6401-4202-8613-f668e2fbc0a4}*SharedItemsImports = 13
|
|
||||||
Connectors\Revit\Speckle.Connectors.RevitShared\Speckle.Connectors.RevitShared.projitems*{a6de3da0-b242-4f49-aef0-4e26af92d16c}*SharedItemsImports = 5
|
|
||||||
Converters\Rhino\Speckle.Converters.RhinoShared\Speckle.Converters.RhinoShared.projitems*{ac2db416-f05c-4296-9040-56d6ad4fcd27}*SharedItemsImports = 5
|
|
||||||
Converters\Autocad\Speckle.Converters.AutocadShared\Speckle.Converters.AutocadShared.projitems*{c2de264a-aa87-4012-b954-17e3f403a237}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared.Tests\Speckle.Converters.RevitShared.Tests.projitems*{c32274d9-1b66-4d5c-82f9-eb3f10f46752}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared\Speckle.Converters.RevitShared.projitems*{c32274d9-1b66-4d5c-82f9-eb3f10f46752}*SharedItemsImports = 5
|
|
||||||
Connectors\Autocad\Speckle.Connectors.AutocadShared\Speckle.Connectors.AutocadShared.projitems*{ca8eae01-ab9f-4ec1-b6f3-73721487e9e1}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared.Tests\Speckle.Converters.RevitShared.Tests.projitems*{d8069a23-ad2e-4c9e-8574-7e8c45296a46}*SharedItemsImports = 5
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared\Speckle.Converters.RevitShared.projitems*{d8069a23-ad2e-4c9e-8574-7e8c45296a46}*SharedItemsImports = 5
|
|
||||||
Connectors\Revit\Speckle.Connectors.RevitShared\Speckle.Connectors.RevitShared.projitems*{dc570fff-6fe5-47bd-8bc1-b471a6067786}*SharedItemsImports = 13
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared\Speckle.Converters.RevitShared.projitems*{e1c43415-3200-45f4-8bf9-a4dd7d7f2ed6}*SharedItemsImports = 13
|
|
||||||
Converters\Rhino\Speckle.Converters.RhinoShared\Speckle.Converters.RhinoShared.projitems*{e1c43415-3200-45f4-8bf9-a4dd7d7f2ed9}*SharedItemsImports = 13
|
|
||||||
Converters\Revit\Speckle.Converters.RevitShared.Tests\Speckle.Converters.RevitShared.Tests.projitems*{e1c43415-3202-45f4-8bf9-a4dd7d7f2ed6}*SharedItemsImports = 13
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
using GlobExpressions;
|
||||||
|
using Microsoft.Build.Construction;
|
||||||
|
using static SimpleExec.Command;
|
||||||
|
|
||||||
|
namespace Build;
|
||||||
|
|
||||||
|
public static class Affected
|
||||||
|
{
|
||||||
|
public static readonly string Root = Environment.CurrentDirectory;
|
||||||
|
public const string AFFECTED_PROJECT = "affected.proj";
|
||||||
|
|
||||||
|
private static IEnumerable<string> GetAffectedProjects()
|
||||||
|
{
|
||||||
|
var projFile = Path.Combine(Root, AFFECTED_PROJECT);
|
||||||
|
Console.WriteLine("Affected project file: " + projFile);
|
||||||
|
var project = ProjectRootElement.Open(projFile) ?? throw new InvalidOperationException();
|
||||||
|
var references = project.ItemGroups.SelectMany(x => x.Items).Where(x => x.ItemType == "ProjectReference");
|
||||||
|
|
||||||
|
foreach (var refe in references)
|
||||||
|
{
|
||||||
|
var referencePath = refe.Include[(Root.Length + 1)..];
|
||||||
|
referencePath = Path.GetDirectoryName(referencePath) ?? throw new InvalidOperationException();
|
||||||
|
if (Path.DirectorySeparatorChar != '/')
|
||||||
|
{
|
||||||
|
referencePath = referencePath.Replace(Path.DirectorySeparatorChar, '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return referencePath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<IEnumerable<string>> GetTestProjects()
|
||||||
|
{
|
||||||
|
await ComputeAffected();
|
||||||
|
var projFile = Path.Combine(Root, AFFECTED_PROJECT);
|
||||||
|
if (File.Exists(projFile))
|
||||||
|
{
|
||||||
|
var references = GetAffectedProjects();
|
||||||
|
return references.Where(x => x.Contains("Tests"));
|
||||||
|
}
|
||||||
|
return Glob.Files(Root, "**/*.Tests.csproj");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<ProjectGroup[]> GetAffectedProjectGroups()
|
||||||
|
{
|
||||||
|
await ComputeAffected();
|
||||||
|
var projFile = Path.Combine(Root, AFFECTED_PROJECT);
|
||||||
|
if (File.Exists(projFile))
|
||||||
|
{
|
||||||
|
var references = GetAffectedProjects().ToList();
|
||||||
|
var groups = new List<ProjectGroup>();
|
||||||
|
foreach (var projectGroup in Consts.ProjectGroups)
|
||||||
|
{
|
||||||
|
foreach (var referencePath in references)
|
||||||
|
{
|
||||||
|
if (projectGroup.Projects.Any(x => x.ProjectPath.Contains(referencePath)))
|
||||||
|
{
|
||||||
|
groups.Add(projectGroup);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var group in groups)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Affected project group being built: " + group.HostAppSlug);
|
||||||
|
}
|
||||||
|
|
||||||
|
return groups.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Using all project groups: " + string.Join(',', Consts.ProjectGroups));
|
||||||
|
return Consts.ProjectGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool s_affectedComputed;
|
||||||
|
|
||||||
|
public static async Task ComputeAffected()
|
||||||
|
{
|
||||||
|
if (s_affectedComputed)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var currentTag = await Versions.GetCurrentTag();
|
||||||
|
var currentVersion = await Versions.ComputeVersion();
|
||||||
|
var lastTag = await Versions.GetPreviousTag(currentTag);
|
||||||
|
var lastVersion = await Versions.ComputePreviousVersion(currentTag);
|
||||||
|
|
||||||
|
Console.WriteLine($"Last tag: {lastTag}, Current tag: {currentTag}");
|
||||||
|
Console.WriteLine($"Last parsed version: {lastVersion}, Current parsed version: {currentVersion}");
|
||||||
|
|
||||||
|
var sort = currentVersion.CompareSortOrderTo(lastVersion);
|
||||||
|
if (sort == -1)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Current version {currentVersion} is less than: {lastVersion}");
|
||||||
|
s_affectedComputed = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var majorEquals = currentVersion.Major == lastVersion.Major;
|
||||||
|
if (!majorEquals)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Current version {currentVersion} is not matching major version: {lastVersion}");
|
||||||
|
s_affectedComputed = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//use tags no matter the version if major versions match
|
||||||
|
var (currentCommit, _) = await ReadAsync("git", $"rev-list -n 1 {currentTag}");
|
||||||
|
var (lastCommit, _) = await ReadAsync("git", $"rev-list -n 1 {lastTag}");
|
||||||
|
await RunAsync("dotnet", $"affected -v --from {currentCommit.Trim()} --to {lastCommit.Trim()}", Root);
|
||||||
|
|
||||||
|
s_affectedComputed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,6 +10,8 @@
|
|||||||
<PackageReference Include="Bullseye" />
|
<PackageReference Include="Bullseye" />
|
||||||
<PackageReference Include="Glob" />
|
<PackageReference Include="Glob" />
|
||||||
<PackageReference Include="Microsoft.Build" />
|
<PackageReference Include="Microsoft.Build" />
|
||||||
|
<PackageReference Include="Microsoft.VisualStudio.SolutionPersistence" />
|
||||||
|
<PackageReference Include="Semver" />
|
||||||
<PackageReference Include="SimpleExec" />
|
<PackageReference Include="SimpleExec" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -4,14 +4,13 @@ public static class Consts
|
|||||||
{
|
{
|
||||||
public static readonly string[] Solutions = ["Speckle.Connectors.sln"];
|
public static readonly string[] Solutions = ["Speckle.Connectors.sln"];
|
||||||
|
|
||||||
public static readonly InstallerProject[] InstallerManifests =
|
public static readonly ProjectGroup[] ProjectGroups =
|
||||||
{
|
{
|
||||||
new("arcgis", [new("Connectors/ArcGIS/Speckle.Connectors.ArcGIS3", "net6.0-windows")]),
|
|
||||||
new(
|
new(
|
||||||
"rhino",
|
"rhino",
|
||||||
[
|
[
|
||||||
new("Connectors/Rhino/Speckle.Connectors.Rhino7", "net48"),
|
new("Connectors/Rhino/Speckle.Connectors.Rhino7", "net48"),
|
||||||
new("Connectors/Rhino/Speckle.Connectors.Rhino8", "net48")
|
new("Connectors/Rhino/Speckle.Connectors.Rhino8", "net48"),
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
new(
|
new(
|
||||||
@@ -20,7 +19,8 @@ public static class Consts
|
|||||||
new("Connectors/Revit/Speckle.Connectors.Revit2022", "net48"),
|
new("Connectors/Revit/Speckle.Connectors.Revit2022", "net48"),
|
||||||
new("Connectors/Revit/Speckle.Connectors.Revit2023", "net48"),
|
new("Connectors/Revit/Speckle.Connectors.Revit2023", "net48"),
|
||||||
new("Connectors/Revit/Speckle.Connectors.Revit2024", "net48"),
|
new("Connectors/Revit/Speckle.Connectors.Revit2024", "net48"),
|
||||||
new("Connectors/Revit/Speckle.Connectors.Revit2025", "net8.0-windows")
|
new("Connectors/Revit/Speckle.Connectors.Revit2025", "net8.0-windows"),
|
||||||
|
new("Connectors/Revit/Speckle.Connectors.Revit2026", "net8.0-windows")
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
new(
|
new(
|
||||||
@@ -29,7 +29,8 @@ public static class Consts
|
|||||||
new("Connectors/Autocad/Speckle.Connectors.Autocad2022", "net48"),
|
new("Connectors/Autocad/Speckle.Connectors.Autocad2022", "net48"),
|
||||||
new("Connectors/Autocad/Speckle.Connectors.Autocad2023", "net48"),
|
new("Connectors/Autocad/Speckle.Connectors.Autocad2023", "net48"),
|
||||||
new("Connectors/Autocad/Speckle.Connectors.Autocad2024", "net48"),
|
new("Connectors/Autocad/Speckle.Connectors.Autocad2024", "net48"),
|
||||||
new("Connectors/Autocad/Speckle.Connectors.Autocad2025", "net8.0-windows")
|
new("Connectors/Autocad/Speckle.Connectors.Autocad2025", "net8.0-windows"),
|
||||||
|
new("Connectors/Autocad/Speckle.Connectors.Autocad2026", "net8.0-windows")
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
new(
|
new(
|
||||||
@@ -38,7 +39,8 @@ public static class Consts
|
|||||||
new("Connectors/Autocad/Speckle.Connectors.Civil3d2022", "net48"),
|
new("Connectors/Autocad/Speckle.Connectors.Civil3d2022", "net48"),
|
||||||
new("Connectors/Autocad/Speckle.Connectors.Civil3d2023", "net48"),
|
new("Connectors/Autocad/Speckle.Connectors.Civil3d2023", "net48"),
|
||||||
new("Connectors/Autocad/Speckle.Connectors.Civil3d2024", "net48"),
|
new("Connectors/Autocad/Speckle.Connectors.Civil3d2024", "net48"),
|
||||||
new("Connectors/Autocad/Speckle.Connectors.Civil3d2025", "net8.0-windows")
|
new("Connectors/Autocad/Speckle.Connectors.Civil3d2025", "net8.0-windows"),
|
||||||
|
new("Connectors/Autocad/Speckle.Connectors.Civil3d2026", "net8.0-windows")
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
new(
|
new(
|
||||||
@@ -49,20 +51,30 @@ public static class Consts
|
|||||||
new("Connectors/Navisworks/Speckle.Connectors.Navisworks2022", "net48"),
|
new("Connectors/Navisworks/Speckle.Connectors.Navisworks2022", "net48"),
|
||||||
new("Connectors/Navisworks/Speckle.Connectors.Navisworks2023", "net48"),
|
new("Connectors/Navisworks/Speckle.Connectors.Navisworks2023", "net48"),
|
||||||
new("Connectors/Navisworks/Speckle.Connectors.Navisworks2024", "net48"),
|
new("Connectors/Navisworks/Speckle.Connectors.Navisworks2024", "net48"),
|
||||||
new("Connectors/Navisworks/Speckle.Connectors.Navisworks2025", "net48")
|
new("Connectors/Navisworks/Speckle.Connectors.Navisworks2025", "net48"),
|
||||||
|
new("Connectors/Navisworks/Speckle.Connectors.Navisworks2026", "net48")
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
new(
|
new(
|
||||||
"tekla-structures",
|
"teklastructures",
|
||||||
[
|
[
|
||||||
new("Connectors/Tekla/Speckle.Connector.Tekla2023", "net48"),
|
new("Connectors/Tekla/Speckle.Connector.Tekla2023", "net48"),
|
||||||
new("Connectors/Tekla/Speckle.Connector.Tekla2024", "net48")
|
new("Connectors/Tekla/Speckle.Connector.Tekla2024", "net48"),
|
||||||
|
new("Connectors/Tekla/Speckle.Connector.Tekla2025", "net48")
|
||||||
]
|
]
|
||||||
)
|
),
|
||||||
|
new(
|
||||||
|
"etabs",
|
||||||
|
[
|
||||||
|
new("Connectors/CSi/Speckle.Connectors.ETABS21", "net48"),
|
||||||
|
new("Connectors/CSi/Speckle.Connectors.ETABS22", "net8.0-windows"),
|
||||||
|
]
|
||||||
|
),
|
||||||
|
new("rhino-importer", [new("Importers/Rhino/Speckle.Importers.JobProcessor", "net8.0-windows")]),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly record struct InstallerProject(string HostAppSlug, IReadOnlyList<InstallerAsset> Projects)
|
public readonly record struct ProjectGroup(string HostAppSlug, IReadOnlyList<InstallerAsset> Projects)
|
||||||
{
|
{
|
||||||
public override string ToString() => $"{HostAppSlug}";
|
public override string ToString() => $"{HostAppSlug}";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,11 +28,11 @@ public static class Github
|
|||||||
Content = content
|
Content = content
|
||||||
};
|
};
|
||||||
request.Headers.Add("X-GitHub-Api-Version", "2022-11-28");
|
request.Headers.Add("X-GitHub-Api-Version", "2022-11-28");
|
||||||
var response = await client.SendAsync(request).ConfigureAwait(false);
|
var response = await client.SendAsync(request);
|
||||||
if (!response.IsSuccessStatusCode)
|
if (!response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException(
|
throw new InvalidOperationException(
|
||||||
$"{response.StatusCode} {response.ReasonPhrase} {await response.Content.ReadAsStringAsync().ConfigureAwait(false)}"
|
$"{response.StatusCode} {response.ReasonPhrase} {await response.Content.ReadAsStringAsync()}"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,16 +7,19 @@ using static SimpleExec.Command;
|
|||||||
const string CLEAN = "clean";
|
const string CLEAN = "clean";
|
||||||
const string RESTORE = "restore";
|
const string RESTORE = "restore";
|
||||||
const string BUILD = "build";
|
const string BUILD = "build";
|
||||||
|
const string PACK = "pack";
|
||||||
|
const string TEST_AFFECTED = "test-affected";
|
||||||
const string TEST = "test";
|
const string TEST = "test";
|
||||||
const string TEST_ONLY = "test-only";
|
|
||||||
const string FORMAT = "format";
|
const string FORMAT = "format";
|
||||||
const string ZIP = "zip";
|
const string ZIP = "zip";
|
||||||
const string VERSION = "version";
|
|
||||||
const string RESTORE_TOOLS = "restore-tools";
|
const string RESTORE_TOOLS = "restore-tools";
|
||||||
const string BUILD_SERVER_VERSION = "build-server-version";
|
|
||||||
const string CLEAN_LOCKS = "clean-locks";
|
const string CLEAN_LOCKS = "clean-locks";
|
||||||
const string CHECK_SOLUTIONS = "check-solutions";
|
const string CHECK_SOLUTIONS = "check-solutions";
|
||||||
|
const string GEN_SOLUTIONS = "generate-solutions";
|
||||||
const string DEEP_CLEAN = "deep-clean";
|
const string DEEP_CLEAN = "deep-clean";
|
||||||
|
const string DEEP_CLEAN_LOCAL = "deep-clean-local";
|
||||||
|
const string DETECT_AFFECTED = "detect-affected";
|
||||||
|
const string TEST_AND_PACK = "test-and-pack";
|
||||||
|
|
||||||
//need to pass arguments
|
//need to pass arguments
|
||||||
/*var arguments = new List<string>();
|
/*var arguments = new List<string>();
|
||||||
@@ -27,44 +30,67 @@ if (args.Length > 1)
|
|||||||
//arguments = arguments.Skip(1).ToList();
|
//arguments = arguments.Skip(1).ToList();
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
void Restore(string solution)
|
||||||
|
{
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine($"Restoring solution '{solution}'");
|
||||||
|
Console.WriteLine();
|
||||||
|
Run("dotnet", $"restore \".\\{solution}\" --no-cache");
|
||||||
|
}
|
||||||
|
void DeleteFiles(string pattern)
|
||||||
|
{
|
||||||
|
foreach (var f in Glob.Files(".", pattern))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Found and will delete: " + f);
|
||||||
|
File.Delete(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void DeleteDirectories(string pattern)
|
||||||
|
{
|
||||||
|
foreach (var f in Glob.Directories(".", pattern))
|
||||||
|
{
|
||||||
|
if (f.StartsWith("Build"))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Console.WriteLine("Found and will delete: " + f);
|
||||||
|
Directory.Delete(f, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CleanSolution(string solution, string configuration)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Cleaning solution: " + solution);
|
||||||
|
|
||||||
|
DeleteDirectories("**/bin");
|
||||||
|
DeleteDirectories("**/obj");
|
||||||
|
DeleteFiles("**/*.lock.json");
|
||||||
|
Restore(solution);
|
||||||
|
}
|
||||||
|
|
||||||
Target(
|
Target(
|
||||||
CLEAN_LOCKS,
|
CLEAN_LOCKS,
|
||||||
() =>
|
Consts.Solutions,
|
||||||
|
s =>
|
||||||
{
|
{
|
||||||
foreach (var f in Glob.Files(".", "**/*.lock.json"))
|
DeleteFiles("**/*.lock.json");
|
||||||
{
|
Restore(s);
|
||||||
Console.WriteLine("Found and will delete: " + f);
|
|
||||||
File.Delete(f);
|
|
||||||
}
|
|
||||||
Console.WriteLine("Running restore now.");
|
|
||||||
Run("dotnet", "restore .\\Speckle.Connectors.sln --no-cache");
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Target(
|
Target(
|
||||||
DEEP_CLEAN,
|
DEEP_CLEAN,
|
||||||
|
Consts.Solutions,
|
||||||
|
s =>
|
||||||
|
{
|
||||||
|
CleanSolution(s, "debug");
|
||||||
|
}
|
||||||
|
);
|
||||||
|
Target(
|
||||||
|
DEEP_CLEAN_LOCAL,
|
||||||
() =>
|
() =>
|
||||||
{
|
{
|
||||||
foreach (var f in Glob.Directories(".", "**/bin"))
|
CleanSolution("Local.sln", "Local");
|
||||||
{
|
|
||||||
if (f.StartsWith("Build"))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Console.WriteLine("Found and will delete: " + f);
|
|
||||||
Directory.Delete(f, true);
|
|
||||||
}
|
|
||||||
foreach (var f in Glob.Directories(".", "**/obj"))
|
|
||||||
{
|
|
||||||
if (f.StartsWith("Build"))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Console.WriteLine("Found and will delete: " + f);
|
|
||||||
Directory.Delete(f, true);
|
|
||||||
}
|
|
||||||
Console.WriteLine("Running restore now.");
|
|
||||||
Run("dotnet", "restore .\\Speckle.Connectors.sln --no-cache");
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -94,17 +120,6 @@ Target(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Target(
|
|
||||||
VERSION,
|
|
||||||
async () =>
|
|
||||||
{
|
|
||||||
var (output, _) = await ReadAsync("dotnet", "minver -v w").ConfigureAwait(false);
|
|
||||||
output = output.Trim();
|
|
||||||
Console.WriteLine($"Version: {output}");
|
|
||||||
Run("echo", $"\"version={output}\" >> $GITHUB_OUTPUT");
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
Target(
|
Target(
|
||||||
RESTORE_TOOLS,
|
RESTORE_TOOLS,
|
||||||
() =>
|
() =>
|
||||||
@@ -113,6 +128,18 @@ Target(
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Target(
|
||||||
|
DETECT_AFFECTED,
|
||||||
|
DependsOn(RESTORE_TOOLS),
|
||||||
|
async () =>
|
||||||
|
{
|
||||||
|
foreach (var group in await Affected.GetAffectedProjectGroups())
|
||||||
|
{
|
||||||
|
Console.WriteLine("Affected project group being built: " + group.HostAppSlug);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
Target(
|
Target(
|
||||||
FORMAT,
|
FORMAT,
|
||||||
DependsOn(RESTORE_TOOLS),
|
DependsOn(RESTORE_TOOLS),
|
||||||
@@ -126,18 +153,12 @@ Target(
|
|||||||
RESTORE,
|
RESTORE,
|
||||||
DependsOn(FORMAT),
|
DependsOn(FORMAT),
|
||||||
Consts.Solutions,
|
Consts.Solutions,
|
||||||
s =>
|
async s =>
|
||||||
{
|
{
|
||||||
Run("dotnet", $"restore {s} --locked-mode");
|
var version = await Versions.ComputeVersion();
|
||||||
}
|
var fileVersion = await Versions.ComputeFileVersion();
|
||||||
);
|
Console.WriteLine($"Restoring: {s} - Version: {version} & {fileVersion}");
|
||||||
|
await RunAsync("dotnet", $"restore \"{s}\" --locked-mode");
|
||||||
Target(
|
|
||||||
BUILD_SERVER_VERSION,
|
|
||||||
DependsOn(RESTORE_TOOLS),
|
|
||||||
() =>
|
|
||||||
{
|
|
||||||
Run("dotnet", "tool run dotnet-gitversion /output json /output buildserver");
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -145,19 +166,32 @@ Target(
|
|||||||
BUILD,
|
BUILD,
|
||||||
DependsOn(RESTORE),
|
DependsOn(RESTORE),
|
||||||
Consts.Solutions,
|
Consts.Solutions,
|
||||||
s =>
|
async s =>
|
||||||
{
|
{
|
||||||
var version = Environment.GetEnvironmentVariable("GitVersion_FullSemVer") ?? "3.0.0-localBuild";
|
var version = await Versions.ComputeVersion();
|
||||||
var fileVersion = Environment.GetEnvironmentVariable("GitVersion_AssemblySemFileVer") ?? "3.0.0.0";
|
var fileVersion = await Versions.ComputeFileVersion();
|
||||||
Console.WriteLine($"Version: {version} & {fileVersion}");
|
Console.WriteLine($"Restoring: {s} - Version: {version} & {fileVersion}");
|
||||||
Run(
|
await RunAsync(
|
||||||
"dotnet",
|
"dotnet",
|
||||||
$"build {s} -c Release --no-restore -warnaserror -p:Version={version} -p:FileVersion={fileVersion} -v:m"
|
$"build \"{s}\" -c Release --no-restore -warnaserror -p:Version={version} -p:FileVersion={fileVersion} -v:m"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Target(CHECK_SOLUTIONS, Solutions.CompareConnectorsToLocal);
|
Target(CHECK_SOLUTIONS, Solutions.CompareConnectorsToLocal);
|
||||||
|
Target(GEN_SOLUTIONS, Solutions.GenerateSolutions);
|
||||||
|
|
||||||
|
Target(
|
||||||
|
TEST_AFFECTED,
|
||||||
|
DependsOn(DETECT_AFFECTED, BUILD, CHECK_SOLUTIONS),
|
||||||
|
async () =>
|
||||||
|
{
|
||||||
|
foreach (var s in await Affected.GetTestProjects())
|
||||||
|
{
|
||||||
|
await RunAsync("dotnet", $"test \"{s}\" -c Release --no-build --no-restore --verbosity=minimal");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
Target(
|
Target(
|
||||||
TEST,
|
TEST,
|
||||||
@@ -165,68 +199,85 @@ Target(
|
|||||||
Glob.Files(".", "**/*.Tests.csproj"),
|
Glob.Files(".", "**/*.Tests.csproj"),
|
||||||
file =>
|
file =>
|
||||||
{
|
{
|
||||||
Run("dotnet", $"test {file} -c Release --no-build --no-restore --verbosity=minimal");
|
Run(
|
||||||
|
"dotnet",
|
||||||
|
$"test \"{file}\" -c Release --no-build --verbosity=minimal /p:AltCover=true /p:AltCoverAttributeFilter=ExcludeFromCodeCoverage /p:AltCoverVerbosity=Warning"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Target(TEST_AND_PACK, DependsOn(TEST, PACK));
|
||||||
|
|
||||||
Target(
|
Target(
|
||||||
TEST_ONLY,
|
PACK,
|
||||||
DependsOn(FORMAT),
|
DependsOn(BUILD),
|
||||||
Glob.Files(".", "**/*.Tests.csproj"),
|
Consts.Solutions,
|
||||||
file =>
|
async solution =>
|
||||||
{
|
{
|
||||||
Run("dotnet", $"restore {file} --locked-mode");
|
var version = await Versions.ComputeVersion();
|
||||||
Run(
|
var fileVersion = await Versions.ComputeFileVersion();
|
||||||
|
Console.WriteLine($"Version: {version} & {fileVersion}");
|
||||||
|
|
||||||
|
await RunAsync(
|
||||||
"dotnet",
|
"dotnet",
|
||||||
$"test {file} -c Release --no-restore --verbosity=minimal /p:AltCover=true /p:AltCoverAttributeFilter=ExcludeFromCodeCoverage /p:AltCoverVerbosity=Warning"
|
$"pack \"{solution}\" -c Release -o output --no-build -p:Version={version} -p:FileVersion={fileVersion} -v:m"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Target(
|
Target(
|
||||||
ZIP,
|
ZIP,
|
||||||
DependsOn(TEST),
|
DependsOn(TEST_AFFECTED),
|
||||||
Consts.InstallerManifests,
|
async () =>
|
||||||
x =>
|
|
||||||
{
|
{
|
||||||
var outputDir = Path.Combine(".", "output");
|
var version = await Versions.ComputeVersion();
|
||||||
var slugDir = Path.Combine(outputDir, x.HostAppSlug);
|
var fileVersion = await Versions.ComputeFileVersion();
|
||||||
|
foreach (var group in await Affected.GetAffectedProjectGroups())
|
||||||
Directory.CreateDirectory(outputDir);
|
|
||||||
Directory.CreateDirectory(slugDir);
|
|
||||||
|
|
||||||
foreach (var asset in x.Projects)
|
|
||||||
{
|
{
|
||||||
var fullPath = Path.Combine(".", asset.ProjectPath, "bin", "Release", asset.TargetName);
|
Console.WriteLine($"Zipping: {group.HostAppSlug} as {version}");
|
||||||
if (!Directory.Exists(fullPath))
|
var outputDir = Path.Combine(".", "output");
|
||||||
|
var slugDir = Path.Combine(outputDir, group.HostAppSlug);
|
||||||
|
|
||||||
|
Directory.CreateDirectory(outputDir);
|
||||||
|
Directory.CreateDirectory(slugDir);
|
||||||
|
|
||||||
|
foreach (var asset in group.Projects)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("Could not find: " + fullPath);
|
var fullPath = Path.Combine(".", asset.ProjectPath, "bin", "Release", asset.TargetName);
|
||||||
|
if (!Directory.Exists(fullPath))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Could not find: " + fullPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
var assetName = Path.GetFileName(asset.ProjectPath);
|
||||||
|
var connectorDir = Path.Combine(slugDir, assetName);
|
||||||
|
|
||||||
|
Directory.CreateDirectory(connectorDir);
|
||||||
|
foreach (var directory in Directory.EnumerateDirectories(fullPath, "*", SearchOption.AllDirectories))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(directory.Replace(fullPath, connectorDir));
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var file in Directory.EnumerateFiles(fullPath, "*", SearchOption.AllDirectories))
|
||||||
|
{
|
||||||
|
Console.WriteLine(file);
|
||||||
|
File.Copy(file, file.Replace(fullPath, connectorDir), true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var assetName = Path.GetFileName(asset.ProjectPath);
|
var outputPath = Path.Combine(outputDir, $"{group.HostAppSlug}.zip");
|
||||||
var connectorDir = Path.Combine(slugDir, assetName);
|
File.Delete(outputPath);
|
||||||
|
Console.WriteLine($"Zipping: '{slugDir}' to '{outputPath}'");
|
||||||
Directory.CreateDirectory(connectorDir);
|
ZipFile.CreateFromDirectory(slugDir, outputPath);
|
||||||
foreach (var directory in Directory.EnumerateDirectories(fullPath, "*", SearchOption.AllDirectories))
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory(directory.Replace(fullPath, connectorDir));
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var file in Directory.EnumerateFiles(fullPath, "*", SearchOption.AllDirectories))
|
|
||||||
{
|
|
||||||
Console.WriteLine(file);
|
|
||||||
File.Copy(file, file.Replace(fullPath, connectorDir), true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var outputPath = Path.Combine(outputDir, $"{x.HostAppSlug}.zip");
|
string githubEnv = Environment.GetEnvironmentVariable("GITHUB_ENV") ?? "Unset";
|
||||||
File.Delete(outputPath);
|
Console.WriteLine($"GITHUB_ENV: {githubEnv}");
|
||||||
Console.WriteLine($"Zipping: '{slugDir}' to '{outputPath}'");
|
File.AppendAllText(githubEnv, $"SEMVER={version}{Environment.NewLine}");
|
||||||
ZipFile.CreateFromDirectory(slugDir, outputPath);
|
File.AppendAllText(githubEnv, $"FILE_VERSION={fileVersion}{Environment.NewLine}");
|
||||||
// Directory.Delete(slugDir, true);
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
Target("default", DependsOn(FORMAT, ZIP), () => Console.WriteLine("Done!"));
|
Target("default", DependsOn(TEST_AFFECTED), () => Console.WriteLine("Done!"));
|
||||||
|
|
||||||
await RunTargetsAndExitAsync(args).ConfigureAwait(true);
|
await RunTargetsAndExitAsync(args).ConfigureAwait(true);
|
||||||
|
|||||||
@@ -1,46 +1,49 @@
|
|||||||
using Microsoft.Build.Construction;
|
using Microsoft.VisualStudio.SolutionPersistence.Model;
|
||||||
|
using Microsoft.VisualStudio.SolutionPersistence.Serializer;
|
||||||
|
|
||||||
namespace Build;
|
namespace Build;
|
||||||
|
|
||||||
public static class Solutions
|
public static class Solutions
|
||||||
{
|
{
|
||||||
private static bool ValidProjects(KeyValuePair<string, ProjectInSolution> projectInSolution) =>
|
#pragma warning disable CA1802
|
||||||
projectInSolution.Value.ProjectType == SolutionProjectType.KnownToBeMSBuildFormat;
|
#pragma warning disable IDE1006
|
||||||
|
private static readonly string DIRECTORY = Environment.CurrentDirectory;
|
||||||
public static void CompareConnectorsToLocal()
|
#pragma warning restore IDE1006
|
||||||
|
#pragma warning restore CA1802
|
||||||
|
public static async Task CompareConnectorsToLocal()
|
||||||
{
|
{
|
||||||
var localSln = SolutionFile.Parse(Path.Combine(Environment.CurrentDirectory, "Local.sln"));
|
var localSln = await GetSolution("Local.sln");
|
||||||
var connectorsSln = SolutionFile.Parse(Path.Combine(Environment.CurrentDirectory, "Speckle.Connectors.sln"));
|
var connectorsSln = await GetSolution("Speckle.Connectors.sln");
|
||||||
var localProjects = localSln.ProjectsByGuid.Where(ValidProjects).ToDictionary();
|
var localProjects = localSln.SolutionProjects.ToList();
|
||||||
|
|
||||||
foreach ((string? _, ProjectInSolution? value) in connectorsSln.ProjectsByGuid.Where(ValidProjects))
|
foreach (var value in connectorsSln.SolutionProjects)
|
||||||
{
|
{
|
||||||
var localProject = localProjects.Values.FirstOrDefault(x => x.ProjectName == value.ProjectName);
|
var localProject = localProjects.FirstOrDefault(x => x.ActualDisplayName == value.ActualDisplayName);
|
||||||
if (localProject is null)
|
if (localProject is null)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException($"Could not find in LOCAL solution: {value.ProjectName}");
|
throw new InvalidOperationException($"Could not find in LOCAL solution: {value.ActualDisplayName}");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value.ProjectName != localProject.ProjectName)
|
if (value.ActualDisplayName != localProject.ActualDisplayName)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException(
|
throw new InvalidOperationException(
|
||||||
"Projects with different names have same Guid in solution: "
|
"Projects with different names have same Guid in solution: "
|
||||||
+ value.ProjectName
|
+ value.ActualDisplayName
|
||||||
+ " and "
|
+ " and "
|
||||||
+ localProject.ProjectName
|
+ localProject.ActualDisplayName
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
localProjects.Remove(localProjects.Single(x => x.Value.ProjectName == value.ProjectName).Key);
|
localProjects.Remove(localProjects.Single(x => x.ActualDisplayName == value.ActualDisplayName));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckAndRemoveKnown(string projectName)
|
void CheckAndRemoveKnown(string projectName)
|
||||||
{
|
{
|
||||||
var localProject = localProjects.Values.FirstOrDefault(x => x.ProjectName == projectName);
|
var localProject = localProjects.FirstOrDefault(x => x.ActualDisplayName == projectName);
|
||||||
if (localProject is null)
|
if (localProject is null)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException($"Could not find in LOCAL solution: {projectName}");
|
throw new InvalidOperationException($"Could not find in LOCAL solution: {projectName}");
|
||||||
}
|
}
|
||||||
localProjects.Remove(localProjects.Single(x => x.Value.ProjectName == projectName).Key);
|
localProjects.Remove(localProjects.Single(x => x.ActualDisplayName == projectName));
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckAndRemoveKnown("Speckle.Objects");
|
CheckAndRemoveKnown("Speckle.Objects");
|
||||||
@@ -49,8 +52,66 @@ public static class Solutions
|
|||||||
if (localProjects.Count != 0)
|
if (localProjects.Count != 0)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException(
|
throw new InvalidOperationException(
|
||||||
"Could not find in CONNECTOR solution: " + localProjects.First().Value.ProjectName
|
"Could not find in CONNECTOR solution: " + localProjects.First().ActualDisplayName
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async Task GenerateSolutions()
|
||||||
|
{
|
||||||
|
await GenerateLocalSlnx();
|
||||||
|
foreach (var group in Consts.ProjectGroups)
|
||||||
|
{
|
||||||
|
var connectors = await GetFullSlnx();
|
||||||
|
var slug = group.HostAppSlug;
|
||||||
|
await GenerateConnector(connectors, group, string.Concat(slug[0].ToString().ToUpper(), slug.AsSpan(1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task GenerateLocalSlnx()
|
||||||
|
{
|
||||||
|
var connectors = await GetFullSlnx();
|
||||||
|
connectors.AddProject("..\\speckle-sharp-sdk\\src\\Speckle.Objects\\Speckle.Objects.csproj");
|
||||||
|
connectors.AddProject("..\\speckle-sharp-sdk\\src\\Speckle.Sdk\\Speckle.Sdk.csproj");
|
||||||
|
connectors.AddProject("..\\speckle-sharp-sdk\\src\\Speckle.Sdk.Dependencies\\Speckle.Sdk.Dependencies.csproj");
|
||||||
|
var sln = Path.Combine(DIRECTORY, "Local.slnx");
|
||||||
|
await SolutionSerializers.SlnXml.SaveAsync(sln, connectors, default);
|
||||||
|
sln = Path.Combine(DIRECTORY, "Local.sln");
|
||||||
|
await SolutionSerializers.SlnFileV12.SaveAsync(sln, connectors, default);
|
||||||
|
|
||||||
|
var revit = Consts.ProjectGroups.Single(x => x.HostAppSlug.Equals("revit"));
|
||||||
|
await GenerateConnector(connectors, revit, "Revit.Local");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task GenerateConnector(SolutionModel connectors, ProjectGroup group, string? name)
|
||||||
|
{
|
||||||
|
var path = group.Projects[0].ProjectPath.Split('/');
|
||||||
|
var folder = $"/{path[0]}/{path[1]}/";
|
||||||
|
var foldersToRemove = connectors
|
||||||
|
.SolutionFolders.Where(x =>
|
||||||
|
//need base folder
|
||||||
|
!x.Path.Equals("/Connectors/")
|
||||||
|
//don't grab all
|
||||||
|
&& (x.Path.StartsWith("/Connectors/") && !x.Path.StartsWith(folder))
|
||||||
|
)
|
||||||
|
.ToList();
|
||||||
|
foreach (var folderToRemove in foldersToRemove)
|
||||||
|
{
|
||||||
|
connectors.RemoveFolder(folderToRemove);
|
||||||
|
}
|
||||||
|
var sln = Path.Combine(DIRECTORY, $"Speckle.{name}.slnx");
|
||||||
|
await SolutionSerializers.SlnXml.SaveAsync(sln, connectors, default);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<SolutionModel> GetFullSlnx()
|
||||||
|
{
|
||||||
|
var connectorsSln = Path.Combine(DIRECTORY, "Speckle.Connectors.slnx");
|
||||||
|
return await SolutionSerializers.SlnXml.OpenAsync(connectorsSln, default);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<SolutionModel> GetSolution(string solutionName)
|
||||||
|
{
|
||||||
|
var connectorsSln = Path.Combine(DIRECTORY, solutionName);
|
||||||
|
return await SolutionSerializers.SlnFileV12.OpenAsync(connectorsSln, default);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
using Semver;
|
||||||
|
using static SimpleExec.Command;
|
||||||
|
|
||||||
|
namespace Build;
|
||||||
|
|
||||||
|
public static class Versions
|
||||||
|
{
|
||||||
|
private static string? s_currentTag;
|
||||||
|
private static SemVersion? s_currentVersion;
|
||||||
|
|
||||||
|
public static async Task<string> GetCurrentTag()
|
||||||
|
{
|
||||||
|
if (s_currentTag is not null)
|
||||||
|
{
|
||||||
|
return s_currentTag;
|
||||||
|
}
|
||||||
|
//finds current tag or makes one
|
||||||
|
var (currentTag, _) = await ReadAsync("git", "describe --tags");
|
||||||
|
currentTag = currentTag.Trim();
|
||||||
|
s_currentTag = currentTag;
|
||||||
|
return s_currentTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<SemVersion> ComputeVersion()
|
||||||
|
{
|
||||||
|
if (s_currentVersion is not null)
|
||||||
|
{
|
||||||
|
return s_currentVersion;
|
||||||
|
}
|
||||||
|
var currentTag = await GetCurrentTag();
|
||||||
|
|
||||||
|
if (!SemVersion.TryParse(currentTag, SemVersionStyles.AllowLowerV, out var currentVersion))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"Could not parse version: '{currentTag}'");
|
||||||
|
}
|
||||||
|
s_currentVersion = currentVersion;
|
||||||
|
return s_currentVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string? s_currentFileVersion;
|
||||||
|
|
||||||
|
public static async Task<string> ComputeFileVersion()
|
||||||
|
{
|
||||||
|
if (s_currentFileVersion is not null)
|
||||||
|
{
|
||||||
|
return s_currentFileVersion;
|
||||||
|
}
|
||||||
|
var currentVersion = await ComputeVersion();
|
||||||
|
s_currentFileVersion = currentVersion.WithoutPrereleaseOrMetadata() + ".0";
|
||||||
|
return s_currentFileVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<string> GetPreviousTag(string currentTag)
|
||||||
|
{
|
||||||
|
//finds a tag starting with current tag and adds no abbrevation
|
||||||
|
var (lastTag, _) = await ReadAsync("git", $"describe --abbrev=0 --tags {currentTag}^");
|
||||||
|
lastTag = lastTag.Trim();
|
||||||
|
|
||||||
|
return lastTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static SemVersion? s_previousVersion;
|
||||||
|
|
||||||
|
public static async Task<SemVersion> ComputePreviousVersion(string currentTag)
|
||||||
|
{
|
||||||
|
if (s_previousVersion is not null)
|
||||||
|
{
|
||||||
|
return s_previousVersion;
|
||||||
|
}
|
||||||
|
var lastTag = await GetPreviousTag(currentTag);
|
||||||
|
|
||||||
|
if (!SemVersion.TryParse(lastTag, SemVersionStyles.AllowLowerV, out var lastVersion))
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"Could not parse version: '{lastTag}'");
|
||||||
|
}
|
||||||
|
s_previousVersion = lastVersion;
|
||||||
|
return s_previousVersion;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,12 +16,12 @@
|
|||||||
},
|
},
|
||||||
"Microsoft.Build": {
|
"Microsoft.Build": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[17.11.4, )",
|
"requested": "[17.11.48, )",
|
||||||
"resolved": "17.11.4",
|
"resolved": "17.11.48",
|
||||||
"contentHash": "UMC7DfeFEHY2GGHHaghybUuUlLaByFHEFudR2PehMgDBuRuLAUePp1iaa4eFtVzepRzMtIbeSCVJCzzX3NV2Gg==",
|
"contentHash": "g8Kn575mNAKcuFotV3C7xvF+IbxuHennl67LH2shL2au1U6UqwReTDygCHyU04+koc2Yn7fHIbVQaC08HqEWow==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Build.Framework": "17.11.4",
|
"Microsoft.Build.Framework": "17.11.48",
|
||||||
"Microsoft.NET.StringTools": "17.11.4",
|
"Microsoft.NET.StringTools": "17.11.48",
|
||||||
"System.Collections.Immutable": "8.0.0",
|
"System.Collections.Immutable": "8.0.0",
|
||||||
"System.Configuration.ConfigurationManager": "8.0.0",
|
"System.Configuration.ConfigurationManager": "8.0.0",
|
||||||
"System.Reflection.Metadata": "8.0.0",
|
"System.Reflection.Metadata": "8.0.0",
|
||||||
@@ -47,12 +47,27 @@
|
|||||||
"Microsoft.SourceLink.Common": "8.0.0"
|
"Microsoft.SourceLink.Common": "8.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Microsoft.VisualStudio.SolutionPersistence": {
|
||||||
|
"type": "Direct",
|
||||||
|
"requested": "[1.0.52, )",
|
||||||
|
"resolved": "1.0.52",
|
||||||
|
"contentHash": "oNv2JtYXhpdJrX63nibx1JT3uCESOBQ1LAk7Dtz/sr0+laW0KRM6eKp4CZ3MHDR2siIkKsY8MmUkeP5DKkQQ5w=="
|
||||||
|
},
|
||||||
"PolySharp": {
|
"PolySharp": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[1.14.1, )",
|
"requested": "[1.14.1, )",
|
||||||
"resolved": "1.14.1",
|
"resolved": "1.14.1",
|
||||||
"contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ=="
|
"contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ=="
|
||||||
},
|
},
|
||||||
|
"Semver": {
|
||||||
|
"type": "Direct",
|
||||||
|
"requested": "[3.0.0, )",
|
||||||
|
"resolved": "3.0.0",
|
||||||
|
"contentHash": "9jZCicsVgTebqkAujRWtC9J1A5EQVlu0TVKHcgoCuv345ve5DYf4D1MjhKEnQjdRZo6x/vdv6QQrYFs7ilGzLA==",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Primitives": "5.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"SimpleExec": {
|
"SimpleExec": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[12.0.0, )",
|
"requested": "[12.0.0, )",
|
||||||
@@ -67,18 +82,23 @@
|
|||||||
},
|
},
|
||||||
"Microsoft.Build.Framework": {
|
"Microsoft.Build.Framework": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "17.11.4",
|
"resolved": "17.11.48",
|
||||||
"contentHash": "u28uDihlqxtt8h2dL1ZJOZ7TRkxBK+HGr+3FgQpILVo7Q7gErkw8mYW9R+RM5PtxvZTdYb/4MWDL66vdIsANBQ=="
|
"contentHash": "C3WIMt2wBl4++NX3jSEpTq5KXBhvAV154R4JrYHkfy9JSBcXWiL0mkgpspk5xSdOj+fS/uz7zluIy6bMM1fkkQ=="
|
||||||
},
|
},
|
||||||
"Microsoft.Build.Tasks.Git": {
|
"Microsoft.Build.Tasks.Git": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
|
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
|
||||||
},
|
},
|
||||||
|
"Microsoft.Extensions.Primitives": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "5.0.1",
|
||||||
|
"contentHash": "5WPSmL4YeP7eW+Vc8XZ4DwjYWBAiSwDV9Hm63JJWcz1Ie3Xjv4KuJXzgCstj48LkLfVCYa7mLcx7y+q6yqVvtw=="
|
||||||
|
},
|
||||||
"Microsoft.NET.StringTools": {
|
"Microsoft.NET.StringTools": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "17.11.4",
|
"resolved": "17.11.48",
|
||||||
"contentHash": "mudqUHhNpeqIdJoUx2YDWZO/I9uEDYVowan89R6wsomfnUJQk6HteoQTlNjZDixhT2B4IXMkMtgZtoceIjLRmA=="
|
"contentHash": "0IQo089IGBEC4jgtishauZMVr9ZxOWNiGKeDvyzZlvw7p2r253lJh6IJCLLFWXvZnVrVO5mnsYIPamxFPzM08w=="
|
||||||
},
|
},
|
||||||
"Microsoft.NETFramework.ReferenceAssemblies.net461": {
|
"Microsoft.NETFramework.ReferenceAssemblies.net461": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
|
|||||||
@@ -1,108 +0,0 @@
|
|||||||
using ArcGIS.Desktop.Core;
|
|
||||||
using ArcGIS.Desktop.Mapping;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Speckle.Connectors.Common.Cancellation;
|
|
||||||
using Speckle.Connectors.Common.Operations;
|
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
|
||||||
using Speckle.Connectors.DUI.Logging;
|
|
||||||
using Speckle.Connectors.DUI.Models;
|
|
||||||
using Speckle.Connectors.DUI.Models.Card;
|
|
||||||
using Speckle.Converters.ArcGIS3;
|
|
||||||
using Speckle.Converters.ArcGIS3.Utils;
|
|
||||||
using Speckle.Converters.Common;
|
|
||||||
using Speckle.Sdk;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.Bindings;
|
|
||||||
|
|
||||||
public sealed class ArcGISReceiveBinding : IReceiveBinding
|
|
||||||
{
|
|
||||||
public string Name { get; } = "receiveBinding";
|
|
||||||
private readonly CancellationManager _cancellationManager;
|
|
||||||
private readonly DocumentModelStore _store;
|
|
||||||
private readonly IServiceProvider _serviceProvider;
|
|
||||||
private readonly IOperationProgressManager _operationProgressManager;
|
|
||||||
private readonly ILogger<ArcGISReceiveBinding> _logger;
|
|
||||||
private readonly IArcGISConversionSettingsFactory _arcGISConversionSettingsFactory;
|
|
||||||
|
|
||||||
private ReceiveBindingUICommands Commands { get; }
|
|
||||||
public IBrowserBridge Parent { get; }
|
|
||||||
|
|
||||||
public ArcGISReceiveBinding(
|
|
||||||
DocumentModelStore store,
|
|
||||||
IBrowserBridge parent,
|
|
||||||
CancellationManager cancellationManager,
|
|
||||||
IServiceProvider serviceProvider,
|
|
||||||
IOperationProgressManager operationProgressManager,
|
|
||||||
ILogger<ArcGISReceiveBinding> logger,
|
|
||||||
IArcGISConversionSettingsFactory arcGisConversionSettingsFactory
|
|
||||||
)
|
|
||||||
{
|
|
||||||
_store = store;
|
|
||||||
_cancellationManager = cancellationManager;
|
|
||||||
Parent = parent;
|
|
||||||
Commands = new ReceiveBindingUICommands(parent);
|
|
||||||
_serviceProvider = serviceProvider;
|
|
||||||
_operationProgressManager = operationProgressManager;
|
|
||||||
_logger = logger;
|
|
||||||
_arcGISConversionSettingsFactory = arcGisConversionSettingsFactory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task Receive(string modelCardId)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Get receiver card
|
|
||||||
if (_store.GetModelById(modelCardId) is not ReceiverModelCard modelCard)
|
|
||||||
{
|
|
||||||
// Handle as GLOBAL ERROR at BrowserBridge
|
|
||||||
throw new InvalidOperationException("No download model card was found.");
|
|
||||||
}
|
|
||||||
|
|
||||||
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
|
|
||||||
using var scope = _serviceProvider.CreateScope();
|
|
||||||
scope
|
|
||||||
.ServiceProvider.GetRequiredService<IConverterSettingsStore<ArcGISConversionSettings>>()
|
|
||||||
.Initialize(
|
|
||||||
_arcGISConversionSettingsFactory.Create(
|
|
||||||
Project.Current,
|
|
||||||
MapView.Active.Map,
|
|
||||||
new CRSoffsetRotation(MapView.Active.Map)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
// Receive host objects
|
|
||||||
var receiveOperationResults = await scope
|
|
||||||
.ServiceProvider.GetRequiredService<ReceiveOperation>()
|
|
||||||
.Execute(
|
|
||||||
modelCard.GetReceiveInfo("ArcGIS"), // POC: get host app name from settings? same for GetSendInfo
|
|
||||||
_operationProgressManager.CreateOperationProgressEventHandler(Parent, modelCardId, cancellationToken),
|
|
||||||
cancellationToken
|
|
||||||
)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
modelCard.BakedObjectIds = receiveOperationResults.BakedObjectIds.ToList();
|
|
||||||
await Commands
|
|
||||||
.SetModelReceiveResult(
|
|
||||||
modelCardId,
|
|
||||||
receiveOperationResults.BakedObjectIds,
|
|
||||||
receiveOperationResults.ConversionResults
|
|
||||||
)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
// SWALLOW -> UI handles it immediately, so we do not need to handle anything for now!
|
|
||||||
// Idea for later -> when cancel called, create promise from UI to solve it later with this catch block.
|
|
||||||
// So have 3 state on UI -> Cancellation clicked -> Cancelling -> Cancelled
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
catch (Exception ex) when (!ex.IsFatal()) // UX reasons - we will report operation exceptions as model card error. We may change this later when we have more exception documentation
|
|
||||||
{
|
|
||||||
_logger.LogModelCardHandledError(ex);
|
|
||||||
await Commands.SetModelError(modelCardId, ex).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CancelReceive(string modelCardId) => _cancellationManager.CancelOperation(modelCardId);
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
using ArcGIS.Desktop.Mapping;
|
|
||||||
using ArcGIS.Desktop.Mapping.Events;
|
|
||||||
using Speckle.Connectors.ArcGIS.Utils;
|
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.Bindings;
|
|
||||||
|
|
||||||
public class ArcGISSelectionBinding : ISelectionBinding
|
|
||||||
{
|
|
||||||
private readonly MapMembersUtils _mapMemberUtils;
|
|
||||||
public string Name => "selectionBinding";
|
|
||||||
public IBrowserBridge Parent { get; }
|
|
||||||
|
|
||||||
public ArcGISSelectionBinding(IBrowserBridge parent, MapMembersUtils mapMemberUtils)
|
|
||||||
{
|
|
||||||
_mapMemberUtils = mapMemberUtils;
|
|
||||||
Parent = parent;
|
|
||||||
var topLevelHandler = parent.TopLevelExceptionHandler;
|
|
||||||
|
|
||||||
// example: https://github.com/Esri/arcgis-pro-sdk-community-samples/blob/master/Map-Authoring/QueryBuilderControl/DefinitionQueryDockPaneViewModel.cs
|
|
||||||
// MapViewEventArgs args = new(MapView.Active);
|
|
||||||
TOCSelectionChangedEvent.Subscribe(_ => topLevelHandler.CatchUnhandled(OnSelectionChanged), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnSelectionChanged()
|
|
||||||
{
|
|
||||||
SelectionInfo selInfo = GetSelection();
|
|
||||||
Parent.Send(SelectionBindingEvents.SET_SELECTION, selInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GetLayersFromGroup(GroupLayer group, List<MapMember> nestedLayers)
|
|
||||||
{
|
|
||||||
nestedLayers.Add(group);
|
|
||||||
foreach (MapMember member in group.Layers)
|
|
||||||
{
|
|
||||||
if (member is GroupLayer subGroup)
|
|
||||||
{
|
|
||||||
GetLayersFromGroup(subGroup, nestedLayers);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nestedLayers.Add(member);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SelectionInfo GetSelection()
|
|
||||||
{
|
|
||||||
MapView mapView = MapView.Active;
|
|
||||||
List<MapMember> selectedMembers = new();
|
|
||||||
selectedMembers.AddRange(mapView.GetSelectedLayers());
|
|
||||||
selectedMembers.AddRange(mapView.GetSelectedStandaloneTables());
|
|
||||||
|
|
||||||
List<MapMember> allNestedMembers = new();
|
|
||||||
var layerMapMembers = _mapMemberUtils.UnpackMapLayers(selectedMembers);
|
|
||||||
allNestedMembers.AddRange(layerMapMembers);
|
|
||||||
|
|
||||||
List<string> objectTypes = allNestedMembers
|
|
||||||
.Select(o => o.GetType().ToString().Split(".").Last())
|
|
||||||
.Distinct()
|
|
||||||
.ToList();
|
|
||||||
return new SelectionInfo(
|
|
||||||
allNestedMembers.Select(x => x.URI).ToList(),
|
|
||||||
$"{allNestedMembers.Count} layers ({string.Join(", ", objectTypes)})"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,476 +0,0 @@
|
|||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using ArcGIS.Core.Data;
|
|
||||||
using ArcGIS.Desktop.Core;
|
|
||||||
using ArcGIS.Desktop.Editing.Events;
|
|
||||||
using ArcGIS.Desktop.Framework.Threading.Tasks;
|
|
||||||
using ArcGIS.Desktop.Mapping;
|
|
||||||
using ArcGIS.Desktop.Mapping.Events;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Speckle.Connectors.ArcGIS.Filters;
|
|
||||||
using Speckle.Connectors.ArcGIS.Utils;
|
|
||||||
using Speckle.Connectors.Common.Caching;
|
|
||||||
using Speckle.Connectors.Common.Cancellation;
|
|
||||||
using Speckle.Connectors.Common.Operations;
|
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
|
||||||
using Speckle.Connectors.DUI.Exceptions;
|
|
||||||
using Speckle.Connectors.DUI.Logging;
|
|
||||||
using Speckle.Connectors.DUI.Models;
|
|
||||||
using Speckle.Connectors.DUI.Models.Card;
|
|
||||||
using Speckle.Connectors.DUI.Models.Card.SendFilter;
|
|
||||||
using Speckle.Connectors.DUI.Settings;
|
|
||||||
using Speckle.Converters.ArcGIS3;
|
|
||||||
using Speckle.Converters.ArcGIS3.Utils;
|
|
||||||
using Speckle.Converters.Common;
|
|
||||||
using Speckle.Sdk;
|
|
||||||
using Speckle.Sdk.Common;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.Bindings;
|
|
||||||
|
|
||||||
public sealed class ArcGISSendBinding : ISendBinding
|
|
||||||
{
|
|
||||||
public string Name => "sendBinding";
|
|
||||||
public SendBindingUICommands Commands { get; }
|
|
||||||
public IBrowserBridge Parent { get; }
|
|
||||||
|
|
||||||
private readonly DocumentModelStore _store;
|
|
||||||
private readonly IServiceProvider _serviceProvider;
|
|
||||||
private readonly List<ISendFilter> _sendFilters;
|
|
||||||
private readonly CancellationManager _cancellationManager;
|
|
||||||
private readonly ISendConversionCache _sendConversionCache;
|
|
||||||
private readonly IOperationProgressManager _operationProgressManager;
|
|
||||||
private readonly ILogger<ArcGISSendBinding> _logger;
|
|
||||||
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
|
|
||||||
private readonly IArcGISConversionSettingsFactory _arcGISConversionSettingsFactory;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Used internally to aggregate the changed objects' id. Note we're using a concurrent dictionary here as the expiry check method is not thread safe, and this was causing problems. See:
|
|
||||||
/// [CNX-202: Unhandled Exception Occurred when receiving in Rhino](https://linear.app/speckle/issue/CNX-202/unhandled-exception-occurred-when-receiving-in-rhino)
|
|
||||||
/// As to why a concurrent dictionary, it's because it's the cheapest/easiest way to do so.
|
|
||||||
/// https://stackoverflow.com/questions/18922985/concurrent-hashsett-in-net-framework
|
|
||||||
/// </summary>
|
|
||||||
private ConcurrentDictionary<string, byte> ChangedObjectIds { get; set; } = new();
|
|
||||||
|
|
||||||
private List<FeatureLayer> SubscribedLayers { get; set; } = new();
|
|
||||||
private List<StandaloneTable> SubscribedTables { get; set; } = new();
|
|
||||||
private readonly MapMembersUtils _mapMemberUtils;
|
|
||||||
|
|
||||||
public ArcGISSendBinding(
|
|
||||||
DocumentModelStore store,
|
|
||||||
IBrowserBridge parent,
|
|
||||||
IEnumerable<ISendFilter> sendFilters,
|
|
||||||
IServiceProvider serviceProvider,
|
|
||||||
CancellationManager cancellationManager,
|
|
||||||
ISendConversionCache sendConversionCache,
|
|
||||||
IOperationProgressManager operationProgressManager,
|
|
||||||
ILogger<ArcGISSendBinding> logger,
|
|
||||||
IArcGISConversionSettingsFactory arcGisConversionSettingsFactory,
|
|
||||||
MapMembersUtils mapMemberUtils
|
|
||||||
)
|
|
||||||
{
|
|
||||||
_store = store;
|
|
||||||
_serviceProvider = serviceProvider;
|
|
||||||
_sendFilters = sendFilters.ToList();
|
|
||||||
_cancellationManager = cancellationManager;
|
|
||||||
_sendConversionCache = sendConversionCache;
|
|
||||||
_operationProgressManager = operationProgressManager;
|
|
||||||
_logger = logger;
|
|
||||||
_topLevelExceptionHandler = parent.TopLevelExceptionHandler;
|
|
||||||
_arcGISConversionSettingsFactory = arcGisConversionSettingsFactory;
|
|
||||||
_mapMemberUtils = mapMemberUtils;
|
|
||||||
|
|
||||||
Parent = parent;
|
|
||||||
Commands = new SendBindingUICommands(parent);
|
|
||||||
SubscribeToArcGISEvents();
|
|
||||||
_store.DocumentChanged += (_, _) =>
|
|
||||||
{
|
|
||||||
_sendConversionCache.ClearCache();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SubscribeToArcGISEvents()
|
|
||||||
{
|
|
||||||
LayersRemovedEvent.Subscribe(
|
|
||||||
a =>
|
|
||||||
_topLevelExceptionHandler.FireAndForget(async () => await GetIdsForLayersRemovedEvent(a).ConfigureAwait(false)),
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
StandaloneTablesRemovedEvent.Subscribe(
|
|
||||||
a =>
|
|
||||||
_topLevelExceptionHandler.FireAndForget(
|
|
||||||
async () => await GetIdsForStandaloneTablesRemovedEvent(a).ConfigureAwait(false)
|
|
||||||
),
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
MapPropertyChangedEvent.Subscribe(
|
|
||||||
a =>
|
|
||||||
_topLevelExceptionHandler.FireAndForget(
|
|
||||||
async () => await GetIdsForMapPropertyChangedEvent(a).ConfigureAwait(false)
|
|
||||||
),
|
|
||||||
true
|
|
||||||
); // Map units, CRS etc.
|
|
||||||
|
|
||||||
MapMemberPropertiesChangedEvent.Subscribe(
|
|
||||||
a =>
|
|
||||||
_topLevelExceptionHandler.FireAndForget(
|
|
||||||
async () => await GetIdsForMapMemberPropertiesChangedEvent(a).ConfigureAwait(false)
|
|
||||||
),
|
|
||||||
true
|
|
||||||
); // e.g. Layer name
|
|
||||||
|
|
||||||
ActiveMapViewChangedEvent.Subscribe(
|
|
||||||
_ => _topLevelExceptionHandler.CatchUnhandled(SubscribeToMapMembersDataSourceChange),
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
/*
|
|
||||||
LayersAddedEvent.Subscribe(a => _topLevelExceptionHandler.CatchUnhandled(() => GetIdsForLayersAddedEvent(a)), true);
|
|
||||||
|
|
||||||
StandaloneTablesAddedEvent.Subscribe(
|
|
||||||
a => _topLevelExceptionHandler.CatchUnhandled(() => GetIdsForStandaloneTablesAddedEvent(a)),
|
|
||||||
true
|
|
||||||
);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SubscribeToMapMembersDataSourceChange()
|
|
||||||
{
|
|
||||||
var task = QueuedTask.Run(() =>
|
|
||||||
{
|
|
||||||
if (MapView.Active == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// subscribe to layers
|
|
||||||
foreach (Layer layer in MapView.Active.Map.Layers)
|
|
||||||
{
|
|
||||||
if (layer is FeatureLayer featureLayer)
|
|
||||||
{
|
|
||||||
SubscribeToFeatureLayerDataSourceChange(featureLayer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// subscribe to tables
|
|
||||||
foreach (StandaloneTable table in MapView.Active.Map.StandaloneTables)
|
|
||||||
{
|
|
||||||
SubscribeToTableDataSourceChange(table);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
task.Wait();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SubscribeToFeatureLayerDataSourceChange(FeatureLayer layer)
|
|
||||||
{
|
|
||||||
if (SubscribedLayers.Contains(layer))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Table layerTable = layer.GetTable();
|
|
||||||
if (layerTable != null)
|
|
||||||
{
|
|
||||||
SubscribeToAnyDataSourceChange(layerTable);
|
|
||||||
SubscribedLayers.Add(layer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SubscribeToTableDataSourceChange(StandaloneTable table)
|
|
||||||
{
|
|
||||||
if (SubscribedTables.Contains(table))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Table layerTable = table.GetTable();
|
|
||||||
if (layerTable != null)
|
|
||||||
{
|
|
||||||
SubscribeToAnyDataSourceChange(layerTable);
|
|
||||||
SubscribedTables.Add(table);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SubscribeToAnyDataSourceChange(Table layerTable)
|
|
||||||
{
|
|
||||||
RowCreatedEvent.Subscribe(
|
|
||||||
(args) =>
|
|
||||||
Parent.TopLevelExceptionHandler.FireAndForget(async () =>
|
|
||||||
{
|
|
||||||
await OnRowChanged(args).ConfigureAwait(false);
|
|
||||||
}),
|
|
||||||
layerTable
|
|
||||||
);
|
|
||||||
RowChangedEvent.Subscribe(
|
|
||||||
(args) =>
|
|
||||||
Parent.TopLevelExceptionHandler.FireAndForget(async () =>
|
|
||||||
{
|
|
||||||
await OnRowChanged(args).ConfigureAwait(false);
|
|
||||||
}),
|
|
||||||
layerTable
|
|
||||||
);
|
|
||||||
RowDeletedEvent.Subscribe(
|
|
||||||
(args) =>
|
|
||||||
Parent.TopLevelExceptionHandler.FireAndForget(async () =>
|
|
||||||
{
|
|
||||||
await OnRowChanged(args).ConfigureAwait(false);
|
|
||||||
}),
|
|
||||||
layerTable
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task OnRowChanged(RowChangedEventArgs args)
|
|
||||||
{
|
|
||||||
if (args == null || MapView.Active == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the path of the edited dataset
|
|
||||||
Uri datasetPath = args.Row.GetTable().GetPath();
|
|
||||||
|
|
||||||
foreach (Layer layer in MapView.Active.Map.Layers)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (layer.GetPath() == datasetPath)
|
|
||||||
{
|
|
||||||
ChangedObjectIds[layer.URI] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (UriFormatException) // layer.GetPath() or table.GetPath() can throw this error, if data source was removed from the hard drive
|
|
||||||
{
|
|
||||||
// ignore layers with invalid source URI
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach (StandaloneTable table in MapView.Active.Map.StandaloneTables)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (table.GetPath() == datasetPath)
|
|
||||||
{
|
|
||||||
ChangedObjectIds[table.URI] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (UriFormatException) // layer.GetPath() or table.GetPath() can throw this error, if data source was removed from the hard drive
|
|
||||||
{
|
|
||||||
// ignore layers with invalid source URI
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
await RunExpirationChecks(false).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task GetIdsForLayersRemovedEvent(LayerEventsArgs args)
|
|
||||||
{
|
|
||||||
foreach (Layer layer in args.Layers)
|
|
||||||
{
|
|
||||||
ChangedObjectIds[layer.URI] = 1;
|
|
||||||
}
|
|
||||||
await RunExpirationChecks(true).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task GetIdsForStandaloneTablesRemovedEvent(StandaloneTableEventArgs args)
|
|
||||||
{
|
|
||||||
foreach (StandaloneTable table in args.Tables)
|
|
||||||
{
|
|
||||||
ChangedObjectIds[table.URI] = 1;
|
|
||||||
}
|
|
||||||
await RunExpirationChecks(true).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task GetIdsForMapPropertyChangedEvent(MapPropertyChangedEventArgs args)
|
|
||||||
{
|
|
||||||
foreach (Map map in args.Maps)
|
|
||||||
{
|
|
||||||
List<MapMember> allMapMembers = _mapMemberUtils.GetAllMapMembers(map);
|
|
||||||
foreach (MapMember member in allMapMembers)
|
|
||||||
{
|
|
||||||
ChangedObjectIds[member.URI] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await RunExpirationChecks(false).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GetIdsForLayersAddedEvent(LayerEventsArgs args)
|
|
||||||
{
|
|
||||||
foreach (Layer layer in args.Layers)
|
|
||||||
{
|
|
||||||
if (layer is FeatureLayer featureLayer)
|
|
||||||
{
|
|
||||||
SubscribeToFeatureLayerDataSourceChange(featureLayer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GetIdsForStandaloneTablesAddedEvent(StandaloneTableEventArgs args)
|
|
||||||
{
|
|
||||||
foreach (StandaloneTable table in args.Tables)
|
|
||||||
{
|
|
||||||
SubscribeToTableDataSourceChange(table);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task GetIdsForMapMemberPropertiesChangedEvent(MapMemberPropertiesChangedEventArgs args)
|
|
||||||
{
|
|
||||||
// don't subscribe to all events (e.g. expanding group, changing visibility etc.)
|
|
||||||
bool validEvent = false;
|
|
||||||
foreach (var hint in args.EventHints)
|
|
||||||
{
|
|
||||||
if (
|
|
||||||
hint == MapMemberEventHint.DataSource
|
|
||||||
|| hint == MapMemberEventHint.DefinitionQuery
|
|
||||||
|| hint == MapMemberEventHint.LabelClasses
|
|
||||||
|| hint == MapMemberEventHint.LabelVisibility
|
|
||||||
|| hint == MapMemberEventHint.Name
|
|
||||||
|| hint == MapMemberEventHint.Renderer
|
|
||||||
|| hint == MapMemberEventHint.SceneLayerType
|
|
||||||
|| hint == MapMemberEventHint.URL
|
|
||||||
)
|
|
||||||
{
|
|
||||||
validEvent = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (validEvent)
|
|
||||||
{
|
|
||||||
foreach (MapMember member in args.MapMembers)
|
|
||||||
{
|
|
||||||
ChangedObjectIds[member.URI] = 1;
|
|
||||||
}
|
|
||||||
await RunExpirationChecks(false).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ISendFilter> GetSendFilters() => _sendFilters;
|
|
||||||
|
|
||||||
public List<ICardSetting> GetSendSettings() => [];
|
|
||||||
|
|
||||||
[SuppressMessage(
|
|
||||||
"Maintainability",
|
|
||||||
"CA1506:Avoid excessive class coupling",
|
|
||||||
Justification = "Being refactored on in parallel, muting this issue so CI can pass initially."
|
|
||||||
)]
|
|
||||||
public async Task Send(string modelCardId)
|
|
||||||
{
|
|
||||||
//poc: dupe code between connectors
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (_store.GetModelById(modelCardId) is not SenderModelCard modelCard)
|
|
||||||
{
|
|
||||||
// Handle as GLOBAL ERROR at BrowserBridge
|
|
||||||
throw new InvalidOperationException("No publish model card was found.");
|
|
||||||
}
|
|
||||||
|
|
||||||
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
|
|
||||||
|
|
||||||
var sendResult = await QueuedTask
|
|
||||||
.Run(async () =>
|
|
||||||
{
|
|
||||||
using var scope = _serviceProvider.CreateScope();
|
|
||||||
scope
|
|
||||||
.ServiceProvider.GetRequiredService<IConverterSettingsStore<ArcGISConversionSettings>>()
|
|
||||||
.Initialize(
|
|
||||||
_arcGISConversionSettingsFactory.Create(
|
|
||||||
Project.Current,
|
|
||||||
MapView.Active.Map,
|
|
||||||
new CRSoffsetRotation(MapView.Active.Map)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
List<MapMember> mapMembers = modelCard
|
|
||||||
.SendFilter.NotNull()
|
|
||||||
.RefreshObjectIds()
|
|
||||||
.Select(id => (MapMember)MapView.Active.Map.FindLayer(id) ?? MapView.Active.Map.FindStandaloneTable(id))
|
|
||||||
.Where(obj => obj != null)
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
if (mapMembers.Count == 0)
|
|
||||||
{
|
|
||||||
// Handle as CARD ERROR in this function
|
|
||||||
throw new SpeckleSendFilterException(
|
|
||||||
"No objects were found to convert. Please update your publish filter!"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// subscribe to the selected layer events
|
|
||||||
foreach (MapMember mapMember in mapMembers)
|
|
||||||
{
|
|
||||||
if (mapMember is FeatureLayer featureLayer)
|
|
||||||
{
|
|
||||||
SubscribeToFeatureLayerDataSourceChange(featureLayer);
|
|
||||||
}
|
|
||||||
else if (mapMember is StandaloneTable table)
|
|
||||||
{
|
|
||||||
SubscribeToTableDataSourceChange(table);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var result = await scope
|
|
||||||
.ServiceProvider.GetRequiredService<SendOperation<MapMember>>()
|
|
||||||
.Execute(
|
|
||||||
mapMembers,
|
|
||||||
modelCard.GetSendInfo("ArcGIS"), // POC: get host app name from settings? same for GetReceiveInfo
|
|
||||||
_operationProgressManager.CreateOperationProgressEventHandler(Parent, modelCardId, cancellationToken),
|
|
||||||
cancellationToken
|
|
||||||
)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
})
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
await Commands
|
|
||||||
.SetModelSendResult(modelCardId, sendResult.RootObjId, sendResult.ConversionResults)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
// SWALLOW -> UI handles it immediately, so we do not need to handle anything for now!
|
|
||||||
// Idea for later -> when cancel called, create promise from UI to solve it later with this catch block.
|
|
||||||
// So have 3 state on UI -> Cancellation clicked -> Cancelling -> Cancelled
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
catch (Exception ex) when (!ex.IsFatal()) // UX reasons - we will report operation exceptions as model card error. We may change this later when we have more exception documentation
|
|
||||||
{
|
|
||||||
_logger.LogModelCardHandledError(ex);
|
|
||||||
await Commands.SetModelError(modelCardId, ex).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CancelSend(string modelCardId) => _cancellationManager.CancelOperation(modelCardId);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Checks if any sender model cards contain any of the changed objects. If so, also updates the changed objects hashset for each model card - this last part is important for on send change detection.
|
|
||||||
/// </summary>
|
|
||||||
private async Task RunExpirationChecks(bool idsDeleted)
|
|
||||||
{
|
|
||||||
var senders = _store.GetSenders();
|
|
||||||
List<string> expiredSenderIds = new();
|
|
||||||
string[] objectIdsList = ChangedObjectIds.Keys.ToArray();
|
|
||||||
|
|
||||||
_sendConversionCache.EvictObjects(objectIdsList);
|
|
||||||
|
|
||||||
foreach (SenderModelCard sender in senders)
|
|
||||||
{
|
|
||||||
var objIds = sender.SendFilter.NotNull().RefreshObjectIds();
|
|
||||||
var intersection = objIds.Intersect(objectIdsList).ToList();
|
|
||||||
bool isExpired = intersection.Count != 0;
|
|
||||||
if (isExpired)
|
|
||||||
{
|
|
||||||
expiredSenderIds.Add(sender.ModelCardId.NotNull());
|
|
||||||
|
|
||||||
// Update the model card object Ids
|
|
||||||
if (idsDeleted && sender.SendFilter is ArcGISSelectionFilter filter)
|
|
||||||
{
|
|
||||||
List<string> remainingObjIds = objIds.SkipWhile(x => intersection.Contains(x)).ToList();
|
|
||||||
filter.SelectedObjectIds = remainingObjIds;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
await Commands.SetModelsExpired(expiredSenderIds).ConfigureAwait(false);
|
|
||||||
ChangedObjectIds = new();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,207 +0,0 @@
|
|||||||
using ArcGIS.Core.Data;
|
|
||||||
using ArcGIS.Desktop.Framework.Threading.Tasks;
|
|
||||||
using ArcGIS.Desktop.Mapping;
|
|
||||||
using Speckle.Connectors.ArcGIS.Utils;
|
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
|
||||||
using Speckle.Connectors.DUI.Models;
|
|
||||||
using Speckle.Connectors.DUI.Models.Card;
|
|
||||||
using Speckle.Sdk;
|
|
||||||
using Speckle.Sdk.Common;
|
|
||||||
using ArcProject = ArcGIS.Desktop.Core.Project;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.Bindings;
|
|
||||||
|
|
||||||
//poc: dupe code between connectors
|
|
||||||
public class BasicConnectorBinding : IBasicConnectorBinding
|
|
||||||
{
|
|
||||||
public string Name => "baseBinding";
|
|
||||||
public IBrowserBridge Parent { get; }
|
|
||||||
|
|
||||||
public BasicConnectorBindingCommands Commands { get; }
|
|
||||||
private readonly DocumentModelStore _store;
|
|
||||||
private readonly ISpeckleApplication _speckleApplication;
|
|
||||||
|
|
||||||
public BasicConnectorBinding(DocumentModelStore store, IBrowserBridge parent, ISpeckleApplication speckleApplication)
|
|
||||||
{
|
|
||||||
_store = store;
|
|
||||||
_speckleApplication = speckleApplication;
|
|
||||||
Parent = parent;
|
|
||||||
Commands = new BasicConnectorBindingCommands(parent);
|
|
||||||
|
|
||||||
_store.DocumentChanged += (_, _) =>
|
|
||||||
parent.TopLevelExceptionHandler.FireAndForget(async () =>
|
|
||||||
{
|
|
||||||
await Commands.NotifyDocumentChanged().ConfigureAwait(false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public string GetSourceApplicationName() => _speckleApplication.Slug;
|
|
||||||
|
|
||||||
public string GetSourceApplicationVersion() => _speckleApplication.HostApplicationVersion;
|
|
||||||
|
|
||||||
public string GetConnectorVersion() => _speckleApplication.SpeckleVersion;
|
|
||||||
|
|
||||||
public DocumentInfo? GetDocumentInfo()
|
|
||||||
{
|
|
||||||
if (MapView.Active is null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new DocumentInfo(ArcProject.Current.URI, MapView.Active.Map.Name, MapView.Active.Map.URI);
|
|
||||||
}
|
|
||||||
|
|
||||||
public DocumentModelStore GetDocumentState() => _store;
|
|
||||||
|
|
||||||
public void AddModel(ModelCard model) => _store.AddModel(model);
|
|
||||||
|
|
||||||
public void UpdateModel(ModelCard model) => _store.UpdateModel(model);
|
|
||||||
|
|
||||||
public void RemoveModel(ModelCard model) => _store.RemoveModel(model);
|
|
||||||
|
|
||||||
public async Task HighlightObjects(IReadOnlyList<string> objectIds) =>
|
|
||||||
await HighlightObjectsOnView(objectIds.Select(x => new ObjectID(x)).ToList()).ConfigureAwait(false);
|
|
||||||
|
|
||||||
public async Task HighlightModel(string modelCardId)
|
|
||||||
{
|
|
||||||
var model = _store.GetModelById(modelCardId);
|
|
||||||
|
|
||||||
if (model is null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var objectIds = new List<ObjectID>();
|
|
||||||
|
|
||||||
if (model is SenderModelCard senderModelCard)
|
|
||||||
{
|
|
||||||
objectIds = senderModelCard.SendFilter.NotNull().RefreshObjectIds().Select(x => new ObjectID(x)).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (model is ReceiverModelCard receiverModelCard)
|
|
||||||
{
|
|
||||||
objectIds = receiverModelCard.BakedObjectIds.NotNull().Select(x => new ObjectID(x)).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (objectIds is null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await HighlightObjectsOnView(objectIds).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task HighlightObjectsOnView(IReadOnlyList<ObjectID> objectIds)
|
|
||||||
{
|
|
||||||
MapView mapView = MapView.Active;
|
|
||||||
|
|
||||||
await QueuedTask
|
|
||||||
.Run(async () =>
|
|
||||||
{
|
|
||||||
List<MapMemberFeature> mapMembersFeatures = GetMapMembers(objectIds, mapView);
|
|
||||||
ClearSelectionInTOC();
|
|
||||||
ClearSelection();
|
|
||||||
await SelectMapMembersInTOC(mapMembersFeatures).ConfigureAwait(false);
|
|
||||||
SelectMapMembersAndFeatures(mapMembersFeatures);
|
|
||||||
mapView.ZoomToSelected();
|
|
||||||
})
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<MapMemberFeature> GetMapMembers(IReadOnlyList<ObjectID> objectIds, MapView mapView)
|
|
||||||
{
|
|
||||||
// find the layer on the map (from the objectID) and add the featureID is available
|
|
||||||
List<MapMemberFeature> mapMembersFeatures = new();
|
|
||||||
|
|
||||||
foreach (ObjectID objectId in objectIds)
|
|
||||||
{
|
|
||||||
MapMember mapMember = mapView.Map.FindLayer(objectId.MappedLayerURI, true);
|
|
||||||
if (mapMember is null)
|
|
||||||
{
|
|
||||||
mapMember = mapView.Map.FindStandaloneTable(objectId.MappedLayerURI);
|
|
||||||
}
|
|
||||||
if (mapMember is not null)
|
|
||||||
{
|
|
||||||
MapMemberFeature mapMembersFeat = new(mapMember, objectId.FeatureId);
|
|
||||||
mapMembersFeatures.Add(mapMembersFeat);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mapMembersFeatures;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ClearSelection()
|
|
||||||
{
|
|
||||||
List<Layer> mapMembers = MapView.Active.Map.GetLayersAsFlattenedList().ToList();
|
|
||||||
foreach (var member in mapMembers)
|
|
||||||
{
|
|
||||||
if (member is FeatureLayer featureLayer)
|
|
||||||
{
|
|
||||||
featureLayer.ClearSelection();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ClearSelectionInTOC()
|
|
||||||
{
|
|
||||||
MapView.Active.ClearTOCSelection();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SelectMapMembersAndFeatures(IReadOnlyList<MapMemberFeature> mapMembersFeatures)
|
|
||||||
{
|
|
||||||
foreach (MapMemberFeature mapMemberFeat in mapMembersFeatures)
|
|
||||||
{
|
|
||||||
MapMember member = mapMemberFeat.MapMember;
|
|
||||||
if (member is FeatureLayer layer)
|
|
||||||
{
|
|
||||||
if (mapMemberFeat.FeatureId == null)
|
|
||||||
{
|
|
||||||
// select full layer if featureID not specified
|
|
||||||
layer.Select();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// query features by ID
|
|
||||||
var objectIDfield = layer.GetFeatureClass().GetDefinition().GetObjectIDField();
|
|
||||||
|
|
||||||
// FeatureID range starts from 0, but auto-assigned IDs in the layer start from 1
|
|
||||||
QueryFilter anotherQueryFilter = new() { WhereClause = $"{objectIDfield} = {mapMemberFeat.FeatureId + 1}" };
|
|
||||||
using (Selection onlyOneSelection = layer.Select(anotherQueryFilter, SelectionCombinationMethod.New)) { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task SelectMapMembersInTOC(IReadOnlyList<MapMemberFeature> mapMembersFeatures)
|
|
||||||
{
|
|
||||||
List<Layer> layers = new();
|
|
||||||
List<StandaloneTable> tables = new();
|
|
||||||
|
|
||||||
foreach (MapMemberFeature mapMemberFeat in mapMembersFeatures)
|
|
||||||
{
|
|
||||||
MapMember member = mapMemberFeat.MapMember;
|
|
||||||
if (member is Layer layer)
|
|
||||||
{
|
|
||||||
if (member is not GroupLayer) // group layer selection clears other layers selection
|
|
||||||
{
|
|
||||||
layers.Add(layer);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await QueuedTask.Run(() => layer.SetExpanded(true)).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (member is StandaloneTable table)
|
|
||||||
{
|
|
||||||
tables.Add(table);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MapView.Active.SelectLayers(layers);
|
|
||||||
|
|
||||||
// this step clears previous selection, not clear how to ADD selection instead
|
|
||||||
// this is why, activating it only if no layers are selected
|
|
||||||
if (layers.Count == 0)
|
|
||||||
{
|
|
||||||
MapView.Active.SelectStandaloneTables(tables);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<!--
|
|
||||||
|
|
||||||
Copyright 2022 Esri
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
https://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|
||||||
-->
|
|
||||||
<ArcGIS defaultAssembly="Speckle.Connectors.ArcGIS3.dll" defaultNamespace="Speckle.Connectors.ArcGIS" xmlns="http://schemas.esri.com/DADF/Registry" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.esri.com/DADF/Registry file:///C:/Program%20Files/ArcGIS/Pro/bin/ArcGIS.Desktop.Framework.xsd">
|
|
||||||
<AddInInfo id="{6CB1D25C-B8BF-4A33-9099-C1F8D1B32EFC}" version="1.0" desktopVersion="3.0.34047">
|
|
||||||
<Name>Speckle</Name>
|
|
||||||
<Description>Speckle connector for ArcGIS</Description>
|
|
||||||
<Image>Images\AddinDesktop32.png</Image>
|
|
||||||
<Author>Speckle Systems</Author>
|
|
||||||
<Company>Speckle Systems</Company>
|
|
||||||
<Date>8/5/2021 12:24:21 PM</Date>
|
|
||||||
<Subject>Framework</Subject>
|
|
||||||
<!-- Note subject can be one or more of these topics:
|
|
||||||
Content, Framework, Editing, Geodatabase, Geometry, Geoprocessing, Layouts, Map Authoring, Map Exploration -->
|
|
||||||
</AddInInfo>
|
|
||||||
<modules>
|
|
||||||
<insertModule id="ConnectorArcGIS_Module" className="SpeckleModule" autoLoad="false" caption="SpeckleModule">
|
|
||||||
<!-- uncomment to have the control hosted on a separate tab-->
|
|
||||||
<tabs>
|
|
||||||
<!--<tab id="Speckle_Tab1" caption="New Tab">
|
|
||||||
<group refID="Speckle_Group1"/>
|
|
||||||
</tab>-->
|
|
||||||
</tabs>
|
|
||||||
<groups>
|
|
||||||
<!-- comment this out if you have no controls on the Addin tab to avoid
|
|
||||||
an empty group-->
|
|
||||||
<group id="Speckle_Group1" caption="Speckle" appearsOnAddInTab="true" keytip="G1">
|
|
||||||
<!-- host controls within groups -->
|
|
||||||
<button refID="SpeckleDUI3_SpeckleDUI3OpenButton" size="large" />
|
|
||||||
</group>
|
|
||||||
</groups>
|
|
||||||
<controls>
|
|
||||||
<!-- add your controls here -->
|
|
||||||
<button id="SpeckleDUI3_SpeckleDUI3OpenButton" caption="Speckle (Beta)"
|
|
||||||
className="SpeckleDUI3OpenButton" loadOnClick="true"
|
|
||||||
keytip="B1"
|
|
||||||
smallImage="Images/s2logo_16.png"
|
|
||||||
largeImage="Images/s2logo_32.png">
|
|
||||||
<tooltip heading="Speckle Connector for ArcGIS">
|
|
||||||
<disabledText />
|
|
||||||
</tooltip>
|
|
||||||
</button>
|
|
||||||
</controls>
|
|
||||||
|
|
||||||
<dockPanes>
|
|
||||||
<dockPane id="SpeckleDUI3_SpeckleDUI3" caption="Speckle (Beta) for ArcGIS" className="SpeckleDUI3ViewModel" keytip="DockPane" initiallyVisible="true" dock="group" dockWith="esri_core_projectDockPane">
|
|
||||||
<content className="SpeckleDUI3Wrapper" />
|
|
||||||
</dockPane>
|
|
||||||
</dockPanes>
|
|
||||||
|
|
||||||
</insertModule>
|
|
||||||
</modules>
|
|
||||||
</ArcGIS>
|
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 714 B |
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,66 +0,0 @@
|
|||||||
using ArcGIS.Desktop.Mapping;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Speckle.Connectors.ArcGIS.Bindings;
|
|
||||||
using Speckle.Connectors.ArcGIS.Filters;
|
|
||||||
using Speckle.Connectors.ArcGIS.HostApp;
|
|
||||||
using Speckle.Connectors.ArcGIS.Operations.Receive;
|
|
||||||
using Speckle.Connectors.ArcGis.Operations.Send;
|
|
||||||
using Speckle.Connectors.ArcGIS.Utils;
|
|
||||||
using Speckle.Connectors.Common;
|
|
||||||
using Speckle.Connectors.Common.Builders;
|
|
||||||
using Speckle.Connectors.Common.Caching;
|
|
||||||
using Speckle.Connectors.Common.Operations;
|
|
||||||
using Speckle.Connectors.DUI;
|
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
|
||||||
using Speckle.Connectors.DUI.Models.Card.SendFilter;
|
|
||||||
using Speckle.Connectors.DUI.WebView;
|
|
||||||
using Speckle.Converters.Common;
|
|
||||||
using Speckle.Sdk.Models.GraphTraversal;
|
|
||||||
|
|
||||||
// POC: This is a temp reference to root object senders to tweak CI failing after having generic interfaces into common project.
|
|
||||||
// This should go whenever it is aligned.
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.DependencyInjection;
|
|
||||||
|
|
||||||
public static class ArcGISConnectorModule
|
|
||||||
{
|
|
||||||
public static void AddArcGIS(this IServiceCollection serviceCollection)
|
|
||||||
{
|
|
||||||
serviceCollection.AddConnectorUtils();
|
|
||||||
serviceCollection.AddDUI<ArcGISDocumentStore>();
|
|
||||||
serviceCollection.AddDUIView();
|
|
||||||
|
|
||||||
// Register bindings
|
|
||||||
serviceCollection.AddSingleton<IBinding, TestBinding>();
|
|
||||||
serviceCollection.AddSingleton<IBinding, ConfigBinding>();
|
|
||||||
serviceCollection.AddSingleton<IBinding, AccountBinding>();
|
|
||||||
serviceCollection.AddSingleton<IBinding>(sp => sp.GetRequiredService<IBasicConnectorBinding>());
|
|
||||||
serviceCollection.AddSingleton<IBasicConnectorBinding, BasicConnectorBinding>();
|
|
||||||
|
|
||||||
serviceCollection.RegisterTopLevelExceptionHandler();
|
|
||||||
serviceCollection.AddSingleton(DefaultTraversal.CreateTraversalFunc());
|
|
||||||
|
|
||||||
// register send operation and dependencies
|
|
||||||
serviceCollection.AddSingleton<IBinding, ArcGISSendBinding>();
|
|
||||||
serviceCollection.AddScoped<SendOperation<MapMember>>();
|
|
||||||
serviceCollection.AddSingleton<IBinding, ArcGISSelectionBinding>();
|
|
||||||
serviceCollection.AddTransient<ISendFilter, ArcGISSelectionFilter>();
|
|
||||||
serviceCollection.AddScoped<ArcGISRootObjectBuilder>();
|
|
||||||
serviceCollection.AddScoped<IRootObjectBuilder<MapMember>, ArcGISRootObjectBuilder>();
|
|
||||||
serviceCollection.AddScoped<ArcGISLayerUnpacker>();
|
|
||||||
serviceCollection.AddScoped<ArcGISColorUnpacker>();
|
|
||||||
// register send conversion cache
|
|
||||||
serviceCollection.AddSingleton<ISendConversionCache, SendConversionCache>();
|
|
||||||
|
|
||||||
// register receive operation and dependencies
|
|
||||||
// serviceCollection.AddSingleton<IBinding, ArcGISReceiveBinding>(); // POC: disabled until receive code is refactored
|
|
||||||
serviceCollection.AddScoped<LocalToGlobalConverterUtils>();
|
|
||||||
serviceCollection.AddScoped<ArcGISColorManager>();
|
|
||||||
serviceCollection.AddScoped<IHostObjectBuilder, ArcGISHostObjectBuilder>();
|
|
||||||
|
|
||||||
serviceCollection.AddScoped<MapMembersUtils>();
|
|
||||||
|
|
||||||
// operation progress manager
|
|
||||||
serviceCollection.AddSingleton<IOperationProgressManager, OperationProgressManager>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,356 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<Project>
|
|
||||||
<!-- Code to zip up the files-->
|
|
||||||
|
|
||||||
<UsingTask TaskName="PackageAddIn" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
|
|
||||||
<ParameterGroup>
|
|
||||||
<ZipIntermediatePath ParameterType="System.String" Required="true" />
|
|
||||||
<PackageType ParameterType="System.String" Required="true" />
|
|
||||||
<TargetFolder ParameterType="System.String" Required="true" />
|
|
||||||
<TargetFileName ParameterType="System.String" Required="true" />
|
|
||||||
<RootNamespace ParameterType="System.String" Required="true" />
|
|
||||||
<PackageOutputPath ParameterType="System.String" Output="true"/>
|
|
||||||
</ParameterGroup>
|
|
||||||
<Task>
|
|
||||||
<!-- <Reference Include="System.IO.Compression.FileSystem"/>-->
|
|
||||||
<!-- <Reference Include="System.Xml.Linq"/>-->
|
|
||||||
<!-- <Reference Include="System.Xml"/>-->
|
|
||||||
<Using Namespace="System"/>
|
|
||||||
<Using Namespace="System.IO"/>
|
|
||||||
<Using Namespace="System.Xml.Linq"/>
|
|
||||||
<Using Namespace="System.Linq"/>
|
|
||||||
<Using Namespace="System.IO.Compression"/>
|
|
||||||
<Code Type="Fragment" Language="cs">
|
|
||||||
<![CDATA[
|
|
||||||
Success = false;
|
|
||||||
string ConfigNotFound = "{0} was not found. File must be present in the root of the project and its build action set to AddInContent.";
|
|
||||||
string ZipIntermediatePathNotFound = "{0} was not found.";
|
|
||||||
string DefaultAssemblyDoesNotMatch = "Your value of '{0}' for the '{1}' attribute in the {2} does not match the assembly name '{3}' set for your project.";
|
|
||||||
string DefaultNSDoesNotMatch = "Your value of '{0}' for the '{1}' attribute in the {2} does not match the default namespace '{3}' set for your project.";
|
|
||||||
//Create the name of the Config File and extension
|
|
||||||
string extension = "";
|
|
||||||
string config = "";
|
|
||||||
string attrib_asm = "";
|
|
||||||
string attrib_ns = "";
|
|
||||||
var assemblyValMissing = "";
|
|
||||||
var nsValMissing = "";
|
|
||||||
if (PackageType.ToLower() == "plugin")
|
|
||||||
{
|
|
||||||
Log.LogMessage(MessageImportance.Low, "This is an plugin");
|
|
||||||
config = "Config.xml";
|
|
||||||
extension = ".esriPlugin";
|
|
||||||
attrib_asm = "library";
|
|
||||||
attrib_ns = "namespace";
|
|
||||||
assemblyValMissing = "AddIn element 'library' attribute not found";
|
|
||||||
nsValMissing = "AddIn element 'namespace' attribute not found";
|
|
||||||
}
|
|
||||||
else if (PackageType.ToLower() == "configuration")
|
|
||||||
{
|
|
||||||
Log.LogMessage(MessageImportance.Low, "This is an configuration");
|
|
||||||
config = "Config.daml";
|
|
||||||
extension = ".proConfigX";
|
|
||||||
attrib_asm = "defaultAssembly";
|
|
||||||
attrib_ns = "defaultNamespace";
|
|
||||||
assemblyValMissing = "ArcGIS element 'defaultAssembly' attribute not found";
|
|
||||||
nsValMissing = "ArcGIS element 'defaultNamespace' attribute not found";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Log.LogMessage(MessageImportance.Low, "This is an addin");
|
|
||||||
config = "Config.daml";
|
|
||||||
bool proSDKProject = File.Exists(Path.Combine(ZipIntermediatePath, config));
|
|
||||||
if (!proSDKProject) //This might be a class library that uses the Pro references only
|
|
||||||
return true;
|
|
||||||
extension = ".esriAddinX";
|
|
||||||
attrib_asm = "defaultAssembly";
|
|
||||||
attrib_ns = "defaultNamespace";
|
|
||||||
assemblyValMissing = "ArcGIS element 'defaultAssembly' attribute not found";
|
|
||||||
nsValMissing = "ArcGIS element 'defaultNamespace' attribute not found";
|
|
||||||
}
|
|
||||||
// Check if Config.daml exists in ZipFolder
|
|
||||||
ZipIntermediatePath = Path.GetFullPath(ZipIntermediatePath);
|
|
||||||
if (!Directory.Exists(ZipIntermediatePath))
|
|
||||||
{
|
|
||||||
Log.LogError(ZipIntermediatePathNotFound, ZipIntermediatePath);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
var addInXML = Path.Combine(ZipIntermediatePath, config);
|
|
||||||
Log.LogMessage(MessageImportance.Low, "addInXML: " + addInXML);
|
|
||||||
Log.LogMessage(MessageImportance.High, "PackageType: " + PackageType);
|
|
||||||
if (!File.Exists(addInXML))
|
|
||||||
{
|
|
||||||
Log.LogError(ConfigNotFound, config);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
//Verfiy that an assembly with the name defined in the Config.daml
|
|
||||||
//matches the default assembly set in the project. Ditto for the
|
|
||||||
//namespace
|
|
||||||
string DefaultAssembly = "";
|
|
||||||
string DefaultNamespace = "";
|
|
||||||
XDocument xdoc = XDocument.Load(addInXML);
|
|
||||||
XNamespace DefaultNS = "http://schemas.esri.com/DADF/Registry";
|
|
||||||
if (PackageType.ToLower() == "plugin")
|
|
||||||
{
|
|
||||||
var addin = xdoc.Root.Element(DefaultNS + "AddIn");
|
|
||||||
if (addin != null)
|
|
||||||
{
|
|
||||||
var val = addin.Attribute("library");
|
|
||||||
if (val != null)
|
|
||||||
DefaultAssembly = val.Value;
|
|
||||||
val = addin.Attribute("namespace");
|
|
||||||
if (val != null)
|
|
||||||
DefaultNamespace = val.Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var val = xdoc.Root.Attribute("defaultAssembly");
|
|
||||||
if (val != null)
|
|
||||||
DefaultAssembly = val.Value;
|
|
||||||
val = xdoc.Root.Attribute("defaultNamespace");
|
|
||||||
if (val != null)
|
|
||||||
DefaultNamespace = val.Value;
|
|
||||||
}
|
|
||||||
if (string.IsNullOrEmpty(DefaultAssembly))
|
|
||||||
{
|
|
||||||
Log.LogError(assemblyValMissing);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (string.IsNullOrEmpty(DefaultNamespace))
|
|
||||||
{
|
|
||||||
Log.LogError(nsValMissing);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//check that the addin assembly and default assembly names match
|
|
||||||
if (DefaultAssembly.ToLower() != TargetFileName.ToLower())
|
|
||||||
{
|
|
||||||
Log.LogWarning(DefaultAssemblyDoesNotMatch, DefaultAssembly, attrib_asm, config, TargetFileName);
|
|
||||||
}
|
|
||||||
//Ditto for namespace
|
|
||||||
if (DefaultNamespace.ToLower() != RootNamespace.ToLower())
|
|
||||||
{
|
|
||||||
Log.LogWarning(DefaultNSDoesNotMatch, DefaultNamespace, attrib_ns, config, RootNamespace);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Directory.Exists(TargetFolder))
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory(TargetFolder);
|
|
||||||
}
|
|
||||||
|
|
||||||
string addInAssembly = System.IO.Path.GetFileNameWithoutExtension(DefaultAssembly);
|
|
||||||
string archiveName = addInAssembly + extension;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string file = Path.Combine(TargetFolder, archiveName);
|
|
||||||
if (File.Exists(file))
|
|
||||||
File.Delete(file);
|
|
||||||
System.IO.Compression.ZipFile.CreateFromDirectory(ZipIntermediatePath, file);
|
|
||||||
PackageOutputPath = Path.GetFullPath(file);
|
|
||||||
Success = true;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Log.LogErrorFromException(ex);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
]]>
|
|
||||||
</Code>
|
|
||||||
</Task>
|
|
||||||
</UsingTask>
|
|
||||||
<!-- Code to find relative path-->
|
|
||||||
<UsingTask TaskName="ConvertToRelativePath" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
|
|
||||||
<ParameterGroup>
|
|
||||||
<RelativeTo ParameterType="System.String" Required="true"/>
|
|
||||||
<Paths ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
|
|
||||||
<RelativePaths ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true"/>
|
|
||||||
</ParameterGroup>
|
|
||||||
<Task>
|
|
||||||
<Using Namespace="System"/>
|
|
||||||
<Using Namespace="System.IO"/>
|
|
||||||
<Using Namespace="System.Linq"/>
|
|
||||||
<Code Type="Fragment" Language="cs">
|
|
||||||
<![CDATA[
|
|
||||||
var result = new List<ITaskItem>();
|
|
||||||
System.Uri relativeTo = new Uri(this.RelativeTo);
|
|
||||||
foreach (var i in Paths) {
|
|
||||||
try {
|
|
||||||
System.Uri itemFullPath = new Uri(i.GetMetadata("FullPath"));
|
|
||||||
var relativeUri = relativeTo.MakeRelativeUri(itemFullPath);
|
|
||||||
|
|
||||||
result.Add(new TaskItem(Uri.UnescapeDataString(relativeUri.ToString())));
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RelativePaths = result.ToArray();
|
|
||||||
foreach (var i in RelativePaths)
|
|
||||||
{
|
|
||||||
Log.LogMessage(MessageImportance.Low, "RelativePaths: " + i.ToString());
|
|
||||||
}
|
|
||||||
Success = true;
|
|
||||||
]]>
|
|
||||||
</Code>
|
|
||||||
</Task>
|
|
||||||
</UsingTask>
|
|
||||||
<UsingTask TaskName="CleanAddIn" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
|
|
||||||
<ParameterGroup>
|
|
||||||
<ProjectDir ParameterType="System.String" Required="true"/>
|
|
||||||
<AssemblyName ParameterType="System.String" Required="true"/>
|
|
||||||
<PackageType ParameterType="System.String" Required="true"/>
|
|
||||||
<!--<ArcGISFolder ParameterType="System.String" Output="true" /> -->
|
|
||||||
<CleanInfo ParameterType="System.String" Output="true"/>
|
|
||||||
</ParameterGroup>
|
|
||||||
<Task>
|
|
||||||
<!-- <Reference Include="System.Xml.Linq"/>-->
|
|
||||||
<!-- <Reference Include="System.Xml"/>-->
|
|
||||||
<Using Namespace="System"/>
|
|
||||||
<Using Namespace="System.IO"/>
|
|
||||||
<Using Namespace="System.Xml.Linq"/>
|
|
||||||
<Using Namespace="System.Linq"/>
|
|
||||||
<Code Type="Fragment" Language="cs">
|
|
||||||
<![CDATA[
|
|
||||||
Success = false;
|
|
||||||
string ConfigNotFound = "{0} was not found. File must be present in the root of the project and its build action set to AddInContent.";
|
|
||||||
|
|
||||||
//Create the name of the Config File and extension
|
|
||||||
string extension = "";
|
|
||||||
string config = "";
|
|
||||||
|
|
||||||
if (PackageType.ToLower() == "plugin")
|
|
||||||
{
|
|
||||||
config = "Config.xml";
|
|
||||||
extension = ".esriPlugin";
|
|
||||||
}
|
|
||||||
else if (PackageType.ToLower() == "configuration")
|
|
||||||
{
|
|
||||||
config = "Config.daml";
|
|
||||||
extension = ".proConfigX";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
config = "Config.daml";
|
|
||||||
bool proSDKProject = File.Exists(Path.Combine(ProjectDir, config));
|
|
||||||
if (!proSDKProject) //This might be a class library that uses the Pro references only
|
|
||||||
return true;
|
|
||||||
extension = ".esriAddinX";
|
|
||||||
}
|
|
||||||
|
|
||||||
var addInXML = Path.Combine(ProjectDir, config);
|
|
||||||
if (!File.Exists(addInXML))
|
|
||||||
{
|
|
||||||
Log.LogError(ConfigNotFound, config);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Get the add-in id
|
|
||||||
XDocument xdoc = XDocument.Load(addInXML);
|
|
||||||
XNamespace DefaultNS = "http://schemas.esri.com/DADF/Registry";
|
|
||||||
if (PackageType.ToLower() == "plugin")
|
|
||||||
{
|
|
||||||
Log.LogMessage("process plugin");
|
|
||||||
var addInID = xdoc.Root.Element(DefaultNS + "AddInID");
|
|
||||||
CleanInfo = addInID.Value;//let it error if it's missing
|
|
||||||
}
|
|
||||||
else if (PackageType.ToLower() == "addin")
|
|
||||||
{
|
|
||||||
Log.LogMessage("process addin");
|
|
||||||
var addinInfo = xdoc.Root.Element(DefaultNS + "AddInInfo");
|
|
||||||
CleanInfo = addinInfo.Attribute("id").Value;//let it error if it's missing
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Log.LogMessage("process configuration");
|
|
||||||
CleanInfo = AssemblyName + extension;
|
|
||||||
}
|
|
||||||
Success = true;
|
|
||||||
]]>
|
|
||||||
</Code>
|
|
||||||
</Task>
|
|
||||||
</UsingTask>
|
|
||||||
<!-- Define additional BuildAction option -->
|
|
||||||
<!-- Set up default zip properties -->
|
|
||||||
<PropertyGroup>
|
|
||||||
<PackageType Condition="'$(PackageType)' == ''">Addin</PackageType>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<ArcGISFolder>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\ESRI\ArcGISPro', 'InstallDir', null, RegistryView.Registry64))\bin</ArcGISFolder>
|
|
||||||
<ArcGISFolder Condition="'$(ArcGISFolder)' == ''">$(registry:HKEY_CURRENT_USER\SOFTWARE\ESRI\ArcGISPro@InstallDir)\bin</ArcGISFolder>
|
|
||||||
<ArcGISFolder Condition="'$(ArcGISFolder)' == '' Or !Exists('$(ArcGISFolder)\RegisterAddIn.exe')">$(ProgramData)\EsriProCommon\</ArcGISFolder>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Target Name="ArcGISInstallOutput" AfterTargets="Build">
|
|
||||||
<Message Text="IntermediateOutputPath Name: $(IntermediateOutputPath)..." Importance="High"/>
|
|
||||||
<Message Text="CleanFile Name: $(CleanFile)..." Importance="High"/>
|
|
||||||
<Message Text="ProjectDir Name: $(ProjectDir)..." Importance="High"/>
|
|
||||||
<Message Text="AssemblyName Name: $(AssemblyName)..." Importance="High"/>
|
|
||||||
<Message Text="TargetFileName Name: $(TargetFileName)..." Importance="High"/>
|
|
||||||
<Message Text="RootNamespace: $(RootNamespace)..." Importance="High"/>
|
|
||||||
<Message Text="TargetFolder Name: $(OutDir)..." Importance="High"/>
|
|
||||||
<Message Text="PackageType Name: $(PackageType)..." Importance="High"/>
|
|
||||||
<Message Text="Install dir: $(ArcGISFolder)" Importance="High"/>
|
|
||||||
<!-- Get a list of project outputs from the cache file and FileWritesXXX item,
|
|
||||||
excluding those in intermediate output directory -->
|
|
||||||
<!-- Note clean file may miss listing CopyLocal reference -->
|
|
||||||
<ReadLinesFromFile File="$(IntermediateOutputPath)$(CleanFile)">
|
|
||||||
<Output TaskParameter="Lines" ItemName="CacheOutputFiles" />
|
|
||||||
</ReadLinesFromFile>
|
|
||||||
<FindUnderPath Files="@(CacheOutputFiles)" Path="$(OutDir)">
|
|
||||||
<Output TaskParameter="InPath" ItemName="PackageOutputFiles" />
|
|
||||||
</FindUnderPath>
|
|
||||||
<FindUnderPath Files="@(FileWrites->'%(FullPath)')" Path="$(OutDir)">
|
|
||||||
<Output TaskParameter="InPath" ItemName="PackageOutputFiles" />
|
|
||||||
</FindUnderPath>
|
|
||||||
<FindUnderPath Files="@(FileWritesShareable->'%(FullPath)')" Path="$(OutDir)">
|
|
||||||
<Output TaskParameter="InPath" ItemName="PackageOutputFiles" />
|
|
||||||
</FindUnderPath>
|
|
||||||
<RemoveDuplicates Inputs="@(PackageOutputFiles)">
|
|
||||||
<Output TaskParameter="Filtered" ItemName="FilteredPackageOutputFiles" />
|
|
||||||
</RemoveDuplicates>
|
|
||||||
<ConvertToRelativePath Paths="@(FilteredPackageOutputFiles)" RelativeTo="$(TargetDir)">
|
|
||||||
<Output TaskParameter="RelativePaths" ItemName="ConfigBinaries" />
|
|
||||||
</ConvertToRelativePath>
|
|
||||||
<Message Text="ConvertToRelativePath Task, TargetDir: $(TargetDir) " Importance="High"/>
|
|
||||||
</Target>
|
|
||||||
<Target Name="PackageArcGISContents" AfterTargets="ArcGISInstallOutput">
|
|
||||||
<Message Text="Running PackageArcGISContents..." Importance="High"/>
|
|
||||||
<RemoveDir Condition="Exists('$(ZipIntermediatePath)')" Directories="$(ZipIntermediatePath)" />
|
|
||||||
<Message Text="ZipIntermediatePath: $(ZipIntermediatePath)Install..." Importance="High"/>
|
|
||||||
<!-- Copy project output files, preserving folder structure -->
|
|
||||||
<Copy SourceFiles="@(ConfigBinaries->'$(OutDir)%(Identity)')" ContinueOnError="true" DestinationFolder="$(IntermediateOutputPath)temp_archive\Install\%(RelativeDir)" />
|
|
||||||
<!-- Copy items marked with Content as BuildAction, preserving folder structure & handling linked items -->
|
|
||||||
<!-- Only include items that have CopyToOutputDirectory as Never -->
|
|
||||||
<Copy SourceFiles="@(Content)" Condition="'%(Content.Link)' == '' And ('%(Content.CopyToOutputDirectory)' == 'Never' Or '%(Content.CopyToOutputDirectory)' == '')" DestinationFolder="$(IntermediateOutputPath)temp_archive\%(RelativeDir)" ContinueOnError="true" />
|
|
||||||
<Copy SourceFiles="@(Content)" Condition="'%(Content.Link)' != '' And ('%(Content.CopyToOutputDirectory)' == 'Never' Or '%(Content.CopyToOutputDirectory)' == '')" DestinationFiles="$(IntermediateOutputPath)temp_archive\%(Content.Link)" ContinueOnError="true"/>
|
|
||||||
<!-- Zipping up add-in resources -->
|
|
||||||
<PackageAddIn ZipIntermediatePath="$(IntermediateOutputPath)temp_archive\"
|
|
||||||
PackageType="$(PackageType)"
|
|
||||||
TargetFolder="$(OutDir)"
|
|
||||||
TargetFileName="$(TargetFileName)"
|
|
||||||
RootNamespace="$(RootNamespace)">
|
|
||||||
<Output TaskParameter="PackageOutputPath" PropertyName="PackageFile" />
|
|
||||||
</PackageAddIn>
|
|
||||||
<!-- Shell out to RegisterAddIn.exe to install the package -->
|
|
||||||
<Message Text="Deploying $(PackageType)..." Importance="High"/>
|
|
||||||
<Message Text="ArcGISFolder Name: $(ArcGISFolder)..." Importance="High"/>
|
|
||||||
<Message Text="Unable to execute RegisterAddIn.exe. ArcGIS Pro is not installed." Importance="High" Condition="!Exists('$(ArcGISFolder)')"/>
|
|
||||||
<Message Text="Execute RegisterAddIn.exe "$(PackageFile)" /s..." Importance="High" Condition="Exists('$(ArcGISFolder)')"/>
|
|
||||||
<Exec IgnoreExitCode="true" WorkingDirectory="$(ArcGISFolder)" Command="RegisterAddIn.exe "$(PackageFile)" /s" Condition="Exists('$(ArcGISFolder)') AND $(PackageFile) != '' ">
|
|
||||||
<Output TaskParameter="ExitCode" PropertyName="ESRIRegAddinExitCode" />
|
|
||||||
</Exec>
|
|
||||||
<RemoveDir Condition="Exists('$(ZipIntermediatePath)')" Directories="$(ZipIntermediatePath)" />
|
|
||||||
</Target>
|
|
||||||
<Target Name="CleanArcGISContents" AfterTargets="Clean">
|
|
||||||
<CleanAddIn ProjectDir="$(ProjectDir)"
|
|
||||||
AssemblyName="$(AssemblyName)"
|
|
||||||
PackageType="$(PackageType)">
|
|
||||||
<Output TaskParameter="CleanInfo" PropertyName="CleanInfo" />
|
|
||||||
</CleanAddIn>
|
|
||||||
<Message Text="Clean $(PackageType).$(ArcGISFolder).." Importance="High"/>
|
|
||||||
<Message Text="Execute RegisterAddIn.exe "$(CleanInfo)" /u..." Importance="High" Condition="Exists('$(ArcGISFolder)')"/>
|
|
||||||
<Message Text="Unable to execute RegisterAddIn.exe. ArcGIS Pro is not installed." Importance="High" Condition="!Exists('$(ArcGISFolder)')"/>
|
|
||||||
<Exec IgnoreExitCode="true" WorkingDirectory="$(ArcGISFolder)" Command="RegisterAddIn.exe "$(CleanInfo)" /u /s" Condition="Exists('$(ArcGISFolder)') AND $(CleanInfo) != ''">
|
|
||||||
<Output TaskParameter="ExitCode" PropertyName="ESRIRegAddinExitCode" />
|
|
||||||
</Exec>
|
|
||||||
</Target>
|
|
||||||
</Project>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
global using AC = ArcGIS.Core;
|
|
||||||
global using ACD = ArcGIS.Core.Data;
|
|
||||||
global using ADM = ArcGIS.Desktop.Mapping;
|
|
||||||
@@ -1,270 +0,0 @@
|
|||||||
using System.Drawing;
|
|
||||||
using ArcGIS.Core.CIM;
|
|
||||||
using ArcGIS.Desktop.Mapping;
|
|
||||||
using Speckle.Connectors.Common.Operations;
|
|
||||||
using Speckle.Converters.ArcGIS3.Utils;
|
|
||||||
using Speckle.Objects;
|
|
||||||
using Speckle.Objects.Other;
|
|
||||||
using Speckle.Sdk.Models.Collections;
|
|
||||||
using Speckle.Sdk.Models.Extensions;
|
|
||||||
using Speckle.Sdk.Models.GraphTraversal;
|
|
||||||
using Speckle.Sdk.Models.Proxies;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.HostApp;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// TODO: definitely need to refactor this, probably will collect colors during layer iteration in the root object builder.
|
|
||||||
/// </summary>
|
|
||||||
public class ArcGISColorManager
|
|
||||||
{
|
|
||||||
public Dictionary<string, Color> ObjectColorsIdMap { get; set; } = new();
|
|
||||||
public Dictionary<string, Color> ObjectMaterialsIdMap { get; set; } = new();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Parse Color Proxies and stores in ObjectColorsIdMap the relationship between object ids and colors
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="colorProxies"></param>
|
|
||||||
/// <param name="onOperationProgressed"></param>
|
|
||||||
public async Task ParseColors(List<ColorProxy> colorProxies, IProgress<CardProgress> onOperationProgressed)
|
|
||||||
{
|
|
||||||
// injected as Singleton, so we need to clean existing proxies first
|
|
||||||
ObjectColorsIdMap = new();
|
|
||||||
var count = 0;
|
|
||||||
foreach (ColorProxy colorProxy in colorProxies)
|
|
||||||
{
|
|
||||||
onOperationProgressed.Report(new("Converting colors", (double)++count / colorProxies.Count));
|
|
||||||
await Task.Yield();
|
|
||||||
foreach (string objectId in colorProxy.objects)
|
|
||||||
{
|
|
||||||
Color convertedColor = Color.FromArgb(colorProxy.value);
|
|
||||||
ObjectColorsIdMap.TryAdd(objectId, convertedColor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Parse Color renderMaterials and stores in ObjectMaterialsIdMap the relationship between object ids and colors
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="materialProxies"></param>
|
|
||||||
/// <param name="onOperationProgressed"></param>
|
|
||||||
public async Task ParseMaterials(
|
|
||||||
List<RenderMaterialProxy> materialProxies,
|
|
||||||
IProgress<CardProgress> onOperationProgressed
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// injected as Singleton, so we need to clean existing proxies first
|
|
||||||
ObjectMaterialsIdMap = new();
|
|
||||||
var count = 0;
|
|
||||||
foreach (RenderMaterialProxy colorProxy in materialProxies)
|
|
||||||
{
|
|
||||||
onOperationProgressed.Report(new("Converting materials", (double)++count / materialProxies.Count));
|
|
||||||
await Task.Yield();
|
|
||||||
foreach (string objectId in colorProxy.objects)
|
|
||||||
{
|
|
||||||
Color convertedColor = Color.FromArgb(colorProxy.value.diffuse);
|
|
||||||
ObjectMaterialsIdMap.TryAdd(objectId, convertedColor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int CIMColorToInt(CIMColor color)
|
|
||||||
{
|
|
||||||
return (255 << 24)
|
|
||||||
| ((int)Math.Round(color.Values[0]) << 16)
|
|
||||||
| ((int)Math.Round(color.Values[1]) << 8)
|
|
||||||
| (int)Math.Round(color.Values[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a new CIMUniqueValueClass for UniqueRenderer per each object ID
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tc"></param>
|
|
||||||
/// <param name="speckleGeometryType"></param>
|
|
||||||
private CIMUniqueValueClass CreateColorCategory(
|
|
||||||
TraversalContext tc,
|
|
||||||
esriGeometryType speckleGeometryType,
|
|
||||||
string uniqueLabel
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// declare default white color
|
|
||||||
Color color = Color.FromArgb(255, 255, 255, 255);
|
|
||||||
bool colorFound = false;
|
|
||||||
|
|
||||||
// get color moving upwards from the object
|
|
||||||
foreach (var parent in tc.GetAscendants())
|
|
||||||
{
|
|
||||||
if (parent.applicationId is string appId)
|
|
||||||
{
|
|
||||||
if (ObjectMaterialsIdMap.TryGetValue(appId, out Color objColorMaterial))
|
|
||||||
{
|
|
||||||
color = objColorMaterial;
|
|
||||||
colorFound = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (ObjectColorsIdMap.TryGetValue(appId, out Color objColor))
|
|
||||||
{
|
|
||||||
color = objColor;
|
|
||||||
colorFound = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// handling Revit case, where child objects have separate colors/materials
|
|
||||||
if (!colorFound && tc.Current is IDataObject)
|
|
||||||
{
|
|
||||||
var displayable = tc.Current.TryGetDisplayValue();
|
|
||||||
if (displayable != null)
|
|
||||||
{
|
|
||||||
foreach (var childObj in displayable)
|
|
||||||
{
|
|
||||||
if (childObj.applicationId is string appId)
|
|
||||||
{
|
|
||||||
if (ObjectMaterialsIdMap.TryGetValue(appId, out Color objColorMaterial))
|
|
||||||
{
|
|
||||||
color = objColorMaterial;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (ObjectColorsIdMap.TryGetValue(appId, out Color objColor))
|
|
||||||
{
|
|
||||||
color = objColor;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CIMSymbolReference symbol = CreateSymbol(speckleGeometryType, color);
|
|
||||||
|
|
||||||
// First create a "CIMUniqueValueClass"
|
|
||||||
List<CIMUniqueValue> listUniqueValues = new() { new CIMUniqueValue { FieldValues = new string[] { uniqueLabel } } };
|
|
||||||
|
|
||||||
CIMUniqueValueClass newUniqueValueClass =
|
|
||||||
new()
|
|
||||||
{
|
|
||||||
Editable = true,
|
|
||||||
Label = uniqueLabel,
|
|
||||||
Patch = PatchShape.Default,
|
|
||||||
Symbol = symbol,
|
|
||||||
Visible = true,
|
|
||||||
Values = listUniqueValues.ToArray()
|
|
||||||
};
|
|
||||||
return newUniqueValueClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a Symbol from GeometryType and Color
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="speckleGeometryType"></param>
|
|
||||||
/// <param name="color"></param>
|
|
||||||
private CIMSymbolReference CreateSymbol(esriGeometryType speckleGeometryType, Color color)
|
|
||||||
{
|
|
||||||
var symbol = SymbolFactory
|
|
||||||
.Instance.ConstructPointSymbol(ColorFactory.Instance.CreateColor(color))
|
|
||||||
.MakeSymbolReference();
|
|
||||||
|
|
||||||
switch (speckleGeometryType)
|
|
||||||
{
|
|
||||||
case esriGeometryType.esriGeometryLine:
|
|
||||||
case esriGeometryType.esriGeometryPolyline:
|
|
||||||
symbol = SymbolFactory
|
|
||||||
.Instance.ConstructLineSymbol(ColorFactory.Instance.CreateColor(color))
|
|
||||||
.MakeSymbolReference();
|
|
||||||
break;
|
|
||||||
case esriGeometryType.esriGeometryPolygon:
|
|
||||||
case esriGeometryType.esriGeometryMultiPatch:
|
|
||||||
symbol = SymbolFactory
|
|
||||||
.Instance.ConstructPolygonSymbol(ColorFactory.Instance.CreateColor(color))
|
|
||||||
.MakeSymbolReference();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return symbol;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Add CIMUniqueValueClass to Layer Renderer (if exists); apply Renderer to Layer (again)
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="tc"></param>
|
|
||||||
/// <param name="trackerItem"></param>
|
|
||||||
public CIMUniqueValueRenderer? CreateOrEditLayerRenderer(
|
|
||||||
TraversalContext tc,
|
|
||||||
ObjectConversionTracker trackerItem,
|
|
||||||
CIMRenderer? existingRenderer
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (trackerItem.HostAppMapMember is not FeatureLayer fLayer)
|
|
||||||
{
|
|
||||||
// do nothing with non-feature layers
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// declare default grey color, create default symbol for the given layer geometry type
|
|
||||||
var color = Color.FromArgb(CIMColorToInt(ColorFactory.Instance.GreyRGB));
|
|
||||||
CIMSymbolReference defaultSymbol = CreateSymbol(fLayer.ShapeType, color);
|
|
||||||
|
|
||||||
// get existing renderer classes
|
|
||||||
List<CIMUniqueValueClass> listUniqueValueClasses = new() { };
|
|
||||||
if (existingRenderer is CIMUniqueValueRenderer uniqueRenderer)
|
|
||||||
{
|
|
||||||
if (uniqueRenderer.Groups[0].Classes != null)
|
|
||||||
{
|
|
||||||
listUniqueValueClasses.AddRange(uniqueRenderer.Groups[0].Classes.ToList());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add new CIMUniqueValueClass (or multiple, if it's a Collection with elements, e.g. VectorLayer)
|
|
||||||
List<TraversalContext> traversalContexts = new();
|
|
||||||
if (tc.Current is Collection collection)
|
|
||||||
{
|
|
||||||
foreach (var element in collection.elements)
|
|
||||||
{
|
|
||||||
TraversalContext newTc = new(element, "elements", tc);
|
|
||||||
traversalContexts.Add(newTc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
traversalContexts.Add(tc);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var tContext in traversalContexts)
|
|
||||||
{
|
|
||||||
// get unique label
|
|
||||||
string? uniqueLabel = tContext.Current?.id;
|
|
||||||
|
|
||||||
// remove any GIS-specific classes for now
|
|
||||||
/*
|
|
||||||
if (tContext.Current is IGisFeature gisFeat)
|
|
||||||
{
|
|
||||||
var existingLabel = gisFeat.attributes["Speckle_ID"];
|
|
||||||
if (existingLabel is string stringLabel)
|
|
||||||
{
|
|
||||||
uniqueLabel = stringLabel;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if (uniqueLabel is not null && !listUniqueValueClasses.Select(x => x.Label).Contains(uniqueLabel))
|
|
||||||
{
|
|
||||||
CIMUniqueValueClass newUniqueValueClass = CreateColorCategory(tContext, fLayer.ShapeType, uniqueLabel);
|
|
||||||
listUniqueValueClasses.Add(newUniqueValueClass);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a list of CIMUniqueValueGroup
|
|
||||||
CIMUniqueValueGroup uvg = new() { Classes = listUniqueValueClasses.ToArray(), Heading = "Speckle_ID" };
|
|
||||||
List<CIMUniqueValueGroup> listUniqueValueGroups = new() { uvg };
|
|
||||||
// Create the CIMUniqueValueRenderer
|
|
||||||
CIMUniqueValueRenderer uvr =
|
|
||||||
new()
|
|
||||||
{
|
|
||||||
UseDefaultSymbol = true,
|
|
||||||
DefaultLabel = "all other values",
|
|
||||||
DefaultSymbol = defaultSymbol,
|
|
||||||
Groups = listUniqueValueGroups.ToArray(),
|
|
||||||
Fields = new string[] { "Speckle_ID" }
|
|
||||||
};
|
|
||||||
return uvr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,460 +0,0 @@
|
|||||||
using ArcGIS.Desktop.Mapping;
|
|
||||||
using Speckle.Sdk.Models.Proxies;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.HostApp;
|
|
||||||
|
|
||||||
public class ArcGISColorUnpacker
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Cache of all color proxies for converted features. Key is the Color proxy argb value.
|
|
||||||
/// </summary>
|
|
||||||
public Dictionary<int, ColorProxy> ColorProxyCache { get; } = new();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Stores the current renderer (determined by mapMember)
|
|
||||||
/// </summary>
|
|
||||||
private AC.CIM.CIMRenderer? StoredRenderer { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Stores the current renderer (determined by tin mapmember)
|
|
||||||
/// </summary>
|
|
||||||
private AC.CIM.CIMTinRenderer? StoredTinRenderer { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Stores the used renderer fields from the layer
|
|
||||||
/// </summary>
|
|
||||||
private List<string> StoredRendererFields { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Stores an already processed color for current mapMember, to dbe used by all mapMember objects. Only applies to simple type renderers
|
|
||||||
/// </summary>
|
|
||||||
private int? StoredColor { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Stores a feature layer renderer to be used by <see cref="ProcessFeatureLayerColor"/> in <see cref="StoredRenderer"/>, any fields used by the renderer from the layer, and resets the <see cref="StoredColor"/> and <see cref="StoredRendererFields"/>
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="featureLayer"></param>
|
|
||||||
/// <exception cref="AC.CalledOnWrongThreadException">Must be called on MCT.</exception>
|
|
||||||
public void StoreRendererAndFields(ADM.FeatureLayer featureLayer)
|
|
||||||
{
|
|
||||||
// field names are unique, but often their alias is used instead by renderer headings
|
|
||||||
// so we are storing both names and alias in this dictionary for fast lookup
|
|
||||||
// POC: adding aliases are not optimal, because they do not need to be unique && they can be the same as the name of another field
|
|
||||||
Dictionary<string, string> layerFieldDictionary = new();
|
|
||||||
foreach (ADM.FieldDescription field in featureLayer.GetFieldDescriptions())
|
|
||||||
{
|
|
||||||
layerFieldDictionary.TryAdd(field.Name, field.Name);
|
|
||||||
layerFieldDictionary.TryAdd(field.Alias, field.Name);
|
|
||||||
}
|
|
||||||
|
|
||||||
// clear stored values
|
|
||||||
StoredRendererFields = new();
|
|
||||||
StoredColor = null;
|
|
||||||
StoredRenderer = null;
|
|
||||||
|
|
||||||
AC.CIM.CIMRenderer layerRenderer = featureLayer.GetRenderer();
|
|
||||||
List<string> fields = new();
|
|
||||||
bool isSupported = false;
|
|
||||||
switch (layerRenderer)
|
|
||||||
{
|
|
||||||
case AC.CIM.CIMSimpleRenderer:
|
|
||||||
isSupported = true;
|
|
||||||
break;
|
|
||||||
case AC.CIM.CIMUniqueValueRenderer uniqueValueRenderer:
|
|
||||||
isSupported = true;
|
|
||||||
fields = uniqueValueRenderer.Fields.ToList();
|
|
||||||
break;
|
|
||||||
case AC.CIM.CIMClassBreaksRenderer classBreaksRenderer:
|
|
||||||
isSupported = true;
|
|
||||||
fields.Add(classBreaksRenderer.Field);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// TODO: log error here that a renderer is unsupported
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isSupported)
|
|
||||||
{
|
|
||||||
StoredRenderer = layerRenderer;
|
|
||||||
foreach (string field in fields)
|
|
||||||
{
|
|
||||||
if (layerFieldDictionary.TryGetValue(field, out string? fieldName))
|
|
||||||
{
|
|
||||||
StoredRendererFields.Add(fieldName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Stores a las layer renderer to be used by <see cref="ProcessLasLayerColor"/> in <see cref="StoredTinRenderer"/>
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="lasLayer"></param>
|
|
||||||
/// <exception cref="AC.CalledOnWrongThreadException">Must be called on MCT.</exception>
|
|
||||||
public void StoreRenderer(ADM.LasDatasetLayer lasLayer)
|
|
||||||
{
|
|
||||||
// clear stored values
|
|
||||||
StoredTinRenderer = null;
|
|
||||||
|
|
||||||
// POC: not sure why we are only using the first renderer here
|
|
||||||
AC.CIM.CIMTinRenderer layerRenderer = lasLayer.GetRenderers()[0];
|
|
||||||
bool isSupported = false;
|
|
||||||
switch (layerRenderer)
|
|
||||||
{
|
|
||||||
case AC.CIM.CIMTinUniqueValueRenderer:
|
|
||||||
isSupported = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// TODO: log error here that a renderer is unsupported
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isSupported)
|
|
||||||
{
|
|
||||||
StoredTinRenderer = layerRenderer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Processes a las layer's point color by the stored <see cref="StoredRenderer"/>, and stores the point's id and color proxy to the <see cref="ColorProxyCache"/>.
|
|
||||||
/// POC: logic probably can be combined with ProcessFeatureLayerColor.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="point"></param>
|
|
||||||
public void ProcessLasLayerColor(ACD.Analyst3D.LasPoint point, string pointApplicationId)
|
|
||||||
{
|
|
||||||
// get the color from the renderer and point
|
|
||||||
AC.CIM.CIMColor? color;
|
|
||||||
switch (StoredTinRenderer)
|
|
||||||
{
|
|
||||||
case AC.CIM.CIMTinUniqueValueRenderer uniqueValueRenderer:
|
|
||||||
color = GetPointColorByUniqueValueRenderer(uniqueValueRenderer, point);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get or create the color proxy for the point
|
|
||||||
int argb = CIMColorToInt(color ?? point.RGBColor);
|
|
||||||
AddObjectIdToColorProxyCache(pointApplicationId, argb);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieves the las point color from a unique value renderer
|
|
||||||
// unique renderers have groups of conditions that may affect the color of a feature
|
|
||||||
// resulting in a different color than the default renderer symbol color
|
|
||||||
private AC.CIM.CIMColor? GetPointColorByUniqueValueRenderer(
|
|
||||||
AC.CIM.CIMTinUniqueValueRenderer renderer,
|
|
||||||
ACD.Analyst3D.LasPoint point
|
|
||||||
)
|
|
||||||
{
|
|
||||||
foreach (AC.CIM.CIMUniqueValueGroup group in renderer.Groups)
|
|
||||||
{
|
|
||||||
foreach (AC.CIM.CIMUniqueValueClass groupClass in group.Classes)
|
|
||||||
{
|
|
||||||
foreach (AC.CIM.CIMUniqueValue value in groupClass.Values)
|
|
||||||
{
|
|
||||||
// all field values have to match the row values
|
|
||||||
for (int i = 0; i < value.FieldValues.Length; i++)
|
|
||||||
{
|
|
||||||
string groupValue = value.FieldValues[i].Replace("<Null>", "");
|
|
||||||
object? pointValue = point.ClassCode;
|
|
||||||
|
|
||||||
if (ValuesAreEqual(groupValue, pointValue))
|
|
||||||
{
|
|
||||||
return groupClass.Symbol.Symbol.GetColor();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Processes a feature layer's row color by the stored <see cref="StoredRenderer"/>, and stores the row's id and color proxy to the <see cref="ColorProxyCache"/>.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="row"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
/// <exception cref="ACD.Exceptions.GeodatabaseException"></exception>
|
|
||||||
public void ProcessFeatureLayerColor(ACD.Row row, string rowApplicationId)
|
|
||||||
{
|
|
||||||
// if stored color is not null, this means the renderer was a simple renderer that applies to the entire layer, and was already created.
|
|
||||||
// just add the row application id to the color proxy.
|
|
||||||
if (StoredColor is int existingColorProxyId)
|
|
||||||
{
|
|
||||||
AddObjectIdToColorProxyCache(rowApplicationId, existingColorProxyId);
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the color from the renderer and row
|
|
||||||
AC.CIM.CIMColor? color = null;
|
|
||||||
switch (StoredRenderer)
|
|
||||||
{
|
|
||||||
// simple renderers do not rely on fields, so the color can be retrieved from the renderer directly
|
|
||||||
case AC.CIM.CIMSimpleRenderer simpleRenderer:
|
|
||||||
color = simpleRenderer.Symbol.Symbol.GetColor();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AC.CIM.CIMUniqueValueRenderer uniqueValueRenderer:
|
|
||||||
color = GetRowColorByUniqueValueRenderer(uniqueValueRenderer, row);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AC.CIM.CIMClassBreaksRenderer classBreaksRenderer:
|
|
||||||
color = GetRowColorByClassBreaksRenderer(classBreaksRenderer, row);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (color is null)
|
|
||||||
{
|
|
||||||
// TODO: log error or throw exception that color could not be retrieved
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get or create the color proxy for the row
|
|
||||||
int argb = CIMColorToInt(color);
|
|
||||||
AddObjectIdToColorProxyCache(rowApplicationId, argb);
|
|
||||||
|
|
||||||
// store color if from simple renderer
|
|
||||||
if (StoredRenderer is AC.CIM.CIMSimpleRenderer)
|
|
||||||
{
|
|
||||||
StoredColor = argb;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieves the row color from a class breaks renderer
|
|
||||||
// unique renderers have groups of conditions that may affect the color of a feature
|
|
||||||
// resulting in a different color than the default renderer symbol color
|
|
||||||
private AC.CIM.CIMColor? GetRowColorByClassBreaksRenderer(AC.CIM.CIMClassBreaksRenderer renderer, ACD.Row row)
|
|
||||||
{
|
|
||||||
AC.CIM.CIMColor? color = null;
|
|
||||||
|
|
||||||
// get the default symbol color
|
|
||||||
if (renderer.DefaultSymbol?.Symbol.GetColor() is AC.CIM.CIMColor defaultColor)
|
|
||||||
{
|
|
||||||
color = defaultColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the first stored field, since this renderer should only have 1 field
|
|
||||||
double storedFieldValue = Convert.ToDouble(row[StoredRendererFields.First()]);
|
|
||||||
|
|
||||||
List<AC.CIM.CIMClassBreak> reversedBreaks = new(renderer.Breaks);
|
|
||||||
reversedBreaks.Reverse();
|
|
||||||
foreach (var rBreak in reversedBreaks)
|
|
||||||
{
|
|
||||||
// keep looping until the last matching condition
|
|
||||||
if (storedFieldValue <= rBreak.UpperBound)
|
|
||||||
{
|
|
||||||
if (rBreak.Symbol.Symbol.GetColor() is AC.CIM.CIMColor breakColor)
|
|
||||||
{
|
|
||||||
color = breakColor;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// TODO: log error here, could not retrieve break color from symbol
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return color;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieves the row color from a unique value renderer
|
|
||||||
// unique renderers have groups of conditions that may affect the color of a feature
|
|
||||||
// resulting in a different color than the default renderer symbol color
|
|
||||||
private AC.CIM.CIMColor? GetRowColorByUniqueValueRenderer(AC.CIM.CIMUniqueValueRenderer renderer, ACD.Row row)
|
|
||||||
{
|
|
||||||
AC.CIM.CIMColor? color = null;
|
|
||||||
|
|
||||||
// get the default symbol color
|
|
||||||
if (renderer.DefaultSymbol?.Symbol.GetColor() is AC.CIM.CIMColor defaultColor)
|
|
||||||
{
|
|
||||||
color = defaultColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
// note: usually there is only 1 group
|
|
||||||
foreach (AC.CIM.CIMUniqueValueGroup group in renderer.Groups)
|
|
||||||
{
|
|
||||||
// loop through all values in groups to see if any have met conditions that result in a different color
|
|
||||||
foreach (AC.CIM.CIMUniqueValueClass groupClass in group.Classes)
|
|
||||||
{
|
|
||||||
bool groupConditionsMet = true;
|
|
||||||
foreach (AC.CIM.CIMUniqueValue value in groupClass.Values)
|
|
||||||
{
|
|
||||||
// all field values have to match the row values
|
|
||||||
for (int i = 0; i < StoredRendererFields.Count; i++)
|
|
||||||
{
|
|
||||||
string groupValue = value.FieldValues[i];
|
|
||||||
object? rowValue = row[StoredRendererFields[i]];
|
|
||||||
|
|
||||||
if (!ValuesAreEqual(groupValue, rowValue))
|
|
||||||
{
|
|
||||||
groupConditionsMet = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the group color to class symbol color if conditions are met
|
|
||||||
if (groupConditionsMet)
|
|
||||||
{
|
|
||||||
if (groupClass.Symbol.Symbol.GetColor() is AC.CIM.CIMColor groupColor)
|
|
||||||
{
|
|
||||||
color = groupColor;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// TODO: log error here, could not retrieve group color from symbol
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return color;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Compares the label string of a UniqueValueRenderer (groupValue), and an object value (row, las point), to determine if they are equal
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="objectValue"></param>
|
|
||||||
/// <param name="groupValue"></param>
|
|
||||||
private bool ValuesAreEqual(string groupValue, object? objectValue)
|
|
||||||
{
|
|
||||||
switch (objectValue)
|
|
||||||
{
|
|
||||||
case int:
|
|
||||||
case short:
|
|
||||||
case long:
|
|
||||||
case byte:
|
|
||||||
string objectValueString = Convert.ToString(objectValue) ?? "";
|
|
||||||
return groupValue.Equals(objectValueString);
|
|
||||||
|
|
||||||
case string:
|
|
||||||
return groupValue.Equals(objectValue);
|
|
||||||
|
|
||||||
// POC: these are tricky to compare with the label strings accurately, so will trim both values to 5 decimal places.
|
|
||||||
case double d:
|
|
||||||
return double.TryParse(groupValue, out double groupDouble) && groupDouble - d < 0.000001;
|
|
||||||
case float f:
|
|
||||||
return float.TryParse(groupValue, out float groupFloat) && groupFloat - f < 0.000001;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddObjectIdToColorProxyCache(string objectId, int argb)
|
|
||||||
{
|
|
||||||
if (ColorProxyCache.TryGetValue(argb, out ColorProxy? colorProxy))
|
|
||||||
{
|
|
||||||
colorProxy.objects.Add(objectId);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ColorProxy newColorProxy =
|
|
||||||
new()
|
|
||||||
{
|
|
||||||
name = argb.ToString(),
|
|
||||||
objects = new() { objectId },
|
|
||||||
value = argb,
|
|
||||||
applicationId = argb.ToString()
|
|
||||||
};
|
|
||||||
|
|
||||||
ColorProxyCache.Add(argb, newColorProxy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int ArgbToInt(int a, int r, int g, int b)
|
|
||||||
{
|
|
||||||
return (a << 24) | (r << 16) | (g << 8) | b;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gets the argb int from a CIMColor
|
|
||||||
// Defaults to assuming CIMColor.Values represent the red, green, and blue channels.
|
|
||||||
private int CIMColorToInt(AC.CIM.CIMColor color)
|
|
||||||
{
|
|
||||||
switch (color)
|
|
||||||
{
|
|
||||||
case AC.CIM.CIMHSVColor hsv:
|
|
||||||
(float hsvR, float hsvG, float hsvB) = RgbFromHsv(hsv.H, hsv.S, hsv.V);
|
|
||||||
return ArgbToInt(
|
|
||||||
(int)Math.Round(hsv.Alpha),
|
|
||||||
(int)Math.Round(hsvR * 255),
|
|
||||||
(int)Math.Round(hsvG * 255),
|
|
||||||
(int)Math.Round(hsvB * 255)
|
|
||||||
);
|
|
||||||
|
|
||||||
case AC.CIM.CIMCMYKColor cmyk:
|
|
||||||
float k = cmyk.K;
|
|
||||||
int cmykR = Convert.ToInt32(255 * (1 - cmyk.C) * (1 - k));
|
|
||||||
int cmykG = Convert.ToInt32(255 * (1 - cmyk.M) * (1 - k));
|
|
||||||
int cmykB = Convert.ToInt32(255 * (1 - cmyk.Y) * (1 - k));
|
|
||||||
return ArgbToInt((int)Math.Round(cmyk.Alpha), cmykR, cmykG, cmykB);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return ArgbToInt(
|
|
||||||
(int)Math.Round(color.Alpha),
|
|
||||||
(int)Math.Round(color.Values[0]),
|
|
||||||
(int)Math.Round(color.Values[1]),
|
|
||||||
(int)Math.Round(color.Values[2])
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private (float, float, float) RgbFromHsv(float hue, float saturation, float value)
|
|
||||||
{
|
|
||||||
// Translates HSV color to RGB color
|
|
||||||
// H: 0.0 - 360.0, S: 0.0 - 100.0, V: 0.0 - 100.0
|
|
||||||
// R, G, B: 0.0 - 1.0
|
|
||||||
|
|
||||||
float c = (value / 100) * (saturation / 100);
|
|
||||||
float x = c * (1 - Math.Abs(((hue / 60) % 2) - 1));
|
|
||||||
float m = (value / 100) - c;
|
|
||||||
|
|
||||||
float r = 0;
|
|
||||||
float g = 0;
|
|
||||||
float b = 0;
|
|
||||||
|
|
||||||
if (hue >= 0 && hue < 60)
|
|
||||||
{
|
|
||||||
r = c;
|
|
||||||
g = x;
|
|
||||||
b = 0;
|
|
||||||
}
|
|
||||||
else if (hue >= 60 && hue < 120)
|
|
||||||
{
|
|
||||||
r = x;
|
|
||||||
g = c;
|
|
||||||
b = 0;
|
|
||||||
}
|
|
||||||
else if (hue >= 120 && hue < 180)
|
|
||||||
{
|
|
||||||
r = 0;
|
|
||||||
g = c;
|
|
||||||
b = x;
|
|
||||||
}
|
|
||||||
else if (hue >= 180 && hue < 240)
|
|
||||||
{
|
|
||||||
r = 0;
|
|
||||||
g = x;
|
|
||||||
b = c;
|
|
||||||
}
|
|
||||||
else if (hue >= 240 && hue < 300)
|
|
||||||
{
|
|
||||||
r = x;
|
|
||||||
g = 0;
|
|
||||||
b = c;
|
|
||||||
}
|
|
||||||
else if (hue >= 300 && hue < 360)
|
|
||||||
{
|
|
||||||
r = c;
|
|
||||||
g = 0;
|
|
||||||
b = x;
|
|
||||||
}
|
|
||||||
|
|
||||||
r += m;
|
|
||||||
g += m;
|
|
||||||
b += m;
|
|
||||||
|
|
||||||
return (r, g, b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
using Speckle.Connectors.ArcGIS.HostApp.Extensions;
|
|
||||||
using Speckle.Sdk.Models.Collections;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.HostApp;
|
|
||||||
|
|
||||||
public class ArcGISLayerUnpacker
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Cache of all collections created by unpacked Layer MapMembers. Key is the Speckle applicationId (Layer URI).
|
|
||||||
/// </summary>
|
|
||||||
public Dictionary<string, Collection> CollectionCache { get; } = new();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Mapmembers can be layers containing objects, or LayerContainers containing other layers.
|
|
||||||
/// Unpacks selected mapMembers and creates their corresponding collection on the root collection.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="mapMembers"></param>
|
|
||||||
/// <param name="parentCollection"></param>
|
|
||||||
/// <returns>List of layers containing objects.</returns>
|
|
||||||
/// <exception cref="AC.CalledOnWrongThreadException">Thrown when this method is *not* called on the MCT, because this method accesses mapmember fields</exception>
|
|
||||||
public async Task<List<ADM.MapMember>> UnpackSelectionAsync(
|
|
||||||
IEnumerable<ADM.MapMember> mapMembers,
|
|
||||||
Collection parentCollection,
|
|
||||||
List<ADM.MapMember>? objects = null
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (objects is null)
|
|
||||||
{
|
|
||||||
objects = new();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (ADM.MapMember mapMember in mapMembers)
|
|
||||||
{
|
|
||||||
switch (mapMember)
|
|
||||||
{
|
|
||||||
case ADM.ILayerContainer container:
|
|
||||||
Collection containerCollection = CreateAndCacheMapMemberCollection(mapMember, true);
|
|
||||||
parentCollection.elements.Add(containerCollection);
|
|
||||||
|
|
||||||
await UnpackSelectionAsync(container.Layers, containerCollection, objects).ConfigureAwait(false);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (!(objects.Contains(mapMember)))
|
|
||||||
{
|
|
||||||
Collection collection = CreateAndCacheMapMemberCollection(mapMember);
|
|
||||||
parentCollection.elements.Add(collection);
|
|
||||||
objects.Add(mapMember);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return objects;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Collection CreateAndCacheMapMemberCollection(ADM.MapMember mapMember, bool isLayerContainer = false)
|
|
||||||
{
|
|
||||||
string mapMemberApplicationId = mapMember.GetSpeckleApplicationId();
|
|
||||||
Collection collection =
|
|
||||||
new()
|
|
||||||
{
|
|
||||||
name = mapMember.Name,
|
|
||||||
applicationId = mapMemberApplicationId,
|
|
||||||
["type"] = mapMember.GetType().Name
|
|
||||||
};
|
|
||||||
|
|
||||||
switch (mapMember)
|
|
||||||
{
|
|
||||||
case ADM.IDisplayTable displayTable: // get fields from layers that implement IDisplayTable, eg FeatureLayer or StandaloneTable
|
|
||||||
Dictionary<string, string>? fields = displayTable
|
|
||||||
.GetFieldDescriptions()
|
|
||||||
.ToDictionary(field => field.Name, field => field.Type.ToString());
|
|
||||||
collection["fields"] = fields;
|
|
||||||
if (mapMember is ADM.BasicFeatureLayer basicFeatureLayer)
|
|
||||||
{
|
|
||||||
collection["shapeType"] = basicFeatureLayer.ShapeType.ToString();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ADM.Layer layer:
|
|
||||||
collection["mapLayerType"] = layer.MapLayerType.ToString();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ADM.ILayerContainer:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isLayerContainer) // do not cache layer containers, since these won't contain any objects
|
|
||||||
{
|
|
||||||
CollectionCache.Add(mapMemberApplicationId, collection);
|
|
||||||
}
|
|
||||||
|
|
||||||
return collection;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
using ArcGIS.Core.Data.Raster;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.HostApp.Extensions;
|
|
||||||
|
|
||||||
public static class SpeckleApplicationIdExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Retrieves the Speckle application id for map members
|
|
||||||
/// </summary>
|
|
||||||
public static string GetSpeckleApplicationId(this ADM.MapMember mapMember) => mapMember.URI;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructs the Speckle application id for Features as a concatenation of the layer URI (applicationId)
|
|
||||||
/// and the row OID (index of row in layer).
|
|
||||||
/// </summary>
|
|
||||||
/// <exception cref="ACD.Exceptions.GeodatabaseException">Throws when this is *not* called on MCT. Use QueuedTask.Run.</exception>
|
|
||||||
public static string GetSpeckleApplicationId(this ACD.Row row, string layerApplicationId) =>
|
|
||||||
$"{layerApplicationId}_{row.GetObjectID()}";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructs the Speckle application id for Raster as a concatenation of the layer URI (applicationId) and 0-index
|
|
||||||
/// </summary>
|
|
||||||
public static string GetSpeckleApplicationId(this Raster _, string layerApplicationId) => $"{layerApplicationId}_0";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructs the Speckle application id for LasDatasets as a concatenation of the layer URI (applicationId)
|
|
||||||
/// and point OID.
|
|
||||||
/// </summary>
|
|
||||||
public static string GetSpeckleApplicationId(this ACD.Analyst3D.LasPoint point, string layerApplicationId) =>
|
|
||||||
$"{layerApplicationId}_{point.PointID}";
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 524 B |
|
Before Width: | Height: | Size: 948 B |
|
Before Width: | Height: | Size: 714 B |
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,416 +0,0 @@
|
|||||||
using System.Diagnostics.Contracts;
|
|
||||||
using ArcGIS.Core.CIM;
|
|
||||||
using ArcGIS.Core.Geometry;
|
|
||||||
using ArcGIS.Desktop.Framework.Threading.Tasks;
|
|
||||||
using ArcGIS.Desktop.Mapping;
|
|
||||||
using Speckle.Connectors.ArcGIS.HostApp;
|
|
||||||
using Speckle.Connectors.ArcGIS.Utils;
|
|
||||||
using Speckle.Connectors.Common.Builders;
|
|
||||||
using Speckle.Connectors.Common.Conversion;
|
|
||||||
using Speckle.Connectors.Common.Instances;
|
|
||||||
using Speckle.Connectors.Common.Operations;
|
|
||||||
using Speckle.Converters.ArcGIS3;
|
|
||||||
using Speckle.Converters.ArcGIS3.Utils;
|
|
||||||
using Speckle.Converters.Common;
|
|
||||||
using Speckle.Objects.Data;
|
|
||||||
using Speckle.Objects.Other;
|
|
||||||
using Speckle.Sdk;
|
|
||||||
using Speckle.Sdk.Models;
|
|
||||||
using Speckle.Sdk.Models.Collections;
|
|
||||||
using Speckle.Sdk.Models.GraphTraversal;
|
|
||||||
using Speckle.Sdk.Models.Instances;
|
|
||||||
using Speckle.Sdk.Models.Proxies;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.Operations.Receive;
|
|
||||||
|
|
||||||
public class ArcGISHostObjectBuilder : IHostObjectBuilder
|
|
||||||
{
|
|
||||||
private readonly IRootToHostConverter _converter;
|
|
||||||
private readonly IFeatureClassUtils _featureClassUtils;
|
|
||||||
private readonly ILocalToGlobalUnpacker _localToGlobalUnpacker;
|
|
||||||
private readonly LocalToGlobalConverterUtils _localToGlobalConverterUtils;
|
|
||||||
|
|
||||||
// POC: figure out the correct scope to only initialize on Receive
|
|
||||||
private readonly IConverterSettingsStore<ArcGISConversionSettings> _settingsStore;
|
|
||||||
private readonly GraphTraversal _traverseFunction;
|
|
||||||
private readonly ArcGISColorManager _colorManager;
|
|
||||||
|
|
||||||
public ArcGISHostObjectBuilder(
|
|
||||||
IRootToHostConverter converter,
|
|
||||||
IConverterSettingsStore<ArcGISConversionSettings> settingsStore,
|
|
||||||
IFeatureClassUtils featureClassUtils,
|
|
||||||
ILocalToGlobalUnpacker localToGlobalUnpacker,
|
|
||||||
LocalToGlobalConverterUtils localToGlobalConverterUtils,
|
|
||||||
GraphTraversal traverseFunction,
|
|
||||||
ArcGISColorManager colorManager
|
|
||||||
)
|
|
||||||
{
|
|
||||||
_converter = converter;
|
|
||||||
_settingsStore = settingsStore;
|
|
||||||
_featureClassUtils = featureClassUtils;
|
|
||||||
_localToGlobalUnpacker = localToGlobalUnpacker;
|
|
||||||
_localToGlobalConverterUtils = localToGlobalConverterUtils;
|
|
||||||
_traverseFunction = traverseFunction;
|
|
||||||
_colorManager = colorManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<HostObjectBuilderResult> Build(
|
|
||||||
Base rootObject,
|
|
||||||
string projectName,
|
|
||||||
string modelName,
|
|
||||||
IProgress<CardProgress> onOperationProgressed,
|
|
||||||
CancellationToken cancellationToken
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// TODO get spatialRef and offsets & rotation from ProjectInfo in CommitObject
|
|
||||||
// ATM, GIS commit CRS is stored per layer (in FeatureClass converter), but should be moved to the Root level too
|
|
||||||
|
|
||||||
// Prompt the UI conversion started. Progress bar will swoosh.
|
|
||||||
onOperationProgressed.Report(new("Converting", null));
|
|
||||||
|
|
||||||
// get materials
|
|
||||||
List<RenderMaterialProxy>? materials = (rootObject[ProxyKeys.RENDER_MATERIAL] as List<object>)
|
|
||||||
?.Cast<RenderMaterialProxy>()
|
|
||||||
.ToList();
|
|
||||||
if (materials != null)
|
|
||||||
{
|
|
||||||
await _colorManager.ParseMaterials(materials, onOperationProgressed).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// get colors
|
|
||||||
List<ColorProxy>? colors = (rootObject[ProxyKeys.COLOR] as List<object>)?.Cast<ColorProxy>().ToList();
|
|
||||||
if (colors != null)
|
|
||||||
{
|
|
||||||
await _colorManager.ParseColors(colors, onOperationProgressed).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
int count = 0;
|
|
||||||
IReadOnlyCollection<LocalToGlobalMap> objectsToConvert = GetObjectsToConvert(rootObject);
|
|
||||||
Dictionary<TraversalContext, ObjectConversionTracker> conversionTracker = new();
|
|
||||||
|
|
||||||
// 1. convert everything
|
|
||||||
List<ReceiveConversionResult> results = new(objectsToConvert.Count);
|
|
||||||
List<string> bakedObjectIds = new();
|
|
||||||
foreach (LocalToGlobalMap objectToConvert in objectsToConvert)
|
|
||||||
{
|
|
||||||
string[] path = GetLayerPath(objectToConvert.TraversalContext);
|
|
||||||
Base obj = objectToConvert.AtomicObject;
|
|
||||||
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
try
|
|
||||||
{
|
|
||||||
obj = _localToGlobalConverterUtils.TransformObjects(objectToConvert.AtomicObject, objectToConvert.Matrix);
|
|
||||||
object? conversionResult = await QueuedTask.Run(() => _converter.Convert(obj)).ConfigureAwait(false);
|
|
||||||
|
|
||||||
string nestedLayerPath = $"{string.Join("\\", path)}";
|
|
||||||
|
|
||||||
if (obj is ArcgisObject gisObj)
|
|
||||||
{
|
|
||||||
nestedLayerPath += $"\\{gisObj.name}";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nestedLayerPath += $"\\{obj.speckle_type.Split(".")[^1]}"; // add sub-layer by speckleType, for non-GIS objects
|
|
||||||
}
|
|
||||||
|
|
||||||
conversionTracker[objectToConvert.TraversalContext] = new ObjectConversionTracker(
|
|
||||||
obj,
|
|
||||||
(Geometry?)conversionResult,
|
|
||||||
nestedLayerPath
|
|
||||||
);
|
|
||||||
}
|
|
||||||
catch (Exception ex) when (!ex.IsFatal()) // DO NOT CATCH SPECIFIC STUFF, conversion errors should be recoverable
|
|
||||||
{
|
|
||||||
results.Add(new(Status.ERROR, obj, null, null, ex));
|
|
||||||
}
|
|
||||||
onOperationProgressed.Report(new("Converting", (double)++count / objectsToConvert.Count));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2.1. Group conversionTrackers (to write into datasets)
|
|
||||||
onOperationProgressed.Report(new("Grouping features into layers", null));
|
|
||||||
Dictionary<string, List<(TraversalContext, ObjectConversionTracker)>> convertedGroups = await QueuedTask
|
|
||||||
.Run(async () =>
|
|
||||||
{
|
|
||||||
return await _featureClassUtils
|
|
||||||
.GroupConversionTrackers(conversionTracker, (s, progres) => onOperationProgressed.Report(new(s, progres)))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
})
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
// 2.2. Write groups of objects to Datasets
|
|
||||||
onOperationProgressed.Report(new("Writing to Database", null));
|
|
||||||
await QueuedTask
|
|
||||||
.Run(async () =>
|
|
||||||
{
|
|
||||||
await _featureClassUtils
|
|
||||||
.CreateDatasets(
|
|
||||||
conversionTracker,
|
|
||||||
convertedGroups,
|
|
||||||
(s, progres) => onOperationProgressed.Report(new(s, progres))
|
|
||||||
)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
})
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
// 3. add layer and tables to the Map and Table Of Content
|
|
||||||
|
|
||||||
// Create placeholder for GroupLayers
|
|
||||||
Dictionary<string, GroupLayer> createdLayerGroups = new();
|
|
||||||
|
|
||||||
int bakeCount = 0;
|
|
||||||
Dictionary<string, (MapMember, CIMUniqueValueRenderer?)> bakedMapMembers = new();
|
|
||||||
onOperationProgressed.Report(new("Adding to Map", bakeCount));
|
|
||||||
|
|
||||||
foreach (var item in conversionTracker)
|
|
||||||
{
|
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
|
||||||
var trackerItem = conversionTracker[item.Key]; // updated tracker object
|
|
||||||
|
|
||||||
// BAKE OBJECTS HERE
|
|
||||||
if (trackerItem.Exception != null)
|
|
||||||
{
|
|
||||||
results.Add(new(Status.ERROR, trackerItem.Base, null, null, trackerItem.Exception));
|
|
||||||
}
|
|
||||||
else if (trackerItem.DatasetId == null)
|
|
||||||
{
|
|
||||||
results.Add(
|
|
||||||
new(
|
|
||||||
Status.ERROR,
|
|
||||||
trackerItem.Base,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
new ArgumentException($"Unknown error: Dataset not created for {trackerItem.Base.speckle_type}")
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else if (bakedMapMembers.TryGetValue(trackerItem.DatasetId, out var value))
|
|
||||||
{
|
|
||||||
// if the layer already created, just add more features to report, and more color categories
|
|
||||||
// add layer and layer URI to tracker
|
|
||||||
trackerItem.AddConvertedMapMember(value.Item1);
|
|
||||||
trackerItem.AddLayerURI(value.Item1.URI);
|
|
||||||
conversionTracker[item.Key] = trackerItem; // not necessary atm, but needed if we use conversionTracker further
|
|
||||||
|
|
||||||
// add color category
|
|
||||||
CIMUniqueValueRenderer? uvr = _colorManager.CreateOrEditLayerRenderer(item.Key, trackerItem, value.Item2);
|
|
||||||
// replace renderer
|
|
||||||
bakedMapMembers[trackerItem.DatasetId] = (value.Item1, uvr);
|
|
||||||
|
|
||||||
// only add a report item
|
|
||||||
AddResultsFromTracker(trackerItem, results);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// no layer yet, create and add layer to Map
|
|
||||||
MapMember mapMember = await AddDatasetsToMap(trackerItem, createdLayerGroups, projectName, modelName)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
// add layer and layer URI to tracker
|
|
||||||
trackerItem.AddConvertedMapMember(mapMember);
|
|
||||||
trackerItem.AddLayerURI(mapMember.URI);
|
|
||||||
conversionTracker[item.Key] = trackerItem; // not necessary atm, but needed if we use conversionTracker further
|
|
||||||
|
|
||||||
// add layer URI to bakedIds
|
|
||||||
bakedObjectIds.Add(trackerItem.MappedLayerURI == null ? "" : trackerItem.MappedLayerURI);
|
|
||||||
|
|
||||||
// add color category
|
|
||||||
CIMUniqueValueRenderer? uvr = _colorManager.CreateOrEditLayerRenderer(item.Key, trackerItem, null);
|
|
||||||
// mark dataset as already created
|
|
||||||
bakedMapMembers[trackerItem.DatasetId] = (mapMember, uvr);
|
|
||||||
|
|
||||||
// add report item
|
|
||||||
AddResultsFromTracker(trackerItem, results);
|
|
||||||
}
|
|
||||||
|
|
||||||
onOperationProgressed.Report(new("Adding to Map", (double)++bakeCount / conversionTracker.Count));
|
|
||||||
}
|
|
||||||
|
|
||||||
// apply renderers to baked layers
|
|
||||||
foreach (var bakedMember in bakedMapMembers)
|
|
||||||
{
|
|
||||||
if (bakedMember.Value.Item1 is FeatureLayer fLayer)
|
|
||||||
{
|
|
||||||
// Set the feature layer's renderer.
|
|
||||||
await QueuedTask.Run(() => fLayer.SetRenderer(bakedMember.Value.Item2)).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bakedObjectIds.AddRange(createdLayerGroups.Values.Select(x => x.URI));
|
|
||||||
|
|
||||||
// TODO: validated a correct set regarding bakedobject ids
|
|
||||||
return new(bakedObjectIds, results);
|
|
||||||
}
|
|
||||||
|
|
||||||
private IReadOnlyCollection<LocalToGlobalMap> GetObjectsToConvert(Base rootObject)
|
|
||||||
{
|
|
||||||
// keep GISlayers in the list, because they are still needed to extract CRS of the commit (code below)
|
|
||||||
List<TraversalContext> objectsToConvertTc = _traverseFunction.Traverse(rootObject).ToList();
|
|
||||||
|
|
||||||
// now filter the objects
|
|
||||||
objectsToConvertTc = objectsToConvertTc.Where(ctx => ctx.Current is not Collection).ToList();
|
|
||||||
|
|
||||||
var instanceDefinitionProxies = (rootObject[ProxyKeys.INSTANCE_DEFINITION] as List<object>)
|
|
||||||
?.Cast<InstanceDefinitionProxy>()
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
return _localToGlobalUnpacker.Unpack(instanceDefinitionProxies, objectsToConvertTc);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddResultsFromTracker(ObjectConversionTracker trackerItem, List<ReceiveConversionResult> results)
|
|
||||||
{
|
|
||||||
if (trackerItem.MappedLayerURI == null) // should not happen
|
|
||||||
{
|
|
||||||
results.Add(
|
|
||||||
new(
|
|
||||||
Status.ERROR,
|
|
||||||
trackerItem.Base,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
new ArgumentException($"Created Layer URI not found for {trackerItem.Base.speckle_type}")
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// encode layer ID and ID of its feature in 1 object represented as string
|
|
||||||
ObjectID objectId = new(trackerItem.MappedLayerURI, trackerItem.DatasetRow);
|
|
||||||
if (trackerItem.HostAppGeom != null) // individual hostAppGeometry
|
|
||||||
{
|
|
||||||
results.Add(
|
|
||||||
new(
|
|
||||||
Status.SUCCESS,
|
|
||||||
trackerItem.Base,
|
|
||||||
objectId.ObjectIdToString(),
|
|
||||||
trackerItem.HostAppGeom.GetType().ToString()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else // hostApp Layers
|
|
||||||
{
|
|
||||||
results.Add(
|
|
||||||
new(
|
|
||||||
Status.SUCCESS,
|
|
||||||
trackerItem.Base,
|
|
||||||
objectId.ObjectIdToString(),
|
|
||||||
trackerItem.HostAppMapMember?.GetType().ToString()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<MapMember> AddDatasetsToMap(
|
|
||||||
ObjectConversionTracker trackerItem,
|
|
||||||
Dictionary<string, GroupLayer> createdLayerGroups,
|
|
||||||
string projectName,
|
|
||||||
string modelName
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return await QueuedTask
|
|
||||||
.Run(() =>
|
|
||||||
{
|
|
||||||
// get layer details
|
|
||||||
string? datasetId = trackerItem.DatasetId; // should not be null here
|
|
||||||
Uri uri = new($"{_settingsStore.Current.SpeckleDatabasePath.AbsolutePath.Replace('/', '\\')}\\{datasetId}");
|
|
||||||
string nestedLayerName = trackerItem.NestedLayerName;
|
|
||||||
|
|
||||||
// add group for the current layer
|
|
||||||
string shortName = nestedLayerName.Split("\\")[^1];
|
|
||||||
string nestedLayerPath = string.Join("\\", nestedLayerName.Split("\\").SkipLast(1));
|
|
||||||
|
|
||||||
// if no general group layer found
|
|
||||||
if (createdLayerGroups.Count == 0)
|
|
||||||
{
|
|
||||||
Map map = _settingsStore.Current.Map;
|
|
||||||
GroupLayer mainGroupLayer = LayerFactory.Instance.CreateGroupLayer(map, 0, $"{projectName}: {modelName}");
|
|
||||||
mainGroupLayer.SetExpanded(true);
|
|
||||||
createdLayerGroups["Basic Speckle Group"] = mainGroupLayer; // key doesn't really matter here
|
|
||||||
}
|
|
||||||
|
|
||||||
var groupLayer = CreateNestedGroupLayer(nestedLayerPath, createdLayerGroups);
|
|
||||||
|
|
||||||
// Most of the Speckle-written datasets will be containing geometry and added as Layers
|
|
||||||
// although, some datasets might be just tables (e.g. native GIS Tables, in the future maybe Revit schedules etc.
|
|
||||||
// We can create a connection to the dataset in advance and determine its type, but this will be more
|
|
||||||
// expensive, than assuming by default that it's a layer with geometry (which in most cases it's expected to be)
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var layer = LayerFactory.Instance.CreateLayer(uri, groupLayer, layerName: shortName);
|
|
||||||
if (layer == null)
|
|
||||||
{
|
|
||||||
throw new SpeckleException($"Layer '{shortName}' was not created");
|
|
||||||
}
|
|
||||||
layer.SetExpanded(false);
|
|
||||||
|
|
||||||
// if Scene
|
|
||||||
// https://community.esri.com/t5/arcgis-pro-sdk-questions/sdk-equivalent-to-changing-layer-s-elevation/td-p/1346139
|
|
||||||
if (_settingsStore.Current.Map.IsScene)
|
|
||||||
{
|
|
||||||
var groundSurfaceLayer = _settingsStore.Current.Map.GetGroundElevationSurfaceLayer();
|
|
||||||
var layerElevationSurface = new CIMLayerElevationSurface
|
|
||||||
{
|
|
||||||
ElevationSurfaceLayerURI = groundSurfaceLayer.URI,
|
|
||||||
};
|
|
||||||
|
|
||||||
// for Feature Layers
|
|
||||||
if (layer.GetDefinition() is CIMFeatureLayer cimLyr)
|
|
||||||
{
|
|
||||||
cimLyr.LayerElevation = layerElevationSurface;
|
|
||||||
layer.SetDefinition(cimLyr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (MapMember)layer;
|
|
||||||
}
|
|
||||||
catch (ArgumentException)
|
|
||||||
{
|
|
||||||
StandaloneTable table = StandaloneTableFactory.Instance.CreateStandaloneTable(
|
|
||||||
uri,
|
|
||||||
groupLayer,
|
|
||||||
tableName: shortName
|
|
||||||
);
|
|
||||||
return table;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private GroupLayer CreateNestedGroupLayer(string nestedLayerPath, Dictionary<string, GroupLayer> createdLayerGroups)
|
|
||||||
{
|
|
||||||
GroupLayer lastGroup = createdLayerGroups.FirstOrDefault().Value;
|
|
||||||
if (lastGroup == null) // if layer not found
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException("Speckle Layer Group not found");
|
|
||||||
}
|
|
||||||
|
|
||||||
// iterate through each nested level
|
|
||||||
string createdGroupPath = "";
|
|
||||||
var allPathElements = nestedLayerPath.Split("\\").Where(x => !string.IsNullOrEmpty(x));
|
|
||||||
foreach (string pathElement in allPathElements)
|
|
||||||
{
|
|
||||||
createdGroupPath += "\\" + pathElement;
|
|
||||||
if (createdLayerGroups.TryGetValue(createdGroupPath, out var existingGroupLayer))
|
|
||||||
{
|
|
||||||
lastGroup = existingGroupLayer;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// create new GroupLayer under last found Group, named with last pathElement
|
|
||||||
lastGroup = LayerFactory.Instance.CreateGroupLayer(lastGroup, 0, pathElement);
|
|
||||||
lastGroup.SetExpanded(true);
|
|
||||||
}
|
|
||||||
createdLayerGroups[createdGroupPath] = lastGroup;
|
|
||||||
}
|
|
||||||
return lastGroup;
|
|
||||||
}
|
|
||||||
|
|
||||||
[Pure]
|
|
||||||
private static string[] GetLayerPath(TraversalContext context)
|
|
||||||
{
|
|
||||||
string[] collectionBasedPath = context.GetAscendantOfType<Collection>().Select(c => c.name).ToArray();
|
|
||||||
string[] reverseOrderPath =
|
|
||||||
collectionBasedPath.Length != 0 ? collectionBasedPath : context.GetPropertyPath().ToArray();
|
|
||||||
|
|
||||||
var originalPath = reverseOrderPath.Reverse().ToArray();
|
|
||||||
return originalPath.Where(x => !string.IsNullOrEmpty(x)).ToArray();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,295 +0,0 @@
|
|||||||
using ArcGIS.Core.Data.Raster;
|
|
||||||
using ArcGIS.Core.Geometry;
|
|
||||||
using ArcGIS.Desktop.Framework.Threading.Tasks;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Speckle.Connectors.ArcGIS.HostApp;
|
|
||||||
using Speckle.Connectors.ArcGIS.HostApp.Extensions;
|
|
||||||
using Speckle.Connectors.ArcGIS.Utils;
|
|
||||||
using Speckle.Connectors.Common.Builders;
|
|
||||||
using Speckle.Connectors.Common.Caching;
|
|
||||||
using Speckle.Connectors.Common.Conversion;
|
|
||||||
using Speckle.Connectors.Common.Extensions;
|
|
||||||
using Speckle.Connectors.Common.Operations;
|
|
||||||
using Speckle.Converters.ArcGIS3;
|
|
||||||
using Speckle.Converters.Common;
|
|
||||||
using Speckle.Sdk;
|
|
||||||
using Speckle.Sdk.Logging;
|
|
||||||
using Speckle.Sdk.Models;
|
|
||||||
using Speckle.Sdk.Models.Collections;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGis.Operations.Send;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Stateless builder object to turn an ISendFilter into a <see cref="Base"/> object
|
|
||||||
/// </summary>
|
|
||||||
public class ArcGISRootObjectBuilder : IRootObjectBuilder<ADM.MapMember>
|
|
||||||
{
|
|
||||||
private readonly IRootToSpeckleConverter _rootToSpeckleConverter;
|
|
||||||
private readonly ISendConversionCache _sendConversionCache;
|
|
||||||
private readonly ArcGISLayerUnpacker _layerUnpacker;
|
|
||||||
private readonly ArcGISColorUnpacker _colorUnpacker;
|
|
||||||
private readonly IConverterSettingsStore<ArcGISConversionSettings> _converterSettings;
|
|
||||||
private readonly ILogger<ArcGISRootObjectBuilder> _logger;
|
|
||||||
private readonly ISdkActivityFactory _activityFactory;
|
|
||||||
private readonly MapMembersUtils _mapMemberUtils;
|
|
||||||
|
|
||||||
public ArcGISRootObjectBuilder(
|
|
||||||
ISendConversionCache sendConversionCache,
|
|
||||||
ArcGISLayerUnpacker layerUnpacker,
|
|
||||||
ArcGISColorUnpacker colorUnpacker,
|
|
||||||
IConverterSettingsStore<ArcGISConversionSettings> converterSettings,
|
|
||||||
IRootToSpeckleConverter rootToSpeckleConverter,
|
|
||||||
ILogger<ArcGISRootObjectBuilder> logger,
|
|
||||||
ISdkActivityFactory activityFactory,
|
|
||||||
MapMembersUtils mapMemberUtils
|
|
||||||
)
|
|
||||||
{
|
|
||||||
_sendConversionCache = sendConversionCache;
|
|
||||||
_layerUnpacker = layerUnpacker;
|
|
||||||
_colorUnpacker = colorUnpacker;
|
|
||||||
_converterSettings = converterSettings;
|
|
||||||
_rootToSpeckleConverter = rootToSpeckleConverter;
|
|
||||||
_logger = logger;
|
|
||||||
_activityFactory = activityFactory;
|
|
||||||
_mapMemberUtils = mapMemberUtils;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<RootObjectBuilderResult> Build(
|
|
||||||
IReadOnlyList<ADM.MapMember> layers,
|
|
||||||
SendInfo sendInfo,
|
|
||||||
IProgress<CardProgress> onOperationProgressed,
|
|
||||||
CancellationToken ct = default
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// TODO: add a warning if Geographic CRS is set
|
|
||||||
// "Data has been sent in the units 'degrees'. It is advisable to set the project CRS to Projected type (e.g. EPSG:32631) to be able to receive geometry correctly in CAD/BIM software"
|
|
||||||
|
|
||||||
|
|
||||||
// 0 - Create Root collection and attach CRS properties
|
|
||||||
// CRS properties are useful for data based workflows coming out of gis applications
|
|
||||||
SpatialReference sr = _converterSettings.Current.ActiveCRSoffsetRotation.SpatialReference;
|
|
||||||
Dictionary<string, object?> spatialReference =
|
|
||||||
new()
|
|
||||||
{
|
|
||||||
["name"] = sr.Name,
|
|
||||||
["unit"] = sr.Unit.Name,
|
|
||||||
["wkid"] = sr.Wkid,
|
|
||||||
["wkt"] = sr.Wkt,
|
|
||||||
};
|
|
||||||
|
|
||||||
Dictionary<string, object?> crs =
|
|
||||||
new()
|
|
||||||
{
|
|
||||||
["trueNorthRadians"] = _converterSettings.Current.ActiveCRSoffsetRotation.TrueNorthRadians,
|
|
||||||
["latOffset"] = _converterSettings.Current.ActiveCRSoffsetRotation.LatOffset,
|
|
||||||
["lonOffset"] = _converterSettings.Current.ActiveCRSoffsetRotation.LonOffset,
|
|
||||||
["spatialReference"] = spatialReference
|
|
||||||
};
|
|
||||||
|
|
||||||
Collection rootCollection =
|
|
||||||
new()
|
|
||||||
{
|
|
||||||
name = ADM.MapView.Active.Map.Name,
|
|
||||||
["units"] = _converterSettings.Current.SpeckleUnits,
|
|
||||||
["crs"] = crs
|
|
||||||
};
|
|
||||||
|
|
||||||
// 1 - Unpack the selected mapmembers
|
|
||||||
// In Arcgis, mapmembers are collections of other mapmember or objects.
|
|
||||||
// We need to unpack the selected mapmembers into all leaf-level mapmembers (containing just objects) and build the root collection structure during unpacking.
|
|
||||||
// Mapmember dynamically attached properties are also added at this step.
|
|
||||||
List<ADM.MapMember> unpackedLayers;
|
|
||||||
ADM.Map map = ADM.MapView.Active.Map;
|
|
||||||
IEnumerable<ADM.MapMember> layersOrdered = _mapMemberUtils.GetMapMembersInOrder(map, layers);
|
|
||||||
using (var _ = _activityFactory.Start("Unpacking selection"))
|
|
||||||
{
|
|
||||||
unpackedLayers = await QueuedTask
|
|
||||||
.Run(() => _layerUnpacker.UnpackSelectionAsync(layersOrdered, rootCollection))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<SendConversionResult> results = new(unpackedLayers.Count);
|
|
||||||
onOperationProgressed.Report(new("Converting", null));
|
|
||||||
using (var convertingActivity = _activityFactory.Start("Converting objects"))
|
|
||||||
{
|
|
||||||
int count = 0;
|
|
||||||
foreach (ADM.MapMember layer in unpackedLayers)
|
|
||||||
{
|
|
||||||
ct.ThrowIfCancellationRequested();
|
|
||||||
string layerApplicationId = layer.GetSpeckleApplicationId();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// get the corresponding collection for this layer - we'll add all converted objects to the collection
|
|
||||||
if (_layerUnpacker.CollectionCache.TryGetValue(layerApplicationId, out Collection? layerCollection))
|
|
||||||
{
|
|
||||||
var status = Status.SUCCESS;
|
|
||||||
var sdkStatus = SdkActivityStatusCode.Ok;
|
|
||||||
|
|
||||||
// TODO: check cache first to see if this layer was previously converted
|
|
||||||
/*
|
|
||||||
if (_sendConversionCache.TryGetValue(
|
|
||||||
sendInfo.ProjectId,
|
|
||||||
layerApplicationId,
|
|
||||||
out ObjectReference? value
|
|
||||||
))
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
switch (layer)
|
|
||||||
{
|
|
||||||
case ADM.FeatureLayer featureLayer:
|
|
||||||
List<Base> convertedFeatureLayerObjects = await QueuedTask
|
|
||||||
.Run(() => ConvertFeatureLayerObjectsAsync(featureLayer))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
layerCollection.elements.AddRange(convertedFeatureLayerObjects);
|
|
||||||
break;
|
|
||||||
case ADM.RasterLayer rasterLayer:
|
|
||||||
List<Base> convertedRasterLayerObjects = await QueuedTask
|
|
||||||
.Run(() => ConvertRasterLayerObjectsAsync(rasterLayer))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
layerCollection.elements.AddRange(convertedRasterLayerObjects);
|
|
||||||
break;
|
|
||||||
case ADM.LasDatasetLayer lasDatasetLayer:
|
|
||||||
List<Base> convertedLasDatasetObjects = await QueuedTask
|
|
||||||
.Run(() => ConvertLasDatasetLayerObjectsAsync(lasDatasetLayer))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
layerCollection.elements.AddRange(convertedLasDatasetObjects);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
status = Status.ERROR;
|
|
||||||
sdkStatus = SdkActivityStatusCode.Error;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
results.Add(new(status, layerApplicationId, layer.GetType().Name, layerCollection));
|
|
||||||
convertingActivity?.SetStatus(sdkStatus);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new SpeckleException($"No converted Collection found for layer {layerApplicationId}.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex) when (!ex.IsFatal())
|
|
||||||
{
|
|
||||||
_logger.LogSendConversionError(ex, layer.GetType().Name);
|
|
||||||
results.Add(new(Status.ERROR, layerApplicationId, layer.GetType().Name, null, ex));
|
|
||||||
convertingActivity?.SetStatus(SdkActivityStatusCode.Error);
|
|
||||||
convertingActivity?.RecordException(ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
onOperationProgressed.Report(new("Converting", (double)++count / layers.Count));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (results.All(x => x.Status == Status.ERROR))
|
|
||||||
{
|
|
||||||
throw new SpeckleException("Failed to convert all objects."); // fail fast instead creating empty commit! It will appear as model card error with red color.
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3 - Add Color Proxies
|
|
||||||
rootCollection[ProxyKeys.COLOR] = _colorUnpacker.ColorProxyCache.Values.ToList();
|
|
||||||
|
|
||||||
return new RootObjectBuilderResult(rootCollection, results);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<List<Base>> ConvertFeatureLayerObjectsAsync(ADM.FeatureLayer featureLayer)
|
|
||||||
{
|
|
||||||
string layerApplicationId = featureLayer.GetSpeckleApplicationId();
|
|
||||||
List<Base> convertedObjects = new();
|
|
||||||
await QueuedTask
|
|
||||||
.Run(() =>
|
|
||||||
{
|
|
||||||
// store the layer renderer for color unpacking
|
|
||||||
_colorUnpacker.StoreRendererAndFields(featureLayer);
|
|
||||||
|
|
||||||
// search the rows of the layer, where each row is treated like an object
|
|
||||||
// RowCursor is IDisposable but is not being correctly picked up by IDE warnings.
|
|
||||||
// This means we need to be carefully adding using statements based on the API documentation coming from each method/class
|
|
||||||
using (ACD.RowCursor rowCursor = featureLayer.Search())
|
|
||||||
{
|
|
||||||
while (rowCursor.MoveNext())
|
|
||||||
{
|
|
||||||
// Same IDisposable issue appears to happen on Row class too. Docs say it should always be disposed of manually by the caller.
|
|
||||||
using (ACD.Row row = rowCursor.Current)
|
|
||||||
{
|
|
||||||
// get application id. test for subtypes before defaulting to base type.
|
|
||||||
Base converted = _rootToSpeckleConverter.Convert(row);
|
|
||||||
string applicationId = row.GetSpeckleApplicationId(layerApplicationId);
|
|
||||||
converted.applicationId = applicationId;
|
|
||||||
|
|
||||||
convertedObjects.Add(converted);
|
|
||||||
|
|
||||||
// process the object color
|
|
||||||
_colorUnpacker.ProcessFeatureLayerColor(row, applicationId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
return convertedObjects;
|
|
||||||
}
|
|
||||||
|
|
||||||
// POC: raster colors are stored as mesh vertex colors in RasterToSpeckleConverter. Should probably move to color unpacker.
|
|
||||||
private async Task<List<Base>> ConvertRasterLayerObjectsAsync(ADM.RasterLayer rasterLayer)
|
|
||||||
{
|
|
||||||
string layerApplicationId = rasterLayer.GetSpeckleApplicationId();
|
|
||||||
List<Base> convertedObjects = new();
|
|
||||||
await QueuedTask
|
|
||||||
.Run(() =>
|
|
||||||
{
|
|
||||||
Raster raster = rasterLayer.GetRaster();
|
|
||||||
Base converted = _rootToSpeckleConverter.Convert(raster);
|
|
||||||
string applicationId = raster.GetSpeckleApplicationId(layerApplicationId);
|
|
||||||
converted.applicationId = applicationId;
|
|
||||||
convertedObjects.Add(converted);
|
|
||||||
})
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
return convertedObjects;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<List<Base>> ConvertLasDatasetLayerObjectsAsync(ADM.LasDatasetLayer lasDatasetLayer)
|
|
||||||
{
|
|
||||||
string layerApplicationId = lasDatasetLayer.GetSpeckleApplicationId();
|
|
||||||
List<Base> convertedObjects = new();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await QueuedTask
|
|
||||||
.Run(() =>
|
|
||||||
{
|
|
||||||
// store the layer renderer for color unpacking
|
|
||||||
_colorUnpacker.StoreRenderer(lasDatasetLayer);
|
|
||||||
|
|
||||||
using (
|
|
||||||
ACD.Analyst3D.LasPointCursor ptCursor = lasDatasetLayer.SearchPoints(new ACD.Analyst3D.LasPointFilter())
|
|
||||||
)
|
|
||||||
{
|
|
||||||
while (ptCursor.MoveNext())
|
|
||||||
{
|
|
||||||
using (ACD.Analyst3D.LasPoint pt = ptCursor.Current)
|
|
||||||
{
|
|
||||||
Base converted = _rootToSpeckleConverter.Convert(pt);
|
|
||||||
string applicationId = pt.GetSpeckleApplicationId(layerApplicationId);
|
|
||||||
converted.applicationId = applicationId;
|
|
||||||
convertedObjects.Add(converted);
|
|
||||||
|
|
||||||
// process the object color
|
|
||||||
_colorUnpacker.ProcessLasLayerColor(pt, applicationId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (ACD.Exceptions.TinException ex)
|
|
||||||
{
|
|
||||||
throw new SpeckleException("3D analyst extension is not enabled for .las layer operations", ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
return convertedObjects;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"profiles": {
|
|
||||||
"Speckle.Connectors.ArcGIS3_all_users": {
|
|
||||||
"commandName": "Executable",
|
|
||||||
"executablePath": "C:\\Program Files\\ArcGIS\\Pro\\bin\\ArcGISPro.exe",
|
|
||||||
"commandLineArgs": ""
|
|
||||||
},
|
|
||||||
"Speckle.Connectors.ArcGIS3_user": {
|
|
||||||
"commandName": "Executable",
|
|
||||||
"executablePath": "C:\\Users\\%USERNAME%\\AppData\\Local\\Programs\\ArcGIS\\Pro\\bin\\ArcGISPro.exe",
|
|
||||||
"commandLineArgs": ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>net6.0-windows</TargetFramework>
|
|
||||||
<UseWPF>true</UseWPF>
|
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
|
||||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
|
||||||
<RootNameSpace>Speckle.Connectors.ArcGIS</RootNameSpace>
|
|
||||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
|
||||||
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
|
|
||||||
<EnableWindowsTargeting>true</EnableWindowsTargeting>
|
|
||||||
<DefineConstants>$(DefineConstants);ARCGIS3</DefineConstants>
|
|
||||||
<Configurations>Debug;Release;Local</Configurations>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="Config.daml" />
|
|
||||||
<Content Include="Images\s2logo_16.png" />
|
|
||||||
<Content Include="Images\s2logo_32.png" />
|
|
||||||
<Content Include="DarkImages\s2logo_16.png" />
|
|
||||||
<Content Include="DarkImages\s2logo_32.png" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Esri.ArcGISPro.Extensions30" IncludeAssets="compile" />
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\..\Converters\ArcGIS\Speckle.Converters.ArcGIS3\Speckle.Converters.ArcGIS3.csproj" />
|
|
||||||
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
|
|
||||||
<ProjectReference Include="..\..\..\Sdk\Speckle.Connectors.Common\Speckle.Connectors.Common.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<Import Project="Esri.ArcGISPro.Extensions30.Speckle.targets" />
|
|
||||||
</Project>
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
using ArcGIS.Desktop.Framework;
|
|
||||||
using ArcGIS.Desktop.Framework.Contracts;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS;
|
|
||||||
|
|
||||||
internal sealed class SpeckleDUI3ViewModel : DockPane
|
|
||||||
{
|
|
||||||
private const string DOCKPANE_ID = "SpeckleDUI3_SpeckleDUI3";
|
|
||||||
|
|
||||||
internal static void Create()
|
|
||||||
{
|
|
||||||
var pane = FrameworkApplication.DockPaneManager.Find(DOCKPANE_ID);
|
|
||||||
pane?.Activate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Called when the pane is initialized.
|
|
||||||
/// </summary>
|
|
||||||
protected override async Task InitializeAsync()
|
|
||||||
{
|
|
||||||
await base.InitializeAsync().ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Called when the pane is uninitialized.
|
|
||||||
/// </summary>
|
|
||||||
protected override async Task UninitializeAsync()
|
|
||||||
{
|
|
||||||
await base.UninitializeAsync().ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Button implementation to create a new instance of the pane and activate it.
|
|
||||||
/// </summary>
|
|
||||||
internal sealed class SpeckleDUI3OpenButton : Button
|
|
||||||
{
|
|
||||||
protected override void OnClick()
|
|
||||||
{
|
|
||||||
SpeckleDUI3ViewModel.Create();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
using System.Windows.Controls;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Speckle.Connectors.DUI.WebView;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS;
|
|
||||||
|
|
||||||
public class SpeckleDUI3Wrapper : UserControl
|
|
||||||
{
|
|
||||||
public SpeckleDUI3Wrapper()
|
|
||||||
{
|
|
||||||
Initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Initialize()
|
|
||||||
{
|
|
||||||
Content = SpeckleModule.Current.Container.GetRequiredService<DUI3ControlWebView>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
using ArcGIS.Desktop.Framework;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Speckle.Connectors.ArcGIS.DependencyInjection;
|
|
||||||
using Speckle.Connectors.Common;
|
|
||||||
using Speckle.Connectors.DUI;
|
|
||||||
using Speckle.Converters.ArcGIS3;
|
|
||||||
using Speckle.Sdk.Host;
|
|
||||||
using Module = ArcGIS.Desktop.Framework.Contracts.Module;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This sample shows how to implement pane that contains an Edge WebView2 control using the built-in ArcGIS Pro SDK's WebBrowser control. For details on how to utilize the WebBrowser control in an add-in see here: https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-Framework#webbrowser For details on how to utilize the Microsoft Edge web browser control in an add-in see here: https://github.com/Esri/arcgis-pro-sdk/wiki/ProConcepts-Framework#webbrowser-control
|
|
||||||
/// </summary>
|
|
||||||
internal sealed class SpeckleModule : Module
|
|
||||||
{
|
|
||||||
private static SpeckleModule? s_this;
|
|
||||||
private readonly IDisposable? _disposableLogger;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Retrieve the singleton instance to this module here
|
|
||||||
/// </summary>
|
|
||||||
public static SpeckleModule Current =>
|
|
||||||
s_this ??= (SpeckleModule)FrameworkApplication.FindModule("ConnectorArcGIS_Module");
|
|
||||||
|
|
||||||
public ServiceProvider Container { get; }
|
|
||||||
|
|
||||||
public SpeckleModule()
|
|
||||||
{
|
|
||||||
AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolver.OnAssemblyResolve<SpeckleModule>;
|
|
||||||
|
|
||||||
var services = new ServiceCollection();
|
|
||||||
// init DI
|
|
||||||
_disposableLogger = services.Initialize(HostApplications.ArcGIS, GetVersion());
|
|
||||||
services.AddArcGIS();
|
|
||||||
services.AddArcGISConverters();
|
|
||||||
Container = services.BuildServiceProvider();
|
|
||||||
Container.UseDUI();
|
|
||||||
}
|
|
||||||
|
|
||||||
private HostAppVersion GetVersion()
|
|
||||||
{
|
|
||||||
#if ARCGIS3
|
|
||||||
return HostAppVersion.v3;
|
|
||||||
#else
|
|
||||||
throw new NotImplementedException();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Called by Framework when ArcGIS Pro is closing
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>False to prevent Pro from closing, otherwise True</returns>
|
|
||||||
protected override bool CanUnload()
|
|
||||||
{
|
|
||||||
//TODO - add your business logic
|
|
||||||
//return false to ~cancel~ Application close
|
|
||||||
_disposableLogger?.Dispose();
|
|
||||||
Container.Dispose();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
using System.Xml.Linq;
|
|
||||||
using ArcGIS.Desktop.Core.Events;
|
|
||||||
using ArcGIS.Desktop.Framework.Threading.Tasks;
|
|
||||||
using ArcGIS.Desktop.Mapping;
|
|
||||||
using ArcGIS.Desktop.Mapping.Events;
|
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
|
||||||
using Speckle.Connectors.DUI.Models;
|
|
||||||
using Speckle.Connectors.DUI.Utils;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.Utils;
|
|
||||||
|
|
||||||
public class ArcGISDocumentStore : DocumentModelStore
|
|
||||||
{
|
|
||||||
public ArcGISDocumentStore(IJsonSerializer jsonSerializer, ITopLevelExceptionHandler topLevelExceptionHandler)
|
|
||||||
: base(jsonSerializer)
|
|
||||||
{
|
|
||||||
ActiveMapViewChangedEvent.Subscribe(a => topLevelExceptionHandler.CatchUnhandled(() => OnMapViewChanged(a)), true);
|
|
||||||
ProjectSavingEvent.Subscribe(
|
|
||||||
_ =>
|
|
||||||
{
|
|
||||||
topLevelExceptionHandler.CatchUnhandled(OnProjectSaving);
|
|
||||||
return Task.CompletedTask;
|
|
||||||
},
|
|
||||||
true
|
|
||||||
);
|
|
||||||
ProjectClosingEvent.Subscribe(
|
|
||||||
_ =>
|
|
||||||
{
|
|
||||||
topLevelExceptionHandler.CatchUnhandled(OnProjectClosing);
|
|
||||||
return Task.CompletedTask;
|
|
||||||
},
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
// in case plugin was loaded into already opened Map, read metadata from the current Map
|
|
||||||
if (!IsDocumentInit && MapView.Active != null)
|
|
||||||
{
|
|
||||||
IsDocumentInit = true;
|
|
||||||
LoadState();
|
|
||||||
OnDocumentChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnProjectClosing()
|
|
||||||
{
|
|
||||||
if (MapView.Active is null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SaveState();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnProjectSaving()
|
|
||||||
{
|
|
||||||
if (MapView.Active is not null)
|
|
||||||
{
|
|
||||||
SaveState();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// On map view switch, this event trigger twice, first for outgoing view, second for incoming view.
|
|
||||||
/// </summary>
|
|
||||||
private void OnMapViewChanged(ActiveMapViewChangedEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.IncomingView is null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
IsDocumentInit = true;
|
|
||||||
LoadState();
|
|
||||||
OnDocumentChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void HostAppSaveState(string modelCardState)
|
|
||||||
{
|
|
||||||
Map map = MapView.Active.Map;
|
|
||||||
QueuedTask.Run(() =>
|
|
||||||
{
|
|
||||||
// Read existing metadata - To prevent messing existing metadata. 🤞 Hope other add-in developers will do same :D
|
|
||||||
var existingMetadata = map.GetMetadata();
|
|
||||||
|
|
||||||
// Parse existing metadata
|
|
||||||
XDocument existingXmlDocument = !string.IsNullOrEmpty(existingMetadata)
|
|
||||||
? XDocument.Parse(existingMetadata)
|
|
||||||
: new XDocument(new XElement("metadata"));
|
|
||||||
|
|
||||||
XElement xmlModelCards = new("SpeckleModelCards", modelCardState);
|
|
||||||
|
|
||||||
// Check if SpeckleModelCards element already exists at root and update it
|
|
||||||
var speckleModelCardsElement = existingXmlDocument.Root?.Element("SpeckleModelCards");
|
|
||||||
if (speckleModelCardsElement != null)
|
|
||||||
{
|
|
||||||
speckleModelCardsElement.ReplaceWith(xmlModelCards);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
existingXmlDocument.Root?.Add(xmlModelCards);
|
|
||||||
}
|
|
||||||
|
|
||||||
map.SetMetadata(existingXmlDocument.ToString());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void LoadState()
|
|
||||||
{
|
|
||||||
Map map = MapView.Active.Map;
|
|
||||||
QueuedTask.Run(() =>
|
|
||||||
{
|
|
||||||
var metadata = map.GetMetadata();
|
|
||||||
var root = XDocument.Parse(metadata).Root;
|
|
||||||
var element = root?.Element("SpeckleModelCards");
|
|
||||||
if (element is null)
|
|
||||||
{
|
|
||||||
ClearAndSave();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
string modelsString = element.Value;
|
|
||||||
LoadFromString(modelsString);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
using ArcGIS.Desktop.Mapping;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.Utils;
|
|
||||||
|
|
||||||
// bind together a layer object on the map, and auto-assigned ID if the specific feature
|
|
||||||
public readonly struct MapMemberFeature
|
|
||||||
{
|
|
||||||
public int? FeatureId { get; } // unique feature id (start from 0) of a feature in the layer
|
|
||||||
public MapMember MapMember { get; } // layer object on the Map
|
|
||||||
|
|
||||||
public MapMemberFeature(MapMember mapMember, int? featureId)
|
|
||||||
{
|
|
||||||
MapMember = mapMember;
|
|
||||||
FeatureId = featureId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
using ArcGIS.Desktop.Mapping;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.ArcGIS.Utils;
|
|
||||||
|
|
||||||
public class MapMembersUtils
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Returns all Layers and Standalone Tables present on the Map
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="map"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public List<MapMember> GetAllMapMembers(Map map)
|
|
||||||
{
|
|
||||||
// first get all map layers
|
|
||||||
List<MapMember> mapMembers = new();
|
|
||||||
var layerMapMembers = UnpackMapLayers(map.Layers);
|
|
||||||
mapMembers.AddRange(layerMapMembers);
|
|
||||||
|
|
||||||
// add tables
|
|
||||||
var standaloneTableMapMembers = UnpackMapLayers(map.StandaloneTables);
|
|
||||||
mapMembers.AddRange(standaloneTableMapMembers);
|
|
||||||
return mapMembers;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<MapMember> UnpackMapLayers(IEnumerable<MapMember> mapMembersToUnpack)
|
|
||||||
{
|
|
||||||
List<MapMember> mapMembers = new();
|
|
||||||
foreach (var layer in mapMembersToUnpack)
|
|
||||||
{
|
|
||||||
mapMembers.Add(layer);
|
|
||||||
switch (layer)
|
|
||||||
{
|
|
||||||
case ILayerContainer subGroup:
|
|
||||||
var subLayerMapMembers = UnpackMapLayers(subGroup.Layers);
|
|
||||||
mapMembers.AddRange(subLayerMapMembers);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return mapMembers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sorts the selected mapmembers into the same order as they appear in the Table of Contents (TOC) bar in the file.
|
|
||||||
/// This is a required step before unpacking layers, because depending on the user selection order, some children layers may appear before their container layer if both the container and children layers are selected.
|
|
||||||
/// </summary>
|
|
||||||
public IEnumerable<MapMember> GetMapMembersInOrder(Map map, IReadOnlyList<MapMember> selectedMapMembers)
|
|
||||||
{
|
|
||||||
// first get all map layers
|
|
||||||
List<MapMember> allMapMembers = GetAllMapMembers(map);
|
|
||||||
|
|
||||||
// recalculate selected layer priority from all map layers
|
|
||||||
foreach (MapMember mapMember in allMapMembers)
|
|
||||||
{
|
|
||||||
if (selectedMapMembers.Contains(mapMember))
|
|
||||||
{
|
|
||||||
yield return mapMember;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
namespace Speckle.Connectors.ArcGIS.Utils;
|
|
||||||
|
|
||||||
// this struct is needed to be able to parse single-string value into IDs of both a layer, and it's individual feature
|
|
||||||
public struct ObjectID
|
|
||||||
{
|
|
||||||
private const string FEATURE_ID_SEPARATOR = "__speckleFeatureId__";
|
|
||||||
public string MappedLayerURI { get; } // unique ID of the layer on the map
|
|
||||||
public int? FeatureId { get; } // unique feature id (start from 0) of a feature in the layer
|
|
||||||
|
|
||||||
public ObjectID(string encodedId)
|
|
||||||
{
|
|
||||||
List<string> stringParts = encodedId.Split(FEATURE_ID_SEPARATOR).ToList();
|
|
||||||
MappedLayerURI = stringParts[0];
|
|
||||||
FeatureId = null;
|
|
||||||
if (stringParts.Count > 1)
|
|
||||||
{
|
|
||||||
FeatureId = Convert.ToInt32(stringParts[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ObjectID(string layerId, int? featureId)
|
|
||||||
{
|
|
||||||
MappedLayerURI = layerId;
|
|
||||||
FeatureId = featureId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public readonly string ObjectIdToString()
|
|
||||||
{
|
|
||||||
if (FeatureId == null)
|
|
||||||
{
|
|
||||||
return $"{MappedLayerURI}";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return $"{MappedLayerURI}{FEATURE_ID_SEPARATOR}{FeatureId}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<Target AfterTargets="Clean" Name="CleanAddinAutocad" Condition="'$(AutoCADVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true' And '$(OS)' == 'Windows_NT'">
|
||||||
|
<RemoveDir Directories="$(AppData)\Autodesk\ApplicationPlugins\Speckle.Connectors.Autocad$(AutoCADVersion);" />
|
||||||
|
</Target>
|
||||||
|
|
||||||
|
<Target AfterTargets="Build" Name="AfterBuildAutoCAD" Condition="'$(AutoCADVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true' And '$(OS)' == 'Windows_NT'">
|
||||||
|
<ItemGroup>
|
||||||
|
<AutoCADDLLs Include="$(TargetDir)\**\*.*" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Message Text="AutoCAD Version $(AutoCADVersion)" Importance="high"/>
|
||||||
|
<Copy DestinationFolder="$(AppData)\Autodesk\ApplicationPlugins\Speckle.Connectors.Autocad$(AutoCADVersion)\%(RecursiveDir)" SourceFiles="@(AutoCADDLLs)" />
|
||||||
|
</Target>
|
||||||
|
|
||||||
|
<Target AfterTargets="Clean" Name="CleanAddinCivil3D" Condition="'$(Civil3DVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true' And '$(OS)' == 'Windows_NT'">
|
||||||
|
<RemoveDir Directories="$(AppData)\Autodesk\ApplicationPlugins\Speckle.Connectors.Civil3d$(Civil3DVersion);" />
|
||||||
|
</Target>
|
||||||
|
|
||||||
|
<Target AfterTargets="Build" Name="AfterBuildCivil3D" Condition="'$(Civil3DVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true' And '$(OS)' == 'Windows_NT'">
|
||||||
|
<ItemGroup>
|
||||||
|
<Civil3DDLLs Include="$(TargetDir)\**\*.*" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Message Text="Civil3D Version $(Civil3DVersion)" Importance="high"/>
|
||||||
|
<Copy DestinationFolder="$(AppData)\Autodesk\ApplicationPlugins\Speckle.Connectors.Civil3d$(Civil3DVersion)\%(RecursiveDir)" SourceFiles="@(Civil3DDLLs)" />
|
||||||
|
</Target>
|
||||||
|
|
||||||
|
<PropertyGroup Condition="'$(AutoCADVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true' And '$(OS)' == 'Windows_NT'">
|
||||||
|
<StartAction>Program</StartAction>
|
||||||
|
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(AutoCADVersion)\acad.exe</StartProgram>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Civil3DVersion)' != '' And '$(ContinuousIntegrationBuild)' != 'true' And '$(OS)' == 'Windows_NT'">
|
||||||
|
<StartAction>Program</StartAction>
|
||||||
|
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(Civil3DVersion)\acad.exe</StartProgram>
|
||||||
|
<StartArguments>/product C3D</StartArguments>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
@@ -6,12 +6,10 @@
|
|||||||
<AutoCADVersion>2022</AutoCADVersion>
|
<AutoCADVersion>2022</AutoCADVersion>
|
||||||
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2022;AUTOCAD2022_OR_GREATER</DefineConstants>
|
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2022;AUTOCAD2022_OR_GREATER</DefineConstants>
|
||||||
<Configurations>Debug;Release;Local</Configurations>
|
<Configurations>Debug;Release;Local</Configurations>
|
||||||
<StartAction>Program</StartAction>
|
|
||||||
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(AutoCADVersion)\acad.exe</StartProgram>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2022.0.2" />
|
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2022.0.2" ExcludeAssets="runtime"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -164,16 +164,32 @@
|
|||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||||
},
|
},
|
||||||
"Speckle.DoubleNumerics": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.0.1",
|
|
||||||
"contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
|
|
||||||
},
|
|
||||||
"Speckle.Newtonsoft.Json": {
|
"Speckle.Newtonsoft.Json": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "13.0.2",
|
"resolved": "13.0.2",
|
||||||
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
||||||
},
|
},
|
||||||
|
"Speckle.Sdk": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "D04pCdleqLeDxthANCb8+X1xfEYr4+Q3GTuHtqOrMQeGHDAVPc5G3M0D6VYEUYbLYav0NBZ6tNuWO2Y/fqfWSw==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client": "6.0.0",
|
||||||
|
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||||
|
"Microsoft.CSharp": "4.7.0",
|
||||||
|
"Microsoft.Data.Sqlite": "7.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Logging": "2.2.0",
|
||||||
|
"Speckle.DoubleNumerics": "4.1.0",
|
||||||
|
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||||
|
"Speckle.Sdk.Dependencies": "3.11.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Speckle.Sdk.Dependencies": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "u8lJ+ECslmVPsn4yOCg3hAzj3zh6r+gp2oQh8RDGn22NihIPOsMhBFvoBruL1QVhXdJcS4rI2J6VEAbdvL9FRg=="
|
||||||
|
},
|
||||||
"SQLitePCLRaw.bundle_e_sqlite3": {
|
"SQLitePCLRaw.bundle_e_sqlite3": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "2.1.4",
|
"resolved": "2.1.4",
|
||||||
@@ -264,19 +280,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )",
|
"Speckle.Converters.Common": "[1.0.0, )",
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui": {
|
"speckle.connectors.dui": {
|
||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
"Speckle.Connectors.Common": "[1.0.0, )"
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )",
|
|
||||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui.webview": {
|
"speckle.connectors.dui.webview": {
|
||||||
@@ -300,7 +312,7 @@
|
|||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )"
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Microsoft.Extensions.DependencyInjection": {
|
"Microsoft.Extensions.DependencyInjection": {
|
||||||
@@ -336,43 +348,20 @@
|
|||||||
"resolved": "1.0.1938.49",
|
"resolved": "1.0.1938.49",
|
||||||
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
||||||
},
|
},
|
||||||
|
"Speckle.DoubleNumerics": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[4.1.0, )",
|
||||||
|
"resolved": "4.1.0",
|
||||||
|
"contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
|
||||||
|
},
|
||||||
"Speckle.Objects": {
|
"Speckle.Objects": {
|
||||||
"type": "CentralTransitive",
|
"type": "CentralTransitive",
|
||||||
"requested": "[3.1.0-dev.219, )",
|
"requested": "[3.11.1, )",
|
||||||
"resolved": "3.1.0-dev.219",
|
"resolved": "3.11.1",
|
||||||
"contentHash": "2thsMUDkRr7lR0PXZJ8k3KWZLWjz/aBY0KaO2SuXM0lIKyJw1APMJ7lXJ89e6JAjBzEbK8yLHBb0qtfcc4bNRw==",
|
"contentHash": "JUCY3bA6Pa+fa6wZV9uQ9mhLRihvICkF58nIr28Yi94j0th7wSg4l8WeThl3ubKVnHDQE5mdVffVlY1e5ZUkuQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Speckle.Sdk": "3.1.0-dev.219"
|
"Speckle.Sdk": "3.11.1"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"Speckle.Sdk": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "UTgz9UgkMFGqRLmCq1HPo74MngvKbSZOFWaMRzASHrrnsBtzZatBXjoJBlvVoeBCoiea5Jj+BgZg6RvlV2m3sg==",
|
|
||||||
"dependencies": {
|
|
||||||
"GraphQL.Client": "6.0.0",
|
|
||||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.Data.Sqlite": "7.0.5",
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
|
||||||
"Microsoft.Extensions.Logging": "2.2.0",
|
|
||||||
"Speckle.DoubleNumerics": "4.0.1",
|
|
||||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
|
||||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.219"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Speckle.Sdk.Dependencies": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "5hqBd9whAs5cC8S/6YUgKFOivjntAkVutKhz06XD/f3Kj6xScT3hwcUaWBxiwK3Mw7FLtiVuU1uG777pjn0PKQ=="
|
|
||||||
},
|
|
||||||
"System.Threading.Tasks.Dataflow": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[6.0.0, )",
|
|
||||||
"resolved": "6.0.0",
|
|
||||||
"contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,12 +6,10 @@
|
|||||||
<AutoCADVersion>2023</AutoCADVersion>
|
<AutoCADVersion>2023</AutoCADVersion>
|
||||||
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2023;AUTOCAD2022_OR_GREATER;AUTOCAD2023_OR_GREATER</DefineConstants>
|
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2023;AUTOCAD2022_OR_GREATER;AUTOCAD2023_OR_GREATER</DefineConstants>
|
||||||
<Configurations>Debug;Release;Local</Configurations>
|
<Configurations>Debug;Release;Local</Configurations>
|
||||||
<StartAction>Program</StartAction>
|
|
||||||
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(AutoCADVersion)\acad.exe</StartProgram>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2023.0.0" />
|
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2023.0.0" ExcludeAssets="runtime"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -164,16 +164,32 @@
|
|||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||||
},
|
},
|
||||||
"Speckle.DoubleNumerics": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.0.1",
|
|
||||||
"contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
|
|
||||||
},
|
|
||||||
"Speckle.Newtonsoft.Json": {
|
"Speckle.Newtonsoft.Json": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "13.0.2",
|
"resolved": "13.0.2",
|
||||||
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
||||||
},
|
},
|
||||||
|
"Speckle.Sdk": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "D04pCdleqLeDxthANCb8+X1xfEYr4+Q3GTuHtqOrMQeGHDAVPc5G3M0D6VYEUYbLYav0NBZ6tNuWO2Y/fqfWSw==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client": "6.0.0",
|
||||||
|
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||||
|
"Microsoft.CSharp": "4.7.0",
|
||||||
|
"Microsoft.Data.Sqlite": "7.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Logging": "2.2.0",
|
||||||
|
"Speckle.DoubleNumerics": "4.1.0",
|
||||||
|
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||||
|
"Speckle.Sdk.Dependencies": "3.11.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Speckle.Sdk.Dependencies": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "u8lJ+ECslmVPsn4yOCg3hAzj3zh6r+gp2oQh8RDGn22NihIPOsMhBFvoBruL1QVhXdJcS4rI2J6VEAbdvL9FRg=="
|
||||||
|
},
|
||||||
"SQLitePCLRaw.bundle_e_sqlite3": {
|
"SQLitePCLRaw.bundle_e_sqlite3": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "2.1.4",
|
"resolved": "2.1.4",
|
||||||
@@ -264,19 +280,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )",
|
"Speckle.Converters.Common": "[1.0.0, )",
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui": {
|
"speckle.connectors.dui": {
|
||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
"Speckle.Connectors.Common": "[1.0.0, )"
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )",
|
|
||||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui.webview": {
|
"speckle.connectors.dui.webview": {
|
||||||
@@ -300,7 +312,7 @@
|
|||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )"
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Microsoft.Extensions.DependencyInjection": {
|
"Microsoft.Extensions.DependencyInjection": {
|
||||||
@@ -336,43 +348,20 @@
|
|||||||
"resolved": "1.0.1938.49",
|
"resolved": "1.0.1938.49",
|
||||||
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
||||||
},
|
},
|
||||||
|
"Speckle.DoubleNumerics": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[4.1.0, )",
|
||||||
|
"resolved": "4.1.0",
|
||||||
|
"contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
|
||||||
|
},
|
||||||
"Speckle.Objects": {
|
"Speckle.Objects": {
|
||||||
"type": "CentralTransitive",
|
"type": "CentralTransitive",
|
||||||
"requested": "[3.1.0-dev.219, )",
|
"requested": "[3.11.1, )",
|
||||||
"resolved": "3.1.0-dev.219",
|
"resolved": "3.11.1",
|
||||||
"contentHash": "2thsMUDkRr7lR0PXZJ8k3KWZLWjz/aBY0KaO2SuXM0lIKyJw1APMJ7lXJ89e6JAjBzEbK8yLHBb0qtfcc4bNRw==",
|
"contentHash": "JUCY3bA6Pa+fa6wZV9uQ9mhLRihvICkF58nIr28Yi94j0th7wSg4l8WeThl3ubKVnHDQE5mdVffVlY1e5ZUkuQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Speckle.Sdk": "3.1.0-dev.219"
|
"Speckle.Sdk": "3.11.1"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"Speckle.Sdk": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "UTgz9UgkMFGqRLmCq1HPo74MngvKbSZOFWaMRzASHrrnsBtzZatBXjoJBlvVoeBCoiea5Jj+BgZg6RvlV2m3sg==",
|
|
||||||
"dependencies": {
|
|
||||||
"GraphQL.Client": "6.0.0",
|
|
||||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.Data.Sqlite": "7.0.5",
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
|
||||||
"Microsoft.Extensions.Logging": "2.2.0",
|
|
||||||
"Speckle.DoubleNumerics": "4.0.1",
|
|
||||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
|
||||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.219"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Speckle.Sdk.Dependencies": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "5hqBd9whAs5cC8S/6YUgKFOivjntAkVutKhz06XD/f3Kj6xScT3hwcUaWBxiwK3Mw7FLtiVuU1uG777pjn0PKQ=="
|
|
||||||
},
|
|
||||||
"System.Threading.Tasks.Dataflow": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[6.0.0, )",
|
|
||||||
"resolved": "6.0.0",
|
|
||||||
"contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,15 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net48</TargetFramework>
|
<TargetFramework>net48</TargetFramework>
|
||||||
|
<AutoCADVersion>2024</AutoCADVersion>
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
<UseWpf>true</UseWpf>
|
<UseWpf>true</UseWpf>
|
||||||
<AutoCADVersion>2024</AutoCADVersion>
|
|
||||||
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2024;AUTOCAD2022_OR_GREATER;AUTOCAD2023_OR_GREATER;AUTOCAD2024_OR_GREATER</DefineConstants>
|
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2024;AUTOCAD2022_OR_GREATER;AUTOCAD2023_OR_GREATER;AUTOCAD2024_OR_GREATER</DefineConstants>
|
||||||
<Configurations>Debug;Release;Local</Configurations>
|
<Configurations>Debug;Release;Local</Configurations>
|
||||||
<StartAction>Program</StartAction>
|
|
||||||
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(AutoCADVersion)\acad.exe</StartProgram>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2024.0.0" />
|
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2024.0.0" ExcludeAssets="runtime"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -164,16 +164,32 @@
|
|||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||||
},
|
},
|
||||||
"Speckle.DoubleNumerics": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.0.1",
|
|
||||||
"contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
|
|
||||||
},
|
|
||||||
"Speckle.Newtonsoft.Json": {
|
"Speckle.Newtonsoft.Json": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "13.0.2",
|
"resolved": "13.0.2",
|
||||||
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
||||||
},
|
},
|
||||||
|
"Speckle.Sdk": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "D04pCdleqLeDxthANCb8+X1xfEYr4+Q3GTuHtqOrMQeGHDAVPc5G3M0D6VYEUYbLYav0NBZ6tNuWO2Y/fqfWSw==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client": "6.0.0",
|
||||||
|
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||||
|
"Microsoft.CSharp": "4.7.0",
|
||||||
|
"Microsoft.Data.Sqlite": "7.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Logging": "2.2.0",
|
||||||
|
"Speckle.DoubleNumerics": "4.1.0",
|
||||||
|
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||||
|
"Speckle.Sdk.Dependencies": "3.11.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Speckle.Sdk.Dependencies": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "u8lJ+ECslmVPsn4yOCg3hAzj3zh6r+gp2oQh8RDGn22NihIPOsMhBFvoBruL1QVhXdJcS4rI2J6VEAbdvL9FRg=="
|
||||||
|
},
|
||||||
"SQLitePCLRaw.bundle_e_sqlite3": {
|
"SQLitePCLRaw.bundle_e_sqlite3": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "2.1.4",
|
"resolved": "2.1.4",
|
||||||
@@ -264,19 +280,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )",
|
"Speckle.Converters.Common": "[1.0.0, )",
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui": {
|
"speckle.connectors.dui": {
|
||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
"Speckle.Connectors.Common": "[1.0.0, )"
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )",
|
|
||||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui.webview": {
|
"speckle.connectors.dui.webview": {
|
||||||
@@ -301,7 +313,7 @@
|
|||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )"
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Microsoft.Extensions.DependencyInjection": {
|
"Microsoft.Extensions.DependencyInjection": {
|
||||||
@@ -337,43 +349,20 @@
|
|||||||
"resolved": "1.0.1938.49",
|
"resolved": "1.0.1938.49",
|
||||||
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
||||||
},
|
},
|
||||||
|
"Speckle.DoubleNumerics": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[4.1.0, )",
|
||||||
|
"resolved": "4.1.0",
|
||||||
|
"contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
|
||||||
|
},
|
||||||
"Speckle.Objects": {
|
"Speckle.Objects": {
|
||||||
"type": "CentralTransitive",
|
"type": "CentralTransitive",
|
||||||
"requested": "[3.1.0-dev.219, )",
|
"requested": "[3.11.1, )",
|
||||||
"resolved": "3.1.0-dev.219",
|
"resolved": "3.11.1",
|
||||||
"contentHash": "2thsMUDkRr7lR0PXZJ8k3KWZLWjz/aBY0KaO2SuXM0lIKyJw1APMJ7lXJ89e6JAjBzEbK8yLHBb0qtfcc4bNRw==",
|
"contentHash": "JUCY3bA6Pa+fa6wZV9uQ9mhLRihvICkF58nIr28Yi94j0th7wSg4l8WeThl3ubKVnHDQE5mdVffVlY1e5ZUkuQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Speckle.Sdk": "3.1.0-dev.219"
|
"Speckle.Sdk": "3.11.1"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"Speckle.Sdk": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "UTgz9UgkMFGqRLmCq1HPo74MngvKbSZOFWaMRzASHrrnsBtzZatBXjoJBlvVoeBCoiea5Jj+BgZg6RvlV2m3sg==",
|
|
||||||
"dependencies": {
|
|
||||||
"GraphQL.Client": "6.0.0",
|
|
||||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.Data.Sqlite": "7.0.5",
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
|
||||||
"Microsoft.Extensions.Logging": "2.2.0",
|
|
||||||
"Speckle.DoubleNumerics": "4.0.1",
|
|
||||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
|
||||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.219"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Speckle.Sdk.Dependencies": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "5hqBd9whAs5cC8S/6YUgKFOivjntAkVutKhz06XD/f3Kj6xScT3hwcUaWBxiwK3Mw7FLtiVuU1uG777pjn0PKQ=="
|
|
||||||
},
|
|
||||||
"System.Threading.Tasks.Dataflow": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[6.0.0, )",
|
|
||||||
"resolved": "6.0.0",
|
|
||||||
"contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0-windows</TargetFramework>
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
|
||||||
<UseWpf>true</UseWpf>
|
|
||||||
<AutoCADVersion>2025</AutoCADVersion>
|
<AutoCADVersion>2025</AutoCADVersion>
|
||||||
<DefineConstants>$(DefineConstants);AUTOCAD2025;AUTOCAD</DefineConstants>
|
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2025;AUTOCAD2022_OR_GREATER;AUTOCAD2023_OR_GREATER;AUTOCAD2024_OR_GREATER;AUTOCAD2025_OR_GREATER</DefineConstants>
|
||||||
<Configurations>Debug;Release;Local</Configurations>
|
<Configurations>Debug;Release;Local</Configurations>
|
||||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
</PropertyGroup>
|
||||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
|
|
||||||
<StartAction>Program</StartAction>
|
<PropertyGroup>
|
||||||
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(AutoCADVersion)\acad.exe</StartProgram>
|
<!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
|
||||||
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!--This is needed for managed dependencies-->
|
||||||
|
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!--This is needed for the rest-->
|
||||||
|
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath> <!--This is needed just to keep folder paths the same as the netframework versions of autocad/civil-->
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2025.0.0" />
|
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2025.0.0" ExcludeAssets="runtime"/>
|
||||||
<FrameworkReference Include="Microsoft.WindowsDesktop.App"/>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -75,11 +75,6 @@
|
|||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
|
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
|
||||||
},
|
},
|
||||||
"Microsoft.CSharp": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.7.0",
|
|
||||||
"contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA=="
|
|
||||||
},
|
|
||||||
"Microsoft.Data.Sqlite": {
|
"Microsoft.Data.Sqlite": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "7.0.5",
|
"resolved": "7.0.5",
|
||||||
@@ -155,16 +150,30 @@
|
|||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||||
},
|
},
|
||||||
"Speckle.DoubleNumerics": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.0.1",
|
|
||||||
"contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
|
|
||||||
},
|
|
||||||
"Speckle.Newtonsoft.Json": {
|
"Speckle.Newtonsoft.Json": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "13.0.2",
|
"resolved": "13.0.2",
|
||||||
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
||||||
},
|
},
|
||||||
|
"Speckle.Sdk": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "D04pCdleqLeDxthANCb8+X1xfEYr4+Q3GTuHtqOrMQeGHDAVPc5G3M0D6VYEUYbLYav0NBZ6tNuWO2Y/fqfWSw==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client": "6.0.0",
|
||||||
|
"Microsoft.Data.Sqlite": "7.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Logging": "2.2.0",
|
||||||
|
"Speckle.DoubleNumerics": "4.1.0",
|
||||||
|
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||||
|
"Speckle.Sdk.Dependencies": "3.11.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Speckle.Sdk.Dependencies": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "u8lJ+ECslmVPsn4yOCg3hAzj3zh6r+gp2oQh8RDGn22NihIPOsMhBFvoBruL1QVhXdJcS4rI2J6VEAbdvL9FRg=="
|
||||||
|
},
|
||||||
"SQLitePCLRaw.bundle_e_sqlite3": {
|
"SQLitePCLRaw.bundle_e_sqlite3": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "2.1.4",
|
"resolved": "2.1.4",
|
||||||
@@ -220,19 +229,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )",
|
"Speckle.Converters.Common": "[1.0.0, )",
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui": {
|
"speckle.connectors.dui": {
|
||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
"Speckle.Connectors.Common": "[1.0.0, )"
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )",
|
|
||||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui.webview": {
|
"speckle.connectors.dui.webview": {
|
||||||
@@ -257,7 +262,7 @@
|
|||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )"
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Microsoft.Extensions.DependencyInjection": {
|
"Microsoft.Extensions.DependencyInjection": {
|
||||||
@@ -293,42 +298,20 @@
|
|||||||
"resolved": "1.0.1938.49",
|
"resolved": "1.0.1938.49",
|
||||||
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
||||||
},
|
},
|
||||||
|
"Speckle.DoubleNumerics": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[4.1.0, )",
|
||||||
|
"resolved": "4.1.0",
|
||||||
|
"contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
|
||||||
|
},
|
||||||
"Speckle.Objects": {
|
"Speckle.Objects": {
|
||||||
"type": "CentralTransitive",
|
"type": "CentralTransitive",
|
||||||
"requested": "[3.1.0-dev.219, )",
|
"requested": "[3.11.1, )",
|
||||||
"resolved": "3.1.0-dev.219",
|
"resolved": "3.11.1",
|
||||||
"contentHash": "2thsMUDkRr7lR0PXZJ8k3KWZLWjz/aBY0KaO2SuXM0lIKyJw1APMJ7lXJ89e6JAjBzEbK8yLHBb0qtfcc4bNRw==",
|
"contentHash": "JUCY3bA6Pa+fa6wZV9uQ9mhLRihvICkF58nIr28Yi94j0th7wSg4l8WeThl3ubKVnHDQE5mdVffVlY1e5ZUkuQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Speckle.Sdk": "3.1.0-dev.219"
|
"Speckle.Sdk": "3.11.1"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"Speckle.Sdk": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "UTgz9UgkMFGqRLmCq1HPo74MngvKbSZOFWaMRzASHrrnsBtzZatBXjoJBlvVoeBCoiea5Jj+BgZg6RvlV2m3sg==",
|
|
||||||
"dependencies": {
|
|
||||||
"GraphQL.Client": "6.0.0",
|
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.Data.Sqlite": "7.0.5",
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
|
||||||
"Microsoft.Extensions.Logging": "2.2.0",
|
|
||||||
"Speckle.DoubleNumerics": "4.0.1",
|
|
||||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
|
||||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.219"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Speckle.Sdk.Dependencies": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "5hqBd9whAs5cC8S/6YUgKFOivjntAkVutKhz06XD/f3Kj6xScT3hwcUaWBxiwK3Mw7FLtiVuU1uG777pjn0PKQ=="
|
|
||||||
},
|
|
||||||
"System.Threading.Tasks.Dataflow": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[6.0.0, )",
|
|
||||||
"resolved": "6.0.0",
|
|
||||||
"contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"net8.0-windows7.0/win-x64": {
|
"net8.0-windows7.0/win-x64": {
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
|
<AutoCADVersion>2026</AutoCADVersion>
|
||||||
|
<DefineConstants>$(DefineConstants);AUTOCAD;AUTOCAD2026;AUTOCAD2022_OR_GREATER;AUTOCAD2023_OR_GREATER;AUTOCAD2024_OR_GREATER;AUTOCAD2025_OR_GREATER;AUTOCAD2026_OR_GREATER</DefineConstants>
|
||||||
|
<Configurations>Debug;Release;Local</Configurations>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
|
||||||
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!--This is needed for managed dependencies-->
|
||||||
|
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!--This is needed for the rest-->
|
||||||
|
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath> <!--This is needed just to keep folder paths the same as the netframework versions of autocad/civil-->
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2026.0.0" ExcludeAssets="runtime"/>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\Converters\Autocad\Speckle.Converters.Autocad2026\Speckle.Converters.Autocad2026.csproj" />
|
||||||
|
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
|
||||||
|
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<Import Project="..\Speckle.Connectors.AutocadShared\Speckle.Connectors.AutocadShared.projitems" Label="Shared" />
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,331 @@
|
|||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"dependencies": {
|
||||||
|
"net8.0-windows7.0": {
|
||||||
|
"Microsoft.NETFramework.ReferenceAssemblies": {
|
||||||
|
"type": "Direct",
|
||||||
|
"requested": "[1.0.3, )",
|
||||||
|
"resolved": "1.0.3",
|
||||||
|
"contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETFramework.ReferenceAssemblies.net461": "1.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.SourceLink.GitHub": {
|
||||||
|
"type": "Direct",
|
||||||
|
"requested": "[8.0.0, )",
|
||||||
|
"resolved": "8.0.0",
|
||||||
|
"contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Build.Tasks.Git": "8.0.0",
|
||||||
|
"Microsoft.SourceLink.Common": "8.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"PolySharp": {
|
||||||
|
"type": "Direct",
|
||||||
|
"requested": "[1.14.1, )",
|
||||||
|
"resolved": "1.14.1",
|
||||||
|
"contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ=="
|
||||||
|
},
|
||||||
|
"Speckle.AutoCAD.API": {
|
||||||
|
"type": "Direct",
|
||||||
|
"requested": "[2026.0.0, )",
|
||||||
|
"resolved": "2026.0.0",
|
||||||
|
"contentHash": "WlkV81PmbK/ftoM7aGpU6LGosKbePBQej9MO/m63rFMozX89tsitEhE12o58wu7K/4FmRUdAMolYtdK20EDBnw=="
|
||||||
|
},
|
||||||
|
"Speckle.InterfaceGenerator": {
|
||||||
|
"type": "Direct",
|
||||||
|
"requested": "[0.9.6, )",
|
||||||
|
"resolved": "0.9.6",
|
||||||
|
"contentHash": "HKH7tYrYYlCK1ct483hgxERAdVdMtl7gUKW9ijWXxA1UsYR4Z+TrRHYmzZ9qmpu1NnTycSrp005NYM78GDKV1w=="
|
||||||
|
},
|
||||||
|
"GraphQL.Client": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "6.0.0",
|
||||||
|
"contentHash": "8yPNBbuVBpTptivyAlak4GZvbwbUcjeQTL4vN1HKHRuOykZ4r7l5fcLS6vpyPyLn0x8FsL31xbOIKyxbmR9rbA==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client.Abstractions": "6.0.0",
|
||||||
|
"GraphQL.Client.Abstractions.Websocket": "6.0.0",
|
||||||
|
"System.Reactive": "5.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"GraphQL.Client.Abstractions": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "6.0.0",
|
||||||
|
"contentHash": "h7uzWFORHZ+CCjwr/ThAyXMr0DPpzEANDa4Uo54wqCQ+j7qUKwqYTgOrb1W40sqbvNaZm9v/X7It31SUw0maHA==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Primitives": "6.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"GraphQL.Client.Abstractions.Websocket": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "6.0.0",
|
||||||
|
"contentHash": "Nr9bPf8gIOvLuXpqEpqr9z9jslYFJOvd0feHth3/kPqeR3uMbjF5pjiwh4jxyMcxHdr8Pb6QiXkV3hsSyt0v7A==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client.Abstractions": "6.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"GraphQL.Primitives": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "6.0.0",
|
||||||
|
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
|
||||||
|
},
|
||||||
|
"Microsoft.Build.Tasks.Git": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "8.0.0",
|
||||||
|
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
|
||||||
|
},
|
||||||
|
"Microsoft.Data.Sqlite": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "7.0.5",
|
||||||
|
"contentHash": "KGxbPeWsQMnmQy43DSBxAFtHz3l2JX8EWBSGUCvT3CuZ8KsuzbkqMIJMDOxWtG8eZSoCDI04aiVQjWuuV8HmSw==",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Data.Sqlite.Core": "7.0.5",
|
||||||
|
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Data.Sqlite.Core": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "7.0.5",
|
||||||
|
"contentHash": "FTerRmQPqHrCrnoUzhBu+E+1DNGwyrAMLqHkAqOOOu5pGfyMOj8qQUBxI/gDtWtG11p49UxSfWmBzRNlwZqfUg==",
|
||||||
|
"dependencies": {
|
||||||
|
"SQLitePCLRaw.core": "2.1.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "2.2.0",
|
||||||
|
"contentHash": "nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.Abstractions": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "2.2.0",
|
||||||
|
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Primitives": "2.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Configuration.Binder": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "2.2.0",
|
||||||
|
"contentHash": "vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration": "2.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "2.2.0",
|
||||||
|
"contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw=="
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Options": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "2.2.0",
|
||||||
|
"contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Primitives": "2.2.0",
|
||||||
|
"System.ComponentModel.Annotations": "4.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Primitives": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "2.2.0",
|
||||||
|
"contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==",
|
||||||
|
"dependencies": {
|
||||||
|
"System.Memory": "4.5.1",
|
||||||
|
"System.Runtime.CompilerServices.Unsafe": "4.5.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.NETFramework.ReferenceAssemblies.net461": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "1.0.3",
|
||||||
|
"contentHash": "AmOJZwCqnOCNp6PPcf9joyogScWLtwy0M1WkqfEQ0M9nYwyDD7EX9ZjscKS5iYnyvteX7kzSKFCKt9I9dXA6mA=="
|
||||||
|
},
|
||||||
|
"Microsoft.SourceLink.Common": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "8.0.0",
|
||||||
|
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||||
|
},
|
||||||
|
"Speckle.Newtonsoft.Json": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "13.0.2",
|
||||||
|
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
||||||
|
},
|
||||||
|
"Speckle.Sdk": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "D04pCdleqLeDxthANCb8+X1xfEYr4+Q3GTuHtqOrMQeGHDAVPc5G3M0D6VYEUYbLYav0NBZ6tNuWO2Y/fqfWSw==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client": "6.0.0",
|
||||||
|
"Microsoft.Data.Sqlite": "7.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Logging": "2.2.0",
|
||||||
|
"Speckle.DoubleNumerics": "4.1.0",
|
||||||
|
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||||
|
"Speckle.Sdk.Dependencies": "3.11.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Speckle.Sdk.Dependencies": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "u8lJ+ECslmVPsn4yOCg3hAzj3zh6r+gp2oQh8RDGn22NihIPOsMhBFvoBruL1QVhXdJcS4rI2J6VEAbdvL9FRg=="
|
||||||
|
},
|
||||||
|
"SQLitePCLRaw.bundle_e_sqlite3": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "2.1.4",
|
||||||
|
"contentHash": "EWI1olKDjFEBMJu0+3wuxwziIAdWDVMYLhuZ3Qs84rrz+DHwD00RzWPZCa+bLnHCf3oJwuFZIRsHT5p236QXww==",
|
||||||
|
"dependencies": {
|
||||||
|
"SQLitePCLRaw.lib.e_sqlite3": "2.1.4",
|
||||||
|
"SQLitePCLRaw.provider.e_sqlite3": "2.1.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"SQLitePCLRaw.core": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "2.1.4",
|
||||||
|
"contentHash": "inBjvSHo9UDKneGNzfUfDjK08JzlcIhn1+SP5Y3m6cgXpCxXKCJDy6Mka7LpgSV+UZmKSnC8rTwB0SQ0xKu5pA==",
|
||||||
|
"dependencies": {
|
||||||
|
"System.Memory": "4.5.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"SQLitePCLRaw.lib.e_sqlite3": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "2.1.4",
|
||||||
|
"contentHash": "2C9Q9eX7CPLveJA0rIhf9RXAvu+7nWZu1A2MdG6SD/NOu26TakGgL1nsbc0JAspGijFOo3HoN79xrx8a368fBg=="
|
||||||
|
},
|
||||||
|
"SQLitePCLRaw.provider.e_sqlite3": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "2.1.4",
|
||||||
|
"contentHash": "CSlb5dUp1FMIkez9Iv5EXzpeq7rHryVNqwJMWnpq87j9zWZexaEMdisDktMsnnrzKM6ahNrsTkjqNodTBPBxtQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"SQLitePCLRaw.core": "2.1.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"System.ComponentModel.Annotations": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "4.5.0",
|
||||||
|
"contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg=="
|
||||||
|
},
|
||||||
|
"System.Memory": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "4.5.3",
|
||||||
|
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA=="
|
||||||
|
},
|
||||||
|
"System.Reactive": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "5.0.0",
|
||||||
|
"contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ=="
|
||||||
|
},
|
||||||
|
"System.Runtime.CompilerServices.Unsafe": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "4.5.1",
|
||||||
|
"contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw=="
|
||||||
|
},
|
||||||
|
"speckle.connectors.common": {
|
||||||
|
"type": "Project",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||||
|
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||||
|
"Speckle.Converters.Common": "[1.0.0, )",
|
||||||
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"speckle.connectors.dui": {
|
||||||
|
"type": "Project",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
|
"Speckle.Connectors.Common": "[1.0.0, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"speckle.connectors.dui.webview": {
|
||||||
|
"type": "Project",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Web.WebView2": "[1.0.1938.49, )",
|
||||||
|
"Speckle.Connectors.DUI": "[1.0.0, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"speckle.connectors.logging": {
|
||||||
|
"type": "Project"
|
||||||
|
},
|
||||||
|
"speckle.converters.autocad2026": {
|
||||||
|
"type": "Project",
|
||||||
|
"dependencies": {
|
||||||
|
"Speckle.AutoCAD.API": "[2026.0.0, )",
|
||||||
|
"Speckle.Connectors.DUI.WebView": "[1.0.0, )",
|
||||||
|
"Speckle.Converters.Common": "[1.0.0, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"speckle.converters.common": {
|
||||||
|
"type": "Project",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.DependencyInjection": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[2.2.0, )",
|
||||||
|
"resolved": "2.2.0",
|
||||||
|
"contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[2.2.0, )",
|
||||||
|
"resolved": "2.2.0",
|
||||||
|
"contentHash": "Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.Extensions.Configuration.Binder": "2.2.0",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Options": "2.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[2.2.0, )",
|
||||||
|
"resolved": "2.2.0",
|
||||||
|
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
|
||||||
|
},
|
||||||
|
"Microsoft.Web.WebView2": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[1.0.1938.49, )",
|
||||||
|
"resolved": "1.0.1938.49",
|
||||||
|
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
||||||
|
},
|
||||||
|
"Speckle.DoubleNumerics": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[4.1.0, )",
|
||||||
|
"resolved": "4.1.0",
|
||||||
|
"contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
|
||||||
|
},
|
||||||
|
"Speckle.Objects": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[3.11.1, )",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "JUCY3bA6Pa+fa6wZV9uQ9mhLRihvICkF58nIr28Yi94j0th7wSg4l8WeThl3ubKVnHDQE5mdVffVlY1e5ZUkuQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"Speckle.Sdk": "3.11.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"net8.0-windows7.0/win-x64": {
|
||||||
|
"SQLitePCLRaw.lib.e_sqlite3": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "2.1.4",
|
||||||
|
"contentHash": "2C9Q9eX7CPLveJA0rIhf9RXAvu+7nWZu1A2MdG6SD/NOu26TakGgL1nsbc0JAspGijFOo3HoN79xrx8a368fBg=="
|
||||||
|
},
|
||||||
|
"Microsoft.Web.WebView2": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[1.0.1938.49, )",
|
||||||
|
"resolved": "1.0.1938.49",
|
||||||
|
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
using Autodesk.AutoCAD.DatabaseServices;
|
using Autodesk.AutoCAD.DatabaseServices;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Speckle.Connectors.Autocad.HostApp.Extensions;
|
using Speckle.Connectors.Autocad.HostApp.Extensions;
|
||||||
|
using Speckle.Connectors.Common.Threading;
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
using Speckle.Connectors.DUI.Bindings;
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
using Speckle.Connectors.DUI.Bridge;
|
||||||
using Speckle.Connectors.DUI.Models;
|
using Speckle.Connectors.DUI.Models;
|
||||||
@@ -19,6 +20,8 @@ public class AutocadBasicConnectorBinding : IBasicConnectorBinding
|
|||||||
|
|
||||||
private readonly DocumentModelStore _store;
|
private readonly DocumentModelStore _store;
|
||||||
private readonly ISpeckleApplication _speckleApplication;
|
private readonly ISpeckleApplication _speckleApplication;
|
||||||
|
private readonly IThreadContext _threadContext;
|
||||||
|
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
|
||||||
private readonly ILogger<AutocadBasicConnectorBinding> _logger;
|
private readonly ILogger<AutocadBasicConnectorBinding> _logger;
|
||||||
|
|
||||||
public BasicConnectorBindingCommands Commands { get; }
|
public BasicConnectorBindingCommands Commands { get; }
|
||||||
@@ -28,7 +31,9 @@ public class AutocadBasicConnectorBinding : IBasicConnectorBinding
|
|||||||
IBrowserBridge parent,
|
IBrowserBridge parent,
|
||||||
IAccountManager accountManager,
|
IAccountManager accountManager,
|
||||||
ISpeckleApplication speckleApplication,
|
ISpeckleApplication speckleApplication,
|
||||||
ILogger<AutocadBasicConnectorBinding> logger
|
ILogger<AutocadBasicConnectorBinding> logger,
|
||||||
|
IThreadContext threadContext,
|
||||||
|
ITopLevelExceptionHandler topLevelExceptionHandler
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_store = store;
|
_store = store;
|
||||||
@@ -36,12 +41,14 @@ public class AutocadBasicConnectorBinding : IBasicConnectorBinding
|
|||||||
_accountManager = accountManager;
|
_accountManager = accountManager;
|
||||||
_speckleApplication = speckleApplication;
|
_speckleApplication = speckleApplication;
|
||||||
Commands = new BasicConnectorBindingCommands(parent);
|
Commands = new BasicConnectorBindingCommands(parent);
|
||||||
_store.DocumentChanged += (_, _) =>
|
|
||||||
parent.TopLevelExceptionHandler.FireAndForget(async () =>
|
|
||||||
{
|
|
||||||
await Commands.NotifyDocumentChanged().ConfigureAwait(false);
|
|
||||||
});
|
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
_threadContext = threadContext;
|
||||||
|
_topLevelExceptionHandler = topLevelExceptionHandler;
|
||||||
|
_store.DocumentChanged += (_, _) =>
|
||||||
|
_topLevelExceptionHandler.FireAndForget(async () =>
|
||||||
|
{
|
||||||
|
await Commands.NotifyDocumentChanged();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetConnectorVersion() => _speckleApplication.SpeckleVersion;
|
public string GetConnectorVersion() => _speckleApplication.SpeckleVersion;
|
||||||
@@ -72,6 +79,8 @@ public class AutocadBasicConnectorBinding : IBasicConnectorBinding
|
|||||||
|
|
||||||
public void RemoveModel(ModelCard model) => _store.RemoveModel(model);
|
public void RemoveModel(ModelCard model) => _store.RemoveModel(model);
|
||||||
|
|
||||||
|
public void RemoveModels(List<ModelCard> models) => _store.RemoveModels(models);
|
||||||
|
|
||||||
public async Task HighlightObjects(IReadOnlyList<string> objectIds)
|
public async Task HighlightObjects(IReadOnlyList<string> objectIds)
|
||||||
{
|
{
|
||||||
// POC: Will be addressed to move it into AutocadContext!
|
// POC: Will be addressed to move it into AutocadContext!
|
||||||
@@ -79,7 +88,7 @@ public class AutocadBasicConnectorBinding : IBasicConnectorBinding
|
|||||||
|
|
||||||
var dbObjects = doc.GetObjects(objectIds);
|
var dbObjects = doc.GetObjects(objectIds);
|
||||||
var acadObjectIds = dbObjects.Select(tuple => tuple.Root.Id).ToArray();
|
var acadObjectIds = dbObjects.Select(tuple => tuple.Root.Id).ToArray();
|
||||||
await HighlightObjectsOnView(acadObjectIds).ConfigureAwait(false);
|
await HighlightObjectsOnView(acadObjectIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task HighlightModel(string modelCardId)
|
public async Task HighlightModel(string modelCardId)
|
||||||
@@ -116,79 +125,73 @@ public class AutocadBasicConnectorBinding : IBasicConnectorBinding
|
|||||||
|
|
||||||
if (objectIds.Length == 0)
|
if (objectIds.Length == 0)
|
||||||
{
|
{
|
||||||
await Commands
|
await Commands.SetModelError(modelCardId, new OperationCanceledException("No objects found to highlight."));
|
||||||
.SetModelError(modelCardId, new OperationCanceledException("No objects found to highlight."))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await HighlightObjectsOnView(objectIds, modelCardId).ConfigureAwait(false);
|
await HighlightObjectsOnView(objectIds, modelCardId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task HighlightObjectsOnView(ObjectId[] objectIds, string? modelCardId = null)
|
private async Task HighlightObjectsOnView(ObjectId[] objectIds, string? modelCardId = null)
|
||||||
{
|
{
|
||||||
var doc = Application.DocumentManager.MdiActiveDocument;
|
var doc = Application.DocumentManager.MdiActiveDocument;
|
||||||
|
|
||||||
await Parent
|
await _threadContext.RunOnMainAsync(async () =>
|
||||||
.RunOnMainThreadAsync(async () =>
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
|
doc.Editor.SetImpliedSelection([]); // Deselects
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
doc.Editor.SetImpliedSelection(Array.Empty<ObjectId>()); // Deselects
|
doc.Editor.SetImpliedSelection(objectIds);
|
||||||
|
}
|
||||||
|
catch (Exception e) when (!e.IsFatal())
|
||||||
|
{
|
||||||
|
// SWALLOW REASON:
|
||||||
|
// If the objects under the blocks, it won't be able to select them.
|
||||||
|
// If we try, API will throw the invalid input error, because we request something from API that Autocad doesn't
|
||||||
|
// handle it on its current canvas. Block elements only selectable when in its scope.
|
||||||
|
}
|
||||||
|
doc.Editor.UpdateScreen();
|
||||||
|
|
||||||
|
Extents3d selectedExtents = new();
|
||||||
|
|
||||||
|
var tr = doc.TransactionManager.StartTransaction();
|
||||||
|
foreach (ObjectId objectId in objectIds)
|
||||||
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
doc.Editor.SetImpliedSelection(objectIds);
|
var entity = (Entity?)tr.GetObject(objectId, OpenMode.ForRead);
|
||||||
|
if (entity?.GeometricExtents != null)
|
||||||
|
{
|
||||||
|
selectedExtents.AddExtents(entity.GeometricExtents);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e) when (!e.IsFatal())
|
catch (Exception e) when (!e.IsFatal())
|
||||||
{
|
{
|
||||||
// SWALLOW REASON:
|
// Note: we're swallowing exeptions here because of a weird case when receiving blocks, we would have
|
||||||
// If the objects under the blocks, it won't be able to select them.
|
// acad api throw an error on accessing entity.GeometricExtents.
|
||||||
// If we try, API will throw the invalid input error, because we request something from API that Autocad doesn't
|
// may also throw Autodesk.AutoCAD.Runtime.Exception for invalid extents on objects like rays and xlines
|
||||||
// handle it on its current canvas. Block elements only selectable when in its scope.
|
|
||||||
}
|
}
|
||||||
doc.Editor.UpdateScreen();
|
|
||||||
|
|
||||||
Extents3d selectedExtents = new();
|
|
||||||
|
|
||||||
var tr = doc.TransactionManager.StartTransaction();
|
|
||||||
foreach (ObjectId objectId in objectIds)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var entity = (Entity?)tr.GetObject(objectId, OpenMode.ForRead);
|
|
||||||
if (entity?.GeometricExtents != null)
|
|
||||||
{
|
|
||||||
selectedExtents.AddExtents(entity.GeometricExtents);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e) when (!e.IsFatal())
|
|
||||||
{
|
|
||||||
// Note: we're swallowing exeptions here because of a weird case when receiving blocks, we would have
|
|
||||||
// acad api throw an error on accessing entity.GeometricExtents.
|
|
||||||
// may also throw Autodesk.AutoCAD.Runtime.Exception for invalid extents on objects like rays and xlines
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
doc.Editor.Zoom(selectedExtents);
|
|
||||||
tr.Commit();
|
|
||||||
Autodesk.AutoCAD.Internal.Utils.FlushGraphics();
|
|
||||||
}
|
}
|
||||||
catch (Exception ex) when (!ex.IsFatal())
|
|
||||||
|
doc.Editor.Zoom(selectedExtents);
|
||||||
|
tr.Commit();
|
||||||
|
Autodesk.AutoCAD.Internal.Utils.FlushGraphics();
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (!ex.IsFatal())
|
||||||
|
{
|
||||||
|
if (modelCardId != null)
|
||||||
{
|
{
|
||||||
if (modelCardId != null)
|
await Commands.SetModelError(modelCardId, new OperationCanceledException("Failed to highlight objects."));
|
||||||
{
|
|
||||||
await Commands
|
|
||||||
.SetModelError(modelCardId, new OperationCanceledException("Failed to highlight objects."))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// This will happen, in some cases, where we highlight individual objects. Should be caught by the top level handler and not
|
|
||||||
// crash the host app.
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
else
|
||||||
.ConfigureAwait(false);
|
{
|
||||||
|
// This will happen, in some cases, where we highlight individual objects. Should be caught by the top level handler and not
|
||||||
|
// crash the host app.
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
using Speckle.Connectors.Common.Cancellation;
|
||||||
|
using Speckle.Connectors.Common.Threading;
|
||||||
|
using Speckle.Connectors.DUI.Bindings;
|
||||||
|
using Speckle.Connectors.DUI.Bridge;
|
||||||
|
using Speckle.Connectors.DUI.Models.Card;
|
||||||
|
|
||||||
|
namespace Speckle.Connectors.Autocad.Bindings;
|
||||||
|
|
||||||
|
public abstract class AutocadReceiveBaseBinding(
|
||||||
|
IBrowserBridge parent,
|
||||||
|
ICancellationManager cancellationManager,
|
||||||
|
IThreadContext threadContext,
|
||||||
|
IReceiveOperationManagerFactory receiveOperationManagerFactory
|
||||||
|
) : IReceiveBinding
|
||||||
|
{
|
||||||
|
public string Name => "receiveBinding";
|
||||||
|
public IBrowserBridge Parent { get; } = parent;
|
||||||
|
|
||||||
|
private ReceiveBindingUICommands Commands { get; } = new(parent);
|
||||||
|
|
||||||
|
protected abstract void InitializeSettings(IServiceProvider serviceProvider, ModelCard mc);
|
||||||
|
|
||||||
|
public void CancelReceive(string modelCardId) => cancellationManager.CancelOperation(modelCardId);
|
||||||
|
|
||||||
|
public async Task Receive(string modelCardId) =>
|
||||||
|
await threadContext.RunOnMainAsync(async () => await ReceiveInternal(modelCardId));
|
||||||
|
|
||||||
|
private async Task ReceiveInternal(string modelCardId)
|
||||||
|
{
|
||||||
|
using var manager = receiveOperationManagerFactory.Create();
|
||||||
|
await manager.Process(
|
||||||
|
Commands,
|
||||||
|
modelCardId,
|
||||||
|
InitializeSettings,
|
||||||
|
async (_, processor) =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Disable document activation (document creation and document switch)
|
||||||
|
// Not disabling results in DUI model card being out of sync with the active document
|
||||||
|
// The DocumentActivated event isn't usable probably because it is pushed to back of main thread queue
|
||||||
|
Application.DocumentManager.DocumentActivationEnabled = false;
|
||||||
|
return await processor();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
// reenable document activation
|
||||||
|
Application.DocumentManager.DocumentActivationEnabled = true;
|
||||||
|
|
||||||
|
// regenerate doc to flush graphics, sometimes some objects (ellipses, nurbs curves) do not appear fully visible after receive.
|
||||||
|
// Adding a regen (must be run on main thread) here, but it doesn't seem to work:
|
||||||
|
// it's run on main thread, tried sending the "regen" string to execute, also tried regen after every object bake, but still can't fix.
|
||||||
|
// the objects should appear visible if you manually call the "regen" command after the operation finishes, or click on a view on the view cube which also calls regen.
|
||||||
|
Application.DocumentManager.CurrentDocument.Editor.Regen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,109 +1,34 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Speckle.Connectors.Common.Cancellation;
|
using Speckle.Connectors.Common.Cancellation;
|
||||||
using Speckle.Connectors.Common.Operations;
|
using Speckle.Connectors.Common.Threading;
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
using Speckle.Connectors.DUI.Bindings;
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
using Speckle.Connectors.DUI.Bridge;
|
||||||
using Speckle.Connectors.DUI.Logging;
|
|
||||||
using Speckle.Connectors.DUI.Models;
|
|
||||||
using Speckle.Connectors.DUI.Models.Card;
|
using Speckle.Connectors.DUI.Models.Card;
|
||||||
using Speckle.Converters.Autocad;
|
using Speckle.Converters.Autocad;
|
||||||
using Speckle.Converters.Common;
|
using Speckle.Converters.Common;
|
||||||
using Speckle.Sdk;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.Autocad.Bindings;
|
namespace Speckle.Connectors.Autocad.Bindings;
|
||||||
|
|
||||||
public sealed class AutocadReceiveBinding : IReceiveBinding
|
public sealed class AutocadReceiveBinding : AutocadReceiveBaseBinding
|
||||||
{
|
{
|
||||||
public string Name => "receiveBinding";
|
|
||||||
public IBrowserBridge Parent { get; }
|
|
||||||
|
|
||||||
private readonly DocumentModelStore _store;
|
|
||||||
private readonly CancellationManager _cancellationManager;
|
|
||||||
private readonly IServiceProvider _serviceProvider;
|
|
||||||
private readonly IOperationProgressManager _operationProgressManager;
|
|
||||||
private readonly ILogger<AutocadReceiveBinding> _logger;
|
|
||||||
private readonly IAutocadConversionSettingsFactory _autocadConversionSettingsFactory;
|
private readonly IAutocadConversionSettingsFactory _autocadConversionSettingsFactory;
|
||||||
private readonly ISpeckleApplication _speckleApplication;
|
|
||||||
|
|
||||||
private ReceiveBindingUICommands Commands { get; }
|
|
||||||
|
|
||||||
public AutocadReceiveBinding(
|
public AutocadReceiveBinding(
|
||||||
DocumentModelStore store,
|
|
||||||
IBrowserBridge parent,
|
IBrowserBridge parent,
|
||||||
CancellationManager cancellationManager,
|
ICancellationManager cancellationManager,
|
||||||
IServiceProvider serviceProvider,
|
|
||||||
IOperationProgressManager operationProgressManager,
|
|
||||||
ILogger<AutocadReceiveBinding> logger,
|
|
||||||
IAutocadConversionSettingsFactory autocadConversionSettingsFactory,
|
IAutocadConversionSettingsFactory autocadConversionSettingsFactory,
|
||||||
ISpeckleApplication speckleApplication
|
IThreadContext threadContext,
|
||||||
|
IReceiveOperationManagerFactory receiveOperationManagerFactory
|
||||||
)
|
)
|
||||||
|
: base(parent, cancellationManager, threadContext, receiveOperationManagerFactory)
|
||||||
{
|
{
|
||||||
_store = store;
|
|
||||||
_cancellationManager = cancellationManager;
|
|
||||||
_serviceProvider = serviceProvider;
|
|
||||||
_operationProgressManager = operationProgressManager;
|
|
||||||
_logger = logger;
|
|
||||||
_autocadConversionSettingsFactory = autocadConversionSettingsFactory;
|
_autocadConversionSettingsFactory = autocadConversionSettingsFactory;
|
||||||
_speckleApplication = speckleApplication;
|
|
||||||
Parent = parent;
|
|
||||||
Commands = new ReceiveBindingUICommands(parent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CancelReceive(string modelCardId) => _cancellationManager.CancelOperation(modelCardId);
|
protected override void InitializeSettings(IServiceProvider serviceProvider, ModelCard mc)
|
||||||
|
|
||||||
public async Task Receive(string modelCardId)
|
|
||||||
{
|
{
|
||||||
using var scope = _serviceProvider.CreateScope();
|
serviceProvider
|
||||||
scope
|
.GetRequiredService<IConverterSettingsStore<AutocadConversionSettings>>()
|
||||||
.ServiceProvider.GetRequiredService<IConverterSettingsStore<AutocadConversionSettings>>()
|
|
||||||
.Initialize(_autocadConversionSettingsFactory.Create(Application.DocumentManager.CurrentDocument));
|
.Initialize(_autocadConversionSettingsFactory.Create(Application.DocumentManager.CurrentDocument));
|
||||||
try
|
|
||||||
{
|
|
||||||
// Get receiver card
|
|
||||||
if (_store.GetModelById(modelCardId) is not ReceiverModelCard modelCard)
|
|
||||||
{
|
|
||||||
// Handle as GLOBAL ERROR at BrowserBridge
|
|
||||||
throw new InvalidOperationException("No download model card was found.");
|
|
||||||
}
|
|
||||||
|
|
||||||
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
|
|
||||||
|
|
||||||
// Disable document activation (document creation and document switch)
|
|
||||||
// Not disabling results in DUI model card being out of sync with the active document
|
|
||||||
// The DocumentActivated event isn't usable probably because it is pushed to back of main thread queue
|
|
||||||
Application.DocumentManager.DocumentActivationEnabled = false;
|
|
||||||
|
|
||||||
// Receive host objects
|
|
||||||
var operationResults = await scope
|
|
||||||
.ServiceProvider.GetRequiredService<ReceiveOperation>()
|
|
||||||
.Execute(
|
|
||||||
modelCard.GetReceiveInfo(_speckleApplication.Slug),
|
|
||||||
_operationProgressManager.CreateOperationProgressEventHandler(Parent, modelCardId, cancellationToken),
|
|
||||||
cancellationToken
|
|
||||||
)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
await Commands
|
|
||||||
.SetModelReceiveResult(modelCardId, operationResults.BakedObjectIds, operationResults.ConversionResults)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
// SWALLOW -> UI handles it immediately, so we do not need to handle anything for now!
|
|
||||||
// Idea for later -> when cancel called, create promise from UI to solve it later with this catch block.
|
|
||||||
// So have 3 state on UI -> Cancellation clicked -> Cancelling -> Cancelled
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
catch (Exception ex) when (!ex.IsFatal()) // UX reasons - we will report operation exceptions as model card error. We may change this later when we have more exception documentation
|
|
||||||
{
|
|
||||||
_logger.LogModelCardHandledError(ex);
|
|
||||||
await Commands.SetModelError(modelCardId, ex).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
// reenable document activation
|
|
||||||
Application.DocumentManager.DocumentActivationEnabled = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using Autodesk.AutoCAD.DatabaseServices;
|
using Autodesk.AutoCAD.DatabaseServices;
|
||||||
using Autodesk.AutoCAD.EditorInput;
|
using Autodesk.AutoCAD.EditorInput;
|
||||||
using Speckle.Connectors.Autocad.HostApp.Extensions;
|
using Speckle.Connectors.Autocad.HostApp.Extensions;
|
||||||
|
using Speckle.Connectors.Common.Threading;
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
using Speckle.Connectors.DUI.Bindings;
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
using Speckle.Connectors.DUI.Bridge;
|
||||||
|
|
||||||
@@ -8,17 +9,23 @@ namespace Speckle.Connectors.Autocad.Bindings;
|
|||||||
|
|
||||||
public class AutocadSelectionBinding : ISelectionBinding
|
public class AutocadSelectionBinding : ISelectionBinding
|
||||||
{
|
{
|
||||||
private const string SELECTION_EVENT = "setSelection";
|
|
||||||
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
|
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
|
||||||
|
private readonly IThreadContext _threadContext;
|
||||||
|
private const string SELECTION_EVENT = "setSelection";
|
||||||
private readonly HashSet<Document> _visitedDocuments = new();
|
private readonly HashSet<Document> _visitedDocuments = new();
|
||||||
|
|
||||||
public string Name => "selectionBinding";
|
public string Name => "selectionBinding";
|
||||||
|
|
||||||
public IBrowserBridge Parent { get; }
|
public IBrowserBridge Parent { get; }
|
||||||
|
|
||||||
public AutocadSelectionBinding(IBrowserBridge parent)
|
public AutocadSelectionBinding(
|
||||||
|
IBrowserBridge parent,
|
||||||
|
ITopLevelExceptionHandler topLevelExceptionHandler,
|
||||||
|
IThreadContext threadContext
|
||||||
|
)
|
||||||
{
|
{
|
||||||
_topLevelExceptionHandler = parent.TopLevelExceptionHandler;
|
_topLevelExceptionHandler = topLevelExceptionHandler;
|
||||||
|
_threadContext = threadContext;
|
||||||
Parent = parent;
|
Parent = parent;
|
||||||
|
|
||||||
// POC: Use here Context for doc. In converters it's OK but we are still lacking to use context into bindings.
|
// POC: Use here Context for doc. In converters it's OK but we are still lacking to use context into bindings.
|
||||||
@@ -41,9 +48,7 @@ public class AutocadSelectionBinding : ISelectionBinding
|
|||||||
if (!_visitedDocuments.Contains(document))
|
if (!_visitedDocuments.Contains(document))
|
||||||
{
|
{
|
||||||
document.ImpliedSelectionChanged += (_, _) =>
|
document.ImpliedSelectionChanged += (_, _) =>
|
||||||
_topLevelExceptionHandler.FireAndForget(
|
_topLevelExceptionHandler.FireAndForget(async () => await _threadContext.RunOnMainAsync(OnSelectionChanged));
|
||||||
async () => await Parent.RunOnMainThreadAsync(OnSelectionChanged).ConfigureAwait(false)
|
|
||||||
);
|
|
||||||
|
|
||||||
_visitedDocuments.Add(document);
|
_visitedDocuments.Add(document);
|
||||||
}
|
}
|
||||||
@@ -57,7 +62,7 @@ public class AutocadSelectionBinding : ISelectionBinding
|
|||||||
private async Task OnSelectionChanged()
|
private async Task OnSelectionChanged()
|
||||||
{
|
{
|
||||||
_selectionInfo = GetSelectionInternal();
|
_selectionInfo = GetSelectionInternal();
|
||||||
await Parent.Send(SELECTION_EVENT, _selectionInfo).ConfigureAwait(false);
|
await Parent.Send(SELECTION_EVENT, _selectionInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SelectionInfo GetSelection() => _selectionInfo;
|
public SelectionInfo GetSelection() => _selectionInfo;
|
||||||
@@ -84,6 +89,17 @@ public class AutocadSelectionBinding : ISelectionBinding
|
|||||||
|
|
||||||
objectTypes.Add(dbObject.GetType().Name);
|
objectTypes.Add(dbObject.GetType().Name);
|
||||||
objs.Add(dbObject.GetSpeckleApplicationId());
|
objs.Add(dbObject.GetSpeckleApplicationId());
|
||||||
|
|
||||||
|
// do the same also for each AttributeReference inside the BlockReference (attribute change is not affecting the block otherwise)
|
||||||
|
if (dbObject is BlockReference blockReference)
|
||||||
|
{
|
||||||
|
foreach (ObjectId id in blockReference.AttributeCollection)
|
||||||
|
{
|
||||||
|
var attr = (AttributeReference)tr.GetObject(id, OpenMode.ForRead);
|
||||||
|
objectTypes.Add(attr.GetType().Name);
|
||||||
|
objs.Add(attr.GetSpeckleApplicationId());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tr.Commit();
|
tr.Commit();
|
||||||
|
|||||||
@@ -1,26 +1,21 @@
|
|||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using Autodesk.AutoCAD.DatabaseServices;
|
using Autodesk.AutoCAD.DatabaseServices;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Speckle.Connectors.Autocad.HostApp;
|
|
||||||
using Speckle.Connectors.Autocad.HostApp.Extensions;
|
using Speckle.Connectors.Autocad.HostApp.Extensions;
|
||||||
using Speckle.Connectors.Autocad.Operations.Send;
|
|
||||||
using Speckle.Connectors.Common.Caching;
|
using Speckle.Connectors.Common.Caching;
|
||||||
using Speckle.Connectors.Common.Cancellation;
|
using Speckle.Connectors.Common.Cancellation;
|
||||||
using Speckle.Connectors.Common.Operations;
|
using Speckle.Connectors.Common.Threading;
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
using Speckle.Connectors.DUI.Bindings;
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
using Speckle.Connectors.DUI.Bridge;
|
||||||
using Speckle.Connectors.DUI.Exceptions;
|
|
||||||
using Speckle.Connectors.DUI.Logging;
|
|
||||||
using Speckle.Connectors.DUI.Models;
|
using Speckle.Connectors.DUI.Models;
|
||||||
using Speckle.Connectors.DUI.Models.Card;
|
using Speckle.Connectors.DUI.Models.Card;
|
||||||
using Speckle.Connectors.DUI.Models.Card.SendFilter;
|
using Speckle.Connectors.DUI.Models.Card.SendFilter;
|
||||||
using Speckle.Connectors.DUI.Settings;
|
using Speckle.Connectors.DUI.Settings;
|
||||||
using Speckle.Sdk;
|
|
||||||
using Speckle.Sdk.Common;
|
using Speckle.Sdk.Common;
|
||||||
|
|
||||||
namespace Speckle.Connectors.Autocad.Bindings;
|
namespace Speckle.Connectors.Autocad.Bindings;
|
||||||
|
|
||||||
|
[SuppressMessage("ReSharper", "AsyncVoidMethod")]
|
||||||
public abstract class AutocadSendBaseBinding : ISendBinding
|
public abstract class AutocadSendBaseBinding : ISendBinding
|
||||||
{
|
{
|
||||||
public string Name => "sendBinding";
|
public string Name => "sendBinding";
|
||||||
@@ -29,15 +24,13 @@ public abstract class AutocadSendBaseBinding : ISendBinding
|
|||||||
public IBrowserBridge Parent { get; }
|
public IBrowserBridge Parent { get; }
|
||||||
|
|
||||||
private readonly DocumentModelStore _store;
|
private readonly DocumentModelStore _store;
|
||||||
private readonly IAutocadIdleManager _idleManager;
|
|
||||||
private readonly List<ISendFilter> _sendFilters;
|
private readonly List<ISendFilter> _sendFilters;
|
||||||
private readonly CancellationManager _cancellationManager;
|
private readonly ICancellationManager _cancellationManager;
|
||||||
private readonly IServiceProvider _serviceProvider;
|
|
||||||
private readonly ISendConversionCache _sendConversionCache;
|
private readonly ISendConversionCache _sendConversionCache;
|
||||||
private readonly IOperationProgressManager _operationProgressManager;
|
private readonly IThreadContext _threadContext;
|
||||||
private readonly ILogger<AutocadSendBinding> _logger;
|
|
||||||
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
|
private readonly ITopLevelExceptionHandler _topLevelExceptionHandler;
|
||||||
private readonly ISpeckleApplication _speckleApplication;
|
private readonly IAppIdleManager _idleManager;
|
||||||
|
private readonly ISendOperationManagerFactory _sendOperationManagerFactory;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Used internally to aggregate the changed objects' id. Note we're using a concurrent dictionary here as the expiry check method is not thread safe, and this was causing problems. See:
|
/// Used internally to aggregate the changed objects' id. Note we're using a concurrent dictionary here as the expiry check method is not thread safe, and this was causing problems. See:
|
||||||
@@ -45,31 +38,28 @@ public abstract class AutocadSendBaseBinding : ISendBinding
|
|||||||
/// As to why a concurrent dictionary, it's because it's the cheapest/easiest way to do so.
|
/// As to why a concurrent dictionary, it's because it's the cheapest/easiest way to do so.
|
||||||
/// https://stackoverflow.com/questions/18922985/concurrent-hashsett-in-net-framework
|
/// https://stackoverflow.com/questions/18922985/concurrent-hashsett-in-net-framework
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private ConcurrentDictionary<string, byte> ChangedObjectIds { get; set; } = new();
|
private ConcurrentBag<string> ChangedObjectIds { get; set; } = new();
|
||||||
|
|
||||||
protected AutocadSendBaseBinding(
|
protected AutocadSendBaseBinding(
|
||||||
DocumentModelStore store,
|
DocumentModelStore store,
|
||||||
IAutocadIdleManager idleManager,
|
|
||||||
IBrowserBridge parent,
|
IBrowserBridge parent,
|
||||||
IEnumerable<ISendFilter> sendFilters,
|
IEnumerable<ISendFilter> sendFilters,
|
||||||
CancellationManager cancellationManager,
|
ICancellationManager cancellationManager,
|
||||||
IServiceProvider serviceProvider,
|
|
||||||
ISendConversionCache sendConversionCache,
|
ISendConversionCache sendConversionCache,
|
||||||
IOperationProgressManager operationProgressManager,
|
IThreadContext threadContext,
|
||||||
ILogger<AutocadSendBinding> logger,
|
ITopLevelExceptionHandler topLevelExceptionHandler,
|
||||||
ISpeckleApplication speckleApplication
|
IAppIdleManager idleManager,
|
||||||
|
ISendOperationManagerFactory sendOperationManagerFactory
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_store = store;
|
_store = store;
|
||||||
_idleManager = idleManager;
|
|
||||||
_serviceProvider = serviceProvider;
|
|
||||||
_cancellationManager = cancellationManager;
|
_cancellationManager = cancellationManager;
|
||||||
_sendFilters = sendFilters.ToList();
|
_sendFilters = sendFilters.ToList();
|
||||||
_sendConversionCache = sendConversionCache;
|
_sendConversionCache = sendConversionCache;
|
||||||
_operationProgressManager = operationProgressManager;
|
_threadContext = threadContext;
|
||||||
_logger = logger;
|
_topLevelExceptionHandler = topLevelExceptionHandler;
|
||||||
_speckleApplication = speckleApplication;
|
_idleManager = idleManager;
|
||||||
_topLevelExceptionHandler = parent.TopLevelExceptionHandler;
|
_sendOperationManagerFactory = sendOperationManagerFactory;
|
||||||
Parent = parent;
|
Parent = parent;
|
||||||
Commands = new SendBindingUICommands(parent);
|
Commands = new SendBindingUICommands(parent);
|
||||||
|
|
||||||
@@ -103,31 +93,25 @@ public abstract class AutocadSendBaseBinding : ISendBinding
|
|||||||
doc.Database.ObjectModified += (_, e) => OnObjectChanged(e.DBObject);
|
doc.Database.ObjectModified += (_, e) => OnObjectChanged(e.DBObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnObjectChanged(DBObject dbObject)
|
private void OnObjectChanged(DBObject dbObject) =>
|
||||||
{
|
|
||||||
_topLevelExceptionHandler.CatchUnhandled(() => OnChangeChangedObjectIds(dbObject));
|
_topLevelExceptionHandler.CatchUnhandled(() => OnChangeChangedObjectIds(dbObject));
|
||||||
}
|
|
||||||
|
|
||||||
private void OnChangeChangedObjectIds(DBObject dBObject)
|
private void OnChangeChangedObjectIds(DBObject dBObject)
|
||||||
{
|
{
|
||||||
ChangedObjectIds[dBObject.GetSpeckleApplicationId()] = 1;
|
ChangedObjectIds.Add(dBObject.GetSpeckleApplicationId());
|
||||||
_idleManager.SubscribeToIdle(
|
_idleManager.SubscribeToIdle(nameof(RunExpirationChecks), async () => await RunExpirationChecks());
|
||||||
nameof(AutocadSendBinding),
|
|
||||||
async () => await RunExpirationChecks().ConfigureAwait(false)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RunExpirationChecks()
|
private async Task RunExpirationChecks()
|
||||||
{
|
{
|
||||||
var senders = _store.GetSenders();
|
var senders = _store.GetSenders();
|
||||||
string[] objectIdsList = ChangedObjectIds.Keys.ToArray();
|
|
||||||
List<string> expiredSenderIds = new();
|
List<string> expiredSenderIds = new();
|
||||||
|
|
||||||
_sendConversionCache.EvictObjects(objectIdsList);
|
_sendConversionCache.EvictObjects(ChangedObjectIds);
|
||||||
|
|
||||||
foreach (SenderModelCard modelCard in senders)
|
foreach (SenderModelCard modelCard in senders)
|
||||||
{
|
{
|
||||||
var intersection = modelCard.SendFilter.NotNull().RefreshObjectIds().Intersect(objectIdsList).ToList();
|
var intersection = modelCard.SendFilter.NotNull().RefreshObjectIds().Intersect(ChangedObjectIds).ToList();
|
||||||
bool isExpired = intersection.Count != 0;
|
bool isExpired = intersection.Count != 0;
|
||||||
if (isExpired)
|
if (isExpired)
|
||||||
{
|
{
|
||||||
@@ -135,7 +119,7 @@ public abstract class AutocadSendBaseBinding : ISendBinding
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await Commands.SetModelsExpired(expiredSenderIds).ConfigureAwait(false);
|
await Commands.SetModelsExpired(expiredSenderIds);
|
||||||
ChangedObjectIds = new();
|
ChangedObjectIds = new();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,9 +128,7 @@ public abstract class AutocadSendBaseBinding : ISendBinding
|
|||||||
public List<ICardSetting> GetSendSettings() => [];
|
public List<ICardSetting> GetSendSettings() => [];
|
||||||
|
|
||||||
public async Task Send(string modelCardId) =>
|
public async Task Send(string modelCardId) =>
|
||||||
await Parent
|
await _threadContext.RunOnMainAsync(async () => await SendInternal(modelCardId));
|
||||||
.RunOnMainThreadAsync(async () => await SendInternal(modelCardId).ConfigureAwait(false))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
protected abstract void InitializeSettings(IServiceProvider serviceProvider);
|
protected abstract void InitializeSettings(IServiceProvider serviceProvider);
|
||||||
|
|
||||||
@@ -154,58 +136,17 @@ public abstract class AutocadSendBaseBinding : ISendBinding
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (_store.GetModelById(modelCardId) is not SenderModelCard modelCard)
|
using var manager = _sendOperationManagerFactory.Create();
|
||||||
{
|
|
||||||
// Handle as GLOBAL ERROR at BrowserBridge
|
|
||||||
throw new InvalidOperationException("No publish model card was found.");
|
|
||||||
}
|
|
||||||
|
|
||||||
using var scope = _serviceProvider.CreateScope();
|
|
||||||
InitializeSettings(scope.ServiceProvider);
|
|
||||||
|
|
||||||
CancellationToken cancellationToken = _cancellationManager.InitCancellationTokenSource(modelCardId);
|
|
||||||
|
|
||||||
// Disable document activation (document creation and document switch)
|
// Disable document activation (document creation and document switch)
|
||||||
// Not disabling results in DUI model card being out of sync with the active document
|
// Not disabling results in DUI model card being out of sync with the active document
|
||||||
// The DocumentActivated event isn't usable probably because it is pushed to back of main thread queue
|
// The DocumentActivated event isn't usable probably because it is pushed to back of main thread queue
|
||||||
Application.DocumentManager.DocumentActivationEnabled = false;
|
Application.DocumentManager.DocumentActivationEnabled = false;
|
||||||
|
await manager.Process(
|
||||||
// Get elements to convert
|
Commands,
|
||||||
List<AutocadRootObject> autocadObjects = Application.DocumentManager.CurrentDocument.GetObjects(
|
modelCardId,
|
||||||
modelCard.SendFilter.NotNull().RefreshObjectIds()
|
(sp, card) => InitializeSettings(sp),
|
||||||
|
card => Application.DocumentManager.CurrentDocument.GetObjects(card.SendFilter.NotNull().RefreshObjectIds())
|
||||||
);
|
);
|
||||||
|
|
||||||
if (autocadObjects.Count == 0)
|
|
||||||
{
|
|
||||||
// Handle as CARD ERROR in this function
|
|
||||||
throw new SpeckleSendFilterException("No objects were found to convert. Please update your publish filter!");
|
|
||||||
}
|
|
||||||
|
|
||||||
var sendResult = await scope
|
|
||||||
.ServiceProvider.GetRequiredService<SendOperation<AutocadRootObject>>()
|
|
||||||
.Execute(
|
|
||||||
autocadObjects,
|
|
||||||
modelCard.GetSendInfo(_speckleApplication.Slug),
|
|
||||||
_operationProgressManager.CreateOperationProgressEventHandler(Parent, modelCardId, cancellationToken),
|
|
||||||
cancellationToken
|
|
||||||
)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
await Commands
|
|
||||||
.SetModelSendResult(modelCardId, sendResult.RootObjId, sendResult.ConversionResults)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
// SWALLOW -> UI handles it immediately, so we do not need to handle anything for now!
|
|
||||||
// Idea for later -> when cancel called, create promise from UI to solve it later with this catch block.
|
|
||||||
// So have 3 state on UI -> Cancellation clicked -> Cancelling -> Cancelled
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
catch (Exception ex) when (!ex.IsFatal()) // UX reasons - we will report operation exceptions as model card error. We may change this later when we have more exception documentation
|
|
||||||
{
|
|
||||||
_logger.LogModelCardHandledError(ex);
|
|
||||||
await Commands.SetModelError(modelCardId, ex).ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Speckle.Connectors.Autocad.HostApp;
|
|
||||||
using Speckle.Connectors.Common.Caching;
|
using Speckle.Connectors.Common.Caching;
|
||||||
using Speckle.Connectors.Common.Cancellation;
|
using Speckle.Connectors.Common.Cancellation;
|
||||||
|
using Speckle.Connectors.Common.Threading;
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
using Speckle.Connectors.DUI.Bindings;
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
using Speckle.Connectors.DUI.Bridge;
|
||||||
using Speckle.Connectors.DUI.Models;
|
using Speckle.Connectors.DUI.Models;
|
||||||
using Speckle.Connectors.DUI.Models.Card.SendFilter;
|
using Speckle.Connectors.DUI.Models.Card.SendFilter;
|
||||||
using Speckle.Converters.Autocad;
|
using Speckle.Converters.Autocad;
|
||||||
using Speckle.Converters.Common;
|
using Speckle.Converters.Common;
|
||||||
using Speckle.Sdk;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.Autocad.Bindings;
|
namespace Speckle.Connectors.Autocad.Bindings;
|
||||||
|
|
||||||
@@ -19,28 +17,26 @@ public sealed class AutocadSendBinding : AutocadSendBaseBinding
|
|||||||
|
|
||||||
public AutocadSendBinding(
|
public AutocadSendBinding(
|
||||||
DocumentModelStore store,
|
DocumentModelStore store,
|
||||||
IAutocadIdleManager idleManager,
|
|
||||||
IBrowserBridge parent,
|
IBrowserBridge parent,
|
||||||
IEnumerable<ISendFilter> sendFilters,
|
IEnumerable<ISendFilter> sendFilters,
|
||||||
CancellationManager cancellationManager,
|
ICancellationManager cancellationManager,
|
||||||
IServiceProvider serviceProvider,
|
|
||||||
ISendConversionCache sendConversionCache,
|
ISendConversionCache sendConversionCache,
|
||||||
IOperationProgressManager operationProgressManager,
|
|
||||||
ILogger<AutocadSendBinding> logger,
|
|
||||||
IAutocadConversionSettingsFactory autocadConversionSettingsFactory,
|
IAutocadConversionSettingsFactory autocadConversionSettingsFactory,
|
||||||
ISpeckleApplication speckleApplication
|
IThreadContext threadContext,
|
||||||
|
ITopLevelExceptionHandler topLevelExceptionHandler,
|
||||||
|
IAppIdleManager appIdleManager,
|
||||||
|
ISendOperationManagerFactory sendOperationManagerFactory
|
||||||
)
|
)
|
||||||
: base(
|
: base(
|
||||||
store,
|
store,
|
||||||
idleManager,
|
|
||||||
parent,
|
parent,
|
||||||
sendFilters,
|
sendFilters,
|
||||||
cancellationManager,
|
cancellationManager,
|
||||||
serviceProvider,
|
|
||||||
sendConversionCache,
|
sendConversionCache,
|
||||||
operationProgressManager,
|
threadContext,
|
||||||
logger,
|
topLevelExceptionHandler,
|
||||||
speckleApplication
|
appIdleManager,
|
||||||
|
sendOperationManagerFactory
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_autocadConversionSettingsFactory = autocadConversionSettingsFactory;
|
_autocadConversionSettingsFactory = autocadConversionSettingsFactory;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using Speckle.Connectors.Common.Builders;
|
|||||||
using Speckle.Connectors.Common.Caching;
|
using Speckle.Connectors.Common.Caching;
|
||||||
using Speckle.Connectors.Common.Instances;
|
using Speckle.Connectors.Common.Instances;
|
||||||
using Speckle.Connectors.Common.Operations;
|
using Speckle.Connectors.Common.Operations;
|
||||||
|
using Speckle.Connectors.Common.Threading;
|
||||||
using Speckle.Connectors.DUI;
|
using Speckle.Connectors.DUI;
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
using Speckle.Connectors.DUI.Bindings;
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
using Speckle.Connectors.DUI.Bridge;
|
||||||
@@ -23,8 +24,8 @@ public static class SharedRegistration
|
|||||||
{
|
{
|
||||||
public static void AddAutocadBase(this IServiceCollection serviceCollection)
|
public static void AddAutocadBase(this IServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
serviceCollection.AddConnectorUtils();
|
serviceCollection.AddConnectors();
|
||||||
serviceCollection.AddDUI<AutocadDocumentStore>();
|
serviceCollection.AddDUI<DefaultThreadContext, AutocadDocumentStore>();
|
||||||
serviceCollection.AddDUIView();
|
serviceCollection.AddDUIView();
|
||||||
|
|
||||||
// Register other connector specific types
|
// Register other connector specific types
|
||||||
@@ -43,10 +44,10 @@ public static class SharedRegistration
|
|||||||
serviceCollection.AddScoped<AutocadGroupBaker>();
|
serviceCollection.AddScoped<AutocadGroupBaker>();
|
||||||
|
|
||||||
serviceCollection.AddScoped<AutocadColorUnpacker>();
|
serviceCollection.AddScoped<AutocadColorUnpacker>();
|
||||||
serviceCollection.AddScoped<AutocadColorBaker>();
|
serviceCollection.AddScoped<IAutocadColorBaker, AutocadColorBaker>();
|
||||||
|
|
||||||
serviceCollection.AddScoped<AutocadMaterialUnpacker>();
|
serviceCollection.AddScoped<AutocadMaterialUnpacker>();
|
||||||
serviceCollection.AddScoped<AutocadMaterialBaker>();
|
serviceCollection.AddScoped<IAutocadMaterialBaker, AutocadMaterialBaker>();
|
||||||
|
|
||||||
serviceCollection.AddSingleton<IAppIdleManager, AutocadIdleManager>();
|
serviceCollection.AddSingleton<IAppIdleManager, AutocadIdleManager>();
|
||||||
|
|
||||||
@@ -60,8 +61,6 @@ public static class SharedRegistration
|
|||||||
serviceCollection.AddSingleton<IBinding>(sp => sp.GetRequiredService<IBasicConnectorBinding>());
|
serviceCollection.AddSingleton<IBinding>(sp => sp.GetRequiredService<IBasicConnectorBinding>());
|
||||||
serviceCollection.AddSingleton<IBasicConnectorBinding, AutocadBasicConnectorBinding>();
|
serviceCollection.AddSingleton<IBasicConnectorBinding, AutocadBasicConnectorBinding>();
|
||||||
serviceCollection.AddSingleton<IBinding, ConfigBinding>();
|
serviceCollection.AddSingleton<IBinding, ConfigBinding>();
|
||||||
|
|
||||||
serviceCollection.RegisterTopLevelExceptionHandler();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void LoadSend(this IServiceCollection serviceCollection)
|
public static void LoadSend(this IServiceCollection serviceCollection)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using Autodesk.AutoCAD.Colors;
|
using Autodesk.AutoCAD.Colors;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Speckle.Connectors.Common.Operations;
|
using Speckle.Connectors.Common.Operations;
|
||||||
|
using Speckle.InterfaceGenerator;
|
||||||
using Speckle.Sdk;
|
using Speckle.Sdk;
|
||||||
using Speckle.Sdk.Models.Proxies;
|
using Speckle.Sdk.Models.Proxies;
|
||||||
using AutocadColor = Autodesk.AutoCAD.Colors.Color;
|
using AutocadColor = Autodesk.AutoCAD.Colors.Color;
|
||||||
@@ -10,15 +11,9 @@ namespace Speckle.Connectors.Autocad.HostApp;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Expects to be a scoped dependency for a given operation and helps with layer creation and cleanup.
|
/// Expects to be a scoped dependency for a given operation and helps with layer creation and cleanup.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class AutocadColorBaker
|
[GenerateAutoInterface]
|
||||||
|
public class AutocadColorBaker(ILogger<AutocadColorBaker> logger) : IAutocadColorBaker
|
||||||
{
|
{
|
||||||
private readonly ILogger<AutocadColorBaker> _logger;
|
|
||||||
|
|
||||||
public AutocadColorBaker(ILogger<AutocadColorBaker> logger)
|
|
||||||
{
|
|
||||||
_logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// For receive operations
|
/// For receive operations
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -59,7 +54,7 @@ public class AutocadColorBaker
|
|||||||
}
|
}
|
||||||
catch (Exception ex) when (!ex.IsFatal())
|
catch (Exception ex) when (!ex.IsFatal())
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "Failed parsing color proxy");
|
logger.LogError(ex, "Failed parsing color proxy");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Microsoft.Extensions.Logging;
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
using Speckle.Connectors.DUI.Bridge;
|
||||||
using Speckle.Connectors.DUI.Models;
|
using Speckle.Connectors.DUI.Models;
|
||||||
using Speckle.Connectors.DUI.Utils;
|
using Speckle.Connectors.DUI.Utils;
|
||||||
@@ -6,19 +7,20 @@ namespace Speckle.Connectors.Autocad.HostApp;
|
|||||||
|
|
||||||
public class AutocadDocumentStore : DocumentModelStore
|
public class AutocadDocumentStore : DocumentModelStore
|
||||||
{
|
{
|
||||||
private readonly string _nullDocumentName = "Null Doc";
|
private const string NULL_DOCUMENT_NAME = "Null Doc";
|
||||||
private string _previousDocName;
|
private string _previousDocName;
|
||||||
private readonly AutocadDocumentManager _autocadDocumentManager;
|
private readonly AutocadDocumentManager _autocadDocumentManager;
|
||||||
|
|
||||||
public AutocadDocumentStore(
|
public AutocadDocumentStore(
|
||||||
|
ILogger<DocumentModelStore> logger,
|
||||||
IJsonSerializer jsonSerializer,
|
IJsonSerializer jsonSerializer,
|
||||||
AutocadDocumentManager autocadDocumentManager,
|
AutocadDocumentManager autocadDocumentManager,
|
||||||
ITopLevelExceptionHandler topLevelExceptionHandler
|
ITopLevelExceptionHandler topLevelExceptionHandler
|
||||||
)
|
)
|
||||||
: base(jsonSerializer)
|
: base(logger, jsonSerializer)
|
||||||
{
|
{
|
||||||
_autocadDocumentManager = autocadDocumentManager;
|
_autocadDocumentManager = autocadDocumentManager;
|
||||||
_previousDocName = _nullDocumentName;
|
_previousDocName = NULL_DOCUMENT_NAME;
|
||||||
|
|
||||||
// POC: Will be addressed to move it into AutocadContext!
|
// POC: Will be addressed to move it into AutocadContext!
|
||||||
if (Application.DocumentManager.MdiActiveDocument != null)
|
if (Application.DocumentManager.MdiActiveDocument != null)
|
||||||
@@ -40,7 +42,7 @@ public class AutocadDocumentStore : DocumentModelStore
|
|||||||
|
|
||||||
private void OnDocChangeInternal(Document? doc)
|
private void OnDocChangeInternal(Document? doc)
|
||||||
{
|
{
|
||||||
var currentDocName = doc != null ? doc.Name : _nullDocumentName;
|
var currentDocName = doc != null ? doc.Name : NULL_DOCUMENT_NAME;
|
||||||
if (_previousDocName == currentDocName)
|
if (_previousDocName == currentDocName)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -12,10 +12,7 @@ public sealed class AutocadIdleManager(IIdleCallManager idleCallManager)
|
|||||||
{
|
{
|
||||||
private readonly IIdleCallManager _idleCallManager = idleCallManager;
|
private readonly IIdleCallManager _idleCallManager = idleCallManager;
|
||||||
|
|
||||||
protected override void AddEvent()
|
protected override void AddEvent() => Application.Idle += AutocadAppOnIdle;
|
||||||
{
|
|
||||||
Application.Idle += AutocadAppOnIdle;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AutocadAppOnIdle(object? sender, EventArgs e) =>
|
private void AutocadAppOnIdle(object? sender, EventArgs e) =>
|
||||||
_idleCallManager.AppOnIdle(() => Application.Idle -= AutocadAppOnIdle);
|
_idleCallManager.AppOnIdle(() => Application.Idle -= AutocadAppOnIdle);
|
||||||
|
|||||||
@@ -26,16 +26,16 @@ namespace Speckle.Connectors.Autocad.HostApp;
|
|||||||
public class AutocadInstanceBaker : IInstanceBaker<IReadOnlyCollection<Entity>>
|
public class AutocadInstanceBaker : IInstanceBaker<IReadOnlyCollection<Entity>>
|
||||||
{
|
{
|
||||||
private readonly AutocadLayerBaker _layerBaker;
|
private readonly AutocadLayerBaker _layerBaker;
|
||||||
private readonly AutocadColorBaker _colorBaker;
|
private readonly IAutocadColorBaker _colorBaker;
|
||||||
private readonly AutocadMaterialBaker _materialBaker;
|
private readonly IAutocadMaterialBaker _materialBaker;
|
||||||
private readonly AutocadContext _autocadContext;
|
private readonly AutocadContext _autocadContext;
|
||||||
private readonly ILogger<AutocadInstanceBaker> _logger;
|
private readonly ILogger<AutocadInstanceBaker> _logger;
|
||||||
private readonly IConverterSettingsStore<AutocadConversionSettings> _converterSettings;
|
private readonly IConverterSettingsStore<AutocadConversionSettings> _converterSettings;
|
||||||
|
|
||||||
public AutocadInstanceBaker(
|
public AutocadInstanceBaker(
|
||||||
AutocadLayerBaker layerBaker,
|
AutocadLayerBaker layerBaker,
|
||||||
AutocadColorBaker colorBaker,
|
IAutocadColorBaker colorBaker,
|
||||||
AutocadMaterialBaker materialBaker,
|
IAutocadMaterialBaker materialBaker,
|
||||||
AutocadContext autocadContext,
|
AutocadContext autocadContext,
|
||||||
ILogger<AutocadInstanceBaker> logger,
|
ILogger<AutocadInstanceBaker> logger,
|
||||||
IConverterSettingsStore<AutocadConversionSettings> converterSettings
|
IConverterSettingsStore<AutocadConversionSettings> converterSettings
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using Microsoft.Extensions.Logging;
|
|||||||
using Speckle.Connectors.Autocad.HostApp.Extensions;
|
using Speckle.Connectors.Autocad.HostApp.Extensions;
|
||||||
using Speckle.Connectors.Autocad.Operations.Send;
|
using Speckle.Connectors.Autocad.Operations.Send;
|
||||||
using Speckle.Connectors.Common.Instances;
|
using Speckle.Connectors.Common.Instances;
|
||||||
|
using Speckle.Converters.AutocadShared.ToSpeckle;
|
||||||
using Speckle.Converters.Common;
|
using Speckle.Converters.Common;
|
||||||
using Speckle.DoubleNumerics;
|
using Speckle.DoubleNumerics;
|
||||||
using Speckle.Sdk;
|
using Speckle.Sdk;
|
||||||
@@ -17,16 +18,19 @@ public class AutocadInstanceUnpacker : IInstanceUnpacker<AutocadRootObject>
|
|||||||
{
|
{
|
||||||
private readonly IHostToSpeckleUnitConverter<UnitsValue> _unitsConverter;
|
private readonly IHostToSpeckleUnitConverter<UnitsValue> _unitsConverter;
|
||||||
private readonly IInstanceObjectsManager<AutocadRootObject, List<Entity>> _instanceObjectsManager;
|
private readonly IInstanceObjectsManager<AutocadRootObject, List<Entity>> _instanceObjectsManager;
|
||||||
|
private readonly IPropertiesExtractor _propertiesExtractor;
|
||||||
private readonly ILogger<AutocadInstanceUnpacker> _logger;
|
private readonly ILogger<AutocadInstanceUnpacker> _logger;
|
||||||
|
|
||||||
public AutocadInstanceUnpacker(
|
public AutocadInstanceUnpacker(
|
||||||
IHostToSpeckleUnitConverter<UnitsValue> unitsConverter,
|
IHostToSpeckleUnitConverter<UnitsValue> unitsConverter,
|
||||||
IInstanceObjectsManager<AutocadRootObject, List<Entity>> instanceObjectsManager,
|
IInstanceObjectsManager<AutocadRootObject, List<Entity>> instanceObjectsManager,
|
||||||
|
IPropertiesExtractor propertiesExtractor,
|
||||||
ILogger<AutocadInstanceUnpacker> logger
|
ILogger<AutocadInstanceUnpacker> logger
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_unitsConverter = unitsConverter;
|
_unitsConverter = unitsConverter;
|
||||||
_instanceObjectsManager = instanceObjectsManager;
|
_instanceObjectsManager = instanceObjectsManager;
|
||||||
|
_propertiesExtractor = propertiesExtractor;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,6 +75,13 @@ public class AutocadInstanceUnpacker : IInstanceUnpacker<AutocadRootObject>
|
|||||||
transform = GetMatrix(instance.BlockTransform.ToArray()),
|
transform = GetMatrix(instance.BlockTransform.ToArray()),
|
||||||
units = _unitsConverter.ConvertOrThrow(Application.DocumentManager.CurrentDocument.Database.Insunits)
|
units = _unitsConverter.ConvertOrThrow(Application.DocumentManager.CurrentDocument.Database.Insunits)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var properties = _propertiesExtractor.GetProperties(instance);
|
||||||
|
if (properties?.Count > 0)
|
||||||
|
{
|
||||||
|
instanceProxy["properties"] = properties;
|
||||||
|
}
|
||||||
|
|
||||||
_instanceObjectsManager.AddInstanceProxy(instanceId, instanceProxy);
|
_instanceObjectsManager.AddInstanceProxy(instanceId, instanceProxy);
|
||||||
|
|
||||||
// For each block instance that has the same definition, we need to keep track of the "maximum depth" at which is found.
|
// For each block instance that has the same definition, we need to keep track of the "maximum depth" at which is found.
|
||||||
@@ -101,6 +112,23 @@ public class AutocadInstanceUnpacker : IInstanceUnpacker<AutocadRootObject>
|
|||||||
|
|
||||||
instanceProxiesWithSameDefinition.Add(_instanceObjectsManager.GetInstanceProxy(instanceId));
|
instanceProxiesWithSameDefinition.Add(_instanceObjectsManager.GetInstanceProxy(instanceId));
|
||||||
|
|
||||||
|
// Add text attributes from Instances as separate atomic objects:
|
||||||
|
// AttributeReferences found on Instances are just a text, not a part of the Instance
|
||||||
|
// They are not actually references and are not linked to AttributeDefinition (as one would expect),
|
||||||
|
// and already have the correct position (no need for transforms).
|
||||||
|
// We don't want to create a new BlockDefinition for every changed text for now, because AutoCAD API doesn't provide one,
|
||||||
|
// e.g. AnonymousBlockTableRecord is provided for each dynamic blocks with geometry changes, but not for Attribute changes.
|
||||||
|
// Docs on AttributeReference usage (used totally independent of AttributeDefinition): https://help.autodesk.com/view/OARX/2025/ENU/?guid=GUID-BA69D85A-2AED-43C2-B5B7-73022B5F28F8
|
||||||
|
// Case of trying to match AttributeDefinition with AttributeReference via Tag value (which is not unique): https://forums.autodesk.com/t5/net-forum/get-the-value-of-an-attribute-in-c/td-p/9060940
|
||||||
|
|
||||||
|
foreach (ObjectId id in instance.AttributeCollection)
|
||||||
|
{
|
||||||
|
var reference = (AttributeReference)transaction.GetObject(id, OpenMode.ForRead);
|
||||||
|
string refAppId = reference.GetSpeckleApplicationId();
|
||||||
|
_instanceObjectsManager.AddAtomicObject(refAppId, new(reference, refAppId));
|
||||||
|
}
|
||||||
|
|
||||||
|
// rely on already converted Definition
|
||||||
if (
|
if (
|
||||||
_instanceObjectsManager.TryGetInstanceDefinitionProxy(
|
_instanceObjectsManager.TryGetInstanceDefinitionProxy(
|
||||||
definitionId.ToString(),
|
definitionId.ToString(),
|
||||||
@@ -131,12 +159,12 @@ public class AutocadInstanceUnpacker : IInstanceUnpacker<AutocadRootObject>
|
|||||||
{
|
{
|
||||||
Entity obj = (Entity)transaction.GetObject(id, OpenMode.ForRead);
|
Entity obj = (Entity)transaction.GetObject(id, OpenMode.ForRead);
|
||||||
|
|
||||||
// In the case of dynamic blocks, this prevents sending objects that are not visibile in its current state.
|
// In the case of dynamic blocks, this prevents sending objects that are not visible in its current state.
|
||||||
if (!obj.Visible)
|
// Also skipping AttributeDefinition because it only contains default text values. We convert AttributeReference above instead, as a separate object.
|
||||||
|
if (!obj.Visible || obj is AttributeDefinition)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
string appId = obj.GetSpeckleApplicationId();
|
string appId = obj.GetSpeckleApplicationId();
|
||||||
definitionProxy.objects.Add(appId);
|
definitionProxy.objects.Add(appId);
|
||||||
|
|
||||||
|
|||||||
@@ -12,15 +12,15 @@ public class AutocadLayerBaker : TraversalContextUnpacker
|
|||||||
{
|
{
|
||||||
private readonly string _layerFilterName = "Speckle";
|
private readonly string _layerFilterName = "Speckle";
|
||||||
private readonly AutocadContext _autocadContext;
|
private readonly AutocadContext _autocadContext;
|
||||||
private readonly AutocadMaterialBaker _materialBaker;
|
private readonly IAutocadMaterialBaker _materialBaker;
|
||||||
private readonly AutocadColorBaker _colorBaker;
|
private readonly IAutocadColorBaker _colorBaker;
|
||||||
private Document Doc => Application.DocumentManager.MdiActiveDocument;
|
private Document Doc => Application.DocumentManager.MdiActiveDocument;
|
||||||
private readonly HashSet<string> _uniqueLayerNames = new();
|
private readonly HashSet<string> _uniqueLayerNames = new();
|
||||||
|
|
||||||
public AutocadLayerBaker(
|
public AutocadLayerBaker(
|
||||||
AutocadContext autocadContext,
|
AutocadContext autocadContext,
|
||||||
AutocadMaterialBaker materialBaker,
|
IAutocadMaterialBaker materialBaker,
|
||||||
AutocadColorBaker colorBaker
|
IAutocadColorBaker colorBaker
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_autocadContext = autocadContext;
|
_autocadContext = autocadContext;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using Autodesk.AutoCAD.GraphicsInterface;
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Speckle.Connectors.Common.Conversion;
|
using Speckle.Connectors.Common.Conversion;
|
||||||
using Speckle.Connectors.Common.Operations;
|
using Speckle.Connectors.Common.Operations;
|
||||||
|
using Speckle.InterfaceGenerator;
|
||||||
using Speckle.Objects.Other;
|
using Speckle.Objects.Other;
|
||||||
using Speckle.Sdk;
|
using Speckle.Sdk;
|
||||||
using Speckle.Sdk.Common;
|
using Speckle.Sdk.Common;
|
||||||
@@ -16,7 +17,8 @@ namespace Speckle.Connectors.Autocad.HostApp;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Expects to be a scoped dependency for a given operation and helps with layer creation and cleanup.
|
/// Expects to be a scoped dependency for a given operation and helps with layer creation and cleanup.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class AutocadMaterialBaker
|
[GenerateAutoInterface]
|
||||||
|
public class AutocadMaterialBaker : IAutocadMaterialBaker
|
||||||
{
|
{
|
||||||
private readonly ILogger<AutocadMaterialBaker> _logger;
|
private readonly ILogger<AutocadMaterialBaker> _logger;
|
||||||
private readonly AutocadContext _autocadContext;
|
private readonly AutocadContext _autocadContext;
|
||||||
|
|||||||
@@ -0,0 +1,296 @@
|
|||||||
|
using Autodesk.AutoCAD.DatabaseServices;
|
||||||
|
using Speckle.Connectors.Autocad.HostApp;
|
||||||
|
using Speckle.Connectors.Autocad.HostApp.Extensions;
|
||||||
|
using Speckle.Connectors.Common.Builders;
|
||||||
|
using Speckle.Connectors.Common.Conversion;
|
||||||
|
using Speckle.Connectors.Common.Extensions;
|
||||||
|
using Speckle.Connectors.Common.Operations;
|
||||||
|
using Speckle.Connectors.Common.Operations.Receive;
|
||||||
|
using Speckle.Converters.Common;
|
||||||
|
using Speckle.Sdk.Common;
|
||||||
|
using Speckle.Sdk.Dependencies;
|
||||||
|
using Speckle.Sdk.Models;
|
||||||
|
using Speckle.Sdk.Models.Collections;
|
||||||
|
using Speckle.Sdk.Models.Instances;
|
||||||
|
using AutocadColor = Autodesk.AutoCAD.Colors.Color;
|
||||||
|
|
||||||
|
namespace Speckle.Connectors.Autocad.Operations.Receive;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>Base class for AutoCAD host object builders. Expects to be a scoped dependency per receive operation.</para>
|
||||||
|
/// </summary>
|
||||||
|
public abstract class AutocadHostObjectBaseBuilder : IHostObjectBuilder
|
||||||
|
{
|
||||||
|
private readonly IRootToHostConverter _converter;
|
||||||
|
private readonly AutocadLayerBaker _layerBaker;
|
||||||
|
private readonly AutocadGroupBaker _groupBaker;
|
||||||
|
private readonly AutocadInstanceBaker _instanceBaker;
|
||||||
|
private readonly IAutocadMaterialBaker _materialBaker;
|
||||||
|
private readonly IAutocadColorBaker _colorBaker;
|
||||||
|
private readonly AutocadContext _autocadContext;
|
||||||
|
private readonly RootObjectUnpacker _rootObjectUnpacker;
|
||||||
|
private readonly IReceiveConversionHandler _conversionHandler;
|
||||||
|
|
||||||
|
protected AutocadHostObjectBaseBuilder(
|
||||||
|
IRootToHostConverter converter,
|
||||||
|
AutocadLayerBaker layerBaker,
|
||||||
|
AutocadGroupBaker groupBaker,
|
||||||
|
AutocadInstanceBaker instanceBaker,
|
||||||
|
IAutocadMaterialBaker materialBaker,
|
||||||
|
IAutocadColorBaker colorBaker,
|
||||||
|
AutocadContext autocadContext,
|
||||||
|
RootObjectUnpacker rootObjectUnpacker,
|
||||||
|
IReceiveConversionHandler conversionHandler
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_converter = converter;
|
||||||
|
_layerBaker = layerBaker;
|
||||||
|
_groupBaker = groupBaker;
|
||||||
|
_instanceBaker = instanceBaker;
|
||||||
|
_materialBaker = materialBaker;
|
||||||
|
_colorBaker = colorBaker;
|
||||||
|
_autocadContext = autocadContext;
|
||||||
|
_rootObjectUnpacker = rootObjectUnpacker;
|
||||||
|
_conversionHandler = conversionHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<HostObjectBuilderResult> Build(
|
||||||
|
Base rootObject,
|
||||||
|
string projectName,
|
||||||
|
string modelName,
|
||||||
|
IProgress<CardProgress> onOperationProgressed,
|
||||||
|
CancellationToken cancellationToken
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Prompt the UI conversion started. Progress bar will swoosh.
|
||||||
|
onOperationProgressed.Report(new("Converting", null));
|
||||||
|
|
||||||
|
// Layer filter for received commit with project and model name
|
||||||
|
_layerBaker.CreateLayerFilter(projectName, modelName);
|
||||||
|
|
||||||
|
// 0 - Clean then Rock n Roll!
|
||||||
|
string baseLayerPrefix = _autocadContext.RemoveInvalidChars($"SPK-{projectName}-{modelName}-");
|
||||||
|
PreReceiveDeepClean(baseLayerPrefix);
|
||||||
|
|
||||||
|
// 1 - Unpack objects and proxies from root commit object
|
||||||
|
var unpackedRoot = _rootObjectUnpacker.Unpack(rootObject);
|
||||||
|
|
||||||
|
// 2 - Split atomic objects and instance components with their path
|
||||||
|
var (atomicObjects, instanceComponents) = _rootObjectUnpacker.SplitAtomicObjectsAndInstances(
|
||||||
|
unpackedRoot.ObjectsToConvert
|
||||||
|
);
|
||||||
|
var atomicObjectsWithPath = _layerBaker.GetAtomicObjectsWithPath(atomicObjects);
|
||||||
|
var instanceComponentsWithPath = _layerBaker.GetInstanceComponentsWithPath(instanceComponents);
|
||||||
|
|
||||||
|
// POC: these are not captured by traversal, so we need to re-add them here
|
||||||
|
if (unpackedRoot.DefinitionProxies != null && unpackedRoot.DefinitionProxies.Count > 0)
|
||||||
|
{
|
||||||
|
var transformed = unpackedRoot.DefinitionProxies.Select(proxy =>
|
||||||
|
(Array.Empty<Collection>(), proxy as IInstanceComponent)
|
||||||
|
);
|
||||||
|
instanceComponentsWithPath.AddRange(transformed);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3 - Parse and bake proxies (materials and colors), as they are used later down the line by layers and objects
|
||||||
|
if (unpackedRoot.RenderMaterialProxies != null)
|
||||||
|
{
|
||||||
|
_materialBaker.ParseAndBakeRenderMaterials(
|
||||||
|
unpackedRoot.RenderMaterialProxies,
|
||||||
|
baseLayerPrefix,
|
||||||
|
onOperationProgressed
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (unpackedRoot.ColorProxies != null)
|
||||||
|
{
|
||||||
|
_colorBaker.ParseColors(unpackedRoot.ColorProxies, onOperationProgressed);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3.5 - Parse and bake additional proxies that are needed for conversion
|
||||||
|
ParseAndBakeAdditionalProxies(rootObject, baseLayerPrefix);
|
||||||
|
|
||||||
|
// 4 - Convert atomic objects
|
||||||
|
HashSet<ReceiveConversionResult> results = new();
|
||||||
|
HashSet<string> bakedObjectIds = new();
|
||||||
|
Dictionary<string, IReadOnlyCollection<Entity>> applicationIdMap = new();
|
||||||
|
var count = 0;
|
||||||
|
foreach (var (layerPath, atomicObject) in atomicObjectsWithPath)
|
||||||
|
{
|
||||||
|
onOperationProgressed.Report(new("Converting objects", (double)++count / atomicObjects.Count));
|
||||||
|
var ex = _conversionHandler.TryConvert(() =>
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
string objectId = atomicObject.applicationId ?? atomicObject.id.NotNull();
|
||||||
|
IReadOnlyCollection<Entity> convertedObjects = ConvertObject(atomicObject, layerPath, baseLayerPrefix);
|
||||||
|
|
||||||
|
applicationIdMap[objectId] = convertedObjects;
|
||||||
|
|
||||||
|
results.UnionWith(
|
||||||
|
convertedObjects.Select(e => new ReceiveConversionResult(
|
||||||
|
Status.SUCCESS,
|
||||||
|
atomicObject,
|
||||||
|
e.GetSpeckleApplicationId(),
|
||||||
|
e.GetType().ToString()
|
||||||
|
))
|
||||||
|
);
|
||||||
|
|
||||||
|
bakedObjectIds.UnionWith(convertedObjects.Select(e => e.GetSpeckleApplicationId()));
|
||||||
|
});
|
||||||
|
if (ex != null)
|
||||||
|
{
|
||||||
|
results.Add(new(Status.ERROR, atomicObject, null, null, ex));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5 - Convert instances
|
||||||
|
var (createdInstanceIds, consumedObjectIds, instanceConversionResults) = _instanceBaker.BakeInstances(
|
||||||
|
instanceComponentsWithPath,
|
||||||
|
applicationIdMap,
|
||||||
|
baseLayerPrefix,
|
||||||
|
onOperationProgressed
|
||||||
|
);
|
||||||
|
|
||||||
|
bakedObjectIds.RemoveWhere(id => consumedObjectIds.Contains(id));
|
||||||
|
bakedObjectIds.UnionWith(createdInstanceIds);
|
||||||
|
results.RemoveWhere(result => result.ResultId != null && consumedObjectIds.Contains(result.ResultId));
|
||||||
|
results.UnionWith(instanceConversionResults);
|
||||||
|
|
||||||
|
// 6 - Create groups
|
||||||
|
if (unpackedRoot.GroupProxies != null)
|
||||||
|
{
|
||||||
|
IReadOnlyCollection<ReceiveConversionResult> groupResults = _groupBaker.CreateGroups(
|
||||||
|
unpackedRoot.GroupProxies,
|
||||||
|
applicationIdMap
|
||||||
|
);
|
||||||
|
results.UnionWith(groupResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.FromResult(new HostObjectBuilderResult(bakedObjectIds, results));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void PreReceiveDeepClean(string baseLayerPrefix)
|
||||||
|
{
|
||||||
|
_layerBaker.DeleteAllLayersByPrefix(baseLayerPrefix);
|
||||||
|
_instanceBaker.PurgeInstances(baseLayerPrefix);
|
||||||
|
_materialBaker.PurgeMaterials(baseLayerPrefix);
|
||||||
|
PreReceiveAdditionalDeepClean(baseLayerPrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Method for adding app-specific additional deep clean of the document prior to receiving.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void PreReceiveAdditionalDeepClean(string baseLayerPrefix) { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Method for parsing and baking additional app-specific proxies on the root prior to converting and baking objects
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void ParseAndBakeAdditionalProxies(Base rootObject, string baseLayerPrefix) { }
|
||||||
|
|
||||||
|
private IReadOnlyCollection<Entity> ConvertObject(Base obj, Collection[] layerPath, string baseLayerNamePrefix)
|
||||||
|
{
|
||||||
|
string layerName = _layerBaker.CreateLayerForReceive(layerPath, baseLayerNamePrefix);
|
||||||
|
var convertedEntities = new HashSet<Entity>();
|
||||||
|
|
||||||
|
using var tr = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
|
||||||
|
|
||||||
|
// 1: convert
|
||||||
|
var converted = _converter.Convert(obj);
|
||||||
|
|
||||||
|
// 2: handle result
|
||||||
|
switch (converted)
|
||||||
|
{
|
||||||
|
case Entity entity:
|
||||||
|
var bakedEntity = BakeObject(entity, obj, layerName, tr);
|
||||||
|
convertedEntities.Add(bakedEntity);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case List<(Entity, Base)> listConversionResult: // this is from fallback conversion for brep/brepx/subdx/extrusionx/polycurve
|
||||||
|
var bakedFallbackEntities = BakeObjectsAsGroup(listConversionResult, obj, layerName, baseLayerNamePrefix, tr);
|
||||||
|
convertedEntities.UnionWith(bakedFallbackEntities);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// TODO: capture defualt case with report object here? Same as in Rhino
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.Commit();
|
||||||
|
return convertedEntities.Freeze();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Entity BakeObject(
|
||||||
|
Entity entity,
|
||||||
|
Base originalObject,
|
||||||
|
string layerName,
|
||||||
|
Transaction tr,
|
||||||
|
Base? parentObject = null
|
||||||
|
)
|
||||||
|
{
|
||||||
|
var objId = originalObject.applicationId ?? originalObject.id.NotNull();
|
||||||
|
if (_colorBaker.ObjectColorsIdMap.TryGetValue(objId, out AutocadColor? color))
|
||||||
|
{
|
||||||
|
entity.Color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_materialBaker.TryGetMaterialId(originalObject, parentObject, out ObjectId matId))
|
||||||
|
{
|
||||||
|
entity.MaterialId = matId;
|
||||||
|
}
|
||||||
|
|
||||||
|
entity.AppendToDb(layerName);
|
||||||
|
|
||||||
|
// Hook for derived classes to perform additional operations after entity is added to database
|
||||||
|
PostBakeEntity(entity, originalObject, tr);
|
||||||
|
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Method for additional app-specific operations on entities after the entity has been added to the document database.
|
||||||
|
/// Called after the entity is added to the database in an open transaction
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="entity"></param>
|
||||||
|
/// <param name="originalObject"></param>
|
||||||
|
/// <param name="tr"></param>
|
||||||
|
protected virtual void PostBakeEntity(Entity entity, Base originalObject, Transaction tr)
|
||||||
|
{
|
||||||
|
// Default implementation does nothing - override in derived classes
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Entity> BakeObjectsAsGroup(
|
||||||
|
List<(Entity, Base)> fallbackConversionResult,
|
||||||
|
Base parentObject,
|
||||||
|
string layerName,
|
||||||
|
string baseLayerName,
|
||||||
|
Transaction tr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
var ids = new ObjectIdCollection();
|
||||||
|
var entities = new List<Entity>();
|
||||||
|
foreach (var (conversionResult, originalObject) in fallbackConversionResult)
|
||||||
|
{
|
||||||
|
BakeObject(conversionResult, originalObject, layerName, tr, parentObject);
|
||||||
|
ids.Add(conversionResult.ObjectId);
|
||||||
|
entities.Add(conversionResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entities.Count <= 1) // return if empty list or only one, because we don't want to create empty or single item groups.
|
||||||
|
{
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
var groupDictionary = (DBDictionary)
|
||||||
|
tr.GetObject(Application.DocumentManager.CurrentDocument.Database.GroupDictionaryId, OpenMode.ForWrite);
|
||||||
|
|
||||||
|
var groupName = _autocadContext.RemoveInvalidChars(
|
||||||
|
$@"{parentObject.speckle_type.Split('.').Last()} - {parentObject.applicationId ?? parentObject.id} ({baseLayerName})"
|
||||||
|
);
|
||||||
|
|
||||||
|
var newGroup = new Group(groupName, true);
|
||||||
|
newGroup.Append(ids);
|
||||||
|
groupDictionary.UpgradeOpen();
|
||||||
|
groupDictionary.SetAt(groupName, newGroup);
|
||||||
|
tr.AddNewlyCreatedDBObject(newGroup, true);
|
||||||
|
|
||||||
|
return entities;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,268 +1,35 @@
|
|||||||
using Autodesk.AutoCAD.DatabaseServices;
|
|
||||||
using Speckle.Connectors.Autocad.HostApp;
|
using Speckle.Connectors.Autocad.HostApp;
|
||||||
using Speckle.Connectors.Autocad.HostApp.Extensions;
|
|
||||||
using Speckle.Connectors.Common.Builders;
|
|
||||||
using Speckle.Connectors.Common.Conversion;
|
|
||||||
using Speckle.Connectors.Common.Extensions;
|
|
||||||
using Speckle.Connectors.Common.Operations;
|
using Speckle.Connectors.Common.Operations;
|
||||||
using Speckle.Connectors.Common.Operations.Receive;
|
using Speckle.Connectors.Common.Operations.Receive;
|
||||||
using Speckle.Converters.Common;
|
using Speckle.Converters.Common;
|
||||||
using Speckle.Sdk;
|
|
||||||
using Speckle.Sdk.Common;
|
|
||||||
using Speckle.Sdk.Dependencies;
|
|
||||||
using Speckle.Sdk.Models;
|
|
||||||
using Speckle.Sdk.Models.Collections;
|
|
||||||
using Speckle.Sdk.Models.Instances;
|
|
||||||
using AutocadColor = Autodesk.AutoCAD.Colors.Color;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.Autocad.Operations.Receive;
|
namespace Speckle.Connectors.Autocad.Operations.Receive;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <para>Expects to be a scoped dependency per receive operation.</para>
|
/// <para>AutoCAD-specific host object builder. Expects to be a scoped dependency per receive operation.</para>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class AutocadHostObjectBuilder : IHostObjectBuilder
|
public sealed class AutocadHostObjectBuilder : AutocadHostObjectBaseBuilder
|
||||||
{
|
{
|
||||||
private readonly AutocadLayerBaker _layerBaker;
|
|
||||||
private readonly IRootToHostConverter _converter;
|
|
||||||
private readonly ISyncToThread _syncToThread;
|
|
||||||
private readonly AutocadGroupBaker _groupBaker;
|
|
||||||
private readonly AutocadMaterialBaker _materialBaker;
|
|
||||||
private readonly AutocadColorBaker _colorBaker;
|
|
||||||
private readonly AutocadInstanceBaker _instanceBaker;
|
|
||||||
private readonly AutocadContext _autocadContext;
|
|
||||||
private readonly RootObjectUnpacker _rootObjectUnpacker;
|
|
||||||
|
|
||||||
public AutocadHostObjectBuilder(
|
public AutocadHostObjectBuilder(
|
||||||
IRootToHostConverter converter,
|
IRootToHostConverter converter,
|
||||||
AutocadLayerBaker layerBaker,
|
AutocadLayerBaker layerBaker,
|
||||||
AutocadGroupBaker groupBaker,
|
AutocadGroupBaker groupBaker,
|
||||||
AutocadInstanceBaker instanceBaker,
|
AutocadInstanceBaker instanceBaker,
|
||||||
AutocadMaterialBaker materialBaker,
|
IAutocadMaterialBaker materialBaker,
|
||||||
AutocadColorBaker colorBaker,
|
IAutocadColorBaker colorBaker,
|
||||||
ISyncToThread syncToThread,
|
|
||||||
AutocadContext autocadContext,
|
AutocadContext autocadContext,
|
||||||
RootObjectUnpacker rootObjectUnpacker
|
RootObjectUnpacker rootObjectUnpacker,
|
||||||
|
IReceiveConversionHandler conversionHandler
|
||||||
)
|
)
|
||||||
{
|
: base(
|
||||||
_converter = converter;
|
converter,
|
||||||
_layerBaker = layerBaker;
|
layerBaker,
|
||||||
_groupBaker = groupBaker;
|
groupBaker,
|
||||||
_instanceBaker = instanceBaker;
|
instanceBaker,
|
||||||
_materialBaker = materialBaker;
|
materialBaker,
|
||||||
_colorBaker = colorBaker;
|
colorBaker,
|
||||||
_syncToThread = syncToThread;
|
autocadContext,
|
||||||
_autocadContext = autocadContext;
|
rootObjectUnpacker,
|
||||||
_rootObjectUnpacker = rootObjectUnpacker;
|
conversionHandler
|
||||||
}
|
) { }
|
||||||
|
|
||||||
public async Task<HostObjectBuilderResult> Build(
|
|
||||||
Base rootObject,
|
|
||||||
string projectName,
|
|
||||||
string modelName,
|
|
||||||
IProgress<CardProgress> onOperationProgressed,
|
|
||||||
CancellationToken _
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// NOTE: This is the only place we apply ISyncToThread across connectors. We need to sync up with main thread here
|
|
||||||
// after GetObject and Deserialization. It is anti-pattern now. Happiness level 3/10 but works.
|
|
||||||
return await _syncToThread
|
|
||||||
.RunOnThread(async () =>
|
|
||||||
{
|
|
||||||
await Task.CompletedTask.ConfigureAwait(true);
|
|
||||||
return BuildSync(rootObject, projectName, modelName, onOperationProgressed);
|
|
||||||
})
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private HostObjectBuilderResult BuildSync(
|
|
||||||
Base rootObject,
|
|
||||||
string projectName,
|
|
||||||
string modelName,
|
|
||||||
IProgress<CardProgress> onOperationProgressed
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// Prompt the UI conversion started. Progress bar will swoosh.
|
|
||||||
onOperationProgressed.Report(new("Converting", null));
|
|
||||||
|
|
||||||
// Layer filter for received commit with project and model name
|
|
||||||
_layerBaker.CreateLayerFilter(projectName, modelName);
|
|
||||||
|
|
||||||
// 0 - Clean then Rock n Roll!
|
|
||||||
string baseLayerPrefix = _autocadContext.RemoveInvalidChars($"SPK-{projectName}-{modelName}-");
|
|
||||||
PreReceiveDeepClean(baseLayerPrefix);
|
|
||||||
|
|
||||||
// 1 - Unpack objects and proxies from root commit object
|
|
||||||
var unpackedRoot = _rootObjectUnpacker.Unpack(rootObject);
|
|
||||||
|
|
||||||
// 2 - Split atomic objects and instance components with their path
|
|
||||||
var (atomicObjects, instanceComponents) = _rootObjectUnpacker.SplitAtomicObjectsAndInstances(
|
|
||||||
unpackedRoot.ObjectsToConvert
|
|
||||||
);
|
|
||||||
var atomicObjectsWithPath = _layerBaker.GetAtomicObjectsWithPath(atomicObjects);
|
|
||||||
var instanceComponentsWithPath = _layerBaker.GetInstanceComponentsWithPath(instanceComponents);
|
|
||||||
|
|
||||||
// POC: these are not captured by traversal, so we need to re-add them here
|
|
||||||
if (unpackedRoot.DefinitionProxies != null && unpackedRoot.DefinitionProxies.Count > 0)
|
|
||||||
{
|
|
||||||
var transformed = unpackedRoot.DefinitionProxies.Select(proxy =>
|
|
||||||
(Array.Empty<Collection>(), proxy as IInstanceComponent)
|
|
||||||
);
|
|
||||||
instanceComponentsWithPath.AddRange(transformed);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3 - Bake materials and colors, as they are used later down the line by layers and objects
|
|
||||||
if (unpackedRoot.RenderMaterialProxies != null)
|
|
||||||
{
|
|
||||||
_materialBaker.ParseAndBakeRenderMaterials(
|
|
||||||
unpackedRoot.RenderMaterialProxies,
|
|
||||||
baseLayerPrefix,
|
|
||||||
onOperationProgressed
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (unpackedRoot.ColorProxies != null)
|
|
||||||
{
|
|
||||||
_colorBaker.ParseColors(unpackedRoot.ColorProxies, onOperationProgressed);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 5 - Convert atomic objects
|
|
||||||
HashSet<ReceiveConversionResult> results = new();
|
|
||||||
HashSet<string> bakedObjectIds = new();
|
|
||||||
Dictionary<string, IReadOnlyCollection<Entity>> applicationIdMap = new();
|
|
||||||
var count = 0;
|
|
||||||
foreach (var (layerPath, atomicObject) in atomicObjectsWithPath)
|
|
||||||
{
|
|
||||||
string objectId = atomicObject.applicationId ?? atomicObject.id.NotNull();
|
|
||||||
onOperationProgressed.Report(new("Converting objects", (double)++count / atomicObjects.Count));
|
|
||||||
try
|
|
||||||
{
|
|
||||||
IReadOnlyCollection<Entity> convertedObjects = ConvertObject(atomicObject, layerPath, baseLayerPrefix);
|
|
||||||
|
|
||||||
applicationIdMap[objectId] = convertedObjects;
|
|
||||||
|
|
||||||
results.UnionWith(
|
|
||||||
convertedObjects.Select(e => new ReceiveConversionResult(
|
|
||||||
Status.SUCCESS,
|
|
||||||
atomicObject,
|
|
||||||
e.GetSpeckleApplicationId(),
|
|
||||||
e.GetType().ToString()
|
|
||||||
))
|
|
||||||
);
|
|
||||||
|
|
||||||
bakedObjectIds.UnionWith(convertedObjects.Select(e => e.GetSpeckleApplicationId()));
|
|
||||||
}
|
|
||||||
catch (Exception ex) when (!ex.IsFatal())
|
|
||||||
{
|
|
||||||
results.Add(new(Status.ERROR, atomicObject, null, null, ex));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 6 - Convert instances
|
|
||||||
var (createdInstanceIds, consumedObjectIds, instanceConversionResults) = _instanceBaker.BakeInstances(
|
|
||||||
instanceComponentsWithPath,
|
|
||||||
applicationIdMap,
|
|
||||||
baseLayerPrefix,
|
|
||||||
onOperationProgressed
|
|
||||||
);
|
|
||||||
|
|
||||||
bakedObjectIds.RemoveWhere(id => consumedObjectIds.Contains(id));
|
|
||||||
bakedObjectIds.UnionWith(createdInstanceIds);
|
|
||||||
results.RemoveWhere(result => result.ResultId != null && consumedObjectIds.Contains(result.ResultId));
|
|
||||||
results.UnionWith(instanceConversionResults);
|
|
||||||
|
|
||||||
// 7 - Create groups
|
|
||||||
if (unpackedRoot.GroupProxies != null)
|
|
||||||
{
|
|
||||||
IReadOnlyCollection<ReceiveConversionResult> groupResults = _groupBaker.CreateGroups(
|
|
||||||
unpackedRoot.GroupProxies,
|
|
||||||
applicationIdMap
|
|
||||||
);
|
|
||||||
results.UnionWith(groupResults);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new HostObjectBuilderResult(bakedObjectIds, results);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void PreReceiveDeepClean(string baseLayerPrefix)
|
|
||||||
{
|
|
||||||
_layerBaker.DeleteAllLayersByPrefix(baseLayerPrefix);
|
|
||||||
_instanceBaker.PurgeInstances(baseLayerPrefix);
|
|
||||||
_materialBaker.PurgeMaterials(baseLayerPrefix);
|
|
||||||
}
|
|
||||||
|
|
||||||
private IReadOnlyCollection<Entity> ConvertObject(Base obj, Collection[] layerPath, string baseLayerNamePrefix)
|
|
||||||
{
|
|
||||||
string layerName = _layerBaker.CreateLayerForReceive(layerPath, baseLayerNamePrefix);
|
|
||||||
var convertedEntities = new HashSet<Entity>();
|
|
||||||
|
|
||||||
using var tr = Application.DocumentManager.CurrentDocument.Database.TransactionManager.StartTransaction();
|
|
||||||
|
|
||||||
// 1: convert
|
|
||||||
var converted = _converter.Convert(obj);
|
|
||||||
|
|
||||||
// 2: handle result
|
|
||||||
if (converted is Entity entity)
|
|
||||||
{
|
|
||||||
var bakedEntity = BakeObject(entity, obj, layerName);
|
|
||||||
convertedEntities.Add(bakedEntity);
|
|
||||||
}
|
|
||||||
else if (converted is List<(Entity, Base)> fallbackConversionResult)
|
|
||||||
{
|
|
||||||
var bakedFallbackEntities = BakeObjectsAsGroup(fallbackConversionResult, obj, layerName, baseLayerNamePrefix);
|
|
||||||
convertedEntities.UnionWith(bakedFallbackEntities);
|
|
||||||
}
|
|
||||||
|
|
||||||
tr.Commit();
|
|
||||||
return convertedEntities.Freeze();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Entity BakeObject(Entity entity, Base originalObject, string layerName, Base? parentObject = null)
|
|
||||||
{
|
|
||||||
var objId = originalObject.applicationId ?? originalObject.id.NotNull();
|
|
||||||
if (_colorBaker.ObjectColorsIdMap.TryGetValue(objId, out AutocadColor? color))
|
|
||||||
{
|
|
||||||
entity.Color = color;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_materialBaker.TryGetMaterialId(originalObject, parentObject, out ObjectId matId))
|
|
||||||
{
|
|
||||||
entity.MaterialId = matId;
|
|
||||||
}
|
|
||||||
|
|
||||||
entity.AppendToDb(layerName);
|
|
||||||
return entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Entity> BakeObjectsAsGroup(
|
|
||||||
List<(Entity, Base)> fallbackConversionResult,
|
|
||||||
Base parentObject,
|
|
||||||
string layerName,
|
|
||||||
string baseLayerName
|
|
||||||
)
|
|
||||||
{
|
|
||||||
var ids = new ObjectIdCollection();
|
|
||||||
var entities = new List<Entity>();
|
|
||||||
foreach (var (conversionResult, originalObject) in fallbackConversionResult)
|
|
||||||
{
|
|
||||||
BakeObject(conversionResult, originalObject, layerName, parentObject);
|
|
||||||
ids.Add(conversionResult.ObjectId);
|
|
||||||
entities.Add(conversionResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
var tr = Application.DocumentManager.CurrentDocument.Database.TransactionManager.TopTransaction;
|
|
||||||
var groupDictionary = (DBDictionary)
|
|
||||||
tr.GetObject(Application.DocumentManager.CurrentDocument.Database.GroupDictionaryId, OpenMode.ForWrite);
|
|
||||||
|
|
||||||
var groupName = _autocadContext.RemoveInvalidChars(
|
|
||||||
$@"{parentObject.speckle_type.Split('.').Last()} - {parentObject.applicationId ?? parentObject.id} ({baseLayerName})"
|
|
||||||
);
|
|
||||||
|
|
||||||
var newGroup = new Group(groupName, true);
|
|
||||||
newGroup.Append(ids);
|
|
||||||
groupDictionary.UpgradeOpen();
|
|
||||||
groupDictionary.SetAt(groupName, newGroup);
|
|
||||||
tr.AddNewlyCreatedDBObject(newGroup, true);
|
|
||||||
|
|
||||||
return entities;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,13 +49,6 @@ public abstract class AutocadRootObjectBaseBuilder : IRootObjectBuilder<AutocadR
|
|||||||
_activityFactory = activityFactory;
|
_activityFactory = activityFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<RootObjectBuilderResult> Build(
|
|
||||||
IReadOnlyList<AutocadRootObject> objects,
|
|
||||||
SendInfo sendInfo,
|
|
||||||
IProgress<CardProgress> onOperationProgressed,
|
|
||||||
CancellationToken ct = default
|
|
||||||
) => Task.FromResult(BuildSync(objects, sendInfo, onOperationProgressed, ct));
|
|
||||||
|
|
||||||
[SuppressMessage(
|
[SuppressMessage(
|
||||||
"Maintainability",
|
"Maintainability",
|
||||||
"CA1506:Avoid excessive class coupling",
|
"CA1506:Avoid excessive class coupling",
|
||||||
@@ -65,11 +58,11 @@ public abstract class AutocadRootObjectBaseBuilder : IRootObjectBuilder<AutocadR
|
|||||||
proxy classes yet. So I'm supressing this one now!!!
|
proxy classes yet. So I'm supressing this one now!!!
|
||||||
"""
|
"""
|
||||||
)]
|
)]
|
||||||
private RootObjectBuilderResult BuildSync(
|
public Task<RootObjectBuilderResult> Build(
|
||||||
IReadOnlyList<AutocadRootObject> objects,
|
IReadOnlyList<AutocadRootObject> objects,
|
||||||
SendInfo sendInfo,
|
string projectId,
|
||||||
IProgress<CardProgress> onOperationProgressed,
|
IProgress<CardProgress> onOperationProgressed,
|
||||||
CancellationToken ct = default
|
CancellationToken cancellationToken
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// 0 - Init the root
|
// 0 - Init the root
|
||||||
@@ -101,29 +94,20 @@ public abstract class AutocadRootObjectBaseBuilder : IRootObjectBuilder<AutocadR
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
foreach (var (entity, applicationId) in atomicObjects)
|
foreach (var (entity, applicationId) in atomicObjects)
|
||||||
{
|
{
|
||||||
ct.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
using (var convertActivity = _activityFactory.Start("Converting object"))
|
// Create and add a collection for this entity if not done so already.
|
||||||
|
(Collection objectCollection, LayerTableRecord? autocadLayer) = CreateObjectCollection(entity, tr);
|
||||||
|
|
||||||
|
if (autocadLayer is not null)
|
||||||
{
|
{
|
||||||
// Create and add a collection for this entity if not done so already.
|
usedAcadLayers.Add(autocadLayer);
|
||||||
(Collection objectCollection, LayerTableRecord? autocadLayer) = CreateObjectCollection(entity, tr);
|
root.elements.Add(objectCollection);
|
||||||
|
|
||||||
if (autocadLayer is not null)
|
|
||||||
{
|
|
||||||
usedAcadLayers.Add(autocadLayer);
|
|
||||||
root.elements.Add(objectCollection);
|
|
||||||
}
|
|
||||||
|
|
||||||
var result = ConvertAutocadEntity(
|
|
||||||
entity,
|
|
||||||
applicationId,
|
|
||||||
objectCollection,
|
|
||||||
instanceProxies,
|
|
||||||
sendInfo.ProjectId
|
|
||||||
);
|
|
||||||
results.Add(result);
|
|
||||||
|
|
||||||
onOperationProgressed.Report(new("Converting", (double)++count / atomicObjects.Count));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var result = ConvertAutocadEntity(entity, applicationId, objectCollection, instanceProxies, projectId);
|
||||||
|
results.Add(result);
|
||||||
|
|
||||||
|
onOperationProgressed.Report(new("Converting", (double)++count / atomicObjects.Count));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (results.All(x => x.Status == Status.ERROR))
|
if (results.All(x => x.Status == Status.ERROR))
|
||||||
@@ -140,7 +124,7 @@ public abstract class AutocadRootObjectBaseBuilder : IRootObjectBuilder<AutocadR
|
|||||||
// add any additional properties (most likely from verticals)
|
// add any additional properties (most likely from verticals)
|
||||||
AddAdditionalProxiesToRoot(root);
|
AddAdditionalProxiesToRoot(root);
|
||||||
|
|
||||||
return new RootObjectBuilderResult(root, results);
|
return Task.FromResult(new RootObjectBuilderResult(root, results));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
using Speckle.Sdk.Host;
|
using Speckle.Connectors.Common;
|
||||||
|
|
||||||
namespace Speckle.Connectors.Autocad.Plugin;
|
namespace Speckle.Connectors.Autocad.Plugin;
|
||||||
|
|
||||||
public static class AppUtils
|
public static class AppUtils
|
||||||
{
|
{
|
||||||
public static HostApplication App =>
|
public static Speckle.Sdk.Application App =>
|
||||||
#if CIVIL3D
|
#if CIVIL3D
|
||||||
HostApplications.Civil3D;
|
HostApplications.Civil3D;
|
||||||
#elif AUTOCAD
|
#elif AUTOCAD
|
||||||
@@ -14,7 +14,9 @@ public static class AppUtils
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
public static HostAppVersion Version =>
|
public static HostAppVersion Version =>
|
||||||
#if AUTOCAD2025 || CIVIL3D2025
|
#if AUTOCAD2026 || CIVIL3D2026
|
||||||
|
HostAppVersion.v2026;
|
||||||
|
#elif AUTOCAD2025 || CIVIL3D2025
|
||||||
HostAppVersion.v2025;
|
HostAppVersion.v2025;
|
||||||
#elif AUTOCAD2024 || CIVIL3D2024
|
#elif AUTOCAD2024 || CIVIL3D2024
|
||||||
HostAppVersion.v2024;
|
HostAppVersion.v2024;
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ namespace Speckle.Connectors.Autocad.Plugin;
|
|||||||
public class AutocadCommand
|
public class AutocadCommand
|
||||||
{
|
{
|
||||||
private static PaletteSet? PaletteSet { get; set; }
|
private static PaletteSet? PaletteSet { get; set; }
|
||||||
private static readonly Guid s_id = new("3223E594-1B09-4E54-B3DD-8EA0BECE7BA5");
|
private static readonly Guid s_id = new("7C27DD2B-86E8-4D31-B3DE-B34B267B1DC8");
|
||||||
public ServiceProvider? Container { get; private set; }
|
public ServiceProvider? Container { get; private set; }
|
||||||
private IDisposable? _disposableLogger;
|
private IDisposable? _disposableLogger;
|
||||||
public const string COMMAND_STRING = "SpeckleBeta";
|
public const string COMMAND_STRING = "Speckle";
|
||||||
|
|
||||||
[CommandMethod(COMMAND_STRING)]
|
[CommandMethod(COMMAND_STRING)]
|
||||||
public void Command()
|
public void Command()
|
||||||
@@ -31,7 +31,7 @@ public class AutocadCommand
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PaletteSet = new PaletteSet($"Speckle (Beta) for {AppUtils.App.Name}", s_id)
|
PaletteSet = new PaletteSet($"Speckle", s_id)
|
||||||
{
|
{
|
||||||
Size = new Size(400, 500),
|
Size = new Size(400, 500),
|
||||||
DockEnabled = (DockSides)((int)DockSides.Left + (int)DockSides.Right)
|
DockEnabled = (DockSides)((int)DockSides.Left + (int)DockSides.Right)
|
||||||
@@ -52,7 +52,7 @@ public class AutocadCommand
|
|||||||
|
|
||||||
var panelWebView = Container.GetRequiredService<DUI3ControlWebView>();
|
var panelWebView = Container.GetRequiredService<DUI3ControlWebView>();
|
||||||
|
|
||||||
PaletteSet.AddVisual($"Speckle (Beta) for {AppUtils.App.Name} WebView", panelWebView);
|
PaletteSet.AddVisual("Speckle", panelWebView);
|
||||||
|
|
||||||
FocusPalette();
|
FocusPalette();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
using System.IO;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Windows.Media;
|
using System.Windows.Media;
|
||||||
using System.Windows.Media.Imaging;
|
using System.Windows.Media.Imaging;
|
||||||
using Autodesk.Windows;
|
using Autodesk.Windows;
|
||||||
using Speckle.Sdk;
|
using Speckle.Sdk;
|
||||||
|
#if !AUTOCAD2025_OR_GREATER && !CIVIL3D2025_OR_GREATER
|
||||||
|
using System.IO;
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Speckle.Connectors.Autocad.Plugin;
|
namespace Speckle.Connectors.Autocad.Plugin;
|
||||||
|
|
||||||
@@ -46,20 +48,20 @@ public class AutocadRibbon
|
|||||||
|
|
||||||
private void Create()
|
private void Create()
|
||||||
{
|
{
|
||||||
RibbonTab tab = FindOrMakeTab("Add-ins");
|
RibbonTab tab = FindOrMakeTab("Speckle");
|
||||||
RibbonPanelSource source = new() { Title = "Speckle 2 (New Beta)" };
|
RibbonPanelSource source = new() { Title = "Speckle" };
|
||||||
RibbonPanel panel = new() { Source = source };
|
RibbonPanel panel = new() { Source = source };
|
||||||
tab.Panels.Add(panel);
|
tab.Panels.Add(panel);
|
||||||
|
|
||||||
RibbonToolTip speckleToolTip =
|
RibbonToolTip speckleToolTip =
|
||||||
new()
|
new()
|
||||||
{
|
{
|
||||||
Title = "Speckle 2 (New Beta)",
|
Title = "Speckle",
|
||||||
Content = "Speckle Connector for " + AppUtils.App.Name,
|
Content = $"Next Gen Speckle Connector for {AppUtils.App.Name}",
|
||||||
IsHelpEnabled = true // Without this "Press F1 for help" does not appear in the tooltip
|
IsHelpEnabled = true // Without this "Press F1 for help" does not appear in the tooltip
|
||||||
};
|
};
|
||||||
|
|
||||||
_ = CreateSpeckleButton("Connector " + AppUtils.App.Name + " (New)", source, null, speckleToolTip, "logo");
|
_ = CreateSpeckleButton("Speckle", source, null, speckleToolTip, "logo");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ComponentManager_ItemInitialized(object? sender, RibbonItemEventArgs e)
|
private void ComponentManager_ItemInitialized(object? sender, RibbonItemEventArgs e)
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 714 B After Width: | Height: | Size: 302 B |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 430 B |
@@ -9,6 +9,7 @@
|
|||||||
<Import_RootNamespace>Speckle.Connectors.AutocadShared</Import_RootNamespace>
|
<Import_RootNamespace>Speckle.Connectors.AutocadShared</Import_RootNamespace>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)Bindings\AutocadReceiveBaseBinding.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Bindings\AutocadSelectionBinding.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Bindings\AutocadSelectionBinding.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Bindings\AutocadReceiveBinding.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Bindings\AutocadReceiveBinding.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Bindings\AutocadSendBinding.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Bindings\AutocadSendBinding.cs" />
|
||||||
@@ -21,6 +22,7 @@
|
|||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadColorUnpacker.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadColorUnpacker.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadGroupBaker.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadGroupBaker.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadGroupUnpacker.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadGroupUnpacker.cs" />
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadIdleManager.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadInstanceBaker.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadInstanceBaker.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadInstanceUnpacker.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadInstanceUnpacker.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadLayerBaker.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadLayerBaker.cs" />
|
||||||
@@ -29,7 +31,6 @@
|
|||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadContext.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadContext.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadDocumentManager.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadDocumentManager.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadDocumentModelStore.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadDocumentModelStore.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadIdleManager.cs" />
|
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadMaterialUnpacker.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\AutocadMaterialUnpacker.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Extensions\DatabaseExtensions.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Extensions\DatabaseExtensions.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Extensions\DocumentExtensions.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Extensions\DocumentExtensions.cs" />
|
||||||
@@ -37,6 +38,7 @@
|
|||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Extensions\EntityExtensions.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Extensions\EntityExtensions.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Extensions\SpeckleApplicationIdExtensions.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\Extensions\SpeckleApplicationIdExtensions.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)HostApp\TransactionContext.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\TransactionContext.cs" />
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)Operations\Receive\AutocadHostObjectBaseBuilder.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Receive\AutocadHostObjectBuilder.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Operations\Receive\AutocadHostObjectBuilder.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\AutocadRootObject.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\AutocadRootObject.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\AutocadRootObjectBaseBuilder.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\AutocadRootObjectBaseBuilder.cs" />
|
||||||
|
|||||||
@@ -3,6 +3,15 @@
|
|||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<ProjectGuid>{41BC679F-887F-44CF-971D-A5502EE87DB0}</ProjectGuid>
|
<ProjectGuid>{41BC679F-887F-44CF-971D-A5502EE87DB0}</ProjectGuid>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Local|AnyCPU' ">
|
||||||
|
<OutputPath>bin\Local\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props"
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props"
|
||||||
Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')"/>
|
Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')"/>
|
||||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props"/>
|
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props"/>
|
||||||
|
|||||||
@@ -6,12 +6,10 @@
|
|||||||
<Civil3DVersion>2022</Civil3DVersion>
|
<Civil3DVersion>2022</Civil3DVersion>
|
||||||
<DefineConstants>$(DefineConstants);CIVIL3D;CIVIL3D2022;CIVIL3D2022_OR_GREATER</DefineConstants>
|
<DefineConstants>$(DefineConstants);CIVIL3D;CIVIL3D2022;CIVIL3D2022_OR_GREATER</DefineConstants>
|
||||||
<Configurations>Debug;Release;Local</Configurations>
|
<Configurations>Debug;Release;Local</Configurations>
|
||||||
<StartAction>Program</StartAction>
|
|
||||||
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(Civil3DVersion)\acad.exe</StartProgram>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Speckle.AutoCAD.API" />
|
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2022.0.2" ExcludeAssets="runtime"/>
|
||||||
<PackageReference Include="Speckle.Civil3D.API" />
|
<PackageReference Include="Speckle.Civil3D.API" VersionOverride="2022.0.2" ExcludeAssets="runtime"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -173,16 +173,32 @@
|
|||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||||
},
|
},
|
||||||
"Speckle.DoubleNumerics": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.0.1",
|
|
||||||
"contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
|
|
||||||
},
|
|
||||||
"Speckle.Newtonsoft.Json": {
|
"Speckle.Newtonsoft.Json": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "13.0.2",
|
"resolved": "13.0.2",
|
||||||
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
||||||
},
|
},
|
||||||
|
"Speckle.Sdk": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "D04pCdleqLeDxthANCb8+X1xfEYr4+Q3GTuHtqOrMQeGHDAVPc5G3M0D6VYEUYbLYav0NBZ6tNuWO2Y/fqfWSw==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client": "6.0.0",
|
||||||
|
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||||
|
"Microsoft.CSharp": "4.7.0",
|
||||||
|
"Microsoft.Data.Sqlite": "7.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Logging": "2.2.0",
|
||||||
|
"Speckle.DoubleNumerics": "4.1.0",
|
||||||
|
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||||
|
"Speckle.Sdk.Dependencies": "3.11.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Speckle.Sdk.Dependencies": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "u8lJ+ECslmVPsn4yOCg3hAzj3zh6r+gp2oQh8RDGn22NihIPOsMhBFvoBruL1QVhXdJcS4rI2J6VEAbdvL9FRg=="
|
||||||
|
},
|
||||||
"SQLitePCLRaw.bundle_e_sqlite3": {
|
"SQLitePCLRaw.bundle_e_sqlite3": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "2.1.4",
|
"resolved": "2.1.4",
|
||||||
@@ -273,19 +289,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )",
|
"Speckle.Converters.Common": "[1.0.0, )",
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui": {
|
"speckle.connectors.dui": {
|
||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
"Speckle.Connectors.Common": "[1.0.0, )"
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )",
|
|
||||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui.webview": {
|
"speckle.connectors.dui.webview": {
|
||||||
@@ -310,7 +322,7 @@
|
|||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )"
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Microsoft.Extensions.DependencyInjection": {
|
"Microsoft.Extensions.DependencyInjection": {
|
||||||
@@ -346,43 +358,20 @@
|
|||||||
"resolved": "1.0.1938.49",
|
"resolved": "1.0.1938.49",
|
||||||
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
||||||
},
|
},
|
||||||
|
"Speckle.DoubleNumerics": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[4.1.0, )",
|
||||||
|
"resolved": "4.1.0",
|
||||||
|
"contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
|
||||||
|
},
|
||||||
"Speckle.Objects": {
|
"Speckle.Objects": {
|
||||||
"type": "CentralTransitive",
|
"type": "CentralTransitive",
|
||||||
"requested": "[3.1.0-dev.219, )",
|
"requested": "[3.11.1, )",
|
||||||
"resolved": "3.1.0-dev.219",
|
"resolved": "3.11.1",
|
||||||
"contentHash": "2thsMUDkRr7lR0PXZJ8k3KWZLWjz/aBY0KaO2SuXM0lIKyJw1APMJ7lXJ89e6JAjBzEbK8yLHBb0qtfcc4bNRw==",
|
"contentHash": "JUCY3bA6Pa+fa6wZV9uQ9mhLRihvICkF58nIr28Yi94j0th7wSg4l8WeThl3ubKVnHDQE5mdVffVlY1e5ZUkuQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Speckle.Sdk": "3.1.0-dev.219"
|
"Speckle.Sdk": "3.11.1"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"Speckle.Sdk": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "UTgz9UgkMFGqRLmCq1HPo74MngvKbSZOFWaMRzASHrrnsBtzZatBXjoJBlvVoeBCoiea5Jj+BgZg6RvlV2m3sg==",
|
|
||||||
"dependencies": {
|
|
||||||
"GraphQL.Client": "6.0.0",
|
|
||||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.Data.Sqlite": "7.0.5",
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
|
||||||
"Microsoft.Extensions.Logging": "2.2.0",
|
|
||||||
"Speckle.DoubleNumerics": "4.0.1",
|
|
||||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
|
||||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.219"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Speckle.Sdk.Dependencies": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "5hqBd9whAs5cC8S/6YUgKFOivjntAkVutKhz06XD/f3Kj6xScT3hwcUaWBxiwK3Mw7FLtiVuU1uG777pjn0PKQ=="
|
|
||||||
},
|
|
||||||
"System.Threading.Tasks.Dataflow": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[6.0.0, )",
|
|
||||||
"resolved": "6.0.0",
|
|
||||||
"contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,13 +6,11 @@
|
|||||||
<Civil3DVersion>2023</Civil3DVersion>
|
<Civil3DVersion>2023</Civil3DVersion>
|
||||||
<DefineConstants>$(DefineConstants);CIVIL3D;CIVIL3D2023;CIVIL3D2022_OR_GREATER;CIVIL3D2023_OR_GREATER</DefineConstants>
|
<DefineConstants>$(DefineConstants);CIVIL3D;CIVIL3D2023;CIVIL3D2022_OR_GREATER;CIVIL3D2023_OR_GREATER</DefineConstants>
|
||||||
<Configurations>Debug;Release;Local</Configurations>
|
<Configurations>Debug;Release;Local</Configurations>
|
||||||
<StartAction>Program</StartAction>
|
|
||||||
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(Civil3DVersion)\acad.exe</StartProgram>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2023.0.0" />
|
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2023.0.0" ExcludeAssets="runtime"/>
|
||||||
<PackageReference Include="Speckle.Civil3D.API" VersionOverride="2023.0.0" />
|
<PackageReference Include="Speckle.Civil3D.API" VersionOverride="2023.0.0" ExcludeAssets="runtime"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -173,16 +173,32 @@
|
|||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||||
},
|
},
|
||||||
"Speckle.DoubleNumerics": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.0.1",
|
|
||||||
"contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
|
|
||||||
},
|
|
||||||
"Speckle.Newtonsoft.Json": {
|
"Speckle.Newtonsoft.Json": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "13.0.2",
|
"resolved": "13.0.2",
|
||||||
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
||||||
},
|
},
|
||||||
|
"Speckle.Sdk": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "D04pCdleqLeDxthANCb8+X1xfEYr4+Q3GTuHtqOrMQeGHDAVPc5G3M0D6VYEUYbLYav0NBZ6tNuWO2Y/fqfWSw==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client": "6.0.0",
|
||||||
|
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||||
|
"Microsoft.CSharp": "4.7.0",
|
||||||
|
"Microsoft.Data.Sqlite": "7.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Logging": "2.2.0",
|
||||||
|
"Speckle.DoubleNumerics": "4.1.0",
|
||||||
|
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||||
|
"Speckle.Sdk.Dependencies": "3.11.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Speckle.Sdk.Dependencies": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "u8lJ+ECslmVPsn4yOCg3hAzj3zh6r+gp2oQh8RDGn22NihIPOsMhBFvoBruL1QVhXdJcS4rI2J6VEAbdvL9FRg=="
|
||||||
|
},
|
||||||
"SQLitePCLRaw.bundle_e_sqlite3": {
|
"SQLitePCLRaw.bundle_e_sqlite3": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "2.1.4",
|
"resolved": "2.1.4",
|
||||||
@@ -273,19 +289,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )",
|
"Speckle.Converters.Common": "[1.0.0, )",
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui": {
|
"speckle.connectors.dui": {
|
||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
"Speckle.Connectors.Common": "[1.0.0, )"
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )",
|
|
||||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui.webview": {
|
"speckle.connectors.dui.webview": {
|
||||||
@@ -310,7 +322,7 @@
|
|||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )"
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Microsoft.Extensions.DependencyInjection": {
|
"Microsoft.Extensions.DependencyInjection": {
|
||||||
@@ -346,43 +358,20 @@
|
|||||||
"resolved": "1.0.1938.49",
|
"resolved": "1.0.1938.49",
|
||||||
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
||||||
},
|
},
|
||||||
|
"Speckle.DoubleNumerics": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[4.1.0, )",
|
||||||
|
"resolved": "4.1.0",
|
||||||
|
"contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
|
||||||
|
},
|
||||||
"Speckle.Objects": {
|
"Speckle.Objects": {
|
||||||
"type": "CentralTransitive",
|
"type": "CentralTransitive",
|
||||||
"requested": "[3.1.0-dev.219, )",
|
"requested": "[3.11.1, )",
|
||||||
"resolved": "3.1.0-dev.219",
|
"resolved": "3.11.1",
|
||||||
"contentHash": "2thsMUDkRr7lR0PXZJ8k3KWZLWjz/aBY0KaO2SuXM0lIKyJw1APMJ7lXJ89e6JAjBzEbK8yLHBb0qtfcc4bNRw==",
|
"contentHash": "JUCY3bA6Pa+fa6wZV9uQ9mhLRihvICkF58nIr28Yi94j0th7wSg4l8WeThl3ubKVnHDQE5mdVffVlY1e5ZUkuQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Speckle.Sdk": "3.1.0-dev.219"
|
"Speckle.Sdk": "3.11.1"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"Speckle.Sdk": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "UTgz9UgkMFGqRLmCq1HPo74MngvKbSZOFWaMRzASHrrnsBtzZatBXjoJBlvVoeBCoiea5Jj+BgZg6RvlV2m3sg==",
|
|
||||||
"dependencies": {
|
|
||||||
"GraphQL.Client": "6.0.0",
|
|
||||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.Data.Sqlite": "7.0.5",
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
|
||||||
"Microsoft.Extensions.Logging": "2.2.0",
|
|
||||||
"Speckle.DoubleNumerics": "4.0.1",
|
|
||||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
|
||||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.219"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Speckle.Sdk.Dependencies": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "5hqBd9whAs5cC8S/6YUgKFOivjntAkVutKhz06XD/f3Kj6xScT3hwcUaWBxiwK3Mw7FLtiVuU1uG777pjn0PKQ=="
|
|
||||||
},
|
|
||||||
"System.Threading.Tasks.Dataflow": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[6.0.0, )",
|
|
||||||
"resolved": "6.0.0",
|
|
||||||
"contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,13 +6,11 @@
|
|||||||
<Civil3DVersion>2024</Civil3DVersion>
|
<Civil3DVersion>2024</Civil3DVersion>
|
||||||
<DefineConstants>$(DefineConstants);CIVIL3D;CIVIL3D2024;CIVIL3D2022_OR_GREATER;CIVIL3D2023_OR_GREATER;CIVIL3D2024_OR_GREATER</DefineConstants>
|
<DefineConstants>$(DefineConstants);CIVIL3D;CIVIL3D2024;CIVIL3D2022_OR_GREATER;CIVIL3D2023_OR_GREATER;CIVIL3D2024_OR_GREATER</DefineConstants>
|
||||||
<Configurations>Debug;Release;Local</Configurations>
|
<Configurations>Debug;Release;Local</Configurations>
|
||||||
<StartAction>Program</StartAction>
|
|
||||||
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(Civil3DVersion)\acad.exe</StartProgram>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2024.0.0" />
|
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2024.0.0" ExcludeAssets="runtime"/>
|
||||||
<PackageReference Include="Speckle.Civil3D.API" VersionOverride="2024.0.0" />
|
<PackageReference Include="Speckle.Civil3D.API" VersionOverride="2024.0.0" ExcludeAssets="runtime"/>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -173,16 +173,32 @@
|
|||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||||
},
|
},
|
||||||
"Speckle.DoubleNumerics": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.0.1",
|
|
||||||
"contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
|
|
||||||
},
|
|
||||||
"Speckle.Newtonsoft.Json": {
|
"Speckle.Newtonsoft.Json": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "13.0.2",
|
"resolved": "13.0.2",
|
||||||
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
||||||
},
|
},
|
||||||
|
"Speckle.Sdk": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "D04pCdleqLeDxthANCb8+X1xfEYr4+Q3GTuHtqOrMQeGHDAVPc5G3M0D6VYEUYbLYav0NBZ6tNuWO2Y/fqfWSw==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client": "6.0.0",
|
||||||
|
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
||||||
|
"Microsoft.CSharp": "4.7.0",
|
||||||
|
"Microsoft.Data.Sqlite": "7.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Logging": "2.2.0",
|
||||||
|
"Speckle.DoubleNumerics": "4.1.0",
|
||||||
|
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||||
|
"Speckle.Sdk.Dependencies": "3.11.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Speckle.Sdk.Dependencies": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "u8lJ+ECslmVPsn4yOCg3hAzj3zh6r+gp2oQh8RDGn22NihIPOsMhBFvoBruL1QVhXdJcS4rI2J6VEAbdvL9FRg=="
|
||||||
|
},
|
||||||
"SQLitePCLRaw.bundle_e_sqlite3": {
|
"SQLitePCLRaw.bundle_e_sqlite3": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "2.1.4",
|
"resolved": "2.1.4",
|
||||||
@@ -273,19 +289,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )",
|
"Speckle.Converters.Common": "[1.0.0, )",
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui": {
|
"speckle.connectors.dui": {
|
||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
"Speckle.Connectors.Common": "[1.0.0, )"
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )",
|
|
||||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui.webview": {
|
"speckle.connectors.dui.webview": {
|
||||||
@@ -310,7 +322,7 @@
|
|||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )"
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Microsoft.Extensions.DependencyInjection": {
|
"Microsoft.Extensions.DependencyInjection": {
|
||||||
@@ -346,43 +358,20 @@
|
|||||||
"resolved": "1.0.1938.49",
|
"resolved": "1.0.1938.49",
|
||||||
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
||||||
},
|
},
|
||||||
|
"Speckle.DoubleNumerics": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[4.1.0, )",
|
||||||
|
"resolved": "4.1.0",
|
||||||
|
"contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
|
||||||
|
},
|
||||||
"Speckle.Objects": {
|
"Speckle.Objects": {
|
||||||
"type": "CentralTransitive",
|
"type": "CentralTransitive",
|
||||||
"requested": "[3.1.0-dev.219, )",
|
"requested": "[3.11.1, )",
|
||||||
"resolved": "3.1.0-dev.219",
|
"resolved": "3.11.1",
|
||||||
"contentHash": "2thsMUDkRr7lR0PXZJ8k3KWZLWjz/aBY0KaO2SuXM0lIKyJw1APMJ7lXJ89e6JAjBzEbK8yLHBb0qtfcc4bNRw==",
|
"contentHash": "JUCY3bA6Pa+fa6wZV9uQ9mhLRihvICkF58nIr28Yi94j0th7wSg4l8WeThl3ubKVnHDQE5mdVffVlY1e5ZUkuQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Speckle.Sdk": "3.1.0-dev.219"
|
"Speckle.Sdk": "3.11.1"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"Speckle.Sdk": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "UTgz9UgkMFGqRLmCq1HPo74MngvKbSZOFWaMRzASHrrnsBtzZatBXjoJBlvVoeBCoiea5Jj+BgZg6RvlV2m3sg==",
|
|
||||||
"dependencies": {
|
|
||||||
"GraphQL.Client": "6.0.0",
|
|
||||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.Data.Sqlite": "7.0.5",
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
|
||||||
"Microsoft.Extensions.Logging": "2.2.0",
|
|
||||||
"Speckle.DoubleNumerics": "4.0.1",
|
|
||||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
|
||||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.219"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Speckle.Sdk.Dependencies": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "5hqBd9whAs5cC8S/6YUgKFOivjntAkVutKhz06XD/f3Kj6xScT3hwcUaWBxiwK3Mw7FLtiVuU1uG777pjn0PKQ=="
|
|
||||||
},
|
|
||||||
"System.Threading.Tasks.Dataflow": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[6.0.0, )",
|
|
||||||
"resolved": "6.0.0",
|
|
||||||
"contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0-windows</TargetFramework>
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
|
||||||
<UseWpf>true</UseWpf>
|
|
||||||
<Civil3DVersion>2025</Civil3DVersion>
|
<Civil3DVersion>2025</Civil3DVersion>
|
||||||
<DefineConstants>$(DefineConstants);CIVIL3D2025;CIVIL3D;CIVIL3D2022_OR_GREATER;CIVIL3D2023_OR_GREATER;CIVIL3D2024_OR_GREATER;CIVIL3D2025_OR_GREATER</DefineConstants>
|
<DefineConstants>$(DefineConstants);CIVIL3D2025;CIVIL3D;CIVIL3D2022_OR_GREATER;CIVIL3D2023_OR_GREATER;CIVIL3D2024_OR_GREATER;CIVIL3D2025_OR_GREATER</DefineConstants>
|
||||||
<Configurations>Debug;Release;Local</Configurations>
|
<Configurations>Debug;Release;Local</Configurations>
|
||||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
</PropertyGroup>
|
||||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
|
|
||||||
<StartAction>Program</StartAction>
|
<PropertyGroup>
|
||||||
<StartProgram>$(ProgramW6432)\Autodesk\AutoCAD $(Civil3DVersion)\acad.exe</StartProgram>
|
<!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
|
||||||
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!--This is needed for managed dependencies-->
|
||||||
|
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!--This is needed for the rest-->
|
||||||
|
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath> <!--This is needed just to keep folder paths the same as the netframework versions of autocad/civil-->
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2025.0.0" />
|
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2025.0.0" ExcludeAssets="runtime"/>
|
||||||
<PackageReference Include="Speckle.Civil3d.API" VersionOverride="2025.0.0" />
|
<PackageReference Include="Speckle.Civil3d.API" VersionOverride="2025.0.0" ExcludeAssets="runtime"/>
|
||||||
<FrameworkReference Include="Microsoft.WindowsDesktop.App" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -84,11 +84,6 @@
|
|||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
|
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
|
||||||
},
|
},
|
||||||
"Microsoft.CSharp": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.7.0",
|
|
||||||
"contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA=="
|
|
||||||
},
|
|
||||||
"Microsoft.Data.Sqlite": {
|
"Microsoft.Data.Sqlite": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "7.0.5",
|
"resolved": "7.0.5",
|
||||||
@@ -164,16 +159,30 @@
|
|||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||||
},
|
},
|
||||||
"Speckle.DoubleNumerics": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.0.1",
|
|
||||||
"contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
|
|
||||||
},
|
|
||||||
"Speckle.Newtonsoft.Json": {
|
"Speckle.Newtonsoft.Json": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "13.0.2",
|
"resolved": "13.0.2",
|
||||||
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
||||||
},
|
},
|
||||||
|
"Speckle.Sdk": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "D04pCdleqLeDxthANCb8+X1xfEYr4+Q3GTuHtqOrMQeGHDAVPc5G3M0D6VYEUYbLYav0NBZ6tNuWO2Y/fqfWSw==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client": "6.0.0",
|
||||||
|
"Microsoft.Data.Sqlite": "7.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Logging": "2.2.0",
|
||||||
|
"Speckle.DoubleNumerics": "4.1.0",
|
||||||
|
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||||
|
"Speckle.Sdk.Dependencies": "3.11.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Speckle.Sdk.Dependencies": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "u8lJ+ECslmVPsn4yOCg3hAzj3zh6r+gp2oQh8RDGn22NihIPOsMhBFvoBruL1QVhXdJcS4rI2J6VEAbdvL9FRg=="
|
||||||
|
},
|
||||||
"SQLitePCLRaw.bundle_e_sqlite3": {
|
"SQLitePCLRaw.bundle_e_sqlite3": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "2.1.4",
|
"resolved": "2.1.4",
|
||||||
@@ -229,19 +238,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )",
|
"Speckle.Converters.Common": "[1.0.0, )",
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui": {
|
"speckle.connectors.dui": {
|
||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
"Speckle.Connectors.Common": "[1.0.0, )"
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )",
|
|
||||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui.webview": {
|
"speckle.connectors.dui.webview": {
|
||||||
@@ -267,7 +272,7 @@
|
|||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )"
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Microsoft.Extensions.DependencyInjection": {
|
"Microsoft.Extensions.DependencyInjection": {
|
||||||
@@ -303,42 +308,20 @@
|
|||||||
"resolved": "1.0.1938.49",
|
"resolved": "1.0.1938.49",
|
||||||
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
||||||
},
|
},
|
||||||
|
"Speckle.DoubleNumerics": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[4.1.0, )",
|
||||||
|
"resolved": "4.1.0",
|
||||||
|
"contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
|
||||||
|
},
|
||||||
"Speckle.Objects": {
|
"Speckle.Objects": {
|
||||||
"type": "CentralTransitive",
|
"type": "CentralTransitive",
|
||||||
"requested": "[3.1.0-dev.219, )",
|
"requested": "[3.11.1, )",
|
||||||
"resolved": "3.1.0-dev.219",
|
"resolved": "3.11.1",
|
||||||
"contentHash": "2thsMUDkRr7lR0PXZJ8k3KWZLWjz/aBY0KaO2SuXM0lIKyJw1APMJ7lXJ89e6JAjBzEbK8yLHBb0qtfcc4bNRw==",
|
"contentHash": "JUCY3bA6Pa+fa6wZV9uQ9mhLRihvICkF58nIr28Yi94j0th7wSg4l8WeThl3ubKVnHDQE5mdVffVlY1e5ZUkuQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Speckle.Sdk": "3.1.0-dev.219"
|
"Speckle.Sdk": "3.11.1"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"Speckle.Sdk": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "UTgz9UgkMFGqRLmCq1HPo74MngvKbSZOFWaMRzASHrrnsBtzZatBXjoJBlvVoeBCoiea5Jj+BgZg6RvlV2m3sg==",
|
|
||||||
"dependencies": {
|
|
||||||
"GraphQL.Client": "6.0.0",
|
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.Data.Sqlite": "7.0.5",
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
|
||||||
"Microsoft.Extensions.Logging": "2.2.0",
|
|
||||||
"Speckle.DoubleNumerics": "4.0.1",
|
|
||||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
|
||||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.219"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Speckle.Sdk.Dependencies": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "5hqBd9whAs5cC8S/6YUgKFOivjntAkVutKhz06XD/f3Kj6xScT3hwcUaWBxiwK3Mw7FLtiVuU1uG777pjn0PKQ=="
|
|
||||||
},
|
|
||||||
"System.Threading.Tasks.Dataflow": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[6.0.0, )",
|
|
||||||
"resolved": "6.0.0",
|
|
||||||
"contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"net8.0-windows7.0/win-x64": {
|
"net8.0-windows7.0/win-x64": {
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
|
<Civil3DVersion>2026</Civil3DVersion>
|
||||||
|
<DefineConstants>$(DefineConstants);CIVIL3D2026;CIVIL3D;CIVIL3D2022_OR_GREATER;CIVIL3D2023_OR_GREATER;CIVIL3D2024_OR_GREATER;CIVIL3D2025_OR_GREATER;CIVIL3D2026_OR_GREATER</DefineConstants>
|
||||||
|
<Configurations>Debug;Release;Local</Configurations>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<!-- .NET Core uses this to move native dependencies into a root for runtime selection and usage for non-windows development https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#enablewindowstargeting -->
|
||||||
|
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <!--This is needed for managed dependencies-->
|
||||||
|
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!--This is needed for the rest-->
|
||||||
|
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath> <!--This is needed just to keep folder paths the same as the netframework versions of autocad/civil-->
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Speckle.AutoCAD.API" VersionOverride="2026.0.0" ExcludeAssets="runtime"/>
|
||||||
|
<PackageReference Include="Speckle.Civil3d.API" VersionOverride="2026.0.0" ExcludeAssets="runtime"/>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\Converters\Civil3d\Speckle.Converters.Civil3d2026\Speckle.Converters.Civil3d2026.csproj" />
|
||||||
|
<ProjectReference Include="..\..\..\DUI3\Speckle.Connectors.DUI.WebView\Speckle.Connectors.DUI.WebView.csproj" />
|
||||||
|
<ProjectReference Include="..\..\..\Sdk\Speckle.Converters.Common\Speckle.Converters.Common.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<Import Project="..\Speckle.Connectors.Civil3dShared\Speckle.Connectors.Civil3dShared.projitems" Label="Shared" />
|
||||||
|
|
||||||
|
<Import Project="..\Speckle.Connectors.AutocadShared\Speckle.Connectors.AutocadShared.projitems" Label="Shared" />
|
||||||
|
</Project>
|
||||||
@@ -1,19 +1,7 @@
|
|||||||
{
|
{
|
||||||
"version": 2,
|
"version": 2,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"net6.0-windows7.0": {
|
"net8.0-windows7.0": {
|
||||||
"Esri.ArcGISPro.Extensions30": {
|
|
||||||
"type": "Direct",
|
|
||||||
"requested": "[3.2.0.49743, )",
|
|
||||||
"resolved": "3.2.0.49743",
|
|
||||||
"contentHash": "fmnYm+mD14Cz0Uqh1ij37SfLJerkyFHK5581y5tXT/l3H2ZvUmVuuxjYquXzyzj9p7IexQzMW4xCpxe+mD922g=="
|
|
||||||
},
|
|
||||||
"Microsoft.Extensions.Logging.Abstractions": {
|
|
||||||
"type": "Direct",
|
|
||||||
"requested": "[2.2.0, )",
|
|
||||||
"resolved": "2.2.0",
|
|
||||||
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
|
|
||||||
},
|
|
||||||
"Microsoft.NETFramework.ReferenceAssemblies": {
|
"Microsoft.NETFramework.ReferenceAssemblies": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[1.0.3, )",
|
"requested": "[1.0.3, )",
|
||||||
@@ -39,6 +27,21 @@
|
|||||||
"resolved": "1.14.1",
|
"resolved": "1.14.1",
|
||||||
"contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ=="
|
"contentHash": "mOOmFYwad3MIOL14VCjj02LljyF1GNw1wP0YVlxtcPvqdxjGGMNdNJJxHptlry3MOd8b40Flm8RPOM8JOlN2sQ=="
|
||||||
},
|
},
|
||||||
|
"Speckle.AutoCAD.API": {
|
||||||
|
"type": "Direct",
|
||||||
|
"requested": "[2026.0.0, )",
|
||||||
|
"resolved": "2026.0.0",
|
||||||
|
"contentHash": "WlkV81PmbK/ftoM7aGpU6LGosKbePBQej9MO/m63rFMozX89tsitEhE12o58wu7K/4FmRUdAMolYtdK20EDBnw=="
|
||||||
|
},
|
||||||
|
"Speckle.Civil3D.API": {
|
||||||
|
"type": "Direct",
|
||||||
|
"requested": "[2026.0.0, )",
|
||||||
|
"resolved": "2026.0.0",
|
||||||
|
"contentHash": "JcQvKvA3KC+9hzJiWlaZ3REtvqJV+AFHPIU5J6Xp7JHlNyhnaalN37WXpWIKhNAUwL9ppUBOXMZpQupbFytUwg==",
|
||||||
|
"dependencies": {
|
||||||
|
"Speckle.AutoCAD.API": "2026.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"Speckle.InterfaceGenerator": {
|
"Speckle.InterfaceGenerator": {
|
||||||
"type": "Direct",
|
"type": "Direct",
|
||||||
"requested": "[0.9.6, )",
|
"requested": "[0.9.6, )",
|
||||||
@@ -76,21 +79,11 @@
|
|||||||
"resolved": "6.0.0",
|
"resolved": "6.0.0",
|
||||||
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
|
"contentHash": "yg72rrYDapfsIUrul7aF6wwNnTJBOFvuA9VdDTQpPa8AlAriHbufeXYLBcodKjfUdkCnaiggX1U/nEP08Zb5GA=="
|
||||||
},
|
},
|
||||||
"Microsoft.Bcl.AsyncInterfaces": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "5.0.0",
|
|
||||||
"contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ=="
|
|
||||||
},
|
|
||||||
"Microsoft.Build.Tasks.Git": {
|
"Microsoft.Build.Tasks.Git": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
|
"contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
|
||||||
},
|
},
|
||||||
"Microsoft.CSharp": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.7.0",
|
|
||||||
"contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA=="
|
|
||||||
},
|
|
||||||
"Microsoft.Data.Sqlite": {
|
"Microsoft.Data.Sqlite": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "7.0.5",
|
"resolved": "7.0.5",
|
||||||
@@ -166,16 +159,30 @@
|
|||||||
"resolved": "8.0.0",
|
"resolved": "8.0.0",
|
||||||
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
"contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
|
||||||
},
|
},
|
||||||
"Speckle.DoubleNumerics": {
|
|
||||||
"type": "Transitive",
|
|
||||||
"resolved": "4.0.1",
|
|
||||||
"contentHash": "MzEQ1Im0zTja+tEsdRIk/WlPiKqb22NmTOJcR1ZKm/mz46pezyyID3/wRz6vJUELMpSLnG7LhsxBL+nxbr7V0w=="
|
|
||||||
},
|
|
||||||
"Speckle.Newtonsoft.Json": {
|
"Speckle.Newtonsoft.Json": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "13.0.2",
|
"resolved": "13.0.2",
|
||||||
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
"contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA=="
|
||||||
},
|
},
|
||||||
|
"Speckle.Sdk": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "D04pCdleqLeDxthANCb8+X1xfEYr4+Q3GTuHtqOrMQeGHDAVPc5G3M0D6VYEUYbLYav0NBZ6tNuWO2Y/fqfWSw==",
|
||||||
|
"dependencies": {
|
||||||
|
"GraphQL.Client": "6.0.0",
|
||||||
|
"Microsoft.Data.Sqlite": "7.0.5",
|
||||||
|
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
||||||
|
"Microsoft.Extensions.Logging": "2.2.0",
|
||||||
|
"Speckle.DoubleNumerics": "4.1.0",
|
||||||
|
"Speckle.Newtonsoft.Json": "13.0.2",
|
||||||
|
"Speckle.Sdk.Dependencies": "3.11.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Speckle.Sdk.Dependencies": {
|
||||||
|
"type": "Transitive",
|
||||||
|
"resolved": "3.11.1",
|
||||||
|
"contentHash": "u8lJ+ECslmVPsn4yOCg3hAzj3zh6r+gp2oQh8RDGn22NihIPOsMhBFvoBruL1QVhXdJcS4rI2J6VEAbdvL9FRg=="
|
||||||
|
},
|
||||||
"SQLitePCLRaw.bundle_e_sqlite3": {
|
"SQLitePCLRaw.bundle_e_sqlite3": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "2.1.4",
|
"resolved": "2.1.4",
|
||||||
@@ -231,19 +238,15 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
"Microsoft.Extensions.DependencyInjection": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Logging": "[1.0.0, )",
|
"Speckle.Connectors.Logging": "[1.0.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )",
|
"Speckle.Converters.Common": "[1.0.0, )",
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui": {
|
"speckle.connectors.dui": {
|
||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Connectors.Common": "[1.0.0, )",
|
"Speckle.Connectors.Common": "[1.0.0, )"
|
||||||
"Speckle.Sdk": "[3.1.0-dev.219, )",
|
|
||||||
"Speckle.Sdk.Dependencies": "[3.1.0-dev.219, )",
|
|
||||||
"System.Threading.Tasks.Dataflow": "[6.0.0, )"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"speckle.connectors.dui.webview": {
|
"speckle.connectors.dui.webview": {
|
||||||
@@ -256,10 +259,12 @@
|
|||||||
"speckle.connectors.logging": {
|
"speckle.connectors.logging": {
|
||||||
"type": "Project"
|
"type": "Project"
|
||||||
},
|
},
|
||||||
"speckle.converters.arcgis3": {
|
"speckle.converters.civil3d2026": {
|
||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Esri.ArcGISPro.Extensions30": "[3.2.0.49743, )",
|
"Speckle.AutoCAD.API": "[2026.0.0, )",
|
||||||
|
"Speckle.Civil3d.API": "[2026.0.0, )",
|
||||||
|
"Speckle.Connectors.DUI.WebView": "[1.0.0, )",
|
||||||
"Speckle.Converters.Common": "[1.0.0, )"
|
"Speckle.Converters.Common": "[1.0.0, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -267,7 +272,7 @@
|
|||||||
"type": "Project",
|
"type": "Project",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
"Microsoft.Extensions.Logging.Abstractions": "[2.2.0, )",
|
||||||
"Speckle.Objects": "[3.1.0-dev.219, )"
|
"Speckle.Objects": "[3.11.1, )"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Microsoft.Extensions.DependencyInjection": {
|
"Microsoft.Extensions.DependencyInjection": {
|
||||||
@@ -291,52 +296,35 @@
|
|||||||
"Microsoft.Extensions.Options": "2.2.0"
|
"Microsoft.Extensions.Options": "2.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Microsoft.Extensions.Logging.Abstractions": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[2.2.0, )",
|
||||||
|
"resolved": "2.2.0",
|
||||||
|
"contentHash": "B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A=="
|
||||||
|
},
|
||||||
"Microsoft.Web.WebView2": {
|
"Microsoft.Web.WebView2": {
|
||||||
"type": "CentralTransitive",
|
"type": "CentralTransitive",
|
||||||
"requested": "[1.0.1938.49, )",
|
"requested": "[1.0.1938.49, )",
|
||||||
"resolved": "1.0.1938.49",
|
"resolved": "1.0.1938.49",
|
||||||
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
"contentHash": "z8KnFnaTYzhA/ZnyRX0qGfS1NU5ZBJeClAH64F0fVDvdDJTvME7xl6zTJ0Jlfe1BtL3C0NH9xTy64shg2baKdw=="
|
||||||
},
|
},
|
||||||
|
"Speckle.DoubleNumerics": {
|
||||||
|
"type": "CentralTransitive",
|
||||||
|
"requested": "[4.1.0, )",
|
||||||
|
"resolved": "4.1.0",
|
||||||
|
"contentHash": "20DtS+FsDRsOD9+AU3TwNFZ0qrKo5f6f7B5ZR9wStsIHHHC9k7DpjbCvuNtmnSjx54MD+TJC7wV2f5iyGVPj1A=="
|
||||||
|
},
|
||||||
"Speckle.Objects": {
|
"Speckle.Objects": {
|
||||||
"type": "CentralTransitive",
|
"type": "CentralTransitive",
|
||||||
"requested": "[3.1.0-dev.219, )",
|
"requested": "[3.11.1, )",
|
||||||
"resolved": "3.1.0-dev.219",
|
"resolved": "3.11.1",
|
||||||
"contentHash": "2thsMUDkRr7lR0PXZJ8k3KWZLWjz/aBY0KaO2SuXM0lIKyJw1APMJ7lXJ89e6JAjBzEbK8yLHBb0qtfcc4bNRw==",
|
"contentHash": "JUCY3bA6Pa+fa6wZV9uQ9mhLRihvICkF58nIr28Yi94j0th7wSg4l8WeThl3ubKVnHDQE5mdVffVlY1e5ZUkuQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Speckle.Sdk": "3.1.0-dev.219"
|
"Speckle.Sdk": "3.11.1"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"Speckle.Sdk": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "UTgz9UgkMFGqRLmCq1HPo74MngvKbSZOFWaMRzASHrrnsBtzZatBXjoJBlvVoeBCoiea5Jj+BgZg6RvlV2m3sg==",
|
|
||||||
"dependencies": {
|
|
||||||
"GraphQL.Client": "6.0.0",
|
|
||||||
"Microsoft.Bcl.AsyncInterfaces": "5.0.0",
|
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.Data.Sqlite": "7.0.5",
|
|
||||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
|
|
||||||
"Microsoft.Extensions.Logging": "2.2.0",
|
|
||||||
"Speckle.DoubleNumerics": "4.0.1",
|
|
||||||
"Speckle.Newtonsoft.Json": "13.0.2",
|
|
||||||
"Speckle.Sdk.Dependencies": "3.1.0-dev.219"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Speckle.Sdk.Dependencies": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[3.1.0-dev.219, )",
|
|
||||||
"resolved": "3.1.0-dev.219",
|
|
||||||
"contentHash": "5hqBd9whAs5cC8S/6YUgKFOivjntAkVutKhz06XD/f3Kj6xScT3hwcUaWBxiwK3Mw7FLtiVuU1uG777pjn0PKQ=="
|
|
||||||
},
|
|
||||||
"System.Threading.Tasks.Dataflow": {
|
|
||||||
"type": "CentralTransitive",
|
|
||||||
"requested": "[6.0.0, )",
|
|
||||||
"resolved": "6.0.0",
|
|
||||||
"contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"net6.0-windows7.0/win-x64": {
|
"net8.0-windows7.0/win-x64": {
|
||||||
"SQLitePCLRaw.lib.e_sqlite3": {
|
"SQLitePCLRaw.lib.e_sqlite3": {
|
||||||
"type": "Transitive",
|
"type": "Transitive",
|
||||||
"resolved": "2.1.4",
|
"resolved": "2.1.4",
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Speckle.Connectors.Autocad.Bindings;
|
||||||
|
using Speckle.Connectors.Common.Cancellation;
|
||||||
|
using Speckle.Connectors.Common.Threading;
|
||||||
|
using Speckle.Connectors.DUI.Bindings;
|
||||||
|
using Speckle.Connectors.DUI.Bridge;
|
||||||
|
using Speckle.Connectors.DUI.Models.Card;
|
||||||
|
using Speckle.Converters.Autocad;
|
||||||
|
using Speckle.Converters.Civil3dShared;
|
||||||
|
using Speckle.Converters.Common;
|
||||||
|
|
||||||
|
namespace Speckle.Connectors.Civil3dShared.Bindings;
|
||||||
|
|
||||||
|
public sealed class Civil3dReceiveBinding : AutocadReceiveBaseBinding
|
||||||
|
{
|
||||||
|
private readonly ICivil3dConversionSettingsFactory _civil3dConversionSettingsFactory;
|
||||||
|
private readonly IAutocadConversionSettingsFactory _autocadConversionSettingsFactory;
|
||||||
|
|
||||||
|
public Civil3dReceiveBinding(
|
||||||
|
IBrowserBridge parent,
|
||||||
|
ICancellationManager cancellationManager,
|
||||||
|
ICivil3dConversionSettingsFactory civil3dConversionSettingsFactory,
|
||||||
|
IAutocadConversionSettingsFactory autocadConversionSettingsFactory,
|
||||||
|
IThreadContext threadContext,
|
||||||
|
IReceiveOperationManagerFactory receiveOperationManagerFactory
|
||||||
|
)
|
||||||
|
: base(parent, cancellationManager, threadContext, receiveOperationManagerFactory)
|
||||||
|
{
|
||||||
|
_civil3dConversionSettingsFactory = civil3dConversionSettingsFactory;
|
||||||
|
_autocadConversionSettingsFactory = autocadConversionSettingsFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
// POC: we're registering the conversion settings for autocad here because we need the autocad conversion settings to be able to use the autocad typed converters.
|
||||||
|
// POC: We need a separate receive binding for civil3d due to using a different unit converter (needed for conversion settings construction)
|
||||||
|
protected override void InitializeSettings(IServiceProvider serviceProvider, ModelCard mc)
|
||||||
|
{
|
||||||
|
serviceProvider
|
||||||
|
.GetRequiredService<IConverterSettingsStore<Civil3dConversionSettings>>()
|
||||||
|
.Initialize(_civil3dConversionSettingsFactory.Create(Application.DocumentManager.CurrentDocument));
|
||||||
|
|
||||||
|
serviceProvider
|
||||||
|
.GetRequiredService<IConverterSettingsStore<AutocadConversionSettings>>()
|
||||||
|
.Initialize(_autocadConversionSettingsFactory.Create(Application.DocumentManager.CurrentDocument));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
using Speckle.Connectors.Autocad.Bindings;
|
using Speckle.Connectors.Autocad.Bindings;
|
||||||
using Speckle.Connectors.Autocad.HostApp;
|
|
||||||
using Speckle.Connectors.Common.Caching;
|
using Speckle.Connectors.Common.Caching;
|
||||||
using Speckle.Connectors.Common.Cancellation;
|
using Speckle.Connectors.Common.Cancellation;
|
||||||
|
using Speckle.Connectors.Common.Threading;
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
using Speckle.Connectors.DUI.Bindings;
|
||||||
using Speckle.Connectors.DUI.Bridge;
|
using Speckle.Connectors.DUI.Bridge;
|
||||||
using Speckle.Connectors.DUI.Models;
|
using Speckle.Connectors.DUI.Models;
|
||||||
@@ -11,7 +10,6 @@ using Speckle.Connectors.DUI.Models.Card.SendFilter;
|
|||||||
using Speckle.Converters.Autocad;
|
using Speckle.Converters.Autocad;
|
||||||
using Speckle.Converters.Civil3dShared;
|
using Speckle.Converters.Civil3dShared;
|
||||||
using Speckle.Converters.Common;
|
using Speckle.Converters.Common;
|
||||||
using Speckle.Sdk;
|
|
||||||
|
|
||||||
namespace Speckle.Connectors.Civil3dShared.Bindings;
|
namespace Speckle.Connectors.Civil3dShared.Bindings;
|
||||||
|
|
||||||
@@ -22,29 +20,27 @@ public sealed class Civil3dSendBinding : AutocadSendBaseBinding
|
|||||||
|
|
||||||
public Civil3dSendBinding(
|
public Civil3dSendBinding(
|
||||||
DocumentModelStore store,
|
DocumentModelStore store,
|
||||||
IAutocadIdleManager idleManager,
|
|
||||||
IBrowserBridge parent,
|
IBrowserBridge parent,
|
||||||
IEnumerable<ISendFilter> sendFilters,
|
IEnumerable<ISendFilter> sendFilters,
|
||||||
CancellationManager cancellationManager,
|
ICancellationManager cancellationManager,
|
||||||
IServiceProvider serviceProvider,
|
|
||||||
ISendConversionCache sendConversionCache,
|
ISendConversionCache sendConversionCache,
|
||||||
IOperationProgressManager operationProgressManager,
|
|
||||||
ILogger<AutocadSendBinding> logger,
|
|
||||||
ICivil3dConversionSettingsFactory civil3dConversionSettingsFactory,
|
ICivil3dConversionSettingsFactory civil3dConversionSettingsFactory,
|
||||||
IAutocadConversionSettingsFactory autocadConversionSettingsFactory,
|
IAutocadConversionSettingsFactory autocadConversionSettingsFactory,
|
||||||
ISpeckleApplication speckleApplication
|
IThreadContext threadContext,
|
||||||
|
ITopLevelExceptionHandler topLevelExceptionHandler,
|
||||||
|
IAppIdleManager appIdleManager,
|
||||||
|
ISendOperationManagerFactory sendOperationManagerFactory
|
||||||
)
|
)
|
||||||
: base(
|
: base(
|
||||||
store,
|
store,
|
||||||
idleManager,
|
|
||||||
parent,
|
parent,
|
||||||
sendFilters,
|
sendFilters,
|
||||||
cancellationManager,
|
cancellationManager,
|
||||||
serviceProvider,
|
|
||||||
sendConversionCache,
|
sendConversionCache,
|
||||||
operationProgressManager,
|
threadContext,
|
||||||
logger,
|
topLevelExceptionHandler,
|
||||||
speckleApplication
|
appIdleManager,
|
||||||
|
sendOperationManagerFactory
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_civil3dConversionSettingsFactory = civil3dConversionSettingsFactory;
|
_civil3dConversionSettingsFactory = civil3dConversionSettingsFactory;
|
||||||
|
|||||||
@@ -3,10 +3,11 @@ using Microsoft.Extensions.DependencyInjection;
|
|||||||
using Speckle.Connectors.Autocad.DependencyInjection;
|
using Speckle.Connectors.Autocad.DependencyInjection;
|
||||||
using Speckle.Connectors.Autocad.Operations.Send;
|
using Speckle.Connectors.Autocad.Operations.Send;
|
||||||
using Speckle.Connectors.Civil3dShared.Bindings;
|
using Speckle.Connectors.Civil3dShared.Bindings;
|
||||||
|
using Speckle.Connectors.Civil3dShared.HostApp;
|
||||||
|
using Speckle.Connectors.Civil3dShared.Operations.Receive;
|
||||||
using Speckle.Connectors.Civil3dShared.Operations.Send;
|
using Speckle.Connectors.Civil3dShared.Operations.Send;
|
||||||
using Speckle.Connectors.Common.Builders;
|
using Speckle.Connectors.Common.Builders;
|
||||||
using Speckle.Connectors.DUI.Bindings;
|
using Speckle.Connectors.DUI.Bindings;
|
||||||
using Speckle.Converters.Civil3dShared.Helpers;
|
|
||||||
using Speckle.Converters.Civil3dShared.ToSpeckle;
|
using Speckle.Converters.Civil3dShared.ToSpeckle;
|
||||||
using Speckle.Sdk;
|
using Speckle.Sdk;
|
||||||
|
|
||||||
@@ -17,18 +18,22 @@ public static class Civil3dConnectorModule
|
|||||||
public static void AddCivil3d(this IServiceCollection serviceCollection)
|
public static void AddCivil3d(this IServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
serviceCollection.AddAutocadBase();
|
serviceCollection.AddAutocadBase();
|
||||||
serviceCollection.LoadSend();
|
|
||||||
|
|
||||||
// register civil specific send classes
|
// add send
|
||||||
|
serviceCollection.LoadSend();
|
||||||
serviceCollection.AddScoped<IRootObjectBuilder<AutocadRootObject>, Civil3dRootObjectBuilder>();
|
serviceCollection.AddScoped<IRootObjectBuilder<AutocadRootObject>, Civil3dRootObjectBuilder>();
|
||||||
serviceCollection.AddSingleton<IBinding, Civil3dSendBinding>();
|
serviceCollection.AddSingleton<IBinding, Civil3dSendBinding>();
|
||||||
|
|
||||||
// automatically detects the Class:IClass interface pattern to register all generated interfaces
|
// add receive
|
||||||
serviceCollection.AddMatchingInterfacesAsTransient(Assembly.GetExecutingAssembly());
|
serviceCollection.LoadReceive();
|
||||||
|
serviceCollection.AddScoped<IHostObjectBuilder, Civil3dHostObjectBuilder>();
|
||||||
|
serviceCollection.AddSingleton<IBinding, Civil3dReceiveBinding>();
|
||||||
|
|
||||||
// additional classes
|
// additional classes
|
||||||
serviceCollection.AddScoped<PropertySetDefinitionHandler>();
|
serviceCollection.AddScoped<PropertySetDefinitionHandler>();
|
||||||
serviceCollection.AddScoped<CatchmentGroupHandler>();
|
serviceCollection.AddScoped<PropertySetBaker>();
|
||||||
serviceCollection.AddScoped<PipeNetworkHandler>();
|
|
||||||
|
// automatically detects the Class:IClass interface pattern to register all generated interfaces
|
||||||
|
serviceCollection.AddMatchingInterfacesAsTransient(Assembly.GetExecutingAssembly());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,404 @@
|
|||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using Speckle.Connectors.Common.Operations;
|
||||||
|
using Speckle.Converters.Civil3dShared;
|
||||||
|
using Speckle.Converters.Civil3dShared.Helpers;
|
||||||
|
using Speckle.Converters.Civil3dShared.ToSpeckle;
|
||||||
|
using Speckle.Converters.Common;
|
||||||
|
using Speckle.Sdk;
|
||||||
|
using Speckle.Sdk.Models;
|
||||||
|
using AAEC = Autodesk.Aec;
|
||||||
|
using AAECPDB = Autodesk.Aec.PropertyData.DatabaseServices;
|
||||||
|
using ADB = Autodesk.AutoCAD.DatabaseServices;
|
||||||
|
|
||||||
|
namespace Speckle.Connectors.Civil3dShared.HostApp;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helper class to bake property sets to entities on receive.
|
||||||
|
/// </summary>
|
||||||
|
public class PropertySetBaker
|
||||||
|
{
|
||||||
|
private const string PROP_SET_DEF_DICT_NAME = "AecPropertySetDefs";
|
||||||
|
private readonly IConverterSettingsStore<Civil3dConversionSettings> _settingsStore;
|
||||||
|
private readonly ILogger<PropertySetBaker> _logger;
|
||||||
|
private readonly PropertyHandler _propertyHandler;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Map of property set definition name to its ObjectId. Populated during ParsePropertySetDefinitions.
|
||||||
|
/// </summary>
|
||||||
|
private readonly Dictionary<string, ADB.ObjectId> _propertySetDefinitionMap = new();
|
||||||
|
|
||||||
|
public PropertySetBaker(
|
||||||
|
IConverterSettingsStore<Civil3dConversionSettings> settingsStore,
|
||||||
|
ILogger<PropertySetBaker> logger
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_settingsStore = settingsStore;
|
||||||
|
_logger = logger;
|
||||||
|
_propertyHandler = new PropertyHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes all property set definitions with a prefix before receive operation.
|
||||||
|
/// </summary>
|
||||||
|
public void PurgePropertySets(string namePrefix)
|
||||||
|
{
|
||||||
|
ADB.Database db = _settingsStore.Current.Document.Database;
|
||||||
|
using var tr = db.TransactionManager.StartTransaction();
|
||||||
|
|
||||||
|
List<ADB.ObjectId> definitionsToDelete = new();
|
||||||
|
|
||||||
|
// Access the property set definition dictionary from the named object dictionary
|
||||||
|
var nod = (ADB.DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId, ADB.OpenMode.ForRead);
|
||||||
|
|
||||||
|
if (nod.Contains(PROP_SET_DEF_DICT_NAME))
|
||||||
|
{
|
||||||
|
ADB.ObjectId propSetDefsDictId = nod.GetAt(PROP_SET_DEF_DICT_NAME);
|
||||||
|
var propSetDefsDict = (ADB.DBDictionary)tr.GetObject(propSetDefsDictId, ADB.OpenMode.ForRead);
|
||||||
|
|
||||||
|
// Iterate through all property set definitions in the dictionary
|
||||||
|
foreach (ADB.DBDictionaryEntry entry in propSetDefsDict)
|
||||||
|
{
|
||||||
|
if (entry.Key.Contains(namePrefix))
|
||||||
|
{
|
||||||
|
definitionsToDelete.Add(entry.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the matching definitions
|
||||||
|
foreach (ADB.ObjectId defId in definitionsToDelete)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var propSetDef = (AAECPDB.PropertySetDefinition)tr.GetObject(defId, ADB.OpenMode.ForWrite);
|
||||||
|
propSetDef.Erase();
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (!ex.IsFatal())
|
||||||
|
{
|
||||||
|
_logger.LogWarning(ex, "Failed to purge property set definition");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.Commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parse and bake all property set definitions from the root object.
|
||||||
|
/// Should be called after purging and after materials/colors are parsed.
|
||||||
|
/// </summary>
|
||||||
|
public void ParseAndBakePropertySetDefinitions(Base rootObject, string namePrefix)
|
||||||
|
{
|
||||||
|
_propertySetDefinitionMap.Clear();
|
||||||
|
|
||||||
|
if (rootObject[ProxyKeys.PROPERTYSET_DEFINITIONS] is not Dictionary<string, object?> definitions)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (definitions.Count == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using var tr = _settingsStore.Current.Document.Database.TransactionManager.StartTransaction();
|
||||||
|
|
||||||
|
foreach (var definition in definitions)
|
||||||
|
{
|
||||||
|
string setName = definition.Key;
|
||||||
|
object? setDefObj = definition.Value;
|
||||||
|
|
||||||
|
if (setDefObj is not Dictionary<string, object?> setDefData)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Property set definition {SetName} has invalid data format", setName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!setDefData.TryGetValue(PropertySetDefinitionHandler.PROP_SET_PROP_DEFS_KEY, out var propDefsObj))
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Property set definition {SetName} missing propertyDefinitions", setName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (propDefsObj is not Dictionary<string, object?> propertyDefinitions)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Property set definition {SetName} propertyDefinitions has invalid format", setName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ADB.ObjectId defId = CreatePropertySetDefinition(setName, propertyDefinitions, namePrefix, tr);
|
||||||
|
if (!defId.IsNull)
|
||||||
|
{
|
||||||
|
_propertySetDefinitionMap[setName] = defId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.Commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Try to bake property sets from a Speckle object to a Civil3D entity.
|
||||||
|
/// </summary>
|
||||||
|
public bool TryBakePropertySets(ADB.Entity entity, Base sourceObject, ADB.Transaction tr)
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
sourceObject["properties"] is not Dictionary<string, object?> properties
|
||||||
|
|| !properties.TryGetValue("Property Sets", out var propertySetsObj)
|
||||||
|
|| propertySetsObj is not Dictionary<string, object?> propertySets
|
||||||
|
|| propertySets.Count == 0
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach (var propertySet in propertySets)
|
||||||
|
{
|
||||||
|
string setName = propertySet.Key;
|
||||||
|
object? setDataObj = propertySet.Value;
|
||||||
|
|
||||||
|
if (setDataObj is not Dictionary<string, object?> setData)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Property set {SetName} has invalid data format", setName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TryBakePropertySet(entity, setName, setData, tr))
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Failed to bake property set {SetName} onto entity", setName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (!ex.IsFatal())
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Failed to bake property sets onto entity {Handle}", entity.Handle);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool TryBakePropertySet(
|
||||||
|
ADB.Entity entity,
|
||||||
|
string setName,
|
||||||
|
Dictionary<string, object?> setData,
|
||||||
|
ADB.Transaction tr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!_propertySetDefinitionMap.TryGetValue(setName, out ADB.ObjectId propertySetDefId))
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Property set definition {SetName} not found in definition map", setName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (propertySetDefId.IsNull)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ObjectHasPropertySet(entity, propertySetDefId))
|
||||||
|
{
|
||||||
|
throw new SpeckleException($"Property set '{setName}' already exists on entity.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return AddPropertySetToEntity(entity, propertySetDefId, setData, tr);
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (!ex.IsFatal())
|
||||||
|
{
|
||||||
|
_logger.LogWarning(ex, "Failed to process property set {SetName}", setName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ADB.ObjectId CreatePropertySetDefinition(
|
||||||
|
string setName,
|
||||||
|
Dictionary<string, object?> propertyDefinitions,
|
||||||
|
string namePrefix,
|
||||||
|
ADB.Transaction tr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
var db = _settingsStore.Current.Document.Database;
|
||||||
|
using AAECPDB.DictionaryPropertySetDefinitions propSetDefs = new(db);
|
||||||
|
|
||||||
|
string prefixedName = $"{setName}-{namePrefix}";
|
||||||
|
|
||||||
|
AAECPDB.PropertySetDefinition propSetDef = new();
|
||||||
|
propSetDef.SetToStandard(db);
|
||||||
|
propSetDef.SubSetDatabaseDefaults(db);
|
||||||
|
//propSetDef.Description = "Property Set Definition added by Speckle"; // POC: should use the description that was published. can this back in if needed
|
||||||
|
propSetDef.AppliesToAll = true;
|
||||||
|
|
||||||
|
foreach (var propertyDefinition in propertyDefinitions)
|
||||||
|
{
|
||||||
|
string propertyName = propertyDefinition.Key;
|
||||||
|
object? propertyDefObj = propertyDefinition.Value;
|
||||||
|
|
||||||
|
if (propertyDefObj is not Dictionary<string, object?> propertyDefDict)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
!propertyDefDict.TryGetValue(PropertySetDefinitionHandler.PROP_DEF_TYPE_KEY, out var dataTypeStr)
|
||||||
|
|| dataTypeStr is not string dataTypeString
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_logger.LogError(
|
||||||
|
"Property set definition {SetName} is invalid: property {PropertyName} missing or invalid dataType",
|
||||||
|
setName,
|
||||||
|
propertyName
|
||||||
|
);
|
||||||
|
return ADB.ObjectId.Null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Enum.TryParse(dataTypeString, out AAEC.PropertyData.DataType dataType))
|
||||||
|
{
|
||||||
|
_logger.LogError(
|
||||||
|
"Property set definition {SetName} is invalid: unsupported data type {DataType} for property {PropertyName}",
|
||||||
|
setName,
|
||||||
|
dataTypeString,
|
||||||
|
propertyName
|
||||||
|
);
|
||||||
|
return ADB.ObjectId.Null;
|
||||||
|
}
|
||||||
|
|
||||||
|
AAECPDB.PropertyDefinition propDef = new() { DataType = dataType, Name = propertyName };
|
||||||
|
|
||||||
|
propDef.SetToStandard(db);
|
||||||
|
propDef.SubSetDatabaseDefaults(db);
|
||||||
|
|
||||||
|
if (
|
||||||
|
propertyDefDict.TryGetValue(PropertySetDefinitionHandler.PROP_DEF_DEFAULT_VALUE_KEY, out object? defaultValue)
|
||||||
|
&& defaultValue != null
|
||||||
|
)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Cast numeric types to avoid bad numeric value errors
|
||||||
|
var convertedValue = dataType switch
|
||||||
|
{
|
||||||
|
AAEC.PropertyData.DataType.Integer => (int)(long)defaultValue,
|
||||||
|
AAEC.PropertyData.DataType.AutoIncrement => (int)(long)defaultValue,
|
||||||
|
_ => defaultValue
|
||||||
|
};
|
||||||
|
|
||||||
|
propDef.DefaultData = convertedValue;
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (!ex.IsFatal())
|
||||||
|
{
|
||||||
|
_logger.LogWarning(
|
||||||
|
ex,
|
||||||
|
"Failed to set default value for property {PropertyName}, continuing without default",
|
||||||
|
propertyName
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
propSetDef.Definitions.Add(propDef);
|
||||||
|
}
|
||||||
|
|
||||||
|
propSetDefs.AddNewRecord(prefixedName, propSetDef);
|
||||||
|
tr.AddNewlyCreatedDBObject(propSetDef, true);
|
||||||
|
|
||||||
|
return propSetDef.ObjectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool ObjectHasPropertySet(ADB.DBObject obj, ADB.ObjectId propertySetId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ADB.ObjectId tempId = AAECPDB.PropertyDataServices.GetPropertySet(obj, propertySetId);
|
||||||
|
return !tempId.IsNull;
|
||||||
|
}
|
||||||
|
catch (Autodesk.AutoCAD.Runtime.Exception ex) when (!ex.IsFatal())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool AddPropertySetToEntity(
|
||||||
|
ADB.Entity entity,
|
||||||
|
ADB.ObjectId propertySetDefId,
|
||||||
|
Dictionary<string, object?> setData,
|
||||||
|
ADB.Transaction tr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!entity.IsWriteEnabled)
|
||||||
|
{
|
||||||
|
entity.UpgradeOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
AAECPDB.PropertyDataServices.AddPropertySet(entity, propertySetDefId);
|
||||||
|
|
||||||
|
return TrySetPropertyValues(entity, propertySetDefId, setData, tr);
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (!ex.IsFatal())
|
||||||
|
{
|
||||||
|
_logger.LogWarning(ex, "Failed to add property set to entity");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool TrySetPropertyValues(
|
||||||
|
ADB.Entity entity,
|
||||||
|
ADB.ObjectId propertySetDefId,
|
||||||
|
Dictionary<string, object?> setData,
|
||||||
|
ADB.Transaction tr
|
||||||
|
)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ADB.ObjectId propertySetId = AAECPDB.PropertyDataServices.GetPropertySet(entity, propertySetDefId);
|
||||||
|
var propertySet = (AAECPDB.PropertySet)tr.GetObject(propertySetId, ADB.OpenMode.ForWrite);
|
||||||
|
var setDefinition = (AAECPDB.PropertySetDefinition)tr.GetObject(propertySetDefId, ADB.OpenMode.ForRead);
|
||||||
|
|
||||||
|
// Build a map of property names to definition IDs
|
||||||
|
Dictionary<string, int> propertyNameToId = new();
|
||||||
|
foreach (AAECPDB.PropertyDefinition propDef in setDefinition.Definitions)
|
||||||
|
{
|
||||||
|
propertyNameToId[propDef.Name] = propDef.Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var propertyEntry in setData)
|
||||||
|
{
|
||||||
|
string propertyName = propertyEntry.Key;
|
||||||
|
object? propertyDataObj = propertyEntry.Value;
|
||||||
|
|
||||||
|
if (propertyDataObj is not Dictionary<string, object?> propertyDataDict)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!propertyDataDict.TryGetValue("value", out var value) || value == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!propertyNameToId.TryGetValue(propertyName, out int propertyId))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
_propertyHandler.TryGetValue(
|
||||||
|
() =>
|
||||||
|
{
|
||||||
|
propertySet.SetAt(propertyId, value);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
out _
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex) when (!ex.IsFatal())
|
||||||
|
{
|
||||||
|
_logger.LogWarning(ex, "Failed to update property set values");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
using Autodesk.AutoCAD.DatabaseServices;
|
||||||
|
using Speckle.Connectors.Autocad.HostApp;
|
||||||
|
using Speckle.Connectors.Autocad.Operations.Receive;
|
||||||
|
using Speckle.Connectors.Civil3dShared.HostApp;
|
||||||
|
using Speckle.Connectors.Common.Operations;
|
||||||
|
using Speckle.Connectors.Common.Operations.Receive;
|
||||||
|
using Speckle.Converters.Common;
|
||||||
|
using Speckle.Sdk.Models;
|
||||||
|
|
||||||
|
namespace Speckle.Connectors.Civil3dShared.Operations.Receive;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>Civil3D specific host object builder with property set support. Expects to be a scoped dependency per receive operation.</para>
|
||||||
|
/// </summary>
|
||||||
|
public sealed class Civil3dHostObjectBuilder : AutocadHostObjectBaseBuilder
|
||||||
|
{
|
||||||
|
private readonly PropertySetBaker _propertySetBaker;
|
||||||
|
|
||||||
|
public Civil3dHostObjectBuilder(
|
||||||
|
IRootToHostConverter converter,
|
||||||
|
AutocadLayerBaker layerBaker,
|
||||||
|
AutocadGroupBaker groupBaker,
|
||||||
|
AutocadInstanceBaker instanceBaker,
|
||||||
|
IAutocadMaterialBaker materialBaker,
|
||||||
|
IAutocadColorBaker colorBaker,
|
||||||
|
AutocadContext autocadContext,
|
||||||
|
RootObjectUnpacker rootObjectUnpacker,
|
||||||
|
IReceiveConversionHandler conversionHandler,
|
||||||
|
PropertySetBaker propertySetBaker
|
||||||
|
)
|
||||||
|
: base(
|
||||||
|
converter,
|
||||||
|
layerBaker,
|
||||||
|
groupBaker,
|
||||||
|
instanceBaker,
|
||||||
|
materialBaker,
|
||||||
|
colorBaker,
|
||||||
|
autocadContext,
|
||||||
|
rootObjectUnpacker,
|
||||||
|
conversionHandler
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_propertySetBaker = propertySetBaker;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void PreReceiveAdditionalDeepClean(string baseLayerPrefix)
|
||||||
|
{
|
||||||
|
_propertySetBaker.PurgePropertySets(baseLayerPrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void ParseAndBakeAdditionalProxies(Base rootObject, string baseLayerPrefix)
|
||||||
|
{
|
||||||
|
_propertySetBaker.ParseAndBakePropertySetDefinitions(rootObject, baseLayerPrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void PostBakeEntity(Entity entity, Base originalObject, Transaction tr)
|
||||||
|
{
|
||||||
|
_propertySetBaker.TryBakePropertySets(entity, originalObject, tr);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,6 @@ using Speckle.Connectors.Autocad.HostApp;
|
|||||||
using Speckle.Connectors.Autocad.Operations.Send;
|
using Speckle.Connectors.Autocad.Operations.Send;
|
||||||
using Speckle.Connectors.Common.Caching;
|
using Speckle.Connectors.Common.Caching;
|
||||||
using Speckle.Connectors.Common.Operations;
|
using Speckle.Connectors.Common.Operations;
|
||||||
using Speckle.Converters.Civil3dShared.Helpers;
|
|
||||||
using Speckle.Converters.Civil3dShared.ToSpeckle;
|
using Speckle.Converters.Civil3dShared.ToSpeckle;
|
||||||
using Speckle.Converters.Common;
|
using Speckle.Converters.Common;
|
||||||
using Speckle.Sdk.Logging;
|
using Speckle.Sdk.Logging;
|
||||||
@@ -16,14 +15,10 @@ public sealed class Civil3dRootObjectBuilder : AutocadRootObjectBaseBuilder
|
|||||||
{
|
{
|
||||||
private readonly AutocadLayerUnpacker _layerUnpacker;
|
private readonly AutocadLayerUnpacker _layerUnpacker;
|
||||||
private readonly PropertySetDefinitionHandler _propertySetDefinitionHandler;
|
private readonly PropertySetDefinitionHandler _propertySetDefinitionHandler;
|
||||||
private readonly CatchmentGroupHandler _catchmentGroupHandler;
|
|
||||||
private readonly PipeNetworkHandler _pipeNetworkHandler;
|
|
||||||
|
|
||||||
public Civil3dRootObjectBuilder(
|
public Civil3dRootObjectBuilder(
|
||||||
AutocadLayerUnpacker layerUnpacker,
|
AutocadLayerUnpacker layerUnpacker,
|
||||||
PropertySetDefinitionHandler propertySetDefinitionHandler,
|
PropertySetDefinitionHandler propertySetDefinitionHandler,
|
||||||
CatchmentGroupHandler catchmentGroupHandler,
|
|
||||||
PipeNetworkHandler pipeNetworkHandler,
|
|
||||||
IRootToSpeckleConverter converter,
|
IRootToSpeckleConverter converter,
|
||||||
ISendConversionCache sendConversionCache,
|
ISendConversionCache sendConversionCache,
|
||||||
AutocadInstanceUnpacker instanceObjectManager,
|
AutocadInstanceUnpacker instanceObjectManager,
|
||||||
@@ -46,8 +41,6 @@ public sealed class Civil3dRootObjectBuilder : AutocadRootObjectBaseBuilder
|
|||||||
{
|
{
|
||||||
_layerUnpacker = layerUnpacker;
|
_layerUnpacker = layerUnpacker;
|
||||||
_propertySetDefinitionHandler = propertySetDefinitionHandler;
|
_propertySetDefinitionHandler = propertySetDefinitionHandler;
|
||||||
_catchmentGroupHandler = catchmentGroupHandler;
|
|
||||||
_pipeNetworkHandler = pipeNetworkHandler;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override (Collection, LayerTableRecord?) CreateObjectCollection(Entity entity, Transaction tr)
|
public override (Collection, LayerTableRecord?) CreateObjectCollection(Entity entity, Transaction tr)
|
||||||
@@ -57,11 +50,8 @@ public sealed class Civil3dRootObjectBuilder : AutocadRootObjectBaseBuilder
|
|||||||
return (layer, autocadLayer);
|
return (layer, autocadLayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// POC: probably will need to add Network proxies as well
|
|
||||||
public override void AddAdditionalProxiesToRoot(Collection rootObject)
|
public override void AddAdditionalProxiesToRoot(Collection rootObject)
|
||||||
{
|
{
|
||||||
rootObject[ProxyKeys.PROPERTYSET_DEFINITIONS] = _propertySetDefinitionHandler.Definitions;
|
rootObject[ProxyKeys.PROPERTYSET_DEFINITIONS] = _propertySetDefinitionHandler.Definitions;
|
||||||
rootObject["catchmentGroupProxies"] = _catchmentGroupHandler.CatchmentGroupProxiesCache.Values.ToList();
|
|
||||||
rootObject["pipeNetworkProxies"] = _pipeNetworkHandler.PipeNetworkProxiesCache.Values.ToList();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,13 +9,17 @@
|
|||||||
<Import_RootNamespace>Speckle.Connectors.Civil3dShared</Import_RootNamespace>
|
<Import_RootNamespace>Speckle.Connectors.Civil3dShared</Import_RootNamespace>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)Bindings\Civil3dReceiveBinding.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)DependencyInjection\Civil3dConnectorModule.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)DependencyInjection\Civil3dConnectorModule.cs" />
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)HostApp\PropertySetBaker.cs" />
|
||||||
|
<Compile Include="$(MSBuildThisFileDirectory)Operations\Receive\Civil3dHostObjectBuilder.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\Civil3dRootObjectBuilder.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Operations\Send\Civil3dRootObjectBuilder.cs" />
|
||||||
<Compile Include="$(MSBuildThisFileDirectory)Bindings\Civil3dSendBinding.cs" />
|
<Compile Include="$(MSBuildThisFileDirectory)Bindings\Civil3dSendBinding.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="$(MSBuildThisFileDirectory)DependencyInjection\" />
|
<Folder Include="$(MSBuildThisFileDirectory)DependencyInjection\" />
|
||||||
<Folder Include="$(MSBuildThisFileDirectory)Bindings\" />
|
<Folder Include="$(MSBuildThisFileDirectory)HostApp\" />
|
||||||
|
<Folder Include="$(MSBuildThisFileDirectory)Operations\Receive\" />
|
||||||
<Folder Include="$(MSBuildThisFileDirectory)Operations\Send\" />
|
<Folder Include="$(MSBuildThisFileDirectory)Operations\Send\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||