离线html集成说明

1. 概要说明

支持对以下3D轻量化数据、2D轻量化数据、子件转换轻量化数据进行离线html转换。

  • 支持转换为PC端、APP端、PC+APP端兼容 类型离线浏览html
  • 支持携带批注信息转换
  • 支持携带视图信息转换
  • 支持设置显示隐藏模型转换

2. 集成业务场景

2.1 文件结构

插入离线html转换的文件是一个zip格式的压缩包,其文件格式如下:

  • 0文件夹、Configurations.json:轻量化模型文件信息
  • viewerConfig.json:存放批注数据、隐藏模型信息、视图信息

viewerConfig.json信息说明

在轻量化预览页面,添加需要的批注后,打开页面调试工具,在Console面板下,调用nd_viewCtrl相关方法获取需要的信息,并保存到json文件中 。注意文件使用utf-8格式保存

viewerConfig.json文件结构如下

{
"viewerPorts":[], //视图数据,js调用nd_viewCtrl.nd_getViewportList方法可以获取当前视图信息。
"modelTags":[], //批注数据 ,js调用nd_viewCtrl.nd_getAllTags方法可以获取当前批注。
"hideParts":[] //隐藏模型,js调用nd_viewCtrl.nd_getHideObjectidLists方法可以获取隐藏部件objectId集合信息。
}

2.3 Java SDK调用示例

package com.newdim.demo;
import com.newdim.sdk.YunapiClient;
import com.newdim.sdk.models.*;
import org.json.JSONObject;

public class demo {

    public static void main(String[] args)  {
       // String localFile = "F:\\temp\\3D.step";
        //本地插入文件名
        String localFile = "F:\\temp\\model.zip";
        //轻量化文件下载保存路径文件夹
        String saveFile = "F:\\temp\\download";
        //初始化celient partnerID, secretKey,apiServer
        String partnerID = "xx";企业ID
        String secretKey = "xx";密钥
        String apiServer = "https://api.3dopen.cn";接口地址
        YunapiClient yunapiClient = new YunapiClient(partnerID,secretKey,apiServer);
      
        {   
	    //离线html转换任务
	    InsertHtmlConvertTaskBaseRequest insertTaskRequest = new InsertHtmlConvertTaskBaseRequest();
            
            insertTaskRequest.viewerType = 1;      //转换类型 1: 3D轻量化 2: 2D轻量化 默认1
            //insertTaskRequest.htmlType = 0;//默认为0,0:PC 1:APP 2:PC和APP混合支持
            InsertTaskResponse res = yunapiClient.InsertHtmlConvertTaskLocalFile(localFile,insertTaskRequest);
            System.out.println(res.taskID);

            if(res.taskID > 0){
                try {
                    //查询任务
                    BaseTaskResponse info = yunapiClient.QueryTask(res.taskID);
                    while (info.getCode() == 1 && info.status < 2){
                        info = yunapiClient.QueryTask(res.taskID);
                        Thread.sleep(2*1000);
                    }
                    if(info.status == 2){
                        System.out.println("在线预览地址" + info.previewURL);
                        //下载轻量化数据
                        ResultStatus rs = yunapiClient.DownloadNdsFile(info.outputNdsFiles,saveFile);
                        System.out.println("下载code:"+rs.getCode() + " msg:" + rs.getMsg());
                    }
                }catch (Exception e) {
                    System.out.println("error:"+e.getMessage());
                }
            }
        }
}

2.4 C# SDK调用示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using YunApiSDK;
using YunApiSDK.Model.Request;

namespace YunApiSDKDemo
{
    public class YunApiTest
    {

        public async Task Test()
        {
			string partnerID = "xx";企业ID
			string secretKey = "xx";密钥
			string apiServer = "https://api.3dopen.cn";接口地址
			// 参数分别为门户网站中 开发接口-接口信息 中的企业ID、密钥、接口地址
			var yunapiClient = new YunApiClient(partnerID, secretKey, apiServer);
            var filePath = "F:\\model.zip";
            var fileInfo = new FileInfo(filePath);

            // 获取minio临时上传URL
            var tempUrlRes = await yunapiClient.GetPresignedUploadUrlAsync(new GetPresignedUrlRequest { FileName = fileInfo.Name });

            if (tempUrlRes.Status.Code != 1)
            {
                await Console.Out.WriteLineAsync(tempUrlRes.Status.Msg);
                return;
            }

            // 使用minio临时授权URL上传文件
            var uploadRes = await yunapiClient.UploadFileByNdsFileUrlAsync(tempUrlRes.Data.Url, filePath);

            // 回调接口地址,如果需要回调则配置,不需要则不配置,地址为实际业务中开发的回调接口地址,本例为YunApiSDKCallbackDemo中的测试接口
            // 插入任务
            var insertRes = await yunapiClient.InsertHtmlConvertTaskAsync(new InsertHtmlConvertTaskRequest   { InputNdsFile = tempUrlRes.Data.InputNdsFile, InputFileType = 0, ViewerType = 1 });

            if (insertRes.Status.Code != 1)
            {
                await Console.Out.WriteLineAsync(insertRes.Status.Msg);
                return;
            }

            var taskState = 0;
            var outputDataUrl = string.Empty;
            // 此处使用while循环是为了得到轻量化文件下载地址,演示下载文件,实际情况可根据业务调整
            while (taskState < 2)
            {
                // 查询接口
                var queryRes = await yunapiClient.QueryTaskAsync(new QueryTaskRequest { TaskID = insertRes.Data.TaskID });
                if (queryRes?.Status?.Code != 1)
                {
                    break;
                }
                taskState = queryRes.Data?.Status ?? 5;
                outputDataUrl = queryRes.Data?.OutputNdsFiles;
            }

            // 此段是演示下载轻量化文件,可根据实际情况自行调整
            if (taskState == 2 && !string.IsNullOrEmpty(outputDataUrl))
            {
                var decodeUrl = Encoding.UTF8.GetString(Convert.FromBase64String(outputDataUrl));
                
                // 此处是获取url中的文件名,可根据自己实际业务情况,确定要保存的文件名
                Uri uri = new Uri(decodeUrl);
                string fileName = System.IO.Path.GetFileName(uri.LocalPath);

                // 简单使用,演示功能,最佳实践使用IHttpClientFactory.CreateClient()创建
                var httpClient = new HttpClient();
                using (HttpResponseMessage response = await httpClient.GetAsync(decodeUrl))
                {
                    if (response.IsSuccessStatusCode)
                    {
                        using (var fileStream = await response.Content.ReadAsStreamAsync())
                        using (var outputFileStream = System.IO.File.Create(fileName))
                        {
                            await fileStream.CopyToAsync(outputFileStream);
                        }
                        Console.WriteLine("文件下载成功!");
                    }
                    else
                    {
                        Console.WriteLine("请求失败: " + response.ReasonPhrase);
                    }
                }
            }


        }
    }
}