FME Python uzantısını kimler kullanır ve nasıl?


Yanıtlar:


9

Ben sadece FME ile başlıyorum ve hedef FGDB başka bir konuma kopyalamak ve günlük dosyasını kaydetmek için bir kapatma komut dosyası kullanıyorum:

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

Bu oldukça basit, ama gerçekten sanmıyorum bir sınır yok. Burada da tonlarca fikir var .

EDIT: Yazılan özelliklerin sayısını almak ve bunları CSV günlük dosyasına aktarmak için kod eklendi.


5

Oliver'ın Python Köşesine bir göz atın. FME'de Python kullanarak yapabileceğiniz bir sürü şey var.

PythonCaller'ı 10 farklı transformatör kullanmak yerine 1 transformatör içinde bazı nitelikler yapmak için sık sık kullanıyorum (eğer elif elif ..)

Tüm niteliklerinizi büyük harf değerlere dönüştürecek bu örnek gibi çok temel PythonCaller'larınız olabilir:

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

Ayrıca hata durumunda e-posta göndermek veya bir FTP sunucusu vb ile etkileşim durumunda PythonCaller kullanın. Gerçekten sınır yoktur

İyi eğlenceler ve mutlu FMEing

Jeff


Oooohhhhh ... Bu sesi seviyorum ... bir PythonCaller kullanmayı asla düşünmedim!
Chad Cooper

Bu konuda ek soru ... e-postanın çalışması için 25 numaralı bağlantı noktasına (güvenlik duvarı) erişim vermek için hangi programa ihtiyacınız var? Bununla birkaç hafta uğraştım ve sonunda vazgeçtim.
blord-castillo

4

Yukarıda iyi bir örnek: Şu anda burada FMEPedia adlı bilgi bankamız için bir makale yazıyorum: Python ve FME Basics .

Bu, bir başlatma komut dosyası ile bir çalışma alanı çalıştırmadan önce bir dosyayı silmek, bir PythonCaller vb. İle özellikleri değiştirmek gibi bazı basit örnekleri içerir. Daha karmaşık örneklere bağlantılar da vardır.

Ken Bragg Güvenli Yazılım


3

Örnekler:

Özel Günlük

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

Ve E-posta Gönder :

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

Son zamanlarda bir CSV dosyasından koordinatları alan ve bunları öznitelik olarak kaydeden bir PythonCaller trafosu kullanıyorum. CSV, ilgi alanıma ait sınırlayıcı bir kutudan sınırlayıcı koordinatları alan bir BoundsExtractor Transformer kullanan başka bir çalışma alanından yazılır.

Daha sonra bu öznitelikleri, daha sonraki işlemler için bir arama penceresi olarak sınırlama koordinatlarını kullanan diğer WorkspaceRunners geçirir. Eyalet çapında verilerim var ve tüm eyalet üzerinde işlem yapmak birkaç saat sürecek. İşlemimi belirli bir pencereyle sınırladığım için, her şey bir dakika sürüyor.

PythonCaller kodu burada:

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

Ayrıca zaten yoksa, bir klasör ağacını başka bir konuma kopyalayan bir python başlatma komut dosyası kullanıyorum.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.