【问题标题】:R scripting: BIM360 metadata to PowerBi via ForgeR 脚本:BIM360 元数据通过 Forge 到 PowerBi
【发布时间】:2021-01-22 19:42:24
【问题描述】:

目前我在 BIM360 上有 revit 文件,我正在尝试将元数据导入 PowerBi。我遇到了有关如何执行此操作的代码,但我有一些问题可能有人可以回答。目前看来,被提取的元数据来自模型属性,我需要来自工作表属性的元数据。下面的代码显示了哪些字段被拉取:

#######################################################################
## This R script is a sample code that demonstrate how to extract documents' data from a BIM 360 Docs project using Autodesk Forge APIs.
#####################################################################

# Define Forge App Client ID and Secret, BIM 360 Account ID, and Project ID
App_Client_ID <- ""
App_Client_Secret <- ""
BIM360_Account_ID <- ""
BIM360Docs_Project_ID <- ""


#Load libraries required for the R script
library(httr)
library(jsonlite)


#Define a function that loops through BIM 360 Docs folder structure to build a document list 
Parse_Folder <- function(folder_id, folder_name){
  Get_Folder_Content_URL <- paste("https://developer.api.autodesk.com/data/v1/projects/b.",
                                  BIM360Docs_Project_ID,
                                  "/folders/",
                                  folder_id,
                                  "/contents", sep="")
  Get_Folder_Content_Request <- GET(Get_Folder_Content_URL, add_headers("Authorization" = Access_Token))
  Get_Folder_Content_Data <- jsonlite::fromJSON(content(Get_Folder_Content_Request, "text", "application/json", "UTF-8"))
  Folder_Content_Files <- flatten(data.frame(Get_Folder_Content_Data["included"]))
  
  if (nrow(Folder_Content_Files) != 0){
    Folder_Content_Files$document.location <- rep(folder_name, nrow(Folder_Content_Files))
    Folder_Content_Files_SelectedColumns <- as.data.frame(Folder_Content_Files[, c("document.location",
                                                                                   "included.attributes.displayName",
                                                                                   "included.attributes.createUserName",
                                                                                   "included.attributes.createUserId",
                                                                                   "included.attributes.lastModifiedUserName",
                                                                                   "included.attributes.lastModifiedUserId",
                                                                                   "included.attributes.versionNumber",
                                                                                   "included.attributes.fileType",
                                                                                   "included.attributes.extension.type",
                                                                                   "included.attributes.createTime",
                                                                                   "included.attributes.lastModifiedTime",
                                                                                   
    )])
    
    BIM360Docs_Document_List <- rbind(BIM360Docs_Document_List, Folder_Content_Files_SelectedColumns)
    assign("BIM360Docs_Document_List", BIM360Docs_Document_List, envir = .GlobalEnv)
  }
  
  Folder_Content_Data <- flatten(data.frame(Get_Folder_Content_Data["data"]))
  if (nrow(Folder_Content_Data) != 0){
    for(i in 1:nrow(Folder_Content_Data)){
      if(Folder_Content_Data[i,"data.type"]=="folders"){
        tryCatch({
          Parse_Folder(Folder_Content_Data[i,"data.id"], paste(folder_name, "/", Folder_Content_Data[i,"data.attributes.displayName"], sep=""))
        }, error=function(e){})
      }
    }
  }
}


#Use Forge Authentication API to get access token
App_Authenticate <- POST("https://developer.api.autodesk.com/authentication/v1/authenticate",
                         add_headers("Content-Type" = "application/x-www-form-urlencoded"),
                         body=I(list(client_id = App_Client_ID,
                                     client_secret = App_Client_Secret,
                                     grant_type = "client_credentials",
                                     "scope" = "data:read")),
                         encode = "form")
Access_Token <- paste("Bearer", content(App_Authenticate)$access_token,  sep=" ")


#Use Forge Data Managment API to Access Top Folders in the project
Get_Top_Folders_URL <- paste("https://developer.api.autodesk.com/project/v1/hubs/b.",
                             BIM360_Account_ID,
                             "/projects/b.",
                             BIM360Docs_Project_ID,
                             "/topFolders", sep="")
Get_Top_Folders_Request <- GET(Get_Top_Folders_URL, add_headers("Authorization" = Access_Token))
Get_Top_Folders_Data <- jsonlite::fromJSON(content(Get_Top_Folders_Request, "text", "application/json", "UTF-8"))
TopFolders_Content <- flatten(data.frame(Get_Top_Folders_Data))
BIM360Docs_Document_List <- data.frame(Date=as.Date(character()), File=character(), User=character(), stringsAsFactors=FALSE) 

for(i in 1:nrow(TopFolders_Content)){
  TopFolderName <- TopFolders_Content[i,"data.attributes.displayName"]
  if (TopFolderName != "ProjectTb" && TopFolderName != "Photos" && TopFolderName != "Recycle Bin" ){
    tryCatch({
      Parse_Folder(TopFolders_Content[i,"data.id"], TopFolderName)
    }, error=function(e){})
  }
}

names(BIM360Docs_Document_List)[names(BIM360Docs_Document_List)=="document.location"] <- "Document Location"
names(BIM360Docs_Document_List)[names(BIM360Docs_Document_List)=="included.attributes.displayName"] <- "File Name"
names(BIM360Docs_Document_List)[names(BIM360Docs_Document_List)=="included.attributes.createUserName"] <- "Created by"
names(BIM360Docs_Document_List)[names(BIM360Docs_Document_List)=="included.attributes.createUserId"] <- "Created by (ID)"
names(BIM360Docs_Document_List)[names(BIM360Docs_Document_List)=="included.attributes.lastModifiedUserName"] <- "Updated by"
names(BIM360Docs_Document_List)[names(BIM360Docs_Document_List)=="included.attributes.lastModifiedUserId"] <- "Updated by (ID)"
names(BIM360Docs_Document_List)[names(BIM360Docs_Document_List)=="included.attributes.versionNumber"] <- "Version"
names(BIM360Docs_Document_List)[names(BIM360Docs_Document_List)=="included.attributes.fileType"] <- "File Type"
names(BIM360Docs_Document_List)[names(BIM360Docs_Document_List)=="included.attributes.extension.type"] <- "Extension Type"
names(BIM360Docs_Document_List)[names(BIM360Docs_Document_List)=="included.attributes.createTime"] <- "Created Date"
names(BIM360Docs_Document_List)[names(BIM360Docs_Document_List)=="included.attributes.lastModifiedTime"] <- "Updated Date"


# Clear Variables
rm(i, Access_Token,
   App_Client_ID,
   App_Client_Secret,
   App_Authenticate,
   BIM360_Account_ID,
   BIM360Docs_Project_ID,
   Get_Top_Folders_URL, 
   Get_Top_Folders_Request,
   Get_Top_Folders_Data,
   TopFolders_Content,
   TopFolderName,
   Parse_Folder
)

我的问题是我可以使用它进入 Revit 文件并获取图纸属性吗?如果是这样,include.attribute.versionNumber 中的名称“versionNumber”是如何决定的?这是R脚本中的包如何预先确定它还是服务器端的名称是这样出现的?

提前非常感谢你,如果我没有正确的礼仪,我很抱歉。

【问题讨论】:

    标签: r autodesk-forge powerbi-datasource autodesk-data-management autodesk-bim360


    【解决方案1】:

    在这个 R 脚本中,它使用 Forge 的 HTTP 请求端点:GET Folder Contents,这是对 Data Management API 的一次调用。下面的链接是关于这个端点的 API 帮助。它不支持获取文档元数据或属性。 https://forge.autodesk.com/en/docs/data/v2/reference/http/projects-project_id-folders-folder_id-contents-GET/

    要获取元数据或属性,它属于 Forge 的另一类:Model Derivative API: https://forge.autodesk.com/en/docs/model-derivative/v2/reference/http/urn-metadata-guid-GET/ https://forge.autodesk.com/en/docs/model-derivative/v2/reference/http/urn-metadata-guid-properties-GET/

    下面的这篇博客可能对你理解端点有一点帮助: https://forge.autodesk.com/blog/get-all-dbid-without-enumerating-model-hierarchy

    因此,这意味着您需要在 R 脚本中使用上述端点的架构来编写调用。

    但是,请注意:

    1. 获取属性时,默认限制为20M。如果响应json大于20M,Forge默认不会返回数据,需要输入一个查询参数forceget,APII帮助告诉更多。 因此,您可能已经想到,如果它是一个复杂的模型,属性可能会很大。执行R脚本需要很长时间,甚至恐怕会超时。
    2. 实际上,在获取文件夹内容时,您使用的这个示例只是转储默认页面。一个文件夹可能包含许多项目。默认情况下,任何 Web 服务都不会在一次调用中返回所有项目,相反,我们需要指定一页中可以导出多少项目。在具体的例子中,项目列表的一页最大数量为 200。 换句话说,如果您检查的文件夹超过 200 个,则此 R 脚本不会告诉所有文档/工作表。

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 2022-11-18
      • 2022-10-05
      • 2020-05-12
      • 2021-01-01
      • 2019-04-10
      • 2020-07-01
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多