Имеем длинную линию (газопровод или т.п.) Вдоль этой линии выставлены подписи. Добавляем с ctrl точку в конец линии и все подписи улетают
![]()
Процитирую своё собственное письмо на help@vingeo.com от
15 декабря 2005г.
Имеется целый ряд давних “болезней” с подписями длин линий (и, очевидно, точек тоже). Тема не раз поднималась и на форуме.
-
Добавление/удаление узлов в полилинию
-
Разделение объекта в произвольном узле
-
Соединение двух объектов с подписями
Фактически, после таких операций, подписи приходится просто удалять и создавать всё заново, что КРАЙНЕ неприятно, особенно для объектов с большим количеством узлов.
В Инфо, естественно, мы видим не те длины, что на экране (по
количеству сегментов полилинии, по крайней мере). -
Редактирование положения узлов
Синхронно сдвигаются все подписи одновременно, что тоже красоты не добавляет.
Программа, сохраняет положение подписей относительно центра объекта, и это вполне приемлимо в большинстве случаев.
Но в случае длин/номеров точек желательно сохранять позицию
конкретной i-той подписи относительно i-го сегмента/узла полилинии.
Ну или если не сохранять, то динамически обновлять с учетом этой специфики. Лишние/недостающие подписи, возникающие в процессе редактирования желательно автоматически удалять или вставлять.
Конец цитаты.
[/quote]
Как ни прискорбно - но эту немаловажную просьбу с успехом игнорируют.
Но все пришло к тому что это делать надо. На данный момент стала очень острая проблема стыковки и связки в одно целое большого количества планшетов, которые естественно рисуют разные люди.
И теряние часов на восстановление подписей, мягко говоря неприемлимо
К сожалению, проблема связана со способом, каким Дигитал хранит положение подписей. Если проанализировать формат файла dmf, то можно увидеть, что сохраняются не абсолютные координаты месположения подписей, а дельты, координаты относительно центра объектов. Естественно, при изменении формы объекта его центр пересчитывается, подписи “ползут”.
Такое положение вещей вобщем-то логично для полигонов, контуров зданий, для линейных же объектов приводит к вышеописаным проблемам.
Таким образом, надо менять формат, или хотя бы внутреннюю обработку подписей вести в абсолютных, а при записи/чтении возвращаться к принятой схеме. Словом, проблема. ![]()
Однако , если говорить только о подписях длин линий и номеров точек, реализовать их правильную обработку можно и нужно чисто алгоритмически! Ведь каждому сегменту/узлу соответствует своя подпись, остается только их переставить требуемым образом при редактировании объекта(ов).
Категорически поддерживаю!
Сам не раз подымал эту давнюю проблему в разных темах!
В случае деления линии на части - подписи остаются на месте, слава Богу. При этом они, естественно, дублируются, оставаясь подписанными у обоих частей.
Это тоже не может не раздражать.
Проблема неоднозначная, конечно. Алгоритмизировать ее решение непросто. Нужно менять формат DMF-а…
Предлагаю хотя бы ввести настройку типа “Не перемещать подписи при редактировании узлов”
Алгоритм не так сложен как кажется. Речь (опять таки!) лишь о частном случае - параметрах -10, -9. С остальными все не так просто. ![]()
Исходим из того, что нам доступно два состояния объекта - до и после изменения узла.
Тогда для предыдущего состояния объекта:
- вычисляем и запоминаем для каждой подписи АБСОЛЮТНЫЕ координаты
- запоминаем разницу поворота подписи и дир угла каждого сегмента (для длин линий, параметр -10)
Затем применяем к новому состоянию объекта:
- для каждой подписи вычисляем новые относительные координаты
- если изменился дир угол сегмента, вносим также разницу в поворот (для длин)
При добавлении/удалении узла принцип тот же, необходимо только учесть добавленую или удаленную подпись. Аналогично соединение/расчленение.
Такой подход позволит свести возню с подписями к минимуму. Основная часть подписей останется на своих местах. ![]()
Слишком запутанное решение. Предлагаю так
При выделении объекта сохраняется его центр. После изменения все подписи смещаются обратно на дельту между старым и новым центром. Всё просто и эффективно. И в форматах ничиго меннять не надо. подписи которые будут на изменяемых сегментах я с удовольствием буду двигать сам.
Не пойдет!
Это как раз текущая реализация, именно так сейчас дигитал и действует.
Например, полилиния из двух сегментов, подписи длин линий:
10 10
o---------o*----------o
Изменяем узел:
o
|
10 * 10
|
о---------о
о узел
---- линия
- цетр размаха
Идет. я проверял ![]()
Просто надо учитывать изменяемый сегмент или нет. На изменяемых естественно надо доворачивать и передвигать руками. на статических всё будет стоять на своих местах
Нет. Так как раз Digitals не действует. При изменении центра размаха объекта положение подписей не пересчитывается, а так как позиции подписей -это не абсолютные координаты, а смещения относительно центра размаха объекта, то при этом и происходит смещение подписей.
На мой взгляд самое простое и эффективное решение предложил Dkrav. Хотя конечно, в идеале, неплохо бы ввести понятие “якоря” для подписей, который мог бы цеплятся не только к центру размаха объекта но и к каждому сегменту/узлу.
Хм.. Ну собственно я выше об этом и написал, а потом сам себя перехитрил в процессе полемики. ![]()
ОК, вносим дельту, остальное поправим руками.
Пересчет позиций подписей при редактировании точек объекта уже работает. Теперь подписи остаются на своих местах и не сползают при добавлении/удалении точек. Скачивайте новую версию.