Страница 1 из 2

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

Добавлено: 20 мар 2013, 21:17
Slinger
Доброго времени суток.

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

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

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
Код несколько утрирован, отсутствуют диалоги и интерфейс, которые впрочем и не нужны в данном случае. Проекцию не указывал, ибо в случае правки объектов, она видимо не нужна.

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

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

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

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

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

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

Добавлено: 20 мар 2013, 22:31
Игорь Белов
Slinger писал(а):Это текстовые объекты.В .mif размер текста всегда 0. Их размер для текущего масштаба карты высчитывается в зависимости от координат левого нижнего и правого верхнего пункта (точки).
Думаю, Вы ответили на свой вопрос. Когда объекты меняет человек, MapInfo пересчитывает bbox за него. Программа должна делать это самостоятельно.

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

Добавлено: 20 мар 2013, 22:57
Slinger
Вот те раз. Есть у Вас предложения, как подобное реализовать?

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

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

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

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

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

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

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

Добавлено: 21 мар 2013, 09:39
Slinger
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, то размер возрастёт. Не пойму, баг или нет.

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

Добавлено: 21 мар 2013, 10:06
dab
Slinger писал(а):...А вот если поставить 0, то размер возрастёт...
А смысл ставить 0? :o

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

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

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

Добавлено: 21 мар 2013, 12:07
bim2010
Завести поле в атрибутивной - угол поворота текста и по нему отработать.

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

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

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

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

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

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

    W
w = ─ h
    H
где θ — исходное значение угла; H, W — полученные размеры объекта; h, w — рекомендуемые.

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

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

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

Добавлено: 21 мар 2013, 14:56
Slinger
ErnieBoyd

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

thegeo

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