FileCTR.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. include("scripts/EAction.js");
  2. include("scripts/simple.js");
  3. function FileCTR(file, ratio) {
  4. // 比例尺
  5. this.ratio = ratio || 1.0;
  6. // 桥梁数据 {起点、终点、中点}
  7. this.bridgeArrayData = new Array();
  8. // 隧道数据 {开始、结束}
  9. this.tunnelArrayData = new Array();
  10. // 图层名称
  11. this.layername = "CTR-" + Math.floor(Math.random() * 100);
  12. this.readTxt(file);
  13. }
  14. // 获取桥梁数据
  15. FileCTR.prototype.getBridgeArray = function () {
  16. return this.bridgeArrayData;
  17. };
  18. // 获取隧道数据
  19. FileCTR.prototype.getTunnelArray = function () {
  20. return this.tunnelArrayData;
  21. };
  22. // 读取CRT文件
  23. FileCTR.prototype.readTxt = function (file) {
  24. var reader = new QFile(file);
  25. var flags = makeQIODeviceOpenMode(QIODevice.ReadOnly, QIODevice.Text);
  26. if (!reader.open(flags)) {
  27. EAction.handleUserWarning("cannot open file: " + file);
  28. return false;
  29. }
  30. EAction.handleUserMessage("Starting to load CTR file: " + file);
  31. var ts = new QTextStream(reader);
  32. setUtf8Codec(ts);
  33. var readBridge = false;
  34. var readTunnel = false;
  35. do {
  36. var textLine = ts.readLine().trim();
  37. textLine = textLine.replace(/[\t]+/g, " ").replace(/[\s]+/g, " ");
  38. if (textLine.indexOf("QHSJ.DAT") != -1) {
  39. readBridge = true;
  40. continue;
  41. } else if (textLine.indexOf("SUIDAO.DAT") != -1) {
  42. readTunnel = true;
  43. continue;
  44. }
  45. // 读取桥梁数据
  46. if (readBridge) {
  47. var fields = textLine.split(" ");
  48. if (fields.length < 3) {
  49. readBridge = false;
  50. continue;
  51. }
  52. qDebug(parseFloat(fields[0]));
  53. qDebug(parseFloat(fields[1]));
  54. qDebug(parseFloat(fields[2]));
  55. // 桥梁数据:起点、终点、中点
  56. this.bridgeArrayData.push([fields[0] / this.ratio, fields[1] / this.ratio, fields[2] / this.ratio]);
  57. } else if (readTunnel) {
  58. var fields = textLine.split(" ");
  59. if (fields.length < 2) {
  60. readTunnel = false;
  61. continue;
  62. }
  63. qDebug(parseFloat(fields[0]));
  64. qDebug(parseFloat(fields[1]));
  65. // 隧道数据
  66. this.tunnelArrayData.push([fields[0] / this.ratio, fields[1] / this.ratio]);
  67. }
  68. } while (!ts.atEnd());
  69. reader.close();
  70. return true;
  71. };
  72. // 绘画桥梁
  73. FileCTR.prototype.applyBridge = function (zdmArrayData, dmxArrayData, PDColor) {
  74. var bridgeArray = this.bridgeArrayData;
  75. if (bridgeArray.length == 0) {
  76. EAction.handleUserMessage("bridge(CTR) data is empty...");
  77. return false;
  78. }
  79. if (zdmArrayData.length == 0) {
  80. EAction.handleUserMessage("DMX data is empty...");
  81. return false;
  82. }
  83. EAction.handleUserMessage("ctr-84: " + formatDateTime());
  84. PDColor = PDColor ? PDColor : new RColor(31, 57, 197);
  85. for (var a = 0; a < bridgeArray.length; a++) {
  86. // 桥梁的开始
  87. var bridgeStart = bridgeArray[a][0];
  88. // 桥梁的结束
  89. var bridgeEnd = bridgeArray[a][1];
  90. // 桥梁的中间
  91. var bridgeMiddleX = bridgeArray[a][2];
  92. for (var b = 0; b < zdmArrayData.length - 1; b++) {
  93. var foreNodeX = zdmArrayData[b][0];
  94. var foreNodeY = zdmArrayData[b][1];
  95. var nextNodeX = zdmArrayData[b + 1][0];
  96. var nextNodeY = zdmArrayData[b + 1][1];
  97. if (bridgeStart >= foreNodeX && bridgeStart < nextNodeX) {
  98. // 开始绘画桥梁
  99. var bridgeStartY = this.findIntersection(foreNodeX, foreNodeY, nextNodeX, nextNodeY, bridgeStart).y;
  100. addPolylinetoView([[bridgeStart, bridgeStartY - 3], [nextNodeX, nextNodeY - 3]], false, false, 0, PDColor);
  101. var dmxPoint = this.findPointByArray(dmxArrayData, bridgeStart);
  102. if (dmxPoint) {
  103. addPolylinetoView([[bridgeStart, bridgeStartY], [dmxPoint.x, dmxPoint.y]], false, false, 0, PDColor);
  104. } else {
  105. EAction.handleUserMessage("开始绘画桥梁,未找到地面线上的点, x: " + bridgeStart.toString());
  106. }
  107. } else if (foreNodeX > bridgeStart && nextNodeX < bridgeEnd) {
  108. // 绘画桥梁
  109. addPolylinetoView([[foreNodeX, foreNodeY - 3], [nextNodeX, nextNodeY - 3]], false, false, 0, PDColor);
  110. } else if (bridgeEnd >= foreNodeX && bridgeEnd < nextNodeX) {
  111. // 结束绘画桥梁
  112. var bridgeEndY = this.findIntersection(foreNodeX, foreNodeY, nextNodeX, nextNodeY, bridgeEnd).y;
  113. addPolylinetoView([[bridgeEnd, bridgeEndY - 3], [foreNodeX, foreNodeY - 3]], false, false, 0, PDColor);
  114. var dmxPoint = this.findPointByArray(dmxArrayData, bridgeEnd);
  115. if (dmxPoint) {
  116. addPolylinetoView([[bridgeEnd, bridgeEndY], [dmxPoint.x, dmxPoint.y]], false, false, 0, PDColor);
  117. } else {
  118. EAction.handleUserMessage("结束绘画桥梁,未找到地面线上的点, x: " + bridgeStart.toString());
  119. }
  120. }
  121. }
  122. EAction.handleUserMessage("ctr-123: " + formatDateTime());
  123. var middleZdm = this.findPointByArray(zdmArrayData, bridgeMiddleX);
  124. if (!middleZdm) {
  125. EAction.handleUserMessage("绘画桥梁中间,未找到纵断线上的点, bridgeMiddleX: " + bridgeMiddleX.toString());
  126. return;
  127. }
  128. var middleDmx = this.findPointByArray(dmxArrayData, bridgeMiddleX);
  129. if (!middleDmx) {
  130. EAction.handleUserMessage("绘画桥梁中间,未找到地面线上的点, bridgeMiddleX: " + bridgeMiddleX.toString());
  131. return;
  132. }
  133. EAction.handleUserMessage("ctr-134: " + formatDateTime());
  134. addPolylinetoView([[middleZdm.x, middleZdm.y - 3], [middleDmx.x, middleDmx.y]], false, false, 0, PDColor);
  135. // 里程格式和ZDM里程格式一致
  136. // 里程单位是km,格式应该为K000+000.000
  137. var milestone = (round(bridgeMiddleX * 1000) / 1000);
  138. var milestoneK = round(milestone / 1000);
  139. addSimpleTextToView("K" + milestoneK.toString() + "+" + (milestone - milestoneK).toString(), [middleZdm.x + 9, middleZdm.y + 6], 10, 90, "Standard", RS.VAlignTop, RS.HAlignLeft, false, false, 0);
  140. addPolylinetoView([[middleZdm.x, middleZdm.y], [middleZdm.x, middleZdm.y + 50]], false, false, 0, PDColor);
  141. }
  142. };
  143. FileCTR.prototype.applyTunnel = function (zdmArrayData, PDColor) {
  144. if (this.tunnelArrayData.length == 0) {
  145. EAction.handleUserMessage("tunnel(CTR) data is empty...");
  146. return false;
  147. }
  148. if (zdmArrayData.length == 0) {
  149. EAction.handleUserMessage("DMX data is empty...");
  150. return false;
  151. }
  152. for (var i = 0; i < this.tunnelArrayData.length; i++) {
  153. var startPoint = this.findPointByArray(zdmArrayData, this.tunnelArrayData[i][0]);
  154. if (!startPoint) {
  155. EAction.handleUserMessage("隧道开始节点,未找到纵断线上的点, x: " + this.tunnelArrayData[i][0].toString());
  156. continue;
  157. }
  158. var endPoint = this.findPointByArray(zdmArrayData, this.tunnelArrayData[i][1]);
  159. if (!endPoint) {
  160. EAction.handleUserMessage("隧道结束节点,未找到纵断线上的点, x: " + this.tunnelArrayData[i][1].toString());
  161. continue;
  162. }
  163. addPolylinetoView([[startPoint.x, startPoint.y], [startPoint.x, startPoint.y + 6]], false, false, 0, new RColor(255, 255, 0));
  164. addPolylinetoView([[startPoint.x, startPoint.y + 3], [endPoint.x, endPoint.y + 3]], false, false, 0, new RColor(255, 255, 0));
  165. addPolylinetoView([[endPoint.x, endPoint.y], [endPoint.x, endPoint.y + 6]], false, false, 0, new RColor(255, 255, 0));
  166. }
  167. }
  168. // 已知两个坐标的点,求指定x垂直线和已知两点的交点
  169. FileCTR.prototype.findIntersection = function (x1, y1, x2, y2, xVertical) {
  170. // 如果两点的x坐标相同,则说明这两点在x=50的线上,交点即为它们之一
  171. if (x1 === xVertical) {
  172. return { x: x1, y: y1 };
  173. } else if (x2 === xVertical) {
  174. return { x: x2, y: y2 };
  175. }
  176. // 计算交点的y坐标
  177. const yIntersection = ((xVertical - x1) / (x2 - x1)) * (y2 - y1) + y1;
  178. return { x: xVertical, y: yIntersection };
  179. };
  180. FileCTR.prototype.findPointByArray = function (pointArray, x) {
  181. if (pointArray && pointArray.length > 0) {
  182. for (var i = 0; i < pointArray.length - 1; i++) {
  183. var foreNodeX = pointArray[i][0];
  184. var foreNodeY = pointArray[i][1];
  185. var nextNodeX = pointArray[i + 1][0];
  186. var nextNodeY = pointArray[i + 1][1];
  187. if (x >= foreNodeX && x <= nextNodeX) {
  188. return this.findIntersection(foreNodeX, foreNodeY, nextNodeX, nextNodeY, x);
  189. }
  190. }
  191. }
  192. return undefined;
  193. };