Quem usa a extensão FME Python e como?

10

Eu vi uma ótima interface para FME com Python

O que vocês estão fazendo com isso? Eu quero idéias

Philippe Lavoie
fonte

Respostas:

9

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.

Chad Cooper
fonte
5

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

jaykayone
fonte
Oooohhhhh ... eu gosto do som disso ... nunca pensei em usar um PythonCaller dessa maneira!
Chad Cooper
Pergunta extra sobre este ... qual programa você tem para dar acesso à porta 25 (firewall) para que o email funcione? Eu lutei com isso por algumas semanas e finalmente desisti.
Blord-castillo
4

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

Ken Bragg
fonte
3

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() 
user3120
fonte
1

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
Fezter
fonte