Рекомендуемая структура скрипта на python

Печать Предыдущая страница Стартовая страница Следующая страница

В начале скрипта необходимо выполнить импорт скриптов MAPAPI и стандартных скриптов python, которые будут использоваться при написании функций.

Например:

 

import ctypes

import mapsyst

import maptype

import mapapi

import seekapi

import logapi

import maperr

import tkinter

from tkinter import filedialog

 

После команд импорта скриптов MAPAPI располагаются функции python, реализующие основные расчеты с помощью различных функций MAPAPI. Ниже размещается главная функция скрипта (точка входа).

 

Пример расчетной функции:

 

# Move selected objects or one object

def MoveObjectsByDxDy(hmap:maptype.HMAP, hobj:maptype.HOBJ, dx, dy) -> int:

   dpoint = maptype.DOUBLEPOINT(dx, dy)

 

   if hobj != 0:

       return mapapi.mapRelocateObjectPlane(hobj, ctypes.byref(dpoint))

 

   seekcount = seekapi.mapTotalSeekObjectCount(hmap)

   if seekcount == 0:

       mapapi.mapErrorMessageUn(maperr.IDS_OBJECTSNOTSELECTED, __name__)

       return 0

 

   hwork = mapapi.mapCreateObject(hmap)

   percent = int(0)

   objcount = 0

   hprogress = 0

   if seekcount > 1000:

       hprogress = mapapi.mapOpenProgressBar()

 

   logapi.mapLogCreateAction(hmap, hmap, logapi.TAC_MED_MOVE)

 

   flag = maptype.WO_FIRST

   while (seekapi.mapTotalSeekObject(hmap, hwork, flag) != 0):

       flag = maptype.WO_NEXT

 

       if mapapi.mapRelocateObjectPlane(hwork, ctypes.byref(dpoint)) != 0:

           mapapi.mapCommitObject(hwork)

       objcount += 1

       newpercent = int(objcount * 100 / seekcount)

       if newpercent > percent:

           percent = newpercent

           if hprogress != 0:

               ret = mapapi.mapProgressBar(hprogress, int(percent), mapsyst.WTEXT('  Сдвиг объектов: ' +

                            mapapi.IntToStr(objcount) + '/' + mapapi.IntToStr(seekcount)))

 

               if ret == -1:

                   break

 

   if hwork != 0:

       mapapi.mapFreeObject(hwork)

   if hprogress != 0:

       mapapi.mapCloseProgressBar(hprogress)

 

   logapi.mapLogCommitAction(hmap, hmap)

 

   mapapi.mapInvalidate()

   return 1

 

После вспомогательных функций идет описание главной функции скрипта. Например:

 

# Move selected objects or one object

def MoveObjects(hmap:maptype.HMAP, hobj:maptype.HOBJ) -> float: #caption:Сдвинуть объекты на заданные смещения dx,dy

   if hobj == 0:

       seekcount = seekapi.mapTotalSeekObjectCount(hmap)

       if seekcount == 0:

           mapapi.mapErrorMessageUn(maperr.IDS_OBJECTSNOTSELECTED, __name__)

           return 0

 

   root = tkinter.Tk()

   root.title("Сдвиг объектов")

 

   dx_label = tkinter.Label(text="Смещение по X (вверх): ")

   dy_label = tkinter.Label(text="Смещение по Y (влево): ")

   dx_label.grid(row=0, column=0, sticky="w")

   dy_label.grid(row=1, column=0, sticky="w")

 

   dx_value = tkinter.IntVar()

   dy_value = tkinter.IntVar()

 

   dx_entry = tkinter.Entry(textvariable=dx_value)

   dy_entry = tkinter.Entry(textvariable=dy_value)

   dx_entry.grid(row=0,column=1, padx=5, pady=5)

   dy_entry.grid(row=1,column=1, padx=5, pady=5)

 

   def CallMoveObjects():

       MoveObjectsByDxDy(hmap, hobj, dx_value.get(), dy_value.get())

       root.destroy()

 

   message_button = tkinter.Button(text="Выполнить", command=CallMoveObjects)

   message_button.grid(row=2,column=1, padx=5, pady=5, sticky="e")

 

   root.eval('tk::PlaceWindow . center')

   root.mainloop()

   return 1

 

В файле скрипта может быть несколько главных функций. Главные функции имеют один набор и тип параметров и тип возвращаемого значения:

 

def MoveObjects(hmap:maptype.HMAP, hobj:maptype.HOBJ) -> float:

 

где:

hmap - идентификатор текущего открытого документа, для которого выполняется скрипт

hobj - идентификатор выбранного объекта или ноль

 

Возвращаемое значение имеет тип float (в C++ это соответствует double) для получения результатов простых вычислений.

В конце строки с объявлением функции может указываться комментарий для записи его в список скриптов:

 

def MoveObjects(...)-> float: #caption:Сдвинуть объекты на заданные смещения dx,dy

 

Вызываемая функция может выполнить некоторое действие над переданным объектом, если идентификатор не равен нулю, или над выделенными объектами, если пользователь выделил на карте некоторые объекты.

 

   if hobj == 0:

       seekcount = seekapi.mapTotalSeekObjectCount(hmap)

       if seekcount == 0:

           mapapi.mapErrorMessageUn(maperr.IDS_OBJECTSNOTSELECTED, __name__)

           return 0

 

Если не передан объект или не выделены объекты на карте, то скрипт может выдать сообщение, что входные данные не заданы.

В примере указан код IDS_OBJECTSNOTSELECTED - Не выделены объекты для обработки.

 

dialog_3

 

Для ввода дополнительных параметров обработки данных могут вызываться диалоги на основе стандартного компонента tkinter.

Желательно из основной функции, вызывающей диалоги, выделить функцию, выполняющую основную обработку данных со всеми заданными параметрами. Это позволит формировать скрипты, работающие в автоматическом режиме по готовым параметрам, которые могут быть интегрированы в сложные алгоритмы автоматической обработки данных.

 

На каждую группу операций может формироваться своя транзакция, что позволит в дальнейшем отменить всю операцию при необходимости.

 

   logapi.mapLogCreateAction(hmap, hmap, logapi.TAC_MED_MOVE)

...

   logapi.mapLogCommitAction(hmap, hmap)

 

При последовательной обработке объектов выполняется чтение очередного объекта, удовлетворяющего установленному фильтру.

 

flag = maptype.WO_FIRST

   while (seekapi.mapTotalSeekObject(hmap, hwork, flag) != 0):

       flag = maptype.WO_NEXT

 

При успешном выполнении операции объект может быть сохранен на карте.

 

       if mapapi.mapRelocateObjectPlane(hwork, ctypes.byref(dpoint)) != 0:

           mapapi.mapCommitObject(hwork)

 

Для работы с объектом карты необходимо создать программный объект (контейнер), в который будет считываться обрабатываемый объект карты, и в конце работы его освободить.

 

   hwork = mapapi.mapCreateObject(hmap)

...

   if hwork != 0:

       mapapi.mapFreeObject(hwork)

 

Чтобы отобразить выполненные изменения в окне карты можно вызвать функцию обновления изображения.

 

   mapapi.mapInvalidate()

Обработка семантики (атрибутов) объектов на python

Построение и выделение списков объектов на карте