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