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.