#1 Fri 29 June 2012 15:54
- Lebon henry
- Participant occasionnel
- Lieu: Avignon
- Date d'inscription: 23 Sep 2007
- Messages: 12
Publier un pmf en python
Bonjour, je travaille sous arcmap10 et je voudrais publier des pmf en python. Le but étant de publier des mxd en lot. J'ai trouvé celui-ci :
Code:
# PublishPMF.py
# !!!!Download comtypes installer at http://sourceforge.net/projects/comtypes/
#**** Set params ****
# Set Ver93 to False for 9.4 Beta
Ver93 = True
sProjPath = "c:/apps/Demo"
sMxdPath = sProjPath + "/Hydrants.mxd"
sPmfPath = sProjPath + "/Hydrants.pmf"
bEnableLayout = True
#**** Define helper functions and imports ****
print("Initializing...")
import comtypes
import comtypes.server.localserver
from comtypes.client import GetModule
def NewObj(MyClass, MyInterface):
from comtypes.client import CreateObject
try:
ptr = CreateObject(MyClass, interface=MyInterface)
return ptr
except:
return None
def CType(obj, interface):
try:
newobj = obj.QueryInterface(interface)
return newobj
except:
return None
def GetESRILibPath():
import _winreg
if Ver93:
sRegPath = "SOFTWARE\\ESRI\\ArcGIS"
else:
sRegPath = "SOFTWARE\\ESRI\\Desktop9.4"
keyESRI = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, sRegPath)
return _winreg.QueryValueEx(keyESRI, "InstallDir")[0] + "com\\"
sLibPath = GetESRILibPath();
GetModule(sLibPath + "esriSystem.olb")
GetModule(sLibPath + "esriCarto.olb")
GetModule(sLibPath + "esriPublisher.olb")
from comtypes.gen.esriSystem import *
from comtypes.gen.esriCarto import *
from comtypes.gen.esriPublisher import *
def Init():
pInit = NewObj(AoInitialize, IAoInitialize)
eProduct = esriLicenseProductCodeArcView
eStatus = pInit.IsProductCodeAvailable(eProduct)
if eStatus != esriLicenseAvailable:
return False
eStatus = pInit.Initialize(eProduct)
if eStatus != esriLicenseCheckedOut:
return False
# Check out Publisher
eExtension = esriLicenseExtensionCodePublisher
eStatus = pInit.IsExtensionCodeAvailable(eProduct, eExtension)
if eStatus != esriLicenseAvailable:
return False
eStatus = pInit.CheckOutExtension(eExtension)
if eStatus != esriLicenseCheckedOut:
return False
return True
def PublishPMF(pMapDoc, sPath):
# Configure publisher
pPub = NewObj(PublisherEngine, IPMFPublish)
pPropSet = pPub.GetDefaultPublisherSettings()
pPropSet.SetProperty("DisplayFunctionalityMessage", False)
pPropSet.SetProperty("OpenOnlyInArcReader", False)
pPropSet.SetProperty("InternalObjectAccess", True)
if bEnableLayout:
pPropSet.SetProperty("DefaultViewType", esriAPEViewTypeAll)
else:
pPropSet.SetProperty("DefaultViewType", esriAPEViewTypeDataOnly)
# Create PMF
pLayout = pMapDoc.PageLayout
pMap = pMapDoc.Map(0) # Assume 1 map frame
pActiveView = CType(pMap, IActiveView)
bSuccess = True
try:
pPub.Publish(pLayout, pActiveView, pPropSet, False, sPath)
except:
bSuccess = False
return bSuccess
#**** Do it ****
def DoIt():
print "Checking out license..."
if not Init():
print "Error: could not get license."
return
# Open mxd
print "Opening mxd..."
pMapDoc = NewObj(MapDocument, IMapDocument)
try:
pMapDoc.Open(sMxdPath)
except:
print "Error opening mxd."
return
# Publish PMF
print "Publishing PMF..."
bResult = PublishPMF(pMapDoc, sPmfPath)
pMapDoc.Close()
if not bResult:
print "Error publishing pmf."
return
print "Done."
DoIt()Que j'ai modifié comme cela:
Code:
Ver10 = True
sMxdPath = "C:\\MaCarte.mxd"
sPmfPath = "C:\\MaCarte.pmf"
bEnableLayout = True
#**** Define helper functions and imports ****
print("Initializing...")
import comtypes
import comtypes.server.localserver
from comtypes.client import GetModule
def NewObj(MyClass, MyInterface):
from comtypes.client import CreateObject
try:
ptr = CreateObject(MyClass, interface=MyInterface)
return ptr
except:
return None
def CType(obj, interface):
try:
newobj = obj.QueryInterface(interface)
return newobj
except:
return None
GetModule("C:\Program Files\ArcGIS\Desktop10.0\com\esriSystem.olb")
GetModule("C:\Program Files\ArcGIS\Desktop10.0\com\esriCarto.olb")
GetModule("C:\Program Files\ArcGIS\Desktop10.0\com\esriPublisher.olb")
from comtypes.gen.esriSystem import *
from comtypes.gen.esriCarto import *
from comtypes.gen.esriPublisher import *
def Init():
pInit = NewObj(AoInitialize, IAoInitialize)
eProduct = esriLicenseProductCodeArcView
eStatus = pInit.IsProductCodeAvailable(eProduct)
if eStatus != esriLicenseAvailable:
return False
eStatus = pInit.Initialize(eProduct)
if eStatus != esriLicenseCheckedOut:
return False
# Check out Publisher
eExtension = esriLicenseExtensionCodePublisher
eStatus = pInit.IsExtensionCodeAvailable(eProduct, eExtension)
if eStatus != esriLicenseAvailable:
return False
eStatus = pInit.CheckOutExtension(eExtension)
if eStatus != esriLicenseCheckedOut:
return False
return True
def PublishPMF(pMapDoc, sPath):
# Configure publisher
pPub = NewObj(PublisherEngine, IPMFPublish)
pPropSet = pPub.GetDefaultPublisherSettings()
pPropSet.SetProperty("DisplayFunctionalityMessage", False)
pPropSet.SetProperty("OpenOnlyInArcReader", False)
pPropSet.SetProperty("InternalObjectAccess", True)
if bEnableLayout:
pPropSet.SetProperty("DefaultViewType", esriAPEViewTypeAll)
else:
pPropSet.SetProperty("DefaultViewType", esriAPEViewTypeDataOnly)
# Create PMF
pLayout = pMapDoc.PageLayout
pMap = pMapDoc.Map(0) # Assume 1 map frame
pActiveView = CType(pMap, IActiveView)
bSuccess = True
try:
pPub.Publish(pLayout, pActiveView, pPropSet, False, sPath)
except Exception as e:
print e
bSuccess = False
return bSuccess
#**** Do it ****
def DoIt():
print "Checking out license..."
if not Init():
print "Error: could not get license."
return
# Open mxd
print "Opening mxd..."
pMapDoc = NewObj(MapDocument, IMapDocument)
try:
pMapDoc.Open(sMxdPath)
except:
print "Error opening mxd."
return
# Publish PMF
print "Publishing PMF..."
bResult = PublishPMF(pMapDoc, sPmfPath)
pMapDoc.Close()
if not bResult:
print "Error publishing pmf."
return
print "Done."
DoIt()Mais j'ai ce message d'erreur : (-2147467259, 'Erreur non sp\xe9cifi\xe9e', (None, None, None, 0, None))
Visiblement un problème avec cette ligne du code :
Code:
pPub.Publish(pLayout, pActiveView, pPropSet, False, sPath
Quelqu'un a-t-il un script qui marche ou peut-il m'aider à faire marcher le mien ?
Merci d'avance. Bonne journée.
Hors ligne


