Siapa yang menggunakan ekstensi FME Python dan bagaimana caranya?


Jawaban:


9

Saya baru memulai dengan FME, dan saya menggunakan skrip shutdown untuk menyalin target FGDB saya ke lokasi lain dan untuk menyimpan file 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')

Itu cukup mendasar, tetapi saya pikir tidak ada batasan. Ada banyak ide di sini juga.

EDIT: Menambahkan kode untuk mendapatkan sejumlah fitur yang ditulis dan mendorongnya ke file log CSV.


5

Lihatlah Oliver's Python Corner. Ada banyak hal yang dapat Anda lakukan menggunakan Python di FME.

Saya sering menggunakan PythonCaller untuk membuat beberapa pengaturan atribut di dalam 1 transformator daripada menggunakan 10 transformer berbeda (jika elif elif yang lain ..)

Anda dapat memiliki PythonCallers yang sangat mendasar seperti contoh ini yang akan mengubah semua atribut Anda menjadi nilai huruf besar:

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

Saya juga menggunakan PythonCaller untuk mengirim email jika terjadi kegagalan atau berinteraksi dengan FTP Server dll. Sebenarnya tidak ada batasan

Bersenang-senang dan senang FMEing

Jeff


Oooohhhhh ... Saya suka suara ini ... tidak pernah berpikir tentang menggunakan PythonCaller seperti itu!
Chad Cooper

Pertanyaan ekstra untuk yang satu ini ... program apa yang Anda miliki untuk memberikan akses ke port 25 (firewall) agar email berfungsi? Saya berjuang dengan ini selama beberapa minggu dan akhirnya menyerah.
blord-castillo

4

Contoh yang baik di atas: Saat ini saya sedang menulis artikel untuk basis pengetahuan kami bernama FMEPedia di sini: Dasar-Dasar Python dan FME .

Ini termasuk beberapa contoh sederhana seperti menghapus file sebelum menjalankan ruang kerja dengan skrip start up, memanipulasi fitur dengan PythonCaller dll. Ada juga tautan ke contoh yang lebih kompleks.

Perangkat Lunak Aman Ken Bragg


3

Contoh:

Log Khusus

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

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

1

Saya baru-baru ini menggunakan transformator PythonCaller yang mendapatkan koordinat dari file CSV dan menyimpannya sebagai atribut. CSV akan ditulis dari ruang kerja lain yang menggunakan BoundsExtractor Transformer yang mendapatkan koordinat terikat dari kotak pembatas bidang yang saya minati.

Saya kemudian meneruskan atribut ini ke WorkspaceRunners lain yang menggunakan koordinat terikat sebagai jendela pencarian untuk diproses lebih lanjut. Saya memiliki data State-Wide dan untuk memproses seluruh negara akan memakan waktu beberapa jam. Karena saya membatasi pemrosesan saya ke jendela tertentu, semuanya membutuhkan satu menit.

Kode pythonCaller ada di sini:

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

Saya juga menggunakan skrip start up python yang menyalin pohon folder ke lokasi lain jika belum ada.

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.