По поводу малых углов. Забавно, что 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