Рекомендуемая структура скрипта на 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 - Не выделены объекты для обработки.
Для ввода дополнительных параметров обработки данных могут вызываться диалоги на основе стандартного компонента 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 Построение и выделение списков объектов на карте
|