Kto używa rozszerzenia FME Python i jak?


Odpowiedzi:


9

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.


5

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


Oooohhhhh ... Podoba mi się dźwięk tego ... nigdy nie myślałem o użyciu PythonCaller w ten sposób!
Chad Cooper

Dodatkowe pytanie na ten temat ... jaki program musisz dać dostęp do portu 25 (zapory ogniowej), aby e-mail działał? Walczyłem z tym przez kilka tygodni, a potem w końcu się poddałem.
blord-castillo

4

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


3

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

1

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.