package com.example.demo.util; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.util.StringUtil; import java.io.*; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; public class ConvertCadKjl { // public String path = "G:\\javaProject\\baidu-master\\floor.json"; // public String outpath = "G:\\javaProject\\baidu-master\\kjl.json"; public JSONObject input = null; public JSONObject output = null; //重复的墙要删除,这是他们id的映射关系,key表示删除墙的id,value表示重复的且最终留下的墙的id public JSONObject wallMapping = new JSONObject(); public final double minThickness = 0.01; //数据预处理,目前暂时处理点位坐标的吸附 //1、坐标吸附 public JSONObject preHandle(JSONObject json) { //坐标点 JSONArray vertexs = json.getJSONArray("vertex-xy"); for(int i=0;i0) { JSONArray furnColumns = input.getJSONArray("furnColumn"); //独立的柱子 result = getColumnsModule(furnColumns); } if(input.containsKey("furnFlue") && input.getJSONArray("furnFlue") != null && input.getJSONArray("furnFlue").size()>0) { JSONArray furnFlues = input.getJSONArray("furnFlue"); //独立的柱子 JSONArray columns = getColumnsModule(furnFlues); result.addAll(columns); } return result; } //柱子 //获取酷家乐里,key是flues的值,其实对应我们的是column字段 public JSONArray getFlues() { if(input == null) { return null; } //int id = 1; JSONArray result = new JSONArray(); if(input.containsKey("column") && input.getJSONArray("column") != null && input.getJSONArray("column").size()>0) { JSONArray columns = input.getJSONArray("column"); //非独立的柱子 for(int i=0;i0) { result = getItemsModule(input.getJSONArray("window"),"window"); } if(input.containsKey("door") && input.getJSONArray("door") != null && input.getJSONArray("door").size()>0) { JSONArray doors = getItemsModule(input.getJSONArray("door"),"door"); result.addAll(doors); } if(input.containsKey("slideDoor") && input.getJSONArray("slideDoor") != null && input.getJSONArray("slideDoor").size()>0) { JSONArray slideDoors = getItemsModule(input.getJSONArray("slideDoor"),"slideDoor"); result.addAll(slideDoors); } if(input.containsKey("groundCase") && input.getJSONArray("groundCase") != null && input.getJSONArray("groundCase").size()>0) { JSONArray groundCases = getItemsModule(input.getJSONArray("groundCase"),"groundCase"); result.addAll(groundCases); } if(input.containsKey("bayCase") && input.getJSONArray("bayCase") != null && input.getJSONArray("bayCase").size()>0) { JSONArray bayCases = getItemsModule(input.getJSONArray("bayCase"),"bayCase"); result.addAll(bayCases); } JSONArray points = input.getJSONArray("vertex-xy"); for(int i=0;i0) { for(int k=0;k0){ if(ctl.size()>0){ return "LEFT"; } //单开门 else{ if(dis1>dis2){ return "RIGHT_INVERSE"; } else{ return "LEFT"; } } } else{ if(ctl.size()>0){ return "RIGHT"; } //单开门 else{ if(dis1>dis2){ return "LEFT_INVERSE"; } else{ return "RIGHT"; } } } } public JSONArray getItemsModule(JSONArray holes,String type) { JSONArray result = new JSONArray(); for(int i=0;i getAverageValue(String visionPath) throws Exception{ Map map = new HashMap<>(); JSONObject visionJson = JSONObject.parseObject(FileUtils.readFile(visionPath)); JSONArray sweepLocations = visionJson.getJSONArray("sweepLocations"); double translationTotal = 0; double puckTotal = 0; for(int i = 0, len = sweepLocations.size(); i < len; i++){ translationTotal += sweepLocations.getJSONObject(i).getJSONObject("pose"). getJSONObject("translation").getDoubleValue("z"); puckTotal += sweepLocations.getJSONObject(i).getJSONObject("puck").getDoubleValue("z"); } map.put("translationAverage", translationTotal / sweepLocations.size()); map.put("puckAverage", puckTotal / sweepLocations.size()); return map; } public static Map getMaxOrMinValue(JSONObject visionJson) throws Exception{ Map map = new HashMap<>(); // JSONObject visionJson = JSONObject.parseObject(FileUtils.readFile(visionPath)); JSONArray vertexZ = visionJson.getJSONArray("vertex-z"); double[] vertexZArr = new double[vertexZ.size()]; if(vertexZ != null){ for(int i = 0, len = vertexZ.size(); i < len; i++){ vertexZArr[i] = vertexZ.getJSONObject(i).getDoubleValue("z"); } } map.put("translationAverage", getBubbleSortData(vertexZArr, 0)); map.put("puckAverage", getBubbleSortData(vertexZArr, 1)); // map.put("translationAverage", translationTotal / sweepLocations.size()); // map.put("puckAverage", puckTotal / sweepLocations.size()); return map; } /* public static JSONArray removeRepeat(JSONArray walls, AtomicBoolean removeAgain){ JSONArray repeat = new JSONArray(); JSONArray repeat2 = new JSONArray(); JSONObject object1 = new JSONObject(); JSONObject object2 = new JSONObject(); removeAgain.compareAndSet(true, false); //完全重复不删除的id,只删除前面的,留着后面的 Set ids = new HashSet<>(); System.out.println("wallsSize:" + walls.size()); for(int i = 0, len = walls.size(); i < len; i++){ for (int j = 0, lem = walls.size(); j < lem; j++){ if(i != j){ object1 = walls.getJSONObject(i); object2 = walls.getJSONObject(j); if(ids.contains(object1.getLong("id"))){ continue; } if(object1.getJSONObject("end").getDoubleValue("x") == object2.getJSONObject("end").getDoubleValue("x") && object1.getJSONObject("end").getDoubleValue("y") == object2.getJSONObject("end").getDoubleValue("y") && object1.getJSONObject("start").getDoubleValue("x") == object2.getJSONObject("start").getDoubleValue("x") && object1.getJSONObject("start").getDoubleValue("y") == object2.getJSONObject("start").getDoubleValue("y") ){ System.out.println("相同obj1:" + object1.toJSONString()); System.out.println("相同obj2:" + object2.toJSONString()); repeat.add(object1); ids.add(object2.getLong("id")); } if(object1.getJSONObject("end").getDoubleValue("x") == object2.getJSONObject("start").getDoubleValue("x") && object1.getJSONObject("end").getDoubleValue("y") == object2.getJSONObject("start").getDoubleValue("y") && object1.getJSONObject("start").getDoubleValue("x") == object2.getJSONObject("end").getDoubleValue("x") && object1.getJSONObject("start").getDoubleValue("y") == object2.getJSONObject("end").getDoubleValue("y") ){ System.out.println("相似obj1:" + object1.toJSONString()); System.out.println("相似obj2:" + object2.toJSONString()); if(!repeat2.contains(object1)){ if(repeat.contains(object1)){ removeAgain.set(true); } repeat.add(object1); repeat2.add(object2); } } // System.out.println("obj1:" + object1.toJSONString()); // System.out.println("obj2:" + object2.toJSONString()); } } } System.out.println("repeatSize: "+ repeat.size()); System.out.println("repeat: "+ repeat.toJSONString()); walls.removeAll(repeat); System.out.println("newWallsSize1: "+ walls.size()); return walls; } */ public JSONArray removeRepeat(JSONArray walls){ JSONArray result = new JSONArray(); for(int i=0;i arr[j+1]){ double temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } if(type == 1){ return arr[arr.length - 1]; } return arr[0]; } public static void main(String args[]) throws Exception { // Map map = getMaxOrMinValue("F:\\桌面\\c11m-T11-EA\\vision.txt"); // System.out.println("bottom:" + map.get("translationAverage")); // System.out.println("top:" + map.get("puckAverage")); ConvertCadKjl cad = new ConvertCadKjl(); String data = FileUtils.readFile("D:\\floor.json"); JSONObject inputJson = null; JSONArray inputArray = null; Map map = null; if(StringUtil.isNotEmpty(data)){ inputJson = JSON.parseObject(data); if(inputJson.containsKey("floors")){ JSONObject resultJson = new JSONObject(); JSONArray resultArray = new JSONArray(); inputArray = inputJson.getJSONArray("floors"); for(int i = 0, len = inputArray.size(); i < len; i++){ cad = new ConvertCadKjl(); cad.init(inputArray.getJSONObject(i)); cad.input = cad.preHandle(cad.input); JSONArray beams = cad.getBeams(); JSONArray walls = cad.getWalls(); walls = cad.removeRepeat(walls); //判断是否需要重复出去墙 // AtomicBoolean removeAgain = new AtomicBoolean(false); //去除重复的墙 /* walls = removeRepeat(walls, removeAgain); while (removeAgain.get()){ //再去除一遍重复的墙,防止有多次重复的墙剩下 walls = removeRepeat(walls, removeAgain); } */ // walls = removeRepeat(walls); JSONArray rooms = cad.getRooms(); JSONArray flues = cad.getFlues(); JSONArray holes = cad.getHoles(); cad.output.put("holes", holes); cad.output.put("flues", flues); cad.output.put("beams", beams); cad.output.put("rooms", rooms); cad.output.put("walls", walls); // if(map != null){ // JSONObject scene = new JSONObject(); // scene.put("bottom", map.get("puckAverage")); // scene.put("top", map.get("puckAverage") == null? null : map.get("puckAverage") + 2.7); // cad.output.put("scene", scene); // } map = ConvertCadKjl.getMaxOrMinValue(inputArray.getJSONObject(i)); if(map != null){ JSONObject scene = new JSONObject(); scene.put("bottom", map.get("translationAverage")); scene.put("top", map.get("puckAverage") == null? null : map.get("puckAverage")); cad.output.put("scene", scene); } // cad.output.put("version", floorPublishVer); resultArray.add(cad.output); } resultJson.put("floors", resultArray); writeBinary(resultJson.toString().getBytes(), "F:\\文档\\WeChat Files\\Iove-bing\\FileStorage\\File\\2021-01\\kjl.json"); }else { cad.init(inputJson); cad.input = cad.preHandle(cad.input); JSONArray beams = cad.getBeams(); JSONArray walls = cad.getWalls(); walls = cad.removeRepeat(walls); //判断是否需要重复出去墙 // AtomicBoolean removeAgain = new AtomicBoolean(false); //去除重复的墙 /* walls = removeRepeat(walls, removeAgain); while (removeAgain.get()){ //再去除一遍重复的墙,防止有多次重复的墙剩下 walls = removeRepeat(walls, removeAgain); } */ // walls = removeRepeat(walls); JSONArray rooms = cad.getRooms(); JSONArray flues = cad.getFlues(); JSONArray holes = cad.getHoles(); cad.output.put("holes", holes); cad.output.put("flues", flues); cad.output.put("beams", beams); cad.output.put("rooms", rooms); cad.output.put("walls", walls); map = ConvertCadKjl.getMaxOrMinValue(inputJson); if(map != null){ JSONObject scene = new JSONObject(); scene.put("bottom", map.get("translationAverage")); scene.put("top", map.get("puckAverage") == null? null : map.get("puckAverage")); cad.output.put("scene", scene); } writeBinary(cad.output.toString().getBytes(), "F:\\文档\\WeChat Files\\Iove-bing\\FileStorage\\File\\2021-01\\kjl.json"); } } // ConvertCadKjl cad = new ConvertCadKjl(); // cad.init("G:\\javaProject\\baidu-master\\floor.json"); // cad.input = cad.preHandle(cad.input); // JSONArray walls = cad.getWalls(); // System.out.println(walls.toJSONString()); // double[] arr = new double[]{-12,3,2,34,5,8,1}; // System.out.println(getBubbleSortData(arr, 1)); } }