1. 构件吸附对象
位于: scene.adsorbControl (默认已经初始化完成)
1.1. 类声明
用于完成模型构件或者外部构件的吸附控制器
1.1.1. 参数
名称 | 说明 | 类型 | 是否必须 | 示例 |
---|---|---|---|---|
scene | 主场景对象 | Scene | 是 | viewer3D.rootScene |
options | 一个有以下参数的对象 | Object | 否 | {} |
options.innerCollisionThreshold | 默认的碰撞阈值 | Number | 否 | 500 |
1.2. 属性
1.3. 方法
1.3.1. setSelectedObjectByComponentId
名称 | 说明 | 类型 | 是否必须 | 示例 |
---|---|---|---|---|
id | 将当前的构件设置为选中对象 | String | 是 | "M1324234" |
返回值说明 | 类型 | 示例 |
---|---|---|
无 | null | null |
//获取吸附控制器对象
let adsorbControl = viewer3D.adsorbControl;
adsorbControl.setSelectedObjectByComponentId("M1324234)
1.3.2. setSelectedObjectByCollection
名称 | 说明 | 类型 | 是否必须 | 示例 |
---|---|---|---|---|
options | 一个有以下参数的对象 | Object | 是 | {} |
options.updateBoundingBox | 是否更新该集合的包围盒 | Boolean | 否 | true |
options.collection | 外部构件 | Object3DCollection | 是 | null |
返回值说明 | 类型 | 示例 |
---|---|---|
无 | null | null |
//获取吸附控制器对象
let adsorbControl = viewer3D.adsorbControl;
let externalObjectConverter = new BOS3D.ExternalObjectConverter("http://bos3d-alpha.bimwinner.com", "bos3dalpha");
externalObjectConverter.getExternalObjectByModelKey("M1601286559828").then((object) => {
object.scale.set(10, 10, 10);
object.updateMatrixWorld(true);
scene.addObject(object);
viewer3D.translateComponentByKey(object, undefined, undefined, {
isAdsorb: true,
});
currentTransformKey = "M1601286559828";
});
1.3.3. removeTargetObjectByIds
名称 | 说明 | 类型 | 是否必须 | 示例 |
---|---|---|---|---|
ids | 内部构件或者外部构件的 id 数组 | Array |
是 | ["M1601286559828] |
let adsorbControl = viewer3D.adsorbControl;
adsorbControl.removeTargetObjectByIds(["M1601286559828])
1.3.4. setAdsorbNormal
名称 | 说明 | 类型 | 是否必须 | 示例 |
---|---|---|---|---|
targetId | 要吸附的目标构件的 id | String | 是 | "M1601286559828" |
options | 一个有以下参数的对象 | Object | 是 | {} |
options.x | 平面法线的 x 分量,当该分量为正时,吸附平面的法向量为[1, 0, 0],反之为[-1, 0, 0] | Number | 否 | null |
options.y | 平面法线的 y 分量,当该分量为正时,吸附平面的法向量为[0, 1, 0],反之为[0, -1, 0] | Number | 否 | null |
options.z | 平面法线的 z 分量,当该分量为正时,吸附平面的法向量为[0, 0, 1],反之为[0, 0, -1] | Number | 否 | null |
实例 通过传入 id 数组将多个构件添加为被吸附对象,id 可以为构件的 componentId,也可以为外部构件的 modelKey
//获取吸附控制器对象
let adsorbControl = viewer3D.adsorbControl;
//开启吸附功能
adsorbControl.enabled = true;
//通过传入id数组将多个构件添加为被吸附对象,id可以为构件的componentId,也可以为外部构件的modelKey
adsorbControl.addTargetObjectByIds([
{
//该构件的ComponentId
componentId: "M1601286135625_234936",
//判断包围盒碰撞吸附的阈值,默认为500
collisionThreshold: 500,
//是否创建面高亮对象,该对象会在吸附时,高亮显示吸附面
createHighLightMesh: true,
},
{
componentId: "M1601286135625_241831",
collisionThreshold: 500,
createHighLightMesh: true,
},
]);
//将当前对象设置为选中对象,操作方式为translate
adsorbControl.setSelectedObjectByComponentId(e.intersectInfo.selectedObjectId, BOS3D.TransformMode.translate);
//为该对象添加平移控件
viewer3D.translateComponentByKey(e.intersectInfo.selectedObjectId);
实例 将外部构件添加为当前选中对象
//获取吸附控制器对象
let adsorbControl = viewer3D.rootScene.adsorbControl;
//开启吸附功能
adsorbControl.enabled = true;
//给外部构件添加平移控件
viewer3D.translateComponentByKey(object);
//将外部构件设置为当前选中对象
adsorbControl.setSelectedObjectByCollection({
collection: object,
});
实例 直接将当前选中对象快捷吸附到指定构件的指定平面上**
//将当前选中对象吸附到componentId为"M1601286135625_234936"的构件的包围盒法向量为(1, 0, 0)的平面上
adsorbControl.setAdsorbNormal("M1601286135625_234936", {
x: 1,
});
//将当前选中对象吸附到componentId为"M1601286135625_234936"的构件的包围盒法向量为(-1, 0, 0)的平面上
adsorbControl.setAdsorbNormal("M1601286135625_234936", {
x: -1,
});
//将当前选中对象吸附到componentId为"M1601286135625_234936"的构件的包围盒法向量为(0, 1, 0)的平面上
adsorbControl.setAdsorbNormal("M1601286135625_234936", {
y: 1,
});
//将当前选中对象吸附到componentId为"M1601286135625_234936"的构件的包围盒法向量为(0, -1, 0)的平面上
adsorbControl.setAdsorbNormal("M1601286135625_234936", {
y: -1,
});
//将当前选中对象吸附到componentId为"M1601286135625_234936"的构件的包围盒法向量为(0, 0, 1)的平面上
adsorbControl.setAdsorbNormal("M1601286135625_234936", {
z: 1,
});
//将当前选中对象吸附到componentId为"M1601286135625_234936"的构件的包围盒法向量为(0, 0, -1)的平面上
adsorbControl.setAdsorbNormal("M1601286135625_234936", {
z: -1,
});
实例 结束当前吸附**
//结束吸附,并指定是否重置回之前的状态,这里为false,不重置
adsorbControl.endAdsorb(false);
html 案例代码
<!DOCTYPE html>
<html>
<link />
<head>
<meta http-equiv="Content-Type" content="text/html;" />
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<title>构件吸附</title>
</head>
<body style="margin: 0px">
<div id="viewport" style="width: 100%; height: 100%"></div>
<script type="module">
import * as BOS3D from "../../index.js";
import { GUI } from "./../js/dat.gui.module.js";
window.BOS3D = BOS3D;
window.THREE = BOS3D.THREE;
var token = "";
var option = {
// host: "http://bos3d-alpha.bimwinner.com",
host: "http://bos3d.bimwinner.com",
viewport: "viewport",
}; //生产环境
BOS3D.GlobalData.ContinueRender = true;
var viewer3D = new BOS3D.Viewer(option);
let scene = viewer3D.rootScene;
let adsorbControl = viewer3D.adsorbControl;
const axesHelper = new THREE.AxesHelper(5000);
scene.addObject(axesHelper);
viewer3D.addView("M1584527812438", "w4769212f67e423d83ce9cc1c09a82e9");
//初始化吸附控件(只需要初始化一次)
viewer3D.initAdsorbControl();
//开启吸附功能
viewer3D.enableAdsorbControl(true);
let currentTransformKey = undefined;
viewer3D.registerModelEventListener(BOS3D.EVENTS.ON_CLICK_PICK, (e) => {
//获取吸附功能的开启状态
if (!viewer3D.getAdsorbControlEnableState()) {
return;
}
if (!BOS3D.defined(e.intersectInfo)) {
viewer3D.cancelTransformComponent();
currentTransformKey = undefined;
return;
}
let selectedObjectId = e.intersectInfo.selectedObjectId;
if (adsorbControl.targetObjectsMap.has(selectedObjectId)) {
return;
}
//保留当前选中对象的id
currentTransformKey = selectedObjectId;
//将当前对象设置为选中对象,操作方式为translate
viewer3D.translateComponentByKey(selectedObjectId, undefined, undefined, {
isAdsorb: true,
});
});
viewer3D.autoResize();
viewer3D.registerModelEventListener(BOS3D.EVENTS.ON_LOAD_COMPLETE, function (event) {
adsorbControl.addTargetObjectByIds([
{
//构件的id
componentId: "M1584527812438_234936",
//判定为吸附的距离阈值
collisionThreshold: 500,
//是否创建高亮面
createHighLightMesh: true,
},
{
componentId: "M1584527812438_241831",
collisionThreshold: 500,
createHighLightMesh: true,
},
]);
});
const gui = new GUI();
let params = {
开启吸附: true,
设置为被吸附: cancelTransform,
快捷吸附: adsorb,
添加外部构件: addCarModel,
结束吸附: endAdsorb,
切换为平移: setTranslate,
切换为旋转: setRotate,
};
gui.add(params, "开启吸附").onChange((value) => {
viewer3D.enableAdsorbControl(value);
});
gui.add(params, "设置为被吸附");
gui.add(params, "快捷吸附");
gui.add(params, "添加外部构件");
gui.add(params, "结束吸附");
gui.add(params, "切换为平移");
gui.add(params, "切换为旋转");
function cancelTransform() {
if (!BOS3D.defined(currentTransformKey)) {
return;
}
if (adsorbControl.targetAABB) {
adsorbControl.targetAABB.resetTranslate();
}
adsorbControl.addTargetObjectByIds([
{
componentId: adsorbControl.selectedObjectId,
collisionThreshold: 500,
createHighLightMesh: true,
},
]);
viewer3D.cancelTransformComponent();
currentTransformKey = undefined;
}
function adsorb() {
//将当前选中对象吸附到id为M1584527812438_234936的构件包围盒上,面法线为z=1
adsorbControl.setAdsorbNormal("M1584527812438_234936", {
z: 1,
});
}
let externalObjectConverter = new BOS3D.ExternalObjectConverter(
"http://bos3d-alpha.bimwinner.com",
"bos3dalpha"
);
function addCarModel() {
externalObjectConverter.getExternalObjectByModelKey("M1601286559828").then((object) => {
object.scale.set(10, 10, 10);
object.updateMatrixWorld(true);
scene.addObject(object);
viewer3D.translateComponentByKey(object, undefined, undefined, {
isAdsorb: true,
});
currentTransformKey = "M1601286559828";
});
}
function endAdsorb() {
//结束吸附,并指定是否重置回之前的状态,这里为false,不重置
adsorbControl.endAdsorb(false);
}
function setTranslate() {
if (!BOS3D.defined(currentTransformKey)) {
return;
}
viewer3D.translateComponentByKey(currentTransformKey, undefined, undefined, {
isAdsorb: true,
});
}
function setRotate() {
if (!BOS3D.defined(currentTransformKey)) {
return;
}
viewer3D.rotateComponentByKey(currentTransformKey, undefined, undefined, {
isAdsorb: true,
});
}
</script>
</body>
</html>