index.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. var TESTREFRESH = 0;
  2. //var circleStyle = {fillColor:"blue", fill:true, stroke:true, fillOpacity:1, strokeOpacity:1};
  3. var div = document.getElementById("container2d");
  4. var width = window.outerWidth - 260;
  5. var height = window.outerHeight;
  6. // 放个均分多少份
  7. var stepx = 50;
  8. var stepy = 50;
  9. var backgroundSize = 50;
  10. var startx = -stepx * backgroundSize;
  11. var starty = -stepx * backgroundSize;
  12. var MixZoom = 20;
  13. var MixMark = -1;
  14. var MaxMark = 139;
  15. var startMarkX = -width / 2 + 150;
  16. var startMarkY = -height / 2 + 150;
  17. var wallleftX = -500;
  18. var wallleftY = 400;
  19. var wallrightX = 500;
  20. var wallrightY = -400;
  21. var wallThickness = 30;
  22. var partitionThickness = 15;
  23. var door = 80;
  24. var window = 50;
  25. var meter = width / 20;
  26. var meterpositionX = 100;
  27. var redrawCount = 0;
  28. // canvas最大正方形宽高
  29. var backgroundcanvasMax = 5000;
  30. var Sector_r = 70;
  31. var slid_r = 10;
  32. var point_r = 5;
  33. var sysmbolCircleR = 10;
  34. var symbolMinLen = 10;
  35. var show3D = false;
  36. var three3D;
  37. var center;
  38. var my3DEngine = null;
  39. var wallId = null;
  40. var Overlay;
  41. var vectors = [];
  42. var layer;
  43. var initMesh = 0;
  44. var one2d = false;
  45. var one3d = false;
  46. var TESTCOUNT = 0;
  47. function init() {
  48. layer = new Layer(width, height);
  49. layer.renderer.drawBackGround();
  50. wallThickness = layer.parameter.wallThickness;
  51. partitionThickness = layer.parameter.partitionThickness;
  52. door = 80;
  53. window = 50;
  54. addWall();
  55. //layer.addSymbol2D.wallIds.push(wallId);
  56. if (!one2d) {
  57. //initRoom();
  58. one2d = true;
  59. }
  60. initLoad();
  61. }
  62. init();
  63. //document.getElementById("closeproduct").addEventListener("click",layer.menu.closeProduct);
  64. window.onresize = function () {
  65. width = window.outerWidth - 260;
  66. height = window.outerHeight;
  67. startMarkX = -width / 2 + 50;
  68. startMarkY = -height / 2 + 50;
  69. layer.size = new CanvasSketch.Size(parseInt(width), parseInt(height));
  70. //layer.renderer.setSize(layer.size);
  71. layer.maxBounds = new CanvasSketch.Bounds(-layer.size.w / 2, -layer.size.h / 2, layer.size.w / 2, layer.size.h / 2);
  72. layer.bounds = new CanvasSketch.Bounds(-layer.size.w / 2, -layer.size.h / 2, layer.size.w / 2, layer.size.h / 2);
  73. //layer.renderer.redraw(0);
  74. //layer.renderer.drawBackGround();
  75. layer.control.refreshCanvas = true;
  76. layer.control.refreshBackgroundCanvas = true;
  77. layer.control.refreshSelectCanvas = true;
  78. layer.renderer.autoRedraw();
  79. };
  80. // 关于4维弹出框
  81. document.getElementById("aboutWindow").addEventListener("click", function (e) {
  82. //console.log("aboutWindow");
  83. if (document.getElementById("aboutWindow").style.display == "block") {
  84. if (e.target.className == "window-close" || e.target.innerText == "关闭") {
  85. document.getElementById("aboutWindow").style.display = "none";
  86. }
  87. }
  88. });
  89. // 放大跟保存图片
  90. document.getElementById("subMenuContainer").addEventListener("click", function (e) {
  91. if (e.target.parentElement.parentElement.id == "toolbarScreenshot") {
  92. var saveAsLocalImage = function (canvasid, type) {
  93. var canvas = document.getElementById(canvasid);
  94. // 图片导出为 png 格式
  95. var type = 'png';
  96. var imgData = canvas.toDataURL(type);
  97. // 加工image data,替换mime type
  98. imgData = imgData.replace(_fixType(type), 'image/octet-stream');
  99. // 下载后的图片名
  100. var filename = '4dage_' + (new Date()).getTime() + '.' + type;
  101. // download
  102. saveFile(imgData, filename);
  103. };
  104. /**
  105. * 获取mimeType
  106. * @param {String} type the old mime-type
  107. * @return the new mime-type
  108. */
  109. var _fixType = function (type) {
  110. type = type.toLowerCase().replace(/jpg/i, 'jpeg');
  111. var r = type.match(/png|jpeg|bmp|gif/)[0];
  112. return 'image/' + r;
  113. };
  114. /**
  115. * 在本地进行文件保存
  116. * @param {String} data 要保存到本地的图片数据
  117. * @param {String} filename 文件名
  118. */
  119. var saveFile = function (data, filename) {
  120. var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
  121. save_link.href = data;
  122. save_link.download = filename;
  123. var event = document.createEvent('MouseEvents');
  124. event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  125. save_link.dispatchEvent(event);
  126. };
  127. if (show3D) {
  128. BABYLON.Tools.CreateScreenshot(my3DEngine.scene3D.engine, my3DEngine.scene3D.camera, {
  129. width: my3DEngine.scene3D.canvas.width,
  130. height: my3DEngine.scene3D.canvas.height
  131. });
  132. } else {
  133. saveAsLocalImage("dynamiccanvas2d", "png");
  134. }
  135. } else if (e.target.parentElement.parentElement.id == "fullscreen-btn") {
  136. var element = document.documentElement;
  137. var requestMethod = element.requestFullScreen || element.webkitRequestFullScreen || element.mozRequestFullScreen ||
  138. element.msRequestFullScreen;
  139. if (requestMethod) {
  140. requestMethod.call(element);
  141. } else if (typeof window.ActiveXObject !== "undefined") {
  142. var wscript = new ActiveXObject("WScript.Shell");
  143. if (wscript !== null) {
  144. wscript.SendKeys("{F11}");
  145. }
  146. }
  147. } else if (e.target.parentElement.parentElement.id == "transparencyButton") {
  148. //alert("透明");
  149. if (e.target.src.indexOf("icon-transparency.png") > -1) {
  150. /*
  151. for(var i=0;i<my3DEngine.decorate3D.roomWallMeshes.length;++i)
  152. {
  153. if(my3DEngine.decorate3D.roomWallMeshes[i].name=="wall"||my3DEngine.decorate3D.roomWallMeshes[i].name=="walltop")
  154. {
  155. my3DEngine.decorate3D.roomWallMeshes[i].visibility=0.1;
  156. }
  157. }
  158. */
  159. my3DEngine.decorate3D.transparentWall(0.05);
  160. e.target.src = e.target.src.replace("icon-transparency.png", "icon-opacity.png");
  161. } else if (e.target.src.indexOf("icon-opacity.png") > -1) {
  162. /*
  163. for(var i=0;i<my3DEngine.decorate3D.roomWallMeshes.length;++i)
  164. {
  165. if(my3DEngine.decorate3D.roomWallMeshes[i].name=="wall"||my3DEngine.decorate3D.roomWallMeshes[i].name=="walltop")
  166. {
  167. my3DEngine.decorate3D.roomWallMeshes[i].visibility=1;
  168. }
  169. }
  170. */
  171. my3DEngine.decorate3D.transparentWall(1);
  172. e.target.src = e.target.src.replace("icon-opacity.png", "icon-transparency.png");
  173. }
  174. } else if (e.target.parentElement.parentElement.id == "lock-icon") {
  175. //alert("锁");
  176. if (e.target.className == "fa fa-unlock") {
  177. my3DEngine.action3D.lock = true;
  178. e.target.className = "fa fa-lock";
  179. } else if (e.target.className == "fa fa-lock") {
  180. my3DEngine.action3D.lock = false;
  181. e.target.className = "fa fa-unlock";
  182. }
  183. }
  184. });
  185. // Grid..........................................................
  186. // loadding 位置
  187. function initLoad() {
  188. var div = document.getElementById("loaddiv");
  189. var img = document.getElementById("loadimg");
  190. var width = window.innerWidth;
  191. var height = window.innerHeight;
  192. var imgwidth = img.width;
  193. var imgheight = img.height;
  194. var ptwidth = (width - imgwidth) / 2 + "px";
  195. var ptheight = (height - imgheight) / 2 + "px";
  196. div.style.width = width + "px";
  197. div.style.height = height + "px";
  198. div.width = width;
  199. div.height = height;
  200. img.style.marginLeft = ptwidth;
  201. img.style.marginTop = ptheight;
  202. }
  203. // 3D部分选中图片加载模型
  204. function showPicture() {
  205. if (my3DEngine == null) {
  206. my3DEngine = layer.layer3D;
  207. my3DEngine.initialize();
  208. }
  209. var src = this.id.replace("product", "") + ".babylon";
  210. layer.menu.closeProduct();
  211. my3DEngine.modelLoader.showPicture(src);
  212. }
  213. // 3D部分选中图片加载模型
  214. function showPhoFrame() {
  215. if (my3DEngine == null) {
  216. my3DEngine = layer.layer3D;
  217. my3DEngine.initialize();
  218. }
  219. var src = this.id.replace("product", "") + ".obj";
  220. layer.menu.closeProduct();
  221. my3DEngine.modelLoader.showPhoFrame(src);
  222. }
  223. // 3D部分选中图片加载模型
  224. function showProduct3D() {
  225. if (my3DEngine == null) {
  226. my3DEngine = new Symbol3D();
  227. my3DEngine.initialize();
  228. }
  229. var src;
  230. var src = this.id.replace("product", "") + ".babylon";
  231. layer.menu.closeProduct();
  232. my3DEngine.modelLoader.showProduct(src);
  233. }
  234. // 未知作用
  235. // function drawGrid(stepx, stepy) {
  236. // console.log('???? ---')
  237. // layer.renderer.addGrid();
  238. // }
  239. // 一开始添加墙面 默认添加
  240. function addWall() {
  241. var vectors = [];
  242. var points = [];
  243. var point1 = new Point(wallleftX, wallleftY);
  244. points.push(point1);
  245. var point2 = new Point(wallrightX, wallleftY);
  246. points.push(point2);
  247. var point3 = new Point(wallrightX, wallrightY);
  248. points.push(point3);
  249. var point4 = new Point(wallleftX, wallrightY);
  250. points.push(point4);
  251. var wall = new Wall(points, document.getElementById("imgWall"));
  252. var vector = new Vector(wall, wallStyle);
  253. wallId = vector.id;
  254. layer.data2d.wallIds.push(wallId);
  255. vectors.push(vector);
  256. layer.addVectors(vectors);
  257. }
  258. // 显示3D 效果 3D效果入口
  259. function Show3DBase() {
  260. if (!show3D) {
  261. if (my3DEngine == null) {
  262. my3DEngine = layer.layer3D;
  263. my3DEngine.initialize();
  264. }
  265. //my3DEngine.clearSymbol();
  266. my3DEngine.decorate3D.deleteRoomMeshes();
  267. GetWallPoints(layer);
  268. if (!one3d) {
  269. //initRoom3D();
  270. one3d = true;
  271. }
  272. my3DEngine.scene3D.render();
  273. }
  274. show3D = true;
  275. }
  276. // 获取2维信息以供给3维使用
  277. function GetWallPoints(layer) {
  278. var wallIds = layer.data2d.wallIds;
  279. var calculateLine = layer.calculateLine;
  280. for (var i = 0; i < wallIds.length; ++i) {
  281. var id = wallIds[i];
  282. var points = layer.vectors[id].geometry.points;
  283. var syms = [];
  284. for (var key in layer.vectors[id].symbol2Ds) {
  285. var symbol2d = layer.vectors[id].symbol2Ds[key];
  286. var line = calculateLine.createLine(symbol2d.geometry.point1, symbol2d.geometry.point2);
  287. var sym = {};
  288. if (line.a != 0) {
  289. sym.angle = Math.atan(line.a);
  290. } else if (line.hasOwnProperty('x')) {
  291. sym.angle = Math.PI / 2;
  292. } else if (line.hasOwnProperty('y')) {
  293. sym.angle = 0;
  294. }
  295. sym.point = {
  296. x: (symbol2d.geometry.point1.x + symbol2d.geometry.point2.x) / 2,
  297. y: (symbol2d.geometry.point1.y + symbol2d.geometry.point2.y) / 2
  298. };
  299. //sym.type=symbol2d.geoType;
  300. sym.id = id;
  301. sym.type = symbol2d.geometry.geoType;
  302. sym.len = BABYLON.Vector2.Distance(symbol2d.geometry.point1, symbol2d.geometry.point2);
  303. sym.index = Math.min(symbol2d.attributes.wallstartindex, symbol2d.attributes.wallendindex);
  304. syms.push(sym);
  305. }
  306. if (i == 0) {
  307. //var inout=calculateLine.divisionBuildUseWall(layer.vectors[id].geometry.border1,layer.vectors[id].geometry.border2);
  308. var inout = calculateLine.divisionBuildUseWall(layer.vectors[id].geometry.wallInfo);
  309. var inline = inout.use;
  310. var outline = inout.build;
  311. var height = inout.height;
  312. //my3DEngine.decorate3D.drawFloor(layer.vectors[id].geometry.points,layer.vectors[id].geometry.floor);
  313. my3DEngine.decorate3D.drawFloor(id);
  314. my3DEngine.decorate3D.drawCloseWallSymbols(outline, inline, height, syms, layer.vectors[id].geometry.wallType, id,
  315. layer.vectors[id].geometry.floor);
  316. } else {
  317. if (layer.vectors[id].geometry.state == 0) {
  318. //var inout=calculateLine.divisionBuildUseWall(layer.vectors[id].geometry.border1,layer.vectors[id].geometry.border2);
  319. var inout = calculateLine.divisionBuildUseWall(layer.vectors[id].geometry.wallInfo);
  320. var inline = inout.use;
  321. var outline = inout.build;
  322. var height = inout.height;
  323. //my3DEngine.decorate3D.drawFloor(layer.vectors[id].geometry.points,layer.vectors[id].geometry.floor);
  324. my3DEngine.decorate3D.drawFloor(id);
  325. if (calculateLine.isClockWise(outline) > 0) {
  326. outline.reverse();
  327. inline.reverse();
  328. }
  329. my3DEngine.decorate3D.drawCloseWallSymbols(outline, inline, height, syms, layer.vectors[id].geometry.wallType, id,
  330. layer.vectors[id].geometry.floor);
  331. } else {
  332. var clockpoints = [];
  333. //var floorpoints=calculateLine.outinwallside(points,layer.vectors[id].geometry.wallType);
  334. //var floorpoints=calculateLine.outinwallside(layer.vectors[id].geometry);
  335. var floorpoints = calculateLine.divisionBuildUseWall(layer.vectors[id].geometry.wallInfo);
  336. var height = floorpoints.height;
  337. if (floorpoints.use.length == 2) {
  338. var temp1 = [];
  339. var temp2 = [];
  340. temp1[0] = floorpoints.use[0];
  341. temp1[1] = floorpoints.build[0];
  342. temp2[0] = floorpoints.use[1];
  343. temp2[1] = floorpoints.build[1];
  344. floorpoints.use = temp1;
  345. floorpoints.build = temp2;
  346. clockpoints.push(temp1[0]);
  347. clockpoints.push(temp1[1]);
  348. clockpoints.push(temp2[1]);
  349. clockpoints.push(temp2[0]);
  350. } else {
  351. //var line1= calculateLine.createLine(floorpoints.side1[0], floorpoints.side1[1]);
  352. //var line2= calculateLine.createLine(floorpoints.side1[floorpoints.side1.length-2], floorpoints.side1[floorpoints.side1.length-1]);
  353. for (var n = 0; n < floorpoints.use.length; ++n) {
  354. clockpoints.push(floorpoints.use[n]);
  355. }
  356. for (var n = floorpoints.build.length - 1; n > -1; --n) {
  357. clockpoints.push(floorpoints.build[n]);
  358. }
  359. }
  360. if (calculateLine.isClockWise(clockpoints) > 0) {
  361. floorpoints.use.reverse();
  362. floorpoints.build.reverse();
  363. height.reverse();
  364. }
  365. my3DEngine.decorate3D.drawOpenWallSymbols(floorpoints, height, syms, layer.vectors[id].geometry.wallType, id,
  366. layer.vectors[id].geometry.floor);
  367. }
  368. }
  369. }
  370. my3DEngine.decorate3D.hideFloors(parseInt(layer.selectFloor));
  371. }