RUS  ENG 

Выборка объектов попадающиъх на экран

Страницы: 1
RSS
Выборка объектов попадающиъх на экран
 
Подскажите можно ли реализовать в макросе выборку объектов слоя в группу попадающих (полностью или частично) на экран монитора (без участия человека)
 
Можно. Получаете координаты местности размеров экрана IMapView.GetBoundsRectangle. Создаете контур, а затем IntersectByContour (http://politerm.com/zuludoc/zuluax/Layer_IntersectByContour.htm)
 
по поводу IMapView.GetBoundsRectangle какие координаты (сколько,какие он возвращает в справке этого нет)
 
Зависит от проекции карты. Если MapDoc.GetCRS.ProjectionType = eProjPlan (0) то в сантиметрах Если eProjLatLon (1) то в градусах, остальное в метрах
 
Я не о том, как получить из IMapView.GetBoundsRectangle конкретные координаты X и Y одного угла и второго (max и min ?) к примеру:
Xmin= Map.Views.Active.GetBoundsRectangle... в VbScript
 
Не дописано, но тоже что и у MapDoc http://www.politerm.com.ru/zuludoc/zuluax/MapDoc_GetBoundsRectangle.htm

Код
'VBScript
Sub ScreenBounds()

Set Doc = Zulu.ActiveMapDoc

Set RC = Doc.Views.Active.GetBoundsRectangle

msgbox  "Xmin: " + Cstr(RC.Xmin) + Chr(10) + "Ymin: " + Cstr(RC.Ymin) + Chr(10) + "Xmax: " + Cstr(RC.Xmax) + Chr(10) + "Ymax: " + Cstr(RC.Ymax)

End Sub
 
а из директории куда устанавливали программу "E:Program Filesulu 7.0ExamplesBuildingFLOORFLOOR.ZMP"
 
Вопрос по Function IntersectByContour(Contour As Contour, Crit As eCrossCriteria, Reserved As Long) As ElementKeys

Crit As eCrossCriteria - как указывать в VbScript?
 
Либо просто числом, либо добавить в скрипт константы:
Код
Const eFullyInside = 1
Const ePartialInside = 2
Const eFullyOrPartialInside = 4
Const eFullyOutside = 8
Const eFullyOrPartialOutside = 16
Const eFullyEqual = 32
Const eTouches = 64
Const eCrosses = 128
Const eIntersects = 1024
Const eContains = 256
 
указывается числом вот что получилось:
Код
Set Map = Zulu.ActiveMapDoc 
Set obj = CreateObject("ZuluLib.Contour")' контур
 
' открытие слоя

Set Layer1 = CreateObject("ZuluLib.Layer")

Layer1.Open "zulu://127.0.0.1:6473/Cxem/2/MapTablet500Ex.zl"   '- c сервера  ::: с диска локально - "C:\Zulu\Data\Cxem\MapTablet500Ex.b00"

if Map.Layers.GetIndexByName(Layer1)<0 then Map.Layers.Add(Layer1) ' Добавление слоя на карту через объект если слой отсуствует

Map.Layers.Activate "zulu://127.0.0.1:6473/Cxem/2/MapTablet500Ex.zl" ' активный слой


' получение объектов попадающих на экран

Set RC = Map.Views.Active.GetBoundsRectangle  'координаты экрана

'msgbox  "Xmin: " + Cstr(RC.Xmin) + Chr(10) + "Ymin: " + Cstr(RC.Ymin) + Chr(10) + "Xmax: " + Cstr(RC.Xmax) + Chr(10) + "Ymax: " + Cstr(RC.Ymax)
 
' рисуем контур
obj.AddPoint RC.Xmin, RC.Ymin
obj.AddPoint RC.Xmax, RC.Ymin
obj.AddPoint RC.Xmax, RC.Ymax
obj.AddPoint RC.Xmin, RC.Ymax
obj.AddPoint RC.Xmin, RC.Ymin


' пересекаем с объектами слоя
set elkeys = Layer1.IntersectByContour (obj,4, 0)' список ключей объектов попавших полностью или частично в контур (4)
 
спасибо
 
Еще вопрос необходимо обыграть сообщение об ошибке открытия слоя если этот слой ответствует по указанному пути
Layer.Open "путь". В документации написано что "Если указанного слоя не существует, то возникает ошибка с кодом 260. "
Как эту ошибку использовать чтобы программа в VbScript не вываливалась, а выводила к примеру сообщение "Слой "Путь" на найден"
 
разобралась через On Error GoTo 0 - по умолчанию прерывает выполнение программы при возникновении ошибки
On Error Resume Next - При включенном режиме On Error Resume Next, ошибка не приводит к прерыванию выполнения кода и программист имеет возможность самостоятельно разобраться с ней.

On Error Resume Next

Layer2.Open PUT_Plan
if Err.Number <>0 then
MSGBOX "Не найден слой"
else
MSGBOX "Загружаем слой"
end if

On Error GoTo 0
 
IntersectByContour - прекрасно работает и получает список ключей объектов слоя пересекаемый контуром , но до тех пор пока слой не ограничен пространственным объектом в ZULU сервер, т.е. пересекаемый с контуром слой изначально отображается не полностью, а в усечёном виде.
В этом случае пересечение = 0. Как это обойти?
 
А пересекается слой с контуром в той части слоя, которая отображается или за пределами видимой области?
 
и в пределах видимой области не дает пересечения в том то и дело
 
Это связано наверно не столько с объектом ограничивающим видимость слоя но и накладываемой проекцией. Сейчас изменила проекцию карты на проекцию пересекаемого слоя и пересечение случилось даже при наложенных пространственных ограничениях, что то не так видимо с координатами экрана, проекций карты и проекции слоя какой то конфликт
 
Проверил. У меня все работает. Пространственное ограничение никак не влияет.
Страницы: 1