FileCTR.js 7.3 KB

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