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