Load.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. import { dataService } from "./Service/DataService.js";
  2. import { stateService } from "./Service/StateService.js";
  3. import { coordinate } from "./Coordinate.js";
  4. import Constant from "./Constant";
  5. import { tagService } from "./Service/TagService";
  6. import { mathUtil } from "./Util/MathUtil";
  7. import { measureService } from "./Service/MeasureService";
  8. import { cameraService } from "./Service/CameraService";
  9. export default class Load {
  10. constructor(layer) {
  11. this.layer = layer;
  12. this.version = "v1.0";
  13. this.vectorsJson = null;
  14. this.newVectorId = null;
  15. }
  16. load(floors) {
  17. for (let i = 0; i < floors.length; ++i) {
  18. let floor = floors[i];
  19. let subgroup = i;
  20. if (floor.hasOwnProperty("subgroup")) {
  21. subgroup = floor.subgroup;
  22. }
  23. dataService.initFloor(subgroup);
  24. dataService.setCurrentFloor(subgroup);
  25. for (let key in floor.points) {
  26. wallService.createPoint(
  27. floor.points[key].x,
  28. floor.points[key].y,
  29. floor.points[key].vectorId,
  30. subgroup
  31. );
  32. }
  33. for (let key in floor.walls) {
  34. let wall = wallService.createWall(
  35. floor.walls[key].start,
  36. floor.walls[key].end,
  37. floor.walls[key].vectorId,
  38. subgroup
  39. );
  40. wall.setImportant(floor.walls[key].important);
  41. wall.setOut(floor.walls[key].out);
  42. wall.setChildren(floor.walls[key].children);
  43. }
  44. dataService.setFloorHeight(
  45. dataService.currentFloor,
  46. this.layer.player.model.floors.index[dataService.currentFloor].center.y
  47. );
  48. for (let key in floor.symbols) {
  49. let symbol = symbolService.createSymbol(
  50. floor.symbols[key].startPoint,
  51. floor.symbols[key].endPoint,
  52. floor.symbols[key].geoType,
  53. floor.symbols[key].parent,
  54. floor.symbols[key].vectorId
  55. );
  56. symbol.openSide = floor.symbols[key].openSide;
  57. symbol.enter = floor.symbols[key].enter;
  58. symbol.points2d = JSON.parse(
  59. JSON.stringify(floor.symbols[key].points2d)
  60. );
  61. }
  62. for (let key in floor.components) {
  63. let component = componentService.createComponent(
  64. floor.components[key].center,
  65. floor.components[key].geoType,
  66. floor.components[key].vectorId
  67. );
  68. component.angle = floor.components[key].angle;
  69. //component.setPoints2d()
  70. component.sideThickness = floor.components[key].sideThickness;
  71. component.sideWidth = floor.components[key].sideWidth;
  72. component.points2d = JSON.parse(
  73. JSON.stringify(floor.components[key].points2d)
  74. );
  75. }
  76. if (floor.boundingBox) {
  77. dataService.setBoundingBox(floor.boundingBox, subgroup);
  78. } else {
  79. floor.boundingBox = mathUtil.getBoundingBox2(floor.points);
  80. dataService.setBoundingBox(floor.boundingBox, subgroup);
  81. }
  82. for (let key in floor.tags) {
  83. let tag = tagService.createTag(
  84. floor.tags[key].center,
  85. floor.tags[key].vectorId,
  86. subgroup
  87. );
  88. tag.setPoints2d();
  89. tag.setTitle(floor.tags[key].title);
  90. tag.setDes(floor.tags[key].des);
  91. tag.setUnit(floor.tags[key].unit);
  92. tag.setAdding(false);
  93. }
  94. for (let key in floor.furnitures) {
  95. let furniture = furnitureService.createFurniture(
  96. floor.furnitures[key].center,
  97. floor.furnitures[key].geoType,
  98. floor.furnitures[key].vectorId
  99. );
  100. furniture.angle = floor.furnitures[key].angle;
  101. if (floor.furnitures[key].scale) {
  102. furniture.zoom = floor.furnitures[key].scale;
  103. } else {
  104. furniture.zoom = floor.furnitures[key].zoom;
  105. }
  106. }
  107. if (floor.hasOwnProperty("name")) {
  108. dataService.setFloorName(floor.name, subgroup);
  109. }
  110. if (floor.hasOwnProperty("subgroup")) {
  111. dataService.setFloorSubgroup(floor.subgroup, subgroup);
  112. }
  113. if (floor.hasOwnProperty("id")) {
  114. dataService.setFloorId(floor.id, subgroup);
  115. }
  116. }
  117. }
  118. uploadCad() {
  119. this.initCameraService();
  120. this.uploadData.cadInfo = [];
  121. return this.exportCadImgs();
  122. // 开始上传:this.uploadData
  123. //this.uploadData = {}
  124. }
  125. initCameraService() {
  126. const modelSize = this.layer.app.core.get("Player").model.size;
  127. const currentScale = cameraService.getCurrentScale(modelSize);
  128. cameraService.setCamera(currentScale);
  129. }
  130. base64ToBlob(base64) {
  131. let arr = base64.split(","),
  132. mime = arr[0].match(/:(.*?);/)[1],
  133. bstr = atob(arr[1]),
  134. n = bstr.length,
  135. u8arr = new Uint8Array(n);
  136. while (n--) {
  137. u8arr[n] = bstr.charCodeAt(n);
  138. }
  139. return new Blob([u8arr], { type: mime });
  140. }
  141. exportImg(canvas) {
  142. // 图片导出为 png 格式
  143. var type = "png";
  144. var imgData = canvas.toDataURL(type, 3);
  145. let blobImg = this.base64ToBlob(imgData);
  146. return blobImg;
  147. }
  148. exportCadImgs() {
  149. this.layer.uiControl.menu_flex();
  150. tagService.clearDefaultTags();
  151. this.layer.history.save();
  152. stateService.clearItems();
  153. measureService.updateRegion(true);
  154. measureService.update();
  155. let canvas = this.layer.canvas;
  156. // coordinate.ratio = Constant.ratio
  157. // canvas.width = canvas.width * coordinate.ratio
  158. // canvas.height = canvas.height * coordinate.ratio
  159. canvas.width = Constant.cadImg_Width;
  160. canvas.height = Constant.cadImg_Height;
  161. coordinate.width = Constant.cadImg_Width / Constant.ratio;
  162. coordinate.height = Constant.cadImg_Height / Constant.ratio;
  163. coordinate.ratio = Constant.ratio;
  164. coordinate.res = Math.min(
  165. Constant.cadImg_Width /
  166. Constant.ratio /
  167. Math.abs(cameraService.right - cameraService.left),
  168. Constant.cadImg_Height /
  169. Constant.ratio /
  170. Math.abs(cameraService.top - cameraService.bottom)
  171. );
  172. this.layer.renderer.autoRedrawForImg();
  173. var deferred = window.KanKan.Deferred();
  174. setTimeout(() => {
  175. let subFloor = dataService.getFloorNum();
  176. this.uploadData.files = [];
  177. if (subFloor == 1) {
  178. let blobImg = this.exportImg(canvas);
  179. this.uploadData.files.push(blobImg);
  180. historyService.clearHistoryRecord();
  181. this.layer.$xui.toolbar.recall = false;
  182. this.layer.$xui.toolbar.recover = false;
  183. } else {
  184. let blobImg = this.exportImg(canvas);
  185. let currentFloor = dataService.getCurrentFloor();
  186. for (let i = 0; i < subFloor; ++i) {
  187. if (i == currentFloor) {
  188. this.uploadData.files.push(blobImg);
  189. continue;
  190. } else {
  191. this.layer.uiControl.currentFloor = i;
  192. this.layer.renderer.autoRedrawForImg();
  193. let _blobImg = this.exportImg(canvas);
  194. this.uploadData.files.push(_blobImg);
  195. }
  196. }
  197. this.layer.uiControl.currentFloor = currentFloor;
  198. }
  199. this.uploadData.cadInfo = dataService.getCadInfo(canvas);
  200. coordinate.updateForCanvas(canvas);
  201. coordinate.setRes(cameraService.left, cameraService.right);
  202. coordinate.ratio = 1;
  203. this.layer.renderer.autoRedraw();
  204. this.exportMiniMap(deferred);
  205. }, 100);
  206. return deferred;
  207. }
  208. exportMiniMap(deferred) {
  209. deferred = deferred || window.KanKan.Deferred();
  210. //this.layer.uiControl.menu_flex()
  211. stateService.clearItems();
  212. let canvas = this.layer.canvas;
  213. canvas.width = Constant.miniMap_Width;
  214. canvas.height = Constant.miniMap_Height;
  215. coordinate.width = Constant.miniMap_Width / Constant.ratio;
  216. coordinate.height = Constant.miniMap_Height / Constant.ratio;
  217. coordinate.ratio = Constant.ratio;
  218. coordinate.res = Math.min(
  219. Constant.miniMap_Width /
  220. Constant.ratio /
  221. Math.abs(cameraService.right - cameraService.left),
  222. Constant.miniMap_Height /
  223. Constant.ratio /
  224. Math.abs(cameraService.top - cameraService.bottom)
  225. );
  226. this.layer.renderer.redrawCore();
  227. setTimeout(() => {
  228. let subFloor = dataService.getFloorNum();
  229. this.uploadData.miniMaps = [];
  230. if (subFloor == 1) {
  231. let blobImg = this.exportImg(canvas);
  232. this.uploadData.miniMaps.push(blobImg);
  233. } else {
  234. let blobImg = this.exportImg(canvas);
  235. let currentFloor = dataService.getCurrentFloor();
  236. for (let i = 0; i < subFloor; ++i) {
  237. if (i == currentFloor) {
  238. this.uploadData.miniMaps.push(blobImg);
  239. continue;
  240. } else {
  241. this.layer.uiControl.currentFloor = i;
  242. let _blobImg = this.exportImg(canvas);
  243. this.layer.renderer.redrawCore();
  244. this.uploadData.miniMaps.push(_blobImg);
  245. }
  246. }
  247. this.layer.uiControl.currentFloor = currentFloor;
  248. }
  249. canvas.width = window.innerWidth;
  250. canvas.height = window.innerHeight;
  251. coordinate.updateForCanvas(canvas);
  252. let floorplanCamera =
  253. this.layer.app.core.get("CameraControls").activeControl.camera;
  254. coordinate.setRes(floorplanCamera.left, floorplanCamera.right);
  255. coordinate.ratio = 1;
  256. this.layer.renderer.autoRedraw();
  257. deferred.resolve(this.uploadData);
  258. }, 100);
  259. return deferred;
  260. }
  261. getCustomCadInfoItem(floorIndex, cadImg_Width, cadImg_Height) {
  262. //let cadImg_Width = Constant.cadImg_Width
  263. //let cadImg_Height = Constant.cadImg_Height
  264. // let cadImg_Width = 3840
  265. // let cadImg_Height = 2160
  266. function getScreenXY(point, res) {
  267. let pt = {
  268. x: point.x,
  269. y: point.y,
  270. };
  271. let x = cadImg_Width / 2 + (pt.x - coordinate.center.x) * res;
  272. let y = cadImg_Height / 2 - (pt.y - coordinate.center.y) * res;
  273. x = (0.5 + x) << 0;
  274. y = (0.5 + y) << 0;
  275. return {
  276. x: Math.floor(x),
  277. y: Math.floor(y),
  278. };
  279. }
  280. //let cadInfo = []
  281. let bounds = dataService.getAllBoundingBox(); //只是跟户型数据相关
  282. let res = Math.min(
  283. cadImg_Width / Math.abs(cameraService.right - cameraService.left),
  284. cadImg_Height / Math.abs(cameraService.top - cameraService.bottom)
  285. );
  286. //for (let i = 0; i < bounds.length; ++i) {
  287. let item = {};
  288. let leftTop = getScreenXY(
  289. {
  290. x: bounds[floorIndex].left,
  291. y: bounds[floorIndex].top,
  292. },
  293. res
  294. );
  295. let rightBottom = getScreenXY(
  296. {
  297. x: bounds[floorIndex].right,
  298. y: bounds[floorIndex].bottom,
  299. },
  300. res
  301. );
  302. let left = leftTop.x;
  303. let top = leftTop.y;
  304. let right = cadImg_Width - rightBottom.x;
  305. let bottom = cadImg_Height - rightBottom.y;
  306. item.left = left;
  307. item.top = top;
  308. item.right = right;
  309. item.bottom = bottom;
  310. item.bound = bounds[floorIndex];
  311. item.bound.top = -1 * item.bound.top;
  312. item.bound.bottom = -1 * item.bound.bottom;
  313. return item;
  314. //cadInfo.push(item)
  315. //}
  316. //return cadInfo //和图片相关
  317. }
  318. //上传图片
  319. uploadCadImg(floorIndex, imgUrl, cadImg_Width, cadImg_Height) {
  320. //let floorIndex = 0;
  321. this.initCameraService();
  322. let cadInfoItem = this.getCustomCadInfoItem(
  323. floorIndex,
  324. cadImg_Width,
  325. cadImg_Height
  326. );
  327. //let cadInfos = this.getCustomCadInfoItem(3840,2160) //上传图片的分辨率
  328. this.layer.app.core
  329. .get("Player")
  330. .model.floorplanCadImg.createCustomPlane(
  331. floorIndex,
  332. imgUrl,
  333. cadInfoItem,
  334. cadImg_Width,
  335. cadImg_Height
  336. );
  337. }
  338. //恢复图片
  339. recoverForCadImg(floorIndex, imgUrl) {
  340. this.layer.app.core
  341. .get("Player")
  342. .model.floorplanCadImg.updateCustomFloorTexture(floorIndex, imgUrl);
  343. }
  344. uploadCadImg2(floorIndex, imgUrl, cadImg_Width, cadImg_Height) {
  345. this.layer.app.core
  346. .get("Player")
  347. .model.floorplanCadImg.createCustomPlane(
  348. floorIndex,
  349. imgUrl,
  350. cadImg_Width,
  351. cadImg_Height
  352. );
  353. }
  354. }