www.map-info.ru :: Просмотр темы - как ускорить процедуру (alter object)
Заказать MapInfo Professional 10
На главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  

 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
sysrepos



Зарегистрирован: 22.10.2012
Сообщения: 39

СообщениеДобавлено: Вс Ноя 04, 2012 12:57 pm    Заголовок сообщения: как ускорить процедуру (alter object) Добавить ответ со ссылкой на данный текст

написал инструмент, который меняет цвет у всех объектов на карте в 1 слое.
но он очень долго выполняется (1000 объектов - 20 секунд), (та же самая функция которая есть в мапифно - делает тоже самое за 1 секунду, для тех же 1000 объектов) - выделить все объекты и сменить стиль области
Подскажите пожалуйста как можно ускорить выполнение этой функции?
Может я ее как то не так написал?
Все, из того, что я нашел для ускорения
Set Event Processing Off
Set Map Redraw Off
set table doma FastEdit On
не помогло


Include "mapbasic.def"
Include "icons.def"

Create ButtonPad "Мои Кнопки" As
pushbutton
Icon MI_ICON_ZOOM_QUESTION
Calling proc3
HelpMsg "proc3 изменяет все объекты"

global ob3 as object
global br3 as brush
global i, nomer3, cols as integer





sub proc3

Set Event Processing Off 'отключает реакцию на системные события
Set Map Redraw Off 'отключает автоматическую перерисовку окна карты
set table doma FastEdit On 'изменения записываются сразу в в файл, минуя файл транзакций


cols=tableinfo("doma", TAB_INFO_NROWS) 'количество строк в таблице
br3=makebrush(2,16776960,16776960) 'стиль, который будет присваиваться объектам

for i=1 to cols

fetch rec i from doma
nomer3=doma.rowid
ob3=doma.object

alter object ob3
info obj_info_brush, br3


update doma set object = ob3
where rowid=i

next
end sub

или может быть есть какое то зарезервированное слово/функция в mapbasic, которое выполняет эту процедуру?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
thegeo



Зарегистрирован: 17.01.2012
Сообщения: 119

СообщениеДобавлено: Пн Ноя 05, 2012 12:53 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Возможно так будет быстрее:

Include "mapbasic.def"
Declare Sub Main
Declare Sub tst1

Sub Main
call tst1
end sub
Sub tst1
'для выделенных объектов
dim lr as string
dim br as brush
lr=SelectionInfo(SEL_INFO_SELNAME)
br=MakeBrush(2,16776960,16776960)
update lr Set obj = ConvertToPline(obj)
Set Style Brush br
update lr Set obj = ConvertToRegion(obj)
end sub

Хотя, если речь идет о слое целиком, разумнее использовать глобальные настройки стиля.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Андрей Могильный



Зарегистрирован: 21.03.2006
Сообщения: 862

СообщениеДобавлено: Пн Ноя 05, 2012 4:44 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Попробуйте вот это убрать:
set table doma FastEdit On
были случаи на практике, когда оно наоборот замедляло операции обновления.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
sysrepos



Зарегистрирован: 22.10.2012
Сообщения: 39

СообщениеДобавлено: Пн Ноя 05, 2012 6:34 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

set table doma FastEdit On - пробовал и с ним и без, особой разницы нету.

а вот код thegeo - действительно быстро все делает.
только тогда вопрос, как аналогичным способом сделать для точек? их вроде не во что конвертировать.

и как использовать глобальные настройки стиля (это имеется ввиду в инструменты в самом мапинфо? или какая то функция в мапбэйсике)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
thegeo



Зарегистрирован: 17.01.2012
Сообщения: 119

СообщениеДобавлено: Вт Ноя 06, 2012 2:41 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

1. Установка глобальных стилей оформления для слоя. Аналогично для линии, заливки, шрифта.

Sub tst2 (byval Idmap as integer,byval nameLr as string)
dim sm as Symbol
sm=MakeSymbol(45, GREEN, 14)
Set Map Window Idmap Layer nameLr Display Global Global Symbol sm
end sub

Idmap – идентификатор окна карты
nameLr – имя слоя

2. Установка стилей для точек. Вариант хотя и выглядит несколько надуманным, но вполне рабочий.

Sub tst3
dim lr as string
dim sm as Symbol
lr=SelectionInfo(SEL_INFO_SELNAME)
sm=MakeSymbol(45, RED, 16)
Set Style Symbol sm
update lr Set obj = CreatePoint(CentroidX(obj),CentroidY(obj))
end sub
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
sysrepos



Зарегистрирован: 22.10.2012
Сообщения: 39

СообщениеДобавлено: Ср Ноя 07, 2012 10:40 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

спасибо, 2. Установка стилей для точек - тоже быстро делает.

1. Установка глобальных стилей - понял что имелось ввиду под глобальными настройками стиля, но это не то. (сами линии процедура не меняет) просто внешний вид в слое делает другой.
Спасибо.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
spawner



Зарегистрирован: 01.04.2009
Сообщения: 76

СообщениеДобавлено: Сб Фев 06, 2021 1:04 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Ооо, thegeo!!! Огромное тебе человеческое спасибо!

Я года три искал как быстро программно переоформлять большие объемы объектов, но до такой дичи конечно не мог даже додуматься!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Top.Mail.Ru