ใครใช้ส่วนขยาย 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 Corner ของ Oliver มีหลายสิ่งที่คุณสามารถทำได้โดยใช้ Python ใน FME

ฉันมักจะใช้ PythonCaller เพื่อสร้างการอ้างอิงบางอย่างภายในหม้อแปลง 1 ตัวแทนที่จะใช้ 10 หม้อแปลงที่แตกต่างกัน (ถ้า elif elif อื่น .. )

คุณสามารถมี PythonCallers พื้นฐานอย่างนี้ได้ตัวอย่างซึ่งจะแปลงคุณสมบัติทั้งหมดของคุณให้เป็นค่าตัวพิมพ์ใหญ่:

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

ฉันยังใช้ PythonCaller เพื่อส่งอีเมลในกรณีที่เกิดข้อผิดพลาดหรือโต้ตอบกับเซิร์ฟเวอร์ FTP ฯลฯ ไม่มีข้อ จำกัด จริงๆ

ขอให้สนุกและมีความสุข FMEing

เจฟฟ์


Oooohhhhh ... ฉันชอบเสียงนี้ ... ไม่เคยคิดที่จะใช้ PythonCaller ในแบบนั้น!
ชาดคูเปอร์

คำถามเพิ่มเติมเกี่ยวกับเรื่องนี้ ... คุณต้องใช้โปรแกรมอะไรในการเข้าถึงพอร์ต 25 (ไฟร์วอลล์) เพื่อให้อีเมลใช้งานได้ ฉันต่อสู้กับสิ่งนี้เป็นเวลาสองสามสัปดาห์และในที่สุดก็ยอมแพ้
blord-castillo

4

ตัวอย่างที่ดีดังกล่าวข้างต้น: ผมกำลังเขียนบทความฐานความรู้ของเราที่เรียกว่า FMEPedia ที่นี่: งูหลามและ FME ข้อมูลพื้นฐานเกี่ยวกับ

ซึ่งรวมถึงตัวอย่างง่ายๆเช่นการลบไฟล์ก่อนใช้พื้นที่ทำงานด้วยสคริปต์เริ่มต้นจัดการกับฟีเจอร์ด้วย PythonCaller เป็นต้นนอกจากนี้ยังมีลิงก์ไปยังตัวอย่างที่ซับซ้อนมากขึ้น

ซอฟต์แวร์ Ken Bragg Safe


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 Transformer ซึ่งรับพิกัดขอบเขตจากกล่องขอบเขตของพื้นที่ที่ฉันสนใจ

จากนั้นฉันจะส่งแอตทริบิวต์เหล่านี้ไปยัง 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.