Search code examples
autodesk-forgeautodesk-viewer

Transform point from DWG model coordinates to autodesk forge viewer coordinates


I am trying to display a point on model displayed in the Autodesk forge viewer. However I am unable to figure out how to transform the point.

The answer Aligning Coordinate Systems in Autodesk Forge Viewer doesn't work for me because viewer.model.getData() doesn't have a globalOffset property.

I have uploaded some example code along with the original dwg file here https://github.com/umarmohammed/forgeviewerdemo


Solution

  • Sorry, I haven't received any responses from our engineering team. There seems not to have another way to obtain viewportId of current 2d view, and might have floating precision issue here, this is the issue I mentioned above. I will keep asking for them. So, here is the way I found to do point transformation from DWG coordinate system to the Viewers'.

    1. Obtain current viewport id via VertexBufferReader, but you have to specify a 2d item(dbId) in the loaded view to read viewportId from it.

      var viewportId = null;
      function GeometryCallback(viewer) {
          this.viewer = viewer;
      }
      
      GeometryCallback.prototype.onLineSegment = function(x1, y1, x2, y2, vpId) {
          viewportId = vpId;
      }
      
      var fragId = 0;
      var m = viewer.impl.getRenderProxy(viewer.model, fragId);
      var vbr = new Autodesk.Viewing.Private.VertexBufferReader(m.geometry, viewer.impl.use2dInstancing);
      vbr.enumGeomsForObject(dbId, new GeometryCallback());
      
    2. Project DWG point back to Viewer coordinate system.

      var vpXform = viewer.model.getPageToModelTransform(viewportId).clone();
      var invVpXform = new WGS.LmvMatrix4(true);
      
      invVpXform.getInverse(vpXform, true);
      
      var ptInCadX = ...;
      var ptInCadY = ...;
      var verticesInViewer = new THREE.Vector3().set(ptInCadX, ptInCadY, 0).applyMatrix4(invVpXform);
      

    Hope it helps.