# 构件管理

在本教程中,你可以通过BIMFACE提供的ElementManager相关类对指定图层下的构件、要素进行管理。

提示:本教程需要先获取场景中的图层对象,可参考图层管理 (opens new window)

# 教程

在上一节【图层管理】中,你已经实现了场景内的图层管理。但从应用层面出发,你对模型进行操作的颗粒度可能还会细化到构件级别。因此,在图层的概念下,我们针对不同类型的模型提供了更细粒度的管理器。

  • ComponentManager (opens new window):构件管理器。对BIMLayer,你可以通过其对应的构件管理器对构件进行管理。

  • PointFeatureManager (opens new window):点要素管理器。若FeatureLayer对应的矢量数据是由点要素组成的,那么你可以通过其对应的点要素管理器对点要素进行管理,其中要素是组成矢量模型的最小单元。

  • LineFeatureManager (opens new window):线要素管理器。若FeatureLayer对应的矢量数据是由线要素组成的,那么你可以通过其对应的线要素管理器对线要素进行管理。

  • PolygonFeatureManager (opens new window):面要素管理器。若FeatureLayer对应的矢量数据是由面要素组成的,那么你可以通过其对应的面要素管理器对面要素进行管理。

接下来,我们将依次对构件、要素管理器进行介绍。

# BIMLayer的构件管理器

构件作为BIM模型的基本组成单元,具有广泛的操作应用空间。为了便于对构件进行管理,我们引入了构件管理器。构件管理器不需要单独进行构造,在创建BIMLayer时会自动生成。你可以先通过BIMLayer下的接口获取到ComponentManager,再通过ComponentManager下的接口对构件进行不同操作。

// 获取BIMLayer的ComponentManager,以便于对构件进行管理
let componentManager = bimLayer.getComponentManager();

// 对所有构件进行着色
componentManager.overrideColor({all:true},new Glodon.Web.Graphics.Color(255,0,0,1));
// 对ID为12、14的构件清除着色效果
componentManager.restoreColor({ids:['12','14']});

更多关于构件管理的方法,可参考相关接口文档 (opens new window)部分。

# FeatureLayer的要素管理器

在矢量数据中,我们通常用要素来表示构成数据的基本单元。矢量数据可以划分为点要素、线要素以及面要素三种类型,单个shp数据仅可以包含一种类型的要素。为了对不同类型的要素进行管理,我们引入了三种要素管理器。要素管理器不需要单独进行构造,在创建FeatureLayer时会自动生成。你可以先通过FeatureLayer下的接口获取到对应的FeatureManager,再通过FeatureManager下的接口对要素进行不同操作。

// 获取FeatureLayer对应的要素管理器。若shp文件为面要素文件,则需要获取PolygonFeatureManager
let polygonFeatureManager = featureLayer.getPolygonComponentManager();

// 对ID为18、22、25的要素进行闪烁
polygonFeatureManager.blink({ids:['18','22','25']},new Glodon.Web.Graphics.Color(255,255,0,1));
// 清除ID为18的要素闪烁效果
polygonFeatureManager.clearBlinkComponents({ids:['18']});

更多关于要素管理的方法,可参考相关接口文档 (opens new window)部分。

# 运行结果

输入以上代码,浏览器就可以加载我们对构件及要素进行操作管理后的场景了。

# 完整代码

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>My first scene in BIMFACE</title>
</head>

<body>
  <div id="domId" style="width:800px; height:600px"></div>
  <script src="https://static.bimface.com/api/BimfaceSDKLoader/BimfaceSDKLoader@latest-release.js" charset="utf-8"></script>
  <script>
    // 声明viewer、app及layerManager变量
    let viewer, app, layerManager;
    // 声明viewToken变量,填入想要显示的模型/图纸/场景token
    let viewToken = '<yourViewToken>';
      
    // 构造BimfaceSDKLoaderConfig对象
    let loaderConfig = new BimfaceSDKLoaderConfig();
    // 设置BimfaceSDKLoaderConfig的viewToken
    loaderConfig.viewToken = viewToken;

    // 调用BimfaceSDKLoader的load方法加载模型
    BimfaceSDKLoader.load(loaderConfig, successCallback, failureCallback);

    // 加载成功回调函数
    function successCallback(viewMetaData) {
      // 获取DOM元素
      let domShow = document.getElementById('domId');
      // 创建WebApplicationGISConfig
      let webAppConfig = new Glodon.Bimface.Application.WebApplicationGISConfig();
      // 设置创建WebApplicationGIS的dom对象
      webAppConfig.domElement = domShow;
      // 创建WebApplicationGIS
      app = new Glodon.Bimface.Application.WebApplicationGIS(webAppConfig);

      // 加载待显示的场景
      app.addScene(viewToken);

      // 获取ViewerGIS对象
      viewer = app.getViewer();

      // 对场景加载情况进行监听
      viewer.addEventListener(Glodon.Bimface.Viewer.ViewerGISEvent.SceneAdded, function () {
        // 获取图层管理器
        layerManager = viewer.getLayerManager();

        // 根据图层ID获取对应图层对象
        let layer = layerManager.getLayer('yourLayerId');
        // 获取场景的根节点图层对象
        let rootLayer = layerManager.getRootLayer();

        // 添加图层组
        addGroupLayer();
        // 添加BIM资源
        addBIMLayer();
        // 添加shp矢量资源
        addFeatureLayer();

        // 根据图层ID删除图层对象
        layerManager.removeLayer('yourLayerId');

        // 根据图层ID移动featureLayer对象至根目录图层
        layerManager.moveLayer('featureLayerId',rootLayer.getId());
        
        // 对BIMLayer的构件进行管理
        managerComponents();
        // 对FeatureLayer的要素进行管理
        managerFeatures();
      });
    }

    // 加载失败回调函数
    function failureCallback(error) {
      console.log(error);
    }

    // ********************** 添加图层组 **********************
    function addGroupLayer(){
      // 定义构造GroupLayer所需的配置参数
      let option;
      // 设置图层的Id、名称
      option.id = 'groupLayerId';
      option.name = 'groupLayer';

      // 构造GroupLayer
      let groupLayer = new Glodon.Bimface.Layer.GroupLayer(option);

      // 调用LayerManager的接口将GroupLayer添加至场景的根节点图层
      layerManager.addLayer(bimLayer,rootLayer.getId());
    }

    // ********************** 添加BIM资源 **********************
    function addBIMLayer(){
      // 定义构造BIMLayer所需的配置参数
      let option;
      // 设置图层的Id、名称
      option.id = 'bimLayerId';
      option.name = 'bimLayer';
      // 指定待加载BIM模型的View Token
      option.viewToken = '<yourViewToken>'

      // 构造BIMLayer
      let bimLayer = new Glodon.Bimface.Layer.BIMLayer(option);

      // 调用LayerManager的接口将BIMLayer添加至GroupLayer下
      layerManager.addLayer(bimLayer,'groupLayerId');
    }

    // ******************** 添加shp矢量资源 ********************
    function addBIMLayer(){
      // 定义构造FeatureLayer所需的配置参数
      let option;
      // 设置图层的Id、名称
      option.id = 'featureLayerId';
      option.name = 'featureLayer';
      // 指定待加载shp资源的View Token
      option.viewToken = '<yourViewToken>'

      // 构造FeatureLayer
      let featureLayer = new Glodon.Bimface.Layer.FeatureLayer(option);

      // 调用LayerManager的接口将FeatureLayer添加至场景的根节点图层
      layerManager.addLayer(bimLayer,'groupLayerId');
    }

    // ********************* 对构件进行管理 *********************
    function managerComponents(){
      // 获取BIMLayer的ComponentManager,以便于对构件进行管理
      let componentManager = layerManager.getLayer('bimLayerId').getComponentManager();

      // 对所有构件进行着色
      componentManager.overrideColor({all:true},new Glodon.Web.Graphics.Color(255,0,0,1));
      // 对ID为12、14的构件清除着色效果
      componentManager.restoreColor({ids:['12','14']});
    }

    // ********************* 对要素进行管理 *********************
    function managerFeatures(){
      // 获取FeatureLayer对应的要素管理器。若shp文件为面要素文件,则需要获取PolygonFeatureManager
      let polygonFeatureManager = layerManager.getLayer('featureLayerId').getPolygonComponentManager();

      // 对ID为18、22、25的要素进行闪烁
      polygonFeatureManager.blink({ids:['18','22','25']},new Glodon.Web.Graphics.Color(255,255,0,1));
      // 清除ID为18的要素闪烁效果
      polygonFeatureManager.clearBlinkComponents({ids:['18']});
    }
  </script>
</body>

</html>

恭喜你,已经成功掌握了构件、要素管理相关的内容。接下来你将学习到效果管理 (opens new window)相关的知识。