|
1 / 1 / 1
Регистрация: 10.08.2016
Сообщений: 10
|
|
Управление объектами графической сцены10.08.2016, 15:20. Показов 1247. Ответов 6
Метки нет (Все метки)
Добрый день
Столкнулся с проблемой, к которой не знаю с какой стороны подойти. Разрабатываю редактор диаграмм или схем (кому как удобнее). Диаграмма представляет собой контейнер, в котором содержатся графические компоненты. Уже реализована функциональность отрисовки диаграммы на графическом контексте, масштабирование и позиционирование вида, поиск на диаграмме компонентов, пересекающихся или содержащихся в заданной геометрической области. Теперь нужно сделать графические компоненты интерактивными, чтобы они реагировали на пользовательский ввод и могли взаимодействовать между собой. Я могу найти на диаграмме компонент, находящийся в зоне действия курсора мыши. Что дальше? С одной стороны, все компоненты индивидуальны, они по разному должны реагировать на события мыши, у некоторых могут быть активные области и реакция должна меняться в зависимости от того в какую область указывает курсор. Логично было бы передать событие мыши компоненту и позволить ему самому решить что делать. Но для некоторых действий компонентам нужно обращаться к диаграмме, в которой они содержатся, к панели, на которой отрисовывается диаграмма, к документу в целом и т. д. То есть компонент должен содержать прямые ссылки на эти объекты, что приводит к сильной связности. С другой стороны, можно сделать управляющий объект, который будет принимать события пользовательского ввода и выполнять действия с графическими компонентами. Но тогда компоненты должны иметь развитый интерфейс, позволяющий управляющему объекту получить всю нужную информацию, и при добавлении нового вида компонентов может потребоваться вносить изменения в этот интерфейс. То есть система получится негибкая. Подскажите пожалуйста как решаются такие задачи
0
|
|
| 10.08.2016, 15:20 | |
|
Ответы с готовыми решениями:
6
Снимок графической сцены Использование таймера для автоматического сохранения в файл графической сцены Буфер трафарета для сцены с несколькими объектами |
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 13.08.2016, 02:16 | ||
|
он не знает кому, и не знает, кто ему ответит.
1
|
||
|
1 / 1 / 1
Регистрация: 10.08.2016
Сообщений: 10
|
|
| 21.09.2016, 12:19 [ТС] | |
|
Спасибо, вроде бы что то получилось..
0
|
|
| 22.09.2016, 10:29 | |
|
Конечно зависит от конкретной системы, но по моим наблюдениям "управляющий объект" (т,е. второй вариант) заметно лучше. Хотя объекты разные - их движения достаточно общие. Движение может быть блокировано и/или ограничено по всем осям или некоторым, эти данные объект выдает "двигающему" через какой-то интерфейс, не проблема. Трудно придумать еще какое-то "уникальное" движение объекта. А в варианте "двигать так чтобы не пересекать др объекты" становится очевидным что сам объект это сделать не может, т.е. "двигающий" все равно нужен. Для самого объекта достаточно события "moved", т.е. на движение он реагировать может, но не "сам себя двигать"
0
|
|
|
1 / 1 / 1
Регистрация: 10.08.2016
Сообщений: 10
|
|
| 23.09.2016, 07:57 [ТС] | |
|
Я распределил обязанности между управляющим объектом и компонентами так:
Управляющий объект определяет компонент, которому следует передавать событие. Обычно это первый ближайший к курсору компонент, но выбранные имеют приоритет. Также он управляет выбором (мышью или с помощью лассо). От компонента только запрашивает информацию выбираемый он или нет. Компоненты делают всё остальное. Например перемещение работает так: компонент получает событие mousePessed, определяет что мышь нажата над областью, за которую можно перетаскивать и подготавливается к перетаскиванию (запоминает исходное положение, меняет своё внутреннее состояние, посылает событие-запрос на "захват мыши" (поясню дальше) ), если после этого приходит событие mouseDrag, происходит само перетаскивание, после прихода события mouseRelease перетаскивание завершается (состояние меняется на обычное, посылается запрос на "возврат мыши"). Что такое "захват мыши"? Управляющий объект передаёт событие мыши ближайшему компоненту, но некоторые операции (перетаскивание, рисование) требуют чтобы событие мыши всё время передавалось только перемещаемому или рисуемому компоненту. Я нашёл такой выход, что компонент с помощью события запрашивает у управляющего объекта "захват мыши" управляющий объект при этом устанавливает специальный флаг, запоминает компонент и в дальнейшем передаёт события мыши ему, до тех пор, пока тот не вернёт управление. Добавлено через 10 минут Смена курсора мыши по инициативе компонента происходит тоже с помощью события. У меня компонент "не знает" панель, на которой всё рисуется, а управляющий объект "знает". При перемещениях, рисованиях нужно взаимодействовать с окружающими компонентами. Для взаимодействия у каждого вида компонентов есть свой объект Interactor (использует паттерн Visitor). Механизм такой: компонент делает событие-запрос на получение списка окружающих компонентов. Управляющий объект получает этот запрос, находит ближайшие компоненты и передаёт список вопрошающему. Тот, получив список, поочередно передаёт компоненты из него Interactor и таким образом получает нужные сведения (можно/нельзя здесь разместиться и т.д.) Добавлено через 33 минуты Вкратце так. Я делаю подобный редактор впервые, поэтому нет уверенности что "всё правильно сделал" и в дальнейшем не будет проблем с расширением, но сейчас по крайней мере сие работает. Остались открытыми некоторые вопросы, например, внешний Drag & Drop. Ещё интересный момент - это динамическая подсветка точек соединения, к примеру, приблизился коннектор на нужное расстояние и у компонента подсвечивается крестиком место куда можно приконнектиться. Сейчас я это сделал путём засовывания внутрь компонента объектов, которые должны быть отрисованы вместе с ним. Интересно бы узнать как это делается в каких нибудь Visio, Autocad, КОМПАС и т. д.
1
|
|
| 23.09.2016, 09:53 | |||
|
0
|
|||
| 23.09.2016, 09:53 | |
|
Помогаю со студенческими работами здесь
7
Управление объектами сенсором
Управление динамическими объектами Децентрализованное управление несколькими объектами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|