62 lines
2.8 KiB
C++
62 lines
2.8 KiB
C++
#pragma once
|
||||
|
|
|
|||
|
|
/*
|
|||
|
|
PCF -> ISO 图(DWG) 导出
|
|||
|
|
================================================================
|
|||
|
|
把 EW_PCF / EW_PCFSPLIT 导出的 PCF 中间文件解析后,按等轴测(30°)投影,
|
|||
|
|
生成带图框/标题栏/材料表/切割表/尺寸/标高/焊口气泡/北针的 ISO 图并保存为 DWG。
|
|||
|
|
|
|||
|
|
本文件与主代码(pcf.cpp)分离,算法自包含,便于后续单独修改/替换。
|
|||
|
|
|
|||
|
|
坐标约定:PCF 用 3D 模型坐标(单位 mm),Z 向上。
|
|||
|
|
等轴测投影(与 Plant 3D / Isogen 一致):
|
|||
|
|
u = (x - y) * cos30 (+X 指向右上 30°)
|
|||
|
|
v = (x + y) * sin30 + z (+Y 指向左上 30°,+Z 向上)
|
|||
|
|
|
|||
|
|
分图层级(与 P3D 的 IsoConfig.xml <Split> 对应):
|
|||
|
|
1) 模型级 Model —— 连通性断开(含"缺少中心点的三通"支管断开)
|
|||
|
|
2) 断点级 Break —— 法兰/现场焊口/焊口处切开
|
|||
|
|
3) 管段级 Spool —— 尺寸超过 SizeLimits 时切开
|
|||
|
|
4) 图幅级 Sheet —— 一张图放不下/过密时续接
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
namespace PcfIso
|
|||
|
|
{
|
|||
|
|
// 分图选项。默认与 P3D 默认工程一致:只做"模型级"连通性分图。
|
|||
|
|
struct SplitOptions
|
|||
|
|
{
|
|||
|
|
bool modelSplit; // 1) 连通性分图(默认 true)
|
|||
|
|
bool breakPointSplit; // 2) 断点分图(法兰/现场焊口) 默认 false
|
|||
|
|
bool spoolSplit; // 3) 管段尺寸分图 默认 false
|
|||
|
|
bool sheetSplit; // 4) 图幅/拥塞分图 默认 true
|
|||
|
|
double spoolMaxX; // 管段尺寸上限 X(mm)
|
|||
|
|
double spoolMaxY; // 管段尺寸上限 Y(mm)
|
|||
|
|
double spoolMaxZ; // 管段尺寸上限 Z(mm)
|
|||
|
|
int maxDirChanges; // 最大转向次数
|
|||
|
|
int maxCompPerSheet; // 单张图最大元件数(拥塞控制)
|
|||
|
|
SplitOptions();
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 把一个 PCF 文件渲染为单张 ISO 图(带图面样式)并存成 DWG。
|
|||
|
|
// pcfPath : 输入 PCF 文件路径
|
|||
|
|
// dwgPath : 输出 DWG 文件路径(含 .dwg 扩展名)
|
|||
|
|
// 返回是否成功。
|
|||
|
|
bool makeIsoDwg(LPCTSTR pcfPath, LPCTSTR dwgPath);
|
|||
|
|
|
|||
|
|
// 输入可以是单个 .pcf 文件,也可以是一个目录(处理目录下所有 *.pcf)。
|
|||
|
|
// outDir 为空时,输出到各 PCF 所在目录。
|
|||
|
|
// 返回成功生成的 DWG 个数。
|
|||
|
|
int makeIsoDwgFromPath(LPCTSTR inPath, LPCTSTR outDir);
|
|||
|
|
|
|||
|
|
// 分图(按 P3D 规则把一个 PCF 拆成多张 ISO 图),使用默认选项。
|
|||
|
|
// 每个连通子网输出一个 DWG,命名为 <文件名>-N.dwg;只有一个子网时输出 <文件名>.dwg。
|
|||
|
|
// outDir 为空时输出到 PCF 所在目录。返回成功生成的 DWG 个数。
|
|||
|
|
int makeIsoDwgSplit(LPCTSTR pcfPath, LPCTSTR outDir);
|
|||
|
|
|
|||
|
|
// 分图(可指定分层选项)。
|
|||
|
|
int makeIsoDwgSplitEx(LPCTSTR pcfPath, LPCTSTR outDir, const SplitOptions &opt);
|
|||
|
|
|
|||
|
|
// 输入单个 .pcf 或目录,逐个按上面的规则分图。
|
|||
|
|
// 返回成功生成的 DWG 个数。
|
|||
|
|
int makeIsoDwgSplitFromPath(LPCTSTR inPath, LPCTSTR outDir);
|
|||
|
|
}
|