ARUP.IssueTracker.Revit.RevitWindow.GetViewCoordinates C# (CSharp) Method

GetViewCoordinates() public method

returns XYZ and ZOOM/FOV value
public GetViewCoordinates ( Document doc, VisualizationInfo viewport ) : Tuple
doc Document
viewport VisualizationInfo
return Tuple
    public Tuple<ViewOrientation3D, double, string, string> GetViewCoordinates(Document doc, VisualizationInfo viewport)
    {
      string type = ""; //change if i force ortho mode
      double zoom = 0; //fov or worldscale

      XYZ CameraDirection = new XYZ();
      XYZ CameraUpVector = new XYZ();
      XYZ CameraViewPoint = new XYZ();
      //retrive the force perspective value


      // IS ORTHOGONAL
      if (viewport.OrthogonalCamera != null)
      {
        if (viewport.OrthogonalCamera.ViewToWorldScale == null || viewport.OrthogonalCamera.CameraViewPoint == null || viewport.OrthogonalCamera.CameraUpVector == null || viewport.OrthogonalCamera.CameraDirection == null)
          return null;
        type = "OrthogonalCamera";
        zoom = UnitUtils.ConvertToInternalUnits(viewport.OrthogonalCamera.ViewToWorldScale, DisplayUnitType.DUT_METERS);
        CameraDirection = GetXYZ(viewport.OrthogonalCamera.CameraDirection.X, viewport.OrthogonalCamera.CameraDirection.Y, viewport.OrthogonalCamera.CameraDirection.Z);
        CameraUpVector = GetXYZ(viewport.OrthogonalCamera.CameraUpVector.X, viewport.OrthogonalCamera.CameraUpVector.Y, viewport.OrthogonalCamera.CameraUpVector.Z);
        CameraViewPoint = GetXYZ(viewport.OrthogonalCamera.CameraViewPoint.X, viewport.OrthogonalCamera.CameraViewPoint.Y, viewport.OrthogonalCamera.CameraViewPoint.Z);


      }

      else if (viewport.PerspectiveCamera != null)
      {
        if (viewport.PerspectiveCamera.FieldOfView == null || viewport.PerspectiveCamera.CameraViewPoint == null || viewport.PerspectiveCamera.CameraUpVector == null || viewport.PerspectiveCamera.CameraDirection == null)
          return null;

        type = "PerspectiveCamera";
        zoom = viewport.PerspectiveCamera.FieldOfView;
        double z1 = 18 / Math.Tan(zoom / 2 * Math.PI / 180);//focale 1
        double z = 18 / Math.Tan(25 / 2 * Math.PI / 180);//focale, da controllare il 18, vedi PDF
        double factor = z1 - z;

        CameraDirection = GetXYZ(viewport.PerspectiveCamera.CameraDirection.X, viewport.PerspectiveCamera.CameraDirection.Y, viewport.PerspectiveCamera.CameraDirection.Z);
        CameraUpVector = GetXYZ(viewport.PerspectiveCamera.CameraUpVector.X, viewport.PerspectiveCamera.CameraUpVector.Y, viewport.PerspectiveCamera.CameraUpVector.Z);
        XYZ oldO = GetXYZ(viewport.PerspectiveCamera.CameraViewPoint.X, viewport.PerspectiveCamera.CameraViewPoint.Y, viewport.PerspectiveCamera.CameraViewPoint.Z);
        CameraViewPoint = (oldO.Subtract(CameraDirection.Divide(factor)));
      }
      else
        return null;
      // CHAGE VALUES ACCORDING TO BASEPOINT 
      //THIS WAS the one with DOC
      ViewOrientation3D orient3d = ConvertBasePoint(CameraViewPoint, CameraDirection, CameraUpVector, true);

      return new Tuple<ViewOrientation3D, double, string, string>(orient3d, zoom, type, "New View");
    }