“if”语句在使用数据驱动页时循环两次

2024-10-02 20:38:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,用于在导出数据驱动页面时将插入地图放置到特定页面上,该脚本是一个朋友的工作和我自己的一些来自其他项目的代码的合并。在

问题是代码将第15页和第16页导出了两次,一次是带插入地图的,另一次是没有的,我不知道为什么。在

我认为这与循环中的缩进有关,但我无法得到它,所以它以其他方式运行。任何帮助都将不胜感激!在

import arcpy, os, time, datetime
from datetime import datetime
start_time = datetime.now()
PageNumber = "Page " 

# Create an output directory variable i.e the location of your maps folder
outDir = r"C:\Users\support\Desktop\Python\Book of Reference"

# Create a new, empty pdf document in the specified output directory
# This will be your final product
finalpdf_filename = outDir + r"\FinalMapBook.pdf"
if os.path.exists(finalpdf_filename): # Check to see if file already exists, delete if it does
  os.remove(finalpdf_filename)
finalPdf = arcpy.mapping.PDFDocumentCreate(finalpdf_filename)


# Create a Data Driven Pages object from the mxd you wish to export
mxdPath = r"C:\Users\support\Desktop\Python\Book Of Reference\Book_Of_Reference_20160526_Python_Test.mxd"
tempMap = arcpy.mapping.MapDocument(mxdPath)
tempDDP = tempMap.dataDrivenPages

# Create objects for the layout elements that will be moving, e.g., inset data frame, scale text
Page15 = arcpy.mapping.ListDataFrames(tempMap)[1]
Page16 = arcpy.mapping.ListDataFrames(tempMap)[2]  

# Instead of exporting all pages at once, you will need to use a loop to export one at a time  
# This allows you to check each index and execute code to add inset maps to the correct pages

for pgIndex in range(1, tempDDP.pageCount + 1, 1):

  # Create a name for the pdf file you will create for each page
  temp_filename = r"C:\Users\support\Desktop\Python\Book of Reference\Book of Reference" + \
                            str(pgIndex) + ".pdf"
  if os.path.exists(temp_filename):
    os.remove(temp_filename) #Removes pdf if it is already in the folder

  # Code for setting up the inset map on the first page #
  if (pgIndex == 15):
    # Set position of inset map to place it on the page layout
    Page15.elementPositionX = 20.1717
    Page15.elementPositionY = 2.0382
        # Set the desired size of the inset map for this page
    Page15.elementHeight = 9.7337
    Page15.elementWidth = 12.7115
        # Set the desired extent for the inset map
    Page15insetExtent = arcpy.Extent(518878,108329,519831,107599)    
    Page15insetExtent = Page15insetExtent
    arcpy.RefreshActiveView()
    tempDDP.exportToPDF(temp_filename, "RANGE", pgIndex)
    finalPdf.appendPages(temp_filename) 
    Page15.elementPositionX = 50 #Move the Inset back off the page 
    arcpy.RefreshActiveView() #Refresh to ensure the Inset has been removed 
    print PageNumber + str(pgIndex)


  if (pgIndex == 16):
        # Set up inset map
    Page16.elementPositionX = 2.1013
    Page16.elementPositionY = 18.1914
    Page16.elementHeight = 9.7337
    Page16.elementWidth = 12.7115
    Page16insetExtent = arcpy.Extent(520012, 107962, 521156,107086)
    Page16insetExtent = Page16insetExtent
    arcpy.RefreshActiveView()
    print PageNumber + str(pgIndex)
    tempDDP.exportToPDF(temp_filename, "RANGE", pgIndex)
    finalPdf.appendPages(temp_filename)
    print PageNumber + str(pgIndex)
    Page16.elementPositionX = 50
    arcpy.RefreshActiveView()



  # Else Fuction takes care of the pages that dont have insets and just itterates through using the loop on line 28
  else : 
    tempDDP.exportToPDF(temp_filename, "RANGE", pgIndex)
    finalPdf.appendPages(temp_filename)
    print PageNumber + str(pgIndex)

# Clean up
del tempMap

# Update the properties of the final pdf
finalPdf.updateDocProperties(pdf_open_view="USE_THUMBS",
                             pdf_layout="SINGLE_PAGE")
# Save your result
finalPdf.saveAndClose()

end_time = datetime.now()
print('Duration: {}'.format(end_time - start_time))

Tags: ofthetoforifpdftimefilename
1条回答
网友
1楼 · 发布于 2024-10-02 20:38:45

我相信你的问题是,当pgIndex为15时,它会按预期执行导出。然后检查pgIndex是否为16。pgIndex不是16,因此它会落入else并在不使用插入映射的情况下重新导出。我建议将第二个if改为elif

相关问题 更多 >