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

Oliver의 Python Corner를 살펴보십시오. FME에서 Python을 사용하여 할 수있는 일이 많이 있습니다.

필자는 종종 10 개의 다른 트랜스포머를 사용하지 않고 1 개의 트랜스포머 내에서 일부 속성 조작을하기 위해 PythonCaller를 사용합니다 (다른 경우 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라는 지식 기반 기사를 작성하고 있습니다 : Python and FME Basics .

여기에는 시작 스크립트로 작업 공간을 실행하기 전에 파일을 삭제하거나 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

최근에 CSV 파일에서 좌표를 가져 와서 속성으로 저장하는 PythonCaller 변환기를 사용하고 있습니다. CSV는 내 관심 영역의 경계 상자에서 경계 좌표를 얻는 BoundsExtractor Transformer를 사용하는 다른 작업 공간에서 작성됩니다.

그런 다음 이러한 속성을 추가 처리를 위해 경계 좌표를 검색 창으로 사용하는 다른 WorkspaceRunner에 전달합니다. State-Wide 데이터가 있고 전체 상태를 처리하는 데 몇 시간이 걸립니다. 처리를 특정 창으로 제한하기 때문에 모든 작업에 1 분이 걸립니다.

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.