Files
envi-code/SourceCode/Code2026/CoreCommand/PCF-ISO分图规则说明.md
T
gjm cb38f5071b 新增 PCF→ISO 图(DWG)模块 PcfIso:P3D 一致的分图分层与图面样式
- 新增 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》。
2026-10-08 08:29:49 +08:00

6.3 KiB
Raw Blame History

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. 规则提炼(我们实现所依据的规则)

  1. 规则 A(连通):两个元件只要有重合的连接点(端点 END-POINT / 中心点 CENTRE-POINT / 支承点 CO-ORDS),就属于同一模型。
  2. 规则 B(无效支管断开):三通等支管元件若缺少 CENTRE-POINT,P3D 判为“无效元件”,其支管(BRANCH-POINT)不参与连通 → 主管在支管处断开。

    本案例正是这条规则把 3 根立管从主管上“摘”了下来。

  3. 规则 C(模型 = 一张图):每个连通子网输出一张 ISO。
  4. 规则 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