刘妍 1 month ago
commit f32b432766

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753945539905" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="42393" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M800 128H640V64h224a32 32 0 0 1 32 32v224h-64V160a32 32 0 0 0-32-32z m32 512h64v224a32 32 0 0 1-32 32H640v-64h192V640zM128 832h192v64H96a32 32 0 0 1-32-32V640h64v192z m0-704v194H64V96a32 32 0 0 1 32-32h224v64H128zM0 448h256v64H0v-64z m704 0h256v64H704v-64zM448 0h64v256h-64V0z m0 704h64v256h-64V704z m32-128c-53.02 0-96-42.98-96-96s42.98-96 96-96 96 42.98 96 96-42.98 96-96 96z" p-id="42394" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 752 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753942523200" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17434" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M181.504 369.92Q211.2 299.328 265.28 244.864a43.712 43.712 0 0 0 8.896-12.928L389.632 348.16V64.064h-282.24l109.312 110.08a43.52 43.52 0 0 0-12.8 8.96Q137.728 249.6 101.44 335.808 64 425.216 64 523.008t37.568 187.136q36.224 86.272 102.336 152.832L107.392 960h282.24v-284.096l-124.352 125.184q-54.08-54.464-83.776-125.056-30.72-73.024-30.72-153.088t30.72-153.088zM653.824 704h252.992c29.376 0 53.184-27.072 53.184-60.48v-263.04c0-33.408-23.808-60.48-53.184-60.48h-252.928c-29.44 0-53.248 27.072-53.248 60.48v90.304L504.96 388.032a32 32 0 0 0-37.376-3.968A41.28 41.28 0 0 0 448 420.48l1.472 190.72a41.216 41.216 0 0 0 19.328 35.52 31.936 31.936 0 0 0 36.672-3.008l95.168-76.864v76.736c0 33.408 23.808 60.48 53.248 60.48z" p-id="17435" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753942372371" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14246" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M295.893333 463.786667c19.029333 0 38.485333-4.778667 57.514667-9.557334l-62.293333-62.293333c-48.042667-4.778667-91.306667-43.264-91.306667-96.042667a96.426667 96.426667 0 0 1 96.085333-96.085333c52.778667 0 91.306667 38.528 96 91.306667l62.336 62.293333c4.778667-19.029333 9.514667-38.485333 9.514667-57.514667C463.786667 204.586667 387.157333 128 295.893333 128 204.586667 128 128 204.586667 128 295.893333s76.586667 167.850667 167.893333 167.850667z m335.744-173.098667c4.736-48.042667 48.042667-91.306667 96.042667-91.306667a96.426667 96.426667 0 0 1 96.085333 96.085334c0 48-38.528 91.306667-91.306666 96l-62.293334 62.336c105.557333 38.528 225.408-43.264 225.408-158.336C895.573333 204.586667 818.56 128 727.68 128c-115.072 0-196.864 119.850667-158.336 225.408l62.293333-62.293333v-0.426667z m-23.808 259.157333c0-52.778667 19.072-100.821333 57.6-138.88l71.808-71.808a23.509333 23.509333 0 0 0 0-33.749333l-19.072-19.029333a23.509333 23.509333 0 0 0-33.706666 0l-96.085334 96c-19.029333 23.850667-48.042667 33.792-76.586666 33.792-28.586667 0-57.557333-9.514667-76.586667-33.749334L339.2 286.378667a23.509333 23.509333 0 0 0-33.749333 0l-19.029334 19.029333a23.509333 23.509333 0 0 0 0 33.706667L382.421333 435.2c23.808 19.029333 33.749333 48.042667 33.749334 76.586667 0 28.586667-9.514667 57.557333-33.749334 76.586666L286.378667 684.373333a23.509333 23.509333 0 0 0 0 33.749334l19.029333 19.029333a23.509333 23.509333 0 0 0 33.706667 0l71.850666-71.808a192 192 0 0 1 138.922667-57.557333 166.528 166.528 0 0 1 57.514667-57.557334l0.426666-0.426666z m-215.893333 182.186667c-4.778667 48-43.264 91.306667-96.042667 91.306667a96.426667 96.426667 0 0 1-96.085333-96.085334c0-52.778667 38.528-91.306667 91.306667-96.042666l62.293333-62.293334c-19.029333-4.778667-38.485333-9.557333-57.514667-9.557333C204.586667 559.36 128 635.946667 128 727.253333s76.586667 167.893333 167.893333 167.893334 167.850667-76.586667 167.850667-167.893334c0-19.029333-4.736-38.528-9.514667-57.557333l-62.293333 62.293333zM682.666667 661.333333v213.333334q0 2.133333 0.426666 4.181333t1.194667 3.968q0.810667 1.962667 1.962667 3.712 1.194667 1.706667 2.645333 3.242667 1.493333 1.450667 3.242667 2.645333 1.749333 1.152 3.712 1.962667 1.92 0.810667 3.968 1.194666 2.090667 0.426667 4.181333 0.426667h42.666667q2.133333 0 4.181333-0.426667t3.968-1.194666q1.962667-0.810667 3.712-1.962667 1.706667-1.194667 3.242667-2.645333 1.450667-1.493333 2.645333-3.242667 1.152-1.749333 1.962667-3.712 0.810667-1.92 1.194666-3.968 0.426667-2.090667 0.426667-4.181333v-213.333334q0-2.133333-0.426667-4.181333t-1.194666-3.968q-0.810667-1.962667-1.962667-3.712-1.194667-1.706667-2.645333-3.242667-1.493333-1.450667-3.242667-2.645333-1.749333-1.152-3.712-1.962667-1.92-0.810667-3.968-1.194666-2.090667-0.426667-4.181333-0.426667h-42.666667q-2.133333 0-4.181333 0.426667t-3.968 1.194666q-1.962667 0.810667-3.712 1.962667-1.706667 1.194667-3.242667 2.645333-1.450667 1.493333-2.645333 3.242667-1.152 1.749333-1.962667 3.712-0.810667 1.92-1.194667 4.010667-0.426667 2.048-0.426666 4.138666z m128 0v213.333334q0 2.133333 0.426666 4.181333t1.194667 3.968q0.810667 1.962667 1.962667 3.712 1.194667 1.706667 2.645333 3.242667 1.493333 1.450667 3.242667 2.645333 1.749333 1.152 3.712 1.962667 1.92 0.810667 3.968 1.194666 2.090667 0.426667 4.181333 0.426667h42.666667q2.133333 0 4.181333-0.426667t3.968-1.194666q1.962667-0.810667 3.712-1.962667 1.706667-1.194667 3.242667-2.645333 1.450667-1.493333 2.645333-3.242667 1.152-1.749333 1.962667-3.712 0.810667-1.92 1.194666-3.968 0.426667-2.090667 0.426667-4.181333v-213.333334q0-2.133333-0.426667-4.181333t-1.194666-3.968q-0.810667-1.962667-1.962667-3.712-1.194667-1.706667-2.645333-3.242667-1.493333-1.450667-3.242667-2.645333-1.749333-1.152-3.712-1.962667-1.92-0.810667-3.968-1.194666-2.090667-0.426667-4.181333-0.426667h-42.666667q-2.133333 0-4.181333 0.426667t-3.968 1.194666q-1.962667 0.810667-3.712 1.962667-1.706667 1.194667-3.242667 2.645333-1.450667 1.493333-2.645333 3.242667-1.152 1.749333-1.962667 3.712-0.810667 1.92-1.194667 4.010667-0.426667 2.048-0.426666 4.138666z" p-id="14247" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753942742724" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="33433" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M510.8 745.4c-50.8 0-94.4-18.1-130.6-54.3-36.3-36.2-54.3-79.8-54.3-130.6s18.1-94.4 54.3-130.6c36.2-36.2 79.8-54.3 130.6-54.3s94.4 18.1 130.6 54.3c16.2 16.2 28.8 34 37.8 53.2 20.9-6.2 43.1-9.6 66.1-9.6 57.9 0 110.9 21.4 151.4 56.6 3.6 3.1 7 6.3 10.4 9.6v-164-3.3c-0.8-27.8-11-51.5-31-71.4-20.6-20.7-45.6-31-74.7-31h0.2v-0.1H709l-21-56.1c-5.2-13.5-14.9-25.2-28.7-34.9-13.9-9.8-28-14.7-42.7-14.7H405.2c-14.6 0-28.8 5-42.7 14.7-13.9 9.7-23.6 21.4-28.7 34.9l-21 56.1h-92.5c-29.2 0-54 10.4-74.7 31-19.3 19.2-29.5 42.2-30.9 68.8-0.1 1.9-0.1 3.9-0.1 5.9v369.9c0 2 0.1 4 0.1 5.9 1.3 26.7 11.7 49.5 30.9 68.8 20.6 20.7 45.6 31 74.7 31h347.2c-24.7-29.9-42.1-66.2-49.2-105.9-2.6 0.1-5 0.1-7.5 0.1z" p-id="33434" fill="#ffffff"></path><path d="M426.9 476.5c-23.3 23.3-34.9 51.2-34.9 83.9s11.6 60.6 34.9 83.9c23.2 23.3 51.2 34.9 83.9 34.9 1.7 0 3.4 0 5.1-0.1 5.2-48.2 25.3-92 55.5-126.6 6.9-8 14.4-15.4 22.4-22.4 8-6.9 16.4-13.3 25.3-19.1-5.8-12.5-13.9-24-24.4-34.5-23.2-23.3-51.2-34.9-83.9-34.9s-60.6 11.7-83.9 34.9zM907 641.4c-25.1-64.9-88.2-110.9-162-110.9-94.3 0-171.1 75.2-173.6 168.9v9.6c1.6 60.8 34.6 113.8 83.2 143.5 26.3 16.1 57.3 25.3 90.3 25.3s64-9.3 90.3-25.3c32.4-19.8 57.8-49.8 71.6-85.6 7.5-19.5 11.7-40.6 11.7-62.7 0.2-22.2-4-43.4-11.5-62.8z m-182.2-26.1c0-11.2 9.1-20.2 20.2-20.2s20.3 9 20.3 20.2v94.3c0 11.2-9.1 20.2-20.3 20.2-11.2 0-20.2-9-20.2-20.2v-94.3zM745 756.7c11.2 0 20.3 9 20.3 20.2s-9.1 20.2-20.3 20.2-20.2-9.1-20.2-20.2c0-11.2 9-20.2 20.2-20.2z" p-id="33435" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753945903037" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="43476" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M725.333333 469.333333c141.141333 0 256 114.858667 256 256 0 141.184-114.816 256-256 256-141.141333 0-256-114.816-256-256 0-141.141333 114.858667-256 256-256z m-63.829333 128c-21.888 0-39.936 13.610667-42.368 31.146667l-0.298667 4.096v185.514667l0.554667 5.717333c3.328 16.768 20.906667 29.525333 42.112 29.525333 19.456 0 35.84-10.752 40.96-25.429333l1.152-4.096 0.554667-5.717333v-185.514667l-0.554667-5.717333c-3.328-16.768-20.906667-29.525333-42.112-29.525334z m128 0c-21.888 0-39.936 13.610667-42.368 31.146667l-0.298667 4.096v185.514667l0.554667 5.717333c3.328 16.768 20.906667 29.525333 42.112 29.525333 19.456 0 35.84-10.752 40.96-25.429333l1.152-4.096 0.554667-5.717333v-185.514667l-0.554667-5.717333c-3.328-16.768-20.906667-29.525333-42.112-29.525334zM601.557333 85.333333c5.845333 0 10.837333 4.181333 11.861334 9.898667l8.832 47.872c4.309333 23.04 24.277333 39.765333 47.530666 39.765333h86.826667A97.109333 97.109333 0 0 1 853.333333 280.362667v175.061333A297.514667 297.514667 0 0 0 725.333333 426.666667a299.093333 299.093333 0 0 0-76.8 9.984c-22.485333-89.813333-103.125333-156.288-199.253333-156.288-113.493333 0-205.525333 92.8-205.525333 207.274666 0 107.306667 80.896 195.584 184.576 206.165334a301.226667 301.226667 0 0 0 1.365333 74.24L139.392 768A97.109333 97.109333 0 0 1 42.666667 670.464V280.362667a97.28 97.28 0 0 1 96.725333-97.578667h86.826667a48.469333 48.469333 0 0 0 47.530666-39.765333l8.96-47.786667A12.117333 12.117333 0 0 1 294.485333 85.333333H601.6zM449.28 335.146667c41.344 0 80.213333 15.744 109.44 44.373333 21.034667 20.48 35.413333 46.378667 41.685333 74.410667a299.52 299.52 0 0 0-160.853333 184.32 154.794667 154.794667 0 0 1-99.754667-44.117334 149.205333 149.205333 0 0 1-45.312-107.306666c0-40.533333 16.085333-78.592 45.312-107.264a155.306667 155.306667 0 0 1 109.482667-44.416zM211.968 256H163.584a24.32 24.32 0 0 0-22.314667 33.536 24.661333 24.661333 0 0 0 22.272 15.232h48.426667a24.32 24.32 0 0 0 22.272-33.536A24.661333 24.661333 0 0 0 211.968 256z" p-id="43477" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.7 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753942043518" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4507" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M755.2 192h-123.733333l-55.466667-55.466667-12.8-12.8H362.666667l-12.8 8.533334-55.466667 59.733333H170.666667c-38.4 0-68.266667 29.866667-68.266667 68.266667v413.866666c0 38.4 29.866667 68.266667 68.266667 68.266667h473.6v-200.533333h179.2V260.266667c0-38.4-29.866667-68.266667-68.266667-68.266667zM469.333333 627.2c-85.333333 4.266667-153.6-64-153.6-145.066667-4.266667-85.333333 64-153.6 145.066667-153.6h8.533333c85.333333-4.266667 153.6 59.733333 157.866667 145.066667s-59.733333 153.6-145.066667 157.866667c-4.266667-4.266667-8.533333-4.266667-12.8-4.266667z m102.4-153.6c0 55.466667-46.933333 102.4-102.4 102.4s-102.4-46.933333-102.4-102.4c0-55.466667 46.933333-102.4 102.4-102.4 55.466667 4.266667 102.4 46.933333 102.4 102.4z m128-119.466667c-17.066667 0-34.133333-17.066667-34.133333-34.133333s17.066667-34.133333 34.133333-34.133333 34.133333 17.066667 34.133334 34.133333-17.066667 34.133333-34.133334 34.133333z" p-id="4508" fill="#ffffff"></path><path d="M704 900.266667h72.533333v-85.333334h128v-59.733333h-128v-93.866667h149.333334v-59.733333h-221.866667v298.666667z" p-id="4509" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753942252945" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11018" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M286.5 354.2s-170.5 62.5-94.9 164c18.2-19.7 94.9-60 94.9-60v-104z" p-id="11019" fill="#ffffff"></path><path d="M142.2 500.8v116.9s32.7 137.4 379.7 141.2C856 744.5 881 613.9 881 613.9l0.8-112.4s-31.9 132.1-366 146.6c-344.7-13.7-373.6-147.3-373.6-147.3zM737.5 355v104.8s51.6 18.2 91.1 60C906.1 413.5 737.5 355 737.5 355zM414.9 424.8c17-6.7 25.5-17.8 25.5-33.3-1-29.4-18.1-44.4-51.1-44.9-27.9 0.5-45.4 14.7-52.6 42.6l26.3 6.2c3.1-16 12.1-24.5 27.1-25.5 15 0.5 22.7 7.5 23.2 20.9-1 16.5-11.4 24.8-31 24.8h-13.2V438h19.3c19.1 0.5 29.4 8.5 31 24 0.5 19.6-9.8 29.2-31 28.6-17-0.5-26.6-9.8-28.6-27.9l-26.3 6.2c5.7 28.4 24.5 42.8 56.5 43.3 35.6-1.5 54.4-17.8 56.5-48.8-0.4-17.5-10.9-30.4-31.6-38.6zM741.2 299c-1.7 19.7-13.1 30.8-33.9 33.1-20.3-1.7-31.3-12.8-33.1-33.1 2.3-20.9 13.3-32.2 33.1-33.9 20.3 2.3 31.6 13.6 33.9 33.9z m-51.3 0c1.2 10.4 7 16.2 17.4 17.4 11-1.2 17.1-7 18.3-17.4-1.2-11-7.3-17.1-18.3-18.3-11 1.2-16.8 7.2-17.4 18.3z m0 0M524.8 402.3c-15.5 0-27.4 5.7-35.6 17-0.5-33.5 10.8-50 34-49.5 12.9-0.5 21.4 6.7 25.5 21.7l24.8-7c-7.7-24.2-24.3-36.9-49.5-37.9-40.8 0-61.1 29.2-61.1 87.4-0.5 53.1 19.3 79.2 59.6 78.2 33.5-2.1 51.3-20.6 53.4-55.7-1.5-34.5-18.6-52.6-51.1-54.2z m-2.3 89c-21.7-0.5-32.8-12.9-33.3-37.1 0.5-19.1 11.6-28.9 33.3-29.4 17.5 0.5 26.6 11.4 27.1 32.5-0.5 22.2-9.6 33.5-27.1 34zM651 346.6c-36.1 1-54.7 28.9-55.7 83.6 0 54.7 18.8 82 56.5 82 36.6-1 55.2-28.4 55.7-82-0.1-55.7-18.9-83.6-56.5-83.6z m0.7 144.7c-20.1 1.5-29.9-18.8-29.4-61.1 0.5-39.7 10.1-60.1 28.6-61.1 20.1-1.5 29.9 18.8 29.4 61.1 0.6 41.8-9 62.2-28.6 61.1z" p-id="11020" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753942473117" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="16362" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M508.5184 302.6944l249.9072 607.744-252.416-98.816-247.3984 98.816 249.856-607.744zM508.672 153.6a328.1408 328.1408 0 0 1 309.2992 218.624l56.2688-18.2784-36.864 173.2096-141.4144-115.3024 53.8112-17.4592a256.4608 256.4608 0 0 0-481.4848-1.9456l59.7504 19.456-141.4144 115.2-36.864-173.1584 50.3296 16.3328A328.1408 328.1408 0 0 1 508.672 153.6z" p-id="16363" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 720 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753942293794" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12069" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M138.688 192h472.896c39.808 0 74.624 34.816 74.624 79.616v438.08c0 44.8-34.816 79.616-74.624 79.616h-472.96C98.88 789.312 64 754.56 64 709.76V271.616C64 226.816 98.816 192 138.688 192z m736.64 74.688c19.968-19.904 49.856-14.976 69.76 4.928 9.92 4.992 14.912 19.968 14.912 29.888v378.304c0 29.888-19.904 49.792-49.792 49.792a45.184 45.184 0 0 1-34.816-14.912L736 590.208v-199.04l139.392-124.48zM310.4 350.656c-13.952-7.936-25.408-1.28-25.408 14.912v256.128c0 16.192 11.392 22.912 25.408 14.976l226.944-128.64c13.952-7.936 14.016-20.8 0-28.8L310.4 350.656z" p-id="12070" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 929 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753942342474" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13122" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M1020.061538 240.246154c-7.876923-7.876923-23.630769-11.815385-31.507692-3.938462l-244.184615 157.538462V236.307692c0-23.630769-19.692308-43.323077-47.261539-43.323077H47.261538C19.692308 192.984615 0 212.676923 0 236.307692v551.384616c0 23.630769 19.692308 43.323077 47.261538 43.323077h649.846154c27.569231 0 47.261538-19.692308 47.261539-43.323077v-157.538462l244.184615 157.538462c3.938462 3.938462 7.876923 3.938462 11.815385 3.938461 11.815385 0 23.630769-7.876923 23.630769-19.692307V252.061538c0-3.938462 0-7.876923-3.938462-11.815384zM512 669.538462H196.923077V354.461538h315.076923v315.076924z" p-id="13123" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 978 B

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753945986727" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="44864" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M145.1 212.8h96.1V248h-96.1z" fill="#ffffff" p-id="44865"></path><path d="M863.6 277H745.9c-12 0-23.2-6-29.8-16l-50.4-75.6c-6.6-10-17.8-16-29.8-16H387.8c-12 0-23.2 6-29.8 16L307.7 261c-6.6 10-17.8 16-29.8 16H160.4c-53.1 0-96.1 43.1-96.1 96.1v385.3c0 53.1 43.1 96.1 96.1 96.1h703.2c53.1 0 96.1-43.1 96.1-96.1V373.1c0-53-43-96.1-96.1-96.1zM512 783.7c-113.5 0-206-92.3-206-206 0-113.5 92.4-206 206-206 113.5 0 206 92.4 206 206s-92.5 206-206 206z m292.7-412.9c0 15.8-12.8 28.5-28.6 28.6h-0.5c-15.8 0-28.6-12.8-28.6-28.6v-0.5c0-15.8 12.8-28.6 28.6-28.6h0.5c15.8 0 28.6 12.8 28.6 28.6v0.5z" fill="#ffffff" p-id="44866"></path><path d="M512 416.6c-89 0-161.2 72.2-161.2 161.2C350.8 666.9 423 739 512 739c89.1 0 161.2-72.1 161.2-161.2 0-89-72.1-161.2-161.2-161.2z" fill="#ffffff" p-id="44867"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1753942562780" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="18478" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M512.352242 256.176121 384.264182 256.176121l0 128.088061L256.176121 384.264182l0 128.088061 128.088061 0 0 128.088061 128.088061 0L512.352242 512.352242l128.088061 0L640.440303 384.264182 512.352242 384.264182 512.352242 256.176121zM1000.944149 889.443492 815.920946 704.484333C866.643818 631.794359 896.616424 543.605729 896.616424 448.308212c0-247.594221-200.713991-448.308212-448.308212-448.308212C200.713991 0 0 200.713991 0 448.308212c0 247.594221 200.713991 448.308212 448.308212 448.308212 95.297517 0 183.486147-29.972606 256.176121-80.695478l184.959159 184.959159c30.805179 30.805179 80.695478 30.805179 111.500657 0S1031.685284 920.248671 1000.944149 889.443492zM448.308212 768.528363c-176.825568 0-320.220151-143.394584-320.220151-320.220151 0-176.825568 143.394584-320.220151 320.220151-320.220151s320.220151 143.394584 320.220151 320.220151C768.528363 625.133779 625.133779 768.528363 448.308212 768.528363z" p-id="18479" fill="#ffffff"></path></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -12,6 +12,10 @@ enum Api {
UpdatePicName = '/api/AirportMaintenance/UpdatePicName',
// 修改地图图片parentkey
UpdatePicParentKey = '/api/AirportMaintenance/UpdatePicParentKey',
// 获取媒体库目录树-用于移动文件夹
ListMediaFolder = '/api/Manage/ListMediaFolder',
// 媒体库新建文件夹
CreateMediaFolder = '/api/Manage/CreateMediaFolder',
// 获取地图标注列表
GetAnnotationList = '/api/Manage/GetAnnotationList',
@ -75,6 +79,20 @@ export function UpdatePicParentKey(params) {
params
});
}
// 获取媒体库目录树-用于移动文件夹
export function ListMediaFolder(params) {
return defHttp.get({
url: Api.ListMediaFolder,
params
});
}
// 媒体库新建文件夹
export function CreateMediaFolder(params) {
return defHttp.post({
url: Api.CreateMediaFolder + '?name=' + params.name + '&parentKey=' + params.parentKey,
params
});
}
// 获取地图标注列表
export function GetAnnotationList(params) {

@ -14,7 +14,6 @@
@setNowShowAnnotationData="setNowShowAnnotationData"
@setNowShowImageData="setNowShowImageData"
@setNowShowAreaData="setNowShowAreaData"
@setAllAnnotationData="setAllAnnotationData"
@setAllAreaData="setAllAreaData"
@deleteAnnotation="deleteAnnotation"
@deleteArea="deleteArea"
@ -28,14 +27,10 @@
:nowShowAnnotationData="nowShowAnnotationData"
:allAreaDataList="allAreaDataList"
:nowShowAreaData="nowShowAreaData"
:allImageDataList="allImageDataList"
:nowShowImageData="nowShowImageData"
@setNowShowAnnotationData="setNowShowAnnotationData"
@setNowShowImageData="setNowShowImageData"
@setNowShowAreaData="setNowShowAreaData"
@setAllAnnotationData="setAllAnnotationData"
@setAllAreaData="setAllAreaData"
@closePathImageInfo="closePathImageInfo"
/>
</div>
<!-- 地图作业区域 -->
@ -55,7 +50,6 @@
import { ref, computed, onMounted } from 'vue';
import { PathLeftMenu, PathMap, PathAreaInfo } from './path';
import { cloneDeep } from 'lodash-es';
import imageJson from './json/image.json';
import {
GetWorkspaceList,
DeleteAnnotation,
@ -118,11 +112,6 @@
}
nowShowAnnotationData.value = value;
}
//
function setAllAnnotationData() {
//
}
//
function deleteAnnotation(value) {
@ -209,13 +198,8 @@
});
}
//
function closePathImageInfo() {
}
//
const nowShowImageData = ref();
const allImageDataList = ref(imageJson);
//
function setNowShowImageData(value) {
@ -281,11 +265,6 @@
// width: auto;
}
.annotationInfoDiv {
position: relative;
height: 100%;
width: 320px;
}
.areaInfoDiv {
position: relative;
@ -293,13 +272,6 @@
width: 320px;
}
.imageInfoDiv {
position: relative;
height: 100%;
// width: 37%;
width: 720px;
// min-width: 720px;
}
}
</style>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,34 +1,42 @@
<template>
<div class="imageDiv_">
<div class="imageDiv_Comparison">
<div class="imageDiv_Comparison" style="overflow: hidden">
<div class="imageDiv_Comparison_title">视窗1</div>
<div class="imageDiv_Comparison_1">1</div>
<div
ref="mouseCanvasRef"
@mousedown="onMouseDown"
ref="mouseCanvasRef_1"
class="dragModal_1"
@wheel="onWheel"
@mousedown="onMouseDown($event, '1')"
:style="{
position: 'relative',
transform: `scale(${scale}) rotate(${rotationAngle}deg)`,
transition: 'transform 0.2s',
width: `100%`,
height: `100%`,
background: `url(${nowImageGroup?.show1?.url}) no-repeat`,
background: `url(${nowImageGroup?.show1?.url}) no-repeat center center`,
backgroundSize: 'contain',
backgroundPosition: 'center',
}"
/>
</div>
<div class="imageDiv_Comparison">
<div class="imageDiv_Comparison" style="overflow: hidden">
<div class="imageDiv_Comparison_title">视窗2</div>
<div class="imageDiv_Comparison_2">2</div>
<div
ref="mouseCanvasRef"
@mousedown="onMouseDown"
ref="mouseCanvasRef_2"
class="dragModal_2"
@wheel="onWheel"
@mousedown="onMouseDown($event, '2')"
:style="{
position: 'relative',
transform: `scale(${scale}) rotate(${rotationAngle}deg)`,
transition: 'transform 0.2s',
width: `100%`,
height: `100%`,
background: `url(${nowImageGroup?.show2?.url}) no-repeat`,
background: `url(${nowImageGroup?.show2?.url}) no-repeat center center`,
backgroundSize: 'contain',
backgroundPosition: 'center',
}"
/>
</div>
@ -94,11 +102,11 @@
<RotateLeftOutlined @click="rotateCounterClockwise" />
</a-tooltip>
</div>
<!-- 刷新 -->
<!-- 复位刷新 -->
<div class="button">
<a-tooltip placement="top">
<template #title>
<span>刷新</span>
<span>复位刷新</span>
</template>
<RedoOutlined @click="refresh" />
</a-tooltip>
@ -192,8 +200,6 @@
// ----------------------------------
onMounted(() => {
nowImageGroup.value = props.nowRecord.imageGroup[0];
console.log(nowImageGroup.value);
getNowImageGroup();
});
watch(
@ -250,10 +256,86 @@
function rotateCounterClockwise() {
rotationAngle.value -= 90; // -90
}
//
// +
function refresh() {
scale.value = 1;
rotationAngle.value = 0;
//
const dragDocument1: any = document.querySelector('.dragModal_1');
if (dragDocument1) {
dragDocument1.style.left = 0 + 'px';
dragDocument1.style.top = 0 + 'px';
}
const dragDocument2: any = document.querySelector('.dragModal_2');
if (dragDocument2) {
dragDocument2.style.left = 0 + 'px';
dragDocument2.style.top = 0 + 'px';
}
}
const mouseCanvasRef_1 = ref();
const mouseCanvasRef_2 = ref();
//
function onWheel(event) {
const delta = event.deltaY || event.detail || event.wheelDelta;
//
if (delta < 0) {
//
scale.value += 0.1;
} else if (scale.value > 0.5) {
//
scale.value -= 0.1;
}
}
//
const isDragging = ref(false);
let initialMouseX;
let initialMouseY;
let initialDocumentX_1;
let initialDocumentY_1;
let initialDocumentX_2;
let initialDocumentY_2;
//
function onMouseDown(event, num) {
const dragDocument1: any = document.querySelector('.dragModal_1');
const dragDocument2: any = document.querySelector('.dragModal_2');
isDragging.value = true;
initialMouseX = event.clientX;
initialMouseY = event.clientY;
initialDocumentX_1 = dragDocument1.offsetLeft;
initialDocumentY_1 = dragDocument1.offsetTop;
initialDocumentX_2 = dragDocument2.offsetLeft;
initialDocumentY_2 = dragDocument2.offsetTop;
dragDocument1.style.cursor = 'grabbing';
dragDocument2.style.cursor = 'grabbing';
window.addEventListener('mousemove', onMouseMove);
window.addEventListener('mouseup', onMouseUp);
}
// -
function onMouseMove(event) {
const dragDocument1: any = document.querySelector('.dragModal_1');
const dragDocument2: any = document.querySelector('.dragModal_2');
if (isDragging.value) {
const deltaX = event.clientX - initialMouseX;
const deltaY = event.clientY - initialMouseY;
dragDocument1.style.left = initialDocumentX_1 + deltaX + 'px';
dragDocument1.style.top = initialDocumentY_1 + deltaY + 'px';
dragDocument2.style.left = initialDocumentX_2 + deltaX + 'px';
dragDocument2.style.top = initialDocumentY_2 + deltaY + 'px';
}
}
// -
function onMouseUp(event) {
const dragDocument1: any = document.querySelector('.dragModal_1');
const dragDocument2: any = document.querySelector('.dragModal_2');
isDragging.value = false;
if (dragDocument1) {
dragDocument1.style.cursor = 'default';
}
if (dragDocument2) {
dragDocument2.style.cursor = 'default';
}
}
</script>
<style lang="less" scoped>

@ -3,12 +3,24 @@
<div class="modalChooseObject_title">选择检测对象</div>
<div class="modalChooseObject_select">
<div class="modalChooseObject_select_title"> 1 选择航线</div>
<div class="modalChooseObject_select_">
<div class="modalChooseObject_select_choose">
<a-select
v-model:value="value"
style="width: 200px"
:options="hangxianOptions"
placeholder="选择航线"
placeholder="选择项目"
></a-select>
<a-select
v-model:value="value"
style="width: 200px"
:options="hangxianOptions"
placeholder="选择任务"
></a-select>
<a-select
v-model:value="value"
style="width: 200px"
:options="hangxianOptions"
placeholder="选择计划"
></a-select>
</div>
</div>
@ -165,7 +177,7 @@
font-size: 16px;
}
.modalChooseObject_select_ {
.modalChooseObject_select_choose {
padding-bottom: 15px;
display: flex;
align-items: center;

@ -22,7 +22,7 @@
</a-button>
<a-button :icon="h(ColumnHeightOutlined)" @click="moveFolderOrFile"></a-button>
<a-button :icon="h(DeleteOutlined)" @click="deleteFolderOrFile"> </a-button>
<a-button :icon="h(DownloadOutlined)" @click="compressFolderOrFile"></a-button>
<!-- <a-button :icon="h(DownloadOutlined)" @click="compressFolderOrFile"></a-button> -->
<a-radio-group v-model:value="tableType">
<a-radio-button value="table"><BarsOutlined /></a-radio-button>
<a-radio-button value="store"><AppstoreOutlined /></a-radio-button>
@ -115,7 +115,7 @@
<EditOutlined @click="renameRecord(record)" />
</a-button>
</a-tooltip>
<a-tooltip placement="top">
<!-- <a-tooltip placement="top">
<template #title>
<span>
{{ record.showOnMap == 1 ? '在地图上取消加载' : '在地图上加载' }}
@ -137,19 +137,15 @@
v-html="svg_showOnMap_0"
/>
</a-button>
</a-tooltip>
</a-tooltip> -->
<a-tooltip placement="top">
<template #title>
<div>查看地图图片历史路径</div>
<div>只展示在地图上加载的图片</div>
<!-- <div>只展示在地图上加载的图片</div> -->
</template>
<a-button
type="text"
v-if="
record.objectKey &&
record.objectKey.includes('.jpeg') &&
record.showOnMap == 1
"
v-if="record.objectKey && record.objectKey.includes('.jpeg')"
>
<BorderInnerOutlined @click="showPathDiv(record)" />
</a-button>
@ -263,32 +259,10 @@
:previewRecordList="previewRecordList"
@chooseNowPreviewRecord="chooseNowPreviewRecord"
@closeModal="closeModal"
@handleSuccess="handleSuccess"
@handleSuccessPreview="handleSuccessPreview"
@openPathModal="openPathModal"
/>
</a-modal>
<!-- 路径地图弹窗 -->
<a-modal
v-model:open="pathOpen"
width="100%"
wrap-class-name="full-modal"
:centered="true"
:closable="false"
:footer="null"
:destroyOnClose="true"
:keyboard="false"
:mask="false"
:maskClosable="false"
>
<Path
:pathDivShow="pathDivShow"
:allImageDataList="allImageDataList"
:nowShowImageData="nowShowImageData"
:floderName="floderName"
@closePathModal="closePathModal"
@handleSuccessPath="handleSuccessPath"
/>
</a-modal>
<!-- 变化检测弹窗 -->
<a-modal
v-model:open="comparisonOpen"
@ -321,7 +295,6 @@
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import { useModal } from '@/components/Modal';
import { useMessage } from '@/hooks/web/useMessage';
import {
EditOutlined,
DeleteOutlined,
@ -337,7 +310,6 @@
PlaySquareTwoTone,
FileOutlined,
BorderInnerOutlined,
YoutubeOutlined,
} from '@ant-design/icons-vue';
import {
GetMediaFile,
@ -353,6 +325,7 @@
import { AddFolderModal, MoveFileModal, CompressFileModal, RenameModal } from './modal/modal';
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { getAppEnvConfig } from '@/utils/env';
import { useMessage } from '@/hooks/web/useMessage';
import { columns, searchFormSchema, svg_showOnMap_0, svg_showOnMap_1 } from './modal.data';
import dayjs from 'dayjs';
import { cloneDeep } from 'lodash-es';
@ -551,16 +524,6 @@
});
}
function getImageDimensions(url, callback) {
const img = new Image();
img.src = url;
img.onload = function () {
const width = img.width;
const height = img.height;
callback({ width: width, height: height });
};
}
// ----------------------------------------------------------------------
//
function handleSelect(orgId = '') {
@ -569,7 +532,7 @@
}
//
const childRef = ref<any>();
function handleSuccess(record = null) {
function handleSuccessPreview(record = null) {
clearSelectedRowKeys();
childRef.value.fetch();
reload();
@ -610,17 +573,25 @@
const [compressFileModal, { openModal: openCompressFileModal }] = useModal();
//
const [renameModal, { openModal: openRenameModal }] = useModal();
//
function handleSuccess(record = null) {
clearSelectedRowKeys();
childRef.value.fetch();
reload();
}
//
function addFolder() {
// openAddFolderModal(true, {
// record,
// });
openAddFolderModal(true, {
parentKey: nowParentKey.value,
});
}
//
function moveFolderOrFile() {
let rows = getSelectRows();
if (rows.length > 0) {
if (rows.some((item) => item.parentKey == '0' && !item.objectKey)) {
return createMessage.warn('根目录的文件夹不能移动!');
}
const records = rows;
openMoveFileModal(true, {
records,
@ -629,19 +600,6 @@
return createMessage.warn('请选择一个或者多个文件/文件夹进行移动');
}
}
//
function compressFolderOrFile() {
// let rows = getSelectRows();
// if (rows.length > 0) {
// const record = rows;
// openCompressFileModal(true, {
// tableData: getDataSource(),
// record,
// });
// } else {
// return createMessage.warn('/');
// }
}
//
function renameRecord(record) {
openRenameModal(true, {
@ -677,23 +635,6 @@
});
}
//
function funShowOnMap(record) {
UpdatePicStatus({
id: record.id,
fileTags: record.fileTags,
graffitiJson: record.graffitis,
display: record.showOnMap == 1 ? 0 : 1,
showOnMap: record.showOnMap == 1 ? 0 : 1,
}).then((res) => {
if (record.showOnMap == 1) {
createMessage.success('在地图上取消加载成功');
} else {
createMessage.success('在地图上加载成功');
}
reload();
});
}
// ----------------------------------------------------------------------------
const open = ref(false);
//
@ -787,38 +728,11 @@
comparisonOpen.value = false;
}
// ----------------------------------------------------------------------
const pathOpen = ref(false);
//
// ----------------------------------------------------------------------
//
const floderName = ref('');
const nowShowImageData = ref({});
const allImageDataList: any = ref([]);
function openPathModal(record) {
GetMediaFile({
parentKey: record.parentKey,
page: 1,
limit: 1000,
}).then((res) => {
allImageDataList.value = res.items.filter(
(item) => item.objectKey && item.objectKey.includes('.jpeg'),
);
allImageDataList.value.forEach((arr) => {
if (arr.fileTags) {
arr.fileTags = JSON.parse(arr.fileTags);
} else {
arr.fileTags = [];
}
if (arr.graffitiJson) {
arr.graffitiJson = JSON.parse(arr.graffitiJson);
} else {
arr.graffitiJson = [];
}
});
nowShowImageData.value = allImageDataList.value.find((item) => item.id == record.id);
floderName.value = floders.value[floders.value.length - 1].name;
pathOpen.value = true;
});
}
//
const pathDivShow = ref(false);
function showPathDiv(record) {
@ -850,14 +764,12 @@
//
function closePathModal() {
nowShowImageData.value = {};
pathOpen.value = false;
pathDivShow.value = false;
}
//
function handleSuccessPath(value) {
setTimeout(() => {
pathDivShow.value ? showPathDiv(value) : openPathModal(value);
// openPathModal(value);
showPathDiv(value);
reload();
}, 500);
}

@ -1,58 +1,65 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" title="新建文件夹" @ok="handleSubmit">
<BasicForm @register="registerForm" />
<BasicModal
v-bind="$attrs"
@register="registerModal"
title="在当前文件夹下创建新文件夹"
@ok="handleSubmit"
>
<div style="height: 3vh">
<a-row style="width: 100%">
<a-col :span="5" class="col"> 新文件夹名 </a-col>
<a-col :span="19" class="col">
<a-input v-model:value="newname" placeholder="请输入新文件夹名称"></a-input>
</a-col>
</a-row>
</div>
</BasicModal>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { BasicModal, useModalInner } from '@/components/Modal';
import { BasicForm, useForm } from '@/components/Form';
import { addFolderSchema } from '../modal.data';
import { orgPosGroup } from '@/api/demo/system';
import { CreateMediaFolder } from '@/api/demo/mediaLibrary';
import { FolderOpenOutlined } from '@ant-design/icons-vue';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
const emit = defineEmits(['success']);
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 100,
baseColProps: { span: 24 },
schemas: addFolderSchema,
showActionButtonGroup: false,
});
const emits = defineEmits(['handleSuccess']);
// id
let folderId = ref();
let parentKey = ref();
const newname = ref();
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
resetFields();
setModalProps({ confirmLoading: false });
folderId.value = data.record?.id;
setFieldsValue({
...data.record,
});
parentKey = data.parentKey;
newname.value = null;
});
//
async function handleSubmit() {
if (!newname.value) {
return createMessage.warn('新文件名不能为空');
}
try {
const values = await validate();
let query = {
folderId: folderId.value,
newName: values.newName,
};
//
const data = await orgPosGroup(query);
if (data) {
setModalProps({ confirmLoading: true });
closeModal();
emit('success');
return createMessage.success('成功');
} else {
return createMessage.error('失败');
}
CreateMediaFolder({
name: newname.value,
parentKey: parentKey,
}).then((res) => {
if (res) {
createMessage.success('创建新文件夹成功!');
emits('handleSuccess');
closeModal();
}
});
} finally {
setModalProps({ confirmLoading: false });
}
}
</script>
<style lang="less" scoped>
.col {
display: flex;
align-items: center;
justify-content: center;
}
</style>

@ -1,168 +1,98 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" title="移动文件" @ok="handleSubmit">
<BasicTable @register="registerTable">
<template #toolbar>
<span v-for="(f, index) in floders" :key="f.id" class="floderTitle">
<span v-if="f.name != '全部文件'" style="margin-right: 10px"> / </span>
<a-tooltip placement="top">
<template #title>
<span>{{ f.name }}</span>
</template>
<span class="flodersname" @click="getChildrenByProp(f, index)"> {{ f.name }}</span>
</a-tooltip>
</span>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'name'">
<FolderOpenOutlined v-if="!record.objectKey" style="font-size: 20px" />
<span
v-if="!record.objectKey || (record.objectKey && record.objectKey.includes('jpeg'))"
@click="lookRecord(record)"
@mouseover="record.isHovered = true"
@mouseout="record.isHovered = false"
:style="{
textDecoration: record.isHovered ? 'underline' : 'none',
marginLeft: '5px',
}"
>
{{ record.name }}
</span>
<div style="height: 50vh; overflow-y: auto">
<a-tree
class="draggable-tree"
show-icon
draggable
block-node
default-expand-all
:tree-data="treeData"
v-model:selectedKeys="selectedKeys"
:fieldNames="{ children: 'children', title: 'name', key: 'id' }"
>
<template #icon="{}">
<FolderOpenOutlined />
</template>
</template>
</BasicTable>
<!-- <a-tree v-model:selectedKeys="selectedKeys" show-line :tree-data="treeData"> </a-tree> -->
</a-tree>
</div>
</BasicModal>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { BasicModal, useModalInner } from '@/components/Modal';
import { FolderOutlined, FolderOpenOutlined } from '@ant-design/icons-vue';
import { GetMediaFile, UpdatePicParentKey } from '@/api/demo/mediaLibrary';
import type { TreeProps } from 'ant-design-vue';
import { ListMediaFolder, UpdatePicParentKey } from '@/api/demo/mediaLibrary';
import { FolderOpenOutlined } from '@ant-design/icons-vue';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
const emit = defineEmits(['handleSuccess']);
const emits = defineEmits(['handleSuccess']);
// // id
const moveDataList: any = ref([]);
const selectedKeys: any = ref<string[]>();
const treeData: any = ref([
{
title: '全部文件',
key: '0',
children: [],
},
]);
function funGetMediaFile() {}
const treeData: any = ref([]);
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
setModalProps({ confirmLoading: false });
moveDataList.value = data.records;
ListMediaFolder({}).then((res) => {
treeData.value = res;
});
});
const floders = ref([
{
id: '0',
name: '全部文件',
},
]);
const nowParentKey = ref('0');
const [
registerTable,
{ reload, getDataSource, getSelectRows, setSelectedRows, clearSelectedRowKeys },
] = useTable({
api: GetMediaFile,
rowKey: 'id',
columns: [
{
title: '文件名称',
dataIndex: 'name',
align: 'left',
width: 200,
},
],
rowSelection: {
type: 'radio',
},
isTreeTable: false,
striped: false,
bordered: false,
inset: false,
useSearchForm: false,
showIndexColumn: false,
showTableSetting: false,
beforeFetch: (data) => {
//
let temp = {
...data,
parentKey: nowParentKey.value,
};
return temp;
},
afterFetch: (res) => {
let result: any = [];
res.forEach((arr, index) => {
if (!arr.objectKey) {
result.push(arr);
}
});
return result;
},
});
//
function getChildrenByProp(f, index) {
nowParentKey.value = f.id;
floders.value = floders.value.splice(0, index + 1);
clearSelectedRowKeys();
reload();
}
// -
async function lookRecord(record) {
if (!record.objectKey) {
nowParentKey.value = record.id;
floders.value.push({
id: nowParentKey.value,
name: record.name,
});
reload();
}
}
//
async function handleSubmit() {
try {
let selectKeys = getSelectRows();
if (moveDataList.value.some((item) => item.id == selectedKeys.value)) {
return createMessage.warn('文件不能移动到自己文件夹内');
}
let flag = true;
moveDataList.value.forEach((movedata) => {
UpdatePicParentKey({ id: movedata.id, ParentKey: selectKeys[0].id }).then((res) => {
console.log(res);
// return;
});
if (!movedata.objectKey) {
//
//
let tempTreeData = findNodeById(treeData.value, movedata.id);
let list: any = [];
list.push(tempTreeData);
//
let tempTreeData2 = findNodeById(list, selectedKeys.value[0], 'parentKey');
if (tempTreeData2 && tempTreeData2.id != movedata.id) {
flag = false;
}
}
});
// if (!ids.includes(key)) {
// let query = {
// moveIds: ids,
// key: key,
// };
// //
// const data = await orgPosGroup(query);
// if (data) {
// setModalProps({ confirmLoading: true });
// closeModal();
// emit('handleSuccess');
// return createMessage.success('');
// } else {
// return createMessage.error('');
// }
// } else {
// return createMessage.warn('');
// }
if (flag) {
moveDataList.value.forEach((movedata, index) => {
UpdatePicParentKey({ id: movedata.id, ParentKey: selectedKeys.value[0] }).then((res) => {
if (index == moveDataList.value.length - 1) {
createMessage.success('移动成功!');
emits('handleSuccess');
closeModal();
}
});
});
} else {
return createMessage.warn('文件夹不能移动到自己文件夹的子文件夹内');
}
} finally {
setModalProps({ confirmLoading: false });
}
}
function findNodeById(tree, targetId, idKey = 'id') {
//
for (const node of tree) {
if (node[idKey] === targetId) {
return node; // children
}
// children
if (node.children && Array.isArray(node.children)) {
const found = findNodeById(node.children, targetId, idKey);
if (found) return found;
}
}
return null;
}
</script>
<style lang="less" scoped>

@ -449,7 +449,7 @@
</a-tooltip>
</div>
<!-- 加载到地图上 -->
<div class="button2">
<!-- <div class="button2">
<a-popconfirm
placement="top"
title="您是否将该照片在地图上取消加载?取消后照片将不在地图上显示。"
@ -491,13 +491,11 @@
</svg>
</a-tooltip>
</a-popconfirm>
</div>
</div> -->
</div>
<div class="imageChooseList">
<div
v-for="li in props.allImageDataList.filter(
(item) => item.display == 1 && item.showOnMap == 1,
)"
v-for="li in props.allImageDataList.filter((item) => item.display == 1)"
:key="li.id"
@click="setNowShowImageData(li)"
>
@ -663,7 +661,7 @@
// --------------------------------------------------------------
function clickLeftOrRightButton(direction) {
const list = props.allImageDataList.filter((item) => item.display == 1 && item.showOnMap == 1);
const list = props.allImageDataList.filter((item) => item.display == 1);
for (let index = 0; index < list.length; index++) {
if (list[index].id == props.nowShowImageData.id) {
if (direction == 'left') {
@ -783,29 +781,29 @@
function handlerLocation() {
emits('handlerLocation', props.nowShowImageData);
}
//
function funShowOnMap() {
if (props.nowShowImageData.showOnMap == 1) {
props.nowShowImageData.showOnMap = 0;
} else {
props.nowShowImageData.showOnMap = 1;
}
UpdatePicStatus({
id: props.nowShowImageData.id,
fileTags: JSON.stringify(fileTags.value),
graffitiJson: JSON.stringify(graffitis.value),
display: props.nowShowImageData.display,
showOnMap: props.nowShowImageData.showOnMap,
}).then((res) => {
if (props.nowShowImageData.showOnMap == 1) {
createMessage.success('在地图上加载成功');
} else {
createMessage.success('在地图上取消加载成功');
}
emits('funUpdateDisplayOrShowOnMapData', props.nowShowImageData);
emits('handleSuccessPath', props.nowShowImageData);
});
}
// //
// function funShowOnMap() {
// if (props.nowShowImageData.showOnMap == 1) {
// props.nowShowImageData.showOnMap = 0;
// } else {
// props.nowShowImageData.showOnMap = 1;
// }
// UpdatePicStatus({
// id: props.nowShowImageData.id,
// fileTags: JSON.stringify(fileTags.value),
// graffitiJson: JSON.stringify(graffitis.value),
// display: props.nowShowImageData.display,
// showOnMap: props.nowShowImageData.showOnMap,
// }).then((res) => {
// if (props.nowShowImageData.showOnMap == 1) {
// createMessage.success('');
// } else {
// createMessage.success('');
// }
// emits('funUpdateDisplayOrShowOnMapData', props.nowShowImageData);
// emits('handleSuccessPath', props.nowShowImageData);
// });
// }
// -----------------------------------------------
function setNowShowImageData(value) {

@ -113,7 +113,7 @@
</template>
<AimOutlined @click="handlerLocation(show)" />
</a-tooltip>
<a-popconfirm
<!-- <a-popconfirm
placement="right"
title="您是否将该照片在地图上取消加载?取消后照片将不在地图上显示。"
ok-text="确认"
@ -131,7 +131,7 @@
<div v-if="show.showOnMap != 1" class="svg-container" v-html="showOnMap_0" />
</div>
</a-tooltip>
</a-popconfirm>
</a-popconfirm> -->
</div>
</div>
</div>
@ -248,8 +248,8 @@
//
const searchValue = ref('');
function handleChangeImageSearch() {
// let filterImageData = props.allImageDataList;
let filterImageData = props.allImageDataList.filter((item) => item.showOnMap == 1);
let filterImageData = props.allImageDataList;
// let filterImageData = props.allImageDataList.filter((item) => item.showOnMap == 1);
//
if (tagSelect.value.length > 0) {
tagSelect.value.forEach((tag) => {
@ -302,13 +302,13 @@
//
function funShowOnMapOrDisplay(show, type) {
if (type == 'showOnMap') {
if (show.showOnMap == 1) {
show.showOnMap = 0;
} else {
show.showOnMap = 1;
}
}
// if (type == 'showOnMap') {
// if (show.showOnMap == 1) {
// show.showOnMap = 0;
// } else {
// show.showOnMap = 1;
// }
// }
if (type == 'display') {
if (show.display == 1) {
show.display = 0;
@ -323,13 +323,13 @@
display: show.display,
showOnMap: show.showOnMap,
}).then((res) => {
if (type == 'showOnMap') {
if (show.showOnMap) {
createMessage.success('在地图上加载成功');
} else {
createMessage.success('在地图上取消加载成功');
}
}
// if (type == 'showOnMap') {
// if (show.showOnMap) {
// createMessage.success('');
// } else {
// createMessage.success('');
// }
// }
emits('handleSuccessPath');
emits('funUpdateDisplayOrShowOnMapData', show);
});

@ -304,38 +304,26 @@
// -
flightointGraphicData.forEach((graphicLayer) => {
if (graphicLayer.options.id == newValue.id + '_flight') {
if (newValue.showOnMap == 1) {
if (newValue.id == props.nowShowImageData.id) {
graphicLayer.show = newValue.display == 1 ? true : false;
}
} else {
graphicLayers.removeGraphic(graphicLayer);
if (newValue.id == props.nowShowImageData.id) {
graphicLayer.show = newValue.display == 1 ? true : false;
}
}
});
// -线
bottomImagePolylineGraphicData.forEach((graphicLayer) => {
if (graphicLayer.options.id == newValue.id + '_polyline') {
if (newValue.showOnMap == 1) {
graphicLayer.show = newValue.display == 1 ? true : false;
} else {
graphicLayers.removeGraphic(graphicLayer);
}
graphicLayer.show = newValue.display == 1 ? true : false;
}
});
// -
imageGraphicData.forEach((graphicLayer) => {
if (graphicLayer.options.id == newValue.id + '_image') {
if (newValue.showOnMap == 1) {
graphicLayer.show = newValue.display == 1 ? true : false;
graphicLayer.setStyle({
label: {
text: `${newValue.name}`,
},
});
} else {
graphicLayers.removeGraphic(graphicLayer);
}
graphicLayer.show = newValue.display == 1 ? true : false;
graphicLayer.setStyle({
label: {
text: `${newValue.name}`,
},
});
}
});
}
@ -370,7 +358,7 @@
// -
let rotation = 0;
props.allImageDataList.forEach((item, index) => {
if (item.lng && item.lat && item.absoluteAltitude && item.showOnMap == 1) {
if (item.lng && item.lat && item.absoluteAltitude) {
const image = new Image();
image.crossOrigin = 'Anonymous';
if (item.minipic) {

@ -28,7 +28,7 @@
:nowPreviewRecord="props.nowPreviewRecord"
:previewRecordList="props.previewRecordList"
@chooseNowPreviewRecord="chooseNowPreviewRecord"
@handleSuccess="handleSuccess"
@handleSuccessPreview="handleSuccessPreview"
@setHideOrShowTextboxFlag="setHideOrShowTextboxFlag"
/>
</div>
@ -43,7 +43,7 @@
:nowPreviewRecord="props.nowPreviewRecord"
:previewRecordList="props.previewRecordList"
@chooseNowPreviewRecord="chooseNowPreviewRecord"
@handleSuccess="handleSuccess"
@handleSuccessPreview="handleSuccessPreview"
/>
</div>
</div>
@ -55,7 +55,7 @@
:nowPreviewRecord="props.nowPreviewRecord"
:previewRecordList="props.previewRecordList"
@chooseNowPreviewRecord="chooseNowPreviewRecord"
@handleSuccess="handleSuccess"
@handleSuccessPreview="handleSuccessPreview"
:hideOrShowTextboxFlag="hideOrShowTextboxFlag"
@openPathModal="openPathModal"
/>
@ -66,7 +66,7 @@
:nowPreviewRecord="props.nowPreviewRecord"
:previewRecordList="props.previewRecordList"
@chooseNowPreviewRecord="chooseNowPreviewRecord"
@handleSuccess="handleSuccess"
@handleSuccessPreview="handleSuccessPreview"
/>
</div>
</div>
@ -86,7 +86,7 @@
const emits = defineEmits([
'closeModal',
'chooseNowPreviewRecord',
'handleSuccess',
'handleSuccessPreview',
'openPathModal',
]);
@ -100,8 +100,8 @@
emits('chooseNowPreviewRecord', value);
}
//
function handleSuccess(record = null) {
emits('handleSuccess', record);
function handleSuccessPreview(record = null) {
emits('handleSuccessPreview', record);
}
//
function closeModal() {

@ -327,7 +327,7 @@
</a-tooltip>
</div>
<!-- 加载到地图上 -->
<div class="button2" @click="funShowOnMap">
<!-- <div class="button2" @click="funShowOnMap">
<a-tooltip placement="top">
<template #title>
<span>
@ -361,7 +361,7 @@
></path>
</svg>
</a-tooltip>
</div>
</div> -->
<!-- 复制到剪贴板 -->
<div class="button">
<a-tooltip placement="top">
@ -547,7 +547,7 @@
const props = defineProps(['nowPreviewRecord', 'previewRecordList']);
const emits = defineEmits([
'chooseNowPreviewRecord',
'handleSuccess',
'handleSuccessPreview',
'setHideOrShowTextboxFlag',
]);
@ -584,8 +584,8 @@
refresh();
}
//
function handleSuccess(record = null) {
emits('handleSuccess', record);
function handleSuccessPreview(record = null) {
emits('handleSuccessPreview', record);
}
//
const scale = ref(1);
@ -683,7 +683,7 @@
Deletepic({
ids: ids,
}).then((res) => {
handleSuccess(props.nowPreviewRecord);
handleSuccessPreview(props.nowPreviewRecord);
createMessage.success('删除成功');
});
},
@ -700,28 +700,28 @@
}
};
//
function funShowOnMap() {
if (props.nowPreviewRecord.showOnMap == 1) {
props.nowPreviewRecord.showOnMap = 0;
} else {
props.nowPreviewRecord.showOnMap = 1;
}
UpdatePicStatus({
id: props.nowPreviewRecord.id,
fileTags: JSON.stringify(fileTags.value),
graffitiJson: JSON.stringify(graffitis.value),
display: props.nowPreviewRecord.display,
showOnMap: props.nowPreviewRecord.showOnMap,
}).then((res) => {
if (props.nowPreviewRecord.showOnMap == 1) {
createMessage.success('在地图上加载成功');
} else {
createMessage.success('在地图上取消加载成功');
}
emits('handleSuccess');
});
}
// //
// function funShowOnMap() {
// if (props.nowPreviewRecord.showOnMap == 1) {
// props.nowPreviewRecord.showOnMap = 0;
// } else {
// props.nowPreviewRecord.showOnMap = 1;
// }
// UpdatePicStatus({
// id: props.nowPreviewRecord.id,
// fileTags: JSON.stringify(fileTags.value),
// graffitiJson: JSON.stringify(graffitis.value),
// display: props.nowPreviewRecord.display,
// showOnMap: props.nowPreviewRecord.showOnMap,
// }).then((res) => {
// if (props.nowPreviewRecord.showOnMap == 1) {
// createMessage.success('');
// } else {
// createMessage.success('');
// }
// emits('handleSuccessPreview');
// });
// }
//
async function fetchAndDownloadImage(url) {
@ -821,7 +821,7 @@
display: props.nowPreviewRecord.display0,
showOnMap: props.nowPreviewRecord.showOnMap,
}).then((res) => {
emits('handleSuccess');
emits('handleSuccessPreview');
});
}
//
@ -838,7 +838,7 @@
display: props.nowPreviewRecord.display,
showOnMap: props.nowPreviewRecord.showOnMap,
}).then((res) => {
emits('handleSuccess');
emits('handleSuccessPreview');
});
}

@ -188,19 +188,15 @@
<span class="infotitle">照片位置</span>
</a-col>
<a-col :span="17">
<span class="infobutton">
<!-- <span class="infobutton">
<a-tooltip placement="top">
<template #title>
<div>查看地图图片历史路径</div>
<div>只展示在地图上加载的图片</div>
</template>
<EnvironmentOutlined
v-if="props.nowPreviewRecord.showOnMap == 1"
style="font-size: 20px; color: #07aaed"
@click="openPathModal"
/>
<EnvironmentOutlined style="font-size: 20px; color: #07aaed" @click="openPathModal" />
</a-tooltip>
</span>
</span> -->
</a-col>
<a-col :span="24">
<div class="map">
@ -231,7 +227,7 @@
const { createMessage, createConfirm } = useMessage();
const props = defineProps(['nowPreviewRecord', 'previewRecordList', 'hideOrShowTextboxFlag']);
const emits = defineEmits(['chooseNowPreviewRecord', 'handleSuccess', 'openPathModal']);
const emits = defineEmits(['chooseNowPreviewRecord', 'handleSuccessPreview', 'openPathModal']);
// --------------------------------
const editNameFlag = ref(true);
@ -258,7 +254,7 @@
props.nowPreviewRecord.name = newName;
editNameFlag.value = true;
createMessage.success(res);
emits('handleSuccess');
emits('handleSuccessPreview');
});
}
function editNameBlur() {
@ -305,7 +301,7 @@
addFileTagsFlag.value = true;
newFileTagsName.value = '';
createMessage.success('添加标签成功');
emits('handleSuccess');
emits('handleSuccessPreview');
});
} else {
return createMessage.error('此标签已存在!');
@ -333,7 +329,7 @@
showOnMap: props.nowPreviewRecord.showOnMap,
}).then((res) => {
createMessage.success('删除标签成功');
emits('handleSuccess');
emits('handleSuccessPreview');
});
},
onCancel: () => {},
@ -365,10 +361,10 @@
emits('chooseNowPreviewRecord', value);
}
//
function openPathModal() {
emits('openPathModal', props.nowPreviewRecord);
}
// //
// function openPathModal() {
// emits('openPathModal', props.nowPreviewRecord);
// }
</script>
<style lang="less" scoped>
.title {

@ -66,7 +66,7 @@
const { createConfirm, createMessage } = useMessage();
const props = defineProps(['nowPreviewRecord', 'previewRecordList']);
const emits = defineEmits(['chooseNowPreviewRecord', 'handleSuccess']);
const emits = defineEmits(['chooseNowPreviewRecord', 'handleSuccessPreview']);
//
function clickLeftOrRightButton(direction) {
@ -129,7 +129,7 @@
Deletepic({
ids: ids,
}).then((res) => {
handleSuccess(props.nowPreviewRecord);
handleSuccessPreview(props.nowPreviewRecord);
createMessage.success(res);
});
},
@ -137,8 +137,8 @@
}
//
function handleSuccess(record = null) {
emits('handleSuccess', record);
function handleSuccessPreview(record = null) {
emits('handleSuccessPreview', record);
}
//
function chooseNowPreviewRecord(value) {

@ -175,7 +175,7 @@
const { createMessage } = useMessage();
const props = defineProps(['nowPreviewRecord', 'previewRecordList']);
const emits = defineEmits(['chooseNowPreviewRecord', 'handleSuccess']);
const emits = defineEmits(['chooseNowPreviewRecord', 'handleSuccessPreview']);
// --------------------------------
const editNameFlag = ref(true);
@ -202,7 +202,7 @@
props.nowPreviewRecord.name = newName;
editNameFlag.value = true;
createMessage.success(res);
emits('handleSuccess');
emits('handleSuccessPreview');
});
}
function editNameBlur() {
@ -246,7 +246,7 @@
addFileTagsFlag.value = true;
newFileTagsName.value = '';
createMessage.success('添加标签成功');
emits('handleSuccess');
emits('handleSuccessPreview');
});
} else {
return createMessage.error('此标签已存在!');
@ -264,7 +264,7 @@
showOnMap: props.nowPreviewRecord.showOnMap,
}).then((res) => {
createMessage.success('删除标签成功');
emits('handleSuccess');
emits('handleSuccessPreview');
});
}

@ -2,7 +2,16 @@
<div>
<div class="map-out-container">
<div class="map-inner-container">
<Map :workPlanFormShow="workPlanFormShow" :editMode="editMode" :airLineForm="airLineForm" @exitDraw="exitDraw" @flyToThere="flyToThere" :wayline="wayline" :waylineInfo="waylineInfo"></Map>
<Map
:workPlanFormShow="workPlanFormShow"
:editMode="editMode"
:airLineForm="airLineForm"
@exitDraw="exitDraw" @flyToThere="flyToThere"
:wayline="wayline"
:waylineInfo="waylineInfo"
:templateKmlConfig="templateKmlConfig"
:waylineWpmlConfig="waylineWpmlConfig"
></Map>
</div>
</div>
@ -42,7 +51,7 @@ const emits = defineEmits(["updateAirLineLise"])
// add edit detail
const editMode = ref("add");
// 线
// airLine form
const airLineForm = ref({
"id": null,
"airLineName": null,
@ -62,9 +71,185 @@ const airLineForm = ref({
"wpml": null,
"taskOffLng": 0,
"taskOffLat": 0,
"folder": null
});
"folder": null,
"lineData":null,
});
// template.kml
const templateKmlConfig = ref({
"author": 17861857725,
"createTime": 1749689844431,
"updateTime": 1753241338101,
"missionConfig": {
"flyToWaylineMode": "pointToPoint",
"finishAction": "goHome",
"exitOnRCLost": "goContinue",
"executeRCLostAction": "goBack",
"takeOffSecurityHeight": 20,
"takeOffRefPoint": "35.134383,118.302109,74.787731",
"takeOffRefPointAGLHeight": 4.169064385,
"globalTransitionalSpeed": 15,
"globalRTHHeight": 100,
"droneInfo": {
"droneEnumValue": 100,
"droneSubEnumValue": 1
},
"autoRerouteInfo": {
"transitionalAutoRerouteMode": 1,
"missionAutoRerouteMode": 1
},
"waylineAvoidLimitAreaMode": 0,
"payloadInfo": {
"payloadEnumValue": 99,
"payloadSubEnumValue": 0,
"payloadPositionIndex": 0
}
},
"Folder": {
"templateType": "mapping2d",
"templateId": 0,
"waylineCoordinateSysParam": {
"coordinateMode": "WGS84",
"heightMode": "EGM96",
"globalShootHeight": 90,
"surfaceFollowModeEnable": 1,
"isRealtimeSurfaceFollow": 0,
"surfaceRelativeHeight": 90,
"dsmFile": "wpmz/res/dsm/wgs84_ASTGTMV003_N35E118_dem_7.tif"
},
"autoFlightSpeed": 12.7,
"Placemark": {
"caliFlightEnable": 0,
"elevationOptimizeEnable": 1,
"smartObliqueEnable": 0,
"quickOrthoMappingEnable": 0,
"facadeWaylineEnable": 0,
"isLookAtSceneSet": 0,
"shootType": "time",
"direction": 83,
"margin": 0,
"efficiencyFlightModeEnable": 0,
"overlap": {
"orthoCameraOverlapH": 80,
"orthoCameraOverlapW": 70,
"inclinedCameraOverlapH": 80,
"inclinedCameraOverlapW": 70
},
"Polygon": {
"outerBoundaryIs": {
"LinearRing": {
"coordinates": "118.293794766158,35.1353688096117,0\n 118.295429169407,35.1353304409052,0\n 118.295487507293,35.1332925168381,0\n 118.293672196844,35.1331918267775,0"
}
}
},
"ellipsoidHeight": 90,
"height": 90
},
"payloadParam": {
"payloadPositionIndex": 0,
"focusMode": "firstPoint",
"meteringMode": "average",
"returnMode": "singleReturnStrongest",
"samplingRate": 240000,
"scanningMode": "repetitive",
"imageFormat": "visable",
"photoSize": ""
}
}
})
// wayline.wpml
const waylineWpmlConfig = ref({
"missionConfig": {
"flyToWaylineMode": "pointToPoint",
"finishAction": "goHome",
"exitOnRCLost": "goContinue",
"executeRCLostAction": "goBack",
"takeOffSecurityHeight": 20,
"globalTransitionalSpeed": 15,
"globalRTHHeight": 100,
"droneInfo": {
"droneEnumValue": 100,
"droneSubEnumValue": 1
},
"autoRerouteInfo": {
"transitionalAutoRerouteMode": 1,
"missionAutoRerouteMode": 1
},
"waylineAvoidLimitAreaMode": 0,
"payloadInfo": {
"payloadEnumValue": 99,
"payloadSubEnumValue": 0,
"payloadPositionIndex": 0
}
},
"Folder": {
"templateId": 0,
"executeHeightMode": "WGS84",
"waylineId": 0,
"distance": 1259.17163085938,
"duration": 145.652896165848,
"autoFlightSpeed": 12.7,
"startActionGroup": {
"action": [
{
"actionId": 0,
"actionActuatorFunc": "gimbalRotate",
"actionActuatorFuncParam": {
"gimbalHeadingYawBase": "aircraft",
"gimbalRotateMode": "absoluteAngle",
"gimbalPitchRotateEnable": 1,
"gimbalPitchRotateAngle": -90,
"gimbalRollRotateEnable": 0,
"gimbalRollRotateAngle": 0,
"gimbalYawRotateEnable": 1,
"gimbalYawRotateAngle": 0,
"gimbalRotateTimeEnable": 0,
"gimbalRotateTime": 10,
"payloadPositionIndex": 0
}
},
{
"actionId": 1,
"actionActuatorFunc": "hover",
"actionActuatorFuncParam": {
"hoverTime": 0.5
}
},
{
"actionId": 2,
"actionActuatorFunc": "setFocusType",
"actionActuatorFuncParam": {
"cameraFocusType": "manual",
"payloadPositionIndex": 0
}
},
{
"actionId": 3,
"actionActuatorFunc": "focus",
"actionActuatorFuncParam": {
"focusX": 0,
"focusY": 0,
"focusRegionWidth": 0,
"focusRegionHeight": 0,
"isPointFocus": 0,
"isInfiniteFocus": 1,
"payloadPositionIndex": 0,
"isCalibrationFocus": 0
}
},
{
"actionId": 4,
"actionActuatorFunc": "hover",
"actionActuatorFuncParam": {
"hoverTime": 1
}
}
]
},
"Placemark": []
}
})
//
const currentFolder = ref(null);
@ -262,23 +447,31 @@ element.style.bottom = '40px';
// 线
const startEditAirLine = (wayline,form) => {
const startEditAirLine = (data,form,type) => {
// 线template.kml
templateKmlConfig.value = data.template.kml.Document
// 线wayline.wpml
waylineWpmlConfig.value = data.wayline.kml.Document;
// 线
waylineInfo.value = form;
// 线
airLineForm.value = form;
//
editMode.value = type;
//
workPlanFormShow.value = false;
ariLineShow.value = false;
aircraftShow.value = false;
planListShow.value = false;
createAirLineShow.value = false;
//
editMode.value = "edit";
// 线
waylineInfo.value = wayline;
// 线
airLineForm.value = form;
}

@ -108,10 +108,10 @@
<a-menu-item @click="checkAriLine(item)" v-if="props.title == '选择航线'">
<a href="javascript:;">选择</a>
</a-menu-item>
<a-menu-item @click="airLineDetail(item)" v-if="props.title != '选择航线'">
<a-menu-item @click="toEditAirLine(item,'edit')" v-if="props.title != '选择航线'">
<a href="javascript:;">预览</a>
</a-menu-item>
<a-menu-item @click="toEditAirLine(item)" v-if="props.title != '选择航线'">
<a-menu-item @click="toEditAirLine(item,'edit')" v-if="props.title != '选择航线'">
<a href="javascript:;">编辑</a>
</a-menu-item>
<a-menu-item @click="downloadAirLine(item)" >
@ -364,12 +364,27 @@
const zip = new JSZip();
const contents = await zip.loadAsync(kmzBlob);
// .wmpl
let xmlData = {
wayline:null,
template:null
}
// .wpml .kmz
for (const [filename, file] of Object.entries(contents.files)) {
// wpml
if (filename.toLowerCase().endsWith('.wpml')) {
return await file.async('text');
xmlData.wayline = await file.async('text');
}
// kmz
if (filename.toLowerCase().endsWith('.kml')) {
xmlData.template = await file.async('text');
}
}
return xmlData;
throw new Error('KMZ文件中未找到WMPL文件');
}
@ -533,7 +548,7 @@
//
const toEditAirLine =async (airLine) => {
const toEditAirLine =async (airLine,type) => {
currentPreviewWayLine.value = airLine;
@ -543,13 +558,20 @@
// kmz
let xmlStr =await extractKmz(response.data);
let xmlData = xmlStr.replace(/wpml:/g,"");
// wpml
let removeWpmlXmlStr = {
template:xmlStr.template.replace(/wpml:/g,""),
wayline:xmlStr.wayline.replace(/wpml:/g,"")
}
// josn
const parser = new XMLParser();
const jsonObj = parser.parse(xmlData);
emit("startEditAirLine",jsonObj.kml.Document,currentPreviewWayLine.value)
let xmlObj = {
template:parser.parse(removeWpmlXmlStr.template),
wayline:parser.parse(removeWpmlXmlStr.wayline),
}
emit("startEditAirLine",xmlObj,currentPreviewWayLine.value,type)
}catch(e){
console.error(e);

@ -1,5 +1,5 @@
<template>
<div class="containner">
<div class="container">
<div class="title">
<LeftOutlined @click="backPage" />
<div>航点航线</div>
@ -11,7 +11,7 @@
</a-button>
<div style="flex:1;">
<a-input size="middle" v-model:value="submitForm.airLineName" placeholder="航线名称" />
<a-input v-model:value="props.airLineForm.airLineName" size="middle" placeholder="航线名称" />
</div>
</div>
@ -75,9 +75,12 @@
<div class="area-options" v-if="areaOptionsShow">
<div class="item">
<div class="label">参考起飞点</div>
<div class="label">参考起飞点
<br/>
<span style="font-size:12px;color:#ccc;">( {{props.templateKmlConfig?.missionConfig.takeOffRefPoint}} )</span>
</div>
<div class="content">
<a-button type="link" style="color:#408eff" @click="setFlyPoint()">
<a-button type="link" style="color:#408eff" @click="setTakeOffPoint()">
<img src="./start-fly.png" style="width:24px;height:24px;position:relative;left:-2px;top:-2px;" alt="">
设置起飞点
</a-button>
@ -200,22 +203,78 @@
</div>
<!-- 动作列表 -->
<div class="actions-list">
<div class="action-item" v-for="(item,index) in airPointActions" :key="index"
@click="addAirPointAction(item)"
>
<div class="icon">
<img :src="'/map/point-airline/'+item.value+'.svg'" alt="">
</div>
<div class="label">
{{ item.name }}
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import {ref,defineEmits,defineProps} from 'vue'
import { SaveOutlined,LeftOutlined,AppstoreOutlined,DownOutlined,ControlOutlined} from '@ant-design/icons-vue';
//
import { airPointActions } from '../waylineConfig/action'
import { XMLParser, XMLBuilder } from 'fast-xml-parser';
import {uploadXmlFile,addAirLine} from '@/api/sys/workplan';
import { Modal, message } from 'ant-design-vue';
import {missionConfigOptions,folderConfigOptions} from '../waylineConfig/index.ts';
const emits = defineEmits(["setFlyPoint","checkPoint","exitDraw"])
const emits = defineEmits(["setTakeOffPoint","checkPoint","exitDraw"])
const props = defineProps({
"airInfo":{
type:Object
},
"polygonAirForm":{
type:Object
},
"airPoints":{
type:Object
},
"airLineForm":{
type:Object
},
"waylineInfo":{
type:Object
},
"editModel":{
type:String,
default:"add"
},
"templateKmlConfig":{
type:Object
},
"waylineWpmlConfig":{
type:Object
},
"polygon":{
type:Object
}
})
console.log("templateKmlConfig",props.templateKmlConfig);
console.log("waylineWpmlConfig",props.waylineWpmlConfig);
//
const setTakeOffPoint = ()=>{
emits("setTakeOffPoint");
}
const props = defineProps(["airPoints","airInfo","polygonAirForm","airRoute"])
const areaOptionsShow = ref(false);
const airInfo = ref({
@ -500,7 +559,7 @@ const handlerPrefixWpml = (obj) => {
//
const submitForm = ref({
"id": "",
"airLineName": props.airRoute.name,
"airLineName": "",
"airLineType": "waypoint",
"uavId": "",
"flyToFirstPointMode": "",
@ -543,6 +602,18 @@ const backPage = ()=>{
emits("exitDraw")
}
//
const addAirPointAction = (action) => {
//
console.log("action",action);
if(action.value == ""){
}
}
</script>
<style scoped>
.container{
@ -639,13 +710,24 @@ const backPage = ()=>{
display: flex;
overflow: hidden;
border:0.5px solid #3B4154 ;
font-size:12px;
background:#050608;
font-size:13px;
border-radius: 19px;
height:38px;
line-height:38px;
}
.description{
text-align: center;
}
.description img{
}
.radio-box .radio-item{
flex:1;
color:#8A92A6 ;
text-align: center;
background:#222738 ;
cursor:pointer;
}
@ -655,9 +737,65 @@ const backPage = ()=>{
color:#fff;
text-align: center;
background:#3A57E8 ;
border-radius: 19px;
cursor:pointer;
}
.area-options .item .unit{
min-width: 60px;
text-align:center;
}
.actions-list{
width:180px;
height:100%;
position: absolute;
right:-200px;
top:0px;
display:flex;
flex-direction:column;
justify-content: center;
align-items: center;
gap:10px;
}
.action-item{
height:32px;
width:100%;
display:flex;
cursor: pointer;
}
.action-item .icon:hover .label{
background:#232323;
}
.action-item .icon{
width:30px;
height:32px;
background:#232323;
text-align: center;
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
}
.action-item .icon img{
width:24px;
height:24px;
}
.action-item .label{
flex:1;
line-height:30px;
padding:0px 10px;
font-size:14px;
}
::v-deep .ant-radio-group {
display: block;

@ -136,6 +136,7 @@
<div class="group-container">
<div style="display:flex;color:#fff;font-size:12px;padding:20px 0px;">
<div style="flex:1;">智能巡检</div>
<div>
@ -184,7 +185,6 @@
</div>
</a-form-item>
</div>
</a-form>
</div>

@ -3,36 +3,42 @@
<div ref="vChartRef" id="mars3d-container" class="mars3d-container">
<!-- 航点航线 -->
<div v-if="props.airLineForm.airLineType == 'waypoint'" class="air-container">
<div v-if="props.airLineForm.airLineType == 'point'" class="air-container">
<airPoint
:airInfo="lineInfo"
:editModel="props.editMode"
:polygonAirForm="polygonAirForm"
:airLineForm="props.airLineForm"
:wayline="props.wayline"
:airPoints="airPoints"
:waylineInfo="props.waylineInfo"
:templateKmlConfig="props.templateKmlConfig"
:waylineWpmlConfig="props.waylineWpmlConfig"
@setTakeOffPoint="setTakeOffPoint"
@exitDraw="exitDraw"
:airInfo="lineInfo"
:airLineForm="props.airLineForm"
:waylineInfo="props.waylineInfo"
:polygonAirForm="polygonAirForm"
@checkPoint="checkPoint"
></airPoint>
</div>
<!-- 航面航线 -->
<div v-if="props.airLineForm.airLineType == 'mapping2d'" class="airpolygon-container">
<airPolygon
@setTakeOffPoint="setTakeOffPoint"
:airInfo="airInfo"
:editModel="props.editMode"
:polygonAirForm="polygonAirForm"
:airLineForm="props.airLineForm"
:waylineInfo="props.waylineInfo"
:airPoints="airPoints"
@calculatParamChange="calculatParamChange"
@exitDraw="exitDraw"
></airPolygon>
<airPolygon
:airInfo="airInfo"
:editModel="props.editMode"
:polygonAirForm="polygonAirForm"
:airLineForm="props.airLineForm"
:waylineInfo="props.waylineInfo"
:airPoints="airPoints"
:polygon="polygonGeoJson"
:templateKmlConfig="props.templateKmlConfig"
:waylineWpmlConfig="props.waylineWpmlConfig"
@setTakeOffPoint="setTakeOffPoint"
@calculatParamChange="calculatParamChange"
@exitDraw="exitDraw"
></airPolygon>
</div>
<!-- 航点航线配置 -->
<div class="airpoint-config-container" v-if="airPointConfigShow">
<airPointConfig :currentAirPoint="currentAirPoint" ></airPointConfig>
@ -207,6 +213,12 @@
},
"homeAirport":{
type:Object
},
"templateKmlConfig":{
type:Object
},
"waylineWpmlConfig":{
type:Object
}
})
@ -216,7 +228,7 @@
watch(
() => props.editMode,
(newVal,oldVal)=>{
if(newVal == 'edit'){
if(newVal == 'edit' ){
handlerEditPolygonAirLine();
}
}
@ -706,7 +718,7 @@ const initMap = () => {
// loadChangGuangLayer();
//
if(props.editMode == 'edit'){
if(props.editMode == 'edit' ){
handlerEditPolygonAirLine();
}
@ -802,6 +814,9 @@ const setTakeOffPoint = async () => {
});
takeOffPointPosition.value = graphic.toJSON().position;
props.templateKmlConfig.missionConfig.takeOffRefPoint = takeOffPointPosition.value[1]+","+takeOffPointPosition.value[0]+","+takeOffPointPosition.value[2]
polygonAirForm.value.startingPoint = graphic.toJSON().position;
//
@ -824,6 +839,8 @@ const takeOffPointMove = (e) => {
props.airLineForm.taskOffLng = takeOffPointPosition.value[0]
props.airLineForm.taskOffLat = takeOffPointPosition.value[1]
props.templateKmlConfig.missionConfig.takeOffRefPoint = takeOffPointPosition.value[1].toFixed(8)+","+takeOffPointPosition.value[0].toFixed(8)+","+takeOffPointPosition.value[2].toFixed(2)
// 线
updatePolygonLineByParams();
@ -1054,6 +1071,8 @@ function generateScanLines(polygon, spacing, angle = 0) {
let connectedLine = connectLinesManual(turf.featureCollection(coverageLines));
console.log("connectedLine",connectedLine);
// airPoints
airPoints.value = [];
@ -1069,9 +1088,40 @@ function generateScanLines(polygon, spacing, angle = 0) {
cameraVerticalAngle: 0,
focalLength: 1,
}
airPoints.value?.push(point);
})
// 2
let penultimatePoint =JSON.parse(JSON.stringify( airPoints.value[airPoints.value.length - 1]));
penultimatePoint.id = penultimatePoint.id+1;
airPoints.value?.push(penultimatePoint);
// 1
let turfPolygon = turf.polygon([
polygonGeoJson.value
]);
let polygonCenter = turf.centroid(turfPolygon);
let lastPoint = {
id: airPoints.value[airPoints.value.length - 1].id+1,
lng: polygonCenter.geometry.coordinates[0],
lat: polygonCenter.geometry.coordinates[1],
alt: airPoints.value[airPoints.value.length-1].alt,
aircraftHorizontalAngle: 0,
cameraHorizontalAngle: 0,
cameraVerticalAngle: 0,
focalLength: 1,
}
airPoints.value?.push(lastPoint);
console.log("airPoints",airPoints.value);
// 线
connectedLine.geometry.coordinates.push([lastPoint.lng,lastPoint.lat,lastPoint.alt])
return connectedLine;
}
@ -1280,16 +1330,18 @@ const handlerLoadtextLabelGraphicLayer = (info) => {
// 线
const handlerEditPolygonAirLine =async () => {
//
//
let takeoffArray = props.templateKmlConfig.missionConfig.takeOffRefPoint.split(",");
takeOffPointPosition.value = [props.airLineForm.taskOffLng,props.airLineForm.taskOffLat,props.airLineForm?.taskOffAlt ? props.airLineForm?.taskOffAlt : 71]
takeOffPointPosition.value = [parseFloat(takeoffArray[1]),parseFloat(takeoffArray[0]),parseFloat(takeoffArray[2])]
polygonAirForm.value.startingPoint = [props.airLineForm.taskOffLng,props.airLineForm.taskOffLat,props.airLineForm?.taskOffAlt ? props.airLineForm?.taskOffAlt : 71];
polygonAirForm.value.startingPoint = [parseFloat(takeoffArray[1]),parseFloat(takeoffArray[0]),parseFloat(takeoffArray[2])];
takeOffPointGraphicLayer ? takeOffPointGraphicLayer.clear() : null;
let startFlyGraphic = new mars3d.graphic.BillboardEntity({
position:[props.airLineForm.taskOffLng,props.airLineForm.taskOffLat],
position:takeOffPointPosition.value,
style: {
image: '/map/start.png',
horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
@ -1308,17 +1360,39 @@ const handlerEditPolygonAirLine =async () => {
takeOffPointGraphicLayer.addGraphic(startFlyGraphic);
//
let areaJson = WktToGeojson(props.airLineForm.flyToFirstPointMode)
polygonGeoJson.value = areaJson.coordinates[0];
//
let coordinateArray = props.templateKmlConfig.Folder.Placemark.Polygon.outerBoundaryIs.LinearRing.coordinates.split("\n");
let geomtryCoorinate = [];
coordinateArray.forEach((item,index)=>{
let trimStr = item.trim();
let arr = trimStr.split(",")
for(let i=0;i<arr.length;i++){
arr[i] = parseFloat(arr[i])
}
geomtryCoorinate.push(arr);
})
geomtryCoorinate.push(geomtryCoorinate[0])
let geometry = {
"type": "Polygon",
"coordinates": [geomtryCoorinate]
}
// let areaJson = WktToGeojson(props.airLineForm.flyToFirstPointMode)
polygonGeoJson.value = geometry.coordinates[0];
let geojsonData = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": areaJson,
},
"geometry": geometry
}
]
}
@ -1338,10 +1412,11 @@ const handlerEditPolygonAirLine =async () => {
})
//
handlerGetPolygonBorderInfo(areaJson.coordinates[0])
handlerGetPolygonBorderInfo(geometry.coordinates[0])
// 线
let placemark = props.waylineInfo?.Folder?.Placemark
placemark?.forEach((item, index) => {
let coordinate = item.Point.coordinates.split(',');
let airPointInfo = {
@ -2320,7 +2395,6 @@ const setUAVPosition = () => {
.air-container {
width: 400px;
background: #0d0e15c1;
overflow-y: hidden;
position: absolute;
height: calc(100vh - 80px);
top: 40px;

@ -0,0 +1,227 @@
export const airPointActions = {
"rotateYaw":{ // 设置无人机偏航角
"name":"偏航角",
"value":"rotateYaw",
"config":{
"actionId": null,
"actionActuatorFunc": "rotateYaw",
"actionActuatorFuncParam": {
"aircraftHeading": 0,
"aircraftPathMode": "counterClockwise"
}
},
},
"gimbalRotate":{ // 设置旋转云台俯仰角
"name":"旋转云台俯仰角",
"value":"gimbalRotate",
"config":{
"actionId": 3,
"actionActuatorFunc": "gimbalRotate",
"actionActuatorFuncParam": {
"gimbalHeadingYawBase": "north",
"gimbalRotateMode": "absoluteAngle",
"gimbalPitchRotateEnable": 1,
"gimbalPitchRotateAngle": -65.7,
"gimbalRollRotateEnable": 0,
"gimbalRollRotateAngle": 0,
"gimbalYawRotateEnable": 0,
"gimbalYawRotateAngle": 0,
"gimbalRotateTimeEnable": 0,
"gimbalRotateTime": 0,
"payloadPositionIndex": 0
}
}
},
"zoom":{ // 调整相机焦距
"name":"焦距",
"value":"zoom",
"config":{
"actionId": null,
"actionActuatorFunc": "zoom",
"actionActuatorFuncParam": {
"focalLength": 24,
"isUseFocalFactor": 0,
"payloadPositionIndex": 0
}
}
},
"hover":{ // 悬停
"name":"悬停",
"value":"hover",
"config":{
"actionId":null,
"actionActuatorFunc": "hover",
"actionActuatorFuncParam": {
"hoverTime": 10
}
}
},
"orientedShoot":{ // 定向拍照
"name":"定向拍照",
"value":"orientedShoot",
"config":{
"actionId": null,
"actionActuatorFunc": "orientedShoot",
"actionActuatorFuncParam": {
"gimbalPitchRotateAngle": 0,
"gimbalRollRotateAngle": 0,
"gimbalYawRotateAngle": 0,
"focusX": 0,
"focusY": 0,
"focusRegionWidth": 0,
"focusRegionHeight": 0,
"focalLength": 24,
"aircraftHeading": 0,
"accurateFrameValid": 0,
"payloadPositionIndex": 0,
"useGlobalPayloadLensIndex": 1,
"payloadLensIndex": "visable,ir",
"targetAngle": 0,
"actionUUID": "beb19eb4-84ff-4a5e-8544-47646d63a361",
"imageWidth": 0,
"imageHeight": 0,
"AFPos": 0,
"gimbalPort": 0,
"orientedCameraType": 99,
"orientedFilePath": "fa7781b7-665a-4d78-a9da-250d202a1522",
"orientedFileMD5": "",
"orientedFileSize": 0,
"orientedPhotoMode": "normalPhoto"
}
}
},
"panoShot":{ // 全景拍照
"name":"全景拍照",
"value":"panoShot",
"config":{
"actionId": null,
"actionActuatorFunc": "panoShot",
"actionActuatorFuncParam": {
"payloadPositionIndex": 0,
"useGlobalPayloadLensIndex": 0,
"payloadLensIndex": "visable,ir",
"actionUUID": "c35840c5-c16c-431b-a005-27c225088c93",
"panoShotSubMode": "panoShot_360"
}
}
},
"takePhoto":{ // 普通拍照
"name":"拍照",
"value":"takePhoto",
"config":{
"actionId": null,
"actionActuatorFunc": "takePhoto",
"actionActuatorFuncParam": {
"payloadPositionIndex": 0,
"useGlobalPayloadLensIndex": 1,
"payloadLensIndex": "visable,ir"
}
}
},
"focus":{ // 聚焦
"name":"聚焦",
"value":"focus",
"config":{
"actionId": null,
"actionActuatorFunc": "focus",
"actionActuatorFuncParam": {
"focusX": 0.25,
"focusY": 0.25,
"focusRegionWidth": 0.5,
"focusRegionHeight": 0.5,
"isPointFocus": 0,
"isInfiniteFocus": 0,
"payloadPositionIndex": 0,
"isCalibrationFocus": 0
}
}
},
"startRecord":{ // 开始录像
"name":"开始录像",
"value":"startRecord",
"config":{
"actionId": null,
"actionActuatorFunc": "startRecord",
"actionActuatorFuncParam": {
"payloadPositionIndex": 0,
"useGlobalPayloadLensIndex": 1,
"payloadLensIndex": "visable,ir"
}
}
},
"stopRecord":{ // 结束录像
"name":"结束录像",
"value":"stopRecord",
"config":{
"actionId": null,
"actionActuatorFunc": "stopRecord",
"actionActuatorFuncParam": {
"payloadPositionIndex": 0
}
}
},
"multipleTiming":{ // 开始等时间间隔拍照
"name":"开始等时间间隔拍照",
"value":"multipleTiming",
"config":{
"actionGroupId": null,
"actionGroupStartIndex": null,
"actionGroupEndIndex": null,
"actionGroupMode": "sequence",
"actionTrigger": {
"actionTriggerType": "multipleTiming",
"actionTriggerParam": 3
},
"action": {
"actionId": null,
"actionActuatorFunc": "takePhoto",
"actionActuatorFuncParam": {
"payloadPositionIndex": 0,
"useGlobalPayloadLensIndex": 1,
"payloadLensIndex": "visable,ir"
}
}
}
},
"multipleDistance":{ // 开始等距离间隔拍照
"name":"开始等距离间隔拍照",
"value":"multipleDistance",
"config":{
"actionGroupId": null,
"actionGroupStartIndex": null,
"actionGroupEndIndex": null,
"actionGroupMode": "sequence",
"actionTrigger": {
"actionTriggerType": "multipleDistance",
"actionTriggerParam": 10
},
"action": {
"actionId": null,
"actionActuatorFunc": "takePhoto",
"actionActuatorFuncParam": {
"payloadPositionIndex": 0,
"useGlobalPayloadLensIndex": 1,
"payloadLensIndex": "visable,ir"
}
}
}
},
"multipleStop":{
"name":"停止间隔拍照",
"value":"multipleStop",
}
}

@ -10,10 +10,10 @@ export const templateTypeOptions = [
export const flyToWaylineModeOptions = [
{
label:"安全模式",
label:"垂直爬升",
value:"safely"
},{
label:"倾斜飞行模式",
label:"倾斜爬升",
value:"pointToPoint"
}
]
@ -58,10 +58,10 @@ export const executeRCLostActionOptions = [
export const missionConfigOptions = {
flyToWaylineMode:[ // 飞向首航点模式
{
label:"安全模式",
label:"垂直爬升",
value:"safely"
},{
label:"倾斜飞行模式",
label:"倾斜爬升",
value:"pointToPoint"
}
],
@ -105,12 +105,12 @@ export const folderConfigOptions = {
executeHeightMode:[ // 高度模式
{
label:"椭球高模式",
value:"WGS84"
value:"EGM96"
},{
label:"相对起飞点模式",
value:"relativeToStartPoint"
},{
label:"实时仿地模式",
label:"相对地形模式",
value:"realTimeFollowSurface"
}
]

Loading…
Cancel
Save