Blank IModelConnection

A Blank IModelConnection is an IModelConnection that is not connected to an IModelDb backend.

Background

Much of the iModel.js frontend package is designed to communicate with a backend serving an iModel through an IModelConnection via various RPC interfaces (e.g. IModelReadRpcInterface). However, there are some cases where it is useful create Viewports without an iModel. The IModelConnection.createBlank method can be used to create a valid IModelConnection that is not connected to a backend.

Uses

Many services in the iModel.js frontend package display information from sources other than an iModel. If you wish to open a viewport to show just that type of information, use a blank IModelConnection. For example:

  • reality meshes (e.g. ContextCapture models)
  • point clouds
  • background maps
  • terrain data
  • markers
  • decorations

Restrictions

A blank IModelConnection can be used for creating Viewports that show graphics from sources other than an iModel, but remember that they do not have a backend. Therefore, it is not legal to attempt RPC requests against a blank IModelConnection. Most such operations will simply return nothing, but some will throw an exception. For example, all of the various forms of ECSQL queries will throw errors if attempted with a blank IModelConnection.

You can test whether an IModelConnection is blank, by using either IModelConnection.isOpen or IModelConnection.isBlank. isOpen will be false for a blank connection, and isBlank will be true [N.B. The distinction is that isOpen will also return false for an IModelConnection that was originally opened against a backend but subsequently closed.]

Example

To open a new blank connection, you can do something like this:


    // create a new blank connection centered on Exton PA
    public openBlankConnection() {
      const exton = IModelConnection.createBlank({
        // call this connection "Exton PA"
        name: "Exton PA",
        // put the center of the connection near Exton, Pennsylvania (Bentley's HQ)
        location: Cartographic.fromDegrees(-75.686694, 40.065757, 0),
        // create the area-of-interest to be 2000 x 2000 x 200 meters, centered around 0,0.0
        extents: new Range3d(-1000, -1000, -100, 1000, 1000, 100),
      });
      return exton;
    }

then, to create a blank spatial view to show data from sources other than iModels, do something like this:


    // create a new spatial view initialized to show the project extents from top view. Model and
    // category selectors are empty, so this is useful for showing backgroundMaps, reality models, terrain, etc.
    public createBlankView(iModel: IModelConnection): SpatialViewState {
      const ext = iModel.projectExtents;

      // start with a new "blank" spatial view to show the extents of the project, from top view
      const blankView = SpatialViewState.createBlank(iModel, ext.low, ext.high.minus(ext.low));

      // turn on the background map
      const style = blankView.displayStyle as DisplayStyle3dState;
      const viewFlags = style.viewFlags;
      viewFlags.backgroundMap = true;
      style.viewFlags = viewFlags; // call to accessor to get the json properties to reflect the changes to ViewFlags

      style.backgroundColor = ColorDef.white;

      // turn on the ground and skybox in the environment
      const env = style.environment;
      env.ground.display = true;
      env.sky.display = true;
      style.environment = env; // call to accessor to get the json properties to reflect the changes

      return blankView;
    }

Last Updated: 08 January, 2020