Класс для обработки выделенных объектов

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

Обработка выделенных объектов включает выполнение общей последовательности команд по чтению объектов и индикации выполнения процесса обработки, которые собраны в служебном классе DoForEach в скрипте doforeach.py.

Применение служебного класса при разработке скрипта в несколько раз сокращает объем скрипта и снижает число ошибок программирования.

Пример применения класса DoForEach без передачи дополнительного параметра в методе run():

 

def DeleteObjectHValue(_hmap:maptype.HMAP, _hobj:maptype.HOBJ, _parm = 0) -> int:

   if mapapi.mapIsObject3D(_hobj) == 0:

       return 0

   mapapi.mapSetObjectKind(_hobj, maptype.IDLONG2)

   mapapi.mapCommitObject(_hobj)

   return 1

 

def DeleteHValue(_hmap:maptype.HMAP, _hobj:maptype.HOBJ) -> float:

   if _hmap == 0:

       return 0

   dofunction = doforeach.DoForEach('Удаление высоты:', logapi.TAC_MED_HIGHT)

   result = dofunction.run(DeleteObjectHValue, _hmap, _hobj)

   return result

 

где:

 

DeleteObjectHValue – функция, выполняющая обработку объектов карты

DeleteHValue – главная функция скрипта для обработки выделенных объектов

dofunction – экземпляр класса DoForEach с параметрами:

   'Удаление высоты:' – комментарий в линейке прогресса,

   logapi.TAC_MED_HIGHT – идентификатор типа транзакции для данной операции.

 

Пример применения класса DoForEach с передачей дополнительного параметра – указателя на структуру для передачи в MAPAPI:

 

def MoveObject(_hmap:maptype.HMAP, _hobj:maptype.HOBJ,

                                 _parm:ctypes.POINTER(maptype.DOUBLEPOINT)) -> int:

   if _hobj == 0:

       return 0

   iret = mapapi.mapRelocateObjectPlane(_hobj, _parm)

   if iret != 0:

     return mapapi.mapCommitObject(_hobj)

   return 0

 

def MoveObjectsByDxDy(_hmap:maptype.HMAP, _hobj:maptype.HOBJ, dx, dy) -> int:

   if _hmap == 0:

       return 0

 

   dpoint = maptype.DOUBLEPOINT(dx, dy)

   dofunction = doforeach.DoForEach('Перемещение объектов:', logapi.TAC_MED_MOVE)

   result = dofunction.run(MoveObject, _hmap, _hobj, ctypes.byref(dpoint))

 

   mapapi.mapShowMessage(mapsyst.WTEXT('Обработано объектов - ' + str(result)),

                                                 mapsyst.WTEXT('Перемещение объектов'))

   mapapi.mapInvalidate()

   return result

 

Пример применения класса DoForEach с передачей дополнительного параметра – структуры с входными параметрами для вычислений:

 

class ALTTOFEET(ctypes.Structure):

   _fields_ = [("srccode", ctypes.c_int),

                      ("outcode", ctypes.c_int),

                      ("multi", ctypes.c_double)]

   def __init__(self, _srccode: int, _outcode: int, _multi: float):

       self.srccode = _srccode

       self.outcode = _outcode

       self.multi = _multi

 

def ObjectAltitudeToFeet(_hmap:maptype.HMAP, _hobj:maptype.HOBJ,

                                          _parm:ALTTOFEET) -> int:

   srcnumber = mapapi.mapSemanticCodeValuePro(_hobj, _parm.srccode, None, 0, 1, 0)

   value = mapapi.mapSemanticDoubleValue(_hobj, srcnumber, 1)

   value = value * _parm.multi

   ret = mapapi.mapAppendSemanticDouble(_hobj, _parm.outcode, value)

   if ret != 0:

       return mapapi.mapCommitObject(_hobj)

   return 0

 

def SemanticAltitudeToFeet(_hmap:maptype.HMAP, _hobj:maptype.HOBJ,

                                               _srccode:int, _outcode:int, _multi:float) -> int:

   parm = ALTTOFEET(_srccode, _outcode, _multi)

   dofunction = doforeach.DoForEach('Пересчет высоты:', logapi.TAC_MED_SEMUPDATE)

   result = dofunction.run(ObjectAltitudeToFeet, _hmap, _hobj, parm)

   ...

 

Пример применения класса DoForEach с передачей дополнительного параметра – структуры с выходными параметрами для сбора статистики:

 

class SquareSum:

   __square = 0.0

   def __init__(self, square = 0.0):

       self.__square = square

   def add(self, value):

       self.__square += value

   def value(self):

       return self.__square

 

def ObjectArea(_hmap:maptype.HMAP, _hobj:maptype.HOBJ, _parm:SquareSum) -> int:

   _parm.add(mapapi.mapSquare(_hobj))

   return 1

 

def GetObjectsArea(_hmap:maptype.HMAP, _hobj:maptype.HOBJ) -> float: #caption:Вычислить площадь выделенных объектов

   square = SquareSum()

   dofunction = doforeach.DoForEach('Подсчет площади объектов:', 0)

   result = dofunction.run(ObjectArea, _hmap, _hobj, square)

   return square.value()

 

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

Реализация метода run имеет следующий общий вид:

 

class DoForEach:

   ...

   def run(self, _function, hmap:maptype.HMAP, hobj:maptype.HOBJ, parm = 0):

       self.__readycount = 0

   ...

       if self.__actiontype != 0:

           logapi.mapLogCreateAction(hmap, hmap, self.__actiontype)

       ...

       hwork = mapapi.mapCreateObject(hmap)

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

       ...

           if _function(hmap, hwork, parm) != 0:

               self.__readycount += 1

 

       if self.__actiontype != 0:

           logapi.mapLogCommitAction(hmap, hmap)

       if hwork != 0:

           mapapi.mapFreeObject(hwork)

       ...

       return self.__readycount