Класс для обработки выделенных объектов |
Обработка выделенных объектов включает выполнение общей последовательности команд по чтению объектов и индикации выполнения процесса обработки, которые собраны в служебном классе 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
|