RUS  ENG 

Пример программы на VBScript

Страницы: 1
RSS
Пример программы на VBScript
 
Добрый день!
В Zulu 7 появилась возможность писать маленькие программки (макросы) на языке VB прямо в ГИС.
К большому сожалению, в документации об этих возможностях очень мало написано, буквально несколько строк. А что еще более важно отсутствуют примеры таких макросов.
Почитав документацию и данный форум смог сделать всего несколько простых операций.
Подскажите, пожалуйста, как можно получить данные из базы данных, подключенной к слою по выделенному объекту (например: диаметр трубопровода из выделенного участка в расчетном слое Zulu Thermo).
Заранее спасибо!
 
Макросы можно писать на VB Script (http://msdn.microsoft.com/en-us/library/t0aew7h6.aspx) Это не VB.
В написании своих сценариев можно использовать объекты из нашей объектной модели http://politerm.com.ru/zuludoc/objectmodel2.htm
Объектную модель хорошо бы изучить.
По поводу чтения данных из базы, посмотрите примерный код:

Sub ReadData()

'Получаем доступ к окну сообщений
Set Ch = Application.OpenOutputChannel("Сообщения")

'Создаем объект "Layer"
Set L = CreateObject ("zululib.layer")

'Открываем слой
L.Open "D:\ZuluInstall_60\Zulu Files\Examples\Termo\Kvartal\teplosam.b00"

'Создаем объект "ZBDatabase"
Set Z = CreateObject ("zb.database")

'Открываем базу данных для типа с ID = 6
Z.Open L.ObjectTypes.Item(6).BaseName

'Получаем коллекцию ключей слоя
Set Keys = L.ElementKeys

'Открываем "Градусник"
Application.OpenProgressBar 100

for i=1 To Keys.Count

Application.SetProgressBar i*100.0/Keys.Count

'Получаем данные из базы данных по указанному ключу
Set ds = Z.SelectByKey (Keys(i))

'Если данные есть выводим в окно сообщений
if ds.MoveFirst = TRUE then

Ch.Put "Id:" + CStr(Keys(i))+ " "+ds.FieldValue(ds.GetFieldIndexByName(0, "L")) + chr(10)

end if

Next

Application.CloseProgressBar


End Sub



'Замена символа в поле
Sub ChangeSymbol()

'Создали объект слой
Set L = CreateObject("zululib.Layer")

'Открыли нужный слой
L.Open "c:\program files\zulu 7.0\examples\Gidro\voda.b00"

'Создали объект база данных
Set Db = CreateObject("zb.database")

'Открыли базу данных для типа 6 (колодец)
Db.Open L.ObjectTypes.Item(6).BaseName

'Получили все записи базы данных
Set Ds = Db.SelectAll

'Встали на первую запись
Ds.MoveFirst

Do

'Если дошли до конца, выходим из цикла
If Ds.EOF = True Then Exit Do

'Получили имя колодца из поля "Name"
sName = Ds.FieldValue(Ds.GetFieldIndexByName(0, "Name"))

'Заменили в строке "-" на " "
sName = Replace(sName, "-", " ")

'Получили ключ записи
Key = Ds.GetFieldValueVar(0)

'Обновляем поле с именем по ключу
Db.UpdateBaseRecord Key, "Name", sName, 0

'Встали на следующую запись
Ds.MoveNext

Loop


End Sub




Sub ReadData1()

'Получаем доступ к окну сообщений
Set Ch = Application.OpenOutputChannel("Сообщения")

'Создаем объект "Layer"
Set L = CreateObject ("zululib.layer")

'Открываем слой
L.Open "D:\ZuluInstall_60\Zulu Files\Examples\Termo\Kvartal\teplosam.b00"

'Создаем объект "ZBDatabase"
Set Z = CreateObject ("zb.database")

'Открываем базу данных для типа с ID = 6
Z.Open L.ObjectTypes.Item(6).BaseName

'Получаем данные из базы данных по указанному ключу

Set ds = Z.OpenSQL("", "SELECT * FROM 'D:\ZuluInstall_60\Zulu Files\Examples\Termo\Kvartal\uch.DB'")

'Если данные есть выводим в окно сообщений
ds.MoveFirst

do

if ds.Eof = true then exit do

Ch.Put "Id:" + ds.FieldValue(ds.GetFieldIndexByName(0, "Sys"))+ " " + "Len:" + ds.FieldValue(ds.GetFieldIndexByName(0, "L")) + chr(10)

ds.MoveNext

Loop



End Sub
 
Спасибо большое.
Надеюсь это топик будет интересен не только мне.
 
Подскажите пожалуйста, а как открыть слой не по пути файла, как в вашем примере, а активный в данный момент слой?
Цитата:

...
'Открываем слой
L.Open "D:\ZuluInstall_60\Zulu Files\Examples\Termo\Kvartal\teplosam.b00"
...

 
Активный в данный момент слой уже итак открыт. Т.е. можно просто сослаться на него:

Set L = Application.ActiveDocument.NativeDoc.Layers.Active
 
Спасибо, я это и имел ввиду
 
Скажите, а есть возможность писать скрипты в версии 6.0?
У меня пункт меню "Редактор VB" есть, но не запускается.
 
Нет. Эта возможность появилась только в седьмой версии
 
А где\как можно узнать могу ли я обновиться с 6.0 до 7.0 не меняя ключ?
 
Нужно оплатить за обновление лицензии на новую версию (http://politerm.com.ru/price.htm). Менять или не менять ключ, зависит от ключа. Если он старый (LPT или HASP4), поменяем на HASP HL.
Подробности в отделе маркетинга: http://politerm.com.ru/contacts.htm
 
Доброго времени суток.
Не подскажите как в макросах пользоваться предопределенными константами?
Sub zdv()
Set Doc = Application.ActiveDocument
if Doc.Type = 1 then 'eMapDoc

MsgBox "Карта Зулу " & Doc.Type
elseif Doc.Type = 2 then ' eLayoutDoc
MsgBox "Макет печати " & Doc.Type
elseif Doc.Type = 3 then ' eMacroDoc
MsgBox "скрипт макросов " & Doc.Type
elseif Doc.Type = 0 then ' eUnknownDoc
MsgBox "внешний документ " & Doc.Type
else
MsgBox "непонятно что " & Doc.Type
end if

End Sub
Этот пример работает, но если вместо цифр 0-3 поставить константы eMapDoc, eLayoutDoc, eMacroDoc, eUnknownDoc, то в окне сообщений выводится последняя строчка (непонятно что) при любом открытом документе. Хотелось бы использовать константы. И еще. Если пытаешься в макросе объявить переменную
например Dim r as long, то выдается ошибка.. Заранее спасибо.
 
VBScript константы не поддерживает.
Страницы: 1