<h1 align="center">BIMWIN Core</h1>

BIMWIN 核心库, 使用 typescript 开发, 非 LOD 版本

[查看更新日志](./CHANGELOG.md)

[toc]

# 安装

```
npm i bimwin-api
```

# 开始

初始化

```js
import { Platform } from "bimwin-api";

let fileId = "48c6514d7a8245839b6dd0dc8cb89d23";
let host = "http://172.18.1.72:9983/";

let options = {
  // 全局配置项
  el: "app", // 挂载点
  url: host, // 主机地址
  secret: {
    token: "0e8d286ecfa84f01a97c7733b8aeb4a2dt3xrlvrghl",
    loginMark: "6Iqx6Ze05LiA5aO26YWS77yM54us6YWM5peg55u45Lqy",
  },
};

let platform = new Platform(options);

platform.Service.GetFileBimType(fileId, (type) => {
  options.type = type;
  platform.Init();

  platform.Model.LoadModel(
    fileId,
    () => console.log("loaded"),
    () => console.log("loading"),
    () => console.log("loading ", performance.memory.usedJSHeapSize)
  );
});
```

得到核心引用`platform`以下示例代码中的顶级引用均指代于此.

对于`bimwin`而言会导出以下对象, 其中`platform`为核心对象. `THREE`为`threejs`核心对象

```js
export { Platform, Element, Model, Label, Service, Util, THREE };
```

如果是通过浏览器`script标签`引入的话, 库的唯一标识为`bw`, 通过`window.bw`或者`bw`可以调用

# 状态设置

以下 API 均是设置一种状态全局存在的

## 线框显示/隐藏

```js
platform.bimwin.setLineIsHide(((value: boolean) = true));
```

## 鼠标悬停显示轮廓

```js
platform.bimwin.outlineNode.SetEnable(((value: boolean) = false));
```

## 场景亮度调节

```js
// value 范围 [0, 1.0] 0为全黑，0.5为正常，1.0为全亮
platform.bimwin.SetIntensity(value: number)
```

## 鼠标 WASDQE 速度微调

即使没有进入漫游模式也可以使用 WASDQE 微调角度

```js
// value 推荐范围在[1, 16] 可以设置任意值可以突破16
platform.bimwin.setSpeed(value: number)
```

## 平行光投影

投放平行光使模型产生阴影, 可以提高真实度, 但会降低性能

```js
platform.bimwin.StartUsingShadow(value: boolean)
```

## 设置背景

首先存在三种背景色的设置, 分别是

- 1.天空盒背景, 需要六张图片作为背景
- 2.webgl 的场景色
- 3.html canvas 的背景色

### 使用天空盒作为背景

```js
// urls 使用前后上下左右的顺序依次写入图片地址
platform.bimwin.setDefaultSkyBox(urls: string[])
```

### 更改 webglrenderer 的场景色

```js
// color支持html hex字符串和纯数字
platform.bimwin.setSceneBackgroundColor(color: number|string)
```

### 更改 canvas 背景色

```js
platform.bimwin.canvas.style.backgroundColor = "red";
```

### 点选模式设置

可以设置[禁用,单选,多选], 但是可能会被其他业务覆盖, 比如测量时会将点选模式强制设置为单选.

```js
platform.bimwin.setSelectMode(str: 'nochoice'|'singlechoice'|'multiplechoice')
```

# 构件

## 获取构件数据

通过监听属性加载完毕事件(`OnPropertyLoaded`), 返回的`props`参数存在以下值

```
{
  FileId: '',
  OriginIds: {},
  Props: {}, // 属性
  Tree: {} // 目录树结构
}
```

```js
platform.BwEvent.OnPropertyLoaded.add((props) => {
  // 通过props.Tree获取目录树结构
});
```

## 聚焦构件

```js
/**
 * 聚焦构件
 * @param ids 构件集合
 * @param isHighlight 是否高亮
 * @param ratio 放大率[0.0 - 1.0]，0.5标准
 */
platform.Element.FitElements(ids: string[], isHighlight: boolean, ratio: number = 0.5)
```

## 隐藏/显示构件

主要的方法如下：

```js
// state 状态值 [隐藏:-1] [高亮:0] [材质:1] [半透明:2] [着色:3]
platform.bimwin.setNodesState(ids: string[], state: number)
```

隐藏/显示所有构件有如下方法:

```js
platform.bimwin.setAllNodesState(state: number)
```

所以实现显示单个构件隐藏其他构件可以这么做：

```js
platform.bimwin.setAllNodesState(-1);
platform.bimwin.setNodesState(["这是构件id"], 1);
```

## 构件上色

通用上色方法

```js
platform.bimwin.SetNodesColorAndOpacity(ids: string[], color: string | number, opacity = 1.0, closeDepthTest = false)
```

`closeDepthTest`如果`true`即使构件被遮挡也能看到构件。

闪烁构件方法
```js
platform.bimwin.SetNodesBlink(ids: string[] | string, color: number | string, speed = 0.005, enable = true)
```

通过调节`speed`来更改闪烁的幅度

## 重置构件

任何时候都可以通过`setNodesState(['构件id'], 1)`来回到初始普通构件的模样

# 测量

测量存在以下类型, 后面的 API 接口中的`measurementType`均是指代于此

```js
export enum measurementType {
    'DISTANCE' = 'distance', // 距离
    'ANGLE' = 'Angle', // 角度
    'ELEVATION' = 'elevation', // 标高
    'VOLUME' = 'volume', // 体积
    'TheMeasureOfArea' = 'TheMeasureOfArea' // 面积
}
```

测量之前需要设置此次测量的类型, 如下

```js
platform.bimwin.plugins.measureTool.changeType(type: measurementType)
```

## 开启测量

```js
platform.bimwin.startMeasure((cb, additional) => {
  // cb返回测量后的结果 additional 为测量的附加结果
  console.log(cb, additional);
});
```

## 终止测量

一般来说测量开启时鼠标会进入捕获状态, 使用此方法可以在任何情况下终止测量动作

```js
platform.bimwin.stopMeasure();
```

# 剖切

## 包围盒剖切

开启只需要如下

```js
platform.bimwin.showSectionBox(cb: Function)
```

可以提供一个回调函数给`cb`, `cb`会返回以下参数

```js
export interface SectionData {
  position: THREE.Vector3;
  size: THREE.Vector3;
  rotation: number;
}
```

主动调整`xyz`方向的数值

```js
// value [number, number]
platform.bimwin.plugins.sectionBox.bilateralAdjustSectionX(value[0], value[1]);
platform.bimwin.plugins.sectionBox.bilateralAdjustSectionX(value[0], value[1]);
platform.bimwin.plugins.sectionBox.bilateralAdjustSectionX(value[0], value[1]);
```

显示/隐藏剖切盒

```js
platform.bimwin.plugins.sectionBox.showOrHiddenSectionBox(visible: boolean)
```

摧毁剖切盒

```js
// keepSectionPlanes 是否保留剖切结果
platform.bimwin.plugins.sectionBox.close(
  ((keepSectionPlanes: boolean) = false)
);
```

## 轴向剖切

开启很简单

```js
platform.bimwin.plugins.sectionBox.showAxialSectionBox();
```

显示/隐藏剖切盒

```js
platform.bimwin.plugins.sectionBox.showOrHiddenAxialBox(visible: boolean)
```

摧毁剖切盒

```js
platform.bimwin.plugins.sectionBox.closeAxialBox();
```

更改轴向

```js
platform.bimwin.plugins.sectionBox.changeAxialDir(dir: 'x'|'y'|'z')
```

更改模式

```js
platform.bimwin.plugins.sectionBox.setControlModel(str: 'rotate'|'translate')
```
