From e693e99f4c5d8a4efc9b6abeefa112fa9355d3bd Mon Sep 17 00:00:00 2001 From: company-desktop-computer Date: Thu, 22 Oct 2026 11:02:16 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E4=BF=AE=E6=AD=A3=203.2=20=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E8=A1=A8=EF=BC=8CkIntersect/kSliceSolid=20=E6=98=AF?= =?UTF-8?q?=20region=20+=20=E6=8A=98=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原表把 kIntersect(28)、kSliceSolid(29) 归为"2 个 region(外 + 内)", 实际 m_sScr 是 "regionSAT|折线文本":写端用 CurveToString 产出折线 (:2130、:2184),读端用 StringToPolyline 还原(:4403、:4441)。 按原表装容器,解包时第二个 acisIn 必然失败。容器只装 region,折线 部分不进容器。 同时补三条核对结论:切分取第一个 | 且 sScr2 保留分隔符;kSweep 的路径 在 m_sszPoint2ds 不在 m_sScr;降级导出要按这张表拼回。 --- AcDbX3dSolid-refactor-plan.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/AcDbX3dSolid-refactor-plan.md b/AcDbX3dSolid-refactor-plan.md index 5abecac..69cef12 100644 --- a/AcDbX3dSolid-refactor-plan.md +++ b/AcDbX3dSolid-refactor-plan.md @@ -77,7 +77,7 @@ if (AcDbX3dSolid::kCurrentVersionNumber > 1) { ### 3.2 多 region 容器 -9 种 region 类型里,5 种单 region,3 种双 region,1 种(`kLoft`)N 个 region。统一成一个容器: +9 种类型里,6 种只有 region(5 种单 region、1 种双 region),2 种是 region + 折线,1 种(`kLoft`)N 个 region。容器只装 region,折线部分不进容器: ```cpp // 16 字节头 @@ -94,13 +94,21 @@ struct RegionBlobHeader { // char data[len]; // SAT 的 ASCII 字节,不含结尾 0 ``` -对应关系: +对应关系(按当前代码核对): -| 类型 | nRegions | -| --- | --- | -| `kExtrude2`(27) / `kSlicePipe`(26) / `kRevolve`(21) / `kRevolve2`(38) / `kSweep`(40) | 1 | -| `kConePipe`(30) / `kIntersect`(28) / `kSliceSolid`(29) | 2(外 + 内) | -| `kLoft`(41) | N | +| 类型 | `m_sScr` 实际内容 | nRegions | +| --- | --- | --- | +| `kExtrude2`(27) / `kSlicePipe`(26) / `kRevolve`(21) / `kRevolve2`(38) / `kSweep`(40) | 单个 region 的 SAT | 1 | +| `kConePipe`(30) | `外环SAT` + `\|` + `内环SAT` | 2 | +| `kIntersect`(28) / `kSliceSolid`(29) | `regionSAT` + `\|` + **折线文本** | 1 | +| `kLoft`(41) | N 个 region SAT,`@region@` 连接 | N | + +几点必须注意: + +- `kIntersect` / `kSliceSolid` 的第二个分量是 `CoreTools::CurveToString` 产出的折线文本,**不是 region**。写端 `:2130`/`:2184`,读端用 `StringToPolyline`(`:4403`、`:4441`)。原文档把它们当成「外 + 内」两个 region 是错的,按那样装容器,解包时第二个 `acisIn` 必然失败 +- 切分统一取第一个 `|`,且 `sScr2 = m_sScr.Mid(nPos)` 保留了分隔符本身,靠 `StringToRegion` / `StringToPolyline` 内部找 ACIS 头容错 +- `kSweep` 的路径存在 `m_sszPoint2ds`(`AcDbCurveToString`,`:5088`/`:5103`),不在 `m_sScr` +- 将来做降级导出时也要按这张表拼回,`kIntersect` / `kSliceSolid` 的折线文本要原样保留 `magic` 是**必需**的,不是可选项:`m_pSatBuffer` 是公共字节池,当前已有 4 种语义(`kFenceExtrude` 点数组、`kFrom3JS` SubDMesh、`kLoftReducer` 宽字符串、SAT 导入原始字节),必须自校验。 -- 2.54.0