如何在设计自动化 api 中为 revit 创建多个文件并将结果下载为一个 zip 文件

Posted

技术标签:

【中文标题】如何在设计自动化 api 中为 revit 创建多个文件并将结果下载为一个 zip 文件【英文标题】:How to create multiple files in design automation api for revit and download result as one zip file 【发布时间】:2019-11-14 07:38:00 【问题描述】:

我正在处理一个项目,我需要创建多个 revit 文件,将它们全部压缩在一起,然后下载 zip 文件作为 Revit 设计自动化 API 中的输出。 我的项目在我的本地机器上完全按预期工作,但是当我上传我的 appbundle 并执行我的工作项时,我得到了“failedInstructions”状态。

我不知道是否可以在设计自动化 API 中创建多个 revit 文件 以下是我尝试过的:

这是我的工作项 json,你看我正在传递一个带有墙壁样本数据的 json 数组。

 "arguments":
        "ElementParams":
            "url":"'elementdata':[['Keys':'Sytème','Value':'Wall_1','Keys':'Thickness','Value':'120.00','Keys':'Length','Value':'2500.00','Keys':'Height','Value':'1200.00'],['Keys':'Sytème','Value':'Wall_2','Keys':'Thickness','Value':'120.00','Keys':'Length','Value':'2500.00','Keys':'Height','Value':'1200.00'],['Keys':'Sytème','Value':'Wall_3','Keys':'Thickness','Value':'120.00','Keys':'Length','Value':'2500.00','Keys':'Height','Value':'1200.00'],['Keys':'Sytème','Value':'Wall_4','Keys':'Thickness','Value':'120.00','Keys':'Length','Value':'2500.00','Keys':'Height','Value':'1200.00']]"
            ,

        "resultFamily":
            "verb":"put",
            "url":"https://storage.googleapis.com/bucketname/RevitObjects.zip?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            "headers": 
              "Authorization": "",
              "Content-Type": "application/octet-stream"
            
        
    

在我的代码中,我循环创建了一个新文档。

Document doc = app.NewProjectDocument(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + "DefaultTemplates.rte");

并保存并关闭当前文档

SaveAsOptions options = new SaveAsOptions();
options.OverwriteExistingFile = true;
doc.SaveAs(Assembly.GetExecutingAssembly().Location) + "\\" + fileName, options);

doc.Close(); //Closing the document

List<string> files = Directory.GetFiles(Assembly.GetExecutingAssembly().Location) + "\\").Where(a => a.Contains(Path.GetFileNameWithoutExtension(fileName)) && a.Split('.').Count() > 2).ToList();
foreach (var fl in files)

if (File.Exists(fl))
File.Delete(fl);


byte[] filebytes = File.ReadAllBytes(GlobalData.TemplatePath + "\\" + GlobalData.DestinationFile);
GlobalData.FileList.Add(GlobalData.DestinationFile, filebytes);

这里fileName是Wall_1、Wall_2、Wall_3和Wall_4,它们会循环出现 这里我正在做的是保存创建的 revit 文件示例 Wall_1 关闭文档后,有一个创建示例 Wall_1.0001.rvt 的文件的副本。我删除了所有创建的附加文件并保留一个最终版本并将其添加到文件字节中。 然后使用 byte[] filebytes 中添加的数据创建名为“RevitObjects.zip”的 zip 文件 之后我删除所有文件。 这个过程在我的本地机器上完美运行,但是当我执行工作项时,创建的日志显示以下内容:

[07/03/2019 13:47:38] Error: An unexpected error happened during phase CoreEngineExecution of job.
[07/03/2019 13:47:38] Job finished with result FailedExecution
[07/03/2019 13:47:38] Job Status:

  "status": "failedInstructions",

日志中没有其他错误信息。

让我知道是否可以在 revit 的设计自动化 api 中创建多个 revit 文档 我们不允许在工作目录中执行删除操作吗。 我尝试创建一个文件夹并执行上述相同的操作,但我收到了拒绝访问的消息。 让我知道我哪里出错了。也将不胜感激任何完成任务的指导 谢谢

【问题讨论】:

【参考方案1】:

首先,是的,Design Automation 系统支持多个 revit 文件输出,您只需将输出的参数 zip 设置为“true”,然后在插件中保存所有输出文件,这非常简单到您在“localName”的输出参数中命名的文件夹,请查看我在https://forge.autodesk.com/blog/how-generate-dynamic-number-output-design-automation-revit-v3 的博客文章了解所有详细信息。

您不能访问除当前工作文件夹之外的任何其他文件夹,您可以在当前工作文件夹下创建子文件夹并将所有文件放在那里。

希望对您有所帮助。

【讨论】:

感谢您的回复,但是没有用,我在当前工作目录下使用 Directory.CreateDirectory(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\ \RevitObjects");我在日志中收到错误 System.UnauthorizedAccessException: Access to the path 'T:\Aces\Applications\9130ea1858b0af47872ce59a7c8589a0.appName.package\appName.bundle\Contents\RevitObjects' is denied. 有没有其他方法可以在当前工作目录中创建子文件夹? 我删除了try catch块来检查日志文件是否注册了一些错误,我得到了错误,因为请求超出了允许的限制,有没有办法增加输入请求的内容长度? 您尝试过 Directory.CreateDirectory(Directory.GetCurrentDirectory() + "\\RevitObjects") 吗?这是您可以访问的当前工作文件夹。就像在我的博客中一样,它的工作原理是: doc.Export( Directory.GetCurrentDirectory()+ "\\exportedDwgs", "rvt", viewIds, options); 正如钟提到的,我不希望您在下载程序集 (appBundle) 的文件夹中具有写入权限。您将需要使用当前目录。我认为最好的方法是在当前目录中创建一个子文件夹并将所有要压缩的文件存储在其中。这样,您只需在活动中修改输出参数以添加 zip:true 和 localName:“NameOftheSubFolderYouCreatedInTheCurrentDirectory”,即可生成包含所需文件的 zip 输出。这应该会生成您想要的输出 zip 文件。【参考方案2】:

如果 json 参数非常大,您可以提供“inputParameters.json”作为输入文件,而不是传递 WorkItem 有效负载中的所有内容

【讨论】:

以上是关于如何在设计自动化 api 中为 revit 创建多个文件并将结果下载为一个 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Forge API 提供签名的 url 以创建 revit 文件

如何在 Forge API 中向元素添加参数

Autodesk Forge 数据管理参考 API 未列出 Revit 参考

如何从 revit 插件或使用 Forge api 为 Revit 文件创建 URN

Revit API - 创建新的 ScheduleField

如何在 Revit API 中显示创建的立方体?