|
@@ -0,0 +1,478 @@
|
|
|
+package com.fdkk.sxz.util;
|
|
|
+
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+
|
|
|
+import java.io.*;
|
|
|
+import java.util.Iterator;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+
|
|
|
+public class readFloorplan {
|
|
|
+
|
|
|
+ private static String filePath = "F:\\2021\\����װ\\house.json";
|
|
|
+ private static String version = "2.0";
|
|
|
+ private static String outputPath = "F:\\2021\\����װ\\cad\\house2.json";
|
|
|
+
|
|
|
+ public static JSONObject inputFile() {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String args[]) {
|
|
|
+
|
|
|
+ try {
|
|
|
+ readFloorplan m_readFloorplan = new readFloorplan();
|
|
|
+ JSONObject cad = m_readFloorplan.readFile(m_readFloorplan.filePath);
|
|
|
+ JSONArray floors = cad.getJSONArray("floors");
|
|
|
+ floors = m_readFloorplan.analysisCad(floors);
|
|
|
+ JSONObject data = new JSONObject();
|
|
|
+ data.put("floors", floors);
|
|
|
+ data.put("version", readFloorplan.version);
|
|
|
+ readFloorplan.writeFile(readFloorplan.outputPath, data.toString());
|
|
|
+ System.out.println();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public JSONObject analysisCadJsonObj(JSONArray floors) {
|
|
|
+
|
|
|
+ JSONArray jsonArray = analysisCad(floors);
|
|
|
+ JSONObject V2data = new JSONObject();
|
|
|
+ V2data.put("floors", jsonArray);
|
|
|
+ V2data.put("version", readFloorplan.version);
|
|
|
+ return V2data;
|
|
|
+ }
|
|
|
+
|
|
|
+ public JSONArray analysisCad(JSONArray floors) {
|
|
|
+
|
|
|
+ JSONArray floorplan = new JSONArray();
|
|
|
+ for (int i = 0; i < floors.size(); ++i) {
|
|
|
+
|
|
|
+ JSONObject item = new JSONObject();
|
|
|
+
|
|
|
+ JSONObject floor = floors.getJSONObject(i);
|
|
|
+
|
|
|
+ JSONArray doors = floor.getJSONArray("door");
|
|
|
+ JSONArray slideDoors = floor.getJSONArray("slideDoor");
|
|
|
+ JSONArray doubleDoors = floor.getJSONArray("doubleDoor");
|
|
|
+
|
|
|
+ JSONArray windows = floor.getJSONArray("window");
|
|
|
+ JSONArray bayCases = floor.getJSONArray("bayCase");
|
|
|
+ JSONArray frenchWindows = floor.getJSONArray("groundCase");
|
|
|
+
|
|
|
+ doors = createSymbols(doors, "door");
|
|
|
+ slideDoors = createSymbols(slideDoors, "slideDoor");
|
|
|
+ doubleDoors = createSymbols(doubleDoors, "doubleDoor");
|
|
|
+
|
|
|
+ windows = createSymbols(windows, "window");
|
|
|
+ bayCases = createSymbols(bayCases, "bayCase");
|
|
|
+ frenchWindows = createSymbols(frenchWindows, "groundCase");
|
|
|
+
|
|
|
+ JSONArray beams = floor.getJSONArray("furnColumn");
|
|
|
+ beams = createBeams(beams);
|
|
|
+
|
|
|
+ JSONArray flues = floor.getJSONArray("furnFlue");
|
|
|
+ flues = createFlues(flues);
|
|
|
+
|
|
|
+ JSONArray vertexs = floor.getJSONArray("vertex");
|
|
|
+ vertexs = createPoints(vertexs);
|
|
|
+
|
|
|
+ JSONArray walls = floor.getJSONArray("wall");
|
|
|
+ walls = createWalls(walls);
|
|
|
+
|
|
|
+ vertexs = updatePointsParent(vertexs, walls);
|
|
|
+
|
|
|
+ JSONArray symbols = new JSONArray();
|
|
|
+ for (int j = 0; j < doors.size(); ++j) {
|
|
|
+ JSONObject door = doors.getJSONObject(j);
|
|
|
+ symbols.add(door);
|
|
|
+ }
|
|
|
+ for (int j = 0; j < slideDoors.size(); ++j) {
|
|
|
+ JSONObject slideDoor = slideDoors.getJSONObject(j);
|
|
|
+ symbols.add(slideDoor);
|
|
|
+ }
|
|
|
+ for (int j = 0; j < doubleDoors.size(); ++j) {
|
|
|
+ JSONObject doubleDoor = doubleDoors.getJSONObject(j);
|
|
|
+ symbols.add(doubleDoor);
|
|
|
+ }
|
|
|
+ for (int j = 0; j < windows.size(); ++j) {
|
|
|
+ JSONObject window = windows.getJSONObject(j);
|
|
|
+ symbols.add(window);
|
|
|
+ }
|
|
|
+ for (int j = 0; j < bayCases.size(); ++j) {
|
|
|
+ JSONObject bayCase = bayCases.getJSONObject(j);
|
|
|
+ symbols.add(bayCase);
|
|
|
+ }
|
|
|
+ for (int j = 0; j < frenchWindows.size(); ++j) {
|
|
|
+ JSONObject frenchWindow = frenchWindows.getJSONObject(j);
|
|
|
+ symbols.add(frenchWindow);
|
|
|
+ }
|
|
|
+
|
|
|
+ item.put("points", vertexs);
|
|
|
+ item.put("walls", walls);
|
|
|
+ item.put("symbols", symbols);
|
|
|
+ item.put("flues", flues);
|
|
|
+ item.put("beams", beams);
|
|
|
+
|
|
|
+ floorplan.add(item);
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONObject V2data = new JSONObject();
|
|
|
+ V2data.put("floors", floors);
|
|
|
+ V2data.put("version", readFloorplan.version);
|
|
|
+
|
|
|
+ return floorplan;
|
|
|
+ }
|
|
|
+
|
|
|
+ private JSONArray createPoints(JSONArray vertexs) {
|
|
|
+ if (vertexs == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONArray result = new JSONArray();
|
|
|
+ for (int i = 0; i < vertexs.size(); ++i) {
|
|
|
+ JSONObject vertex = vertexs.getJSONObject(i);
|
|
|
+ JSONObject item = new JSONObject();
|
|
|
+ item.put("x", vertex.getDouble("x"));
|
|
|
+ item.put("y", vertex.getDouble("y"));
|
|
|
+ item.put("vectorId", "Point" + vertex.getString("id"));
|
|
|
+ result.add(item);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private JSONArray createWalls(JSONArray walls) {
|
|
|
+ if (walls == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONArray result = new JSONArray();
|
|
|
+ for (int i = 0; i < walls.size(); ++i) {
|
|
|
+ JSONObject wall = walls.getJSONObject(i);
|
|
|
+
|
|
|
+ JSONObject item = new JSONObject();
|
|
|
+ item.put("start", "Point" + wall.getInteger("p1"));
|
|
|
+ item.put("end", "Point" + wall.getInteger("p2"));
|
|
|
+ item.put("vectorId", "Wall" + wall.getString("id"));
|
|
|
+ if (wall.getBoolean("border")) {
|
|
|
+ item.put("border", 1);
|
|
|
+ } else {
|
|
|
+ item.put("border", 0);
|
|
|
+ }
|
|
|
+ result.add(item);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private JSONArray updatePointsParent(JSONArray points, JSONArray walls) {
|
|
|
+ JSONObject jsonPoints = new JSONObject();
|
|
|
+ for (int i = 0; i < points.size(); ++i) {
|
|
|
+ JSONObject point = points.getJSONObject(i);
|
|
|
+ jsonPoints.put(point.getString("vectorId"), point);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < walls.size(); ++i) {
|
|
|
+ JSONObject wall = walls.getJSONObject(i);
|
|
|
+
|
|
|
+ String startPointId = wall.getString("start");
|
|
|
+ String endPointId = wall.getString("end");
|
|
|
+ String wallId = wall.getString("vectorId");
|
|
|
+
|
|
|
+ JSONObject start = jsonPoints.getJSONObject(startPointId);
|
|
|
+ JSONObject end = jsonPoints.getJSONObject(endPointId);
|
|
|
+
|
|
|
+ JSONObject startParent = start.getJSONObject("parent");
|
|
|
+ if (!startParent.isEmpty()) {
|
|
|
+ startParent.put(wallId, "start");
|
|
|
+ } else {
|
|
|
+ startParent = new JSONObject();
|
|
|
+ startParent.put(wallId, "start");
|
|
|
+ }
|
|
|
+ start.put("parent", startParent);
|
|
|
+
|
|
|
+ JSONObject endParent = end.getJSONObject("parent");
|
|
|
+ if (!endParent.isEmpty()) {
|
|
|
+ endParent.put(wallId, "end");
|
|
|
+ } else {
|
|
|
+ endParent = new JSONObject();
|
|
|
+ endParent.put(wallId, "end");
|
|
|
+ }
|
|
|
+ end.put("parent", endParent);
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONArray result = new JSONArray();
|
|
|
+
|
|
|
+ Iterator iter = jsonPoints.entrySet().iterator();
|
|
|
+ while (iter.hasNext()) {
|
|
|
+ Map.Entry entry = (Map.Entry) iter.next();
|
|
|
+ result.add(entry.getValue());
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private JSONArray createSymbols(JSONArray symbols, String geoType) {
|
|
|
+ if (symbols == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONArray result = new JSONArray();
|
|
|
+
|
|
|
+ for (int i = 0; i < symbols.size(); ++i) {
|
|
|
+
|
|
|
+ JSONObject item = new JSONObject();
|
|
|
+
|
|
|
+ JSONObject symbol = symbols.getJSONObject(i);
|
|
|
+
|
|
|
+ int parent = symbol.getInteger("line");
|
|
|
+
|
|
|
+ JSONArray pos = symbol.getJSONArray("pos");
|
|
|
+ JSONObject start = new JSONObject();
|
|
|
+ start.put("x", pos.getDouble(0));
|
|
|
+ start.put("y", pos.getDouble(1));
|
|
|
+ JSONObject end = new JSONObject();
|
|
|
+ end.put("x", pos.getDouble(2));
|
|
|
+ end.put("y", pos.getDouble(3));
|
|
|
+
|
|
|
+ JSONArray points = new JSONArray();
|
|
|
+
|
|
|
+ if (geoType.equals("door")) {
|
|
|
+ JSONArray ctl = symbol.getJSONArray("ctl");
|
|
|
+ JSONObject dirPoint = new JSONObject();
|
|
|
+ dirPoint.put("x", ctl.getDouble(0));
|
|
|
+ dirPoint.put("y", ctl.getDouble(1));
|
|
|
+
|
|
|
+ double dis1 = distance(start, dirPoint);
|
|
|
+ double dis2 = distance(end, dirPoint);
|
|
|
+ if (dis1 > dis2) {
|
|
|
+ JSONObject temp = start;
|
|
|
+ start = end;
|
|
|
+ end = temp;
|
|
|
+ }
|
|
|
+
|
|
|
+ points.add(start);
|
|
|
+ points.add(end);
|
|
|
+ points.add(dirPoint);
|
|
|
+ boolean flag = this.isClockwise(points);
|
|
|
+ if (flag) {
|
|
|
+ //left
|
|
|
+ item.put("openSide", "LEFT");
|
|
|
+ } else {
|
|
|
+ //right
|
|
|
+ item.put("openSide", "RIGHT");
|
|
|
+ }
|
|
|
+ item.put("geoType", "SingleDoor");
|
|
|
+ } else if (geoType.equals("doubleDoor")) {
|
|
|
+ item.put("geoType", "DoubleDoor");
|
|
|
+ } else if (geoType.equals("slideDoor")) {
|
|
|
+ item.put("geoType", "SlideDoor");
|
|
|
+ } else if (geoType.equals("window")) {
|
|
|
+ item.put("geoType", "SingleWindow");
|
|
|
+ } else if (geoType.equals("groundCase")) {
|
|
|
+ item.put("geoType", "FrenchWindow");
|
|
|
+ } else if (geoType.equals("bayCase")) {
|
|
|
+ JSONArray ctl = symbol.getJSONArray("ctl");
|
|
|
+ points.add(start);
|
|
|
+ points.add(end);
|
|
|
+
|
|
|
+ JSONObject point1 = new JSONObject();
|
|
|
+ point1.put("x", ctl.getDouble(0));
|
|
|
+ point1.put("y", ctl.getDouble(1));
|
|
|
+
|
|
|
+ JSONObject point2 = new JSONObject();
|
|
|
+ point2.put("x", ctl.getDouble(2));
|
|
|
+ point2.put("y", ctl.getDouble(3));
|
|
|
+
|
|
|
+ points.add(point1);
|
|
|
+ points.add(point2);
|
|
|
+
|
|
|
+ boolean flag = this.isClockwise(points);
|
|
|
+ if (flag) {
|
|
|
+ //left
|
|
|
+ item.put("openSide", "LEFT");
|
|
|
+ } else {
|
|
|
+ //right
|
|
|
+ item.put("openSide", "RIGHT");
|
|
|
+ }
|
|
|
+ item.put("geoType", "BayWindow");
|
|
|
+ }
|
|
|
+
|
|
|
+ item.put("start", start);
|
|
|
+ item.put("end", end);
|
|
|
+ item.put("parent", parent);
|
|
|
+
|
|
|
+ result.add(item);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private JSONArray createBeams(JSONArray beams) {
|
|
|
+
|
|
|
+ if (beams == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONArray result = new JSONArray();
|
|
|
+
|
|
|
+ for (int i = 0; i < beams.size(); ++i) {
|
|
|
+ JSONObject item = new JSONObject();
|
|
|
+ JSONObject beam = beams.getJSONObject(i);
|
|
|
+ JSONArray pos = beam.getJSONArray("pos");
|
|
|
+
|
|
|
+ JSONObject point1 = new JSONObject();
|
|
|
+ point1.put("x", pos.getDouble(0));
|
|
|
+ point1.put("y", pos.getDouble(1));
|
|
|
+
|
|
|
+ JSONObject point2 = new JSONObject();
|
|
|
+ point2.put("x", pos.getDouble(2));
|
|
|
+ point2.put("y", pos.getDouble(3));
|
|
|
+
|
|
|
+ JSONObject point3 = new JSONObject();
|
|
|
+ point3.put("x", pos.getDouble(4));
|
|
|
+ point3.put("y", pos.getDouble(5));
|
|
|
+
|
|
|
+ JSONObject point4 = new JSONObject();
|
|
|
+ point4.put("x", pos.getDouble(6));
|
|
|
+ point4.put("y", pos.getDouble(7));
|
|
|
+
|
|
|
+ JSONArray points = new JSONArray();
|
|
|
+ points.add(point1);
|
|
|
+ points.add(point2);
|
|
|
+ points.add(point3);
|
|
|
+ points.add(point4);
|
|
|
+ int angle = beam.getInteger("angle");
|
|
|
+ angle += 90;
|
|
|
+ if (angle > 360) {
|
|
|
+ angle -= 360;
|
|
|
+ }
|
|
|
+ item.put("points", points);
|
|
|
+ item.put("angle", angle);
|
|
|
+ result.add(item);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private JSONArray createFlues(JSONArray flues) {
|
|
|
+
|
|
|
+ if (flues == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONArray result = new JSONArray();
|
|
|
+
|
|
|
+ for (int i = 0; i < flues.size(); ++i) {
|
|
|
+ JSONObject item = new JSONObject();
|
|
|
+ JSONObject flue = flues.getJSONObject(i);
|
|
|
+ JSONArray pos = flue.getJSONArray("pos");
|
|
|
+
|
|
|
+ JSONObject point1 = new JSONObject();
|
|
|
+ point1.put("x", pos.getDouble(0));
|
|
|
+ point1.put("y", pos.getDouble(1));
|
|
|
+
|
|
|
+ JSONObject point2 = new JSONObject();
|
|
|
+ point2.put("x", pos.getDouble(2));
|
|
|
+ point2.put("y", pos.getDouble(3));
|
|
|
+
|
|
|
+ JSONObject point3 = new JSONObject();
|
|
|
+ point3.put("x", pos.getDouble(4));
|
|
|
+ point3.put("y", pos.getDouble(5));
|
|
|
+
|
|
|
+ JSONObject point4 = new JSONObject();
|
|
|
+ point4.put("x", pos.getDouble(6));
|
|
|
+ point4.put("y", pos.getDouble(7));
|
|
|
+
|
|
|
+ JSONArray points = new JSONArray();
|
|
|
+ points.add(point1);
|
|
|
+ points.add(point2);
|
|
|
+ points.add(point3);
|
|
|
+ points.add(point4);
|
|
|
+ int angle = flue.getInteger("angle");
|
|
|
+ angle += 90;
|
|
|
+ if (angle > 360) {
|
|
|
+ angle -= 360;
|
|
|
+ }
|
|
|
+ item.put("points", points);
|
|
|
+ item.put("angle", angle);
|
|
|
+ result.add(item);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ public JSONObject readFile(String floorPath) {
|
|
|
+
|
|
|
+ String floorplan = readFileByLines(floorPath);
|
|
|
+ if (floorplan == null) {
|
|
|
+ return null;
|
|
|
+ } else {
|
|
|
+ JSONObject input = JSONObject.parseObject(floorplan);
|
|
|
+ return input;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public String readFileByLines(String fileName) {
|
|
|
+ FileInputStream file = null;
|
|
|
+ BufferedReader reader = null;
|
|
|
+ InputStreamReader inputFileReader = null;
|
|
|
+ String content = "";
|
|
|
+ String tempString = null;
|
|
|
+
|
|
|
+ File f = new File(fileName);
|
|
|
+ if (!f.exists()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ file = new FileInputStream(fileName);
|
|
|
+ inputFileReader = new InputStreamReader(file, "utf-8");
|
|
|
+ reader = new BufferedReader(inputFileReader);
|
|
|
+ // һ�ζ���һ�У�ֱ������nullΪ�ļ�����
|
|
|
+ while ((tempString = reader.readLine()) != null) {
|
|
|
+ content += tempString;
|
|
|
+ }
|
|
|
+ reader.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return null;
|
|
|
+ } finally {
|
|
|
+ if (reader != null) {
|
|
|
+ try {
|
|
|
+ reader.close();
|
|
|
+ } catch (IOException e1) {
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return content;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void writeFile(String filePath, String str) throws IOException {
|
|
|
+ File fout = new File(filePath);
|
|
|
+ FileOutputStream fos = new FileOutputStream(fout);
|
|
|
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
|
|
|
+ bw.write(str);
|
|
|
+ bw.close();
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean isClockwise(JSONArray vertices) {
|
|
|
+ double area = 0;
|
|
|
+ for (int i = 0; i < vertices.size(); i++) {
|
|
|
+ int j = (i + 1) % vertices.size();
|
|
|
+ area += vertices.getJSONObject(i).getDouble("x") * vertices.getJSONObject(j).getDouble("y");
|
|
|
+ area -= vertices.getJSONObject(j).getDouble("x") * vertices.getJSONObject(i).getDouble("y");
|
|
|
+ }
|
|
|
+ double sub = area / 2;
|
|
|
+ if (sub > 0) {
|
|
|
+ //��ʱ��
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ //˳ʱ��
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private double distance(JSONObject point1, JSONObject point2) {
|
|
|
+ double dis = Math.pow(point1.getDouble("x") - point2.getDouble("x"), 2) + Math.pow(point1.getDouble("y") - point2.getDouble("y"), 2);
|
|
|
+ return Math.sqrt(dis);
|
|
|
+ }
|
|
|
+}
|