具有剖切微件 BuildingSceneLayer

尝试一下在线预览

在此示例中,我们从 BIM 项目加载具有详细内部信息的建筑物。该建筑物是使用 GeoScene Pro 从 Revit 项目中作为 BuildingSceneLayer 发布的。 

创建 BuildingSceneLayer 并将其添加到 WebScene 的工作方式与其他图层相同:

     
1
2
3
4
5
const buildingLayer = new BuildingSceneLayer({
  url: "https://tiles.arcgis.com/tiles/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Esri_Admin_Building/SceneServer",
  title: "Administration Building, Redlands - Building Scene Layer"
});
webscene.layers.add(buildingLayer);

BuildingSceneLayer 包含建筑物和内部的复杂数字模型。 由于高度复杂, BuildingSceneLayer 中的数据以子层的形式组织。通常,BuildingSceneLayer 包含一个仅显示建筑物外壳(外墙、屋顶等)的概览层。这有助于将模型视为单个要素。BuildingSceneLayer 还包含一个完整的模型 BuildingGroupSublayer,其中包含按学科分组的建筑物中的所有要素:建筑、结构、电气和机械。每个学科都包含具有屋顶、墙壁、门、空调单元、照明设备、柱子、基础等要素的 BuildingComponentSublayers

通常在将 BuildingSceneLayer  添加到  WebScene 或 Map 时,只有概览图层可见。在我们的示例中,我们希望从头开始查看完整模型。所以我们隐藏概览层并显示完整的模型层:

          
1
2
3
4
5
6
7
8
9
10
buildingLayer.sublayers.forEach((layer) => {
  switch (layer.modelName) {
    case "FullModel":
      layer.visible = true;
      break;
    case "概览":
      layer.visible = false;
      break;
  }
});

“FullModel” 和 “Overview” 是 BuildingSceneLayer 的直接子层。如果您想在 BuildingSceneLayer 的子组中搜索,您可以使用 BuildingSceneLayer.allSublayers,它是子图层的平面数组。要识别子层,最好使用 BuildingSceneLayer.modelName,因为这是基于 I3S 规范 的标准名称,无法更改。

BuildingComponentSublayers 类似于 SceneLayer。您可以应用渲染器或启用弹出窗口

在这个示例中,我们应用了一个渲染器,将所有室内门都涂成红色:

                      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 可以在 BuildingComponentSublayer 上设置渲染器
doorsLayer.renderer = {
  type: "unique-value", // 自动转换为 new UniqueValueRenderer()
  field: "AssemblyDesc",
  uniqueValueInfos: [
    {
      // 所有内门都显示为红色
      value: "Interior Doors",
      symbol: {
        type: "mesh-3d", // 自动转换为 new MeshSymbol3D()
        symbolLayers: [
          {
            type: "fill", // 自动转换为 new FillSymbol3DLayer()
            material: {
              color: "red"
            }
          }
        ]
      }
    }
  ]
};

由于建筑物中有如此多的详细信息,建筑物的某些部分不可避免地会遮挡其他部分。Slice 微件可用于以简单的方式发现建筑物的内部部分。

slice

可以像这样将微件添加到 SceneView: 

    
1
2
3
4
const sliceWidget = new Slice({
  view: view,
  container: document.createElement("div")
});

通过以编程方式将它们添加到 SliceViewModel.excludedLayers 属性中,可以从切片中排除我们想要详细检查的层。 

 
1
sliceWidget.viewModel.excludedLayers.addMany(excludedLayers);

用户还可以使用微件 UI 选择排除的图层:单击“从切片中排除图层”,然后单击应直接在场景中排除的图层。

在这个示例中,我们还在微件实例化时设置了一个  SlicePlane。使用 SliceViewModel.shape 可以检索或设置用于切片的平面。

另请参见过滤 BuildingSceneLayer

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.