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>
版权所有@盈嘉互联(北京)科技有限公司 京ICP备15051988号-9 Copyright © 2022 all right reserved,powered by Gitbook该文件修订时间: 2022-06-27 15:28:06

results matching ""

    No results matching ""