# 3D 外壳体系

## SHELL 外壳

```json
{ "type": "SHELL", "id":"UUID", "ticket": 1 }||
{
  "partitionId":null,
  "groupId":0,
  "locked":1,
  "zIndex":0.223,
  "shellType":"T&B",
  "shellHeight":50,
  "pcbHeight":100,
  "strokeWidth":10,
  "path":"复杂多边形",
  "attrs":{},
}|
```

1. type 外壳 `SHELL`
2. id 图元编号, 文档内唯一
3. ticket 逻辑时钟
4. partitionId 所属分区编号，为 null 表示无分区，封装忽略该字段
5. groupId 分组编号：0 不分组，非 0 为组标志，相同组标志的为一组
6. locked 是否锁定
7. zIndex Z 轴高度
8. shellType 外壳类型
    - `T&B` 上下壳
    - `DRAWER` 推盖
    - `CLAM` 翻盖
9. shellHeight 外壳高度
10. pcbHeight PCB 高度
11. strokeWidth \*线宽（弃用）
12. path 参考复杂多边形
13. attrs 自定义属性：3D 外壳每种类型都有一组自定义的外壳属性
    - T&B
        - Thickness：外壳厚度
        - BottomHeight：下壳高度
        - TopInnerHeight：上壳内壁高度
        - TopInnerThickness：上壳内壁厚度
    - DRAWER
        - Thickness：外壳厚度
        - Direction：推盖方向
            - `1` X 轴正向
            - `2` X 轴负向
            - `4` Y 轴正向
            - `8` Y 轴负向

## CREASE 侧面基准线（折痕）

`CREASE` 折痕图元需要配合 `CONNECT` 关联 `SHELL_ENTITY` `BOSS`，以表达外壳挖槽

```json
{ "type": "CREASE", "id":"UUID", "ticket": 1 }||
{
  "partitionId":null,
  "groupId":0,
  "locked":1,
  "zIndex":8.275,
  "layerId":49,
  "startX":20,
  "startY":30,
  "endX":40,
  "endY":50,
  "angle":90,
}|
```

1. type 折痕 `CREASE`
2. id 图元编号, 文档内唯一
3. ticket 逻辑时钟
4. partitionId 所属分区编号，为 null 表示无分区，封装忽略该字段
5. groupId 分组编号：0 不分组，非 0 为组标志，相同组标志的为一组
6. locked 是否锁定
7. zIndex Z 轴高度
8. layerId 层编号
9. startX 起始 X
10. startY 起始 Y
11. endX 结束 X
12. endY 结束 Y
13. angle 折叠角度

## SHELL_ENTITY 外壳实体区域

没有通过 `CONNECT` 与 `CREASE` 关联的 `SHELL_ENTITY`，则垂直进行顶层、底层外壳的填充/裁剪（挖槽）

```json
{ "type": "SHELL_ENTITY", "id":"UUID", "ticket": 1 }||
{
  "partitionId":null,
  "groupId":0,
  "locked":1,
  "zIndex":0.15,
  "layerId":50,
  "booleanOperation":0,
  "belong":0,
  "depth":10,
  "strokeWidth":10,
  "path":"复杂多边形",
}|
```

1. type 外壳实体区域 `SHELL_ENTITY`
2. id 图元编号, 文档内唯一
3. ticket 逻辑时钟
4. partitionId 所属分区编号，为 null 表示无分区，封装忽略该字段
5. groupId 分组编号：0 不分组，非 0 为组标志，相同组标志的为一组
6. locked 是否锁定
7. zIndex Z 轴高度
8. layerId 层编号
9. booleanOperation 布尔操作：0 裁剪 1 填充
10. belong 隶属：0 自动 1 上壳 2 下壳 4 外壳边框 8 螺丝柱 16 实体，可通过加法组合
    - 上下壳：3 = 1 + 2
    - 外壳边框 + 螺丝柱：12 = 4 + 8
    - 螺丝柱 + 实体：24 = 8 + 16
    - 外壳边框 + 螺丝柱 + 实体：28 = 4 + 8 + 16
11. depth 深度
12. strokeWidth 线宽
13. path 参考复杂多边形

## BOSS 螺丝柱

通过 `CONNECT` 与 `CREASE` 关联的 `BOSS`，添加的是侧方的螺丝柱

```json
{ "type": "BOSS", "id":"UUID", "ticket": 1 }||
{
  "partitionId":null,
  "groupId":0,
  "locked":1,
  "zIndex":0.8976,
  "layerId":50,
  "centerX":100,
  "centerY":200,
  "specification":"M2",
  "depth":100,
  "thickness":10,
  "holeDiameter":20,
  "counterBore":[100, 20],
  "stiffener":[20, 40, 20, 10],
}|
```

1. type 螺丝柱 `BOSS`
2. id 图元编号, 文档内唯一
3. ticket 逻辑时钟
4. partitionId 所属分区编号，为 null 表示无分区，封装忽略该字段
5. groupId 分组编号：0 不分组，非 0 为组标志，相同组标志的为一组
6. locked 是否锁定
7. zIndex Z 轴高度
8. layerId 层编号
9. centerX 中心 X
10. centerY 中心 Y
11. specification 螺丝型号：`"M2"` `"M3"` 等，或者 `null` 表示自定义
12. depth 螺丝柱高度
13. thickness 螺丝柱壁厚
14. holeDiameter 螺丝柱通孔直径
15. counterBore 沉头所需参数，当此参数为 `null` 时表示不需要沉头
    - 螺丝头高度
    - 螺丝头直径
16. stiffener 加强筋所需参数，当此参数为 `null` 时表示不需要加强筋
    - 加强筋上端宽度
    - 加强筋下端宽度
    - 加强筋距螺丝柱上端距离
    - 加强筋厚度
