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

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

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

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

Выше я уже писал, что MBR (он же bbox) Ваша программа должна модифицировать самостоятельно. Если Вы посмотрите на результаты своей программы при ненулевых углах, MBR у объектов остаётся от их прежнего варианта. Левый верхний угол не совпадает с исходным положением, а ползает по сторонам MBR. Такое поведение отличается от редактирования вручную, что бросается в глаза при значительных изменениях угла разворота.

По поводу малых углов. Забавно, что 0.1 и 359.9 дают порой очень различающиеся результаты. Это следствие сказанного выше. А вообще предложение неплохое.

Закодировать можно всё, хоть и криво в силу ограниченности языка. В приведённой здесь реализации я не придумал ничего лучшего, как положить в основу математики сравнение старого и нового размеров шрифта. Поскольку эти величины в MapInfo целочисленные, неизбежны погрешности, зависящие от размеров буковок в окне карты.

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

Include "mapbasic.def"

Dim obje As Object
Dim SelCount, i As Integer
Dim angle, angle0 As Float
Dim txtsz, txtsz0 As Float
Dim xmin, ymin, xmax, ymax, dx, dy, x0, y0 As Float
Dim c, s, h, w 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 "Отменить"

Set CoordSys Window FrontWindow()
If CommandInfo(CMD_INFO_DLG_OK) Then
SelCount = TableInfo (Selection, TAB_INFO_NROWS)
For i = 1 To SelCount
  Fetch Rec i From Selection
  obje = Selection.obj
  angle0 = ObjectGeography(obje, OBJ_GEO_TEXTANGLE)
  txtsz0 = TextSize(FrontWindow(), obje)
  Alter Object obje Geography OBJ_GEO_TEXTANGLE, angle
  If angle = 0 And angle0 <> 0 Then
    c = Cos(angle0 * DEG_2_RAD)
    s = Sin(angle0 * DEG_2_RAD)
    xmin = ObjectGeography(obje, OBJ_GEO_MINX)
    ymin = ObjectGeography(obje, OBJ_GEO_MINY)
    xmax = ObjectGeography(obje, OBJ_GEO_MAXX)
    ymax = ObjectGeography(obje, OBJ_GEO_MAXY)
    dx = xmax - xmin
    dy = ymax - ymin
    x0 = xmin + dx / 2
    y0 = ymin + dy / 2
    txtsz = TextSize(FrontWindow(), obje)
    h = dy * txtsz0 / txtsz
    w = (dy - Abs(c) * h) / Abs(s)
    Alter Object obje Geography OBJ_GEO_MINX, x0 - w / 2
    Alter Object obje Geography OBJ_GEO_MINY, y0 - h / 2
    Alter Object obje Geography OBJ_GEO_MAXX, x0 + w / 2
    Alter Object obje Geography OBJ_GEO_MAXY, y0 + h / 2
  End If
  Update Selection Set obj = obje Where RowID = i
Next
Close Table Selection
End If
The purpose of computing is insight, not numbers

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

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

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

Предлагаю свой вариант решения. Конечно несколько громоздко и затратно, но по другому не получается.
Вложения
example.rar
Это пример подхода к решению рассматриваемой задачи
(2.03 КБ) 393 скачивания

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

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

Сообщение thegeo » 22 мар 2013, 15:15

ErnieBoyd писал(а):Закодировать можно всё, хоть и криво в силу ограниченности языка.
Язык это инструмент, средство. И люди не один раз доказывали, что даже примитивным инструментом можно делать прекрасные вещи. В нашем алфавите всего три десятка с небольшим букв, но никто не говорит об убогости языка построенного на этом алфавите. Лишь хочется выразить благодарность алфавиту за любезно предоставленные буквы.
По поводу предложенного решения. На рисунке привожу результаты небольшого тестирования: слева до поворота, справа после. Для ориентировки зеленым показана область MBR до поворота. Следует также отметить изменение размера шрифта после поворота на один пункт. Все говорит о том, что после поворота текст может оказаться сильно не на том месте.
tst.png
tst.png (9.32 КБ) 5490 просмотров

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

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

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

ErnieBoyd
thegeo

Большое спасибо за оперативные решения. В принципе мою задачу решают оба варианта, так как при использовании расчёта баундов в способе ErnieBoyd текстовая надпись съезжает не критично, а при использовании способа thegeo создание нового объекта опять-таки не очень скажется на процессе. В любом случае и тот и другой вариант лучше непонятного увеличения шрифта.

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

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

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

Спешу поделиться ссылкой на замечательную статью Жака Пари Handling MapInfo TEXT OBJECTS — своеобразный отчёт по результатам экспериментов. Рекомендую! Я вчера вечером рисовал на бумажке чертежи и формулы, а сегодня нашёл в этой статье свои формулы и картинки в моих же обозначениях, только изложенными десять лет назад :)
Кстати, о наших с thegeo решениях. Процитирую Жака: «Есть два способа программного изменения размера текста: в одном изменяется “высота” текстового объекта, в другом объект создаётся заново с правильным размером шрифта в точках». Детализируя, Жак рассматривает особенности, возникающие при задании TBR (как MBR, только для текстов) и при использовании функции CreateText().
The purpose of computing is insight, not numbers

Ответить

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

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

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