Хто використовує розширення FME Python і як?


Відповіді:


9

Я тільки починаю працювати з FME і використовую сценарій відключення, щоб скопіювати цільовий FGDB в інше місце та зберегти файл журналу:

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

Це досить базово, але дійсно немає межі, я не думаю. Є тонни ідей тут , як добре.

РЕДАКТУВАННЯ: Додано в код, щоб отримати кількість функцій, записаних та висунути їх у файл журналу CSV.


5

Погляньте на куточок Олівера Пітона. Є багато речей, які можна зробити за допомогою Python у FME.

Я часто використовую PythonCaller, щоб зробити деякі атрибутичніпоширення всередині 1 трансформатора, а не використовувати 10 різних трансформаторів (якщо elif elif else ..)

Ви можете мати дуже основні PythonCallers, як цей приклад, який перетворить всі ваші атрибути у великі величини:

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

Я також використовую PythonCaller для надсилання електронних листів у разі відмови або взаємодії з FTP-сервером тощо. Дійсно немає обмежень

Веселіться та радійте FMEing

Джефф


Oooohhhhhh ... Мені подобається звук цього ... ніколи не думав про використання PythonCaller таким чином!
Чад Купер

Додаткове запитання щодо цього ... яку програму ви повинні надати доступ до порту 25 (брандмауера), щоб електронна пошта працювала? Я боровся з цим пару тижнів, а потім нарешті здався.
blord-castillo

4

Хороший приклад вище: я зараз пишу статтю для нашої бази знань під назвою FMEPedia: Основи Python та FME .

Сюди входять кілька простих прикладів, такі як видалення файлу перед запуском робочої області за допомогою сценарію запуску, маніпулювання функціями з PythonCaller тощо. Також є посилання на більш складні приклади.

Кен Брегг Безпечне програмне забезпечення


3

Приклади:

Спеціальний журнал

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

І надішліть електронну пошту :

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

Нещодавно я використовував трансформатор PythonCaller, який отримує координати з файлу CSV і зберігає їх як атрибути. CSV записується з іншої робочої області, яка використовує трансформатор BoundsExtractor, який отримує обмежувальні координати від обмежувального поля моєї цікавої області.

Потім я передаю ці атрибути іншим WorkspaceRunners, які використовують обмежувальні координати як вікно пошуку для подальшої обробки. У мене є широкомасштабні дані, і на обробку в цілому стан пішло б кілька годин. Оскільки я обмежую обробку певним вікном, вся справа займає одну хвилину.

Код pythonCaller знаходиться тут:

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

Я також використовую сценарій запуску python, який копіює дерево папок в інше місце, якщо воно вже не існує.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.