Pewnego dnia natknąłem się na problem, gdy próbowałem użyć modułu mapowania ArcPy do edycji prostokątnych elementów tekstowych z nowymi liniami (\ n) w dokumencie ArcMap. Oto jak wyglądało wyjście:
Oto kod, którego użyłem do wygenerowania tego wyniku. Pierwsza kolumna to prostokątne elementy tekstowe Text1, Text2, Text3; druga kolumna to „zwykłe” elementy tekstowe Text4, Text5 i Text6 idące w dół.
import os
import arcpy
HomeDir = r"C:\Desktop"
arcpy.env.workspace = HomeDir
CurrentMXD = arcpy.mapping.MapDocument(r"C:\Desktop\TextTest.mxd")
OutputFilename = r"C:\Desktop\TextTest.pdf"
if os.path.exists(OutputFilename):
os.remove(OutputFilename)
for TextElement in arcpy.mapping.ListLayoutElements(CurrentMXD, "TEXT_ELEMENT"):
TextElementName = TextElement.name
String1 = "The quick brown fox jumped over the lazy dog.\nShe sells sea shells by the sea shore."
String2 = "The quick brown fox \njumped over the lazy dog.\nShe sells sea shells by the sea shore."
String3 = "The quick brown fox jumped \nover the lazy dog.\nShe sells sea shells by the sea shore."
if TextElementName == "Text1":
TextElement.text = String1
if TextElementName == "Text2":
TextElement.text = String2
if TextElementName == "Text3":
TextElement.text = String3
if TextElementName == "Text4":
TextElement.text = String1
if TextElementName == "Text5":
TextElement.text = String2
if TextElementName == "Text6":
TextElement.text = String3
arcpy.mapping.ExportToPDF(CurrentMXD, OutputFilename)
Jak dotąd wygląda na to, że obecność pomieszanego tekstu zależy od tego, czy linia jest wystarczająco długa, aby ją zawinąć i czy linia przed nową linią jest dłuższa niż linia po nowej linii.
Jakieś pomysły na to, co może pójść nie tak? Czy jest w pobliżu praca? Mógłbym używać zwykłego tekstu i martwić się o zawijanie linii za pomocą Pythona, ale mam nadzieję, że coś wymyślę.
źródło
Odpowiedzi:
Na to też wpadłem. Dzieje się tak, ponieważ ArcGIS wymaga zakończenia linii Windows, które są zarówno znakiem powrotu karetki, jak i linią. Trochę bólu. Na szczęście łatwo się poruszać. W Pythonie zamiast zamiast
\n
(czyli linefeed - zobacz dokumentację Pythona, jeśli chcesz), użyj\r\n
.źródło
Myślę, że łatwiej jest użyć modułu zawijania tekstu:
Wyrażenie etykiety Python:
I powstałe etykiety mają rozdzielone zwroty karetki przy dowolnej wybranej szerokości znaku.
źródło