| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- 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;
- };
|