Russian Qt Forum
Ноябрь 23, 2024, 03:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Соединение двух точек "проводами"  (Прочитано 16845 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Февраль 15, 2015, 22:43 »

Стандартная задача - соединять две точки (QPointF в нашем случае) "проводами", которые проходят только по вертикали и горизонтали, и поворачивают только под прямым углом. При этом не накладываются на прочие элементы изображения, а другие подобные линии могут пересекать тоже только под прямым углом. Линии должны сами выбирать где им "ломаться" и сами должны располагаться на оптимальном расстоянии от других айтемов сцены. С возможностью изменять их положение драгом. Такие линии есть в Visio, OpenOffice Draw и других пакетах. Делалось многими и много раз. В самом Qt такой штуки, увы нет. Разумеется, и я сам могу сделать за несколько дней. Но может уже есть такое готовое для QGraphicsScene, типа набора QWT? Может не надо изобретать велосипед? Может есть сторонняя готовая библиотека? Или хотя бы, как называется такой тип объектов, но так чтобы при поиске не путаться в бесчисленных описаниях connection сигналов-слотов, QGraphicsLine и QRubberBand.
Записан

2^7-1 == 127, задумайтесь...
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #1 : Февраль 17, 2015, 07:05 »

как называется такой тип объектов
Пример документации из одной Java библиотеки.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Февраль 24, 2015, 22:45 »

up

С теорией более-менее ясно, что надо делать в общем, тоже более-менее ясно. Провести линии и вычислить обходы можно, подобное раньше делать приходилось. Разумеется, "провода" - это набор отрезков, концы которых соединены. Вот тут не вполне ясно, как это лучше делать на Qt. Точнее - какой вариант реализации самих проводов лучше:

- Хранить и отрисовывать QList<QGraphicsLine>
- Хранить QPainterPath, а на сцене рисовать QGraphicsPathItem( QPainterPath ), причем QPainterPath всегда будет разомкнут
- теоретически можно еще хранить QList<QPointF>, и рисовать на сцене QGraphicsLine между этими точками - почти тоже самое, что в первом случае, но удалять линии со сцены муторно

Не ясно, будет ли нормально второй вариант работать с разомкнутым QPainterPath. Не видно - можно ли выделить отдельный участок QGraphicsPathItem другим цветом. Надо при наведении курсора на отрезок "провода" выделить этот отрезок цветом и определить его ориентацию, чтобы можно было его двигать только перпендикулярно отрезку. Как я вижу, QPainterPath предназначен больше для создания сложных закрытых объектов, которые оперируют, как единое целое. Поэтому склоняюсь к варианту с QList<QGraphicsLine>. В нем и выделение, и определение ориентации без особых проблем просматривается.

Кто-то делал что-то подобное? Каким путём?
Записан

2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Февраль 27, 2015, 19:20 »

Провода обычно делают наследниками QGraphicsItem прямо или косвенно. провод знает к кому он подключен и при удалении провода сам отключается.

Базовую идею смотри в примере DiagramScene, подробности реальной реализации, например, во Fritzing и QElectrotech
Записан

Юра.
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Февраль 27, 2015, 19:40 »

Провода обычно делают наследниками QGraphicsItem прямо или косвенно. провод знает к кому он подключен и при удалении провода сам отключается.

Базовую идею смотри в примере DiagramScene, подробности реальной реализации, например, во Fritzing и QElectrotech

Спасибо, конечно, но это тот случай, когда советующий не вполне понял суть вопроса...
Записан

2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Февраль 27, 2015, 20:33 »

Если ты про автоматическое расположение отрезков, то в QElectrotech именно так и сделано. При перемещении компонентов провода сами перестраиваются.

class Conductor : public QObject, public QGraphicsPathItem
Проводник содержит внутри себя
class ConductorSegment
« Последнее редактирование: Февраль 27, 2015, 20:37 от lit-uriy » Записан

Юра.
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Февраль 27, 2015, 20:56 »

Проводник содержит внутри себя ...... class ConductorSegment

Вот это меня интересовало. Если у них можно после автоматической проводки перемещать проводники мышью, тогда интересно копать. Если нет, то нет.
Записан

2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Февраль 28, 2015, 21:30 »

Да, можно.
При наведении мыша на сегментах появляются квадратные маркеры (рис. 1), за которые можно двигать сегмент, если двиганул за пределы геометрии, например, сегмент последний "привязанный" к элементу схемы (верхний правый сегмент на рисунке), то появляются дополнительные сегменты (рис. 2)
Записан

Юра.
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Февраль 28, 2015, 22:18 »

Вот это уже интересно - как они на QGraphicsPathItem это сделали. Спс, посмотрю.

ЗЫ: глянул, чё-то как-то муторно там сделано, кроме самого QGraphicsPathItem им пришлось хранить и фактически работать с двунаправленным списком сегментов. Почему-то не стали использовать QList. И если хранятся отрезки, то почему нельзя было их и нарисовать? Такое впечатление, будто авторы сначала сделали всё на QGraphicsPathItem, потом стало его не хватать, прилепили отрезки.
« Последнее редактирование: Март 01, 2015, 01:06 от Гурман » Записан

2^7-1 == 127, задумайтесь...
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Март 03, 2015, 20:15 »

Я подробностей не знаю, но знаю что было так:
Был один программер, потом пришёл ещё один, видимо по опытнее, т.к. дело пошло быстрее, хотелки реализовывались. Сейчас развитие затормозилось, в истории хранилища, комитов от второго программера не видно, да и в "О программе" он пропал.

Т.е. первый, видимо, начал делать на QGraphicsPathItem, потом второй подключился стал перелапачивать код, а когда ушёл, всё осталось не доделанным.
может что-то не поделили.
Записан

Юра.
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Март 03, 2015, 22:18 »

Т.е. первый, видимо, начал делать на QGraphicsPathItem, потом второй подключился стал перелапачивать код, а когда ушёл, всё осталось не доделанным.
может что-то не поделили.

А. Вот это запросто. И видно, что недоделанно - обходить препятствия и не накладывать линии на уже проведенные тот алгоритм не умеет. По совокупности годится больше в качестве примера "как делать не надо".
Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 04, 2015, 09:46 »

А. Вот это запросто. И видно, что недоделанно - обходить препятствия и не накладывать линии на уже проведенные тот алгоритм не умеет. По совокупности годится больше в качестве примера "как делать не надо".
Ах как легко охаять чужую корову Улыбающийся А что же со своей?
Разумеется, и я сам могу сделать за несколько дней.
Это писалось 15 февраля, по всем меркам "несколько дней" уже истекли. Может товарищу надо быть скромнее? Улыбающийся На мой взгляд лучше начать с интерактивного перемещения (создания, удаления) отрезков - без всякого анализа пересечений. Это действительно "неск дней", чисто "дело техники". Начальный путь - как получится, пересек так пересек. 

Ну вот, сейчас мурло опять выдаст типа "это ерунда!" - и разговор закончится  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Март 04, 2015, 10:00 »

Ну вот, сейчас мурло опять выдаст типа "это ерунда!" - и разговор закончится  Улыбающийся
По моему, мурло уже выдал.
Вас кто-то звал в эту тему? Почему вы считаете, что можете давать оценку другим, и тем более оскорблять людей?
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #13 : Март 04, 2015, 11:14 »

Это писалось 15 февраля, по всем меркам "несколько дней" уже истекли. Может товарищу надо быть скромнее?
Поддержу вопрос Igors Улыбающийся
Думал, уже скоро топик стартер поделится своим решением этой не тривиальной, сделанным "за несколько дней". А пока что-то все чужое ищет...
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #14 : Март 04, 2015, 12:00 »

Думал, уже скоро топик стартер поделится своим решением этой не тривиальной, сделанным "за несколько дней". А пока что-то все чужое ищет...

1. Напрасно думал. Делиться этим решением я никому не обещал и не планирую. Смеющийся Может быть, буду продавать по LGPL, если хорошо получится. Крутой
2. Чужого не ищу. lit-uriy показал ответ на мой вопрос про варианты использования классов Qt, и он совпал с моими выводами. Задачу решаю абсолютно по-своему и всю сразу - с обходом препятствий, с исключением наложения соединителей, с соблюдением правил "отхода" от "разъемов". Это не тривиально, но без этого всего решение никому тут не нужно. И у меня нет дурацкой привычки пытаться перепрыгнуть овраг в два прыжка, если я знаю, что могу в один. Если кого-то сильно интересует - уже перелетел через середину оврага. Улыбающийся
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.058 секунд. Запросов: 22.