大家好,Autodesk Forge 团队: 我可以知道我怎样才能 仅使用 BIM 360 API 即可做到这一点,我们是否需要模型导数才能下载?
https://developer.api.autodesk.com/construction/index/v2/projects/{{PROJECTID}}/indexes/{{VERSIONID}}/manifest
任何帮助表示赞赏!
偏移量、属性等的字符串值是
derivativeUrn
,因此我们可以使用 GET {urn}/manifest/{derivativeurn}/signedcookies 下载它。
这是 .NET 的代码片段
var restSharpClient = new RestClient("https://developer.api.autodesk.com");
RestRequest request = new RestRequest("/modelderivative/v2/designdata/{urn}/manifest/{derivativeUrn}/signedcookies", RestSharp.Method.Get);
request.AddHeader("Authorization", "Bearer " + accessToken);
request.AddUrlSegment("urn", urn);
request.AddUrlSegment("derivativeUrn", derivativeUrn);
var response = await restSharpClient.ExecuteAsync(request);
var cloudFrontPolicyName = "CloudFront-Policy";
var cloudFrontKeyPairIdName = "CloudFront-Key-Pair-Id";
var cloudFrontSignatureName = "CloudFront-Signature";
var cloudFrontCookies = response.Headers
.Where(x => x.Name == "Set-Cookie")
.Select(x => x.Value)
.Cast<string>()
.ToList();
var cloudFrontPolicy = cloudFrontCookies.Where(value => value.Contains(cloudFrontPolicyName)).FirstOrDefault()?.Trim().Substring(cloudFrontPolicyName.Length + 1).Split(";").FirstOrDefault();
var cloudFrontKeyPairId = cloudFrontCookies.Where(value => value.Contains(cloudFrontKeyPairIdName)).FirstOrDefault()?.Trim().Substring(cloudFrontKeyPairIdName.Length + 1).Split(";").FirstOrDefault();
var cloudFrontSignature = cloudFrontCookies.Where(value => value.Contains(cloudFrontSignatureName)).FirstOrDefault()?.Trim().Substring(cloudFrontSignatureName.Length + 1).Split(";").FirstOrDefault();
var result = JsonConvert.DeserializeObject<dynamic>(response.Content);
var downloadURL = $"{result.url}?Key-Pair-Id={cloudFrontKeyPairId}&Signature={cloudFrontSignature}&Policy={cloudFrontPolicy}";
System.Diagnostics.Trace.WriteLine(downloadURL);
RestRequest requestDownload = new RestRequest(downloadURL, RestSharp.Method.Get);
System.IO.Stream downloadStream = await restSharpClient.DownloadStreamAsync(requestDownload);
string name = derivativeUrn.Substring(derivativeUrn.LastIndexOf('/') + 1);
using (var memoryStream = new MemoryStream())
{
downloadStream.CopyTo(memoryStream);
File.WriteAllBytes(name, memoryStream.ToArray());
}