canvas

41 阅读5分钟
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title></title>

		<script src="./assets/js/jquery-1.11.1.min.js"></script>
		<script src="./assets/hydrogen/matrix.js"></script>
		<script src="./assets/js/hydrogen.js"></script>
		<style>
			body,
			html {
				padding: 0;
				margin: 0;
				background-color: #002f63;
			}

			* {
				-webkit-box-sizing: border-box;
				box-sizing: border-box;
			}

			.container {
				position: relative;
				color: #000;
			}

			canvas {
				display: block;
				margin: auto;
			}
		</style>
	</head>
	<body>
		<div id="container" class="container">
			<canvas id="canvas" onmousedown="clickDown(event)" onmouseup="clickUp(event)" width="2900" height="1600"></canvas>
		</div>
	</body>
</html>

<script>
	var container,
		canvas,
		ctx,
		scale,
		deltaX = 0,
		deltaY = 0,
		width = 2900,
		height = 1600,
		fps = 2,
		img1= new Image(),
		img2= new Image(),
		ratio = 1;

	var number = 0;
	var data = {};
	$(function () {
		let keys = Object.keys(apex);
		number = keys.length ? Number(keys[keys.length - 1].split("A")[1]) : 0;

		container = $("#container");
		canvas = $("#canvas");
		ctx = canvas[0].getContext("2d");

		img1.src = "./assets/img/icon-1.png"
		img2.src = "./assets/img/icon-2.png"

		getSize();
		draw();
	});
	function draw() {
		let t = 1000 / fps;
		ctx.save();
		ctx.clearRect(0, 0, width, height);
		ctx.fillStyle = "#002f63";
		ctx.fillRect(0, 0, width, height);
		ctx.translate(deltaX, deltaY);
		ctx.scale(ratio, ratio);


		drawInfo();
		drawStatusBlock();
		drawTubes();
		drawTanks();
		drawRocket();
		drawCooler();
		drawLiquidomes();
		drawSensors();
		ctx.drawImage(img1, 1285, 797,img1.width/2.1,img1.height/2.1)
		ctx.restore();

		setTimeout(() => {
			draw();
		}, 1000/fps);
	}

	function drawTanks() {
		let arr = [
			{ x: 320, y: 700, name: "液氧固定罐A" },
			{ x: 320, y: 1120, name: "液氧固定罐B" },
		];
		arr.forEach((item) => {
			drawTank(item);
		});
	}

	function getAllTubes(m) {
		let tubeObj = {};
		for (let key1 in m) {
			for (let key2 in m[key1]) {
				let item = m[key1][key2];
				if (item) {
					let a = Number(key1.split("A")[1]);
					let b = Number(key2.split("A")[1]);
					let key = a < b ? "A" + a + "_" + "A" + b : "A" + b + "_" + "A" + a;
					if (tubeObj[key] === undefined) tubeObj[key] = false;
				}
			}
		}
		return tubeObj;
	}

	function drawTubes() {
		let tubeObj = getAllTubes(matrix);
		let { arr, apexArr } = getConnectTubes();

		for (let key in tubeObj) {
			if (tubeObj[key] === false) {
				let point = key.split("_");
				let a = Number(point[0].split("A")[1]);
				let b = Number(point[1].split("A")[1]);
				let path = a < b ? "A" + a + "_" + "A" + b : "A" + b + "_" + "A" + a;
				let item = {
					x1: apex[point[0]].x,
					y1: apex[point[0]].y,
					x2: apex[point[1]].x,
					y2: apex[point[1]].y,
					point1: apex[point[0]],
					point2: apex[point[1]],
				};
				item.type = item.x1 == item.x2 ? "v" : "h";
				liquidTube(item, arr.indexOf(path) >= 0);
			}
		}

		for (let key in apex) {
			if(apex[key].type=="liquidome"){
				drawLiquidome(apex[key])
			}
			if (apex[key].type == "switcher") {
				drawSwitcher(apex[key], apex[key].switcher.status);
			}
			if (apex[key].type == "output") {
				drawOutput(apex[key]);
			}
			if (apex[key].apex_type) {
				drawApex(apex[key], apexArr.indexOf(key) >= 0);
			}
			// ctx.font = "24px 黑体";
			// ctx.fillStyle = "#f00";
			// ctx.fillText(key, apex[key].x, apex[key].y);
		}
	}

	function getConnectTubes() {
		let arr = [],
			apexArr = [];
		for (let key in apex) {
			if (apex[key].type && apex[key].type == "input") {
				let result = checkTubsForwards(key);
				let a = new Set([...arr, ...result.arr]);
				let b = new Set([...apexArr, ...result.apexArr]);
				arr = [];
				apexArr = [];
				a.forEach((item) => {
					arr.push(item);
				});
				b.forEach((item) => {
					apexArr.push(item);
				});
			}
		}
		return { arr, apexArr };
	}

	var click_position = {},
		click_timer = false,
		isHold = false;
	function clickDown(e) {
		return
		if (click_timer) clearTimeout(click_timer);
		isHold = false;
		let x1 = parseInt(e.offsetX / scale / ratio) - deltaX / ratio;
		let y1 = parseInt(e.offsetY / scale / ratio) - deltaY / ratio;
		let name = "A" + (number + 1);

		let isHave = false;
		for (let key in apex) {
			if (Math.abs(apex[key].x - x1) <= 15 && Math.abs(apex[key].y - y1) <= 15) {
				isHave = true;
				x1 = Number(apex[key].x);
				y1 = Number(apex[key].y);
				name = key.toString();
				console.log(name);
				// 将当前点变为switcher

				sn = $("#sn").val();
				if (sn) {
					sn = sn == 999 ? "" : sn;
					let s = { name: sn, dir: dir };
					apex[key].type = "switcher";
					apex[key].switcher = s;
					localStorage.setItem("apex", JSON.stringify(apex));
				}

				break;
			}
		}
		click_position = { x1, y1, name, isHave };
		click_timer = setTimeout(() => {
			isHold = true;
		}, 500);
	}
	function clickUp(e) {
		return
		let { x1, y1, name } = click_position;
		if (!isHold) {
			console.log(x1, y1, name);
			return;
		}
		isHold = false;
		if (!click_position.isHave) {
			number++;
		}
		let x2 = parseInt(e.offsetX / scale / ratio) - deltaX / ratio;
		let y2 = parseInt(e.offsetY / scale / ratio) - deltaY / ratio;
		let name2 = "A" + (number + 1);

		let isHave = false;
		let addType = "";
		let obj = apex;
		let obj2 = matrix;

		for (let key in obj) {
			if (Math.abs(obj[key].x - x2) <= 15 && Math.abs(obj[key].y - y2) <= 15) {
				isHave = true;
				x2 = Number(obj[key].x);
				y2 = Number(obj[key].y);
				name2 = key.toString();
				break;
			}
		}
		if (!isHave) {
			number++;
		}

		if (!click_position.isHave || !isHave) {
			if (!click_position.isHave) {
				obj[name] = { x: x1, y: y1 };
				obj2[name] = {};
			}
			if (!isHave) {
				obj[name2] = { x: x2, y: y2 };
				obj2[name2] = {};
			}
			obj2[name][name2] = 1;
			obj2[name2][name] = 1;

			let w = Math.abs(x1 - x2);
			let h = Math.abs(y1 - y2);

			w > h ? (y2 = Number(y1)) : (x2 = Number(x1));
			obj[name2] = { x: x2, y: y2 };
			localStorage.setItem("apex", JSON.stringify(obj));
			localStorage.setItem("matrix", JSON.stringify(obj2));
		} else {
			obj2[name][name2] = 1;
			obj2[name2][name] = 1;
			localStorage.setItem("matrix", JSON.stringify(obj2));
		}

		if (addType == "gas") {
			// apex_gas = obj;
			// matrix_gas = obj2;
		} else {
			apex = obj;
			matrix = obj2;
		}
	}
</script>

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title></title>

		<script src="./assets/js/jquery-1.11.1.min.js"></script>
		<script src="./assets/js/matrix.js"></script>
		<script src="./assets/js/matrix_gas.js"></script>
		<script src="./assets/js/common.js"></script>
		<script src="./assets/js/index.js"></script>

		<style>
			body,
			html {
				padding: 0;
				margin: 0;
			}

			* {
				-webkit-box-sizing: border-box;
				box-sizing: border-box;
			}

			.container {
				position: relative;
				color: #000;
			}

			.tool {
				position: fixed;
				z-index: 20;
			}
		</style>
	</head>
	<body>
		<div id="container" class="container">
			<!-- <div class="tool tool-top" style="
					left: 20px;
					top: 20px;
					background-color: aliceblue;
					padding: 30px;
					font-size: 20px;
				">
			开关:
			<button id="dir_1" style="background: cornflowerblue" onclick="d(1,2)">
				横着
			</button>
			<button id="dir_2" onclick="d(2,1)">竖着</button> 输入:
			<input id="sn" type="text" />
		</div> -->
			<!-- <div class="tool tool-right"></div> -->
			<canvas id="canvas" onmousedown="clickDown(event)" onmouseup="clickUp(event)"></canvas>
		</div>
	</body>
</html>
<script>
	function d(num1, num2) {
		dir = num1;
		$("#dir_" + num1).css({ background: "cornflowerblue" });
		$("#dir_" + num2).css({ background: "" });
	}
</script>

<script>
	var container,
		canvas,
		ctx,
		switcherOpen,
		scale,
		color1,
		color2,
		// bg = new Image(),
		rocket = new Image(),
		pumpImg = new Image(),
		fanImg = new Image(),
		dtImg = new Image(),
		chimneyImg = new Image();

	var imgScale = 1.25,
		isLoop = true,
		isDrawPoint = false,
		isDrawBG = false,
		isTubes = true,
		isGasTubes = true,
		deltaX = 0 || 150,
		deltaY = 0,
		width = 4800,
		height = 1500,
		fps = 2,
		radio = 1;
	_status = 1;

	var number = 0;
	var data = {};
	$(function () {
		let keys = Object.keys(apex_gas);
		number = Number(keys[keys.length - 1].split("A")[1]);

		container = $("#container");
		canvas = $("#canvas");
		ctx = canvas[0].getContext("2d");

		rocket.src = "./assets/img/rocket.png";
		// bg.src = "./assets/img/306.png";
		pumpImg.src = "./assets/img/pump.png";
		fanImg.src = "./assets/img/fan.png";
		dtImg.src = "./assets/img/sensor-dt.png";
		chimneyImg.src = "./assets/img/chimney.png";

		getParams();

		setTimeout(() => {
			getSize();
			draw(ctx);
		}, 1000);
	});

	// function drawBg() {
	// 	ctx.globalAlpha = 0.6;
	// 	imgScale = height / bg.height;
	// 	ctx.drawImage(bg, 0, 0, bg.width * imgScale, height);
	// 	ctx.globalAlpha = 1;
	// }

	function getParams() {
		$.ajax("./assets/json/data.json").then((res) => {
			data = res;
			for (let key in data) {
				if (typeof data[key] == "boolean") {
					data[key] = Math.random() > 0.5 ? true : false;
				} else {
					data[key] = parseInt(Math.random() * 10000);
				}
			}
			setTimeout(() => {
				getParams();
			}, 5000);
		});
	}

	function draw() {
		let t = 1000 / fps;

		color1 = _status % 2 == 1 ? "#00582a" : "#00582a";
		color2 = _status % 2 != 1 ? "#00582a" : "#00582a";

		ctx.clearRect(0, 0, width, height);
		ctx.fillStyle = "#002f63";
		ctx.fillRect(0, 0, width, height);
		ctx.save();
		ctx.translate(deltaX, deltaY);
		ctx.scale(radio, radio);
		// if (isDrawBG) drawBg();
		drawTrain();
		drawTanks();
		if (isGasTubes) {
			drawGasTubes();
			drawConnectGas();
		}
		if (isTubes) {
			drawTubes();
			drawConnectTubes();
		}

		if (isGasTubes) drawSwitchers(apex_gas);
		if (isTubes) drawSwitchers(apex);
		drawFluidMeters();
		drawPumps();
		drawSensorDTs();
		drawOther();
		ctx.restore();
		drawInfo();
		drawRocket();

		if (!isLoop) return;
		setTimeout(() => {
			_status++;
			_status = _status > fps ? 1 : _status;
			draw();
		}, t);
	}

	var click_timer,
		click_position,
		isHold = false;
	var sn = null;
	var dir = 1;

	function handleSwitcher(name) {
		if (apex[name] && apex[name].type == "switcher") {
			apex[name].switcher.status = apex[name].switcher.status ? false : true;
		}
		// for (let i = 0; i < switcher.length; i++) {
		// 	let item = switcher[i];
		// 	item.x = apex[item.apex].x;
		// 	item.y = apex[item.apex].y;
		// 	if (Math.abs(x - item.x) < 10 && Math.abs(y - item.y) < 10) {
		// 		let bool = switcher[i].switch ? false : true;
		// 		switcher[i].switch = bool;
		// 		break;
		// 	}
		// }
	}

	function clickDown(e) {
		return;
		if (click_timer) clearTimeout(click_timer);
		isHold = false;
		let x1 = parseInt((e.layerX * scale) / radio) - deltaX / radio;
		let y1 = parseInt((e.layerY * scale) / radio) - deltaY / radio;
		let name = "A" + (number + 1);

		let isHave = false;
		for (let key in apex_gas) {
			if (Math.abs(apex_gas[key].x - x1) <= 8 && Math.abs(apex_gas[key].y - y1) <= 8) {
				isHave = true;
				x1 = Number(apex_gas[key].x);
				y1 = Number(apex_gas[key].y);
				name = key.toString();
				console.log(name);
				// 将当前点变为switcher

				sn = $("#sn").val();
				if (sn) {
					sn = sn == 999 ? "" : sn;
					let s = { name: sn, dir: dir };
					apex_gas[key].type = "switcher";
					apex_gas[key].switcher = s;
					localStorage.setItem("a_gas", JSON.stringify(apex_gas));
				}

				break;
			}
		}
		click_position = { x1, y1, name, isHave };
		click_timer = setTimeout(() => {
			isHold = true;
		}, 500);

		if (!sn) handleSwitcher(name);
	}

	function clickUp(e) {
		return;
		let { x1, y1, name } = click_position;
		if (!isHold) {
			console.log(x1, y1, name);
			return;
		}
		isHold = false;
		if (!click_position.isHave) {
			number++;
		}
		let x2 = parseInt((e.layerX * scale) / radio) - deltaX / radio;
		let y2 = parseInt((e.layerY * scale) / radio) - deltaY / radio;
		let name2 = "A" + (number + 1);

		let isHave = false;
		let addType = "gas";
		let obj = addType == "gas" ? apex_gas : apex;
		let obj2 = addType == "gas" ? matrix_gas : matrix;

		for (let key in obj) {
			if (Math.abs(obj[key].x - x2) <= 8 && Math.abs(obj[key].y - y2) <= 8) {
				isHave = true;
				x2 = Number(obj[key].x);
				y2 = Number(obj[key].y);
				name2 = key.toString();
				break;
			}
		}
		if (!isHave) {
			number++;
		}

		if (!click_position.isHave || !isHave) {
			if (!click_position.isHave) {
				obj[name] = { x: x1, y: y1, tube: "gas" };
				obj2[name] = {};
			}
			if (!isHave) {
				obj[name2] = { x: x2, y: y2, tube: "gas" };
				obj2[name2] = {};
			}
			obj2[name][name2] = 1;
			obj2[name2][name] = 1;

			let w = Math.abs(x1 - x2);
			let h = Math.abs(y1 - y2);

			w > h ? (y2 = Number(y1)) : (x2 = Number(x1));
			obj[name2] = { x: x2, y: y2, tube: "gas" };
			localStorage.setItem("a_gas", JSON.stringify(obj));
			localStorage.setItem("m_gas", JSON.stringify(obj2));
		} else {
			obj2[name][name2] = 1;
			obj2[name2][name] = 1;
			localStorage.setItem("m_gas", JSON.stringify(obj2));
		}

		if (addType == "gas") {
			apex_gas = obj;
			matrix_gas = obj2;
		} else {
			apex = obj;
			matrix = obj2;
		}

		// 绘制圆点
		// ctx.beginPath();
		// ctx.arc(x, y, 6, 0, 2 * Math.PI);
		// ctx.fill();
		// ctx.stroke();
	}
	function getAllTubes(m) {
		let tubeObj = {};
		for (let key1 in m) {
			for (let key2 in m[key1]) {
				let item = m[key1][key2];
				if (item) {
					let a = Number(key1.split("A")[1]);
					let b = Number(key2.split("A")[1]);
					let key = a < b ? "A" + a + "_" + "A" + b : "A" + b + "_" + "A" + a;
					if (tubeObj[key] === undefined) tubeObj[key] = false;
				}
			}
		}
		return tubeObj;
	}

	function drawTubes() {
		let tubeObj = getAllTubes(matrix);

		// for (let key1 in tubeObj) {
		// 	if (tubeObj[key1]) break;
		// 	let point1 = key1.split("_");
		// 	let type1 = apex[point1[0]].x == apex[point1[1]].x ? "v" : "h";

		// 	for (let key2 in tubeObj) {
		// 		let point2 = key2.split("_");
		// 		let type2 = apex[point2[0]].x == apex[point2[1]].x ? "v" : "h";
		// 		if (!tubeObj[key2] && key1 != key2 && type1 == type2) {
		// 			let a, b, key;
		// 			if (point1[0] == point2[0]) {
		// 				a = Number(point1[1].split("A")[1]);
		// 				b = Number(point2[1].split("A")[1]);
		// 			} else if (point1[0] == point2[1]) {
		// 				a = Number(point1[1].split("A")[1]);
		// 				b = Number(point2[0].split("A")[1]);
		// 			} else if (point1[1] == point2[0]) {
		// 				a = Number(point1[0].split("A")[1]);
		// 				b = Number(point2[1].split("A")[1]);
		// 			} else if (point1[1] == point2[1]) {
		// 				a = Number(point1[0].split("A")[1]);
		// 				b = Number(point2[0].split("A")[1]);
		// 			}
		// 			if (a) {
		// 				tubeObj[key1] = true;
		// 				tubeObj[key2] = true;
		// 				key =
		// 					a < b
		// 						? "A" + a + "_" + "A" + b
		// 						: "A" + b + "_" + "A" + a;
		// 				tubeObj[key] = false;
		// 			}
		// 		}
		// 	}
		// }
		for (let key in tubeObj) {
			if (tubeObj[key] === false) {
				let point = key.split("_");
				let a = Number(point[0].split("A")[1]);
				let b = Number(point[1].split("A")[1]);
				let path = a < b ? "A" + a + "_" + "A" + b : "A" + b + "_" + "A" + a;
				let item = {
					x1: apex[point[0]].x,
					y1: apex[point[0]].y,
					x2: apex[point[1]].x,
					y2: apex[point[1]].y,
				};
				if (specialTube[path]) {
					// 特殊管道绘制
					drawSpecialTube(specialTube[path], item);
				} else {
					let item = {
						x1: apex[point[0]].x,
						y1: apex[point[0]].y,
						x2: apex[point[1]].x,
						y2: apex[point[1]].y,
						point1: apex[point[0]],
						point2: apex[point[1]],
					};
					item.type = item.x1 == item.x2 ? "v" : "h";
					liquidTube(item);
				}
			}
		}

		if (isDrawPoint) {
			for (let key in apex) {
				if (apex[key].type != "switcher") {
					ctx.font = "24px 黑体";
					ctx.fillStyle = "#f00";
					ctx.fillText(key, apex[key].x, apex[key].y);
				}
			}
		}
	}

	function drawGasTubes() {
		let tubeObj = getAllTubes(matrix_gas);
		for (let key in tubeObj) {
			if (tubeObj[key] === false) {
				let point = key.split("_");
				let a = Number(point[0].split("A")[1]);
				let b = Number(point[1].split("A")[1]);
				let path = a < b ? "A" + a + "_" + "A" + b : "A" + b + "_" + "A" + a;
				let item = {
					x1: apex_gas[point[0]].x,
					y1: apex_gas[point[0]].y,
					x2: apex_gas[point[1]].x,
					y2: apex_gas[point[1]].y,
					point1: apex_gas[point[0]],
					point2: apex_gas[point[1]],
				};
				if (specialTube_gas[path]) {
					// 特殊管道绘制
					drawSpecialTube(specialTube_gas[path], item);
				} else {
					item.type = item.x1 == item.x2 ? "v" : "h";
					liquidTube(item);
				}
			}
		}

		if (isDrawPoint) {
			for (let key in apex_gas) {
				if (apex_gas[key].type != "switcher") {
					ctx.font = "24px 黑体";
					ctx.fillStyle = "#f00";
					ctx.fillText(key, apex_gas[key].x, apex_gas[key].y);
				}
			}
		}
	}

	var new_matrix = {};
	function drawConnectTubes() {
		for (let key in apex) {
			if (apex[key].type && apex[key].type == "input") {
				let arr = checkTubsForwards(matrix, apex, key);
				if (arr.length) {
					// foreachMatrix(key, output);
					// arr = getNewArr(new_matrix);
					arr = arr.forEach((path) => {
						let point = path.split("_");
						let a = Number(point[0].split("A")[1]);
						let b = Number(point[1].split("A")[1]);
						path = a < b ? "A" + a + "_" + "A" + b : "A" + b + "_" + "A" + a;
						let item = {
							x1: apex[point[0]].x,
							y1: apex[point[0]].y,
							x2: apex[point[1]].x,
							y2: apex[point[1]].y,
							point1: apex[point[0]],
							point2: apex[point[1]],
						};
						if (specialTube[path]) {
							// 特殊管道绘制
							drawSpecialTube(specialTube[path], item, true);
						} else {
							item.type = item.x1 == item.x2 ? "v" : "h";
							liquidTube(item, true);
						}
					});
				}
			}
		}
	}

	function drawConnectGas() {
		for (let key in apex_gas) {
			if (apex_gas[key].type && apex_gas[key].type == "input") {
				let arr = checkTubsForwards(matrix_gas, apex_gas, key);
				if (arr.length) {
					// foreachMatrix(key, output);
					// arr = getNewArr(new_matrix);
					arr = arr.forEach((path) => {
						let point = path.split("_");
						let a = Number(point[0].split("A")[1]);
						let b = Number(point[1].split("A")[1]);
						path = a < b ? "A" + a + "_" + "A" + b : "A" + b + "_" + "A" + a;
						let item = {
							x1: apex_gas[point[0]].x,
							y1: apex_gas[point[0]].y,
							x2: apex_gas[point[1]].x,
							y2: apex_gas[point[1]].y,
							point1: apex_gas[point[0]],
							point2: apex_gas[point[1]],
						};
						if (specialTube_gas[path]) {
							// 特殊管道绘制
							drawSpecialTube(specialTube_gas[path], item, true);
						} else {
							item.type = item.x1 == item.x2 ? "v" : "h";
							liquidTube(item, true);
						}
					});
				}
			}
		}
	}

	function getNewArr(m) {
		let arr = [];
		for (let point1 in m) {
			for (let point2 in m[point1]) {
				arr.push(point1 + "_" + point2);
			}
		}
		return arr;
	}

	function foreachMatrix(point1, output) {
		for (let point2 in new_matrix[point1]) {
			if (!new_matrix[point2] && output.indexOf(point2) < 0) {
				if (new_matrix[point1]) delete new_matrix[point1][point2];
				let keys = Object.keys(new_matrix[point1]);
				if (!keys.length) {
					delete new_matrix[point1];
					for (let key in new_matrix) {
						if (new_matrix[key] && new_matrix[key][point1]) {
							foreachMatrix(key, output);
						}
					}
				}
			} else {
				foreachMatrix(point2, output);
			}
		}
	}

	function checkTubsForwards(_matrix, _apex, point1, arr) {
		arr = arr || [];

		for (let point2 in _matrix[point1]) {
			let a = Number(point1.split("A")[1]);
			let b = Number(point2.split("A")[1]);
			let path = a < b ? "A" + a + "_" + "A" + b : "A" + b + "_" + "A" + a;
			let status = _apex[point2] && _apex[point2].switcher ? data["FMFK_" + _apex[point2].switcher.name] : false;
			if (!status) status = _apex[point2].type == "pump" && data["HMI_B" + _apex[point2].pump + "YXZS"];
			if (_apex[point2] && _apex[point2].type == "switcher" && !status) {
				if (arr.indexOf(path) < 0) {
					arr.push(path);
				}
			} else {
				if (arr.indexOf(path) < 0) {
					arr.push(path);
					arr = checkTubsForwards(_matrix, _apex, point2, arr);
				}
			}
		}
		return arr;
	}
</script>

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title></title>

		<script src="./assets/js/jquery-1.11.1.min.js"></script>
		<script src="./assets/oxygen/matrix.js"></script>
		<script src="./assets/js/oxygen.js"></script>
		<style>
			body,
			html {
				padding: 0;
				margin: 0;
				background-color: #002f63;
			}

			* {
				-webkit-box-sizing: border-box;
				box-sizing: border-box;
			}

			.container {
				position: relative;
				color: #000;
			}

			canvas {
				display: block;
				margin: auto;
			}
		</style>
	</head>
	<body>
		<div id="container" class="container">
			<canvas
				id="canvas"
				onmousedown="clickDown(event)"
				onmouseup="clickUp(event)"
				width="2900"
				height="1600"
			></canvas>
		</div>
	</body>
</html>

<script>
	var container,
		canvas,
		ctx,
		scale,
		deltaX = 0,
		deltaY = 0,
		width = 2900,
		height = 1600,
		fps = 2,
		img1 = new Image(),
		img2 = new Image(),
		ratio = 1;

	var number = 0;
	var data = {};
	$(function () {
		// 计算新节点名称
		let keys = Object.keys(apex);
		number = keys.length ? Number(keys[keys.length - 1].split("A")[1]) : 0;

		// 初始化canvas画布
		container = $("#container");
		canvas = $("#canvas");
		ctx = canvas[0].getContext("2d");

		img1.src = "./assets/img/icon-1.png";
		img2.src = "./assets/img/icon-2.png";

		// 计算画布大小
		getSize();
		// 绘制
		draw();
	});

	// 绘制
	function draw() {
		// 计算帧率
		let t = 1000 / fps;
		ctx.save();
		// 清除画布
		ctx.clearRect(0, 0, width, height);
		// 填充背景色
		ctx.fillStyle = "#002f63";
		ctx.fillRect(0, 0, width, height);
		ctx.translate(deltaX, deltaY);
		ctx.scale(ratio, ratio);

		// 绘制主要信息
		drawInfo();
		// 绘制状态栏
		drawStatusBlock();
		// 绘制管道
		drawTubes();
		// 绘制罐体
		drawTanks();
		// 绘制火箭
		drawRocket();
		// 绘制降温器
		drawCooler();
		// 绘制液位计
		drawLiquidomes();
		// 绘制传感器参数
		drawSensors();
		ctx.drawImage(img1, 1285, 797, img1.width / 2.1, img1.height / 2.1);
		ctx.restore();

		setTimeout(() => {
			draw();
		}, 1000 / fps);
	}

	function drawTanks() {
		let arr = [
			{ x: 320, y: 700, name: "液氧固定罐A" },
			{ x: 320, y: 1120, name: "液氧固定罐B" },
		];
		arr.forEach((item) => {
			drawTank(item);
		});
	}

	function getAllTubes(m) {
		let tubeObj = {};
		for (let key1 in m) {
			for (let key2 in m[key1]) {
				let item = m[key1][key2];
				if (item) {
					let a = Number(key1.split("A")[1]);
					let b = Number(key2.split("A")[1]);
					let key =
						a < b
							? "A" + a + "_" + "A" + b
							: "A" + b + "_" + "A" + a;
					if (tubeObj[key] === undefined) tubeObj[key] = false;
				}
			}
		}
		return tubeObj;
	}

	function drawTubes() {
		let tubeObj = getAllTubes(matrix);
		let { arr, apexArr } = getConnectTubes();

		for (let key in tubeObj) {
			if (tubeObj[key] === false) {
				let point = key.split("_");
				let a = Number(point[0].split("A")[1]);
				let b = Number(point[1].split("A")[1]);
				let path =
					a < b ? "A" + a + "_" + "A" + b : "A" + b + "_" + "A" + a;
				let item = {
					x1: apex[point[0]].x,
					y1: apex[point[0]].y,
					x2: apex[point[1]].x,
					y2: apex[point[1]].y,
					point1: apex[point[0]],
					point2: apex[point[1]],
				};
				item.type = item.x1 == item.x2 ? "v" : "h";
				liquidTube(item, arr.indexOf(path) >= 0);
			}
		}

		for (let key in apex) {
			if (apex[key].type == "liquidome") {
				drawLiquidome(apex[key]);
			}
			if (apex[key].type == "switcher") {
				drawSwitcher(apex[key], apex[key].switcher.status);
			}
			if (apex[key].type == "output") {
				drawOutput(apex[key]);
			}
			if (apex[key].apex_type) {
				drawApex(apex[key], apexArr.indexOf(key) >= 0);
			}
			// ctx.font = "24px 黑体";
			// ctx.fillStyle = "#f00";
			// ctx.fillText(key, apex[key].x, apex[key].y);
		}
	}

	function getConnectTubes() {
		let arr = [],
			apexArr = [];
		for (let key in apex) {
			if (apex[key].type && apex[key].type == "input") {
				let result = checkTubsForwards(key);
				let a = new Set([...arr, ...result.arr]);
				let b = new Set([...apexArr, ...result.apexArr]);
				arr = [];
				apexArr = [];
				a.forEach((item) => {
					arr.push(item);
				});
				b.forEach((item) => {
					apexArr.push(item);
				});
			}
		}
		return { arr, apexArr };
	}

	var click_position = {},
		click_timer = false,
		isHold = false;
	function clickDown(e) {
		return;
		if (click_timer) clearTimeout(click_timer);
		isHold = false;
		let x1 = parseInt(e.offsetX / scale / ratio) - deltaX / ratio;
		let y1 = parseInt(e.offsetY / scale / ratio) - deltaY / ratio;
		let name = "A" + (number + 1);

		let isHave = false;
		for (let key in apex) {
			if (
				Math.abs(apex[key].x - x1) <= 15 &&
				Math.abs(apex[key].y - y1) <= 15
			) {
				isHave = true;
				x1 = Number(apex[key].x);
				y1 = Number(apex[key].y);
				name = key.toString();
				console.log(name);
				// 将当前点变为switcher

				sn = $("#sn").val();
				if (sn) {
					sn = sn == 999 ? "" : sn;
					let s = { name: sn, dir: dir };
					apex[key].type = "switcher";
					apex[key].switcher = s;
					localStorage.setItem("apex", JSON.stringify(apex));
				}

				break;
			}
		}
		click_position = { x1, y1, name, isHave };
		click_timer = setTimeout(() => {
			isHold = true;
		}, 500);
	}
	function clickUp(e) {
		return;
		let { x1, y1, name } = click_position;
		if (!isHold) {
			console.log(x1, y1, name);
			return;
		}
		isHold = false;
		if (!click_position.isHave) {
			number++;
		}
		let x2 = parseInt(e.offsetX / scale / ratio) - deltaX / ratio;
		let y2 = parseInt(e.offsetY / scale / ratio) - deltaY / ratio;
		let name2 = "A" + (number + 1);

		let isHave = false;
		let addType = "";
		let obj = apex;
		let obj2 = matrix;

		for (let key in obj) {
			if (
				Math.abs(obj[key].x - x2) <= 15 &&
				Math.abs(obj[key].y - y2) <= 15
			) {
				isHave = true;
				x2 = Number(obj[key].x);
				y2 = Number(obj[key].y);
				name2 = key.toString();
				break;
			}
		}
		if (!isHave) {
			number++;
		}

		if (!click_position.isHave || !isHave) {
			if (!click_position.isHave) {
				obj[name] = { x: x1, y: y1 };
				obj2[name] = {};
			}
			if (!isHave) {
				obj[name2] = { x: x2, y: y2 };
				obj2[name2] = {};
			}
			obj2[name][name2] = 1;
			obj2[name2][name] = 1;

			let w = Math.abs(x1 - x2);
			let h = Math.abs(y1 - y2);

			w > h ? (y2 = Number(y1)) : (x2 = Number(x1));
			obj[name2] = { x: x2, y: y2 };
			localStorage.setItem("apex", JSON.stringify(obj));
			localStorage.setItem("matrix", JSON.stringify(obj2));
		} else {
			obj2[name][name2] = 1;
			obj2[name2][name] = 1;
			localStorage.setItem("matrix", JSON.stringify(obj2));
		}

		if (addType == "gas") {
			// apex_gas = obj;
			// matrix_gas = obj2;
		} else {
			apex = obj;
			matrix = obj2;
		}
	}
</script>