# 门 Item 示例
::: details 目录
[[toc]]
:::

## 源代码

<GitCode fileUrl="/persagy-web-big/src/items/floor/SDoorItem.ts" />

## 代码说明
    
### 数据说明
``` json5
Doors:[
    {
        FaceDirection: {X:0,Y:0,Z:0},       // 面朝方向
        HandDirection: {X:0,Y:0,Z:0},       // 把手方向
        Location: {X:0,Y:0,Z:0},            // 位置
        ModelId: '',                        // 模型id
        Name: '',                           // 名称
        OutLine: [
            [{X:0,Y:0,Z:0},...],            // 外轮廓 
            ...                             // 内轮廓
        ],                                  // 轮廓线
        Owner: '',                          // 拥有者的RevitId
        SourceId: '',                       // 对应Revit模型id
        Thick: 200,                         // 厚度
        WallId: '',                         // 所属墙
        Width: 200,                         // 宽度
    },
    ...
]
```
::: tip
1、根据把手方向确定门的转轴 <br/>
2、根据面朝方向确定门朝哪边开 <br/>
3、<font color=red> outline </font> 仅有一项,且只有2个点 <br/>
5、轮廓数据单位均为毫米
:::

### 计算边界矩阵
不能在绘制的时候计算,因为绘制是高频调用方法,尽量不要在绘制方法中做大量计算工作;<br/>
计算方法一般在数据变化的时候做,如果只是展示的话,则<font color=orange>只需要在构造函数中计算一次</font>;

### 计算门开的方向及旋转方向
使用向量点乘 => ```x1 * x2 + y1 * y2```,计算得到,大于0同向,则旋转点使用第二个点;否则使用第一个 <br />
计算两点间距离,从而得到门的长度 <br />
利用``` arctan ```计算得到,门展开方向与水平方向夹角<br />
使用向量叉乘 => ```x1 * y2 - x2 * y1```, 计算得到, 小于0代表门顺时针展开,同时确定了展开的弧线绘制起始和结束角度 <br /> 

### Y轴取反
<font color=orange>revit 使用的坐标系与 canvas 使用的坐标系 Y 轴是相反的</font>; revit 坐标使用的是数学坐标系, Y 轴方向是向上的, canvas 坐标使用的绘图坐标系, Y 轴方向是向下的;<br/>
数据是通过 revit 模型导出

## 绘制示例

<big-items-door />

::: details 查看代码

<<< @/docs/.vuepress/components/big/items/door.vue

:::