123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Text;
- using Blue;
- using LitJson;
- using Newtonsoft.Json;
- using Newtonsoft.Json.Linq;
- using UnityEngine;
- using UnityEngine.Networking;
- public interface IPointService:IService
- {
- /// <summary>
- /// 获取点坐标数据
- /// </summary>
- /// <param name="methodName">后缀</param>
- void GetPoint(string methodName, Action<string> callback);
- /// <summary>
- /// 获取点云文件的下载链接
- /// </summary>
- /// <param name="methodName">后缀</param>
- /// <param name="projectId">场景ID</param>
- /// <param name="fileType">文件类型</param>
- void GetPointFileDownloadUrl(string methodName, string projectId, PointFileType fileType, Action<string> callback);
- /// <summary>
- /// 根据点云文件的下载链接去下载点云文件
- /// </summary>
- /// <param name="downloadingUrl">点云文件的下载链接</param>
- /// <param name="fileType">文件类型</param>
- /// <param name="sceneID">场景ID</param>
- void DownloadPointFile(string downloadingUrl, PointFileType fileType);
- void GetRefrencePos(int sceneID); // 获取参照物的坐标旋转
- }
- public class PointService : IPointService
- {
- public ScenePosRotInfo PosRot { get; private set; }
- private string UrlPointCloud;
- private string UrlObjOfReference;
- public void OnInit()
- {
- //UrlPointCloud = "https://pro.qulivr.com/mr-navigator/v1";
- UrlPointCloud = "https://api-fat3.ghz-tech.com/mr-navigator/v1";
- UrlObjOfReference = "https://api-fat3.ghz-tech.com/mr-navigator/v1/project/unityReference";
- }
- public void GetPoint(string methodName, Action<string> callback)
- {
- CoroutineSystem.Instance.Start_Coroutine(GetPointRequest(methodName, callback));
- }
- public void GetPointFileDownloadUrl(string methodName, string projectId, PointFileType fileType, Action<string> callback)
- {
- string url = UrlPointCloud + methodName;
- // 创建URL
- UriBuilder uriBuilder = new UriBuilder(url);
- // 添加查询参数
- uriBuilder.Query = "projectId=" + projectId + "&fileType=" + fileType.ToString();
- // 创建UnityWebRequest
- UnityWebRequest webRequest = UnityWebRequest.Get(uriBuilder.Uri);
- webRequest.SetRequestHeader("Authorization", UserInfo.Instance.Token);
- // 发送请求
- CoroutineSystem.Instance.Start_Coroutine(GetPointGetPointFileRequest(webRequest, callback));
- }
- public void DownloadPointFile(string downloadingUrl, PointFileType fileType)
- {
- CoroutineSystem.Instance.Start_Coroutine(DownloadPointFileRequest(downloadingUrl,fileType));
- }
- public void GetRefrencePos(int sceneID)
- {
- CoroutineSystem.Instance.Start_Coroutine(GetObjectOfRefrence(UrlObjOfReference,sceneID));
- }
- #region 协程
- private IEnumerator GetPointRequest(string methodName, Action<string> callback)
- {
- string url = UrlPointCloud + methodName;
- using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
- {
- webRequest.SetRequestHeader("authorization", UserInfo.Instance.Token);
- //设置header
- foreach (var v in HttpTool.Instance.RequestHeader)
- {
- webRequest.SetRequestHeader(v.Key, v.Value);
- }
- yield return webRequest.SendWebRequest();
- if (webRequest.result == UnityWebRequest.Result.ProtocolError || webRequest.result == UnityWebRequest.Result.ConnectionError)
- Debug.LogError("GetPoint failed: " + webRequest.error + "\n" + webRequest.downloadHandler.text);
- else
- callback?.Invoke(webRequest.downloadHandler.text);
- }
- }
- private IEnumerator GetPointGetPointFileRequest(UnityWebRequest webRequest, Action<string> callback)
- {
- yield return webRequest.SendWebRequest();
- if( webRequest.result == UnityWebRequest.Result.ProtocolError || webRequest.result == UnityWebRequest.Result.ConnectionError)
- Debug.LogError("GetPointFileDownloadUrl failed: " + webRequest.error);
- else
- callback?.Invoke(webRequest.downloadHandler.text);
- }
- /// <summary>
- /// 下载点云文件 UnityWebRequest
- /// </summary>
- /// <param name="downloadingUrl">下载的Url</param>
- /// <param name="fileType">文件类型</param>
- /// <returns></returns>
- private IEnumerator DownloadPointFileRequest(string downloadingUrl, PointFileType fileType)
- {
- string fileName = this.GetUtility<GetFileNameUtility>().GetFileName(downloadingUrl, fileType.ToString());
- if (!File.Exists(Application.persistentDataPath + "/Map Data/" + fileName))
- {
- Debug.LogWarning("文件不存在,下载文件");
- using (UnityWebRequest webRequestPoint = UnityWebRequest.Get(downloadingUrl))
- {
- webRequestPoint.timeout = 30;//设置超时,若webRequest.SendWebRequest()连接超时会返回,且isNetworkError为true
- yield return webRequestPoint.SendWebRequest();
- if (webRequestPoint.result == UnityWebRequest.Result.ProtocolError || webRequestPoint.result == UnityWebRequest.Result.ConnectionError)
- Debug.Log("Download Point Cloud Error:" + webRequestPoint.error);
- else
- {
- if (Directory.Exists(Application.persistentDataPath + "/Map Data") == false) // Map Data文件夹不存在
- Directory.CreateDirectory(Application.persistentDataPath + "/Map Data");
- if (System.IO.File.Exists(Application.persistentDataPath + "/Map Data/" + fileName)) // Map Data/fileName 文件存在则删除
- System.IO.File.Delete(Application.persistentDataPath + "/Map Data/" + fileName);
-
- var File = webRequestPoint.downloadHandler.data; //获取二进制数据
- FileStream nFile = new FileStream(Application.persistentDataPath + "/Map Data/" + fileName, FileMode.Create); //创建文件写入对象
- nFile.Write(File, 0, File.Length); //写入数据
- nFile.Close(); nFile.Dispose(); nFile = null;//关闭当前流并释放与之相关联的所有系统资源
- if (fileType == PointFileType.bytes)
- this.SendEvent(new LoadMapFileEvent() { fileName = fileName });
- }
- }
-
- }
- else
- {
- Debug.LogWarning("文件已存在");
- if (fileType == PointFileType.bytes)
- this.SendEvent(new LoadMapFileEvent() { fileName = fileName });
- }
- }
- private IEnumerator GetObjectOfRefrence(string url,int sceneID)
- {
- using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
- {
- ObjofRefrendenceInfo TestGet = new ObjofRefrendenceInfo();
- TestGet.id = sceneID;
- string jsonData = JsonConvert.SerializeObject(TestGet);
- byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData);
- webRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
- webRequest.downloadHandler = new DownloadHandlerBuffer();
- webRequest.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
- webRequest.SetRequestHeader("authorization", UserInfo.Instance.Token);
- yield return webRequest.SendWebRequest();
- if (webRequest.result== UnityWebRequest.Result.ProtocolError || webRequest.result == UnityWebRequest.Result.ConnectionError)
- Debug.LogError("UnityWebRequest Error:"+webRequest.downloadHandler.text);
- else
- {
- if (!string.IsNullOrWhiteSpace(webRequest.downloadHandler.text))
- {
- string message = webRequest.downloadHandler.text;
- JObject jobject = JObject.Parse(message);
- if (jobject["code"].ToString() == "200")
- {
- message = jobject["data"].ToString();
- if (!string.IsNullOrWhiteSpace(message))
- {
- // Debug.LogError("message:"+message);
- ScenePosRotInfo ScenePosRotInfoList = JsonConvert.DeserializeObject<ScenePosRotInfo>(message);
- PosRot = ScenePosRotInfoList;
- this.SendEvent(new GetReferencePosEvent() { PosRot = PosRot });
- }
- }
- }
- }
- }
- }
- #endregion
- }
|