- 新增 PcfIso.h/.cpp:PCF 解析、等轴测投影(朝向与 Plant 3D 一致)、 A3 图框/标题栏/材料表/切割表/尺寸/标高/焊口气泡/北针/跨图续接。 - 分图 4 级:模型连通性 → 断点(法兰/现场焊口) → 管段尺寸 → 图幅/拥塞。 - 新增命令 EW_PCFISO(单图)、EW_PCFISOSPLIT(分图,运行时选层级 1/2/3/4)。 - 注册到 EarthWorm.cpp、StdArx.h,并接入 cmakelists.txt。 - 附《PCF-ISO分图规则说明.md》。
6.3 KiB
6.3 KiB
PCF → ISO 分图规则说明(对齐 AutoCAD Plant 3D)
结论先行:Plant 3D(下称 P3D)把 PCF 出 ISO 时的“分图”,主规则是连通性(模型)拆分—— 把 PCF 里的管道元件按“连接点是否重合”连成一张网,凡是不连通的部分各自成为一张 ISO 图。 我们按同一规则实现了
EW_PCFISOSPLIT,对同一份 PCF 得到了与 P3D 完全一致的分图结果(6 张)。
1. P3D 的分图体系(由粗到细,共 5 级)
| 级别 | 名称 | 触发条件 | 本次是否触发 |
|---|---|---|---|
| 1 | 模型级 Model | 连通性断开 / 属性变化 | 是(拆成 6 个模型) |
| 2 | 断点级 Break point | 用户或默认“打断点”(法兰/现场焊口/焊口/任意件) | 否(“未指定打断点”) |
| 3 | 管段级 Spool | 尺寸/重量超限 | 否(SpoolSplit=false) |
| 4 | 图幅级 Sheet | 单张图纸放不下 | 否 |
| 5 | 拥塞级 Congestion | 图面过密 | 否 |
P3D 处理顺序:先按“模型”分组 → 每个模型尝试按断点/管段/图幅再拆 → 最后输出。 日志里逐条出现“正在处理:『污水』/ 未指定打断点 / 已跳过模型拆分”,说明模型已经由第 1 级确定,第 2 级被跳过。
2. IsoConfig.xml 关键参数(本机 Check_ANSI-C 样式实测)
<DefaultSplitPoints> FlangeLike > WeldFieldItem > Weld > AnyItem (程序首选打断点)
<SplitPoints> FlangeLike, WeldFieldItem, Weld (用户首选打断点)
<SheetSplitPoint Change="false"> Connector=FieldWeld (图幅断点,不改焊口类型)
<Model Split="true" ModelSplitMethod="ModelBreakPoint">
<Properties PropertyChange="PIPING-SPEC" Filter=""/>
<Spool SpoolSplitMethod="OnSize" SizeLimits="480 120 96"
OverflowLength="6" MaxDirectionChanges="3" MaxWeight="0" MaxPipeLength="0"
PropertyChange="PIPING-SPEC"/>
<Auto DisableAutoSplit="false" SpoolSplit="false"
IdentifySpools="true" SplitOnCongestion="true" CongestionLevel="2"/>
<AdvancedDefault ForceOntoOneSheet="false" SplittingCongestion="50"/>
DefaultSplitPoints:程序倾向在这些连接处断开(法兰类 → 现场焊口 → 焊口 → 任意件)。SplitPoints:用户倾向断开处;若未在界面里指定,则模型拆分被跳过。SizeLimits="480 120 96":管段尺寸上限(英寸),OverflowLength="6"为余量合并阈值,MaxDirectionChanges="3"为允许的转向次数。Auto/SplitOnCongestion+CongestionLevel=2:图面过密时按拥塞度再拆。
3. 实测:一份 PCF → 6 张图
- 输入:
test1.pcf(= 我们导出的ISO-024_污水.pcf,管线号 污水,60 个元件 + 43 道焊口,单一管线号)。 - 因 P3D 默认工程是英制,先把 PCF 由 mm 换算成 inch(
test1_inch.pcf)才能通过单位校验。 - P3D 日志关键行:
警告 - 在模型中找到了无效的元件(缺少中心点) - TEE ...(共 5 个 TEE 缺中心点)警告 - 在线号“污水”的模型中发现连接已断开。信息 - 加载了“6”个模型。→ 每个模型“未指定打断点 / 已跳过模型拆分” → 生成 6 张图污水-1..6.dwg
产物内容(读图确认):
| 图号 | 内容 | 管径 |
|---|---|---|
| 污水-1/2/3 | 三根立管(各带 3 个阀门、上下异径管) | 300 mm |
| 污水-4 | 一段 200 mm 斜管 | 200 mm |
| 污水-5 | 600 mm 主管折线(含弯头/三通) | 600 mm |
| 污水-6 | 一段 600 mm 直管 | 600 mm |
4. 规则提炼(我们实现所依据的规则)
- 规则 A(连通):两个元件只要有重合的连接点(端点 END-POINT / 中心点 CENTRE-POINT / 支承点 CO-ORDS),就属于同一模型。
- 规则 B(无效支管断开):三通等支管元件若缺少 CENTRE-POINT,P3D 判为“无效元件”,其支管(BRANCH-POINT)不参与连通 → 主管在支管处断开。
本案例正是这条规则把 3 根立管从主管上“摘”了下来。
- 规则 C(模型 = 一张图):每个连通子网输出一张 ISO。
- 规则 D/E/F(断点、管段尺寸、拥塞)为可选层,本次未触发。
用规则 A+B 对
test1.pcf做并查集,得到 6 个连通子网,与 P3D 的 6 张图一一对应。
5. 我们的实现(EW_PCFISOSPLIT)
代码:SourceCode/Code2026/CoreCommand/PcfIso.cpp / PcfIso.h
pointKey():把 3D 点量化成字符串键(容差 0.01),用于判定连接点是否重合。collectConnPoints():收集一个元件参与连通的点;缺少 CENTRE-POINT 时不含支管点(规则 B)。groupComponents():并查集求连通子网,按“最小元件下标”排序,保证编号稳定。makeIsoDwgSplit():对每个子网调用renderToDwg()生成一张图,命名<文件名>-N.dwg;只有一个子网时输出<文件名>.dwg。makeIsoDwgSplitFromPath()/EW_PCFISOSPLITCmdFnc():命令入口,输入 PCF 文件或目录 + 输出目录。
命令:EW_PCFISOSPLIT → 输入 PCF(或目录)→ 输入输出目录(回车=同目录)。
6. 结果对比
实跑 EW_PCFISOSPLIT test1.pcf,输出 6 张图,与 P3D 内容一一对应(仅编号顺序不同):
| Plant 3D | 我们 | 内容 |
|---|---|---|
| 污水-1 | test1-1.dwg | 立管 A(300) |
| 污水-2 | test1-3.dwg | 立管 B(300) |
| 污水-3 | test1-4.dwg | 立管 C(300) |
| 污水-4 | test1-6.dwg | 200 mm 斜管 |
| 污水-5 | test1-2.dwg | 600 mm 主管折线 |
| 污水-6 | test1-5.dwg | 600 mm 直管 |
对比图见:%TEMP%\compare_split_real.png(左 P3D / 右我们)。
7. 尚未实现 / 后续可做
- 断点级:按
SplitPoints(法兰/现场焊口/焊口)在连通网内部再拆。 - 管段级:按
SizeLimits(尺寸上限、转向次数、余量合并)拆 spool。 - 图幅级 / 拥塞级:图面放不下或过密时再拆。
- 图面样式:P3D 的 ISO 是完整成品图(图框、指北针、标题栏、材料表 BOM、下料表、焊口表、尺寸标注、标高、续接标记);我们目前只画单线骨架 + 管径标注,这是下一步的主要差距。
生成日期:2026-10-04