docs: 修正 3.2 类型表,kIntersect/kSliceSolid 是 region + 折线 #36
@@ -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 导入原始字节),必须自校验。
|
||||
|
||||
|
||||
Reference in new issue
Block a user