CreateCircle

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

Re: CreateCircle

Сообщение Игорь Белов » 07 июн 2012, 13:41

Собственно вот работающий макет с зайчатками пользовательского интерфейса.

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

Include "mapbasic.def"

Define DEFRAD 1000 ' радиус в метрах по умолчанию

Declare Sub Main
Declare Sub ExitApp
Declare Sub MkCirc

Sub Main
  Create Menu "Круги" As
    "Создать круги" Calling MkCirc,
    "(-",
    "Выйти" Calling ExitApp
  Alter Menu ID 4 Add "Круги" As "Круги"
End Sub

Sub ExitApp
  End Program
End Sub

Sub MkCirc
  Dim sel, tbl, fname As String
  Dim sel_col1, sel_cobj As Alias
  Dim sel_obj As Object
  Dim r As Float

  If SelectionInfo(SEL_INFO_NROWS) = 0 Then
    Note "Выберите объект(ы) в окне ""Карта"""
    Exit Sub
  End If
  If WindowInfo(FrontWindow(), WIN_INFO_TYPE) <> WIN_MAPPER Then
    Note "Выберите объект(ы) в окне ""Карта"""
    Exit Sub
  End If
  Set CoordSys Window FrontWindow()
  ' Set Map Distance Units "m" / Странно, но не работает. Придётся переводить метры в статутные мили.
  fname = FileSaveAsDlg(GetFolderPath$(FOLDER_MYDOCS) + "\", "", "tab", "Создать таблицу")
  If fname = "" Then
    Exit Sub
  End If
  tbl = PathToTableName$(fname)
  sel = SelectionInfo(SEL_INFO_SELNAME)
  sel_col1 = sel + ".Col1"
  sel_cobj = sel + ".Obj"
  Create Table tbl ("Radius" Float)
  Create Map For tbl CoordSys Window FrontWindow()
  Fetch First From sel
  Do Until EOT(sel)
    sel_obj = sel_cobj
    Do Case ColumnInfo(sel, "COL1", COL_INFO_TYPE)
      Case COL_TYPE_DECIMAL, COL_TYPE_INTEGER, COL_TYPE_SMALLINT, COL_TYPE_FLOAT
        r = sel_col1
      Case Else
        r = DEFRAD
    End Case
    Insert Into tbl (Radius, Obj) Values (r, CreateCircle(CentroidX(sel_obj), CentroidY(sel_obj), r / 1609.344))
    Fetch Next From sel
  Loop
  Close Table sel
  Commit Table tbl
  Add Map Layer tbl
End Sub
Программа ставит своё меню "Круги" в [Tools]. Последовательность работы:
  • выделить один или несколько объектов в окне карты;
  • в меню нажать "Создать круги";
  • выбрать папку и имя файла со слоем кругов;
  • созерцать круги в окне карты.
Таблица (не косметическая!) должна иметь первую колонку числового типа и содержать в этой колонке значения радиусов в метрах. Это может быть и таблица-выборка, в которой нужная колонка сделана первой или единственной.
Один нюанс. Вопреки тому, что говорится в документации, команда Set Map Distance Units "m" у меня не сработала. Пришлось пересчитывать радиусы в статутные мили.
Последний раз редактировалось Игорь Белов 07 июн 2012, 16:30, всего редактировалось 3 раза.
The purpose of computing is insight, not numbers

Krom
Новоприбывший
Сообщения: 9
Зарегистрирован: 31 май 2012, 12:36
Репутация: 0

Re: CreateCircle

Сообщение Krom » 07 июн 2012, 14:18

Спасибо Вам, ErnieBoyd! Это именно то что нужно.
Если запускать из окна mapbasic пишет ошибку - "Встретилось [sub] там, где ожидается [mapinfo]".
Сохранить как mbx и запустить тоже не получилось. Нужно как-то компилировать?

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

Re: CreateCircle

Сообщение Игорь Белов » 07 июн 2012, 14:43

Нужен компилятор, переводящий команды программы в байткод. Причём не следует выбирать версию новее, чем у Вашего MapInfo. Сегодня PitneyBowes предлагает для загрузки версии от 9.5 до 11: Загрузки MapBasic.
Инсталлируйте программу MapBasic. Ярлычок появится в [Пуск] -> [MapInfo]. Запустите MapBasic. Создайте новый файл: [File] -> [New]. Текст программы с помощью "КОД: ВЫДЕЛИТЬ ВСЁ" скопируйте/вставьте и сохраните [File] -> [Save As...] как "Program Source (*.mb)". Скомпилируйте в байткод: [Project] -> [Compile Current File]. Файл с расширением MBX готов. Можно запустить его прямо из MapBasic'а: [Project] -> [Run].
Можно запустить его в MapInfo через [Tools] -> [Tool Manager...] или через кнопку [Run MapBasic Program] на тулбаре [Tools].
The purpose of computing is insight, not numbers

Krom
Новоприбывший
Сообщения: 9
Зарегистрирован: 31 май 2012, 12:36
Репутация: 0

Re: CreateCircle

Сообщение Krom » 07 июн 2012, 15:06

ErnieBoyd, я Вам очень признателен. Всё работает. Спасибо огромное за помощь!

Ответить

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

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

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