autodesk-forge - 以编程方式启动 BIM360 Docs 协作
问题描述
为了升级到当前版本的 Revit,我们必须将文件从 BIM360 Teams 迁移到 BIM360 Docs。由于我们有数百个文档,我希望尽可能地自动化这个过程。
Forge API 允许我从 BIM360 Teams 下载所有 Revit 文件。我还可以使用 Revit API 或第三方应用程序(例如Bulk File Upgrader `)将它们全部升级到 Revit 2019。
使用 Forge BIM360 API,我能够以编程方式创建新项目,并从 Team Drive 上传文件和文件夹。我难以以自动化方式完成的步骤是为升级的 Revit 2019 文件启动协作。有没有一种方法可以通过 Revit API 或 Forge API 来完成?或者是否有其他方法可以让我自动完成这两个 Autodesk Cloud Collaboration 解决方案之间的迁移?
我遇到了这个关于发布模型的教程,这表明需要通过 Revit UI 手动启动每个 Revit 文件的协作。我希望找到这个建议的替代解决方案。
谢谢!
解决方案
我的同事 Eason Kang 康益升证实,您可以使用我之前回答中提供的步骤来实现此目的,如下所示:
Revit 2019.2 和未来版本包括对“单用户工作流”(非工作共享云模型)的支持。同时,他们公开API来启动非工作共享云模型,并将非工作共享云模型转换为工作共享云模型(C4R)。
您可以使用单用户 API 来解决您提到的情况,如下所示:
- 将下载的文件和非工作共享文件保存到本地文件系统。
- 通过 API 调用启动非工作共享云模型
Document.SaveAsCloudModel
。 - 通过 API 将其转换为 C4R 模型
Document.EnableCloudWorksharing
。
这是他的报告,其中包括解决凭证问题的方法:
问题:我想使用 Revit 2020 API 将本地 RVT 保存到我的 BIM360 帐户(已激活 Design Collaboration 服务),但 Revit 总是抛出异常,提示我没有访问权限。我有一个有效的 C4R 许可证,并且能够从我通过 Revit UI 传递给 API 的文件夹 id 打开 C4R 模型。什么不见了?
代码:
doc.SaveAsCloudModel(
"urn:adsk.wipprod:fs.folder:co.8rtX03jDQXKnssA1FfrEXw",
doc.Title);
例外:
- Autodesk.Revit.Exceptions.RevitServerUnauthorizedException:您没有云模型权限来访问云中的此资源
答:您需要在manage.autodesk.com
.
回应:谢谢你的澄清。我将“Revit 的云模型”与 C4R 混淆了,并且我的 manage.autodesk.com 中没有设置“Revit 的云模型”权利。
答: “Revit 的云模型”是 Revit 2019.2 以来提供的一项新服务。它是 Revit 和 Revit LT 订阅的一部分。
顺便说一句,与 C4R 模型的主要区别在于,一次只有一个用户可以使用这种方法创建的模型。
回应:太好了!
我根据需要设置了我的 Revit 订阅,按照 Jeremy 上面分享的步骤进行操作,并确认它可以正常工作!
您可以使用以下步骤通过 Revit API 实现目标:
- 通过对
Document.SaveAsCloudModel
. - 通过 API 将其转换为 C4R 模型
Document.EnableCloudWorksharing
。
这是我实现这个的测试代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
namespace adsk.c4r
{
[Transaction(TransactionMode.Manual)]
public class Command : IExternalCommand
{
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
UIApplication uiapp = commandData.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
Application app = uiapp.Application;
string template = app.DefaultProjectTemplate;
string filename = @"D:\DevZone\ADN\t5021\revit_api_c4r_test_6.rvt";
string name = System.IO.Path.GetFileName(filename);
Document doc = app.NewProjectDocument(template);
doc.SaveAs(filename);
try
{
doc.SaveAsCloudModel(
"urn:adsk.wipprod:fs.folder:co.aCd1tMmrTxucmJcmtYTLBQ",
name);
var cloudPath = doc.GetCloudModelPath();
if(doc.CanEnableCloudWorksharing())
{
doc.EnableCloudWorksharing();
}
TaskDialog.Show("Revit",
string.Format("{0} is a C4R model now", name));
doc.Close();
uiapp.OpenAndActivateDocument(cloudPath, new OpenOptions(), false);
}
catch(Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
return Result.Cancelled;
}
return Result.Succeeded;
}
}
}
推荐阅读
- python - 未捕获(承诺中)错误:检查时出错:预期 flatten_1_input 的形状为 [null,7,7,512] 但得到的数组的形状为 [1,224,224,3]
- conv-neural-network - 在 DGL 中使用 GCN 的边缘特征
- parsing - 如何从 WebM 文件中提取音频
- c# - 如何修复 ToggleButton 悬停检测?
- microsoft-teams - 为什么我在使用 Teams Shifts API 时经常出现超时错误?(微软图形)
- c - 当没有更多数据要读取时,如何告诉 stop recv() 处于空闲状态?
- jenkins - 如何从变更日志中排除存储库
- java - 为什么Java的数据结构实现扩展了另一个而不是有一个字段?
- python - 为什么我不能使用 for 循环从另一个列表中删除一个列表?
- ios - 使用 SwiftUI 在不同的 UI 层次结构之间切换的正确方法是什么?