¿Quién usa la extensión FME Python y cómo?

Respuestas:

9

Recién estoy comenzando con FME, y estoy usando un script de apagado para copiar mi FGDB de destino en otra ubicación y guardar el archivo de registro:

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')

Eso es bastante básico, pero realmente no hay límite, no creo. Hay toneladas de ideas aquí también.

EDITAR: agregado en el código para obtener una cantidad de características escritas y enviarlas al archivo de registro CSV.

Chad Cooper
fuente
5

Echa un vistazo a Oliver's Python Corner. Hay muchas cosas que puedes hacer con Python en FME.

A menudo uso PythonCaller para hacer algunas manipulaciones de atributos dentro de 1 transformador en lugar de usar 10 transformadores diferentes (si elif elif else ..)

Puede tener PythonCallers muy básicos como este ejemplo que convertirá todos sus atributos a valores en mayúsculas:

def upperAll(feature):
    for att in feature.getAttributeList():
        feature.setAttribute(att,feature.gettAttribute(att).upper())

También uso PythonCaller para enviar correos electrónicos en caso de falla o interactuar con un servidor FTP, etc. Realmente no hay límites

Diviértete y feliz FMEing

Jeff

jaykayone
fuente
Oooohhhhh ... me gusta cómo suena esto ... ¡nunca pensé en usar un PythonCaller de esa manera!
Chad Cooper
Pregunta adicional sobre este ... ¿qué programa tiene que dar acceso al puerto 25 (firewall) para que el correo electrónico funcione? Luché con esto durante un par de semanas y finalmente me rendí.
blord-castillo
4

Buen ejemplo anterior: actualmente estoy escribiendo un artículo para nuestra base de conocimiento llamado FMEPedia aquí: Python y FME Basics .

Esto incluye algunos ejemplos simples, como eliminar un archivo antes de ejecutar un espacio de trabajo con un script de inicio, manipular características con un PythonCaller, etc. También hay enlaces a ejemplos más complejos.

Software seguro Ken Bragg

Ken Bragg
fuente
3

Ejemplos:

Registro 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")

Y enviar correo electrónico :

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() 
usuario3120
fuente
1

Recientemente he estado usando un transformador PythonCaller que obtiene coordenadas de un archivo CSV y las guarda como atributos. El CSV se escribe desde otro espacio de trabajo que utiliza un Transformador BoundsExtractor que obtiene las coordenadas delimitadoras de un cuadro delimitador de mi área de interés.

Luego paso estos atributos a otros WorkspaceRunners que usan las coordenadas delimitadoras como una ventana de búsqueda para su posterior procesamiento. Tengo datos de todo el estado y procesarlos en todo el estado llevaría varias horas. Debido a que limito mi procesamiento a una ventana en particular, todo toma un minuto.

El código pythonCaller está aquí:

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

También uso un script de inicio de Python que copia un árbol de carpetas a otra ubicación si aún no existe.

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
fuente