Добрый день! Пытаюсь, через mapbasic, записать в текстовый файл имена выбранных точек, один набор - одна строчка. Столкнулся с такой проблемой, исходные точки идут по порядку, а во временной таблице они в разнобой и как в текстовый файл дописать новый набор точек с новой строки. Помогите, пожалуйста! Код: Include "mapbasic.def" Include "icons.def" Declare Sub Main Declare Sub prof Global tab_start,tab_dir as String Global i,layer_id As integer Global win_name as String Global selregion As Object Global pn as String Sub Main Alter ButtonPad ID 3 ' изменяем панель Программы add ' добавляем separator ' разделитель ToolButton ' кнопку Icon MI_ICON_LETTERS_X HelpMsg "точки для профилей \n точки для профилей" ' первая - комент в строке состояния, вторая - под кнопкой Cursor MI_CURSOR_CROSSHAIR DrawMode DM_CUSTOM_POLYGON Calling prof end sub Sub prof selregion = CommandInfo(CMD_INFO_CUSTOM_OBJ) ' запоминаем выбранный регион win_name = FrontWindow() ' верхнее окно layer_id = 1 ' 1й слой карты tab_start = LayerInfo(win_name, layer_id, LAYER_INFO_NAME) ' его имя print tab_start Select col1 ' выбираем только имена From tab_start Where selregion Contains obj into tab_temp ' выбрать из tab_start объекты попадающие в selregion, записать в tab_temp 'print chr$(12) ' очистить окно Сообщение 'print "Выбрано: "+ Str$(SelectionInfo(SEL_INFO_NROWS))+" п.н." i = InStr(1, TableInfo(tab_start,TAB_INFO_TABFILE), ".TAB") ' позиция курсора в полном путе к tab_start где встречается ее расширение if i=0 then i = InStr(1, TableInfo(tab_start,TAB_INFO_TABFILE), ".tab") ' тоже самое на случай прописных букв end if tab_dir=Left$(TableInfo(tab_start,TAB_INFO_TABFILE),i-1) ' папка и имя tab_start Open File tab_dir+"_prof.txt" For Output As #1 charset "WindowsCyrillic" ' создаем файл txt с именем как tab и в тойже папке, выбираем кодировку Fetch First From tab_temp ' перебираем объекты Do Until EOT(tab_temp) ' если не конец pn=pn+ Chr$(9) + tab_temp.col1 Fetch Next From tab_temp Loop print #1, "prof_1" + pn 'Close Table tab_temp Close File #1 print "сохранено:" print tab_dir+"_prof.txt" End Sub
ПРиветствую. К сожелению, сейчас нет установленного MapBasic, по этому не могу проверить код. Но вот это место интересно Почему запись в файл идет за циклом??? Попробуй так (mapbasic автоматически добавляет в конец строки коды переноса и возврата каретки) Fetch First From tab_temp ' перебираем объекты Do Until EOT(tab_temp) ' если не конец print #1, "prof_1" + tab_temp.col1 Fetch Next From tab_temp Loop А вот вопрос про последовательность записи имен не понял - в выбранной таблице (Selection) не так пронумерованы объекты как в конечном файле?
спасибо за ответ! в цикле я делаю для того что бы в строчку записать сразу весь набор точек (выбрал - записал, выбрал - записал) и вначале его стоит некое слово prof (которое должно увеличиваться). И точки должны записаться последовательно, но в исходной таблице они идут по порядку, а во временной почему-то вразнобой. Это можно решить сортировкой по Х или по У... Но я не знаю как дописывать файл и чтоб с новой строки. На картинке показал какой у меня выходит результат. это я записал три раза, prof только первый раз был, и дважды точки идут не последовательно
Как я выше описал записывай в цикле не в переменную, а сразу в файл Код: Fetch First From tab_temp ' перебираем объекты Do Until EOT(tab_temp) ' если не конец print #1, "prof_1" + tab_temp.col1 Fetch Next From tab_temp Loop если все же хочется через переменную то как то так надо добавлять символ №10 (9 - табуляция) Chr$(10)
я выбираю 5 точек, они с разделителем - Табулятор записываются в строку, в файл это prof1. Затем выбираю еще точки, в текстовом файле записывается новая строка (prof2) с этими точками. В случае, когда делать это в цикле, то для одного набора каждая точка записывается с новой строки.
сделал отдельно две кнопки, для горизонтальных профилей и для вертикальных. еще раньше переменная pn постоянно дописывалась к старому набору и из-за этого получался один длинный профиль. сейчас разделил. Но как дописывать файл? и можно ли как то сделать счетчик профилей Оффтоп (Move your mouse to the spoiler area to reveal the content) Код: Include "mapbasic.def" Include "icons.def" Declare Sub Main Declare Sub prof_X Declare Sub prof_Y Declare Sub record Global tab_start,tab_dir as String Global i,layer_id As integer Global win_name as String Global selregion As Object Global pn as String Sub Main Alter ButtonPad ID 3 ' изменяем панель Программы add ' добавляем separator ' разделитель ToolButton ' кнопку Icon MI_ICON_ARROW_1 HelpMsg "точки для профилей \n точки для профилей" ' первая - комент в строке состояния, вторая - под кнопкой Cursor MI_CURSOR_CROSSHAIR DrawMode DM_CUSTOM_POLYGON Calling prof_X ToolButton ' кнопку Icon MI_ICON_ARROW_4 HelpMsg "точки для профилей \n точки для профилей" ' первая - комент в строке состояния, вторая - под кнопкой Cursor MI_CURSOR_CROSSHAIR DrawMode DM_CUSTOM_POLYGON Calling prof_Y end sub Sub prof_X selregion = CommandInfo(CMD_INFO_CUSTOM_OBJ) ' запоминаем выбранный регион win_name = FrontWindow() ' верхнее окно layer_id = 1 ' 1й слой карты tab_start = LayerInfo(win_name, layer_id, LAYER_INFO_NAME) ' его имя Select col1,centroidX(obj),centroidY(obj) From tab_start Where selregion Contains obj into tab_temp ' выбрать из tab_start объекты попадающие в selregion, записать в tab_temp Order By 2 ' сортировать по X call record End Sub Sub prof_Y selregion = CommandInfo(CMD_INFO_CUSTOM_OBJ) ' запоминаем выбранный регион win_name = FrontWindow() ' верхнее окно layer_id = 1 ' 1й слой карты tab_start = LayerInfo(win_name, layer_id, LAYER_INFO_NAME) ' его имя Select col1,centroidX(obj),centroidY(obj) From tab_start Where selregion Contains obj into tab_temp ' выбрать из tab_start объекты попадающие в selregion, записать в tab_temp Order By 3 Desc ' сортировать по Y (в обратном порядке, с верху в низ) call record End Sub Sub record i = InStr(1, TableInfo(tab_start,TAB_INFO_TABFILE), ".TAB") ' позиция курсора в полном путе к tab_start где встречается ее расширение if i=0 then i = InStr(1, TableInfo(tab_start,TAB_INFO_TABFILE), ".tab") ' тоже самое на случай прописных букв end if tab_dir=Left$(TableInfo(tab_start,TAB_INFO_TABFILE),i-1) ' папка и имя tab_start Open File tab_dir+"_prof.txt" For Output As #1 charset "WindowsCyrillic" ' создаем файл txt с именем как tab и в тойже папке, выбираем кодировку pn="начало" Fetch First From tab_temp ' перебираем объекты Do Until EOT(tab_temp) ' если не конец if pn="начало" then pn=tab_temp.col1 else pn=pn+ Chr$(9) + tab_temp.col1 end if Fetch Next From tab_temp Loop print #1, "prof_1" + Chr$(9) + pn 'Close Table tab_temp Close File #1 print "сохранено:" print tab_dir+"_prof.txt" End Sub
чтоб дописать файл, его надо открыть через Append Код: Open File tab_dir+"_prof.txt" For Append As #1 charset "WindowsCyrillic" осталось решить как сделать счетчик --- Сообщения объединены, 29 сен 2017, Оригинальное время сообщения: 29 сен 2017 --- + счетчик Код: i=1 Input #1, win_name Do Until EOF(1) i=i+1 Input #1, win_name Loop почему-то строки куда-то надо записывать, чтоб не делать новые переменные использовал уже свободные. Окончательный текст программы в прикрепленном файле
теперь нужно выделенные точки соединить линией, план такой: открываем таблицу, первый раз ее нет, тогда создаем ее, присоединяем карту, добавляем слой Код: OnError Goto creat_tabl Open Table tab_dir+"_prof" as tab_start+"_prof" open_map: Create Map For tab_start+"_prof" CoordSys Table tab_start ' присоединяем карту, сист.коор из tab_start Add Map Layer tab_start+"_prof" position 20 ' добавляем слой ...... creat_tabl: Create Table tab_start+"_prof" (n char(10)) ' создание табл Resume open_map ....... но при первом запуске входит ошибка что файл не найден и таблицу открыть не удалось. Программа вылетает, при этом создаются два файла с расширением tab и dat и при повторном запуске программы все проходит. Может кто знает в чем ошибка? помогите пожалуйста
Как мало информации, но попробуем разобраться... 1. Выполняются ли проверки на присутствие таблицы? (если не открыта, то открываем) 2. Выполняется ли проверка на наличие открытых карт? (если карта не создана, то создаем из "нашего" слоя) 3. Если таблица открыта и карта есть то добавляем нашу таблицу к карте.
выполняется. вначале таблицы нет, выходит ошибка, в этом случае переходим к созданию таблицы после чего возвращаемся создаем карту и добавляем слой
Вот по быстрому накадал.. dim winMapIsExist as logical dim tableIsOpen as logical dim i as integer define TAB_PATH "C:\Users\Maks\Documents\" define TAB_NAME "моя_таблица" 'проверям существования фала на диске. 'если файла нет, то создаем if not FileExists(TAB_PATH + TAB_NAME + ".TAB") then 'создание части с данными (*.dat, *.tab) Create Table TAB_NAME (qqq Char(10)) file TAB_PATH + TAB_NAME + ".TAB" Type NATIVE Charset "WindowsCyrillic" ' создание части для карты (*.map, *.id) Create Map For TAB_NAME End If 'Проверяем не загружена ли таблица tableIsOpen = false for i = 1 to NumTables() if TableInfo(i,TAB_INFO_NAME) = TAB_NAME then tableIsOpen = true exit for End If Next 'Открываем таблицу if tableIsOpen = false then Open Table TAB_PATH + TAB_NAME + ".TAB" End If if NumWindows() > 0 then 'Если есть открытые карты добавляем в них нашу таблицу winMapIsExist = false for i = NumWindows() to 1 step -1 if WindowInfo(i, win_info_type) = WIN_MAPPER then 'добавляем слой в карту Add Map Auto Layer TAB_NAME winMapIsExist = true end if next else ' Если карты нет - создадим ее из нашего слоя if winMapIsExist = false then Map From TAB_NAME end if end if