ComputerUtil.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package com.fdkankan.modeling.utils;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.fdkankan.common.constant.ConstantFileName;
  5. import com.fdkankan.common.constant.ConstantFilePath;
  6. import com.fdkankan.common.utils.CreateObjUtil;
  7. import com.fdkankan.common.utils.FileUtils;
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.springframework.stereotype.Component;
  10. import java.io.File;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. import java.util.UUID;
  14. /**
  15. * 生成场景和计算场景
  16. * Created by Hb_zzZ on 2019/5/8.
  17. */
  18. @Slf4j
  19. @Component
  20. public class ComputerUtil {
  21. public static Map<String,String> computer(String projectNum, String path, String buildType) throws Exception{
  22. Map<String,String> map = new HashMap<String,String>();
  23. path = path.replace("//", "/");
  24. log.info("开始建模:"+projectNum);
  25. //构建算法isModel去掉,因此改成空字符串
  26. if("V2".equals(buildType)){
  27. CreateObjUtil.build3dModelOld(path, "");
  28. }
  29. if("V3".equals(buildType)){
  30. CreateObjUtil.build3dModel(path, "");
  31. // CreateObjUtil.build3dModel(unicode, "");
  32. }
  33. log.info("建模完成转换数据:"+projectNum);
  34. boolean vision2 = false;
  35. //读取upload文件,检验需要上传的文件是否存在
  36. String uploadData = FileUtils.readFile(path + File.separator + "results" +File.separator+"upload.json");
  37. JSONObject uploadJson = null;
  38. JSONArray array = null;
  39. if(uploadData!=null) {
  40. uploadJson = JSONObject.parseObject(uploadData);
  41. array = uploadJson.getJSONArray("upload");
  42. }
  43. if(array == null){
  44. String instanceId = FileUtils.readFile("/opt/hosts/hosts.txt");
  45. FileUtils.writeFile(path + File.separator + "javaErrorNow.log", instanceId + ":计算错误!");
  46. Thread.sleep(10000L);
  47. FileUtils.writeFile(path + File.separator + "javaError.log", instanceId + ":计算错误!");
  48. throw new Exception("upload.json数据出错");
  49. }
  50. JSONObject fileJson = null;
  51. String fileName = "";
  52. String meshfix = ""; //双模型时候会有改文件路径
  53. for(int i = 0, len = array.size(); i < len; i++){
  54. fileJson = array.getJSONObject(i);
  55. fileName = fileJson.getString("file");
  56. //文件不存在抛出异常
  57. if(!new File(path + File.separator + "results" +File.separator + fileName).exists()){
  58. throw new Exception(path + File.separator + "results" +File.separator + fileName+"文件不存在");
  59. }
  60. //判断是否有vision2.txt
  61. if("vision2.txt".equals(fileName)){
  62. vision2 = true;
  63. }
  64. //tex文件夹
  65. if(fileJson.getIntValue("clazz") == 2 && !fileJson.containsKey("pack-file")){
  66. if(fileName.contains("meshfix.txt")){
  67. meshfix = fileName;
  68. }else {
  69. map.put(path + File.separator + "results" +File.separator+ fileName,"images/images"+
  70. projectNum+"/"+ ConstantFileName.modelUUID+"_50k_texture_jpg_high1/"+fileName.replace("tex/", ""));
  71. }
  72. continue;
  73. }
  74. //high文件夹
  75. if(fileJson.getIntValue("clazz") == 3){
  76. map.put(path + File.separator + "results" +File.separator+ fileName,"images/images"+
  77. projectNum+"/pan/high/"+ fileName.replace("high/", ""));
  78. continue;
  79. }
  80. //low文件夹
  81. if(fileJson.getIntValue("clazz") == 4){
  82. map.put(path + File.separator + "results" +File.separator+ fileName,"images/images"+
  83. projectNum+"/pan/low/"+ fileName.replace("low/", ""));
  84. continue;
  85. }
  86. //tiles文件夹,亚马逊没有裁剪图片api,不需要上传4k图
  87. // if(fileJson.getIntValue("clazz") == 5 && !"s3".equals(ossType)){
  88. // map.put(path + File.separator + "results" + File.separator+ fileName,"images/images"+
  89. // projectNum+ File.separator + fileName);
  90. // continue;
  91. // }
  92. if(fileJson.getIntValue("clazz") == 5 ){
  93. map.put(path + File.separator + "results" + File.separator+ fileName,"images/images"+
  94. projectNum+ File.separator + fileName);
  95. continue;
  96. }
  97. //tiles文件夹,亚马逊瓦片图
  98. if(fileJson.getIntValue("clazz") == 7 ){
  99. if(fileName.contains("/4k_")){
  100. continue;
  101. }
  102. map.put(path + File.separator + "results" + File.separator+ fileName,"images/images"+
  103. projectNum+ File.separator + fileName);
  104. continue;
  105. }
  106. //updown文件复制一份到ecs中并去掉换行符
  107. if(fileJson.getIntValue("clazz") == 10){
  108. String updown = FileUtils.readFile(path + File.separator + "results" +File.separator+ fileName);
  109. JSONObject updownJson = JSONObject.parseObject(updown);
  110. FileUtils.writeFile(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + projectNum +
  111. File.separator + fileName.replace("updown", "mapping"), updownJson.toString());
  112. continue;
  113. }
  114. //video视频文件或封面图
  115. if(fileJson.getIntValue("clazz") == 11 || fileJson.getIntValue("cl" +
  116. "azz") == 12){
  117. map.put(path + File.separator + "results" + File.separator+ fileName,"video/video"+
  118. projectNum+ File.separator + fileName.replace("videos/", ""));
  119. if(fileName.contains(".mp4")){
  120. // CreateObjUtil.mp4ToFlv(path + File.separator + "results" + File.separator+ fileName,
  121. // path + File.separator + "results" + File.separator+ fileName.replace("mp4", "flv"));
  122. map.put(path + File.separator + "results" + File.separator+ fileName.replace("mp4", "flv"),"video/video"+
  123. projectNum+ File.separator + fileName.replace("videos/", "").replace("mp4", "flv"));
  124. }
  125. }
  126. //2048的模型和贴图
  127. if(fileJson.getIntValue("clazz") == 16){
  128. map.put(path + File.separator + "results" + File.separator+ fileName,"data/data"+
  129. projectNum+ File.separator + fileName);
  130. }
  131. if(fileJson.getIntValue("clazz") == 18){
  132. map.put(path + File.separator + "results" + File.separator+ fileName,"images/images"+
  133. projectNum+ File.separator + fileName);
  134. }
  135. }
  136. CreateObjUtil.convertTxtToDam( path + File.separator + "results" + File.separator+"tex"+File.separator+"modeldata.txt", path + File.separator + "results" +File.separator+ ConstantFileName.modelUUID+"_50k.dam");
  137. CreateObjUtil.convertDamToLzma(path + File.separator + "results");
  138. CreateObjUtil.convertTxtToDam( path + File.separator + "results" +File.separator+"tex"+File.separator+"modeldata.txt", path + File.separator + "results" + File.separator+ConstantFileName.modelUUID+"_50k.dam");
  139. //有meshfix,表示双模型
  140. if(!"".equals(meshfix)){
  141. CreateObjUtil.convertTxtToDam( path + File.separator + "results" + File.separator+meshfix, path + File.separator + "results" +File.separator+ ConstantFileName.modelUUID+"_50k2.dam");
  142. CreateObjUtil.convertDamToLzma2(path + File.separator + "results");
  143. CreateObjUtil.convertTxtToDam( path + File.separator + "results" +File.separator+meshfix, path + File.separator + "results" + File.separator+ConstantFileName.modelUUID+"_50k2.dam");
  144. map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k2.dam.lzma", "images/images"+projectNum+"/"+ConstantFileName.modelUUID+"_50k2.dam.lzma");
  145. map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k2.dam", "images/images"+projectNum+"/"+ConstantFileName.modelUUID+"_50k2.dam");
  146. }
  147. //8目相机有两个vision.txt因此第二个叫vision2.txt
  148. CreateObjUtil.convertTxtToVisionmodeldata(path + File.separator + "results" +File.separator+"vision.txt",path + File.separator + "results" +File.separator+"vision.modeldata");
  149. if(vision2){
  150. CreateObjUtil.convertTxtToVisionmodeldata(path + File.separator + "results" +File.separator+"vision2.txt",path + File.separator + "results" +File.separator+"vision2.modeldata");
  151. map.put(path + File.separator + "results" +File.separator+"vision2.modeldata", "images/images"+projectNum+"/"+"vision2.modeldata");
  152. }else {
  153. CreateObjUtil.convertTxtToVisionmodeldataCommon(path + File.separator + "results" +File.separator+"vision.txt",path + File.separator + "results" +File.separator+"vision.modeldata");
  154. }
  155. log.info("数据转换完成:"+projectNum);
  156. File file = new File(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam.lzma");
  157. while(!file.exists())
  158. {
  159. Thread.sleep(60000);
  160. }
  161. map.put(path + File.separator + "results" +File.separator+"vision.modeldata", "images/images"+projectNum+"/"+"vision.modeldata");
  162. map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam.lzma", "images/images"+projectNum+"/"+ConstantFileName.modelUUID+"_50k.dam.lzma");
  163. map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam", "images/images"+projectNum+"/"+ConstantFileName.modelUUID+"_50k.dam");
  164. file = new File(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+projectNum);
  165. if(!file.exists())
  166. {
  167. file.mkdir();
  168. }
  169. FileUtils.copyFile(path + File.separator + "results" +File.separator+"floor.json", ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+projectNum+File.separator+"floor.json", true);
  170. FileUtils.copyFile(path + File.separator + "results" +File.separator+"floorplan.json", ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+projectNum+File.separator+"floor.json", true);
  171. FileUtils.copyFile(path + File.separator + "results" +File.separator+"floorplan.json", ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+projectNum+File.separator+"floorplan.json", true);
  172. log.info("floor.json路径:"+ path + File.separator + "results" +File.separator+"floor.json");
  173. map.put(path + File.separator + "results" +File.separator+"floor.json","data/data"+projectNum+"/floor.json");
  174. map.put(path + File.separator + "results" +File.separator+"floorplan.json","data/data"+projectNum+"/floor.json");
  175. // map.put(path + File.separator + "results" +File.separator+"floorplan_cad.json","data/data"+projectNum+"/house_floor.json");
  176. map.put(path + File.separator + "results" +File.separator+"floorplan_cad.json","data/data"+projectNum+"/floorplan_cad.json");
  177. log.info("准备上传文件到oss:"+projectNum);
  178. return map;
  179. }
  180. /**
  181. * 标定算法
  182. * @param path
  183. * @throws Exception
  184. */
  185. public static Map<String,String> computerCalibration(String path) throws Exception{
  186. Map<String,String> map = new HashMap<String,String>();
  187. log.info("开始标定:" );
  188. //构建算法isModel去掉,因此改成空字符串
  189. CreateObjUtil.build3dModel(path, "");
  190. // CreateObjUtil.build3dModel(unicode, "");
  191. log.info("标定完成转换数据:" );
  192. boolean vision2 = false;
  193. //读取upload文件,检验需要上传的文件是否存在
  194. String uploadData = FileUtils.readFile(path + File.separator + "results" +File.separator+"upload.json");
  195. JSONObject uploadJson = null;
  196. JSONArray array = null;
  197. if(uploadData!=null) {
  198. uploadJson = JSONObject.parseObject(uploadData);
  199. array = uploadJson.getJSONArray("upload");
  200. }
  201. if(array == null){
  202. throw new Exception("upload.json数据出错");
  203. }
  204. JSONObject fileJson = null;
  205. String fileName = "";
  206. for(int i = 0, len = array.size(); i < len; i++) {
  207. fileJson = array.getJSONObject(i);
  208. fileName = fileJson.getString("file");
  209. //文件不存在抛出异常
  210. if (!new File(path + File.separator + "results" + File.separator + fileName).exists()) {
  211. throw new Exception(path + File.separator + "results" + File.separator + fileName + "文件不存在");
  212. }
  213. if(fileJson.getIntValue("clazz") == 13 || fileJson.getIntValue("clazz") == 14){
  214. map.put(path + File.separator + "results" +File.separator+ fileName,
  215. ConstantFilePath.OSS_PREFIX + path.replace(ConstantFilePath.BUILD_MODEL_PATH, "") +
  216. File.separator + fileName);
  217. }
  218. }
  219. return map;
  220. }
  221. public static void createJson(String path, String splitType, String skyboxType, String dataDescribe,
  222. String sceneNum, String dataSource) throws Exception{
  223. JSONObject projectJson = new JSONObject();
  224. projectJson.put("version", "201909231830");
  225. projectJson.put("protocol", "file api 1.4");
  226. projectJson.put("uuid", UUID.randomUUID().toString());
  227. projectJson.put("description", "");
  228. projectJson.put("time", System.currentTimeMillis());
  229. projectJson.put("category", "default");
  230. projectJson.put("tag", null);
  231. projectJson.put("status", null);
  232. projectJson.put("sceneNum", sceneNum);
  233. projectJson.put("dataSource", dataSource);
  234. FileUtils.writeFile(path + File.separator + "project.json", projectJson.toString());
  235. JSONObject dataJson = new JSONObject();
  236. dataJson.put("split_type", splitType);
  237. dataJson.put("skybox_type", skyboxType);
  238. // dataJson.put("data_describe", dataDescribe);
  239. dataJson.put("extras", null);
  240. FileUtils.writeFile(path + File.separator + "data.json", dataJson.toString());
  241. }
  242. public static Map<String, String> getTypeString(String cameraType, String algorithm, String resolution){
  243. Map<String, String> map = new HashMap<>();
  244. String splitType = "";
  245. String skyboxType = "";
  246. String dataDescribe = "";
  247. if(Integer.parseInt(cameraType) >= 4){
  248. if("0".equals(resolution)){
  249. // skyboxType = "SKYBOX_V4"; //tiles
  250. // skyboxType = "SKYBOX_V6"; //high,low,4k
  251. skyboxType = "SKYBOX_V7"; //high,low,2k
  252. }else {
  253. skyboxType = "SKYBOX_V1";
  254. }
  255. splitType = "SPLIT_V1";
  256. // skyboxType = "SKYBOX_V4"; //tiles
  257. dataDescribe = "double spherical";
  258. if(Integer.parseInt(cameraType) == 5 ){
  259. //新双目相机
  260. // skyboxType = "SKYBOX_V9";
  261. splitType = "SPLIT_V9";
  262. skyboxType = "SKYBOX_V1";
  263. }
  264. if(Integer.parseInt(cameraType) == 6){
  265. //小红屋新双目相机
  266. // skyboxType = "SKYBOX_V9";
  267. splitType = "SPLIT_V3";
  268. skyboxType = "SKYBOX_V7";
  269. }
  270. if(Integer.parseInt(cameraType) == 13){
  271. //转台相机
  272. skyboxType = "SKYBOX_V6";
  273. splitType = "SPLIT_V12";
  274. }
  275. if(Integer.parseInt(cameraType) == 14){
  276. //转台相机
  277. log.info("激光转台相机调用算法");
  278. skyboxType = "SKYBOX_V11";
  279. splitType = "SPLIT_V14";
  280. }
  281. }else {
  282. if("sfm".equals(algorithm)){
  283. splitType = "SPLIT_V2";
  284. skyboxType = "SKYBOX_V1";
  285. dataDescribe = "old sfm";
  286. }else {
  287. splitType = "SPLIT_V3";
  288. skyboxType = "SKYBOX_V1";
  289. dataDescribe = "old slam";
  290. }
  291. }
  292. map.put("splitType", splitType);
  293. map.put("skyboxType", skyboxType);
  294. map.put("dataDescribe", dataDescribe);
  295. return map;
  296. }
  297. }