include("scripts/EAction.js"); include("scripts/simple.js"); include("scripts/Common/DrawingUtils.js"); function FileCTR(file, ratio) { // 比例尺 this.ratio = ratio || 1.0; // 桥梁数据 {起点、终点、中点} this.bridgeArrayData = new Array(); // 隧道数据 {开始、结束} this.tunnelArrayData = new Array(); // 图层名称 this.layername = "CTR-" + Math.floor(Math.random() * 100); this.readTxt(file); } // 获取桥梁数据 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; } EAction.handleUserMessage("Starting to load CTR file: " + file); 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; } EAction.handleUserMessage("ctr-84: " + formatDateTime()); 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); addPolylinetoView([[bridgeStart, bridgeStartY - 3], [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); addPolylinetoView([[bridgeEnd, bridgeEndY - 3], [dmxPoint.x, dmxPoint.y]], false, false, 0, PDColor); } else { EAction.handleUserMessage("结束绘画桥梁,未找到地面线上的点, x: " + bridgeStart.toString()); } } } EAction.handleUserMessage("ctr-123: " + formatDateTime()); 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; } EAction.handleUserMessage("ctr-134: " + formatDateTime()); addPolylinetoView([[middleZdm.x, middleZdm.y - 3], [middleDmx.x, middleDmx.y]], false, false, 0, PDColor); // 里程格式和ZDM里程格式一致 // 里程单位是km,格式应该为K000+000.000 addSimpleTextToView(formatStake(bridgeMiddleX * this.ratio), [middleZdm.x + 5, middleZdm.y + 2], 10, 90, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 0); addPolylinetoView([[middleZdm.x, middleZdm.y], [middleZdm.x, middleZdm.y + 50]], false, false, 0, PDColor); } }; 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; };