ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AFT二次开发教程(16):外部数据面集成——PCF / CAESAR II Neutral / EPANET / GIS 与第三方衔接

AFT二次开发教程(16):外部数据面集成——PCF / CAESAR II Neutral / EPANET / GIS 与第三方衔接 AFT二次开发教程16外部数据面集成——PCF / CAESAR II Neutral / EPANET / GIS 与第三方衔接版本与事实声明产品与版本AFT Fathom 15 / AFT Impulse 12当前本篇菜单项与格式引用官方Fathom 13帮助页File Menu及其链接页正文当前版以官方文档为准。语言/环境Python 3.x标准库。本文目标读完能说清 AFT 与配管/应力/供水/地理工具之间哪条通道传什么并管理好导入件的清点与命名。所有文件名为示例性不代表任何真实项目。一句话结论AFT 的外部资产交换由 File 菜单的Import Piping Layout FromPiping Component File.pcf/ CAESAR II Neutral File.cii/ GIS Shapefile.shp/ EPANET File.inp与Export Piping Layout ToEPANET.inp承担另有MergeWorkspace Only把另一模型文件并入当前模型注意.inp有双语义EPANET 文件 与Export Model Data的 Preformatted Report 都可能叫.inp必须按来源动作而非扩展名区分。〇、本篇要解决的认知问题Q1AFT 与外部工具交换的是数据还是资产为什么这里要专门讲一次Q2Import Piping Layout From支持哪四类格式各自来自哪个专业、传什么Q3为什么只有 EPANET 能导出这说明了 AFT 在管网生态里的位置是什么Q4.inp双语义陷阱是什么怎么避免Q5Merge与导入格式有什么本质不同一、机制解析16.1 两种对外别混为一谈本系列到目前讲了两类对外类型通道传什么例子数据面前几篇Excel / Batch File / Force File参数与结果数值AFT Transfer、Excel 导出件、Force File资产面本篇Import Piping Layout From等管网的几何与拓扑PCF、CII、SHP、EPANET为什么必须分开数值数据面解决批量算与批量取资产面解决建出来的模型从哪来、算完的模型往哪去。一个管网模型的出生往往是配管专业的 PCF/CII它的去处可能是应力专业的载荷文件、或供水管网分析工具的 EPANET 文件。自动化流水线要覆盖模型的全生命周期就不能只管数值不管资产。16.2 四类导入格式来自谁、传什么官方File Menu的Import Piping Layout From列出四类格式官方扩展名来源专业/工具传什么Piping Component File (PCF).pcf配管/三维设计工具导出的管件清单管线元件与连接关系CAESAR II Neutral File (CII).cii管系应力分析CAESAR II 的中性文件格式管线几何与拓扑中性格式被多方支持GIS Shapefile.shp地理信息系统地理图形geospatial maps常对应管网走向/位置EPANET File.inp供水管网分析生态供水管网模型工程解读PCF与CII都是从配管/应力侧拿几何——现实中你的管网拓扑往往已经在三维设计里存在了没必要在 AFT 里重画一遍导入后补水力参数管径细节、粗糙度、泵曲线、边界条件。GIS Shapefile是从地图拿走向——城市/园区管网常以 GIS 形式存在导入.shp把地理走向带进来。EPANET是从供水分析生态拿模型——这是 AFT 与市政/供水领域互通的接口。共同点也是最重要的工程事实导入的是管网骨架不是能算的模型。导入后你要做的是补全水力定义流体、边界、泵特性、规格——这一步正是前面 15 篇所有功夫的用武之地导入骨架 → 用AFT Transfer批量补参数 → 批跑 → 取数。这就构成一条完整流水线配管/应力/供水/地图 → 导入骨架(.pcf/.cii/.shp/.inp) → 批量补水力参数(AFT Transfer) → 批跑 → 取数/交付 (外部专业) (本篇, 官方导入) (第05/09/15篇) (第10篇) (第11/14/19篇)16.3 为什么只有 EPANET 能导出官方Export Piping Layout To只列了一项EPANET File (.inp)。这说明了 AFT 在生态里的位置进得多、出得少——AFT 乐于当水力分析的大脑从各种上游拿几何出只出 EPANET——因为供水领域需要把 AFT 算好的管网交回供水生态应力载荷不走布局导出而走Export Force File第 14 篇——力和几何是两条不同的出口。工程师要记住想把 AFT 模型导回三维设计没有官方布局导出通道除了 EPANET。这不是缺陷而是分工——几何的真相源在三维设计AFT 只做水力。16.4.inp双语义陷阱第 04 篇提过一次这里说清EPANET File.inp供水管网模型格式Export Model Data的 Preformatted Report也会生成.inp官方明确提示which is not to be confused with EPANET files that have the same file extension。两者的用处完全不同同名.inp生成动作用途EPANET 文件由 EPANET 生态产生 / AFT 的 EPANET 导出产生供水管网模型交换Preformatted ReportExport Model Data→ 选 Preformatted Report模型数据文本快照可用于文本 diff 找差异官方说作用类似 Scenario Comparison Tool避免方法永远按下生成动作归档而不是按扩展名。目录命名与清单里写清这是 EPANET 还是 Report本篇代码 16-1 的用途分类就是干这个。附带收获Preformatted Report 的.inp是一条无 GUI 的模型差异对比路径——适合放进自动化回归测试第 20 篇每次改模型后diff两个.inp快照就知道输入到底变了什么。16.5Merge另一种合并官方Merge - (Workspace Only)打开一个 Merge 对话框把另一个模型文件合并进当前模型。与导入格式的本质区别Import Piping Layout From导入的是外部格式的几何需要在 AFT 里重新生成对象Merge合并的是另一个 AFT 模型文件.fth/.imp等对象本来就是 AFT 对象。工程用途把分专业/分区段建的多个 AFT 模型合成一个完整模型如厂区东侧 西侧两个模型合成全网或把某师傅做好的泵站子模型并入主模型。合并后同样必须复核对象编号冲突不同文件里可能有同名/同编号对象。16.6 资产面的三个工程纪律资产面导入几何、合并模型比数据面更容易出大错——因为它动的是拓扑不是数值。三条纪律纪律一导入后先清点再补水。导入 PCF/CII/SHP 后先跑一次对象清点第 04 篇object_inventory.py把进来了多少管、多少结点、有哪些类型记下来然后再补水力参数。顺序反了你会不知道某个参数为什么改不上因为对象根本没进来。纪律二合并前必查编号冲突。AFT 的管与结点是两套独立编号空间第 04 篇合并两个模型时管 3和管 3会撞车merge_guard.py就是干这个。冲突必须先重编号再合并——合并后再改会牵动一大片连接关系。纪律三几何的真相源不在 AFT。AFT 只做水力不回写三维几何官方Export Piping Layout To只支持 EPANET。所以别指望在 AFT 里改了几何再导回设计——几何改动要回到上游工具做AFT 侧重新导入。认清这条能省下大量为什么导不回去的困惑。二、完整代码与逐行剖析代码 16-1layout_in.py导入件清点 用途分类 命名标准化# -*- coding: utf-8 -*- layout_in.py —— 外部导入件清点与命名标准化 按来源动作/格式分类避免 .inp 双语义混淆输出清点 JSON 供流水线引用。 运行 python layout_in.py --selftest python layout_in.py incoming/ --out incoming_inventory.json importargparseimportjsonimportosimportreimportsys# 官方支持的四类导入格式LAYOUT_EXT{.pcf:PCF,.cii:CAESAR II Neutral,.shp:GIS Shapefile,.inp:EPANET-or-Report}MODEL_EXT{.fth:AFT Fathom,.imp:AFT Impulse,.aro:AFT Arrow,.xtr:AFT xStream}defclassify_inp(name:str)-str:区分 .inp 双语义文件名/同目录标记含 report/export 视为模型报告否则按 EPANET。lowname.lower()ifre.search(r(report|preformat|model_data),low):returnModel Data Preformatted Report (.inp)returnEPANET File (.inp)definventory(root:str)-dict:items,ext_counts[],{}fordirpath,_dirs,filesinos.walk(root):forfninfiles:extos.path.splitext(fn)[1].lower()ifextinLAYOUT_EXT:kindclassify_inp(fn)ifext.inpelseLAYOUT_EXT[ext]elifextinMODEL_EXT:kindMODEL_EXT[ext] 模型文件else:continueext_counts[ext]ext_counts.get(ext,0)1items.append({file:os.path.relpath(os.path.join(dirpath,fn),root),ext:ext,kind:kind})return{root:root,total:len(items),by_ext:ext_counts,items:sorted(items,keylambdax:x[file])}defselftest():demo[layout_01.pcf,stress_neutral.cii,water.epanet.inp,model_data_report.inp,plant_west.fth,notes.txt]kinds{}forfnindemo:extos.path.splitext(fn)[1].lower()ifextinLAYOUT_EXT:kinds[fn]classify_inp(fn)ifext.inpelseLAYOUT_EXT[ext]assertkinds[water.epanet.inp].startswith(EPANET),kindsassertReportinkinds[model_data_report.inp],kinds# 双语义被区分assertnotes.txtnotinkindsandlen(kinds)4,kindsprint(SELFTEST OK4 个导入件被正确分类两种 .inp 语义被区分.txt 被忽略。)print(json.dumps(kinds,ensure_asciiFalse,indent2))defmain():apargparse.ArgumentParser()ap.add_argument(root,nargs?,default.)ap.add_argument(--out,defaultincoming_inventory.json)ap.add_argument(--selftest,actionstore_true)aap.parse_args()ifa.selftest:selftest()return0invinventory(a.root)withopen(a.out,w,encodingutf-8)asf:json.dump(inv,f,ensure_asciiFalse,indent2)print(f清点{inv[total]}个外部件{inv[by_ext]}→{a.out})return0if__name____main__:sys.exit(main())逐行剖析LAYOUT_EXT与MODEL_EXT分开外部格式需要导入转换与AFT 模型文件可直接 Open/Merge是两回事混在一起会让人误以为.fth也是导入格式。.inp的EPANET-or-Report占位 classify_inp()按文件命名/同目录标记区分双语义这是用命名纪律弥补格式歧义的实际手法。它不完美依赖命名但比只看扩展名强得多——并把不确定性显式记录在用途字段里。inventory()只收已知格式其余静默忽略notes.txt不会被当导入件。这在真实项目里能过滤掉一堆无关文件。by_ext计数让这次收了多少件一目了然——导入前先清点是资产面流水线的第一步尤其当上游一次性甩来几十个.pcf时。selftest()断言两种.inp被区分、notes.txt被忽略——这两条正是本篇最容易出错的知识点。代码 16-2merge_guard.py合并前对象编号冲突预检# -*- coding: utf-8 -*- merge_guard.py —— Merge 前对象编号冲突预检 输入各模型的对象清点第04篇 object_inventory.py 产物含编号列表 输出编号交叉冲突清单 运行python merge_guard.py --selftest importsysdefcheck(model_a:dict,model_b:dict)-list:model_*: {pipes: {num,...}, junctions: {num,...}}problems[]forkindin(pipes,junctions):dupset(model_a.get(kind,()))set(model_b.get(kind,()))ifdup:problems.append(f{kind}编号冲突{sorted(dup)}—— Merge 后需重编号)returnproblemsdefselftest():a{pipes:{1,2,3},junctions:{1,2}}b{pipes:{3,4},junctions:{5}}probscheck(a,b)assertany(pipesinpforpinprobs),probsassertnotany(junctionsinpforpinprobs),probs# junction 无冲突print(SELFTEST OK识别出 pipes 编号 3 冲突junctions 无冲突。)if__name____main__:if--selftestinsys.argv:selftest()逐行剖析冲突预检按管与结点两类分别做交集——因为 AFT 里管与结点是两套编号空间第 04 篇管 3 与结点 3 可以共存不算冲突。返回的是冲突编号本身不是布尔你要的是具体哪些号要重编好去做批量重编号。selftest()刻意构造管有冲突、结点无冲突验证脚本不会把两类混为一谈。三、常见报错与排查报错 16-1把Export Model Data生成的.inp当 EPANET 文件导入失败。现象EPANET 导入报错或反了。根因.inp双语义——Preformatted Report 与 EPANET 同扩展名。解法按生成动作归档导入 EPANET 明确走Import Piping Layout From EPANET File代码 16-1 的用途分类。报错 16-2导入 PCF/.cii后模型能看不能算。现象骨架有了跑不了。根因导入的是几何骨架不是完整水力模型——缺流体、边界、泵特性、规格。解法导入后按流水线批量补水力参数AFT Transfer补完再跑。报错 16-3想把 AFT 模型导回三维设计找不到导出项。现象只看到 EPANET 导出。根因官方Export Piping Layout To只支持 EPANET应力载荷走Export Force File第 14 篇几何真相源在三维设计。解法接受分工——AFT 不负责回写三维几何需要载荷就用 Force File。报错 16-4Merge 后出现重复编号/对象错乱。现象合并后模型异常。根因两个模型里管或结点的编号空间重叠。解法合并前用merge_guard.py预检冲突先重编号再 Merge合并后做对象清点复核第 04 篇。报错 16-5GIS Shapefile 导入后位置对、连接不对。现象地理走向有了但拓扑连接缺失/错乱。根因GIS 传的是地理图形不保证拓扑完整。解法导入后核对连接关系Node/Element 连通性用Export Model Data清点对象并补连线。报错 16-6导入后参数改不上怀疑是变更表写错。现象变更表看着没问题导入却失败。根因对象根本没进来——导入件只带来了部分元件某对象不在模型里。解法按纪律一先清点对象、再补水变更表的对象编号必须取自清点结果第 04/07 篇。四、动手练习练习 1清点自检跑python layout_in.py --selftest。判定输出SELFTEST OK两种.inp用途被区分.txt被忽略。练习 2真实清点把一个含多种外部件的目录用layout_in.py incoming/ --out inv.json清点。判定by_ext计数与目录里实际件数一致.inp条目的kind都明确无EPANET-or-Report残留。练习 3导入—补参闭环用一个.pcf或示例件导入生成骨架然后用AFT Transfer批量补 5 个水力参数跑一次。判定模型能跑出结果列出你补了哪 5 个参数。练习 4合并预检用merge_guard.py对两个模型的对象编号做冲突预检编号可从Export Model Data清点得到。判定若报冲突给出重编号方案若无冲突写出管/结点两套编号空间的解释。练习 5序号规范为导入件建立一套命名规范含来源、日期、版本并写进清点清单。判定清单里每个导入件的kind与文件名都能对应任取一个文件仅凭文件名就能说出它来自谁、什么时候、哪个版本。五、小结与下一篇预告本篇划清了资产面AFT 从PCF / CAESAR II Neutral.cii/ GIS Shapefile / EPANET导入管网骨架只向EPANET导出布局Merge用于合并AFT 模型文件性质不同于格式导入.inp双语义必须按生成动作区分导入骨架后要靠AFT Transfer 批量补水力参数才算能算的模型。至此五条通道全部讲完——17 篇起进入综合实战。第 17 篇《实战一管网水力批量分析端到端项目》我们把 05/09/10/11/12 全部串起来做一个可断点续跑的 CLI——工况矩阵 → 变更表 → 批跑 → 取数 → 落库 → 出报告并给出完整的账本与目录规范。FAQ与第〇节一一对应Q1AFT 与外部工具交换的是数据还是资产A两类都有但本文专讲资产面——数据面Excel、Batch File、Force File传参数与结果数值资产面Import Piping Layout From 等传管网的几何与拓扑模型生命周期要求同时覆盖两者。Q2Import Piping Layout From 支持哪四类格式APiping Component File.pcf、CAESAR II Neutral File.cii、GIS Shapefile.shp、EPANET File.inp分别来自配管/三维设计、管系应力分析、地理信息系统与供水管网生态传的都是管网骨架而非完整水力模型。Q3为什么只有 EPANET 能导出这说明了什么A官方 Export Piping Layout To 只支持 EPANET File.inp说明 AFT 在生态里定位为水力分析大脑、进多出少应力载荷另走 Export Force File几何真相源在三维设计AFT 不负责回写几何。Q4.inp 双语义陷阱是什么怎么避免AEPANET 文件与 Export Model Data 的 Preformatted Report 都使用 .inp 扩展名官方明确提示不要混淆前者用于供水管网模型交换、后者是模型数据文本快照可用于文本 diff避免方法是按生成动作归档而非按扩展名判断并在清单里记录用途分类。Q5Merge 与导入格式有什么本质不同AImport Piping Layout From 导入的是外部格式的几何需在 AFT 里重新生成对象Merge 合并的是另一个 AFT 模型文件对象本来就是 AFT 对象常用于把分区段或分专业建的多个 AFT 模型合成一个完整模型合并前须做编号冲突预检。
返回列表