Widziałem świetny interfejs do FME z Pythonem
Co z tym robicie? Chcę pomysłów.
Widziałem świetny interfejs do FME z Pythonem
Co z tym robicie? Chcę pomysłów.
Odpowiedzi:
Właśnie zaczynam pracę z FME i używam skryptu zamykania, aby skopiować mój docelowy FGDB w inne miejsce i zapisać plik dziennika:
import distutils.dir_util, shutil, os, time, locale
src = 'C:/Testing/FME/TPW/Third_Party_Wells.gdb'
dst = '//share/Data Services/GIS Data/Data/Third Party Wells/Third_Party_Wells.gdb'
distutils.dir_util.copy_tree(src, dst)
logfile = FME_LogFileName
shutil.copy(logfile, 'C:/temp/PRD_' + os.path.basename(logfile)[:-4] + '_' + time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime()) + '.log')
# Get features written counts
shl_count = str(FME_FeaturesWritten['ThirdPartyWellsSurface'])
bhl_count = str(FME_FeaturesWritten['ThirdPartyWellsBottom'])
lat_count = str(FME_FeaturesWritten['ThirdPartyWellsLaterals'])
# Write out features written counts to log
fm_log = open('C:/temp/PRD_Counts.log','a')
fm_log.write(time.strftime('%m/%d/%Y %I:%M:%S', time.localtime()) + ',' + shl_count + ',' + bhl_count + ',' + lat_count + ',' + str(FME_TotalFeaturesWritten) + '\n')
To całkiem proste, ale tak naprawdę nie ma limitu, nie sądzę. Istnieje mnóstwo pomysłów tutaj również.
EDYCJA: Dodano kod, aby uzyskać liczbę zapisanych funkcji i wypchnąć je do pliku dziennika CSV.
Spójrz na Python Corner Olivera. Jest mnóstwo rzeczy, które możesz zrobić używając Pythona w FME.
Często używam PythonCaller do dokonywania pewnych przypisań manipulacji w 1 transformatorze zamiast używania 10 różnych transformatorów (jeśli elif elif inny ..)
Możesz mieć bardzo proste PythonCallers, takie jak ten przykład, który przekonwertuje wszystkie twoje atrybuty na wielkie litery:
def upperAll(feature):
for att in feature.getAttributeList():
feature.setAttribute(att,feature.gettAttribute(att).upper())
Używam również PythonCaller do wysyłania wiadomości e-mail w przypadku awarii lub interakcji z serwerem FTP itp. Tak naprawdę nie ma żadnych ograniczeń
Miłej zabawy i szczęśliwego FMEing
Jeff
Dobry przykład powyżej: obecnie piszę artykuł do naszej bazy wiedzy o nazwie FMEPedia tutaj: Python i FME Basics .
Obejmuje to kilka prostych przykładów, takich jak usuwanie pliku przed uruchomieniem obszaru roboczego ze skryptem startowym, manipulowanie funkcjami za pomocą PythonCaller itp. Istnieją również łącza do bardziej złożonych przykładów.
Bezpieczne oprogramowanie Ken Bragg
Przykłady:
Niestandardowy dziennik
import os.path, time, os, datetime, __main__ , sys, pyfme,shutil
from pyfme import *
class expFeature(object):
def __init__(self):
self.logger = pyfme.FMELogfile()
pass
def close(self):
try:
#folders creation
os.makedirs(param_folder)
#Log creation
logFile = param_folder + timecreated +".log"
FILE = open(logFile,"w")
log=FMELogfile(logFile)
log.log("Bla bla bla")
I wyślij e-mail :
message = MIMEMultipart()
message["From"] = email_from
message["To"] = email_to
message['Date'] = formatdate(localtime=True)
message["Subject"] = subject
message.attach( MIMEText(html, 'html') )
attachment = MIMEBase('application', "octet-stream")
attachment.set_payload( open(FileLog,"rb").read() )
Encoders.encode_base64(attachment)
attachment.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(FileLog))
message.attach(attachment)
smtp = smtplib.SMTP(smtpServer)
smtp.sendmail(email_from, email_to, message.as_string())
print "Successfully sent email"
smtp.close()
Ostatnio korzystałem z transformatora PythonCaller, który pobiera współrzędne z pliku CSV i zapisuje je jako atrybuty. Plik CSV jest zapisywany z innego obszaru roboczego, w którym używany jest transformator BoundsExtractor, który pobiera współrzędne graniczne z ramki granicznej mojego obszaru zainteresowania.
Następnie przekazuję te atrybuty innym WorkspaceRunners, które używają współrzędnych ograniczających jako okna wyszukiwania do dalszego przetwarzania. Mam dane z całego stanu i przetwarzanie całego stanu zajęłoby kilka godzin. Ponieważ ograniczam przetwarzanie do konkretnego okna, cała sprawa zajmuje minutę.
Kod pythonCaller jest tutaj:
import fmeobjects
import csv
import re
# Template Function interface:
def getBounds(feature):
outputDirectory = FME_MacroValues['Output_Directory'] # Set outputDirectory
NativeTitle = FME_MacroValues['Native_Title'] # Set NativeTitle
NativeTitle = re.sub('\W','_',NativeTitle)
NativeTitle = re.sub(' ','_',NativeTitle)
csvPath = outputDirectory + '\\' + NativeTitle + '_boundingbox.csv' # Set csvPath
# open csv file containing bounding coordinates
with open(csvPath, 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter = ',')
bounds = reader.next()
# Set bounding variables
XMIN = float(bounds[0])
XMAX = float(bounds[1])
YMIN = float(bounds[2])
YMAX = float(bounds[3])
# Set attributes to variable values
feature.setAttribute("_xmin", XMIN)
feature.setAttribute("_ymin", YMIN)
feature.setAttribute("_xmax", XMAX)
feature.setAttribute("_ymax", YMAX)
pass
Używam również skryptu uruchamiania Pythona, który kopiuje drzewo folderów do innej lokalizacji, jeśli jeszcze nie istnieje.
import os
import fmeobjects
import shutil
srcDir_project = r'W:\AlignmentSheets\PostInstall\Alignment Sheet Generator\ProjectData\ProjectNameFolder'
srcDir_settings = r'W:\AlignmentSheets\PostInstall\Alignment Sheet Generator\ProjectData\Settings'
destBaseDir = FME_MacroValues['Output_Directory']
destDir_project = destBaseDir + '\\' + FME_MacroValues['A_Sheet_Project_Name'] + '\\'
destDir_settings = destBaseDir + '\\Settings\\'
if not os.path.exists(destDir_project):
shutil.copytree(srcDir_project,destDir_project)
print 'Successfully created "%s"' % destDir_project
else:
print '"%s" Already Exists. Not Creating Folder.' % destDir_project
if not os.path.exists(destDir_settings):
shutil.copytree(srcDir_settings,destDir_settings)
print 'Successfully created "%s"' % destDir_settings
else:
print '"%s" Already Exists. Not Creating Folder.' % destDir_settings