Re: CreateCircle
Добавлено: 07 июн 2012, 13:41
Собственно вот работающий макет с зайчатками пользовательского интерфейса.
Программа ставит своё меню "Круги" в [Tools]. Последовательность работы:
Один нюанс. Вопреки тому, что говорится в документации, команда Set Map Distance Units "m" у меня не сработала. Пришлось пересчитывать радиусы в статутные мили.
Код: Выделить всё
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
- выделить один или несколько объектов в окне карты;
- в меню нажать "Создать круги";
- выбрать папку и имя файла со слоем кругов;
- созерцать круги в окне карты.
Один нюанс. Вопреки тому, что говорится в документации, команда Set Map Distance Units "m" у меня не сработала. Пришлось пересчитывать радиусы в статутные мили.