Qui utilise l'extension FME Python et comment?

10

J'ai vu une excellente interface avec FME avec Python

Qu'est-ce que vous en faites? Je veux des idées.

Philippe Lavoie
la source

Réponses:

9

Je viens de commencer avec FME et j'utilise un script d'arrêt pour copier mon FGDB cible vers un autre emplacement et pour enregistrer le fichier journal:

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

C'est assez basique, mais il n'y a vraiment pas de limite, je ne pense pas. Il y a aussi des tonnes d'idées ici .

EDIT: ajouté dans le code pour obtenir le nombre de fonctionnalités écrites et les pousser vers le fichier journal CSV.

Chad Cooper
la source
5

Jetez un oeil à Oliver's Python Corner. Il y a une tonne de choses que vous pouvez faire en utilisant Python dans FME.

J'utilise souvent le PythonCaller pour faire quelques manipulations d'attributs dans 1 transformateur plutôt que d'utiliser 10 transformateurs différents (si elif elif sinon ..)

Vous pouvez avoir des PythonCallers très basiques comme cet exemple qui convertira tous vos attributs en valeurs majuscules:

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

J'utilise également le PythonCaller pour envoyer des emails en cas de panne ou interagir avec un serveur FTP etc. Il n'y a vraiment pas de limites

Amusez-vous bien et heureux

Jeff

jaykayone
la source
Oooohhhhh ... J'aime le son de ça ... je n'ai jamais pensé à utiliser un PythonCaller de cette façon!
Chad Cooper
Question supplémentaire sur celui-ci ... quel programme avez-vous pour donner accès au port 25 (pare-feu) pour que l'e-mail fonctionne? J'ai lutté avec ça pendant quelques semaines, puis j'ai finalement abandonné.
blord-castillo
4

Bon exemple ci-dessus: j'écris actuellement un article pour notre base de connaissances appelé FMEPedia ici: Python et FME Basics .

Cela inclut quelques exemples simples tels que la suppression d'un fichier avant d'exécuter un espace de travail avec un script de démarrage, la manipulation de fonctionnalités avec un PythonCaller, etc. Il existe également des liens vers des exemples plus complexes.

Logiciel Ken Bragg Safe

Ken Bragg
la source
3

Exemples:

Journal personnalisé

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

Et envoyer un 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() 
3120
la source
1

J'ai récemment utilisé un transformateur PythonCaller qui obtient les coordonnées d'un fichier CSV et les enregistre en tant qu'attributs. Le CSV est écrit à partir d'un autre espace de travail qui utilise un transformateur BoundsExtractor qui obtient les coordonnées de délimitation à partir d'un cadre de délimitation de ma zone d'intérêt.

Je passe ensuite ces attributs à d'autres WorkspaceRunners qui utilisent les coordonnées de délimitation comme fenêtre de recherche pour un traitement ultérieur. J'ai des données à l'échelle de l'État et le traitement de l'ensemble de l'État prendrait plusieurs heures. Parce que je limite mon traitement à une fenêtre particulière, le tout prend une minute.

Le code pythonCaller est ici:

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

J'utilise également un script de démarrage python qui copie une arborescence de dossiers vers un autre emplacement s'il n'existe pas déjà.

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
la source