Поворот текста (mapbasic)

MapInfo, MapBasic
Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Поворот текста (mapbasic)

Сообщение Slinger » 20 мар 2013, 21:17

Доброго времени суток.

Возникла крестьянская задача. Потребовалось набросать процедуру, которая у текстовых объектов выборки меняет угол поворота на выбранный пользователем. Используемый код:

Код: Выделить всё

Dim obje As Object
Dim SelCount, i As Integer
Dim angle As Float

SelCount = TableInfo (Selection, TAB_INFO_NROWS)
Fetch First From Selection
For i = 1 To SelCount Step 1
	obje = Selection.obj
	Alter Object obje Geography OBJ_GEO_TEXTANGLE, Angle
	Update Selection Set obj = obje Where RowID = i
	Fetch Next From Selection
Next
Close Table Selection
Код несколько утрирован, отсутствуют диалоги и интерфейс, которые впрочем и не нужны в данном случае. Проекцию не указывал, ибо в случае правки объектов, она видимо не нужна.

Всё работает прекрасно за одним исключением. После обработки почему-то меняется размер шрифта (на карте) у этих самых объектов. На несколько единиц, в зависимости от текущего масштаба. Если руками выделять каждый текстовый объект и изменять его, как и подразумевается, то размер не меняется. Есть у кого-нибудь идеи?
Последний раз редактировалось Slinger 20 мар 2013, 22:10, всего редактировалось 1 раз.

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Поворот текста (mapbasic)

Сообщение gamm » 20 мар 2013, 22:01

Slinger писал(а): Есть у кого-нибудь идеи?
экспортируйте пару символов в MIF/MID до и после поворота, и сравните (в том числе и "ручной" вариант). Либо действительно поменялся размер, либо это не баг, а фича :mrgreen:

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Поворот текста (mapbasic)

Сообщение Slinger » 20 мар 2013, 22:27

Это текстовые объекты.В .mif размер текста всегда 0. Их размер для текущего масштаба карты высчитывается в зависимости от координат левого нижнего и правого верхнего пункта (точки).

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2240
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1513
Откуда: Казань

Re: Поворот текста (mapbasic)

Сообщение Игорь Белов » 20 мар 2013, 22:31

Slinger писал(а):Это текстовые объекты.В .mif размер текста всегда 0. Их размер для текущего масштаба карты высчитывается в зависимости от координат левого нижнего и правого верхнего пункта (точки).
Думаю, Вы ответили на свой вопрос. Когда объекты меняет человек, MapInfo пересчитывает bbox за него. Программа должна делать это самостоятельно.
The purpose of computing is insight, not numbers

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Поворот текста (mapbasic)

Сообщение Slinger » 20 мар 2013, 22:57

Вот те раз. Есть у Вас предложения, как подобное реализовать?

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Поворот текста (mapbasic)

Сообщение gamm » 21 мар 2013, 04:41

Slinger писал(а):Вот те раз. Есть у Вас предложения, как подобное реализовать?
грузите файл куда вам удобнее (по мне, так в R), и пишите его сами в текстовом виде, пересчитывая bounding box. Как-то так ...

Аватара пользователя
dab
Гуру
Сообщения: 671
Зарегистрирован: 16 дек 2011, 20:02
Репутация: 170
Ваше звание: Гуру
Откуда: Москва
Контактная информация:

Re: Поворот текста (mapbasic)

Сообщение dab » 21 мар 2013, 07:24

Slinger писал(а):... После обработки почему-то меняется размер шрифта (на карте) у этих самых объектов. На несколько единиц, в зависимости от текущего масштаба...
Глюк наблюдать не удалось. Брал Ваш код, добавил

Код: Выделить всё

Include "MapBasic.Def"
...
Angle = 30
...
Размер шрифта НЕ меняется.
Пробовал с данными таблицы в План-схеме, Долготе-Широте, Пулково-1942. Шрифт по умолчанию Arial CYR
Mapinfo 10.5.2 rb202

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Поворот текста (mapbasic)

Сообщение Slinger » 21 мар 2013, 09:39

2gamm

Боюсь, просить всех остальных пользователей осилить R - дело гиблое =)

2dab

Хех, точно, если объявить угол заранее, принудительно, а не просить пользователя ввести его, то происходит всё корректно. А вот если попробовать так:

Код: Выделить всё

Dim obje As Object
Dim SelCount, i As Integer
Dim angle As Float

Dialog Title "Настройки программы"
Control StaticText Title "Укажите угол поворота текста:" Position 5,10
Control EditText Value 0 Into Angle Position 118,9 Width 40
Control OKbutton  Position 8,30 Title "Подтвердить"
Control CancelButton Title "Отменить"

If CommandInfo(CMD_INFO_DLG_OK) Then
SelCount = TableInfo (Selection, TAB_INFO_NROWS)
Fetch First From Selection
For i = 1 To SelCount Step 1
	obje = Selection.obj
	Alter Object obje Geography OBJ_GEO_TEXTANGLE, Angle
	Update Selection Set obj = obje Where RowID = i
	Fetch Next From Selection
Next
Close Table Selection
End If
И попросить пользователя ввести число, то текст изменится на указанный угол, но размер шрифта увеличится.

ADD:

А хотя нет. Если пользователь введёт любое число, отличное от 0, то угол изменится на указанный и размер шрифта не увеличится. А вот если поставить 0, то размер возрастёт. Не пойму, баг или нет.

Аватара пользователя
dab
Гуру
Сообщения: 671
Зарегистрирован: 16 дек 2011, 20:02
Репутация: 170
Ваше звание: Гуру
Откуда: Москва
Контактная информация:

Re: Поворот текста (mapbasic)

Сообщение dab » 21 мар 2013, 10:06

Slinger писал(а):...А вот если поставить 0, то размер возрастёт...
А смысл ставить 0? :o

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Поворот текста (mapbasic)

Сообщение Slinger » 21 мар 2013, 11:05

Потому что в моём случае подписи некорректно экспортировались из акада и поворот подписей не горизонтальный (не нулевой). Нужно поставить на ноль. Ну или по желанию пользователя задавать любое число.

bim2010
Гуру
Сообщения: 977
Зарегистрирован: 27 янв 2009, 22:57
Репутация: 258

Re: Поворот текста (mapbasic)

Сообщение bim2010 » 21 мар 2013, 12:07

Завести поле в атрибутивной - угол поворота текста и по нему отработать.

Аватара пользователя
dab
Гуру
Сообщения: 671
Зарегистрирован: 16 дек 2011, 20:02
Репутация: 170
Ваше звание: Гуру
Откуда: Москва
Контактная информация:

Re: Поворот текста (mapbasic)

Сообщение dab » 21 мар 2013, 12:41

Slinger писал(а):Потому что в моём случае подписи некорректно экспортировались из акада и поворот подписей не горизонтальный (не нулевой). Нужно поставить на ноль. Ну или по желанию пользователя задавать любое число.
Ага, понял.
Причём увеличение шрифта после поворота на 0 градусов происходит пропорционально ширине символов надписи.
Например, от 30 градусов до 0, для текста "шшш" шрифт увеличивается с 9 на 20, а для "iii" с 9 на 10.
Думаю, что да, дело в bbox.
PS
Быть может будет проще выделенные подписи, те, у которых нужно сделать угол ноль, экспортировать в mif, убрать у каждого объекта строку "Angle ..." и экспортировать обратно :) Ход конём, так сказать.

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2240
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1513
Откуда: Казань

Re: Поворот текста (mapbasic)

Сообщение Игорь Белов » 21 мар 2013, 13:15

Похоже, при программном задании нуля MapInfo использует MBR текстового объекта, сохраняя размах по Y при расчёте нового размера (см. картинку). Можно попробовать при нулевом повороте корректировать размеры объекта:

Код: Выделить всё

            H²
h = ─────────────────
    H cos θ + W sin θ

    W
w = ─ h
    H
где θ — исходное значение угла; H, W — полученные размеры объекта; h, w — рекомендуемые.
Вложения
text_mbr.png
text_mbr.png (1.44 КБ) 11444 просмотра
The purpose of computing is insight, not numbers

thegeo
Активный участник
Сообщения: 161
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: Поворот текста (mapbasic)

Сообщение thegeo » 21 мар 2013, 14:45

В рассматриваемом случае высота рассчитываемой области рисования нового текста определяется по высоте минимального прямоугольного покрытия исходного текста. Так ли это и было задумано или это ошибка разработчика трудно сказать.
Как поступать в этом случае. На мой взгляд, возможны два варианта:
- Пересчитывать и перерисовывать, что может оказаться накладно;
- Так как в данном случае не требуется абсолютной строгости добавить в код строку if Angle=0 then Angle=0.1 end if. На визуальном восприятии это никак не отразится.

Slinger
Гуру
Сообщения: 879
Зарегистрирован: 17 июн 2010, 23:14
Репутация: 207
Откуда: Москва

Re: Поворот текста (mapbasic)

Сообщение Slinger » 21 мар 2013, 14:56

ErnieBoyd

А подобное можно реализовать в коде? Или расчёт всё равно будет не очень-то и корректным?

thegeo

Была такая мысль, использовать максимальное близкое значение угла к нулю, но это уже если не удастся победить этот баг/фичу.

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя