FileCTRCSV.js 8.4 KB

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