Precast API and Cloud Open Callback

As usual, I am over-active in the Revit API discussion forum, so you can see most of what I have been up to right there.

Here and now, I'll highlight one of those threads and clarify how to access the Revit 2019 Precast API:

Structural Precast API

Question: I saw a slide on Precast for Revit:

Precast API slide

The slide indicates that Precast also exposes an API.

It sounds as if it has its own specific API, instead of the general Revit API.

Where can I find some information on this API, please?

Answer: Check out the blog posts discussing the Structural Precast Extension, especially the Autodesk Structural Precast Extension for Revit 2019.

It includes a section on the API for precast automation.

Its software installation folder %programfiles%/Autodesk/Structural Precast for Revit 2019 provides a subfolder named SDK containing:

IOpenFromCloudCallback and the DefaultOpenFromCloudCallback Class

Next, let's highlight a question raised in a comment on What's New in the Revit 2019 API and also in the Revit API discussion forum thread on how to implement IOpenFromCloudCallback interface:

Question: I am using the Revit API 2019 to detach a model from BIM360 with the following code:

  UIApplication app = commandData.Application;

  string path = "BIM 360://myfile";
  ModelPath modelPath = ModelPathUtils
    .ConvertUserVisiblePathToModelPath( path );

  OpenOptions openOptions = new OpenOptions();
  openOptions.DetachFromCentralOption 
    = DetachFromCentralOption.DetachAndDiscardWorksets;

  usingTransaction t = new Transaction( doc ) )
  {
    t.Start( "Open Cloud model" );

    app.OpenAndActivateDocument( modelPath, 
      openOptions, trueIOpenFromCloudCallback );

    t.Commit();
  }

The problem is, I don't know how to implement IOpenFromCloudCallback correctly, so if anyone has experience with this, please help me.

Thank you so much :)

Later: I just figured out how to implement it like this:

  public Result Execute( 
    ExternalCommandData commandData, 
    ref string message, 
    ElementSet elements )
  {
    UIDocument uIDocument = commandData.Application.ActiveUIDocument;
    UIApplication app = commandData.Application;
    Document document = uIDocument.Document;
    View currentview = document.ActiveView;

    Guid projectid = Guid.Parse( "myProjectGUID" );
    Guid modelid = Guid.Parse( "myModelGUID" );

    ModelPath modelPath = ModelPathUtils
      .ConvertCloudGUIDsToCloudPath( projectid, modelid );

    OpenOptions openOptions = new OpenOptions();
    IOpenFromCloudCallback openFromCloudCallback 
      = new cloudinterdace();

    app.OpenAndActivateDocument( modelPath, 
      openOptions, true, openFromCloudCallback );

    return Result.Succeeded;
  }

public class cloudinterdace : IOpenFromCloudCallback
{
  public OpenConflictResult OnOpenConflict( 
    OpenConflictScenario scenario )
  {
    throw new NotImplementedException();
  }
}

Answer by Phil Xia: I am Phil from Revit engineering team.

I saw your sample and the exception thrown in your implementation of IOpenFromCloudCallback. That is probably not a good choice.

You can use the default implementation provided by the DefaultOpenFromCloudCallback class that will always use the latest version for an open conflict.

Here is the introduction for this callback in the Revit API 2019 What's New sections on Existing APIs now support open from cloud paths (Collaboration for Revit) and Callback for conflict cases when opening from a cloud path:

The callback method:

can be passed to the document open methods to gain to handle conflict cases. The method is passed an OpenConflictScenario value identifying the reason for the conflict (Rollback, Relinquished or OutOfDate) and should return an OpenConflictResult with the desired response (keep local changes, discard local changes and open the latest version or cancel).

The new class:

provides a default way to handle conflicts: it always discards the local change and gets the latest version from the cloud.

The OpenConflictScenario enumeration lists the values you can use to implement your handling logic to return KeepLocalChanges, DiscardLocalChangesAndOpenLatestVersion or just cancel the opening.

Many thanks to Phil for jumping in and clarifying!