R脚本:通过Forge将BIM360元数据转换为PowerBi

问题描述

当前,我在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.","/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,"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,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,Get_Top_Folders_URL,Get_Top_Folders_Request,Get_Top_Folders_Data,TopFolders_Content,TopFolderName,Parse_Folder
)

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

非常感谢您,如果我没有把正确的礼节打包下来,对不起。

解决方法

在此R脚本中,它使用Forge的HTTP请求端点:GET文件夹内容,这是对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脚本不会告诉所有文档/工作表。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...