На сообщение:
viewtopic.php?p=48298#p48298С. Тарасенко писал(а):
Принципиальное решение вижу в том, чтобы вместо объектов-узлов использовать объекты-линии. Тогда они, хошь не хошь, будут отпихивать фигуры, в которые они врезаются при обновлении. А так, конечно, часто происходит пересечение, требующее ручной перестановки.
Сформулировать понятнее пока не могу.
Да в общем-то понятно
Я бы только исходил из другого Вашего предложения:
viewtopic.php?p=48311#p48311С. Тарасенко писал(а):
Я так понял, что стрелка прёт налево, и ей плевать, что вокруг. Если она упрётся в фигуру, та сдвинется. А такой фигуры, как ШАМПУР, в схеме нет. Вот она и прёт напролом.
А если бы был такой объект - ЛИАНА, в том числе весь шампур, начиная от узла над вариантом, - то стрелка почуяла бы его и вытеснила. Вот я и предлагаю использовать не узлы, а целиком линии.
Т.е. нужна иерархия структуры схемы: вершины (иконы, точки ввода, изломы неглавных вертикалей) и рёбра (звенья вертикалей) должны образовывать более крупные объекты-лианы. Точнее говорить о вертикалях, каждой из которых на диосцене выделено пространство - "ритмическая полоса", как говорит Владимир Даниелович.
Для прокладки новых путей после пересадки/заземления это д.б. "фигура" - т.е. целостный объект, в "ритмическую полосу" которого вторгаться ("переть напролом") нельзя. Только не стрелка должна вытеснять - наоборот, нужно автоматически перемещать иконы и линии, начиная с точки её присоединения, вниз настолько, чтобы эта точка вышла ниже края ритмической полосы мешающей лианы.
Также уточнил бы принцип обновления, вызванного перемещением икон (и автоматическим, и ручным):
* высота узлов (икон) и длина линий (звеньев вертикалей) устанавливается в единицах-шагах привязки по вертикали (ВШП); величину ВШП метрически задаёт оператор для данного листа, причём в редакторе заложен минимально допустимый шаг;
NB. Можно принять за ВШП длину полузвена вертикали (от точки ввода/излома до ближайшей иконы).
* ширина икон устанавливается также, горизонтальный шаг привязки (ГШП) задаётся отдельно;
NB. Метрические значения ШП пересчитываются в пиксельные и так используются для построений.
* линии схем чертятся по условным линиям сетки, заданной на листе привязкой (начало сетки, допустим, в левом верхнем углу рабочей области);
* изменение любого из ШП, ессно, вызывает перечерчивание листа; изменение ГШП влияет также на ширину строк текста икон и потому перед перечерчиванием текст перевыключается и под результаты подгоняются высоты полей икон;
* "ритмическая полоса" вертикали - прямоугольник с отступом в один шаг привязки от габарита наиболее выпирающ<его|их> в каждую сторону объект<а|ов>;
NB. По вертикали границы отсчитываются от конечных вершин - для шампура это Заголовок и Конец, для других вертикалей - изломы (естественные, показаны в этом подпункте); тогда условия целостности "ритмической полосы" и невозможности пересечения вертикали эквивалентны.
* по вертикали иконы двигаются шагами (клавишами стрелок - на шаг, при буксировке мышью - новое положение покажет "контурный двойник" иконы); при этом икона как бы ходит поверх участка вертикали между соседними иконами.
* по горизонтали (относительно своей вертикали) двигаем иконы также пошагово (пределы - совмещение вертикали с правой/левой границей прямоугольного поля, которое есть в каждой сложной иконе - как сделал Станислав при "ресторации" Ты-среды); когда икона соприкоснётся с "ритмической полосой" в направлении движения, а двигать ещё есть куда - каждый следующий шаг вызывает "отпихивание" всех вертикалей схемы, лежащих по направлению движения (и удлинение горизонталей, идущих в другую часть схемы);
* узлы (иконы, точки ввода) д.б. недеформируемыми при вертикальном перемещении ("отпихивающими") объектами всегда, а линии (звенья вертикалей) - только когда при движении присоединяемой иконы размер звена сократился до одного ВШП; далее начинает двигаться всё, что лежит на данной вертикали по направлению движения (а что против направления движения - остаётся на месте), причём если вертикаль входит в нелинейную структуру - двигаются и остальные вертикали этой структуры;
* когда движущаяся часть схемы какой-то из своих ритмических полос достигает границ рабочей области листа - движение прекращается и выдаётся предупреждение оператору.
При движении структуры другие её вертикали, охватывающие перемещаемый узел, удлиняются (поскольку их концы со стороны, откуда двигаем, остаются на месте). При этом с вертикалями петель циклов всё просто - они однозвенные, а с остальными надо решить - как распределить удлинение по звеньям (их минимум два, а в общем случае - и больше)? Типов решений два - удлиняется только одно звено либо пропорционально все затрагиваемые звенья. Второе в любом случае нарушает условие кратности длин шагу привязки и потому не годится. Для одного звена надо выбрать - какое? Для вертикали, содержащей перемещаемую вершину, разумно выбрать ближайшее к этой вершине (т.е. лежащее с той стороны, откуда двигаем). Для остальных можно выбирать одно из крайних либо какое-то из остальных. Второе неудобно непредсказуемостью для оператора и потому не рассматривается. Из крайних можно удлинять также звено с конца, лежащего не в направлении движения.
Двигать вручную можно и не одну вершину, а цепочку (предварительно выделенную мышью).
По сути, это то, что уже предлагал
в этом сообщении, только изложено иначе.