Eu vi uma ótima interface para FME com Python
O que vocês estão fazendo com isso? Eu quero idéias
Eu vi uma ótima interface para FME com Python
O que vocês estão fazendo com isso? Eu quero idéias
Respostas:
Estou iniciando o FME e estou usando um script de desligamento para copiar meu FGDB de destino para outro local e salvar o arquivo de log:
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')
Isso é bastante básico, mas realmente não há limites, eu não acho. Há toneladas de idéias aqui também.
EDIT: Adicionado no código para obter o número de recursos gravados e enviá-los para o arquivo de log CSV.
Dê uma olhada no Python Corner de Oliver. Há muitas coisas que você pode fazer usando o Python no FME.
Costumo usar o PythonCaller para fazer algumas manipulações de atributos dentro de 1 transformador, em vez de usar 10 transformadores diferentes (se elif elif mais ..)
Você pode ter PythonCallers muito básicos como este exemplo, que converterão todos os seus atributos em valores em maiúsculas:
def upperAll(feature):
for att in feature.getAttributeList():
feature.setAttribute(att,feature.gettAttribute(att).upper())
Também uso o PythonCaller para enviar e-mails em caso de falha ou interagir com um servidor FTP etc. Não há limites
Divirta-se e feliz FMEing
Jeff
Bom exemplo acima: Atualmente, estou escrevendo um artigo para nossa base de conhecimento chamado FMEPedia aqui: Python e FME Basics .
Isso inclui alguns exemplos simples, como excluir um arquivo antes de executar uma área de trabalho com um script de inicialização, manipular recursos com um PythonCaller etc. Também existem links para exemplos mais complexos.
Ken Bragg Safe Software
Exemplos:
Log personalizado
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")
E enviar email :
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()
Recentemente, eu tenho usado um transformador PythonCaller que obtém coordenadas de um arquivo CSV e as salva como atributos. O CSV é gravado em outro espaço de trabalho que usa um transformador BoundsExtractor que obtém as coordenadas delimitadoras de uma caixa delimitadora da minha área de interesse.
Depois, passo esses atributos para outros WorkspaceRunners que usam as coordenadas delimitadoras como uma janela de pesquisa para processamento adicional. Eu tenho dados em todo o estado e o processamento em todo o estado levaria várias horas. Como limito meu processamento a uma janela específica, tudo leva um minuto.
O código pythonCaller está aqui:
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
Eu também uso um script de inicialização python que copia uma árvore de pastas para outro local, se ainda não existir.
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