var mapUtil = mapUtil || {}; const nullPoint = 65535; (function(_, joint) { 'use strict'; mapUtil.findElement = function (type, sn) { let eles = graph.getElements(); for (let i in eles) { let ele = eles[i]; let eleType = ele.get("type"); let eleSn = ele.attr("sn/id"); if (_.startsWith(eleType, type)) { // console.log("ele", ele, eleType, eleSn, typeof(eleSn)); if (eleSn + "" === sn + "") { return ele; } } } return null; }; mapUtil.findElements = function(type){ let eles = graph.getElements(); let rets = []; for (let i in eles) { let ele = eles[i]; let eleType = ele.get("type"); if (_.startsWith(eleType, type)) { rets.push(ele) } } return rets; }; mapUtil.getAgv = function (sn) { return mapUtil.findElement("agv", sn); }; mapUtil.getStation = function (sn) { return mapUtil.findElement("st", sn); }; mapUtil.getPt = function (sn) { return mapUtil.findElement("pt", sn) }; mapUtil.isNotStation = function(element) { let tp = element.get("type") //console.log("tp", tp) if (_.startsWith(tp, "st.")){ // console.log("is station") return false } return true }; mapUtil.getLink = function(linkId){ let links = graph.getLinks(); for (let i in links){ // let link = links[i]; let linkSn = links[i].attr("sn/id"); if(linkId + "" === linkSn){ return links[i]; } } return null; }; mapUtil.getLinkView = function(paper, linkId){ let links = graph.getLinks(); for (let i in links){ // let link = links[i]; let linkSn = links[i].attr("sn/id"); if(linkId + "" === linkSn){ return links[i].findView(paper); } } return null; }; mapUtil.findLink = function(links, srcId, dstId) { let l; for (let i in links) { l = links[i]; if ((l.source().id === srcId) && (l.target().id === dstId)) { return l; } } return null; }; mapUtil.showAgvAtDefault = function (agv, agvId) { agv.rotate(0, true); agv.position(agvId * 100 + 500, 30); }; mapUtil.showAgvPosition = function (status) { let agvId = status.AgvId; let stationId = status.Station; let linkId = status.Point; let CrossType = status.CrossType; // 界面上找到AGV let agv = mapUtil.getAgv(agvId); agv.set("z", 9999); agv.toFront(); // 如果AGV在站点上,则直接放置在站点上 if(stationId !== nullPoint){ let st = mapUtil.getStation(stationId); if (st === null){ mapUtil.showAgvAtDefault(agv, agvId) return; } let pos = st.position() agv.rotate(0, true); agv.position(pos.x, pos.y); return; } // 查找对应的路线 let link = mapUtil.getLink(linkId); if (link === null){ mapUtil.showAgvAtDefault(agv, agvId); return; } let pose = link.attr("agv/pose"); let linkV = link.findView(paper); let preAction = status.DRAction >> 4; //let tangle = mapUtil.getTangentAngle(linkV.getTangentAtRatio(0.5)); //let angle = tangle - 180 + 90 * pose; let isOutCross = false; if (((CrossType === 2) && (pose === 1 || pose === 2))||((CrossType === 1) && (pose === 3 || pose === 4))){ isOutCross = true; } if(CrossType === 3 || isOutCross === true){ // 已经走到link后面的十字路口 let cross; console.log("linkId", linkId, preAction, pose); if(pose === preAction){ cross = link.getTargetElement(); console.log("t") }else{ cross = link.getSourceElement(); console.log("s") } if (cross === null){ mapUtil.showAgvAtDefault(agv, agvId); return; } let pos = cross.position(); agv.rotate(0, true); agv.position(pos.x, pos.y); }else{ // 放在link的中心线上 let pos = linkV.getPointAtRatio(0.5); pos.x = pos.x - 15; pos.y = pos.y - 15; agv.rotate(0, true); agv.position(pos.x, pos.y); } }; mapUtil.getTangentAngle = function (tangent) { // 直角的边长 let x = tangent.end.x - tangent.start.x; let y = tangent.end.y - tangent.start.y; let ax = Math.abs(x); let ay = Math.abs(y); let an = Math.atan(Math.tan(ay/ax)); console.log("an", an); // 斜边长 let z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); // 余弦 let cos = y / z; // 弧度 let radina = Math.acos(cos); console.log("radina", radina); // 角度 let angle = 180 / (Math.PI / radina); return angle; } })(_, joint);