一个白板有多个页面,所有的页面+一些其他信息可构成一个白板工程,可在软件内部保存为sbp格式的工程文件。sbp全称:SIT-board project。sbp文件本质上是以json格式存放的对象的序列化文件。
存储结构每个部分均可分为逻辑结构与物理存储结构,逻辑结构可能是某个对象,其对应的底层物理结构即为json序列化格式。
sbp文件的最顶层数据结构定义如下:
BoardPageSetViewModel {
// 普通成员只读模式
memberReadOnly: bool
// 页面数
pageIdList: array<int>
// 页面字典,存储了所有页面信息
pageMap: map<string, BoardPageViewModel>
// 当前页面id
currentPageId: int
}
BoardPageViewModel定义了某一页的数据
BoardPageViewModel {
// 页面标题
title: string
// 页面id
pageId: int
// 白板数据
board: BoardViewModel
}
BoardViewModel定义了白板上绘制的所有图形
BoardViewModel {
// 视口变换矩阵, 为4x4矩阵
viewerTransform: array<double>[16]
// 模型id列表
modelIdList: array<int>
// 模型字典
modelMap: map<int, Model>
}
Model定义了某一个白板上的图形元素
Model {
// 模型id
id: int
// 模型类型,由插件决定
type: string
// 模型数据,由插件决定
data: <SpecialModelData>
// 模型公共属性
common: CommonModelData
}
CommonModelData为图形元素的公共属性
CommonModelData {
// 旋转角
angle: double
// 位置,分别为x,y坐标
position: array<double>[2]
// 大小,分别为width与height
size: array<double>[2]
// 层叠关系,越大越靠前
index: int
// 约束关系,由minWidth,maxWidth,minHeight,minWidth四个分量构成
// 用于确定该模型能够拉伸的最大与最小尺寸
constraints: array<double>[4]
// 是否显示
enable: bool
// 是否可编辑
editableState: bool
}
SpecialModelData类型是一个泛指类型,不同type的Model具有不同的data类型,其存放了图形元素自身的内部特有的属性。 SIT-board已实现插件化扩展,其类型中的内容由插件内部自行决定。
RectModelData为矩形插件的数据类型定义
RectModelData {
// 背景颜色
color: Color
// 背景形状 0表示矩形,1表示圆形
backgroundShape: int
// 边框属性
boarder: BorderModelData {
// 边框颜色
color: Color
// 边框的宽度
width: double
// 边框的圆角半径
radius: double
}
// 矩形内部的文本属性
text: TextModelData {
// 文字内容
content: string
// 文字颜色
color: Color
// 文字大小
fontSize: double
// 对齐方式
// 水平对齐有三个方式分别为左对齐,居中对齐,右对齐
// 分别对应数字-1,0,-1
// 垂直对齐有三个方式分别为上对齐,居中对齐,右对齐
// 分别对应数字-1,0,-1
// 水平与垂直对齐对应的数字即为最终alignment的值
alignment: array<int>[2]
// 是否加粗
bold: bool
// 是否斜体
italic: bool
// 是否下划线
underline: bool
}
}
FreeStyleModelData为自由画板插件的数据类型定义
FreeStyleModelData {
// 路径id列表
pathIdList: array<int>
// 路径字典
pathMap: map<int, FreeStylePathModelData>
// 路径颜色
backgroundColor: Color
// 当前画笔状态属性
paint: Paint
}
Paint {
// 画笔颜色
color: Color
// 画笔宽度
stokeWidth: double
// 抗锯齿
isAntiAlias: bool
}
FreeStylePathModelData {
// 路径id
id: int
// 路径点,分别对应x,y坐标
points: array<array<double>[2]>
// 路径画笔
paint: Paint
}
同样还有其他插件的特有的数据结构,具体可参考代码 component/board/plugins 中的实现