Browse Source

添加马赛克逻辑

tianboguang 3 years ago
parent
commit
d9fa72a60d

+ 6 - 0
4dkankan-scene/src/main/java/com/fdkankan/scene/entity/SceneProEntity.java

@@ -162,4 +162,10 @@ public class SceneProEntity extends BaseEntity implements Serializable {
      */
      */
     @Transient
     @Transient
     private String mqMsg;
     private String mqMsg;
+
+    /**
+     * 马赛克数据数组
+     */
+    @Column(name = "mosaics")
+    private String mosaics;
 }
 }

+ 2 - 0
4dkankan-scene/src/main/java/com/fdkankan/scene/service/ISceneProService.java

@@ -163,4 +163,6 @@ public interface ISceneProService extends IBaseService<SceneProEntity, Long> {
 
 
     Integer findFolderIdScence(Long folderId, Long userId);
     Integer findFolderIdScence(Long folderId, Long userId);
 
 
+    public Result uploadROIImage(String sceneNum, String mosaics) throws Exception ;
+
 }
 }

+ 210 - 1
4dkankan-scene/src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java

@@ -3,6 +3,7 @@ package com.fdkankan.scene.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.fdkankan.base.aop.SystemServiceLog;
 import com.fdkankan.base.aop.SystemServiceLog;
 import com.fdkankan.base.constant.LoginConstant;
 import com.fdkankan.base.constant.LoginConstant;
 import com.fdkankan.base.constant.SceneConstant;
 import com.fdkankan.base.constant.SceneConstant;
@@ -42,6 +43,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.commons.CommonsMultipartFile;
 import org.springframework.web.multipart.commons.CommonsMultipartFile;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Condition;
@@ -2102,7 +2104,26 @@ public class SceneProServiceImpl extends BaseServiceImpl<SceneProEntity, Long> i
                 }
                 }
                 FileUtils.deleteDirectory(target + File.separator + "extras/video/");
                 FileUtils.deleteDirectory(target + File.separator + "extras/video/");
             }
             }
-
+            // 清除马赛克数据
+            if(scenejson.containsKey("planId")){
+                String[] planIds = scenejson.getString("planId").split(",");
+                String mosaicDatasTr = sceneProEntity.getMosaics();
+                JSONArray jsonArray = new JSONArray();
+                if(!ObjectUtils.isEmpty(mosaicDatasTr)){
+                    jsonArray = JSONArray.parseArray(mosaicDatasTr);
+                }
+                for (String planId : planIds) {
+                    for (Iterator<Object> iterator = jsonArray.iterator(); iterator.hasNext(); ) {
+                        JSONObject data = (JSONObject)iterator.next();
+                        if(StringUtils.equals(data.getString("panoId"),planId)){
+                            iterator.remove();
+                        }
+                    }
+                }
+                sceneProEntity.setMosaics(JSON.toJSONString(jsonArray,SerializerFeature.DisableCircularReferenceDetect));
+                scenejson.remove("planId");
+                scenejson.put("mosaics",JSON.toJSONString(jsonArray,SerializerFeature.DisableCircularReferenceDetect));
+            }
             scenejson.put("imagesVersion", sceneProEditEntity.getImagesVersion() + 1);
             scenejson.put("imagesVersion", sceneProEditEntity.getImagesVersion() + 1);
             scenejson.put("buildImages", 0);
             scenejson.put("buildImages", 0);
             sceneProEditEntity.setImagesVersion(sceneProEditEntity.getImagesVersion() + 1);
             sceneProEditEntity.setImagesVersion(sceneProEditEntity.getImagesVersion() + 1);
@@ -3538,6 +3559,11 @@ public class SceneProServiceImpl extends BaseServiceImpl<SceneProEntity, Long> i
         }
         }
 
 
         scenejson.put("buildImages", 1);
         scenejson.put("buildImages", 1);
+        if(scenejson.containsKey("planId")){
+            scenejson.put("planId",scenejson.getString("planId").concat(","+planId));
+        }else{
+            scenejson.put("planId",planId);
+        }
         FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
         FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
 
 
         return Result.success();
         return Result.success();
@@ -4340,6 +4366,189 @@ public class SceneProServiceImpl extends BaseServiceImpl<SceneProEntity, Long> i
         return sceneProMapper.findFolderIdScence(folderId,userId);
         return sceneProMapper.findFolderIdScence(folderId,userId);
     }
     }
 
 
+    @Override
+    public Result uploadROIImage(String sceneNum, String mosaics) throws Exception {
+        if(StringUtils.isEmpty(sceneNum) || StringUtils.isEmpty(mosaics)){
+            throw new BaseRuntimeException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
+        }
+        log.info("uploadROIImage 参数:{},{}",sceneNum,mosaics);
+
+        JSONArray mosaicDatas = JSONArray.parseArray(mosaics);
+        if (mosaicDatas.size() > 1) {
+            throw new BaseRuntimeException(SceneConstant.FAILURE_CODE_5012, "只支持上传一个马赛克数据");
+        }
+        JSONObject mosicData = mosaicDatas.getJSONObject(0);
+
+        SceneProEntity sceneProEntity = sceneProMapper.findByNum(sceneNum);
+        if(sceneProEntity == null){
+            throw new BaseRuntimeException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
+        }
+
+        StringBuffer dataBuf = new StringBuffer().append("data").append(File.separator)
+                .append("data").append(sceneProEntity.getNum()).append(File.separator);
+
+        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
+
+
+        String path = sceneProEntity.getDataSource();
+
+        if(!ObjectUtils.isEmpty(path) && path.startsWith("http")){
+            path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2];
+        }
+        String target = path + "_roi";
+
+        FileUtils.deleteDirectory(target);
+
+        //文件上传的位置可以自定义
+        String filePath = target + File.separator + "extras" + File.separator + "images/";
+        File imageFile = new File(filePath);
+        if(!imageFile.getParentFile().exists()){
+            imageFile.getParentFile().mkdirs();
+        }
+
+        FileUtils.copyFolderAllFiles(path + "/caches/images/", filePath, true);
+
+        String mosaicDatasTr = sceneProEntity.getMosaics();
+        JSONArray jsonArray = new JSONArray();
+        if(!ObjectUtils.isEmpty(mosaicDatasTr)){
+            jsonArray = JSONArray.parseArray(mosaicDatasTr);
+        }
+        jsonArray.add(mosicData);
+
+        // 更新 scene.json
+        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
+        JSONObject scenejson = new JSONObject();
+        if(strsceneInfos!=null) {
+            scenejson = JSONObject.parseObject(strsceneInfos);
+        }
+        scenejson.put("mosaics",JSON.toJSONString(jsonArray, SerializerFeature.DisableCircularReferenceDetect));
+        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toJSONString());
+
+        // 准备算法数据
+        List<JSONObject> params = new ArrayList<>();
+        for(int i = 0, len = jsonArray.size(); i < len; i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            boolean contains = false;
+            for (JSONObject param : params) {
+                if(StringUtils.equals(param.getString("panoId"),jsonObject.getString("panoId"))){
+                    contains = true;
+                    param.getJSONArray("rect").addAll(jsonObject.getJSONArray("rect"));
+                }
+            }
+            if(!contains){
+                params.add(jsonObject);
+            }
+        }
+        JSONObject roiImageJSon = new JSONObject();
+        roiImageJSon.put("batch",params);
+
+        FileUtils.writeFile(target + File.separator + "extras" + File.separator + "image-ROI.json", JSON.toJSONString(roiImageJSon,SerializerFeature.DisableCircularReferenceDetect));
+
+        FileUtils.copyFile(sceneProEntity.getDataSource() + File.separator + "results/vision.txt", target + File.separator+"extras/vision.txt", true);
+        FileUtils.copyFile(sceneProEntity.getDataSource() + File.separator + "results/vision2.txt", target + File.separator+"extras/vision2.txt", true);
+
+        FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true);
+
+        String data = FileUtils.readFile(target + File.separator+"data.json");
+        if(data != null){
+            JSONObject floorplanJson = new JSONObject();
+            floorplanJson.put("has_source_images", true);
+            floorplanJson.put("has_vision_txt", true);
+
+            JSONObject dataJson = JSONObject.parseObject(data);
+            dataJson.put("extras", floorplanJson);
+            //V5表示不需要生成high,low文件
+            dataJson.put("skybox_type", "SKYBOX_V6");
+            if(sceneProEntity.getSceneScheme() == 11){
+                dataJson.put("skybox_type", "SKYBOX_V7");
+            }
+            dataJson.put("split_type", "SPLIT_V18");
+            //sceneScheme为3切成瓦片图
+            if(sceneProEntity.getSceneScheme() == 3){
+                dataJson.put("skybox_type", "SKYBOX_V4");
+            }
+            FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8"));
+        }
+
+        FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true);
+
+        //进行计算
+        log.info("马赛克:开始建模——" + sceneProEntity.getNum());
+        CreateObjUtil.build3dModel2(target , "1");
+
+        //读取upload文件,检验需要上传的文件是否存在
+        String uploadData = FileUtils.readFile(target + File.separator + "results" +File.separator+"upload.json");
+        JSONObject uploadJson = null;
+        JSONArray array = null;
+        if(uploadData!=null) {
+            uploadJson = JSONObject.parseObject(uploadData);
+            array = uploadJson.getJSONArray("upload");
+        }
+        if(array == null){
+            throw new Exception("upload.json数据出错");
+        }
+        Map<String,String> map = new HashMap<String,String>();
+        JSONObject fileJson = null;
+        String fileName = "";
+        for(int i = 0, len = array.size(); i < len; i++){
+            fileJson = array.getJSONObject(i);
+            fileName = fileJson.getString("file");
+            //文件不存在抛出异常
+            if(!new File(target + File.separator + "results" +File.separator + fileName).exists()){
+                throw new Exception(target + File.separator + "results" +File.separator + fileName+"文件不存在");
+            }
+
+            //high文件夹
+            if(fileJson.getIntValue("clazz") == 3){
+                map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+
+                        sceneProEntity.getNum()+"/pan/high/"+ fileName.replace("high/", ""));
+            }
+            //low文件夹
+            if(fileJson.getIntValue("clazz") == 4){
+                map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+
+                        sceneProEntity.getNum()+"/pan/low/"+ fileName.replace("low/", ""));
+            }
+
+            //tiles文件夹,亚马逊没有裁剪图片api,不需要上传4k图
+            if(fileJson.getIntValue("clazz") == 5){
+                map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
+                        sceneProEntity.getNum()+ File.separator + fileName);
+            }
+
+            //tiles文件夹,亚马逊瓦片图
+            if(fileJson.getIntValue("clazz") == 7 ){
+                map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
+                        sceneProEntity.getNum()+ File.separator + fileName);
+            }
+        }
+
+        for(String imagesName : imageFile.list()){
+            //覆盖原始图片资源
+            FileUtils.copyFile(target + File.separator + "extras/images/" + imagesName,
+                    path + File.separator + "caches/images/" + imagesName, true);
+            FileUtils.deleteFile(target + File.separator + "extras/images/" + imagesName);
+        }
+
+        uploadToOssUtil.uploadMulFiles(map);
+
+        scenejson.put("imagesVersion", scenejson.getIntValue("imagesVersion") + 1);
+
+        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
+
+        SceneProEditEntity sceneProEditEntity = sceneProEditMapper.findByProId(sceneProEntity.getId());
+        if(sceneProEditEntity != null){
+            sceneProEditEntity.setImagesVersion(sceneProEditEntity.getImagesVersion() + 1);
+            sceneProEditMapper.updateByPrimaryKey(sceneProEditEntity);
+        }
+
+        sceneProEntity.setMosaics(JSON.toJSONString(jsonArray,SerializerFeature.DisableCircularReferenceDetect));
+        update(sceneProEntity);
+
+        Map<String,Object> result = new HashMap<>(1);
+        result.put("mosaics",jsonArray);
+
+        return Result.success(result);
+    }
 
 
     public static void main(String[] args) {
     public static void main(String[] args) {
         try {
         try {

+ 9 - 0
4dkankan-web/src/main/java/com/fdkankan/web/controller/SceneEditController.java

@@ -1109,6 +1109,15 @@ public class SceneEditController extends BaseController {
     }
     }
 
 
     /**
     /**
+     * 上传绿幕抠图视频
+     */
+    @CheckCurrentUser(description = "马赛克")
+    @RequestMapping(value = "/uploadROIImage", method = RequestMethod.POST)
+    public Result uploadROIImage(@RequestBody SceneProEntity sceneProEntity) throws Exception {
+        return sceneProService.uploadROIImage(sceneProEntity.getNum(), sceneProEntity.getMosaics());
+    }
+
+    /**
      * 删除绿幕抠图视频
      * 删除绿幕抠图视频
      */
      */
     @ApiOperation("删除绿幕抠图视频")
     @ApiOperation("删除绿幕抠图视频")