From 2b5dbc319ec83a3214335a087f4f653bbf0f74f6 Mon Sep 17 00:00:00 2001 From: Ilia Miheev Date: Tue, 17 Feb 2026 21:49:28 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83=20Ctr?= =?UTF-8?q?l=20+=20Z?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 2 +- package-lock.json | 45 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + src/App.vue | 17 +++++++++++++---- 4 files changed, 60 insertions(+), 5 deletions(-) diff --git a/index.html b/index.html index 151627a..0694331 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ - Hello World! + Probody diff --git a/package-lock.json b/package-lock.json index 6e9288c..94f28cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "@vueuse/core": "^14.2.1", "electron-squirrel-startup": "^1.0.1", "izitoast": "^1.4.0", "vue": "^3.5.28" @@ -2510,6 +2511,12 @@ "@types/node": "*" } }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, "node_modules/@types/wrap-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", @@ -2652,6 +2659,44 @@ "integrity": "sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==", "license": "MIT" }, + "node_modules/@vueuse/core": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.2.1.tgz", + "integrity": "sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.2.1", + "@vueuse/shared": "14.2.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.2.1.tgz", + "integrity": "sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.2.1.tgz", + "integrity": "sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", diff --git a/package.json b/package.json index dcbc836..b282db3 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "vite": "^5.4.21" }, "dependencies": { + "@vueuse/core": "^14.2.1", "electron-squirrel-startup": "^1.0.1", "izitoast": "^1.4.0", "vue": "^3.5.28" diff --git a/src/App.vue b/src/App.vue index 73d85ad..498b29a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,8 +1,8 @@ \ No newline at end of file diff --git a/src/copyToclipboard.js b/src/copyToclipboard.js new file mode 100644 index 0000000..662f9e9 --- /dev/null +++ b/src/copyToclipboard.js @@ -0,0 +1,17 @@ +import copy from 'copy-to-clipboard'; +import iziToast from '@/iziToast.js'; + +function copyToclipboard(text) { + try { + copy(text) + } catch (error) { + console.error("Ошибка при копировании текста: ", error); + iziToast.error({ + title: 'Ошибка', + message: "Ошибка при копировании текста. Подробности смотри в консоли", + }); + return; + } +} + +export default copyToclipboard \ No newline at end of file diff --git a/vite.renderer.config.mjs b/vite.renderer.config.mjs index 1c6c6ef..79f986d 100644 --- a/vite.renderer.config.mjs +++ b/vite.renderer.config.mjs @@ -1,7 +1,13 @@ import { defineConfig } from 'vite'; +import { resolve } from 'path'; import vue from '@vitejs/plugin-vue'; // https://vitejs.dev/config export default defineConfig({ - plugins: [vue()] + plugins: [vue()], + resolve: { + alias: { + '@': resolve(__dirname, 'src'), + }, + }, }); \ No newline at end of file From 00e884da8368b516a4aea88cc3542cc249f3264a Mon Sep 17 00:00:00 2001 From: alisagerasimova Date: Fri, 20 Feb 2026 12:33:04 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=9F=D1=80=D0=B8=20=D0=BA=D0=BE=D0=BF?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BF=D0=B8=D1=80=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4=20=D1=86=D0=B5=D0=BB=D0=B8=D0=BA=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {shablons => public/shablons}/README.md | 0 .../color.py => public/shablons/color.txt | 5 --- .../shablons/emergency_and_navigate.txt | 13 ++----- public/shablons/qr.txt | 26 ++++++++++++++ shablons/qr.py | 26 -------------- src/App.vue | 34 ++++++++++++------- src/components/MyDialog.vue | 6 ++++ 7 files changed, 55 insertions(+), 55 deletions(-) rename {shablons => public/shablons}/README.md (100%) rename shablons/color.py => public/shablons/color.txt (99%) rename shablons/emergency_and_navigate.py => public/shablons/emergency_and_navigate.txt (95%) create mode 100644 public/shablons/qr.txt delete mode 100644 shablons/qr.py diff --git a/shablons/README.md b/public/shablons/README.md similarity index 100% rename from shablons/README.md rename to public/shablons/README.md diff --git a/shablons/color.py b/public/shablons/color.txt similarity index 99% rename from shablons/color.py rename to public/shablons/color.txt index 2ae7ea2..6571542 100644 --- a/shablons/color.py +++ b/public/shablons/color.txt @@ -44,10 +44,6 @@ class ColorDetect(): else: self.color = None - - - - #в MAIN для вызова функции должно быть: # cd = ColorDetect() #color_sub = rospy.Subscriber('main_camera/image_raw', Image, @@ -56,4 +52,3 @@ class ColorDetect(): # print(cd.getColor()) #rospy.sleep(2) #color_sub.unregister() - diff --git a/shablons/emergency_and_navigate.py b/public/shablons/emergency_and_navigate.txt similarity index 95% rename from shablons/emergency_and_navigate.py rename to public/shablons/emergency_and_navigate.txt index 6bea297..708ff95 100644 --- a/shablons/emergency_and_navigate.py +++ b/public/shablons/emergency_and_navigate.txt @@ -18,8 +18,6 @@ navigate = rospy.ServiceProxy('navigate', srv.Navigate) #сервис для п land = rospy.ServiceProxy('land', Trigger) #сервис для посадки - - def navigate_wait(x=0, y=0, z=1, speed=0.5, frame_id='aruco_map', auto_arm=False, tolerance=0.2,sleep=2): """ Летит в указанную точку и ждет, пока дрон туда ДОЛЕТИТ. @@ -36,9 +34,6 @@ def navigate_wait(x=0, y=0, z=1, speed=0.5, frame_id='aruco_map', auto_arm=False rospy.sleep(sleep) - - - def emergency_stop(): """Функция экстренной остановки, срабатывает при нажатии Ctrl + C""" @@ -78,8 +73,6 @@ def emergency_stop(): print(f"Warning: {e}") - - def signal_handler(sig, frame): """Перехват Ctrl+C: вместо аварийного завершения программы @@ -98,12 +91,10 @@ def main(): #в дальнейшем не передавать переменной auto_arm значение True - # тут будут navigate_wait и подписчики - # navigate_wait(x=3,z=1,sleep=1) - # navigate_wait(y=5,x=2,z=1,sleep = 4) + <> land() #посадка if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/public/shablons/qr.txt b/public/shablons/qr.txt new file mode 100644 index 0000000..b31ddde --- /dev/null +++ b/public/shablons/qr.txt @@ -0,0 +1,26 @@ +class QrDetect(): + def __init__(self): + self.qr_data = '' + + def getQrData(self): + return self.qr_data + + def qr_detection(self,data): + '''сканирование qr кода''' + if self.qr_data!= '': + return + cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') + barcodes = pyzbar.decode(cv_image) + + if barcodes: + self.qr_data = barcodes[0].data.decode('utf-8') + + +#в MAIN для вызова функции необходимо следующее: +#1. создаём и вызываем подписчика, который вызывает функцию чтения кьюаркода +qd = QrDetect() +qr_sub = rospy.Subscriber('main_camera/image_raw',Image, qd.qr_detection,queue_size=1) +#2. задаём время работы подписчика (за 1 секунду примерно 20 раз вызывается функция) +rospy.sleep(2) +#3. выключаем подписчика +qr_sub.unregister() diff --git a/shablons/qr.py b/shablons/qr.py deleted file mode 100644 index 8cd6251..0000000 --- a/shablons/qr.py +++ /dev/null @@ -1,26 +0,0 @@ -qr_data='' - -def qr_detection(data): - '''сканирование qr кода''' - global qr_data - if qr_data!= '': - return - cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') - barcodes = pyzbar.decode(cv_image) - - if barcodes: - qr_data = barcodes[0].data.decode('utf-8') - - return qr_data - - - - -#в MAIN для вызова функции необходимо следующее: -#1. создаём и вызываем подписчика, который вызывает функцию чтения кьюаркода -qr_sub = rospy.Subscriber('main_camera/image_raw',Image, qr_detection,queue_size=1) -#2. задаём время работы подписчика (за 1 секунду примерно 20 раз вызывается функция) -rospy.sleep(2) -#3. выключаем подписчика -qr_sub.unregister() - diff --git a/src/App.vue b/src/App.vue index 6998a95..f61d5cb 100644 --- a/src/App.vue +++ b/src/App.vue @@ -13,7 +13,6 @@ const isModalVisible = ref(false) let finallyText = ''; onMounted(()=>{ - for (let i = 0; i < 100; i++) { numbers.value.push({ variable: [], @@ -43,7 +42,10 @@ function setNumber(item) { //если нажимаем на ранее отмеченную клетку (не последнюю), то выводится ошибка listOfTrips.value.push(item) if (numbers.value[item.index].variable.at(-1) === clickCount.value-1) { - izitoast.error({title:'Ошибка', message:'Нельзя выбирать один и тот же aruco маркер 2 раза подряд'}) + izitoast.error({ + title:'Ошибка', + message:'Нельзя выбирать один и тот же aruco маркер 2 раза подряд' + }) return } numbers.value[item.index].variable.push(clickCount.value) @@ -53,14 +55,15 @@ function setNumber(item) { } function saveResult() { + let navigate_waites = '' for (const item of listOfTrips.value) { - finallyText += `navigate_wait(${item.x}, ${item.y})\n`; + navigate_waites += `navigate_wait(${item.x}, ${item.y})\n\t`; } - console.log(finallyText); - izitoast.info({ - title: 'Информация', - message: "Посмотри в консоли путь дрона. Ctrl + Shift + I или F12" - }); + fetch('/shablons/emergency_and_navigate.txt') + .then(response => response.text()) + .then(textOfCode => { + finallyText = textOfCode.replace('<>', navigate_waites); + }); isModalVisible.value = true } @@ -92,6 +95,14 @@ const handleKeydown = (event) => { } }; useEventListener('keydown', handleKeydown); + +function copyAndToast(text){ + copyToclipboard(text) + izitoast.success({ + title:'Успешно', + message:'Код скопирован в буфер обмена' + }) +} diff --git a/src/components/MyDialog.vue b/src/components/MyDialog.vue index a80c41e..3e9c43e 100644 --- a/src/components/MyDialog.vue +++ b/src/components/MyDialog.vue @@ -94,6 +94,12 @@ function closeModal() { padding: 5px; margin: 0 5px; } +.btn-green:hover { + background-color: #0fa386; +} +.btn-green:active { + background-color: #65ebd2; +} .modal-fade-enter, .modal-fade-leave-active {