InvalidateRect problem

0 голосов
спросил 28 Окт, 04 от Гость (210,080 баллов) в категории Программные продукты Esri

   Возможно ли в Редактируемой полигональной Теме при удалении случайного полигона перерисовать _только_ область его экстента?

aExtent=FTab.ReturnValue ( aField, aRecNumber ).ReturnExtent

FTab.RemoveRecord ( aRecNumber )

av.GetActiveDoc.GetDisplay.InvalidateRect (aExtent)

пс. При этом не только перерисовываются все обьекты Темы, а все обьекты всех слоев. А должно быть вот это: Invalidates the area of aDisplay defined by aRect. Only the area of the display specified by aRect is redrawn. See the discussion of "Clipping and Invalidation" for the class Display.

Обратите внимание, что в т.н. дискиссии обьекты добавляют, а в моем случае удаляют, что ведет за собой изменение порядковых номеров оных. Интересуют желательно практические советы.

7 Ответы

0 голосов
ответил 29 Окт, 04 от BigSerg (4,080 баллов)
Сделай проще - не удаляй его а заменяй на экстент
FTab.SetValue ( aField, aRecNumber,aExtent )
если тебе пом их надо удалить добавь какое нить поле и в него добавляй признак для удаленя
и когда надо удалишь :)
0 голосов
ответил 29 Окт, 04 от BigSerg (4,080 баллов)
Пардон, сглупил, не понял до конца вопроса
а в чем собтвенно проблема?
Дисплею все равно на изменение порядкогого номера
при удалении строки из FTAB,
он обновляет(перерисовывает) все что попадает в этот экстент не обращая внимания на слои - имхо так
это легче было проверить самому чем писать об этом в форум
0 голосов
ответил 29 Окт, 04 от dindzilin (4,160 баллов)

Вот мой вариант. Перед удалением объекта пишешь:

theView.GetDisplay.DisableRedraw 
myExtent = theTheme.GetFTab.ReturnValue ( aField, aRecNumber ).ReturnExtent

mySym = theTheme.GetFeatureSymbol(aRecNumber).Clone
mySym.SetColor (Color.GetWhite )
mySym.SetOlWidth(mySym.GetOlWidth+3)
mySym.SetOlColor(Color.GetWhite)

Затем удаляешь объект. И наконец:

theView.GetDisplay.BeginClip 
theView.GetDisplay.DrawRect (myExtent, mySym)
theView.GetDisplay.EndClip

Однако после выполнения всех этих действий надо бы выполнить

theView.GetDisplay.EnableRedraw

после чего вид будет перерисовываться в нормальном режиме.

Вместо Color.GetWhite лучше использовать цвет фона вида.

Криво, но зато работает !!!

0 голосов
ответил 03 Дек, 04 от Гость (210,080 баллов)
Спасибо за конкретные примеры-все работает! Вот моя версия + разгрузил переменные :)

mySym=(Symbol.Make(#SYMBOL_FILL))
pf=av.getActiveDoc.GetBackgroundSymbol
if(pf=Nil)then
pf=Color.GetWhite 'тонкий момент дефалт=Nil хотя льет белым
else
pf=pf.GetColor
end
mySym.SetColor(pf)
av.getActiveDoc.GetDisplay.DrawShape((av.getActiveDoc.GetEditableTheme.GetFTab.ReturnValue(av.getActiveDoc.GetEditableTheme.GetFTab.FindField("Shape"),av.getActiveDoc.GetEditableTheme.GetFTab.GetSelection.GetNextSet(-1))),mySym)
av.getActiveDoc.GetEditableTheme.GetFTab.RemoveRecords(av.getActiveDoc.GetEditableTheme.GetFTab.GetSelection)


Clip-ы и DisableRedraw экспериментально не понадобились

Практическая реализация тут: http://arcscripts.esri.com/details.asp?dbid=13352
0 голосов
ответил 07 Дек, 04 от dindzilin (4,160 баллов)
Вопрос: при вызове RemoveRecords вид полностью перерисовывается 
как бы по умолчанию, даже если этого не хочешь, если конечно не 
использовать DisableRedraw, а я так понял, что этого происходить 
не должно, тогда почему DisableRedraw не понадибился?
0 голосов
ответил 07 Дек, 04 от Гость (210,080 баллов)
RemoveRecords не вызывает перерисовку-как показал эксперимент, в подтверждение ссылка выше: скрипт не содержит Clip и DisableRedraw (сам только что скачал и проверил)image
0 голосов
ответил 28 Фев, 05 от Evgeny_ZX (660 баллов)
Для полного понимания резюмирую тред:

1.Удалял плигон>Скрипт отрабатывал>!Перерисовки нет воабще
2.Удалял плигон>иннициировал обновление только его экстента GetDisplay.InvalidateRect(ExtentOfDelPgon)>
>Скрипт отрабатывал>!Перерисоввался весь вид+!!все слои

Решение. Для удаления полигона с перерисовкой ТОЛЬКО измененной части
1-рисуем полигон на Display, обводим поверх цветом фона -удаляем косметически
2-удаляем полигон из Shape -физически
3-скрипт отрабатывает и Арквью сама перерисует измененную часть вида

ПС. Эксперементируйте и сообщайте людям какие еще фокусы возможны,
здесь же еще интересен тот факт, что BeginClip/EndClip не понадобились.
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...