Создание геометрических объектов в Arcgis

0 голосов
спросил 31 Авг, 11 от realinho (120 баллов) в категории Программные продукты Esri
Добрый день. Нужно написать скрипт который будет вставлять объекты, как показано на рисунке. На vba без проблем все работает, а вот на python не получается реализовать. Можете подсказать как реализовать данный скрипт в питоне?
http://s014.radikal.ru/i329/1108/17/2e42646f4e45.jpg (рамка, стрелка, масшатбная линейка и штамп)

Нашел в интернете про com объекты, но реализовать правильно не выходит.
Вот часть моего скрипта:
#coding: utf-8
import math
import os
import ctypes
import comtypes
import comtypes.gen.esriFramework


def GetLibPath():
   import _winreg
   keyESRI = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\ESRI\\ArcGIS")
   return _winreg.QueryValueEx(keyESRI, "InstallDir")[0] + "com\\"


def GetModule(sModuleName):
    """Import ArcGIS module"""
    from comtypes.client import GetModule
    sLibPath = GetLibPath()
    GetModule(sLibPath + sModuleName)

def GetStandaloneModules():
    """Import commonly used ArcGIS libraries for standalone scripts"""
    GetModule("esriSystem.olb")
    GetModule("esriGeometry.olb")
    GetModule("esriCarto.olb")
    GetModule("esriDisplay.olb")
    GetModule("esriGeoDatabase.olb")
    GetModule("esriDataSourcesGDB.olb")
    GetModule("esriDataSourcesFile.olb")
    GetModule("esriOutput.olb")

def GetDesktopModules():
    """Import basic ArcGIS Desktop libraries"""
    GetModule("esriFramework.olb")
    GetModule("esriArcMapUI.olb")
   
def NewObj(MyClass, MyInterface):
   import comtypes
   try:
        ptr = comtypes.client.CreateObject(MyClass,
               interface=MyInterface)
        return ptr
   except:
        return None


def CType(obj, interface):
   try:
        newobj = obj.QueryInterface(interface)
        return newobj
   except:
        return None

def GetApp():
    pAppROT = NewObj(esriFramework.AppROT, esriFramework.IAppROT)
    iCount = pAppROT.Count
    if iCount == 0:
        return None
    for i in range(iCount):
        pApp = pAppROT.Item(i)  #returns IApplication on AppRef
        if pApp.Name == 'ArcMap':
            return pApp
    return None



#ДОБАВЛЕНИЕ МАСШТАБНОЙ ЛИНЕЙКИ В КОМПОНОВКУ
def AddScaleBar_Click():
    GetDesktopModules()
    import comtypes.gen.esriFramework as esriFramework
    import comtypes.gen.esriArcMapUI as esriArcMapUI
    import comtypes.gen.esriSystem as esriSystem
    import comtypes.gen.esriCarto as esriCarto
    import comtypes.gen.esriGeoDatabase as esriGeoDatabase
    import comtypes.gen.esriGeometry as esriGeometry
    # определение позиции линейки на листе
    pDoc = pApp.Document
    pEnv = NewObj(esriGeometry.Envelope, esriGeometry.IEnvelope)
    pPoint = Point()
    pPoint.x = 17.3
    pPoint.y = 6.8
    pEnv.LowerLeft = pPoint
    pPoint.x = 21.6
    pPoint.y = 7.4
    pEnv.UpperRight = pPoint
    # инициализация графического контейнера
    pGC = pMxDoc.ActiveView
    pGC.Reset()
    # определение шрифта для подписей линейки
    pFontDisp = CType(pUnk, stdole.IFontDisp)
    pFontDisp.Name = "Times New Roman"
    pFontDisp.size = 12
    pTextSymbol = CType(pUnk, esriDisplay.ITextSymbol)
    pTextSymbol = TextSymbol()
    pTextSymbol.Font = pFontDisp
    # установки карты
    pMapFrame = MapFrame()
    pMapFrame.Map = pMxDoc.FocusMap
    pScaleSurround = AlternatingScaleBar()
    # настройки выносимой масштабной линейки
    _with0 = pScaleSurround
    _with0.Units = esriKilometers
    _with0.Division = 2
    _with0.Divisions = 3
    _with0.Subdivisions = 5
    _with0.BarHeight = 5
    _with0.LabelFrequency = esriScaleBarDivisions
    _with0.UnitLabel = "   км"
    _with0.LabelSymbol = pTextSymbol
    _with0.UnitLabelSymbol = pTextSymbol
    #Получение UID"a для масштабной линейки
    pUID.Value = "esriCore.ScaleBar"
    #Поднятие интерфейса IMapSurroundFrame и установка геометрии выносимого элемента
    scalebarFrame = pMapFrame.CreateSurroundFrame(pUID, pScaleSurround)
    pElement = scalebarFrame
    pElement.Geometry = pEnv
    # Добавление элемента в графический контейнер
    pGC = CType(pMap, esriCarto.IGraphicsContainer)
    pGC.AddElement(scalebarFrame, 0)
    # обновление экрана
    pMxDoc.ActiveView.PartialRefresh(esriViewGraphics, scalebarFrame, pEnv)

def AddScaleBar_Message():
    _ret = None
    _ret = "Добаление масштабной линейки в компоновку"
    return _ret

def AddScaleBar_ToolTip():
    _ret = None
    _ret = "Масштабная линейка"
    return _ret

Помогите кто знает как сделать данный скрипт, очень надо.


полная версия написанная на питоне -
и вба скрипт -

Пожалуйста, войдите или зарегистрируйтесь для публикации ответа на этот вопрос.

Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...