diff --git a/index.html b/index.html index 0694331..98f3860 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ - Probody + SkyVue diff --git a/package-lock.json b/package-lock.json index 2c416e6..92321e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "probody", + "name": "SkyVue", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "probody", + "name": "SkyVue", "version": "1.0.0", "license": "MIT", "dependencies": { @@ -14,6 +14,7 @@ "copy-to-clipboard": "^3.3.3", "electron-squirrel-startup": "^1.0.1", "izitoast": "^1.4.0", + "prismjs": "^1.30.0", "vue": "^3.5.28" }, "devDependencies": { @@ -6832,6 +6833,15 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/proc-log": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", diff --git a/package.json b/package.json index dceac85..0c3547e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "probody", - "productName": "probody", + "name": "SkyVue", + "productName": "SkyVue", "version": "1.0.0", "description": "My Electron application description", "main": ".vite/build/main.js", @@ -35,6 +35,7 @@ "copy-to-clipboard": "^3.3.3", "electron-squirrel-startup": "^1.0.1", "izitoast": "^1.4.0", + "prismjs": "^1.30.0", "vue": "^3.5.28" } } diff --git a/public/icons/trash.webp b/public/icons/trash.webp deleted file mode 100644 index b4d66e4..0000000 Binary files a/public/icons/trash.webp and /dev/null differ diff --git a/public/images/logo.jpg b/public/images/logo.jpg new file mode 100644 index 0000000..be449f0 Binary files /dev/null and b/public/images/logo.jpg differ diff --git a/public/images/logo128x128.jpg b/public/images/logo128x128.jpg new file mode 100644 index 0000000..15f0b1e Binary files /dev/null and b/public/images/logo128x128.jpg differ diff --git a/public/images/logo32x32.jpg b/public/images/logo32x32.jpg new file mode 100644 index 0000000..cf90dc2 Binary files /dev/null and b/public/images/logo32x32.jpg differ diff --git a/public/images/logo64x64.jpg b/public/images/logo64x64.jpg new file mode 100644 index 0000000..db5e66e Binary files /dev/null and b/public/images/logo64x64.jpg differ diff --git a/src/App.vue b/src/App.vue index 8650d0d..6a248b1 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,17 +1,28 @@ diff --git a/src/components/CodeBlock.vue b/src/components/CodeBlock.vue new file mode 100644 index 0000000..b36929d --- /dev/null +++ b/src/components/CodeBlock.vue @@ -0,0 +1,32 @@ + + + + + \ No newline at end of file diff --git a/src/components/CodeView.vue b/src/components/CodeView.vue new file mode 100644 index 0000000..d26ecfc --- /dev/null +++ b/src/components/CodeView.vue @@ -0,0 +1,42 @@ + + + + + \ No newline at end of file diff --git a/src/components/MovementButtons.vue b/src/components/MovementButtons.vue new file mode 100644 index 0000000..1d5ee6d --- /dev/null +++ b/src/components/MovementButtons.vue @@ -0,0 +1,62 @@ + + + + + \ No newline at end of file diff --git a/src/components/MyDialog.vue b/src/components/MyDialog.vue index c27b895..e8b95c7 100644 --- a/src/components/MyDialog.vue +++ b/src/components/MyDialog.vue @@ -1,21 +1,22 @@ \ No newline at end of file + +/* Начало появления: ниже и прозрачный */ +.modal-fade-enter-from { + opacity: 0; +} + +/* Конец появления: на месте и видим */ +.modal-fade-enter-to { + opacity: 1; +} + +/* Начало исчезания: на месте и видим */ +.modal-fade-leave-from { + opacity: 1; +} + +/* Конец исчезания: выше и прозрачный */ +.modal-fade-leave-to { + opacity: 0; +} + +/* Общие настройки анимации (скорость + плавность) */ +.modal-fade-enter-active, +.modal-fade-leave-active { + transition: transform 0.5s cubic-bezier(.22, .9, .31, 1), opacity 0.5s ease; + will-change: transform, opacity; +} + \ No newline at end of file diff --git a/src/components/MyDropMenu.vue b/src/components/MyDropMenu.vue index 679e06c..90b7ba7 100644 --- a/src/components/MyDropMenu.vue +++ b/src/components/MyDropMenu.vue @@ -1,120 +1,200 @@ diff --git a/src/components/UI/CustomButton.vue b/src/components/UI/CustomButton.vue new file mode 100644 index 0000000..cf2f853 --- /dev/null +++ b/src/components/UI/CustomButton.vue @@ -0,0 +1,43 @@ + + + + + \ No newline at end of file diff --git a/src/components/UI/svg/Back.vue b/src/components/UI/svg/Back.vue new file mode 100644 index 0000000..8af36c8 --- /dev/null +++ b/src/components/UI/svg/Back.vue @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/src/components/UI/svg/Preview.vue b/src/components/UI/svg/Preview.vue new file mode 100644 index 0000000..84fba1f --- /dev/null +++ b/src/components/UI/svg/Preview.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/components/UI/svg/Save.vue b/src/components/UI/svg/Save.vue new file mode 100644 index 0000000..0e8af8d --- /dev/null +++ b/src/components/UI/svg/Save.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/components/UI/svg/Trash.vue b/src/components/UI/svg/Trash.vue new file mode 100644 index 0000000..33a5ab3 --- /dev/null +++ b/src/components/UI/svg/Trash.vue @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/src/data/informationForDirectory.js b/src/data/informationForDirectory.js new file mode 100644 index 0000000..adc9a74 --- /dev/null +++ b/src/data/informationForDirectory.js @@ -0,0 +1,74 @@ +export default [ + { + title: 'ROS', + body: 'ROS (Robot Operating System) — экосистема для программирования роботов. В приложении через ROS дрон получает команды, передает телеметрию и данные с камеры.', + hrefToDoc: 'https://www.ros.org/', + hrefToCourse: 'https://stepik.org/lesson/2260739/step/1?unit=2294748' + }, + { + title: 'OpenCV', + body: 'OpenCV (Open Source Computer Vision Library) — библиотека компьютерного зрения. С её помощью дрон распознает цвета платформ и считывает QR-коды.', + hrefToDoc: 'https://opencv.org/', + hrefToCourse: 'https://stepik.org/lesson/2272700/step/1?unit=2306893' + }, + { + title: 'navigate_wait', + body: 'Navigate_wait — функция из библиотеки Clover. Отправляет дрон в точку и ждёт, пока он туда долетит, и только потом выполняет следующую команду. Это важно, потому что обычная команда navigate не ждет: дрон ещё летит, а скрипт уже бежит дальше — из-за этого следующие команды могут выполняться раньше времени.', + hrefToDoc: 'https://clover.coex.tech/ru/snippets.html', + hrefToCourse: 'https://stepik.org/lesson/2264712/step/1?unit=2298803' + }, + { + title: 'Нода (Node)', + body: 'Нода (Node/узел) в ROS - исполняемая программа, которая выполняет одну конкретную задачу. В сгенерированном коде вся логика полета и обработки камеры находится внутри одной ноды. Это позволяет запускать, останавливать и отлаживать программу как единое целое. ', + hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html', + hrefToCourse: 'https://stepik.org/lesson/2261765/step/1?unit=2295758' + }, + { + title: 'Топик (Topic)', + body: 'Топик (Topic) в ROS — канал обмена данными. Например, камера публикует изображение в топик, а ваш скрипт подписывается на него и получает кадры.', + hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html', + hrefToCourse: 'https://stepik.org/lesson/2262844/step/1?unit=2296866' + }, + { + title: 'Издатель (Publisher)', + body: 'Издатель (Publisher) в ROS — часть программы, которая отправляет данные в топик. Например, если нужно передать команду другому узлу или опубликовать координаты дрона — создается издатель, который публикует сообщения в нужный канал. Подписчики других узлов могут эти данные получать. ', + hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html', + hrefToCourse: 'https://stepik.org/lesson/2262844/step/1?unit=2296866' + }, + { + title: 'Подписчик (Subscriber)', + body: 'Подписчик (Subscriber) в ROS — часть программы, которая получает данные из топика. Например, чтобы дрон "видел" изображение с камеры или считывал свои координаты, создаётся подписчик на соответствующий топик. Как только в топике появляются новые данные, подписчик автоматически их обрабатывает.', + hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html', + hrefToCourse: 'https://stepik.org/lesson/2262844/step/1?unit=2296866' + }, + { + title: 'Сервис', + body: 'Сервис в ROS - способ вызвать функцию робота и сразу получить ответ. В отличие от топика, где данные идут постоянно, сервис работает по принципу "запрос — ответ". Например, команда navigate — это сервис: вы отправляете координаты, а робот отвечает "команда принята". Команда get_telemetry возвращает текущие координаты дрона.', + hrefToDoc: 'https://docs.voltbro.ru/starting-ros/basics.html', + hrefToCourse: 'https://stepik.org/lesson/2263182/step/1?unit=2297206' + }, + { + title: 'Системы координат', + body: 'Определяют, откуда отсчитывать координаты дрона. body — относительно самого дрона (вперед/назад/влево/вправо). aruco_map — относительно карты с ArUco-метками, где координаты привязаны к неподвижным маркерам. Выбор правильной системы координат позволяет дрону точно выполнять команды: лететь относительно себя для коротких маневров или по глобальной карте для точной навигации.', + hrefToCourse: 'https://stepik.org/lesson/2264336/step/1?unit=2298407', + hrefToDoc: 'https://clover.coex.tech/ru/frames.html' + }, + { + title: 'ArUco-маркер', + body: 'ArUco-маркер — квадратный визуальный маркер, который камера дрона может распознавать. Используется для навигации: по положению маркера дрон определяет свои координаты в пространстве.', + hrefToCourse: 'https://stepik.org/lesson/2264336/step/1?unit=2298407', + hrefToDoc: 'https://klever-doc.tech/ROS1/ru/aruco.html' + }, + { + title: 'Симулятор (Gazebo)', + body: 'Симулятор (Gazebo) — виртуальная среда, где дрон ведет себя как в реальности. Позволяет безопасно тестировать полетные задания перед запуском на реальном дроне.', + hrefToCourse: 'https://stepik.org/lesson/2278310/step/1?unit=2312564', + hrefToDoc: 'https://klever-doc.tech/ROS1/ru/simulation.html' + }, + { + title: 'unregister()', + body: 'unregister() — метод, который отключает подписчика от топика. Используется, чтобы перестать получать данные, когда они больше не нужны (например, после сканирования QR-кода).', + hrefToCourse: 'https://stepik.org/lesson/2272845/step/1?unit=2307058', + hrefToDoc: 'https://docs.ros.org/en/diamondback/api/rospy/html/rospy.topics.Subscriber-class.html' + }, +] \ No newline at end of file diff --git a/src/main.js b/src/main.js index 8668dab..676d8c5 100644 --- a/src/main.js +++ b/src/main.js @@ -15,10 +15,12 @@ const createWindow = () => { const mainWindow = new BrowserWindow({ width: width, height: height, + icon: './public/images/logo32x32.jpg', webPreferences: { preload: path.join(__dirname, 'preload.js'), }, }); + mainWindow.menuBarVisible = false; // and load the index.html of the app. if (MAIN_WINDOW_VITE_DEV_SERVER_URL) { diff --git a/src/renderer.js b/src/renderer.js index 4099886..c191d27 100644 --- a/src/renderer.js +++ b/src/renderer.js @@ -29,5 +29,9 @@ import { createApp } from 'vue'; import App from './App.vue'; import '@imengyu/vue3-context-menu/lib/vue3-context-menu.css' +import Prism from 'prismjs' +import 'prismjs/themes/prism-okaidia.css' + + import ContextMenu from '@imengyu/vue3-context-menu' createApp(App).use(ContextMenu).mount('#app'); diff --git a/public/shablons/README.md b/src/shablons/README.md similarity index 100% rename from public/shablons/README.md rename to src/shablons/README.md diff --git a/public/shablons/color.txt b/src/shablons/color.js similarity index 90% rename from public/shablons/color.txt rename to src/shablons/color.js index b61e0f9..5ff4784 100644 --- a/public/shablons/color.txt +++ b/src/shablons/color.js @@ -1,4 +1,4 @@ -def color_detection(data, print_type='str'): +export default `def color_detection(data, print_type='str'): '''определение цвета''' frame = bridge.imgmsg_to_cv2(data, 'bgr8') @@ -34,7 +34,7 @@ def color_detection(data, print_type='str'): color = 'green' elif r > b + 20 and r > g + 20 and r > 100: color = 'red' - elif r > 150 and g > 150 and g > 150: + elif r > 150 and g > 150 and b > 150: color= 'white' else: color = None @@ -42,4 +42,4 @@ def color_detection(data, print_type='str'): <> color_sub = rospy.Subscriber('main_camera/image_raw', Image, lambda img: color_detection(img, print_type='rgb'), queue_size=1) rospy.sleep(2) - color_sub.unregister() \ No newline at end of file + color_sub.unregister()` \ No newline at end of file diff --git a/public/shablons/emergency_and_navigate.txt b/src/shablons/emergency_and_navigate.js similarity index 98% rename from public/shablons/emergency_and_navigate.txt rename to src/shablons/emergency_and_navigate.js index 1114350..1e8546c 100644 --- a/public/shablons/emergency_and_navigate.txt +++ b/src/shablons/emergency_and_navigate.js @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +export default `#!/usr/bin/env python3 import rospy import time @@ -102,4 +102,4 @@ def main(): land() #посадка if __name__ == "__main__": - main() + main()` diff --git a/public/shablons/qr.txt b/src/shablons/qr.js similarity index 82% rename from public/shablons/qr.txt rename to src/shablons/qr.js index c877557..46c5e82 100644 --- a/public/shablons/qr.txt +++ b/src/shablons/qr.js @@ -1,4 +1,4 @@ -def qr_detection(data): +export default `def qr_detection(data): cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') barcodes = pyzbar.decode(cv_image) @@ -9,4 +9,4 @@ def qr_detection(data): <> qr_sub = rospy.Subscriber('main_camera/image_raw', Image, qr_detection, queue_size=1) rospy.sleep(2) - qr_sub.unregister() \ No newline at end of file + qr_sub.unregister()` \ No newline at end of file diff --git a/src/shared/izitoast.js b/src/shared/izitoast.js index 91a9911..133c879 100644 --- a/src/shared/izitoast.js +++ b/src/shared/izitoast.js @@ -1,7 +1,7 @@ import iziToast from 'iziToast'; iziToast.settings({ - timeout: 3000, + timeout: 2500, closeOnEscape: true, closeOnClick : true, resetOnHover: false,