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

120 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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*