include("scripts/EAction.js"); include("scripts/simple.js"); function FileCTR() { this.ratio = 10.0; // 桥梁数据 {起点、终点、中点} this.bridgeArrayData = new Array(); // 隧道数据 {开始、结束} this.tunnelArrayData = new Array(); } // 获取桥梁数据 FileCTR.prototype.getBridgeArray = function () { return this.bridgeArrayData; }; // 获取隧道数据 FileCTR.prototype.getTunnelArray = function () { return this.tunnelArrayData; }; // 读取CRT文件 FileCTR.prototype.readTxt = function (file) { var reader = new QFile(file); var flags = makeQIODeviceOpenMode(QIODevice.ReadOnly, QIODevice.Text); if (!reader.open(flags)) { EAction.handleUserWarning("cannot open file: " + file); return false; } var ts = new QTextStream(reader); setUtf8Codec(ts); var readBridge = false; var readTunnel = false; do { var textLine = ts.readLine().trim(); textLine = textLine.replace(/[\t]+/g, " ").replace(/[\s]+/g, " "); if (textLine.indexOf("QHSJ.DAT") != -1) { readBridge = true; continue; } else if (textLine.indexOf("SUIDAO.DAT") != -1) { readTunnel = true; continue; } // 读取桥梁数据 if (readBridge) { var fields = textLine.split(" "); if (fields.length < 3) { readBridge = false; continue; } qDebug(parseFloat(fields[0])); qDebug(parseFloat(fields[1])); qDebug(parseFloat(fields[2])); // 桥梁数据:起点、终点、中点 this.bridgeArrayData.push([fields[0] / this.ratio, fields[1] / this.ratio, fields[2] / this.ratio]); } else if (readTunnel) { var fields = textLine.split(" "); if (fields.length < 2) { readTunnel = false; continue; } qDebug(parseFloat(fields[0])); qDebug(parseFloat(fields[1])); // 隧道数据 this.tunnelArrayData.push([fields[0] / this.ratio, fields[1] / this.ratio]); } } while (!ts.atEnd()); reader.close(); return true; }; // 绘画桥梁 FileCTR.prototype.applyBridge = function (zdmArrayData, dmxArrayData, PDColor) { var bridgeArray = this.bridgeArrayData; if (bridgeArray.length == 0) { EAction.handleUserMessage("bridge(CTR) data is empty..."); return false; } if (zdmArrayData.length == 0) { EAction.handleUserMessage("DMX data is empty..."); return false; } PDColor = PDColor ? PDColor : new RColor(31, 57, 197); for (var a = 0; a < bridgeArray.length; a++) { // 桥梁的开始 var bridgeStart = bridgeArray[a][0]; // 桥梁的结束 var bridgeEnd = bridgeArray[a][1]; // 桥梁的中间 var bridgeMiddleX = bridgeArray[a][2]; for (var b = 0; b < zdmArrayData.length - 1; b++) { var foreNodeX = zdmArrayData[b][0]; var foreNodeY = zdmArrayData[b][1]; var nextNodeX = zdmArrayData[b + 1][0]; var nextNodeY = zdmArrayData[b + 1][1]; if (bridgeStart >= foreNodeX && bridgeStart < nextNodeX) { // 开始绘画桥梁 var bridgeStartY = this.findIntersection(foreNodeX,foreNodeY,nextNodeX,nextNodeY,bridgeStart).y; addPolylinetoView([[bridgeStart,bridgeStartY-3],[nextNodeX,nextNodeY-3]], false, false, 0, PDColor); var dmxPoint = this.findPointByArray(dmxArrayData,bridgeStart); if(dmxPoint){ addPolylinetoView([[bridgeStart,bridgeStartY],[dmxPoint.x,dmxPoint.y]], false, false, 0, PDColor); }else{ EAction.handleUserMessage("开始绘画桥梁,未找到地面线上的点, x: " + bridgeStart.toString()); } } else if (foreNodeX > bridgeStart && nextNodeX < bridgeEnd) { // 绘画桥梁 addPolylinetoView([[foreNodeX,foreNodeY-3],[nextNodeX,nextNodeY-3]], false, false, 0, PDColor); } else if (bridgeEnd >= foreNodeX && bridgeEnd < nextNodeX) { // 结束绘画桥梁 var bridgeEndY = this.findIntersection(foreNodeX,foreNodeY,nextNodeX,nextNodeY,bridgeEnd).y; addPolylinetoView([[bridgeEnd,bridgeEndY-3],[foreNodeX,foreNodeY-3]], false, false, 0, PDColor); var dmxPoint = this.findPointByArray(dmxArrayData,bridgeEnd); if(dmxPoint){ addPolylinetoView([[bridgeEnd,bridgeEndY],[dmxPoint.x,dmxPoint.y]], false, false, 0, PDColor); }else{ EAction.handleUserMessage("结束绘画桥梁,未找到地面线上的点, x: " + bridgeStart.toString()); } } } var middleZdm = this.findPointByArray(zdmArrayData, bridgeMiddleX); if(!middleZdm){ EAction.handleUserMessage("绘画桥梁中间,未找到纵断线上的点, bridgeMiddleX: " + bridgeMiddleX.toString()); return; } var middleDmx = this.findPointByArray(dmxArrayData, bridgeMiddleX); if(!middleDmx){ EAction.handleUserMessage("绘画桥梁中间,未找到地面线上的点, bridgeMiddleX: " + bridgeMiddleX.toString()); return; } addPolylinetoView([[middleZdm.x,middleZdm.y-3],[middleDmx.x,middleDmx.y]], false, false, 0, PDColor); addSimpleTextToView("K" + (bridgeMiddleX).toString(), [middleZdm.x,middleZdm.y+6], 10, 90 , "Standard" , RS.VAlignTop, RS.HAlignLeft, false, false, 0); } }; FileCTR.prototype.applyTunnel = function (zdmArrayData, PDColor){ if (this.tunnelArrayData.length == 0) { EAction.handleUserMessage("tunnel(CTR) data is empty..."); return false; } if (zdmArrayData.length == 0) { EAction.handleUserMessage("DMX data is empty..."); return false; } for (var i = 0; i < this.tunnelArrayData.length; i++) { var startPoint = this.findPointByArray(zdmArrayData,this.tunnelArrayData[i][0]); if(!startPoint){ EAction.handleUserMessage("隧道开始节点,未找到纵断线上的点, x: " + this.tunnelArrayData[i][0].toString()); continue; } var endPoint = this.findPointByArray(zdmArrayData,this.tunnelArrayData[i][1]); if(!endPoint){ EAction.handleUserMessage("隧道结束节点,未找到纵断线上的点, x: " + this.tunnelArrayData[i][1].toString()); continue; } addPolylinetoView([[startPoint.x, startPoint.y], [startPoint.x, startPoint.y+6] ],false,false,0,new RColor(255, 255, 0)); addPolylinetoView([[startPoint.x, startPoint.y+3], [endPoint.x, endPoint.y+3] ],false,false,0,new RColor(255, 255, 0)); addPolylinetoView([[endPoint.x, endPoint.y], [endPoint.x, endPoint.y+6] ],false,false,0,new RColor(255, 255, 0)); } } // 已知两个坐标的点,求指定x垂直线和已知两点的交点 FileCTR.prototype.findIntersection = function (x1, y1, x2, y2, xVertical) { // 如果两点的x坐标相同,则说明这两点在x=50的线上,交点即为它们之一 if (x1 === xVertical) { return { x: x1, y: y1 }; } else if (x2 === xVertical) { return { x: x2, y: y2 }; } // 计算交点的y坐标 const yIntersection = ((xVertical - x1) / (x2 - x1)) * (y2 - y1) + y1; return { x: xVertical, y: yIntersection }; }; FileCTR.prototype.findPointByArray = function (pointArray, x) { if (pointArray && pointArray.length > 0) { for (var i = 0; i < pointArray.length - 1; i++) { var foreNodeX = pointArray[i][0]; var foreNodeY = pointArray[i][1]; var nextNodeX = pointArray[i + 1][0]; var nextNodeY = pointArray[i + 1][1]; if (x >= foreNodeX && x <= nextNodeX) { return this.findIntersection(foreNodeX, foreNodeY, nextNodeX, nextNodeY, x); } } } return undefined; };